]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' of git://factorcode.org/git/factor
authorslava <slava@slava-laptop.(none)>
Thu, 8 May 2008 20:51:10 +0000 (15:51 -0500)
committerslava <slava@slava-laptop.(none)>
Thu, 8 May 2008 20:51:10 +0000 (15:51 -0500)
802 files changed:
Factor.app/Contents/Info.plist
core/alien/alien-docs.factor
core/alien/compiler/compiler-tests.factor
core/alien/compiler/compiler.factor
core/alien/strings/strings-docs.factor
core/alien/strings/strings.factor
core/alien/syntax/syntax.factor
core/assocs/assocs-docs.factor
core/assocs/assocs-tests.factor
core/assocs/assocs.factor
core/bootstrap/compiler/compiler.factor
core/bootstrap/image/image-tests.factor
core/bootstrap/image/image.factor
core/bootstrap/primitives.factor
core/bootstrap/stage2.factor
core/bootstrap/syntax.factor
core/byte-vectors/byte-vectors-docs.factor [new file with mode: 0755]
core/byte-vectors/byte-vectors-tests.factor [new file with mode: 0755]
core/byte-vectors/byte-vectors.factor [new file with mode: 0755]
core/byte-vectors/summary.txt [new file with mode: 0644]
core/byte-vectors/tags.txt [new file with mode: 0644]
core/checksums/checksums-docs.factor [new file with mode: 0644]
core/checksums/checksums-tests.factor [new file with mode: 0644]
core/checksums/checksums.factor [new file with mode: 0644]
core/checksums/crc32/authors.txt [new file with mode: 0644]
core/checksums/crc32/crc32-docs.factor [new file with mode: 0644]
core/checksums/crc32/crc32-tests.factor [new file with mode: 0644]
core/checksums/crc32/crc32.factor [new file with mode: 0755]
core/checksums/crc32/summary.txt [new file with mode: 0644]
core/classes/algebra/algebra-docs.factor
core/classes/algebra/algebra-tests.factor
core/classes/algebra/algebra.factor
core/classes/builtin/builtin.factor
core/classes/classes-docs.factor
core/classes/classes-tests.factor
core/classes/classes.factor
core/classes/mixin/mixin.factor
core/classes/predicate/predicate.factor
core/classes/singleton/singleton-docs.factor
core/classes/tuple/tuple-docs.factor
core/classes/tuple/tuple-tests.factor
core/classes/tuple/tuple.factor
core/classes/union/union.factor
core/combinators/combinators-docs.factor
core/combinators/combinators.factor
core/command-line/command-line.factor
core/compiler/compiler.factor
core/compiler/errors/errors-docs.factor
core/compiler/errors/errors.factor
core/compiler/tests/intrinsics.factor
core/compiler/tests/stack-trace.factor
core/compiler/units/units.factor
core/continuations/continuations-docs.factor
core/continuations/continuations-tests.factor
core/continuations/continuations.factor
core/cpu/ppc/architecture/architecture.factor
core/cpu/ppc/assembler/assembler.factor
core/cpu/x86/64/64.factor
core/cpu/x86/architecture/architecture.factor
core/cpu/x86/assembler/assembler.factor
core/debugger/debugger-docs.factor
core/debugger/debugger.factor
core/definitions/definitions-tests.factor
core/dlists/dlists-tests.factor
core/dlists/dlists.factor
core/generator/fixup/fixup.factor
core/generator/registers/registers.factor
core/generic/generic-docs.factor
core/generic/generic-tests.factor
core/generic/generic.factor
core/generic/math/math.factor
core/generic/standard/engines/engines.factor
core/generic/standard/engines/predicate/predicate.factor
core/generic/standard/engines/tuple/tuple.factor
core/hashtables/hashtables-tests.factor
core/heaps/heaps-docs.factor
core/heaps/heaps-tests.factor
core/heaps/heaps.factor
core/inference/backend/backend.factor
core/inference/class/class-tests.factor
core/inference/class/class.factor
core/inference/dataflow/dataflow.factor
core/inference/inference-docs.factor
core/inference/state/state-tests.factor
core/inference/state/state.factor
core/inference/transforms/transforms.factor
core/inspector/inspector-docs.factor
core/inspector/inspector.factor
core/io/backend/backend-docs.factor
core/io/backend/backend.factor
core/io/crc32/authors.txt [deleted file]
core/io/crc32/crc32-docs.factor [deleted file]
core/io/crc32/crc32-tests.factor [deleted file]
core/io/crc32/crc32.factor [deleted file]
core/io/crc32/summary.txt [deleted file]
core/io/encodings/encodings-docs.factor
core/io/encodings/encodings-tests.factor
core/io/encodings/encodings.factor
core/io/files/files-docs.factor
core/io/files/files-tests.factor
core/io/files/files.factor
core/io/io-docs.factor
core/io/io-tests.factor
core/io/io.factor
core/io/streams/byte-array/byte-array-docs.factor
core/io/streams/byte-array/byte-array.factor
core/io/streams/c/c.factor
core/io/streams/duplex/authors.txt [deleted file]
core/io/streams/duplex/duplex-docs.factor [deleted file]
core/io/streams/duplex/duplex-tests.factor [deleted file]
core/io/streams/duplex/duplex.factor [deleted file]
core/io/streams/duplex/summary.txt [deleted file]
core/io/streams/string/string-docs.factor
core/io/streams/string/string-tests.factor
core/io/streams/string/string.factor
core/kernel/kernel-docs.factor
core/kernel/kernel.factor
core/layouts/layouts.factor
core/listener/listener-docs.factor
core/listener/listener-tests.factor
core/listener/listener.factor
core/math/floats/floats.factor
core/math/integers/integers-tests.factor
core/math/integers/integers.factor
core/math/intervals/intervals-docs.factor
core/math/intervals/intervals-tests.factor
core/math/intervals/intervals.factor
core/math/math-docs.factor
core/math/math.factor
core/math/order/order-docs.factor [new file with mode: 0644]
core/math/order/order-tests.factor [new file with mode: 0644]
core/math/order/order.factor [new file with mode: 0644]
core/math/parser/parser-tests.factor
core/math/parser/parser.factor
core/mirrors/mirrors-docs.factor
core/mirrors/mirrors-tests.factor
core/mirrors/mirrors.factor
core/namespaces/namespaces-docs.factor
core/namespaces/namespaces-tests.factor
core/optimizer/backend/backend.factor
core/optimizer/control/control.factor
core/optimizer/def-use/def-use-tests.factor
core/optimizer/def-use/def-use.factor
core/optimizer/inlining/inlining.factor
core/optimizer/known-words/known-words.factor
core/optimizer/math/math.factor
core/optimizer/math/partial/partial.factor
core/optimizer/optimizer-tests.factor
core/optimizer/pattern-match/pattern-match.factor
core/optimizer/specializers/specializers.factor
core/parser/parser-docs.factor
core/parser/parser-tests.factor
core/parser/parser.factor
core/prettyprint/backend/backend.factor
core/prettyprint/prettyprint-docs.factor
core/prettyprint/prettyprint-tests.factor
core/prettyprint/prettyprint.factor
core/prettyprint/sections/sections-docs.factor
core/prettyprint/sections/sections.factor
core/quotations/quotations.factor
core/sequences/sequences-docs.factor
core/sequences/sequences-tests.factor
core/sequences/sequences.factor
core/sets/sets-docs.factor
core/sets/sets-tests.factor
core/sets/sets.factor
core/slots/deprecated/deprecated.factor
core/sorting/sorting-docs.factor
core/sorting/sorting-tests.factor
core/sorting/sorting.factor
core/source-files/source-files.factor
core/splitting/splitting.factor
core/strings/strings-tests.factor
core/syntax/syntax-docs.factor
core/syntax/syntax.factor
core/threads/threads-docs.factor
core/threads/threads-tests.factor
core/threads/threads.factor
core/vocabs/vocabs.factor
core/words/words-docs.factor
core/words/words-tests.factor
core/words/words.factor
extra/alarms/alarms.factor
extra/ascii/ascii-tests.factor
extra/ascii/ascii.factor
extra/asn1/asn1-tests.factor
extra/asn1/asn1.factor
extra/assocs/lib/lib.factor
extra/bank/authors.txt [new file with mode: 0644]
extra/bank/bank-tests.factor [new file with mode: 0644]
extra/bank/bank.factor [new file with mode: 0644]
extra/bank/summary.txt [new file with mode: 0644]
extra/benchmark/binary-trees/binary-trees.factor
extra/benchmark/crc32/crc32.factor
extra/benchmark/dispatch1/dispatch1.factor
extra/benchmark/dispatch5/dispatch5.factor
extra/benchmark/fasta/fasta.factor
extra/benchmark/knucleotide/knucleotide.factor
extra/benchmark/mandel/mandel.factor
extra/benchmark/md5/md5.factor
extra/benchmark/partial-sums/partial-sums.factor
extra/benchmark/reverse-complement/reverse-complement-tests.factor
extra/benchmark/reverse-complement/reverse-complement.factor
extra/benchmark/sha1/sha1.factor
extra/benchmark/sockets/sockets.factor
extra/bit-vectors/bit-vectors-docs.factor
extra/bitfields/bitfields.factor
extra/boids/boids.factor
extra/bootstrap/help/help.factor
extra/bootstrap/image/download/download.factor
extra/bootstrap/image/upload/upload.factor
extra/bubble-chamber/particle/muon/colors/colors.factor
extra/builder/benchmark/benchmark.factor
extra/builder/release/branch/branch.factor
extra/builder/util/util.factor
extra/bunny/bunny.factor
extra/bunny/cel-shaded/cel-shaded.factor
extra/bunny/fixed-pipeline/fixed-pipeline.factor
extra/bunny/model/model.factor
extra/bunny/outlined/outlined.factor
extra/byte-vectors/byte-vectors-docs.factor [deleted file]
extra/byte-vectors/byte-vectors-tests.factor [deleted file]
extra/byte-vectors/byte-vectors.factor [deleted file]
extra/byte-vectors/summary.txt [deleted file]
extra/byte-vectors/tags.txt [deleted file]
extra/cairo/png/png.factor
extra/calendar/calendar-tests.factor
extra/calendar/calendar.factor
extra/calendar/format/format-tests.factor
extra/calendar/format/format.factor
extra/calendar/format/macros/macros-tests.factor [new file with mode: 0644]
extra/calendar/format/macros/macros.factor [new file with mode: 0644]
extra/checksums/md5/authors.txt [new file with mode: 0755]
extra/checksums/md5/md5-docs.factor [new file with mode: 0755]
extra/checksums/md5/md5-tests.factor [new file with mode: 0755]
extra/checksums/md5/md5.factor [new file with mode: 0755]
extra/checksums/null/null.factor [new file with mode: 0644]
extra/checksums/sha1/authors.txt [new file with mode: 0755]
extra/checksums/sha1/sha1-docs.factor [new file with mode: 0644]
extra/checksums/sha1/sha1-tests.factor [new file with mode: 0755]
extra/checksums/sha1/sha1.factor [new file with mode: 0755]
extra/checksums/sha2/authors.txt [new file with mode: 0755]
extra/checksums/sha2/sha2-docs.factor [new file with mode: 0644]
extra/checksums/sha2/sha2-tests.factor [new file with mode: 0755]
extra/checksums/sha2/sha2.factor [new file with mode: 0755]
extra/classes/tuple/lib/lib-docs.factor
extra/classes/tuple/lib/lib.factor
extra/cocoa/messages/messages.factor
extra/columns/columns-docs.factor
extra/combinators/lib/lib.factor
extra/concurrency/combinators/combinators-docs.factor
extra/concurrency/combinators/combinators-tests.factor
extra/concurrency/combinators/combinators.factor
extra/concurrency/count-downs/count-downs.factor
extra/concurrency/distributed/distributed.factor
extra/concurrency/flags/flags-tests.factor
extra/concurrency/flags/flags.factor
extra/concurrency/mailboxes/mailboxes.factor
extra/contributors/contributors-tests.factor [new file with mode: 0644]
extra/contributors/contributors.factor
extra/core-foundation/fsevents/fsevents.factor
extra/cpu/8080/emulator/emulator.factor
extra/cpu/8080/test/test.factor
extra/crypto/common/common-docs.factor [deleted file]
extra/crypto/common/common.factor
extra/crypto/hmac/hmac.factor
extra/crypto/md5/authors.txt [deleted file]
extra/crypto/md5/md5-docs.factor [deleted file]
extra/crypto/md5/md5-tests.factor [deleted file]
extra/crypto/md5/md5.factor [deleted file]
extra/crypto/sha1/authors.txt [deleted file]
extra/crypto/sha1/sha1-tests.factor [deleted file]
extra/crypto/sha1/sha1.factor [deleted file]
extra/crypto/sha2/authors.txt [deleted file]
extra/crypto/sha2/sha2-tests.factor [deleted file]
extra/crypto/sha2/sha2.factor [deleted file]
extra/csv/authors.txt [new file with mode: 0644]
extra/csv/csv-docs.factor [new file with mode: 0644]
extra/csv/csv-tests.factor [new file with mode: 0644]
extra/csv/csv.factor [new file with mode: 0644]
extra/csv/summary.txt [new file with mode: 0644]
extra/db/db-tests.factor
extra/db/db.factor
extra/db/pooling/pooling-tests.factor [new file with mode: 0644]
extra/db/pooling/pooling.factor [new file with mode: 0644]
extra/db/postgresql/lib/lib.factor
extra/db/postgresql/postgresql.factor
extra/db/queries/queries.factor
extra/db/sql/sql.factor
extra/db/sqlite/ffi/ffi.factor
extra/db/sqlite/lib/lib.factor
extra/db/sqlite/sqlite.factor
extra/db/tuples/tuples-tests.factor
extra/db/tuples/tuples.factor
extra/db/types/types.factor
extra/delegate/delegate-docs.factor
extra/delegate/delegate-tests.factor
extra/delegate/delegate.factor
extra/delegate/protocols/protocols.factor
extra/destructors/destructors.factor
extra/documents/documents.factor
extra/editors/jedit/jedit.factor
extra/factory/commands/commands.factor
extra/factory/factory.factor
extra/faq/faq.factor
extra/farkup/farkup.factor
extra/float-vectors/float-vectors-docs.factor
extra/fry/fry-docs.factor
extra/fry/fry-tests.factor
extra/fry/fry.factor
extra/gap-buffer/gap-buffer.factor
extra/gap-buffer/tags.txt
extra/geo-ip/authors.txt [new file with mode: 0644]
extra/geo-ip/geo-ip.factor [new file with mode: 0644]
extra/geo-ip/summary.txt [new file with mode: 0644]
extra/geo-ip/tags.txt [new file with mode: 0644]
extra/gesture-logger/gesture-logger.factor
extra/graphics/bitmap/bitmap.factor
extra/hardware-info/linux/linux.factor
extra/hardware-info/windows/windows.factor
extra/help/cookbook/cookbook.factor
extra/help/crossref/crossref.factor
extra/help/handbook/handbook.factor
extra/help/help-docs.factor
extra/help/help.factor
extra/help/lint/lint.factor
extra/help/markup/markup.factor
extra/help/tutorial/tutorial.factor
extra/html/elements/elements.factor
extra/html/html-tests.factor
extra/html/html.factor
extra/html/parser/analyzer/analyzer.factor
extra/html/parser/utils/utils.factor
extra/http/client/client-tests.factor
extra/http/client/client.factor
extra/http/http-tests.factor
extra/http/http.factor
extra/http/server/actions/actions-tests.factor
extra/http/server/actions/actions.factor
extra/http/server/auth/admin/admin.factor [new file with mode: 0644]
extra/http/server/auth/admin/admin.xml [new file with mode: 0644]
extra/http/server/auth/admin/edit-user.xml [new file with mode: 0644]
extra/http/server/auth/admin/new-user.xml [new file with mode: 0644]
extra/http/server/auth/admin/user-list.xml [new file with mode: 0644]
extra/http/server/auth/admin/user-summary.xml [new file with mode: 0644]
extra/http/server/auth/auth.factor
extra/http/server/auth/basic/basic.factor
extra/http/server/auth/login/edit-profile.xml
extra/http/server/auth/login/login.factor
extra/http/server/auth/login/login.xml
extra/http/server/auth/login/recover-1.xml
extra/http/server/auth/login/recover-3.xml
extra/http/server/auth/login/recover-4.xml
extra/http/server/auth/login/register.xml
extra/http/server/auth/providers/assoc/assoc-tests.factor
extra/http/server/auth/providers/db/db-tests.factor
extra/http/server/auth/providers/db/db.factor
extra/http/server/auth/providers/providers.factor
extra/http/server/boilerplate/boilerplate.factor
extra/http/server/callbacks/callbacks-tests.factor
extra/http/server/callbacks/callbacks.factor
extra/http/server/cgi/cgi.factor
extra/http/server/components/code/code.factor [new file with mode: 0644]
extra/http/server/components/components.factor
extra/http/server/components/farkup/farkup.factor
extra/http/server/components/inspector/inspector.factor [new file with mode: 0644]
extra/http/server/crud/crud.factor
extra/http/server/db/db-tests.factor [new file with mode: 0644]
extra/http/server/db/db.factor
extra/http/server/flows/flows.factor [new file with mode: 0644]
extra/http/server/forms/forms.factor
extra/http/server/server-tests.factor
extra/http/server/server.factor
extra/http/server/sessions/sessions-tests.factor
extra/http/server/sessions/sessions.factor
extra/http/server/sessions/storage/assoc/assoc.factor [deleted file]
extra/http/server/sessions/storage/db/db-tests.factor [deleted file]
extra/http/server/sessions/storage/db/db.factor [deleted file]
extra/http/server/sessions/storage/storage.factor [deleted file]
extra/http/server/static/static.factor
extra/http/server/templating/chloe/chloe-tests.factor
extra/http/server/templating/chloe/chloe.factor
extra/http/server/templating/chloe/test/test4.xml
extra/http/server/templating/chloe/test/test5.xml
extra/http/server/templating/chloe/test/test6.xml
extra/http/server/templating/chloe/test/test7.xml
extra/http/server/templating/fhtml/fhtml.factor
extra/http/server/templating/templating.factor
extra/icfp/2006/2006.factor
extra/interval-maps/authors.txt [new file with mode: 0755]
extra/interval-maps/interval-maps-docs.factor [new file with mode: 0755]
extra/interval-maps/interval-maps-tests.factor [new file with mode: 0755]
extra/interval-maps/interval-maps.factor [new file with mode: 0755]
extra/interval-maps/summary.txt [new file with mode: 0755]
extra/interval-maps/tags.txt [new file with mode: 0755]
extra/inverse/inverse.factor
extra/io/buffers/buffers.factor
extra/io/encodings/8-bit/8-bit.factor
extra/io/encodings/iana/authors.txt [new file with mode: 0644]
extra/io/encodings/iana/character-sets [new file with mode: 0644]
extra/io/encodings/iana/iana-docs.factor [new file with mode: 0644]
extra/io/encodings/iana/iana-tests.factor [new file with mode: 0644]
extra/io/encodings/iana/iana.factor [new file with mode: 0644]
extra/io/encodings/iana/summary.txt [new file with mode: 0644]
extra/io/launcher/launcher-docs.factor
extra/io/launcher/launcher-tests.factor
extra/io/launcher/launcher.factor
extra/io/mmap/mmap-tests.factor
extra/io/mmap/mmap.factor
extra/io/nonblocking/nonblocking.factor
extra/io/pipes/pipes-docs.factor [new file with mode: 0644]
extra/io/pipes/pipes-tests.factor [new file with mode: 0755]
extra/io/pipes/pipes.factor [new file with mode: 0644]
extra/io/server/server-docs.factor
extra/io/server/server.factor
extra/io/sockets/impl/impl.factor
extra/io/sockets/sockets-docs.factor
extra/io/sockets/sockets.factor
extra/io/streams/duplex/authors.txt [new file with mode: 0644]
extra/io/streams/duplex/duplex-docs.factor [new file with mode: 0755]
extra/io/streams/duplex/duplex-tests.factor [new file with mode: 0755]
extra/io/streams/duplex/duplex.factor [new file with mode: 0755]
extra/io/streams/duplex/summary.txt [new file with mode: 0644]
extra/io/streams/null/null.factor
extra/io/timeouts/timeouts.factor
extra/io/unix/backend/backend.factor
extra/io/unix/launcher/launcher-tests.factor
extra/io/unix/launcher/launcher.factor
extra/io/unix/macosx/macosx.factor
extra/io/unix/mmap/mmap.factor
extra/io/unix/pipes/pipes-tests.factor [new file with mode: 0644]
extra/io/unix/pipes/pipes.factor [new file with mode: 0644]
extra/io/unix/select/select.factor
extra/io/unix/unix-tests.factor
extra/io/unix/unix.factor
extra/io/windows/launcher/launcher.factor
extra/io/windows/mmap/mmap.factor
extra/io/windows/nt/files/files.factor
extra/io/windows/nt/launcher/launcher-tests.factor
extra/io/windows/nt/launcher/launcher.factor
extra/io/windows/nt/launcher/test/append.factor [new file with mode: 0755]
extra/io/windows/nt/launcher/test/stderr.factor
extra/io/windows/nt/monitors/monitors.factor
extra/io/windows/nt/pipes/pipes.factor
extra/io/windows/windows.factor
extra/irc/irc.factor
extra/jamshred/tunnel/tunnel.factor
extra/json/reader/reader.factor
extra/json/writer/writer.factor
extra/koszul/koszul.factor
extra/lazy-lists/examples/examples.factor
extra/lazy-lists/lazy-lists-docs.factor
extra/lazy-lists/lazy-lists.factor
extra/lcs/authors.txt [new file with mode: 0755]
extra/lcs/lcs-docs.factor [new file with mode: 0755]
extra/lcs/lcs-tests.factor [new file with mode: 0755]
extra/lcs/lcs.factor [new file with mode: 0755]
extra/lcs/summary.txt [new file with mode: 0755]
extra/lcs/tags.txt [new file with mode: 0755]
extra/levenshtein/authors.txt [deleted file]
extra/levenshtein/levenshtein-tests.factor [deleted file]
extra/levenshtein/levenshtein.factor [deleted file]
extra/levenshtein/summary.txt [deleted file]
extra/locals/locals-docs.factor
extra/locals/locals-tests.factor
extra/locals/locals.factor
extra/logging/analysis/analysis.factor
extra/logging/logging.factor
extra/logging/server/server.factor
extra/lsys/tortoise/graphics/graphics.factor
extra/lsys/ui/ui.factor
extra/match/match-docs.factor
extra/match/match.factor
extra/math/combinatorics/combinatorics-docs.factor
extra/math/combinatorics/combinatorics.factor
extra/math/complex/complex-tests.factor
extra/math/functions/functions-docs.factor
extra/math/functions/functions-tests.factor
extra/math/functions/functions.factor
extra/math/matrices/elimination/elimination.factor
extra/math/matrices/matrices.factor
extra/math/miller-rabin/miller-rabin.factor
extra/math/polynomials/polynomials.factor
extra/math/primes/primes.factor
extra/math/ranges/ranges.factor
extra/math/ratios/ratios-tests.factor
extra/math/ratios/ratios.factor
extra/math/vectors/vectors.factor
extra/maze/maze.factor
extra/memoize/memoize-tests.factor
extra/memoize/memoize.factor
extra/models/models.factor
extra/monads/authors.txt [new file with mode: 0644]
extra/monads/monads-tests.factor [new file with mode: 0644]
extra/monads/monads.factor [new file with mode: 0644]
extra/monads/summary.txt [new file with mode: 0644]
extra/monads/tags.txt [new file with mode: 0644]
extra/morse/authors.txt [new file with mode: 0644]
extra/morse/morse-docs.factor
extra/morse/morse-tests.factor
extra/morse/morse.factor
extra/mortar/mortar.factor
extra/multi-methods/multi-methods.factor
extra/multi-methods/tests/topological-sort.factor
extra/multiline/multiline.factor
extra/newfx/newfx.factor
extra/ogg/player/player.factor
extra/openal/openal.factor
extra/openal/waves/waves-tests.factor [new file with mode: 0644]
extra/openal/waves/waves.factor [new file with mode: 0644]
extra/opengl/capabilities/capabilities.factor
extra/opengl/demo-support/demo-support.factor
extra/opengl/gl/extensions/extensions.factor
extra/opengl/opengl-docs.factor
extra/opengl/opengl.factor
extra/openssl/authors.txt [deleted file]
extra/openssl/libcrypto/libcrypto.factor [deleted file]
extra/openssl/libssl/libssl.factor [deleted file]
extra/openssl/openssl-docs.factor [deleted file]
extra/openssl/openssl-tests.factor [deleted file]
extra/openssl/openssl.factor [deleted file]
extra/openssl/summary.txt [deleted file]
extra/openssl/tags.txt [deleted file]
extra/openssl/test/dh1024.pem [deleted file]
extra/openssl/test/errors.txt [deleted file]
extra/openssl/test/root.pem [deleted file]
extra/openssl/test/server.pem [deleted file]
extra/optimizer/debugger/debugger.factor
extra/optimizer/report/report.factor
extra/pack/pack-tests.factor
extra/pack/pack.factor
extra/parser-combinators/parser-combinators.factor
extra/peg/ebnf/ebnf-tests.factor
extra/peg/ebnf/ebnf.factor
extra/peg/expr/expr.factor
extra/peg/parsers/parsers.factor
extra/peg/peg-tests.factor
extra/peg/peg.factor
extra/peg/pl0/pl0-tests.factor
extra/peg/pl0/pl0.factor
extra/peg/search/search.factor
extra/porter-stemmer/porter-stemmer-tests.factor
extra/porter-stemmer/porter-stemmer.factor
extra/processing/gallery/trails/trails.factor
extra/project-euler/001/001.factor
extra/project-euler/002/002.factor
extra/project-euler/004/004.factor
extra/project-euler/019/019.factor
extra/project-euler/022/022.factor
extra/project-euler/023/023.factor
extra/project-euler/026/026.factor
extra/project-euler/027/027.factor
extra/project-euler/030/030.factor
extra/project-euler/032/032.factor
extra/project-euler/033/033.factor
extra/project-euler/034/034.factor
extra/project-euler/035/035.factor
extra/project-euler/036/036.factor
extra/project-euler/037/037.factor
extra/project-euler/038/038.factor
extra/project-euler/042/042.factor
extra/project-euler/043/043.factor
extra/project-euler/044/044.factor
extra/project-euler/059/059.factor
extra/project-euler/067/067.factor
extra/project-euler/076/076.factor
extra/project-euler/079/079.factor
extra/project-euler/100/100.factor [new file with mode: 0644]
extra/project-euler/117/117.factor
extra/project-euler/134/134.factor
extra/project-euler/150/150.factor
extra/project-euler/151/151.factor [new file with mode: 0644]
extra/project-euler/190/190.factor [new file with mode: 0644]
extra/project-euler/common/common.factor
extra/promises/promises-docs.factor
extra/qualified/qualified.factor
extra/random-weighted/random-weighted.factor
extra/random/mersenne-twister/mersenne-twister-tests.factor
extra/random/unix/unix.factor
extra/regexp/regexp.factor
extra/regexp2/regexp2.factor
extra/reports/noise/noise.factor
extra/reports/optimizer/optimizer.factor
extra/roman/roman.factor
extra/rss/rss-tests.factor
extra/rss/rss.factor
extra/semantic-db/authors.txt [new file with mode: 0644]
extra/semantic-db/context/context.factor [deleted file]
extra/semantic-db/hierarchy/hierarchy.factor [deleted file]
extra/semantic-db/relations/relations.factor [deleted file]
extra/semantic-db/semantic-db-tests.factor
extra/semantic-db/semantic-db.factor
extra/sequences/deep/deep-docs.factor
extra/sequences/deep/deep-tests.factor
extra/sequences/deep/deep.factor
extra/sequences/lib/lib.factor
extra/serialize/serialize.factor
extra/shuffle/shuffle.factor
extra/shufflers/authors.txt [deleted file]
extra/shufflers/shufflers-docs.factor [deleted file]
extra/shufflers/shufflers-tests.factor [deleted file]
extra/shufflers/shufflers.factor [deleted file]
extra/shufflers/summary.txt [deleted file]
extra/shufflers/tags.txt [deleted file]
extra/size-of/size-of.factor
extra/smtp/server/server.factor
extra/smtp/smtp-tests.factor
extra/smtp/smtp.factor
extra/space-invaders/space-invaders.factor
extra/spheres/authors.txt [new file with mode: 0644]
extra/spheres/spheres.factor [new file with mode: 0644]
extra/spheres/summary.txt [new file with mode: 0644]
extra/spheres/tags.txt [new file with mode: 0644]
extra/state-parser/state-parser-docs.factor
extra/state-parser/state-parser-tests.factor
extra/state-parser/state-parser.factor
extra/symbols/symbols-docs.factor
extra/symbols/symbols.factor
extra/tangle/authors.txt [new file with mode: 0644]
extra/tangle/html/html-tests.factor [new file with mode: 0644]
extra/tangle/html/html.factor [new file with mode: 0644]
extra/tangle/menu/menu.factor [new file with mode: 0644]
extra/tangle/page/page.factor [new file with mode: 0644]
extra/tangle/path/path.factor [new file with mode: 0644]
extra/tangle/resources/jquery-1.2.3.min.js [new file with mode: 0644]
extra/tangle/resources/weave.html [new file with mode: 0644]
extra/tangle/resources/weave.js [new file with mode: 0644]
extra/tangle/sandbox/sandbox.factor [new file with mode: 0644]
extra/tangle/summary.txt [new file with mode: 0644]
extra/tangle/tangle-tests.factor [new file with mode: 0644]
extra/tangle/tangle.factor [new file with mode: 0644]
extra/tar/tar.factor
extra/taxes/taxes-tests.factor
extra/taxes/taxes.factor
extra/tetris/board/board.factor
extra/tools/annotations/annotations.factor
extra/tools/completion/completion.factor
extra/tools/deploy/backend/backend.factor
extra/tools/deploy/shaker/shaker.factor
extra/tools/memory/memory-docs.factor
extra/tools/profiler/profiler-docs.factor
extra/tools/profiler/profiler.factor
extra/tools/test/test-docs.factor
extra/tools/test/test.factor
extra/tools/test/ui/ui.factor
extra/tools/threads/threads.factor
extra/tools/vocabs/browser/browser.factor
extra/tools/vocabs/monitor/monitor.factor
extra/tools/vocabs/vocabs.factor
extra/tools/walker/walker.factor
extra/trees/avl/avl-tests.factor [changed mode: 0644->0755]
extra/trees/avl/avl.factor
extra/trees/splay/splay.factor [changed mode: 0644->0755]
extra/trees/trees.factor
extra/tuple-syntax/tuple-syntax.factor
extra/ui/cocoa/views/views.factor
extra/ui/commands/commands-docs.factor
extra/ui/commands/commands.factor
extra/ui/gadgets/editors/editors.factor
extra/ui/gadgets/gadgets-tests.factor
extra/ui/gadgets/gadgets.factor
extra/ui/gadgets/lists/lists.factor
extra/ui/gadgets/packs/packs.factor
extra/ui/gadgets/panes/panes-docs.factor
extra/ui/gadgets/panes/panes-tests.factor
extra/ui/gadgets/panes/panes.factor
extra/ui/gadgets/paragraphs/paragraphs.factor
extra/ui/gadgets/sliders/sliders.factor
extra/ui/gadgets/tracks/tracks.factor
extra/ui/gestures/gestures.factor
extra/ui/operations/operations.factor
extra/ui/render/render.factor
extra/ui/tools/interactor/interactor-tests.factor
extra/ui/tools/interactor/interactor.factor
extra/ui/tools/listener/listener-tests.factor
extra/ui/tools/listener/listener.factor
extra/ui/tools/tools-tests.factor
extra/ui/traverse/traverse.factor
extra/ui/ui.factor
extra/unicode/breaks/breaks.factor
extra/unicode/data/data.factor
extra/unicode/normalize/normalize.factor
extra/unicode/script/Scripts.txt [new file with mode: 0755]
extra/unicode/script/authors.txt [new file with mode: 0755]
extra/unicode/script/script-docs.factor [new file with mode: 0755]
extra/unicode/script/script-tests.factor [new file with mode: 0755]
extra/unicode/script/script.factor [new file with mode: 0755]
extra/unicode/script/summary.txt [new file with mode: 0755]
extra/unicode/syntax/backend/backend.factor [new file with mode: 0644]
extra/unicode/syntax/syntax.factor
extra/unix/bsd/bsd.factor
extra/unix/ffi/ffi.factor [new file with mode: 0644]
extra/unix/linux/ifreq/ifreq.factor
extra/unix/linux/linux.factor
extra/unix/unix.factor
extra/update/backup/backup.factor [new file with mode: 0644]
extra/update/latest/latest.factor [new file with mode: 0644]
extra/update/update.factor
extra/usa-cities/usa-cities.factor [new file with mode: 0644]
extra/usa-cities/zipcode.csv [new file with mode: 0644]
extra/webapps/counter/counter.factor [new file with mode: 0644]
extra/webapps/counter/counter.fhtml [new file with mode: 0644]
extra/webapps/factor-website/factor-website.factor [new file with mode: 0644]
extra/webapps/factor-website/page.css [new file with mode: 0644]
extra/webapps/factor-website/page.xml [new file with mode: 0644]
extra/webapps/pastebin/annotation.xml [new file with mode: 0644]
extra/webapps/pastebin/authors.txt [new file with mode: 0755]
extra/webapps/pastebin/new-annotation.xml [new file with mode: 0644]
extra/webapps/pastebin/new-paste.xml [new file with mode: 0644]
extra/webapps/pastebin/paste-list.xml [new file with mode: 0644]
extra/webapps/pastebin/paste-summary.xml [new file with mode: 0644]
extra/webapps/pastebin/paste.xml [new file with mode: 0644]
extra/webapps/pastebin/pastebin.css [new file with mode: 0644]
extra/webapps/pastebin/pastebin.factor [new file with mode: 0644]
extra/webapps/pastebin/pastebin.xml [new file with mode: 0644]
extra/webapps/planet/admin.xml [new file with mode: 0644]
extra/webapps/planet/blog-admin-link.xml [new file with mode: 0644]
extra/webapps/planet/blog-summary.xml [deleted file]
extra/webapps/planet/edit-blog.xml
extra/webapps/planet/entry-summary.xml
extra/webapps/planet/entry.xml
extra/webapps/planet/mini-planet.xml [deleted file]
extra/webapps/planet/page.xml [deleted file]
extra/webapps/planet/planet.factor
extra/webapps/planet/planet.xml
extra/webapps/planet/postings-summary.xml [new file with mode: 0644]
extra/webapps/planet/postings.xml [new file with mode: 0644]
extra/webapps/planet/view-blog.xml [deleted file]
extra/webapps/todo/edit-todo.xml
extra/webapps/todo/page.xml [deleted file]
extra/webapps/todo/todo-list.xml
extra/webapps/todo/todo-summary.xml
extra/webapps/todo/todo.css
extra/webapps/todo/todo.factor
extra/webapps/todo/todo.xml
extra/webapps/todo/view-todo.xml
extra/windows/com/com-docs.factor
extra/windows/com/com-tests.factor
extra/windows/com/com.factor
extra/windows/com/syntax/syntax.factor
extra/windows/com/wrapper/authors.txt [new file with mode: 0644]
extra/windows/com/wrapper/summary.txt [new file with mode: 0644]
extra/windows/com/wrapper/tags.txt [new file with mode: 0644]
extra/windows/com/wrapper/wrapper-docs.factor [new file with mode: 0644]
extra/windows/com/wrapper/wrapper.factor [new file with mode: 0644]
extra/windows/dragdrop-listener/dragdrop-listener.factor [new file with mode: 0644]
extra/windows/kernel32/kernel32.factor
extra/windows/messages/messages.factor
extra/windows/ole32/ole32.factor
extra/windows/shell32/shell32.factor
extra/windows/time/time.factor [changed mode: 0755->0644]
extra/windows/windows.factor
extra/windows/winsock/winsock.factor
extra/wrap/wrap.factor
extra/x/widgets/wm/root/root.factor
extra/x/widgets/wm/unmapped-frames-menu/unmapped-frames-menu.factor
extra/x/widgets/wm/workspace/workspace.factor
extra/x11/events/events.factor
extra/xml-rpc/xml-rpc.factor
extra/xml/backend/backend.factor [new file with mode: 0644]
extra/xml/char-classes/char-classes.factor
extra/xml/errors/errors-tests.factor [new file with mode: 0755]
extra/xml/errors/errors.factor
extra/xml/tests/errors.factor [deleted file]
extra/xml/tests/soap.factor
extra/xml/tests/test.factor
extra/xml/tokenize/tokenize.factor
extra/xml/utilities/utilities.factor
extra/xml/writer/writer.factor
extra/xml/xml-docs.factor
extra/xml/xml.factor
extra/xmode/catalog/catalog.factor
extra/xmode/code2html/code2html.factor
extra/xmode/code2html/responder/responder.factor
extra/xmode/keyword-map/keyword-map.factor
extra/xmode/utilities/utilities-tests.factor
extra/xmode/utilities/utilities.factor
extra/yahoo/yahoo-tests.factor
extra/yahoo/yahoo.factor
misc/Factor.tmbundle/Syntaxes/HTML (Factor).tmLanguage
misc/factor.vim
misc/factor.vim.fgen
unmaintained/openssl/authors.txt [new file with mode: 0644]
unmaintained/openssl/libcrypto/libcrypto.factor [new file with mode: 0755]
unmaintained/openssl/libssl/libssl.factor [new file with mode: 0755]
unmaintained/openssl/openssl-docs.factor [new file with mode: 0644]
unmaintained/openssl/openssl-tests.factor [new file with mode: 0755]
unmaintained/openssl/openssl.factor [new file with mode: 0755]
unmaintained/openssl/summary.txt [new file with mode: 0755]
unmaintained/openssl/tags.txt [new file with mode: 0644]
unmaintained/openssl/test/dh1024.pem [new file with mode: 0644]
unmaintained/openssl/test/errors.txt [new file with mode: 0644]
unmaintained/openssl/test/root.pem [new file with mode: 0644]
unmaintained/openssl/test/server.pem [new file with mode: 0644]
unmaintained/shufflers/authors.txt [new file with mode: 0644]
unmaintained/shufflers/shufflers-docs.factor [new file with mode: 0644]
unmaintained/shufflers/shufflers-tests.factor [new file with mode: 0644]
unmaintained/shufflers/shufflers.factor [new file with mode: 0644]
unmaintained/shufflers/summary.txt [new file with mode: 0644]
unmaintained/shufflers/tags.txt [new file with mode: 0644]
vm/ffi_test.c
vm/ffi_test.h

index ca0e6d5f8adc3e5804d714ae090dcab1d601c57e..a8943d0d32f507a804ad341bef02ea8aaefef533 100644 (file)
@@ -32,7 +32,7 @@
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>NSHumanReadableCopyright</key>
-       <string>Copyright Â© 2003-2007, Slava Pestov and friends</string>
+       <string>Copyright Â© 2003-2008, Slava Pestov and friends</string>
        <key>NSServices</key>
        <array>
                <dict>
index 7d13080e3c046deb72ae93a5af04eeecd0b3c05d..0caf0e9a9fb9b1c18339fef32cefcd80e9eacf53 100755 (executable)
@@ -265,7 +265,7 @@ ARTICLE: "embedding-restrictions" "Embedding API restrictions"
 ARTICLE: "embedding-factor" "What embedding looks like from Factor"
 "Factor code will run inside an embedded instance in the same way it would run in a stand-alone instance."
 $nl
-"One exception is the global " { $link stdio } " stream, which is by default not bound to the terminal where the process is running, to avoid conflicting with any I/O the host process might perform. To initialize the terminal stream, " { $link init-stdio } " must be called explicitly."
+"One exception is that the global " { $link input-stream } " and " { $link output-stream } " streams are not bound by default, to avoid conflicting with any I/O the host process might perform. The " { $link init-stdio } " words must be called explicitly to initialize terminal streams."
 $nl
 "There is a word which can detect when Factor is embedded:"
 { $subsection embedded? }
index 3d0f36e415becc41dc3cadf83e6c33b94a59cf1b..5d847e364f0fb73dfae7d40d847958d1b8d9a3e2 100755 (executable)
-IN: alien.compiler.tests\r
-USING: alien alien.c-types alien.syntax compiler kernel\r
-namespaces namespaces tools.test sequences inference words\r
-arrays parser quotations continuations inference.backend effects\r
-namespaces.private io io.streams.string memory system threads\r
-tools.test math ;\r
-\r
-FUNCTION: void ffi_test_0 ;\r
-[ ] [ ffi_test_0 ] unit-test\r
-\r
-FUNCTION: int ffi_test_1 ;\r
-[ 3 ] [ ffi_test_1 ] unit-test\r
-\r
-FUNCTION: int ffi_test_2 int x int y ;\r
-[ 5 ] [ 2 3 ffi_test_2 ] unit-test\r
-[ "hi" 3 ffi_test_2 ] must-fail\r
-\r
-FUNCTION: int ffi_test_3 int x int y int z int t ;\r
-[ 25 ] [ 2 3 4 5 ffi_test_3 ] unit-test\r
-\r
-FUNCTION: float ffi_test_4 ;\r
-[ 1.5 ] [ ffi_test_4 ] unit-test\r
-\r
-FUNCTION: double ffi_test_5 ;\r
-[ 1.5 ] [ ffi_test_5 ] unit-test\r
-\r
-FUNCTION: int ffi_test_9 int a int b int c int d int e int f int g ;\r
-[ 28 ] [ 1 2 3 4 5 6 7 ffi_test_9 ] unit-test\r
-[ "a" 2 3 4 5 6 7 ffi_test_9 ] must-fail\r
-[ 1 2 3 4 5 6 "a" ffi_test_9 ] must-fail\r
-\r
-C-STRUCT: foo\r
-    { "int" "x" }\r
-    { "int" "y" }\r
-;\r
-\r
-: make-foo ( x y -- foo )\r
-    "foo" <c-object> [ set-foo-y ] keep [ set-foo-x ] keep ;\r
-\r
-FUNCTION: int ffi_test_11 int a foo b int c ;\r
-\r
-[ 14 ] [ 1 2 3 make-foo 4 ffi_test_11 ] unit-test\r
-\r
-FUNCTION: int ffi_test_13 int a int b int c int d int e int f int g int h int i int j int k ;\r
-\r
-[ 66 ] [ 1 2 3 4 5 6 7 8 9 10 11 ffi_test_13 ] unit-test\r
-\r
-FUNCTION: foo ffi_test_14 int x int y ;\r
-\r
-[ 11 6 ] [ 11 6 ffi_test_14 dup foo-x swap foo-y ] unit-test\r
-\r
-FUNCTION: char* ffi_test_15 char* x char* y ;\r
-\r
-[ "foo" ] [ "xy" "zt" ffi_test_15 ] unit-test\r
-[ "bar" ] [ "xy" "xy" ffi_test_15 ] unit-test\r
-[ 1 2 ffi_test_15 ] must-fail\r
-\r
-C-STRUCT: bar\r
-    { "long" "x" }\r
-    { "long" "y" }\r
-    { "long" "z" }\r
-;\r
-\r
-FUNCTION: bar ffi_test_16 long x long y long z ;\r
-\r
-[ 11 6 -7 ] [\r
-    11 6 -7 ffi_test_16 dup bar-x over bar-y rot bar-z\r
-] unit-test\r
-\r
-C-STRUCT: tiny\r
-    { "int" "x" }\r
-;\r
-\r
-FUNCTION: tiny ffi_test_17 int x ;\r
-\r
-[ 11 ] [ 11 ffi_test_17 tiny-x ] unit-test\r
-\r
-[ [ alien-indirect ] infer ] [ inference-error? ] must-fail-with\r
-\r
-: indirect-test-1\r
-    "int" { } "cdecl" alien-indirect ;\r
-\r
-{ 1 1 } [ indirect-test-1 ] must-infer-as\r
-\r
-[ 3 ] [ "ffi_test_1" f dlsym indirect-test-1 ] unit-test\r
-\r
-[ -1 indirect-test-1 ] must-fail\r
-\r
-: indirect-test-2\r
-    "int" { "int" "int" } "cdecl" alien-indirect gc ;\r
-\r
-{ 3 1 } [ indirect-test-2 ] must-infer-as\r
-\r
-[ 5 ]\r
-[ 2 3 "ffi_test_2" f dlsym indirect-test-2 ]\r
-unit-test\r
-\r
-: indirect-test-3\r
-    "int" { "int" "int" "int" "int" } "stdcall" alien-indirect\r
-    gc ;\r
-\r
-<< "f-stdcall" f "stdcall" add-library >>\r
-\r
-[ f ] [ "f-stdcall" load-library ] unit-test\r
-[ "stdcall" ] [ "f-stdcall" library library-abi ] unit-test\r
-\r
-: ffi_test_18 ( w x y z -- int )\r
-    "int" "f-stdcall" "ffi_test_18" { "int" "int" "int" "int" }\r
-    alien-invoke gc ;\r
-\r
-[ 25 ] [ 2 3 4 5 ffi_test_18 ] unit-test\r
-\r
-: ffi_test_19 ( x y z -- bar )\r
-    "bar" "f-stdcall" "ffi_test_19" { "long" "long" "long" }\r
-    alien-invoke gc ;\r
-\r
-[ 11 6 -7 ] [\r
-    11 6 -7 ffi_test_19 dup bar-x over bar-y rot bar-z\r
-] unit-test\r
-\r
-FUNCTION: double ffi_test_6 float x float y ;\r
-[ 6.0 ] [ 3.0 2.0 ffi_test_6 ] unit-test\r
-[ "a" "b" ffi_test_6 ] must-fail\r
-\r
-FUNCTION: double ffi_test_7 double x double y ;\r
-[ 6.0 ] [ 3.0 2.0 ffi_test_7 ] unit-test\r
-\r
-FUNCTION: double ffi_test_8 double x float y double z float t int w ;\r
-[ 19.0 ] [ 3.0 2.0 1.0 6.0 7 ffi_test_8 ] unit-test\r
-\r
-FUNCTION: int ffi_test_10 int a int b double c int d float e int f int g int h ;\r
-[ -34 ] [ 1 2 3.0 4 5.0 6 7 8 ffi_test_10 ] unit-test\r
-\r
-FUNCTION: void ffi_test_20 double x1, double x2, double x3,\r
-    double y1, double y2, double y3,\r
-    double z1, double z2, double z3 ;\r
-\r
-[ ] [ 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ffi_test_20 ] unit-test\r
-\r
-! Make sure XT doesn't get clobbered in stack frame\r
-\r
-: ffi_test_31\r
-    "void"\r
-    f "ffi_test_31"\r
-    { "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" }\r
-    alien-invoke gc 3 ;\r
-\r
-[ 3 ] [ 42 [ ] each ffi_test_31 ] unit-test\r
-\r
-FUNCTION: longlong ffi_test_21 long x long y ;\r
-\r
-[ 121932631112635269 ]\r
-[ 123456789 987654321 ffi_test_21 ] unit-test\r
-\r
-FUNCTION: long ffi_test_22 long x longlong y longlong z ;\r
-\r
-[ 987655432 ]\r
-[ 1111 121932631112635269 123456789 ffi_test_22 ] unit-test\r
-\r
-[ 1111 f 123456789 ffi_test_22 ] must-fail\r
-\r
-C-STRUCT: rect\r
-    { "float" "x" }\r
-    { "float" "y" }\r
-    { "float" "w" }\r
-    { "float" "h" }\r
-;\r
-\r
-: <rect>\r
-    "rect" <c-object>\r
-    [ set-rect-h ] keep\r
-    [ set-rect-w ] keep\r
-    [ set-rect-y ] keep\r
-    [ set-rect-x ] keep ;\r
-\r
-FUNCTION: int ffi_test_12 int a int b rect c int d int e int f ;\r
-\r
-[ 45 ] [ 1 2 3.0 4.0 5.0 6.0 <rect> 7 8 9 ffi_test_12 ] unit-test\r
-\r
-[ 1 2 { 1 2 3 } 7 8 9 ffi_test_12 ] must-fail\r
-\r
-FUNCTION: float ffi_test_23 ( float[3] x, float[3] y ) ;\r
-\r
-[ 32.0 ] [ { 1.0 2.0 3.0 } >c-float-array { 4.0 5.0 6.0 } >c-float-array ffi_test_23 ] unit-test\r
-\r
-! Test odd-size structs\r
-C-STRUCT: test-struct-1 { { "char" 1 } "x" } ;\r
-\r
-FUNCTION: test-struct-1 ffi_test_24 ;\r
-\r
-[ B{ 1 } ] [ ffi_test_24 ] unit-test\r
-\r
-C-STRUCT: test-struct-2 { { "char" 2 } "x" } ;\r
-\r
-FUNCTION: test-struct-2 ffi_test_25 ;\r
-\r
-[ B{ 1 2 } ] [ ffi_test_25 ] unit-test\r
-\r
-C-STRUCT: test-struct-3 { { "char" 3 } "x" } ;\r
-\r
-FUNCTION: test-struct-3 ffi_test_26 ;\r
-\r
-[ B{ 1 2 3 } ] [ ffi_test_26 ] unit-test\r
-\r
-C-STRUCT: test-struct-4 { { "char" 4 } "x" } ;\r
-\r
-FUNCTION: test-struct-4 ffi_test_27 ;\r
-\r
-[ B{ 1 2 3 4 } ] [ ffi_test_27 ] unit-test\r
-\r
-C-STRUCT: test-struct-5 { { "char" 5 } "x" } ;\r
-\r
-FUNCTION: test-struct-5 ffi_test_28 ;\r
-\r
-[ B{ 1 2 3 4 5 } ] [ ffi_test_28 ] unit-test\r
-\r
-C-STRUCT: test-struct-6 { { "char" 6 } "x" } ;\r
-\r
-FUNCTION: test-struct-6 ffi_test_29 ;\r
-\r
-[ B{ 1 2 3 4 5 6 } ] [ ffi_test_29 ] unit-test\r
-\r
-C-STRUCT: test-struct-7 { { "char" 7 } "x" } ;\r
-\r
-FUNCTION: test-struct-7 ffi_test_30 ;\r
-\r
-[ B{ 1 2 3 4 5 6 7 } ] [ ffi_test_30 ] unit-test\r
-\r
-C-STRUCT: test-struct-8 { "double" "x" } { "double" "y" } ;\r
-\r
-FUNCTION: double ffi_test_32 test-struct-8 x int y ;\r
-\r
-[ 9.0 ] [\r
-    "test-struct-8" <c-object>\r
-    1.0 over set-test-struct-8-x\r
-    2.0 over set-test-struct-8-y\r
-    3 ffi_test_32\r
-] unit-test\r
-\r
-C-STRUCT: test-struct-9 { "float" "x" } { "float" "y" } ;\r
-\r
-FUNCTION: double ffi_test_33 test-struct-9 x int y ;\r
-\r
-[ 9.0 ] [\r
-    "test-struct-9" <c-object>\r
-    1.0 over set-test-struct-9-x\r
-    2.0 over set-test-struct-9-y\r
-    3 ffi_test_33\r
-] unit-test\r
-\r
-C-STRUCT: test-struct-10 { "float" "x" } { "int" "y" } ;\r
-\r
-FUNCTION: double ffi_test_34 test-struct-10 x int y ;\r
-\r
-[ 9.0 ] [\r
-    "test-struct-10" <c-object>\r
-    1.0 over set-test-struct-10-x\r
-    2 over set-test-struct-10-y\r
-    3 ffi_test_34\r
-] unit-test\r
-\r
-C-STRUCT: test-struct-11 { "int" "x" } { "int" "y" } ;\r
-\r
-FUNCTION: double ffi_test_35 test-struct-11 x int y ;\r
-\r
-[ 9.0 ] [\r
-    "test-struct-11" <c-object>\r
-    1 over set-test-struct-11-x\r
-    2 over set-test-struct-11-y\r
-    3 ffi_test_35\r
-] unit-test\r
-\r
-C-STRUCT: test-struct-12 { "int" "a" } { "double" "x" } ;\r
-\r
-: make-struct-12\r
-    "test-struct-12" <c-object>\r
-    [ set-test-struct-12-x ] keep ;\r
-\r
-FUNCTION: double ffi_test_36 ( test-struct-12 x ) ;\r
-\r
-[ 1.23456 ] [ 1.23456 make-struct-12 ffi_test_36 ] unit-test\r
-\r
-FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;\r
-\r
-[ t ] [ 31 2^ 32 2^ ffi_test_38 63 2^ = ] unit-test\r
-\r
-! Test callbacks\r
-\r
-: callback-1 "void" { } "cdecl" [ ] alien-callback ;\r
-\r
-[ 0 1 ] [ [ callback-1 ] infer dup effect-in swap effect-out ] unit-test\r
-\r
-[ t ] [ callback-1 alien? ] unit-test\r
-\r
-: callback_test_1 "void" { } "cdecl" alien-indirect ;\r
-\r
-[ ] [ callback-1 callback_test_1 ] unit-test\r
-\r
-: callback-2 "void" { } "cdecl" [ [ 5 throw ] ignore-errors ] alien-callback ;\r
-\r
-[ ] [ callback-2 callback_test_1 ] unit-test\r
-\r
-: callback-3 "void" { } "cdecl" [ 5 "x" set ] alien-callback ;\r
-\r
-[ t ] [ \r
-    namestack*\r
-    3 "x" set callback-3 callback_test_1\r
-    namestack* eq?\r
-] unit-test\r
-\r
-[ 5 ] [ \r
-    [\r
-        3 "x" set callback-3 callback_test_1 "x" get\r
-    ] with-scope\r
-] unit-test\r
-\r
-: callback-4\r
-    "void" { } "cdecl" [ "Hello world" write ] alien-callback\r
-    gc ;\r
-\r
-[ "Hello world" ] [ \r
-    [ callback-4 callback_test_1 ] with-string-writer\r
-] unit-test\r
-\r
-: callback-5\r
-    "void" { } "cdecl" [ gc ] alien-callback ;\r
-\r
-[ "testing" ] [\r
-    "testing" callback-5 callback_test_1\r
-] unit-test\r
-\r
-: callback-5a\r
-    "void" { } "cdecl" [ 8000000 f <array> drop ] alien-callback ;\r
-\r
-! Hack; if we're on ARM, we probably don't have much RAM, so\r
-! skip this test.\r
-! cpu "arm" = [\r
-!     [ "testing" ] [\r
-!         "testing" callback-5a callback_test_1\r
-!     ] unit-test\r
-! ] unless\r
-\r
-: callback-6\r
-    "void" { } "cdecl" [ [ continue ] callcc0 ] alien-callback ;\r
-\r
-[ 1 2 3 ] [ callback-6 callback_test_1 1 2 3 ] unit-test\r
-\r
-: callback-7\r
-    "void" { } "cdecl" [ 1000 sleep ] alien-callback ;\r
-\r
-[ 1 2 3 ] [ callback-7 callback_test_1 1 2 3 ] unit-test\r
-\r
-[ f ] [ namespace global eq? ] unit-test\r
-\r
-: callback-8\r
-    "void" { } "cdecl" [\r
-        [ continue ] callcc0\r
-    ] alien-callback ;\r
-\r
-[ ] [ callback-8 callback_test_1 ] unit-test\r
-\r
-: callback-9\r
-    "int" { "int" "int" "int" } "cdecl" [\r
-        + + 1+\r
-    ] alien-callback ;\r
-\r
-FUNCTION: void ffi_test_36_point_5 ( ) ;\r
-\r
-[ ] [ ffi_test_36_point_5 ] unit-test\r
-\r
-FUNCTION: int ffi_test_37 ( void* func ) ;\r
-\r
-[ 1 ] [ callback-9 ffi_test_37 ] unit-test\r
-\r
-[ 7 ] [ callback-9 ffi_test_37 ] unit-test\r
+IN: alien.compiler.tests
+USING: alien alien.c-types alien.syntax compiler kernel
+namespaces namespaces tools.test sequences inference words
+arrays parser quotations continuations inference.backend effects
+namespaces.private io io.streams.string memory system threads
+tools.test math ;
+
+FUNCTION: void ffi_test_0 ;
+[ ] [ ffi_test_0 ] unit-test
+
+FUNCTION: int ffi_test_1 ;
+[ 3 ] [ ffi_test_1 ] unit-test
+
+FUNCTION: int ffi_test_2 int x int y ;
+[ 5 ] [ 2 3 ffi_test_2 ] unit-test
+[ "hi" 3 ffi_test_2 ] must-fail
+
+FUNCTION: int ffi_test_3 int x int y int z int t ;
+[ 25 ] [ 2 3 4 5 ffi_test_3 ] unit-test
+
+FUNCTION: float ffi_test_4 ;
+[ 1.5 ] [ ffi_test_4 ] unit-test
+
+FUNCTION: double ffi_test_5 ;
+[ 1.5 ] [ ffi_test_5 ] unit-test
+
+FUNCTION: int ffi_test_9 int a int b int c int d int e int f int g ;
+[ 28 ] [ 1 2 3 4 5 6 7 ffi_test_9 ] unit-test
+[ "a" 2 3 4 5 6 7 ffi_test_9 ] must-fail
+[ 1 2 3 4 5 6 "a" ffi_test_9 ] must-fail
+
+C-STRUCT: foo
+    { "int" "x" }
+    { "int" "y" }
+;
+
+: make-foo ( x y -- foo )
+    "foo" <c-object> [ set-foo-y ] keep [ set-foo-x ] keep ;
+
+FUNCTION: int ffi_test_11 int a foo b int c ;
+
+[ 14 ] [ 1 2 3 make-foo 4 ffi_test_11 ] unit-test
+
+FUNCTION: int ffi_test_13 int a int b int c int d int e int f int g int h int i int j int k ;
+
+[ 66 ] [ 1 2 3 4 5 6 7 8 9 10 11 ffi_test_13 ] unit-test
+
+FUNCTION: foo ffi_test_14 int x int y ;
+
+[ 11 6 ] [ 11 6 ffi_test_14 dup foo-x swap foo-y ] unit-test
+
+FUNCTION: char* ffi_test_15 char* x char* y ;
+
+[ "foo" ] [ "xy" "zt" ffi_test_15 ] unit-test
+[ "bar" ] [ "xy" "xy" ffi_test_15 ] unit-test
+[ 1 2 ffi_test_15 ] must-fail
+
+C-STRUCT: bar
+    { "long" "x" }
+    { "long" "y" }
+    { "long" "z" }
+;
+
+FUNCTION: bar ffi_test_16 long x long y long z ;
+
+[ 11 6 -7 ] [
+    11 6 -7 ffi_test_16 dup bar-x over bar-y rot bar-z
+] unit-test
+
+C-STRUCT: tiny
+    { "int" "x" }
+;
+
+FUNCTION: tiny ffi_test_17 int x ;
+
+[ 11 ] [ 11 ffi_test_17 tiny-x ] unit-test
+
+[ [ alien-indirect ] infer ] [ inference-error? ] must-fail-with
+
+: indirect-test-1
+    "int" { } "cdecl" alien-indirect ;
+
+{ 1 1 } [ indirect-test-1 ] must-infer-as
+
+[ 3 ] [ "ffi_test_1" f dlsym indirect-test-1 ] unit-test
+
+[ -1 indirect-test-1 ] must-fail
+
+: indirect-test-2
+    "int" { "int" "int" } "cdecl" alien-indirect gc ;
+
+{ 3 1 } [ indirect-test-2 ] must-infer-as
+
+[ 5 ]
+[ 2 3 "ffi_test_2" f dlsym indirect-test-2 ]
+unit-test
+
+: indirect-test-3
+    "int" { "int" "int" "int" "int" } "stdcall" alien-indirect
+    gc ;
+
+<< "f-stdcall" f "stdcall" add-library >>
+
+[ f ] [ "f-stdcall" load-library ] unit-test
+[ "stdcall" ] [ "f-stdcall" library library-abi ] unit-test
+
+: ffi_test_18 ( w x y z -- int )
+    "int" "f-stdcall" "ffi_test_18" { "int" "int" "int" "int" }
+    alien-invoke gc ;
+
+[ 25 ] [ 2 3 4 5 ffi_test_18 ] unit-test
+
+: ffi_test_19 ( x y z -- bar )
+    "bar" "f-stdcall" "ffi_test_19" { "long" "long" "long" }
+    alien-invoke gc ;
+
+[ 11 6 -7 ] [
+    11 6 -7 ffi_test_19 dup bar-x over bar-y rot bar-z
+] unit-test
+
+FUNCTION: double ffi_test_6 float x float y ;
+[ 6.0 ] [ 3.0 2.0 ffi_test_6 ] unit-test
+[ "a" "b" ffi_test_6 ] must-fail
+
+FUNCTION: double ffi_test_7 double x double y ;
+[ 6.0 ] [ 3.0 2.0 ffi_test_7 ] unit-test
+
+FUNCTION: double ffi_test_8 double x float y double z float t int w ;
+[ 19.0 ] [ 3.0 2.0 1.0 6.0 7 ffi_test_8 ] unit-test
+
+FUNCTION: int ffi_test_10 int a int b double c int d float e int f int g int h ;
+[ -34 ] [ 1 2 3.0 4 5.0 6 7 8 ffi_test_10 ] unit-test
+
+FUNCTION: void ffi_test_20 double x1, double x2, double x3,
+    double y1, double y2, double y3,
+    double z1, double z2, double z3 ;
+
+[ ] [ 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 ffi_test_20 ] unit-test
+
+! Make sure XT doesn't get clobbered in stack frame
+
+: ffi_test_31
+    "void"
+    f "ffi_test_31"
+    { "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" "int" }
+    alien-invoke gc 3 ;
+
+[ 3 ] [ 42 [ ] each ffi_test_31 ] unit-test
+
+FUNCTION: longlong ffi_test_21 long x long y ;
+
+[ 121932631112635269 ]
+[ 123456789 987654321 ffi_test_21 ] unit-test
+
+FUNCTION: long ffi_test_22 long x longlong y longlong z ;
+
+[ 987655432 ]
+[ 1111 121932631112635269 123456789 ffi_test_22 ] unit-test
+
+[ 1111 f 123456789 ffi_test_22 ] must-fail
+
+C-STRUCT: rect
+    { "float" "x" }
+    { "float" "y" }
+    { "float" "w" }
+    { "float" "h" }
+;
+
+: <rect>
+    "rect" <c-object>
+    [ set-rect-h ] keep
+    [ set-rect-w ] keep
+    [ set-rect-y ] keep
+    [ set-rect-x ] keep ;
+
+FUNCTION: int ffi_test_12 int a int b rect c int d int e int f ;
+
+[ 45 ] [ 1 2 3.0 4.0 5.0 6.0 <rect> 7 8 9 ffi_test_12 ] unit-test
+
+[ 1 2 { 1 2 3 } 7 8 9 ffi_test_12 ] must-fail
+
+FUNCTION: float ffi_test_23 ( float[3] x, float[3] y ) ;
+
+[ 32.0 ] [ { 1.0 2.0 3.0 } >c-float-array { 4.0 5.0 6.0 } >c-float-array ffi_test_23 ] unit-test
+
+! Test odd-size structs
+C-STRUCT: test-struct-1 { { "char" 1 } "x" } ;
+
+FUNCTION: test-struct-1 ffi_test_24 ;
+
+[ B{ 1 } ] [ ffi_test_24 ] unit-test
+
+C-STRUCT: test-struct-2 { { "char" 2 } "x" } ;
+
+FUNCTION: test-struct-2 ffi_test_25 ;
+
+[ B{ 1 2 } ] [ ffi_test_25 ] unit-test
+
+C-STRUCT: test-struct-3 { { "char" 3 } "x" } ;
+
+FUNCTION: test-struct-3 ffi_test_26 ;
+
+[ B{ 1 2 3 } ] [ ffi_test_26 ] unit-test
+
+C-STRUCT: test-struct-4 { { "char" 4 } "x" } ;
+
+FUNCTION: test-struct-4 ffi_test_27 ;
+
+[ B{ 1 2 3 4 } ] [ ffi_test_27 ] unit-test
+
+C-STRUCT: test-struct-5 { { "char" 5 } "x" } ;
+
+FUNCTION: test-struct-5 ffi_test_28 ;
+
+[ B{ 1 2 3 4 5 } ] [ ffi_test_28 ] unit-test
+
+C-STRUCT: test-struct-6 { { "char" 6 } "x" } ;
+
+FUNCTION: test-struct-6 ffi_test_29 ;
+
+[ B{ 1 2 3 4 5 6 } ] [ ffi_test_29 ] unit-test
+
+C-STRUCT: test-struct-7 { { "char" 7 } "x" } ;
+
+FUNCTION: test-struct-7 ffi_test_30 ;
+
+[ B{ 1 2 3 4 5 6 7 } ] [ ffi_test_30 ] unit-test
+
+C-STRUCT: test-struct-8 { "double" "x" } { "double" "y" } ;
+
+FUNCTION: double ffi_test_32 test-struct-8 x int y ;
+
+[ 9.0 ] [
+    "test-struct-8" <c-object>
+    1.0 over set-test-struct-8-x
+    2.0 over set-test-struct-8-y
+    3 ffi_test_32
+] unit-test
+
+C-STRUCT: test-struct-9 { "float" "x" } { "float" "y" } ;
+
+FUNCTION: double ffi_test_33 test-struct-9 x int y ;
+
+[ 9.0 ] [
+    "test-struct-9" <c-object>
+    1.0 over set-test-struct-9-x
+    2.0 over set-test-struct-9-y
+    3 ffi_test_33
+] unit-test
+
+C-STRUCT: test-struct-10 { "float" "x" } { "int" "y" } ;
+
+FUNCTION: double ffi_test_34 test-struct-10 x int y ;
+
+[ 9.0 ] [
+    "test-struct-10" <c-object>
+    1.0 over set-test-struct-10-x
+    2 over set-test-struct-10-y
+    3 ffi_test_34
+] unit-test
+
+C-STRUCT: test-struct-11 { "int" "x" } { "int" "y" } ;
+
+FUNCTION: double ffi_test_35 test-struct-11 x int y ;
+
+[ 9.0 ] [
+    "test-struct-11" <c-object>
+    1 over set-test-struct-11-x
+    2 over set-test-struct-11-y
+    3 ffi_test_35
+] unit-test
+
+C-STRUCT: test-struct-12 { "int" "a" } { "double" "x" } ;
+
+: make-struct-12
+    "test-struct-12" <c-object>
+    [ set-test-struct-12-x ] keep ;
+
+FUNCTION: double ffi_test_36 ( test-struct-12 x ) ;
+
+[ 1.23456 ] [ 1.23456 make-struct-12 ffi_test_36 ] unit-test
+
+FUNCTION: ulonglong ffi_test_38 ( ulonglong x, ulonglong y ) ;
+
+[ t ] [ 31 2^ 32 2^ ffi_test_38 63 2^ = ] unit-test
+
+! Test callbacks
+
+: callback-1 "void" { } "cdecl" [ ] alien-callback ;
+
+[ 0 1 ] [ [ callback-1 ] infer dup effect-in swap effect-out ] unit-test
+
+[ t ] [ callback-1 alien? ] unit-test
+
+: callback_test_1 "void" { } "cdecl" alien-indirect ;
+
+[ ] [ callback-1 callback_test_1 ] unit-test
+
+: callback-2 "void" { } "cdecl" [ [ 5 throw ] ignore-errors ] alien-callback ;
+
+[ ] [ callback-2 callback_test_1 ] unit-test
+
+: callback-3 "void" { } "cdecl" [ 5 "x" set ] alien-callback ;
+
+[ t ] [
+    namestack*
+    3 "x" set callback-3 callback_test_1
+    namestack* eq?
+] unit-test
+
+[ 5 ] [
+    [
+        3 "x" set callback-3 callback_test_1 "x" get
+    ] with-scope
+] unit-test
+
+: callback-4
+    "void" { } "cdecl" [ "Hello world" write ] alien-callback
+    gc ;
+
+[ "Hello world" ] [
+    [ callback-4 callback_test_1 ] with-string-writer
+] unit-test
+
+: callback-5
+    "void" { } "cdecl" [ gc ] alien-callback ;
+
+[ "testing" ] [
+    "testing" callback-5 callback_test_1
+] unit-test
+
+: callback-5a
+    "void" { } "cdecl" [ 8000000 f <array> drop ] alien-callback ;
+
+! Hack; if we're on ARM, we probably don't have much RAM, so
+! skip this test.
+! cpu "arm" = [
+!     [ "testing" ] [
+!         "testing" callback-5a callback_test_1
+!     ] unit-test
+! ] unless
+
+: callback-6
+    "void" { } "cdecl" [ [ continue ] callcc0 ] alien-callback ;
+
+[ 1 2 3 ] [ callback-6 callback_test_1 1 2 3 ] unit-test
+
+: callback-7
+    "void" { } "cdecl" [ 1000 sleep ] alien-callback ;
+
+[ 1 2 3 ] [ callback-7 callback_test_1 1 2 3 ] unit-test
+
+[ f ] [ namespace global eq? ] unit-test
+
+: callback-8
+    "void" { } "cdecl" [
+        [ continue ] callcc0
+    ] alien-callback ;
+
+[ ] [ callback-8 callback_test_1 ] unit-test
+
+: callback-9
+    "int" { "int" "int" "int" } "cdecl" [
+        + + 1+
+    ] alien-callback ;
+
+FUNCTION: void ffi_test_36_point_5 ( ) ;
+
+[ ] [ ffi_test_36_point_5 ] unit-test
+
+FUNCTION: int ffi_test_37 ( void* func ) ;
+
+[ 1 ] [ callback-9 ffi_test_37 ] unit-test
+
+[ 7 ] [ callback-9 ffi_test_37 ] unit-test
index 3de4c6129121f9675cc15ca4c2bd555c48009a48..08b52367b033f100f071165bdc84a522ab10065c 100755 (executable)
@@ -270,7 +270,7 @@ M: no-such-symbol compiler-error-type
     pop-literal nip >>library
     pop-literal nip >>return
     ! Quotation which coerces parameters to required types
-    dup param-prep-quot f infer-quot
+    dup param-prep-quot recursive-state get infer-quot
     ! Set ABI
     dup library>> library [ abi>> ] [ "cdecl" ] if* >>abi
     ! Add node to IR
@@ -278,7 +278,7 @@ M: no-such-symbol compiler-error-type
     ! Magic #: consume exactly the number of inputs
     dup 0 alien-invoke-stack
     ! Quotation which coerces return value to required type
-    return-prep-quot f infer-quot
+    return-prep-quot recursive-state get infer-quot
 ] "infer" set-word-prop
 
 M: #alien-invoke generate-node
@@ -306,13 +306,13 @@ M: alien-indirect-error summary
     pop-parameters >>parameters
     pop-literal nip >>return
     ! Quotation which coerces parameters to required types
-    dup param-prep-quot [ dip ] curry f infer-quot
+    dup param-prep-quot [ dip ] curry recursive-state get infer-quot
     ! Add node to IR
     dup node,
     ! Magic #: consume the function pointer, too
     dup 1 alien-invoke-stack
     ! Quotation which coerces return value to required type
-    return-prep-quot f infer-quot
+    return-prep-quot recursive-state get infer-quot
 ] "infer" set-word-prop
 
 M: #alien-indirect generate-node
@@ -345,7 +345,7 @@ M: alien-callback-error summary
 
 : callback-bottom ( node -- )
     xt>> [ word-xt drop <alien> ] curry
-    f infer-quot ;
+    recursive-state get infer-quot ;
 
 \ alien-callback [
     4 ensure-values
index 0dbb4ffd3839822ed0f169ca54dd0e6eaa5da65f..27b0122ebe04db56de8dad08fef0de68fec88310 100644 (file)
@@ -3,14 +3,14 @@ debugger ;
 IN: alien.strings
 
 HELP: string>alien
-{ $values { "string" string } { "encoding" "an encoding descriptor" } { "array" byte-array } }
+{ $values { "string" string } { "encoding" "an encoding descriptor" } { "byte-array" byte-array } }
 { $description "Encodes a string together with a trailing null code point using the given encoding, and stores the resulting bytes in a freshly-allocated byte array." }
 { $errors "Throws an error if the string contains null characters, or characters not representable in the given encoding." } ;
 
 { string>alien alien>string malloc-string } related-words
 
 HELP: alien>string
-{ $values { "c-ptr" c-ptr } { "encoding" "an encoding descriptor" } { "string" string } }
+{ $values { "c-ptr" c-ptr } { "encoding" "an encoding descriptor" } { "string/f" "a string or " { $link f } } }
 { $description "Reads a null-terminated C string from the specified address with the given encoding." } ;
 
 HELP: malloc-string
index 463fc11e0dfe06fd1c1af35ab77e944a184187ea..d69d8e9e8e4cc37344d22892580d8be168879ac2 100644 (file)
@@ -6,7 +6,7 @@ io.streams.byte-array io.streams.memory io.encodings.utf8
 io.encodings.utf16 system alien strings cpu.architecture ;
 IN: alien.strings
 
-GENERIC# alien>string 1 ( alien encoding -- string/f )
+GENERIC# alien>string 1 ( c-ptr encoding -- string/f )
 
 M: c-ptr alien>string
     >r <memory-stream> r> <decoder>
index f0f495cac9cfafd9ee984718b7b5d288fad424ec..b2e819f8fbf91b695d7092216f1e4c29cbf345c7 100755 (executable)
@@ -40,7 +40,7 @@ PRIVATE>
 
 : FUNCTION:
     scan "c-library" get scan ";" parse-tokens
-    [ "()" subseq? not ] subset
+    [ "()" subseq? not ] filter
     define-function ; parsing
 
 : TYPEDEF:
index 863fdaecb3cbbb56fc6d7a19bb013322bcf6c06b..68be9c9b06fa83a94af72468069d1e61b54b8683 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Daniel Ehrenberg and Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: help.markup help.syntax kernel sequences
-sequences.private namespaces classes math ;
+sequences.private namespaces math ;
 IN: assocs
 
 ARTICLE: "alists" "Association lists"
@@ -68,7 +68,7 @@ ARTICLE: "assocs-lookup" "Lookup and querying of assocs"
 
 ARTICLE: "assocs-sets" "Set-theoretic operations on assocs"
 "It is often useful to use the keys of an associative mapping as a set, exploiting the constant or logarithmic lookup time of most implementations (" { $link "alists" } " being a notable exception)."
-{ $subsection subassoc? }
+{ $subsection assoc-subset? }
 { $subsection assoc-intersect }
 { $subsection update }
 { $subsection assoc-union }
@@ -96,7 +96,7 @@ $nl
 { $subsection assoc-each }
 { $subsection assoc-map }
 { $subsection assoc-push-if }
-{ $subsection assoc-subset }
+{ $subsection assoc-filter }
 { $subsection assoc-contains? }
 { $subsection assoc-all? }
 "Three additional combinators:"
@@ -203,7 +203,7 @@ HELP: assoc-push-if
 { $values { "accum" "a resizable mutable sequence" } { "quot" "a quotation with stack effect " { $snippet "( key value -- ? )" } } { "key" object } { "value" object } }
 { $description "If the quotation yields true when applied to the key/value pair, adds the key/value pair at the end of " { $snippet "accum" } "." } ;
 
-HELP: assoc-subset
+HELP: assoc-filter
 { $values { "assoc" assoc } { "quot" "a quotation with stack effect " { $snippet "( key value -- ? )" } } { "subassoc" "a new assoc" } }
 { $description "Outputs an assoc of the same type as " { $snippet "assoc" } " consisting of all entries for which the predicate quotation yields true." } ;
 
@@ -215,7 +215,7 @@ HELP: assoc-all?
 { $values { "assoc" assoc } { "quot" "a quotation with stack effect " { $snippet "( key value -- ? )" } } { "?" "a boolean" } }
 { $description "Tests if all entries in the assoc satisfy a predicate by applying the quotation to each entry in turn. a predicate quotation to entry in the assoc. Iteration stops if an entry is found for which the quotation outputs " { $link f } ". If the assoc is empty, always outputs " { $link t } "." } ;
 
-HELP: subassoc?
+HELP: assoc-subset?
 { $values { "assoc1" assoc } { "assoc2" assoc } { "?" "a new assoc" } }
 { $description "Tests if " { $snippet "assoc2" } " contains all key/value pairs of " { $snippet "assoc1" } "." } ;
 
@@ -281,7 +281,7 @@ HELP: assoc-union
 
 HELP: assoc-diff
 { $values { "assoc1" assoc } { "assoc2" assoc } { "diff" "a new assoc" } }
-{ $description "Outputs an assoc consisting of all entries from " { $snippet "assoc2" } " whose key is not contained in " { $snippet "assoc1" } "." } 
+{ $description "Outputs an assoc consisting of all entries from " { $snippet "assoc1" } " whose key is not contained in " { $snippet "assoc2" } "." } 
 ;
 HELP: remove-all
 { $values { "assoc" assoc } { "seq" "a sequence" } { "subseq" "a new sequence" } }
index 76f484006dd313a67dbf00f0a5f045728f2eba3a..30f2ec23c4810b075631139907a2fb5f5b9c400f 100755 (executable)
@@ -3,13 +3,13 @@ USING: kernel math namespaces tools.test vectors sequences
 sequences.private hashtables io prettyprint assocs
 continuations ;
 
-[ t ] [ H{ } dup subassoc? ] unit-test
-[ f ] [ H{ { 1 3 } } H{ } subassoc? ] unit-test
-[ t ] [ H{ } H{ { 1 3 } } subassoc? ] unit-test
-[ t ] [ H{ { 1 3 } } H{ { 1 3 } } subassoc? ] unit-test
-[ f ] [ H{ { 1 3 } } H{ { 1 "hey" } } subassoc? ] unit-test
-[ f ] [ H{ { 1 f } } H{ } subassoc? ] unit-test
-[ t ] [ H{ { 1 f } } H{ { 1 f } } subassoc? ] unit-test
+[ t ] [ H{ } dup assoc-subset? ] unit-test
+[ f ] [ H{ { 1 3 } } H{ } assoc-subset? ] unit-test
+[ t ] [ H{ } H{ { 1 3 } } assoc-subset? ] unit-test
+[ t ] [ H{ { 1 3 } } H{ { 1 3 } } assoc-subset? ] unit-test
+[ f ] [ H{ { 1 3 } } H{ { 1 "hey" } } assoc-subset? ] unit-test
+[ f ] [ H{ { 1 f } } H{ } assoc-subset? ] unit-test
+[ t ] [ H{ { 1 f } } H{ { 1 f } } assoc-subset? ] unit-test
 
 ! Test some combinators
 [
@@ -30,10 +30,10 @@ continuations ;
 [ t ] [ H{ { 1 1 } { 2 2 } } [ = ] assoc-all? ] unit-test
 [ f ] [ H{ { 1 2 } { 2 2 } } [ = ] assoc-all? ] unit-test
 
-[ H{ } ] [ H{ { t f } { f t } } [ 2drop f ] assoc-subset ] unit-test
+[ H{ } ] [ H{ { t f } { f t } } [ 2drop f ] assoc-filter ] unit-test
 [ H{ { 3 4 } { 4 5 } { 6 7 } } ] [
     H{ { 1 2 } { 2 3 } { 3 4 } { 4 5 } { 6 7 } }
-    [ drop 3 >= ] assoc-subset
+    [ drop 3 >= ] assoc-filter
 ] unit-test
 
 [ 21 ] [
index 4a6ecae4fe38f3aeb1a9bee95a1792ab088a0aca..92db38573ad28b747400e9fe1b73c576ba43772c 100755 (executable)
@@ -50,7 +50,7 @@ M: assoc assoc-find
 : assoc-pusher ( quot -- quot' accum )
     V{ } clone [ [ assoc-push-if ] 2curry ] keep ; inline
 
-: assoc-subset ( assoc quot -- subassoc )
+: assoc-filter ( assoc quot -- subassoc )
     over >r assoc-pusher >r assoc-each r> r> assoc-like ; inline
 
 : assoc-contains? ( assoc quot -- ? )
@@ -98,11 +98,11 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc )
 : assoc-stack ( key seq -- value )
     dup length 1- swap (assoc-stack) ;
 
-: subassoc? ( assoc1 assoc2 -- ? )
+: assoc-subset? ( assoc1 assoc2 -- ? )
     [ swapd at* [ = ] [ 2drop f ] if ] curry assoc-all? ;
 
 : assoc= ( assoc1 assoc2 -- ? )
-    2dup subassoc? >r swap subassoc? r> and ;
+    [ assoc-subset? ] [ swap assoc-subset? ] 2bi and ;
 
 : assoc-hashcode ( n assoc -- code )
     [
@@ -110,7 +110,7 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc )
     ] { } assoc>map hashcode* ;
 
 : assoc-intersect ( assoc1 assoc2 -- intersection )
-    swap [ nip key? ] curry assoc-subset ;
+    swap [ nip key? ] curry assoc-filter ;
 
 : update ( assoc1 assoc2 -- )
     swap [ swapd set-at ] curry assoc-each ;
@@ -120,10 +120,10 @@ M: assoc assoc-clone-like ( assoc exemplar -- newassoc )
     [ rot update ] keep [ swap update ] keep ;
 
 : assoc-diff ( assoc1 assoc2 -- diff )
-    swap [ nip key? not ] curry assoc-subset ;
+    [ nip key? not ] curry assoc-filter ;
 
 : remove-all ( assoc seq -- subseq )
-    swap [ key? not ] curry subset ;
+    swap [ key? not ] curry filter ;
 
 : (substitute)
     [ dupd at* [ nip ] [ drop ] if ] curry ; inline
index da3c634ebdb3a99a53d36f575c74d8cddd2efe68..7ad1c6978b30e916b775ff679137d09e477aea0c 100755 (executable)
@@ -5,7 +5,7 @@ namespaces parser kernel kernel.private classes classes.private
 arrays hashtables vectors classes.tuple sbufs inference.dataflow
 hashtables.private sequences.private math classes.tuple.private
 growable namespaces.private assocs words generator command-line
-vocabs io prettyprint libc compiler.units ;
+vocabs io prettyprint libc compiler.units math.order ;
 IN: bootstrap.compiler
 
 ! Don't bring this in when deploying, since it will store a
@@ -18,6 +18,8 @@ IN: bootstrap.compiler
 
 enable-compiler
 
+: compile-uncompiled [ compiled? not ] filter compile ;
+
 nl
 "Compiling..." write flush
 
@@ -42,38 +44,38 @@ nl
     find-pair-next namestack*
 
     bitand bitor bitxor bitnot
-} compile
+} compile-uncompiled
 
 "." write flush
 
 {
-    + 1+ 1- 2/ < <= > >= shift min
-} compile
+    + 1+ 1- 2/ < <= > >= shift
+} compile-uncompiled
 
 "." write flush
 
 {
     new-sequence nth push pop peek
-} compile
+} compile-uncompiled
 
 "." write flush
 
 {
     hashcode* = get set
-} compile
+} compile-uncompiled
 
 "." write flush
 
 {
     . lines
-} compile
+} compile-uncompiled
 
 "." write flush
 
 {
     malloc calloc free memcpy
-} compile
+} compile-uncompiled
 
-vocabs [ words [ compiled? not ] subset compile "." write flush ] each
+vocabs [ words compile-uncompiled "." write flush ] each
 
 " done" print flush
index ae5c66a45ce916023a75350dc23bbedc1db4ab5f..c432a47ea4844b7691ff92d8decfcf4fdbde7e7e 100755 (executable)
@@ -1,5 +1,22 @@
 IN: bootstrap.image.tests
-USING: bootstrap.image bootstrap.image.private tools.test ;
+USING: bootstrap.image bootstrap.image.private tools.test
+kernel math ;
 
 \ ' must-infer
 \ write-image must-infer
+
+[ f ] [ { 1 2 3 } [ 1 2 3 ] eql? ] unit-test
+
+[ t ] [ [ 1 2 3 ] [ 1 2 3 ] eql? ] unit-test
+
+[ f ] [ [ 2drop 0 ] [ 2drop 0.0 ] eql? ] unit-test
+
+[ t ] [ [ 2drop 0 ] [ 2drop 0 ] eql? ] unit-test
+
+[ f ] [ \ + [ 2drop 0 ] eql? ] unit-test
+
+[ f ] [ 3 [ 0 1 2 ] eql? ] unit-test
+
+[ f ] [ 3 3.0 eql? ] unit-test
+
+[ t ] [ 4.0 4.0 eql? ] unit-test
index 05d48af2e8be3745416913832306b9ff65824a7b..1ff04bacc2993dfe4ebc0316c79d158945ca9c40 100755 (executable)
@@ -8,7 +8,7 @@ splitting growable classes classes.builtin classes.tuple
 classes.tuple.private words.private io.binary io.files vocabs
 vocabs.loader source-files definitions debugger float-arrays
 quotations.private sequences.private combinators
-io.encodings.binary ;
+io.encodings.binary math.order accessors ;
 IN: bootstrap.image
 
 : my-arch ( -- arch )
@@ -31,6 +31,43 @@ IN: bootstrap.image
 
 <PRIVATE
 
+! Object cache; we only consider numbers equal if they have the
+! same type
+TUPLE: id obj ;
+
+C: <id> id
+
+M: id hashcode* obj>> hashcode* ;
+
+GENERIC: (eql?) ( obj1 obj2 -- ? )
+
+: eql? ( obj1 obj2 -- ? )
+    [ (eql?) ] [ [ class ] bi@ = ] 2bi and ;
+
+M: integer (eql?) = ;
+
+M: sequence (eql?)
+    over sequence? [
+        2dup [ length ] bi@ =
+        [ [ eql? ] 2all? ] [ 2drop f ] if
+    ] [ 2drop f ] if ;
+
+M: object (eql?) = ;
+
+M: id equal?
+    over id? [ [ obj>> ] bi@ eql? ] [ 2drop f ] if ;
+
+SYMBOL: objects
+
+: (objects) <id> objects get ; inline
+
+: lookup-object ( obj -- n/f ) (objects) at ;
+
+: put-object ( n obj -- ) (objects) set-at ;
+
+: cache-object ( obj quot -- value )
+    >r (objects) r> [ obj>> ] prepose cache ; inline
+
 ! Constants
 
 : image-magic HEX: 0f0e0d0c ; inline
@@ -61,9 +98,6 @@ IN: bootstrap.image
 ! The image being constructed; a vector of word-size integers
 SYMBOL: image
 
-! Object cache
-SYMBOL: objects
-
 ! Image output format
 SYMBOL: big-endian
 
@@ -187,7 +221,9 @@ GENERIC: ' ( obj -- ptr )
     2tri ;
 
 M: bignum '
-    bignum tag-number dup [ emit-bignum ] emit-object ;
+    [
+        bignum tag-number dup [ emit-bignum ] emit-object
+    ] cache-object ;
 
 ! Fixnums
 
@@ -202,9 +238,11 @@ M: fixnum '
 ! Floats
 
 M: float '
-    float tag-number dup [
-        align-here double>bits emit-64
-    ] emit-object ;
+    [
+        float tag-number dup [
+            align-here double>bits emit-64
+        ] emit-object
+    ] cache-object ;
 
 ! Special objects
 
@@ -243,7 +281,7 @@ M: f '
         ] bi
         \ word type-number object tag-number
         [ emit-seq ] emit-object
-    ] keep objects get set-at ;
+    ] keep put-object ;
 
 : word-error ( word msg -- * )
     [ % dup word-vocabulary % " " % word-name % ] "" make throw ;
@@ -252,7 +290,7 @@ M: f '
     [ target-word ] keep or ;
 
 : fixup-word ( word -- offset )
-    transfer-word dup objects get at
+    transfer-word dup lookup-object
     [ ] [ "Not in image: " word-error ] ?if ;
 
 : fixup-words ( -- )
@@ -267,12 +305,12 @@ M: wrapper '
     [ emit ] emit-object ;
 
 ! Strings
-: emit-chars ( seq -- )
+: emit-bytes ( seq -- )
     bootstrap-cell <groups>
     big-endian get [ [ be> ] map ] [ [ le> ] map ] if
     emit-seq ;
 
-: pack-string ( string -- newstr )
+: pad-bytes ( seq -- newseq )
     dup length bootstrap-cell align 0 pad-right ;
 
 : emit-string ( string -- ptr )
@@ -280,13 +318,13 @@ M: wrapper '
         dup length emit-fixnum
         f ' emit
         f ' emit
-        pack-string emit-chars
+        pad-bytes emit-bytes
     ] emit-object ;
 
 M: string '
     #! We pool strings so that each string is only written once
     #! to the image
-    objects get [ emit-string ] cache ;
+    [ emit-string ] cache-object ;
 
 : assert-empty ( seq -- )
     length 0 assert= ;
@@ -297,7 +335,11 @@ M: string '
         [ 0 emit-fixnum ] emit-object
     ] bi* ;
 
-M: byte-array ' byte-array emit-dummy-array ;
+M: byte-array '
+    byte-array type-number object tag-number [
+        dup length emit-fixnum
+        pad-bytes emit-bytes
+    ] emit-object ;
 
 M: bit-array ' bit-array emit-dummy-array ;
 
@@ -305,18 +347,18 @@ M: float-array ' float-array emit-dummy-array ;
 
 ! Tuples
 : (emit-tuple) ( tuple -- pointer )
-    [ tuple>array 1 tail-slice ]
+    [ tuple>array rest-slice ]
     [ class transfer-word tuple-layout ] bi prefix [ ' ] map
     tuple type-number dup [ emit-seq ] emit-object ;
 
 : emit-tuple ( tuple -- pointer )
     dup class word-name "tombstone" =
-    [ objects get [ (emit-tuple) ] cache ] [ (emit-tuple) ] if ;
+    [ [ (emit-tuple) ] cache-object ] [ (emit-tuple) ] if ;
 
 M: tuple ' emit-tuple ;
 
 M: tuple-layout '
-    objects get [
+    [
         [
             {
                 [ layout-hashcode , ]
@@ -328,12 +370,12 @@ M: tuple-layout '
         ] { } make [ ' ] map
         \ tuple-layout type-number
         object tag-number [ emit-seq ] emit-object
-    ] cache ;
+    ] cache-object ;
 
 M: tombstone '
     delegate
     "((tombstone))" "((empty))" ? "hashtables.private" lookup
-    word-def first objects get [ emit-tuple ] cache ;
+    word-def first [ emit-tuple ] cache-object ;
 
 ! Arrays
 M: array '
@@ -343,7 +385,7 @@ M: array '
 ! Quotations
 
 M: quotation '
-    objects get [
+    [
         quotation-array '
         quotation type-number object tag-number [
             emit ! array
@@ -351,7 +393,7 @@ M: quotation '
             0 emit ! xt
             0 emit ! code
         ] emit-object
-    ] cache ;
+    ] cache-object ;
 
 ! End of the image
 
@@ -362,8 +404,8 @@ M: quotation '
     [
         {
             dictionary source-files builtins
-            update-map class<-cache class-not-cache
-            classes-intersect-cache class-and-cache
+            update-map class<=-cache
+            class-not-cache classes-intersect-cache class-and-cache
             class-or-cache
         } [ dup get swap bootstrap-word set ] each
     ] H{ } make-assoc
@@ -433,7 +475,7 @@ M: quotation '
     "Writing image to " write
     architecture get boot-image-name resource-path
     [ write "..." print flush ]
-    [ binary <file-writer> [ (write-image) ] with-stream ] bi ;
+    [ binary [ (write-image) ] with-file-writer ] bi ;
 
 PRIVATE>
 
index dd3a4adf8bedb670e46a44aa93e87135e444e7f3..6149e83893fb84f3d7b927cc16a322cbd2935d64 100755 (executable)
@@ -59,6 +59,7 @@ num-types get f <array> builtins set
     "arrays"
     "bit-arrays"
     "byte-arrays"
+    "byte-vectors"
     "classes.private"
     "classes.tuple"
     "classes.tuple.private"
@@ -157,7 +158,7 @@ num-types get f <array> builtins set
 
 ! Catch-all class for providing a default method.
 "object" "kernel" create
-[ f builtins get [ ] subset union-class define-class ]
+[ f builtins get [ ] filter union-class define-class ]
 [ [ drop t ] "predicate" set-word-prop ]
 bi
 
@@ -452,6 +453,22 @@ tuple
     }
 } define-tuple-class
 
+"byte-vector" "byte-vectors" create
+tuple
+{
+    {
+        { "byte-array" "byte-arrays" }
+        "underlying"
+        { "underlying" "growable" }
+        { "set-underlying" "growable" }
+    } {
+        { "array-capacity" "sequences.private" }
+        "fill"
+        { "length" "sequences" }
+        { "set-fill" "growable" }
+    }
+} define-tuple-class
+
 "curry" "kernel" create
 tuple
 {
index dfd2e4be6fe50186de1fcc43e289adc072dfc363..2e087ff5bd3569d8d745e0aee54b37577440fc16 100755 (executable)
@@ -22,13 +22,13 @@ SYMBOL: bootstrap-time
     xref-sources ;
 
 : load-components ( -- )
-    "exclude" "include"
-    [ get-global " " split [ empty? not ] subset ] bi@
+    "include" "exclude"
+    [ get-global " " split [ empty? not ] filter ] bi@
     diff
     [ "bootstrap." prepend require ] each ;
 
 : count-words ( pred -- )
-    all-words swap subset length number>string write ;
+    all-words swap filter length number>string write ;
 
 : print-report ( time -- )
     1000 /i
@@ -44,10 +44,6 @@ SYMBOL: bootstrap-time
     "Now, you can run Factor:" print
     vm write " -i=" write "output-image" get print flush ;
 
-! Wrap everything in a catch which starts a listener so
-! you can see what went wrong, instead of dealing with a
-! fep
-
 ! We time bootstrap
 millis >r
 
@@ -91,7 +87,7 @@ f error-continuation set-global
             parse-command-line
             run-user-init
             "run" get run
-            stdio get [ stream-flush ] when*
+            output-stream get [ stream-flush ] when*
         ] [ print-error 1 exit ] recover
     ] set-boot-quot
 
index 4b748047492d013cbf37770f6e5888bd5d3367a0..7d703d3093190cfed5d12d540ed597db019e694b 100755 (executable)
@@ -16,6 +16,7 @@ IN: bootstrap.syntax
     "?{"
     "BIN:"
     "B{"
+    "BV{"
     "C:"
     "CHAR:"
     "DEFER:"
diff --git a/core/byte-vectors/byte-vectors-docs.factor b/core/byte-vectors/byte-vectors-docs.factor
new file mode 100755 (executable)
index 0000000..139cbab
--- /dev/null
@@ -0,0 +1,42 @@
+USING: arrays byte-arrays help.markup help.syntax kernel\r
+byte-vectors.private combinators ;\r
+IN: byte-vectors\r
+\r
+ARTICLE: "byte-vectors" "Byte vectors"\r
+"A byte vector is a resizable mutable sequence of unsigned bytes. Byte vector words are found in the " { $vocab-link "byte-vectors" } " vocabulary."\r
+$nl\r
+"Byte vectors form a class:"\r
+{ $subsection byte-vector }\r
+{ $subsection byte-vector? }\r
+"Creating byte vectors:"\r
+{ $subsection >byte-vector }\r
+{ $subsection <byte-vector> }\r
+"Literal syntax:"\r
+{ $subsection POSTPONE: BV{ }\r
+"If you don't care about initial capacity, a more elegant way to create a new byte vector is to write:"\r
+{ $code "BV{ } clone" } ;\r
+\r
+ABOUT: "byte-vectors"\r
+\r
+HELP: byte-vector\r
+{ $description "The class of resizable byte vectors. See " { $link "byte-vectors" } " for information." } ;\r
+\r
+HELP: <byte-vector>\r
+{ $values { "n" "a positive integer specifying initial capacity" } { "byte-vector" byte-vector } }\r
+{ $description "Creates a new byte vector that can hold " { $snippet "n" } " bytes before resizing." } ;\r
+\r
+HELP: >byte-vector\r
+{ $values { "seq" "a sequence" } { "byte-vector" byte-vector } }\r
+{ $description "Outputs a freshly-allocated byte vector with the same elements as a given sequence." }\r
+{ $errors "Throws an error if the sequence contains elements other than integers." } ;\r
+\r
+HELP: byte-array>vector\r
+{ $values { "byte-array" "an array" } { "length" "a non-negative integer" } { "byte-vector" byte-vector } }\r
+{ $description "Creates a new byte vector using the array for underlying storage with the specified initial length." }\r
+{ $warning "This word is in the " { $vocab-link "byte-vectors.private" } " vocabulary because it does not perform type or bounds checks. User code should call " { $link >byte-vector } " instead." } ;\r
+\r
+HELP: BV{\r
+{ $syntax "BV{ elements... }" }\r
+{ $values { "elements" "a list of bytes" } }\r
+{ $description "Marks the beginning of a literal byte vector. Literal byte vectors are terminated by " { $link POSTPONE: } } "." } \r
+{ $examples { $code "BV{ 1 2 3 12 }" } } ;\r
diff --git a/core/byte-vectors/byte-vectors-tests.factor b/core/byte-vectors/byte-vectors-tests.factor
new file mode 100755 (executable)
index 0000000..d457d68
--- /dev/null
@@ -0,0 +1,14 @@
+IN: byte-vectors.tests\r
+USING: tools.test byte-vectors vectors sequences kernel ;\r
+\r
+[ 0 ] [ 123 <byte-vector> length ] unit-test\r
+\r
+: do-it\r
+    123 [ over push ] each ;\r
+\r
+[ t ] [\r
+    3 <byte-vector> do-it\r
+    3 <vector> do-it sequence=\r
+] unit-test\r
+\r
+[ t ] [ BV{ } byte-vector? ] unit-test\r
diff --git a/core/byte-vectors/byte-vectors.factor b/core/byte-vectors/byte-vectors.factor
new file mode 100755 (executable)
index 0000000..e80b797
--- /dev/null
@@ -0,0 +1,34 @@
+! Copyright (C) 2008 Slava Pestov.\r
+! See http://factorcode.org/license.txt for BSD license.\r
+USING: arrays kernel kernel.private math sequences\r
+sequences.private growable byte-arrays ;\r
+IN: byte-vectors\r
+\r
+<PRIVATE\r
+\r
+: byte-array>vector ( byte-array length -- byte-vector )\r
+    byte-vector boa ; inline\r
+\r
+PRIVATE>\r
+\r
+: <byte-vector> ( n -- byte-vector )\r
+    <byte-array> 0 byte-array>vector ; inline\r
+\r
+: >byte-vector ( seq -- byte-vector )\r
+    T{ byte-vector f B{ } 0 } clone-like ;\r
+\r
+M: byte-vector like\r
+    drop dup byte-vector? [\r
+        dup byte-array?\r
+        [ dup length byte-array>vector ] [ >byte-vector ] if\r
+    ] unless ;\r
+\r
+M: byte-vector new-sequence\r
+    drop [ <byte-array> ] keep >fixnum byte-array>vector ;\r
+\r
+M: byte-vector equal?\r
+    over byte-vector? [ sequence= ] [ 2drop f ] if ;\r
+\r
+M: byte-array new-resizable drop <byte-vector> ;\r
+\r
+INSTANCE: byte-vector growable\r
diff --git a/core/byte-vectors/summary.txt b/core/byte-vectors/summary.txt
new file mode 100644 (file)
index 0000000..e914ebb
--- /dev/null
@@ -0,0 +1 @@
+Growable byte arrays
diff --git a/core/byte-vectors/tags.txt b/core/byte-vectors/tags.txt
new file mode 100644 (file)
index 0000000..42d711b
--- /dev/null
@@ -0,0 +1 @@
+collections
diff --git a/core/checksums/checksums-docs.factor b/core/checksums/checksums-docs.factor
new file mode 100644 (file)
index 0000000..c352f02
--- /dev/null
@@ -0,0 +1,51 @@
+USING: help.markup help.syntax kernel math sequences quotations
+math.private byte-arrays strings ;
+IN: checksums
+
+HELP: checksum
+{ $class-description "The class of checksum algorithms." } ;
+
+HELP: hex-string
+{ $values { "seq" "a sequence" } { "str" "a string" } }
+{ $description "Converts a sequence of values from 0-255 to a string of hex numbers from 0-ff." }
+{ $examples
+    { $example "USING: checksums io ;" "B{ 1 2 3 4 } hex-string print" "01020304" }
+}
+{ $notes "Numbers are zero-padded on the left." } ;
+
+HELP: checksum-stream
+{ $values { "stream" "an input stream" } { "checksum" "a checksum specifier" } { "value" byte-array } }
+{ $contract "Computes the checksum of all data read from the stream." }
+{ $side-effects "stream" } ;
+
+HELP: checksum-bytes
+{ $values { "bytes" "a sequence of bytes" } { "checksum" "a checksum specifier" } { "value" byte-array } }
+{ $contract "Computes the checksum of all data in a sequence." } ;
+
+HELP: checksum-lines
+{ $values { "lines" "a sequence of sequences of bytes" } { "checksum" "a checksum specifier" } { "value" byte-array } }
+{ $contract "Computes the checksum of all data in a sequence." } ;
+
+HELP: checksum-file
+{ $values { "path" "a pathname specifier" } { "checksum" "a checksum specifier" } { "value" byte-array } }
+{ $contract "Computes the checksum of all data in a file." } ;
+
+ARTICLE: "checksums" "Checksums"
+"A " { $emphasis "checksum" } " is a function mapping sequences of bytes to fixed-length strings. While checksums are not one-to-one, a good checksum should have a low probability of collision. Additionally, some checksum algorithms are designed to be hard to reverse, in the sense that finding an input string which hashes to a given checksum string requires a brute-force search."
+$nl
+"Checksums are instances of a class:"
+{ $subsection checksum }
+"Operations on checksums:"
+{ $subsection checksum-bytes }
+{ $subsection checksum-stream }
+{ $subsection checksum-lines }
+"Checksums should implement at least one of " { $link checksum-bytes } " and " { $link checksum-stream } ". Implementing " { $link checksum-lines } " is optional."
+$nl
+"Utilities:"
+{ $subsection checksum-file }
+{ $subsection hex-string }
+"Checksum implementations:"
+{ $subsection "checksums.crc32" }
+{ $vocab-subsection "MD5 checksum" "checksums.md5" }
+{ $vocab-subsection "SHA1 checksum" "checksums.sha1" }
+{ $vocab-subsection "SHA2 checksum" "checksums.sha2" } ;
diff --git a/core/checksums/checksums-tests.factor b/core/checksums/checksums-tests.factor
new file mode 100644 (file)
index 0000000..1ec675b
--- /dev/null
@@ -0,0 +1,7 @@
+IN: checksums.tests
+USING: checksums tools.test ;
+
+\ checksum-bytes must-infer
+\ checksum-stream must-infer
+\ checksum-lines must-infer
+\ checksum-file must-infer
diff --git a/core/checksums/checksums.factor b/core/checksums/checksums.factor
new file mode 100644 (file)
index 0000000..08a1329
--- /dev/null
@@ -0,0 +1,25 @@
+! Copyright (c) 2008 Slava Pestov
+! See http://factorcode.org/license.txt for BSD license.
+USING: sequences math.parser io io.streams.byte-array
+io.encodings.binary io.files kernel ;
+IN: checksums
+
+MIXIN: checksum
+
+GENERIC: checksum-bytes ( bytes checksum -- value )
+
+GENERIC: checksum-stream ( stream checksum -- value )
+
+GENERIC: checksum-lines ( lines checksum -- value )
+
+M: checksum checksum-bytes >r binary <byte-reader> r> checksum-stream ;
+
+M: checksum checksum-stream >r contents r> checksum-bytes ;
+
+M: checksum checksum-lines >r B{ CHAR: \n } join r> checksum-bytes ;
+
+: checksum-file ( path checksum -- value )
+    >r binary <file-reader> r> checksum-stream ;
+
+: hex-string ( seq -- str )
+    [ >hex 2 CHAR: 0 pad-left ] { } map-as concat ;
diff --git a/core/checksums/crc32/authors.txt b/core/checksums/crc32/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/core/checksums/crc32/crc32-docs.factor b/core/checksums/crc32/crc32-docs.factor
new file mode 100644 (file)
index 0000000..0f277bc
--- /dev/null
@@ -0,0 +1,11 @@
+USING: help.markup help.syntax math ;
+IN: checksums.crc32
+
+HELP: crc32
+{ $class-description "The CRC32 checksum algorithm." } ;
+
+ARTICLE: "checksums.crc32" "CRC32 checksum"
+"The CRC32 checksum algorithm provides a quick but unreliable way to detect changes in data."
+{ $subsection crc32 } ;
+
+ABOUT: "checksums.crc32"
diff --git a/core/checksums/crc32/crc32-tests.factor b/core/checksums/crc32/crc32-tests.factor
new file mode 100644 (file)
index 0000000..6fe4b99
--- /dev/null
@@ -0,0 +1,6 @@
+USING: checksums checksums.crc32 kernel math tools.test namespaces ;
+
+[ B{ 0 0 0 0 } ] [ "" crc32 checksum-bytes ] unit-test
+
+[ B{ HEX: cb HEX: f4 HEX: 39 HEX: 26 } ] [ "123456789" crc32 checksum-bytes ] unit-test
+
diff --git a/core/checksums/crc32/crc32.factor b/core/checksums/crc32/crc32.factor
new file mode 100755 (executable)
index 0000000..e1f0b94
--- /dev/null
@@ -0,0 +1,39 @@
+! Copyright (C) 2006 Doug Coleman
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel math sequences sequences.private namespaces
+words io io.binary io.files io.streams.string quotations
+definitions checksums ;
+IN: checksums.crc32
+
+: crc32-polynomial HEX: edb88320 ; inline
+
+: crc32-table V{ } ; inline
+
+256 [
+    8 [
+        dup even? >r 2/ r> [ crc32-polynomial bitxor ] unless
+    ] times >bignum
+] map 0 crc32-table copy
+
+: (crc32) ( crc ch -- crc )
+    >bignum dupd bitxor
+    mask-byte crc32-table nth-unsafe >bignum
+    swap -8 shift bitxor ; inline
+
+SINGLETON: crc32
+
+INSTANCE: crc32 checksum
+
+: init-crc32 drop >r HEX: ffffffff dup r> ; inline
+
+: finish-crc32 bitxor 4 >be ; inline
+
+M: crc32 checksum-bytes
+    init-crc32
+    [ (crc32) ] each
+    finish-crc32 ;
+
+M: crc32 checksum-lines
+    init-crc32
+    [ [ (crc32) ] each CHAR: \n (crc32) ] each
+    finish-crc32 ;
diff --git a/core/checksums/crc32/summary.txt b/core/checksums/crc32/summary.txt
new file mode 100644 (file)
index 0000000..041d7ff
--- /dev/null
@@ -0,0 +1 @@
+CRC32 checksum algorithm
index 87c72048f495ae70033b006dd26c0a73d443e8f3..810bdbe10fc23ae0c4eb26e0b5880182403e188f 100755 (executable)
@@ -1,14 +1,14 @@
-USING: help.markup help.syntax kernel classes ;\r
+USING: help.markup help.syntax kernel classes words\r
+checksums checksums.crc32 sequences math ;\r
 IN: classes.algebra\r
 \r
 ARTICLE: "class-operations" "Class operations"\r
 "Set-theoretic operations on classes:"\r
 { $subsection class< }\r
+{ $subsection class<= }\r
 { $subsection class-and }\r
 { $subsection class-or }\r
 { $subsection classes-intersect? }\r
-"Topological sort:"\r
-{ $subsection sort-classes }\r
 { $subsection min-class }\r
 "Low-level implementation detail:"\r
 { $subsection class-types }\r
@@ -17,6 +17,29 @@ ARTICLE: "class-operations" "Class operations"
 { $subsection class-types }\r
 { $subsection class-tags } ;\r
 \r
+ARTICLE: "class-linearization" "Class linearization"\r
+"Classes have an intrinsic partial order; given two classes A and B, we either have that A is a subset of B, B is a subset of A, A and B are equal as sets, or they are incomparable. The last two situations present difficulties for method dispatch:"\r
+{ $list\r
+    "If a generic word defines a method on a mixin class A and another class B, and B is the only instance of A, there is an ambiguity because A and B are equal as sets; any object that is an instance of one is an instance of both."\r
+    { "If a generic word defines methods on two union classes which are incomparable but not disjoint, for example " { $link sequence } " and " { $link number } ", there is an ambiguity because the generic word may be called on an object that is an instance of both unions." }\r
+}\r
+"The first ambiguity is resolved with a tie-breaker that compares metaclasses. The intrinsic meta-class order, from most-specific to least-specific:"\r
+{ $list\r
+    "Built-in classes and tuple classes"\r
+    "Predicate classes"\r
+    "Union classes"\r
+    "Mixin classes"\r
+}\r
+"This means that in the above example, the generic word with methods on a mixin and its sole instance will always call the method for the sole instance, since it is more specific than a mixin class."\r
+$nl\r
+"The second problem is resolved with another tie-breaker. When performing the topological sort of classes, if there are multiple candidates at any given step of the sort, lexicographical order on the class name is used."\r
+$nl\r
+"Operations:"\r
+{ $subsection class< }\r
+{ $subsection sort-classes }\r
+"Metaclass order:"\r
+{ $subsection rank-class } ;\r
+\r
 HELP: flatten-builtin-class\r
 { $values { "class" class } { "assoc" "an assoc whose keys are classes" } }\r
 { $description "Outputs a set of tuple classes whose union is the smallest cover of " { $snippet "class" } " intersected with " { $link tuple } "." } ;\r
@@ -29,14 +52,14 @@ HELP: class-types
 { $values { "class" class } { "seq" "an increasing sequence of integers" } }\r
 { $description "Outputs a sequence of builtin type numbers whose instances can possibly be instances of the given class." } ;\r
 \r
-HELP: class<\r
+HELP: class<=\r
 { $values { "first" "a class" } { "second" "a class" } { "?" "a boolean" } }\r
 { $description "Tests if all instances of " { $snippet "class1" } " are also instances of " { $snippet "class2" } "." }\r
 { $notes "Classes are partially ordered. This means that if " { $snippet "class1 <= class2" } " and " { $snippet "class2 <= class1" } ", then " { $snippet "class1 = class2" } ". Also, if " { $snippet "class1 <= class2" } " and " { $snippet "class2 <= class3" } ", then " { $snippet "class1 <= class3" } "." } ;\r
 \r
 HELP: sort-classes\r
 { $values { "seq" "a sequence of class" } { "newseq" "a new seqence of classes" } }\r
-{ $description "Outputs a topological sort of a sequence of classes. Larger classes come before their subclasses." } ;\r
+{ $description "Outputs a linear sort of a sequence of classes. Larger classes come before their subclasses." } ;\r
 \r
 HELP: class-or\r
 { $values { "first" class } { "second" class } { "class" class } }\r
index dba97c16f5b97d82e4e7d377564c9ab8b30b309f..dfe4a0fbc9753c70f5e0b15b47e2f714462347c5 100755 (executable)
@@ -4,9 +4,9 @@ kernel math namespaces parser prettyprint sequences strings
 tools.test vectors words quotations classes classes.algebra\r
 classes.private classes.union classes.mixin classes.predicate\r
 vectors definitions source-files compiler.units growable\r
-random inference effects kernel.private sbufs ;\r
+random inference effects kernel.private sbufs math.order ;\r
 \r
-: class= [ class< ] 2keep swap class< and ;\r
+: class= [ class<= ] [ swap class<= ] 2bi and ;\r
 \r
 : class-and* >r class-and r> class= ;\r
 \r
@@ -38,43 +38,43 @@ UNION: both first-one union-class ;
 \r
 [ f ] [ number vector class-and sequence classes-intersect? ] unit-test\r
 \r
-[ t ] [ \ fixnum \ integer class< ] unit-test\r
-[ t ] [ \ fixnum \ fixnum class< ] unit-test\r
-[ f ] [ \ integer \ fixnum class< ] unit-test\r
-[ t ] [ \ integer \ object class< ] unit-test\r
-[ f ] [ \ integer \ null class< ] unit-test\r
-[ t ] [ \ null \ object class< ] unit-test\r
+[ t ] [ \ fixnum \ integer class<= ] unit-test\r
+[ t ] [ \ fixnum \ fixnum class<= ] unit-test\r
+[ f ] [ \ integer \ fixnum class<= ] unit-test\r
+[ t ] [ \ integer \ object class<= ] unit-test\r
+[ f ] [ \ integer \ null class<= ] unit-test\r
+[ t ] [ \ null \ object class<= ] unit-test\r
 \r
-[ t ] [ \ generic \ word class< ] unit-test\r
-[ f ] [ \ word \ generic class< ] unit-test\r
+[ t ] [ \ generic \ word class<= ] unit-test\r
+[ f ] [ \ word \ generic class<= ] unit-test\r
 \r
-[ f ] [ \ reversed \ slice class< ] unit-test\r
-[ f ] [ \ slice \ reversed class< ] unit-test\r
+[ f ] [ \ reversed \ slice class<= ] unit-test\r
+[ f ] [ \ slice \ reversed class<= ] unit-test\r
 \r
 PREDICATE: no-docs < word "documentation" word-prop not ;\r
 \r
 UNION: no-docs-union no-docs integer ;\r
 \r
-[ t ] [ no-docs no-docs-union class< ] unit-test\r
-[ f ] [ no-docs-union no-docs class< ] unit-test\r
+[ t ] [ no-docs no-docs-union class<= ] unit-test\r
+[ f ] [ no-docs-union no-docs class<= ] unit-test\r
 \r
 TUPLE: a ;\r
 TUPLE: b ;\r
 UNION: c a b ;\r
 \r
-[ t ] [ \ c \ tuple class< ] unit-test\r
-[ f ] [ \ tuple \ c class< ] unit-test\r
+[ t ] [ \ c \ tuple class<= ] unit-test\r
+[ f ] [ \ tuple \ c class<= ] unit-test\r
 \r
-[ t ] [ \ tuple-class \ class class< ] unit-test\r
-[ f ] [ \ class \ tuple-class class< ] unit-test\r
+[ t ] [ \ tuple-class \ class class<= ] unit-test\r
+[ f ] [ \ class \ tuple-class class<= ] unit-test\r
 \r
 TUPLE: tuple-example ;\r
 \r
-[ t ] [ \ null \ tuple-example class< ] unit-test\r
-[ f ] [ \ object \ tuple-example class< ] unit-test\r
-[ f ] [ \ object \ tuple-example class< ] unit-test\r
-[ t ] [ \ tuple-example \ tuple class< ] unit-test\r
-[ f ] [ \ tuple \ tuple-example class< ] unit-test\r
+[ t ] [ \ null \ tuple-example class<= ] unit-test\r
+[ f ] [ \ object \ tuple-example class<= ] unit-test\r
+[ f ] [ \ object \ tuple-example class<= ] unit-test\r
+[ t ] [ \ tuple-example \ tuple class<= ] unit-test\r
+[ f ] [ \ tuple \ tuple-example class<= ] unit-test\r
 \r
 TUPLE: a1 ;\r
 TUPLE: b1 ;\r
@@ -84,57 +84,57 @@ UNION: x1 a1 b1 ;
 UNION: y1 a1 c1 ;\r
 UNION: z1 b1 c1 ;\r
 \r
-[ f ] [ z1 x1 y1 class-and class< ] unit-test\r
+[ f ] [ z1 x1 y1 class-and class<= ] unit-test\r
 \r
-[ t ] [ x1 y1 class-and a1 class< ] unit-test\r
+[ t ] [ x1 y1 class-and a1 class<= ] unit-test\r
 \r
 [ f ] [ y1 z1 class-and x1 classes-intersect? ] unit-test\r
 \r
-[ f ] [ b1 c1 class-or a1 b1 class-or a1 c1 class-and class-and class< ] unit-test\r
+[ f ] [ b1 c1 class-or a1 b1 class-or a1 c1 class-and class-and class<= ] unit-test\r
 \r
-[ t ] [ a1 b1 class-or a1 c1 class-or class-and a1 class< ] unit-test\r
+[ t ] [ a1 b1 class-or a1 c1 class-or class-and a1 class<= ] unit-test\r
 \r
 [ f ] [ a1 c1 class-or b1 c1 class-or class-and a1 b1 class-or classes-intersect? ] unit-test\r
 \r
 [ f ] [ growable \ hi-tag classes-intersect? ] unit-test\r
 \r
 [ t ] [\r
-    growable tuple sequence class-and class<\r
+    growable tuple sequence class-and class<=\r
 ] unit-test\r
 \r
 [ t ] [\r
-    growable assoc class-and tuple class<\r
+    growable assoc class-and tuple class<=\r
 ] unit-test\r
 \r
-[ t ] [ object \ f \ f class-not class-or class< ] unit-test\r
+[ t ] [ object \ f \ f class-not class-or class<= ] unit-test\r
 \r
 [ t ] [ fixnum class-not integer class-and bignum class= ] unit-test\r
 \r
 [ f ] [ integer integer class-not classes-intersect? ] unit-test\r
 \r
-[ t ] [ array number class-not class< ] unit-test\r
+[ t ] [ array number class-not class<= ] unit-test\r
 \r
-[ f ] [ bignum number class-not class< ] unit-test\r
+[ f ] [ bignum number class-not class<= ] unit-test\r
 \r
 [ vector ] [ vector class-not class-not ] unit-test\r
 \r
-[ t ] [ fixnum fixnum bignum class-or class< ] unit-test\r
+[ t ] [ fixnum fixnum bignum class-or class<= ] unit-test\r
 \r
-[ f ] [ fixnum class-not integer class-and array class< ] unit-test\r
+[ f ] [ fixnum class-not integer class-and array class<= ] unit-test\r
 \r
-[ f ] [ fixnum class-not integer class< ] unit-test\r
+[ f ] [ fixnum class-not integer class<= ] unit-test\r
 \r
-[ f ] [ number class-not array class< ] unit-test\r
+[ f ] [ number class-not array class<= ] unit-test\r
 \r
-[ f ] [ fixnum class-not array class< ] unit-test\r
+[ f ] [ fixnum class-not array class<= ] unit-test\r
 \r
-[ t ] [ number class-not integer class-not class< ] unit-test\r
+[ t ] [ number class-not integer class-not class<= ] unit-test\r
 \r
 [ t ] [ vector array class-not class-and vector class= ] unit-test\r
 \r
 [ f ] [ fixnum class-not number class-and array classes-intersect? ] unit-test\r
 \r
-[ f ] [ fixnum class-not integer class< ] unit-test\r
+[ f ] [ fixnum class-not integer class<= ] unit-test\r
 \r
 [ t ] [ null class-not object class= ] unit-test\r
 \r
@@ -147,7 +147,7 @@ UNION: z1 b1 c1 ;
 [ t ] [\r
     fixnum class-not\r
     fixnum fixnum class-not class-or\r
-    class<\r
+    class<=\r
 ] unit-test\r
 \r
 ! Test method inlining\r
@@ -241,3 +241,23 @@ UNION: z1 b1 c1 ;
         =\r
     ] unit-test\r
 ] times\r
+\r
+SINGLETON: xxx\r
+UNION: yyy xxx ;\r
+\r
+[ { yyy xxx } ] [ { xxx yyy } sort-classes ] unit-test\r
+[ { yyy xxx } ] [ { yyy xxx } sort-classes ] unit-test\r
+\r
+[ { number ratio integer } ] [ { ratio number integer } sort-classes ] unit-test\r
+[ { sequence number ratio } ] [ { ratio number sequence } sort-classes ] unit-test\r
+\r
+TUPLE: xa ;\r
+TUPLE: xb ;\r
+TUPLE: xc < xa ;\r
+TUPLE: xd < xb ;\r
+TUPLE: xe ;\r
+TUPLE: xf < xb ;\r
+TUPLE: xg < xb ;\r
+TUPLE: xh < xb ;\r
+\r
+[ t ] [ { xa xb xc xd xe xf xg xh } sort-classes dup sort-classes = ] unit-test\r
index f2941e3cefbf531856938e88bfc3d844cdbcd0ba..4160f4e9d2f0ac232c14c640723fcf8bc952a1a2 100755 (executable)
@@ -2,16 +2,16 @@
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: kernel classes classes.builtin combinators accessors\r
 sequences arrays vectors assocs namespaces words sorting layouts\r
-math hashtables kernel.private sets ;\r
+math hashtables kernel.private sets math.order ;\r
 IN: classes.algebra\r
 \r
 : 2cache ( key1 key2 assoc quot -- value )\r
     >r >r 2array r> [ first2 ] r> compose cache ; inline\r
 \r
-DEFER: (class<)\r
+DEFER: (class<=)\r
 \r
-: class< ( first second -- ? )\r
-    class<-cache get [ (class<) ] 2cache ;\r
+: class<= ( first second -- ? )\r
+    class<=-cache get [ (class<=) ] 2cache ;\r
 \r
 DEFER: (class-not)\r
 \r
@@ -45,31 +45,31 @@ TUPLE: anonymous-complement class ;
 \r
 C: <anonymous-complement> anonymous-complement\r
 \r
-: superclass< ( first second -- ? )\r
-    >r superclass r> class< ;\r
+: superclass<= ( first second -- ? )\r
+    >r superclass r> class<= ;\r
 \r
-: left-union-class< ( first second -- ? )\r
-    >r members r> [ class< ] curry all? ;\r
+: left-union-class<= ( first second -- ? )\r
+    >r members r> [ class<= ] curry all? ;\r
 \r
-: right-union-class< ( first second -- ? )\r
-    members [ class< ] with contains? ;\r
+: right-union-class<= ( first second -- ? )\r
+    members [ class<= ] with contains? ;\r
 \r
 : left-anonymous-union< ( first second -- ? )\r
-    >r members>> r> [ class< ] curry all? ;\r
+    >r members>> r> [ class<= ] curry all? ;\r
 \r
 : right-anonymous-union< ( first second -- ? )\r
-    members>> [ class< ] with contains? ;\r
+    members>> [ class<= ] with contains? ;\r
 \r
 : left-anonymous-intersection< ( first second -- ? )\r
-    >r members>> r> [ class< ] curry contains? ;\r
+    >r members>> r> [ class<= ] curry contains? ;\r
 \r
 : right-anonymous-intersection< ( first second -- ? )\r
-    members>> [ class< ] with all? ;\r
+    members>> [ class<= ] with all? ;\r
 \r
 : anonymous-complement< ( first second -- ? )\r
-    [ class>> ] bi@ swap class< ;\r
+    [ class>> ] bi@ swap class<= ;\r
 \r
-: (class<) ( first second -- -1/0/1 )  \r
+: (class<=) ( first second -- -1/0/1 )  \r
     {\r
         { [ 2dup eq? ] [ 2drop t ] }\r
         { [ dup object eq? ] [ 2drop t ] }\r
@@ -77,13 +77,13 @@ C: <anonymous-complement> anonymous-complement
         { [ 2dup [ anonymous-complement? ] both? ] [ anonymous-complement< ] }\r
         { [ over anonymous-union? ] [ left-anonymous-union< ] }\r
         { [ over anonymous-intersection? ] [ left-anonymous-intersection< ] }\r
-        { [ over members ] [ left-union-class< ] }\r
+        { [ over members ] [ left-union-class<= ] }\r
         { [ dup anonymous-union? ] [ right-anonymous-union< ] }\r
         { [ dup anonymous-intersection? ] [ right-anonymous-intersection< ] }\r
         { [ over anonymous-complement? ] [ 2drop f ] }\r
         { [ dup anonymous-complement? ] [ class>> classes-intersect? not ] }\r
-        { [ dup members ] [ right-union-class< ] }\r
-        { [ over superclass ] [ superclass< ] }\r
+        { [ dup members ] [ right-union-class<= ] }\r
+        { [ over superclass ] [ superclass<= ] }\r
         [ 2drop f ]\r
     } cond ;\r
 \r
@@ -94,7 +94,7 @@ C: <anonymous-complement> anonymous-complement
     members>> [ classes-intersect? ] with all? ;\r
 \r
 : anonymous-complement-intersect? ( first second -- ? )\r
-    class>> class< not ;\r
+    class>> class<= not ;\r
 \r
 : union-class-intersect? ( first second -- ? )\r
     members [ classes-intersect? ] with contains? ;\r
@@ -103,7 +103,7 @@ C: <anonymous-complement> anonymous-complement
     {\r
         { [ over tuple eq? ] [ 2drop t ] }\r
         { [ over builtin-class? ] [ 2drop f ] }\r
-        { [ over tuple-class? ] [ [ class< ] [ swap class< ] 2bi or ] }\r
+        { [ over tuple-class? ] [ [ class<= ] [ swap class<= ] 2bi or ] }\r
         [ swap classes-intersect? ]\r
     } cond ;\r
 \r
@@ -145,8 +145,8 @@ C: <anonymous-complement> anonymous-complement
 \r
 : (class-and) ( first second -- class )\r
     {\r
-        { [ 2dup class< ] [ drop ] }\r
-        { [ 2dup swap class< ] [ nip ] }\r
+        { [ 2dup class<= ] [ drop ] }\r
+        { [ 2dup swap class<= ] [ nip ] }\r
         { [ 2dup classes-intersect? not ] [ 2drop null ] }\r
         { [ dup members ] [ right-union-and ] }\r
         { [ dup anonymous-union? ] [ right-anonymous-union-and ] }\r
@@ -165,8 +165,8 @@ C: <anonymous-complement> anonymous-complement
 \r
 : (class-or) ( first second -- class )\r
     {\r
-        { [ 2dup class< ] [ nip ] }\r
-        { [ 2dup swap class< ] [ drop ] }\r
+        { [ 2dup class<= ] [ nip ] }\r
+        { [ 2dup swap class<= ] [ drop ] }\r
         { [ dup anonymous-union? ] [ right-anonymous-union-or ] }\r
         { [ over anonymous-union? ] [ left-anonymous-union-or ] }\r
         [ 2array <anonymous-union> ]\r
@@ -180,22 +180,27 @@ C: <anonymous-complement> anonymous-complement
         [ <anonymous-complement> ]\r
     } cond ;\r
 \r
+: class< ( first second -- ? )\r
+    {\r
+        { [ 2dup class<= not ] [ 2drop f ] }\r
+        { [ 2dup swap class<= not ] [ 2drop t ] }\r
+        [ [ rank-class ] bi@ < ]\r
+    } cond ;\r
+\r
 : largest-class ( seq -- n elt )\r
-    dup [\r
-        [ 2dup class< >r swap class< not r> and ]\r
-        with subset empty?\r
-    ] curry find [ "Topological sort failed" throw ] unless* ;\r
+    dup [ [ class< ] with contains? not ] curry find-last\r
+    [ "Topological sort failed" throw ] unless* ;\r
 \r
 : sort-classes ( seq -- newseq )\r
-    >vector\r
+    [ [ word-name ] compare ] sort >vector\r
     [ dup empty? not ]\r
     [ dup largest-class >r over delete-nth r> ]\r
     [ ] unfold nip ;\r
 \r
 : min-class ( class seq -- class/f )\r
-    over [ classes-intersect? ] curry subset\r
+    over [ classes-intersect? ] curry filter\r
     dup empty? [ 2drop f ] [\r
-        tuck [ class< ] with all? [ peek ] [ drop f ] if\r
+        tuck [ class<= ] with all? [ peek ] [ drop f ] if\r
     ] if ;\r
 \r
 : (flatten-class) ( class -- )\r
@@ -212,7 +217,7 @@ C: <anonymous-complement> anonymous-complement
 \r
 : flatten-builtin-class ( class -- assoc )\r
     flatten-class [\r
-        dup tuple class< [ 2drop tuple tuple ] when\r
+        dup tuple class<= [ 2drop tuple tuple ] when\r
     ] assoc-map ;\r
 \r
 : class-types ( class -- seq )\r
index 1c2871b03182751f33b22b7211ba3323f2e96660..8e992b852e942dc1c2bdf5e7d03dfc08955e8063 100644 (file)
@@ -16,3 +16,5 @@ PREDICATE: builtin-class < class
 M: hi-tag class hi-tag type>class ;
 
 M: object class tag type>class ;
+
+M: builtin-class rank-class drop 0 ;
index dd3782e877f80295c58f2589f6496716a434c007..744944c2817b1d6f48aa2fe88eb2272942e3e416 100755 (executable)
@@ -47,6 +47,7 @@ $nl
 $nl
 "Classes can be inspected and operated upon:"
 { $subsection "class-operations" }
+{ $subsection "class-linearization" }
 { $see-also "class-index" } ;
 
 ABOUT: "classes"
@@ -55,7 +56,7 @@ HELP: class
 { $values { "object" object } { "class" class } }
 { $description "Outputs an object's canonical class. While an object may be an instance of more than one class, the canonical class is either its built-in class, or if the object is a tuple, its tuple class." }
 { $class-description "The class of all class words." }
-{ $examples { $example "USING: classes prettyprint ;" "1.0 class ." "float" } { $example "USING: classes prettyprint ;" "TUPLE: point x y z ;\nT{ point f 1 2 3 } class ." "point" } } ;
+{ $examples { $example "USING: classes prettyprint ;" "1.0 class ." "float" } { $example "USING: classes prettyprint ;" "IN: scratchpad" "TUPLE: point x y z ;\nT{ point f 1 2 3 } class ." "point" } } ;
 
 HELP: classes
 { $values { "seq" "a sequence of class words" } }
@@ -63,7 +64,7 @@ HELP: classes
 
 HELP: tuple-class
 { $class-description "The class of tuple class words." }
-{ $examples { $example "USING: classes prettyprint ;" "TUPLE: name title first last ;" "name tuple-class? ." "t" } } ;
+{ $examples { $example "USING: classes prettyprint ;" "IN: scratchpad" "TUPLE: name title first last ;" "name tuple-class? ." "t" } } ;
 
 HELP: update-map
 { $var-description "Hashtable mapping each class to a set of classes defined in terms of this class. The " { $link define-class } " word uses this information to update generic words when classes are redefined." } ;
index ae19f38d14f97159b40c274d045c7e6d05291d50..bb9fbd0167a03e4a72a6b5e2201d843f0b55b164 100755 (executable)
@@ -18,14 +18,14 @@ GENERIC: generic-update-test ( x -- y )
 
 M: union-1 generic-update-test drop "union-1" ;
 
-[ f ] [ bignum union-1 class< ] unit-test
-[ t ] [ union-1 number class< ] unit-test
+[ f ] [ bignum union-1 class<= ] unit-test
+[ t ] [ union-1 number class<= ] unit-test
 [ "union-1" ] [ 1.0 generic-update-test ] unit-test
 
 "IN: classes.tests USE: math USE: arrays UNION: union-1 rational array ;" eval
 
-[ t ] [ bignum union-1 class< ] unit-test
-[ f ] [ union-1 number class< ] unit-test
+[ t ] [ bignum union-1 class<= ] unit-test
+[ f ] [ union-1 number class<= ] unit-test
 [ "union-1" ] [ { 1.0 } generic-update-test ] unit-test
 
 "IN: classes.tests USE: math PREDICATE: union-1 < integer even? ;" eval
@@ -52,7 +52,7 @@ M: sequence-mixin collection-size length ;
 
 M: assoc-mixin collection-size assoc-size ;
 
-[ t ] [ array sequence-mixin class< ] unit-test
+[ t ] [ array sequence-mixin class<= ] unit-test
 [ t ] [ { 1 2 3 } sequence-mixin? ] unit-test
 [ 3 ] [ { 1 2 3 } collection-size ] unit-test
 [ f ] [ H{ { 1 2 } { 2 3 } } sequence-mixin? ] unit-test
@@ -67,14 +67,14 @@ MIXIN: mx1
 
 INSTANCE: integer mx1
 
-[ t ] [ integer mx1 class< ] unit-test
-[ t ] [ mx1 integer class< ] unit-test
-[ t ] [ mx1 number class< ] unit-test
+[ t ] [ integer mx1 class<= ] unit-test
+[ t ] [ mx1 integer class<= ] unit-test
+[ t ] [ mx1 number class<= ] unit-test
 
 "IN: classes.tests USE: arrays INSTANCE: array mx1" eval
 
-[ t ] [ array mx1 class< ] unit-test
-[ f ] [ mx1 number class< ] unit-test
+[ t ] [ array mx1 class<= ] unit-test
+[ f ] [ mx1 number class<= ] unit-test
 
 [ \ mx1 forget ] with-compilation-unit
 
@@ -94,14 +94,14 @@ UNION: redefine-bug-1 fixnum ;
 
 UNION: redefine-bug-2 redefine-bug-1 quotation ;
 
-[ t ] [ fixnum redefine-bug-2 class< ] unit-test
-[ t ] [ quotation redefine-bug-2 class< ] unit-test
+[ t ] [ fixnum redefine-bug-2 class<= ] unit-test
+[ t ] [ quotation redefine-bug-2 class<= ] unit-test
 
 [ ] [ "IN: classes.tests USE: math UNION: redefine-bug-1 bignum ;" eval ] unit-test
 
-[ t ] [ bignum redefine-bug-1 class< ] unit-test
-[ f ] [ fixnum redefine-bug-2 class< ] unit-test
-[ t ] [ bignum redefine-bug-2 class< ] unit-test
+[ t ] [ bignum redefine-bug-1 class<= ] unit-test
+[ f ] [ fixnum redefine-bug-2 class<= ] unit-test
+[ t ] [ bignum redefine-bug-2 class<= ] unit-test
 
 USE: io.streams.string
 
index 4f43b86f641c7cfd83bb537d083f859e38c52ad7..594b2005b8a332cea7d73d5650b6050ceebe204a 100755 (executable)
@@ -5,21 +5,21 @@ slots.private namespaces sequences strings words vectors math
 quotations combinators sorting effects graphs vocabs ;
 IN: classes
 
-SYMBOL: class<-cache
+SYMBOL: class<=-cache
 SYMBOL: class-not-cache
 SYMBOL: classes-intersect-cache
 SYMBOL: class-and-cache
 SYMBOL: class-or-cache
 
 : init-caches ( -- )
-    H{ } clone class<-cache set
+    H{ } clone class<=-cache set
     H{ } clone class-not-cache set
     H{ } clone classes-intersect-cache set
     H{ } clone class-and-cache set
     H{ } clone class-or-cache set ;
 
 : reset-caches ( -- )
-    class<-cache get clear-assoc
+    class<=-cache get clear-assoc
     class-not-cache get clear-assoc
     classes-intersect-cache get clear-assoc
     class-and-cache get clear-assoc
@@ -33,7 +33,7 @@ PREDICATE: class < word
 PREDICATE: tuple-class < class
     "metaclass" word-prop tuple-class eq? ;
 
-: classes ( -- seq ) all-words [ class? ] subset ;
+: classes ( -- seq ) all-words [ class? ] filter ;
 
 : predicate-word ( word -- predicate )
     [ word-name "?" append ] keep word-vocabulary create ;
@@ -57,6 +57,8 @@ PREDICATE: predicate < word "predicating" word-prop >boolean ;
     #! Output f for non-classes to work with algebra code
     dup class? [ "members" word-prop ] [ drop f ] if ;
 
+GENERIC: rank-class ( class -- n )
+
 GENERIC: reset-class ( class -- )
 
 M: word reset-class drop ;
index 33b0fc32fab1443cf88f2763dcfe77734765bc1c..6f888ceca167a6b91751ffb1a23f5757f55361a8 100755 (executable)
@@ -9,6 +9,8 @@ PREDICATE: mixin-class < union-class "mixin" word-prop ;
 M: mixin-class reset-class
     { "class" "metaclass" "members" "mixin" } reset-props ;
 
+M: mixin-class rank-class drop 3 ;
+
 : redefine-mixin-class ( class members -- )
     dupd define-union-class
     t "mixin" set-word-prop ;
@@ -31,7 +33,7 @@ TUPLE: check-mixin-class mixin ;
     >r >r check-mixin-class 2dup members memq? r> r> if ; inline
 
 : change-mixin-class ( class mixin quot -- )
-    [ members swap bootstrap-word ] swap compose keep
+    [ members swap bootstrap-word ] prepose keep
     swap redefine-mixin-class ; inline
 
 : add-mixin-instance ( class mixin -- )
index 4729a6dd5ea4396b8770bed2cddcf225f6b9fbee..4e4d1701e49bb0f283319d9556372cbbd873da32 100755 (executable)
@@ -30,3 +30,5 @@ M: predicate-class reset-class
         "predicate-definition"
         "superclass"
     } reset-props ;
+
+M: predicate-class rank-class drop 1 ;
index a8dae809ec085242e58c5ecd777451d84a8a0378..f647b006d97524cceb3549ba4575731dcf7b8fac 100644 (file)
@@ -18,7 +18,7 @@ HELP: SINGLETON:
     "Defines a new singleton class. The class word itself is the sole instance of the singleton class."
 }
 { $examples
-    { $example "USING: classes.singleton kernel io ;" "SINGLETON: foo\nGENERIC: bar ( obj -- )\nM: foo bar drop \"a foo!\" print ;\nfoo bar" "a foo!" }
+    { $example "USING: classes.singleton kernel io ;" "IN: scratchpad" "SINGLETON: foo\nGENERIC: bar ( obj -- )\nM: foo bar drop \"a foo!\" print ;\nfoo bar" "a foo!" }
 } ;
 
 HELP: define-singleton-class
index cdfdee97178db44e8cd102ab2ebe5ddab8114c45..9f8ce8324074f94dd97cf3fc994a4f1a207c16bf 100755 (executable)
@@ -341,6 +341,7 @@ HELP: new
 { $examples
     { $example
         "USING: kernel prettyprint ;"
+        "IN: scratchpad"
         "TUPLE: employee number name department ;"
         "employee new ."
         "T{ employee f f f f }"
index 2932187152d4a3f20536b5ef6bccb3e069738e3e..fb9530b1c541ffc639e4044092efc0e2aae10e83 100755 (executable)
@@ -4,7 +4,7 @@ namespaces quotations sequences.private classes continuations
 generic.standard effects classes.tuple classes.tuple.private
 arrays vectors strings compiler.units accessors classes.algebra
 calendar prettyprint io.streams.string splitting inspector
-columns ;
+columns math.order ;
 IN: classes.tuple.tests
 
 TUPLE: rect x y w h ;
@@ -88,7 +88,7 @@ C: <empty> empty
 [ t length ] [ object>> t eq? ] must-fail-with
 
 [ "<constructor-test>" ]
-[ "TUPLE: constructor-test ; C: <constructor-test> constructor-test" eval word word-name ] unit-test
+[ "IN: classes.tuple.test TUPLE: constructor-test ; C: <constructor-test> constructor-test" eval word word-name ] unit-test
 
 TUPLE: size-test a b c d ;
 
@@ -233,8 +233,8 @@ TUPLE: laptop < computer battery ;
 C: <laptop> laptop
 
 [ t ] [ laptop tuple-class? ] unit-test
-[ t ] [ laptop tuple class< ] unit-test
-[ t ] [ laptop computer class< ] unit-test
+[ t ] [ laptop tuple class<= ] unit-test
+[ t ] [ laptop computer class<= ] unit-test
 [ t ] [ laptop computer classes-intersect? ] unit-test
 
 [ ] [ "Pentium" 128 3 hours <laptop> "laptop" set ] unit-test
@@ -266,8 +266,8 @@ TUPLE: server < computer rackmount ;
 C: <server> server
 
 [ t ] [ server tuple-class? ] unit-test
-[ t ] [ server tuple class< ] unit-test
-[ t ] [ server computer class< ] unit-test
+[ t ] [ server tuple class<= ] unit-test
+[ t ] [ server computer class<= ] unit-test
 [ t ] [ server computer classes-intersect? ] unit-test
 
 [ ] [ "PowerPC" 64 "1U" <server> "server" set ] unit-test
@@ -286,8 +286,8 @@ test-server-slot-values
 [ f ] [ "server" get laptop? ] unit-test
 [ f ] [ "laptop" get server? ] unit-test
 
-[ f ] [ server laptop class< ] unit-test
-[ f ] [ laptop server class< ] unit-test
+[ f ] [ server laptop class<= ] unit-test
+[ f ] [ laptop server class<= ] unit-test
 [ f ] [ laptop server classes-intersect? ] unit-test
 
 [ f ] [ 1 2 <computer> laptop? ] unit-test
@@ -306,9 +306,9 @@ TUPLE: electronic-device ;
 
 [ ] [ "IN: classes.tuple.tests TUPLE: computer < electronic-device cpu ram ;" eval ] unit-test
 
-[ f ] [ electronic-device laptop class< ] unit-test
-[ t ] [ server electronic-device class< ] unit-test
-[ t ] [ laptop server class-or electronic-device class< ] unit-test
+[ f ] [ electronic-device laptop class<= ] unit-test
+[ t ] [ server electronic-device class<= ] unit-test
+[ t ] [ laptop server class-or electronic-device class<= ] unit-test
 
 [ t ] [ "laptop" get electronic-device? ] unit-test
 [ t ] [ "laptop" get computer? ] unit-test
@@ -542,3 +542,15 @@ TUPLE: another-forget-accessors-test ;
 
 ! Missing error check
 [ "IN: tuples.test USE: words TUPLE: wrong-superclass < word ;" eval ] must-fail
+
+TUPLE: subclass-forget-test ;
+
+TUPLE: subclass-forget-test-1 < subclass-forget-test ;
+TUPLE: subclass-forget-test-2 < subclass-forget-test ;
+TUPLE: subclass-forget-test-3 < subclass-forget-test-2 ;
+
+[ ] [ "IN: classes.tuple.tests FORGET: subclass-forget-test" eval ] unit-test
+
+[ f ] [ subclass-forget-test-1 tuple-class? ] unit-test
+[ f ] [ subclass-forget-test-2 tuple-class? ] unit-test
+[ subclass-forget-test-3 new ] must-fail
index c14205e1d998f4c6e133b9aa532dca7b4064857f..5ebcc7a2862b5c93855a765fd7ee550501a7e192 100755 (executable)
@@ -102,7 +102,7 @@ ERROR: bad-superclass class ;
     dup tuple-predicate-quot define-predicate ;
 
 : superclass-size ( class -- n )
-    superclasses 1 head-slice*
+    superclasses but-last-slice
     [ slot-names length ] map sum ;
 
 : generate-tuple-slots ( class slots -- slot-specs )
@@ -166,7 +166,7 @@ M: tuple-class update-class
     3tri ;
 
 : subclasses ( class -- classes )
-    class-usages keys [ tuple-class? ] subset ;
+    class-usages keys [ tuple-class? ] filter ;
 
 : each-subclass ( class quot -- )
     >r subclasses r> each ; inline
@@ -226,6 +226,8 @@ M: tuple-class reset-class
         } reset-props
     ] bi ;
 
+M: tuple-class rank-class drop 0 ;
+
 M: tuple clone
     (clone) dup delegate clone over set-delegate ;
 
index 09f8f88cedaa8810b61ae339544c9e105aa75c36..760844afb9d6166776ad2e8810ec953bdeeb4a13 100755 (executable)
@@ -30,3 +30,5 @@ M: union-class update-class define-union-predicate ;
 
 M: union-class reset-class
     { "class" "metaclass" "members" } reset-props ;
+
+M: union-class rank-class drop 2 ;
index 54c62c44fa83f16579d7657806c4e3ad6edd2530..61752ac7d669208d6e3a76e34634fe78a20b9aa2 100755 (executable)
@@ -95,7 +95,7 @@ HELP: case
     "If there is no case matching " { $snippet "obj" } ", the default case is taken. If the last element of " { $snippet "cases" } " is a quotation, the quotation is called with " { $snippet "obj" } " on the stack. Otherwise, a " { $link no-cond } " error is rasied."
     $nl
     "The following two phrases are equivalent:"
-    { $code "{ { X [ Y ] } { Y [ T ] } } case" }
+    { $code "{ { X [ Y ] } { Z [ T ] } } case" }
     { $code "dup X = [ drop Y ] [ dup Z = [ drop T ] [ no-case ] if ] if" }
 }
 { $examples
index e3d0f8868052ff98d490a13c79145357d4f620c2..d33edfab3048c5dc7cd8825aff9b846d95d89181 100755 (executable)
@@ -1,9 +1,9 @@
 ! Copyright (C) 2006, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: combinators
 USING: arrays sequences sequences.private math.private
 kernel kernel.private math assocs quotations vectors
-hashtables sorting words sets ;
+hashtables sorting words sets math.order ;
+IN: combinators
 
 : cleave ( x seq -- )
     [ call ] with each ;
@@ -150,7 +150,7 @@ M: hashtable hashcode*
         drop
     ] [
         dup length 4 <=
-        over keys [ word? ] contains? or
+        over keys [ [ word? ] [ wrapper? ] bi or ] contains? or
         [
             linear-case-quot
         ] [
index 246bf2dabe35faba177dfe66cf684b1dc4ab8a26..84020abca0e5e99ec01ae06395d6438da0af3cd4 100644 (file)
@@ -1,9 +1,9 @@
 ! Copyright (C) 2003, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: command-line
 USING: init continuations debugger hashtables io kernel
 kernel.private namespaces parser sequences strings system
 splitting io.files ;
+IN: command-line
 
 : run-bootstrap-init ( -- )
     "user-init" get [
@@ -54,7 +54,7 @@ SYMBOL: main-vocab-hook
     "none" "run" set-global ;
 
 : parse-command-line ( -- )
-    cli-args [ cli-arg ] subset
+    cli-args [ cli-arg ] filter
     "script" get [ script-mode ] when
     ignore-cli-args? [ drop ] [ [ run-file ] each ] if
     "e" get [ eval ] when* ;
index 806ea914bb7dc4eb1b923f3cb42b7d98abfe3e85..ef00e94dd52070d052bb3bb2618844f2b15238a1 100755 (executable)
@@ -4,38 +4,55 @@ USING: kernel namespaces arrays sequences io inference.backend
 inference.state generator debugger words compiler.units
 continuations vocabs assocs alien.compiler dlists optimizer
 definitions math compiler.errors threads graphs generic
-inference ;
+inference combinators ;
 IN: compiler
 
 : ripple-up ( word -- )
     compiled-usage [ drop queue-compile ] assoc-each ;
 
 : save-effect ( word effect -- )
-    over "compiled-uses" word-prop [
-        2dup swap "compiled-effect" word-prop =
-        [ over ripple-up ] unless
-    ] when
-    "compiled-effect" set-word-prop ;
+    [
+        over "compiled-effect" word-prop = [
+            dup "compiled-uses" word-prop
+            [ dup ripple-up ] when
+        ] unless drop
+    ]
+    [ "compiled-effect" set-word-prop ] 2bi ;
 
-: finish-compile ( word effect dependencies -- )
-    >r dupd save-effect r>
-    over compiled-unxref
-    over compiled-crossref? [ compiled-xref ] [ 2drop ] if ;
+: compile-begins ( word -- )
+    f swap compiler-error ;
 
-: compile-succeeded ( word -- effect dependencies )
+: compile-failed ( word error -- )
+    [ swap compiler-error ]
     [
-        [ word-dataflow optimize ] keep dup generate
-    ] computing-dependencies ;
+        drop
+        [ f swap compiled get set-at ]
+        [ f save-effect ]
+        bi
+    ] 2bi ;
 
-: compile-failed ( word error -- )
-    f pick compiled get set-at
-    swap compiler-error ;
+: compile-succeeded ( effect word -- )
+    [ swap save-effect ]
+    [ compiled-unxref ]
+    [
+        dup compiled-crossref?
+        [ dependencies get compiled-xref ] [ drop ] if
+    ] tri ;
 
 : (compile) ( word -- )
-    f over compiler-error
-    [ dup compile-succeeded finish-compile ]
-    [ dupd compile-failed f save-effect ]
-    recover ;
+    [
+        H{ } clone dependencies set
+
+        {
+            [ compile-begins ]
+            [
+                [ word-dataflow ] [ compile-failed return ] recover
+                optimize
+            ]
+            [ dup generate ]
+            [ compile-succeeded ]
+        } cleave
+    ] curry with-return ;
 
 : compile-loop ( assoc -- )
     dup assoc-empty? [ drop ] [
index dd71eb704f49cb2e08760efe853e41365ed8961f..d86587662bd6732f4b0b6798ba3ab41619874955 100755 (executable)
@@ -21,19 +21,19 @@ HELP: compiler-error
 
 HELP: compiler-error.
 { $values { "error" "an error" } { "word" word } }
-{ $description "Prints a compiler error to the " { $link stdio } " stream." } ;
+{ $description "Prints a compiler error to " { $link output-stream } "." } ;
 
 HELP: compiler-errors.
 { $values { "type" symbol } }
-{ $description "Prints compiler errors to the " { $link stdio } " stream. The type parameter is one of " { $link +error+ } ", " { $link +warning+ } ", or " { $link +linkage+ } "." } ;
+{ $description "Prints compiler errors to " { $link output-stream } ". The type parameter is one of " { $link +error+ } ", " { $link +warning+ } ", or " { $link +linkage+ } "." } ;
 HELP: :errors
-{ $description "Prints all serious compiler errors from the most recent compile to the " { $link stdio } " stream." } ;
+{ $description "Prints all serious compiler errors from the most recent compile to " { $link output-stream } "." } ;
 
 HELP: :warnings
-{ $description "Prints all ignorable compiler warnings from the most recent compile to the " { $link stdio } " stream." } ;
+{ $description "Prints all ignorable compiler warnings from the most recent compile to " { $link output-stream } "." } ;
 
 HELP: :linkage
-{ $description "Prints all C library interface linkage errors from the most recent compile to the " { $link stdio } " stream." } ;
+{ $description "Prints all C library interface linkage errors from the most recent compile to " { $link output-stream } "." } ;
 
 { :errors :warnings } related-words
 
index b7b599e5a9e74e26874c595bd5bf6f653c7309aa..e7dc5156e468f5d4c9aa3f68128c9822e1c14eb8 100755 (executable)
@@ -27,7 +27,7 @@ SYMBOL: with-compiler-errors?
 : errors-of-type ( type -- assoc )
     compiler-errors get-global
     swap [ >r nip compiler-error-type r> eq? ] curry
-    assoc-subset ;
+    assoc-filter ;
 
 : compiler-errors. ( type -- )
     errors-of-type >alist sort-keys
index 7d473871fe83629159f0cac921e9849e171c567f..6fb6afe0c607e17e76a2aa1e675b70bde4a3fa7b 100755 (executable)
@@ -1,11 +1,11 @@
-IN: compiler.tests
 USING: arrays compiler.units kernel kernel.private math
 math.constants math.private sequences strings tools.test words
 continuations sequences.private hashtables.private byte-arrays
 strings.private system random layouts vectors.private
-sbufs.private strings.private slots.private alien
+sbufs.private strings.private slots.private alien math.order
 alien.accessors alien.c-types alien.syntax alien.strings
 namespaces libc sequences.private io.encodings.ascii ;
+IN: compiler.tests
 
 ! Make sure that intrinsic ops compile to correct code.
 [ ] [ 1 [ drop ] compile-call ] unit-test
index f54ac622045b0ae6954a9bfaea3a1ca3cc4de147..9ee774d81d59e59691bb3d52b5d2e0030da828fb 100755 (executable)
@@ -13,11 +13,11 @@ words splitting sorting ;
 [ baz ] [ 3 = ] must-fail-with
 [ t ] [
     symbolic-stack-trace
-    [ word? ] subset
+    [ word? ] filter
     { baz bar foo throw } tail?
 ] unit-test
 
-: bleh [ 3 + ] map [ 0 > ] subset ;
+: bleh [ 3 + ] map [ 0 > ] filter ;
 
 : stack-trace-contains? symbolic-stack-trace memq? ;
 
index 65e57a8912f83f036cd2509861143bffabb33c43..a31cd8de165e296c6da1284c0bb94521e1945577 100755 (executable)
@@ -53,7 +53,7 @@ GENERIC: definitions-changed ( assoc obj -- )
     [ definitions-changed ] with each ;
 
 : changed-vocabs ( assoc -- vocabs )
-    [ drop word? ] assoc-subset
+    [ drop word? ] assoc-filter
     [ drop word-vocabulary dup [ vocab ] when dup ] assoc-map ;
 
 : updated-definitions ( -- assoc )
@@ -73,7 +73,7 @@ SYMBOL: outdated-tuples
 SYMBOL: update-tuples-hook
 
 : call-recompile-hook ( -- )
-    changed-definitions get keys [ word? ] subset
+    changed-definitions get keys [ word? ] filter
     compiled-usages recompile-hook get call ;
 
 : call-update-tuples-hook ( -- )
index b1db09b6bcf28e4059c8a9112468383b9ae29f9c..472136da8ecff0e90bdf2a569ac4914dc527a4d1 100755 (executable)
@@ -34,7 +34,7 @@ $nl
 { $code
     "<external-resource> ... do stuff ... dispose"
 }
-"The reason being that if " { $snippet "do stuff" } " throws an error, the resource will not be disposed of. The most important case where this can occur is with I/O streams, and the correct solution is to always use " { $link with-stream } "; see " { $link "stdio" } " for details." ;
+"The reason being that if " { $snippet "do stuff" } " throws an error, the resource will not be disposed of. The most important case where this can occur is with I/O streams, and the correct solution is to always use " { $link with-input-stream } " and " { $link with-output-stream } "; see " { $link "stdio" } " for details." ;
 
 ARTICLE: "errors" "Error handling"
 "Support for handling exceptional situations such as bad user input, implementation bugs, and input/output errors is provided by a set of words built using continuations."
index 8b396763e108e71839d93d2c905ce938f9dab52b..28581820fd4666e3554ea97cf951d1409e347898 100755 (executable)
@@ -1,6 +1,6 @@
 USING: kernel math namespaces io tools.test sequences vectors
 continuations debugger parser memory arrays words
-kernel.private ;
+kernel.private accessors ;
 IN: continuations.tests
 
 : (callcc1-test)
@@ -39,7 +39,7 @@ IN: continuations.tests
 
 "!!! The following error is part of the test" print
 
-[ ] [ [ [ "2 car" ] eval ] [ print-error ] recover ] unit-test
+[ ] [ [ [ "2 car" ] eval ] try ] unit-test
 
 [ f throw ] must-fail
 
@@ -100,3 +100,22 @@ SYMBOL: error-counter
     [ 3 ] [ always-counter get ] unit-test
     [ 1 ] [ error-counter get ] unit-test
 ] with-scope
+
+TUPLE: dispose-error ;
+
+M: dispose-error dispose 3 throw ;
+
+TUPLE: dispose-dummy disposed? ;
+
+M: dispose-dummy dispose t >>disposed? drop ;
+
+T{ dispose-error } "a" set
+T{ dispose-dummy } "b" set
+
+[ f ] [ "b" get disposed?>> ] unit-test
+
+[ { "a" "b" } [ get ] map dispose-each ] [ 3 = ] must-fail-with
+
+[ t ] [ "b" get disposed?>> ] unit-test
+
+[ ] [ [ return ] with-return ] unit-test
index cf67280ccaa63620a5713c0d41616adfda701af4..78effb043afbd280ce4b07b19070ff3d0f2ba44f 100755 (executable)
@@ -101,6 +101,14 @@ PRIVATE>
 : continue ( continuation -- )
     f swap continue-with ;
 
+SYMBOL: return-continuation
+
+: with-return ( quot -- )
+    [ [ return-continuation set ] prepose callcc0 ] with-scope ; inline
+
+: return ( -- )
+    return-continuation get continue ;
+
 GENERIC: compute-restarts ( error -- seq )
 
 <PRIVATE
@@ -138,6 +146,11 @@ SYMBOL: thread-error-hook
 
 GENERIC: dispose ( object -- )
 
+: dispose-each ( seq -- )
+    [
+        [ [ dispose ] curry [ , ] recover ] each
+    ] { } make dup empty? [ drop ] [ peek rethrow ] if ;
+
 : with-disposal ( object quot -- )
     over [ dispose ] curry [ ] cleanup ; inline
 
index 179941102152fea3d421ce8f336b11c75ee0d472..70345b1e96cda2427e64a37a80cb17637b6bc1ea 100755 (executable)
@@ -4,7 +4,7 @@ USING: alien.c-types cpu.ppc.assembler cpu.architecture generic
 kernel kernel.private math memory namespaces sequences words
 assocs generator generator.registers generator.fixup system
 layouts classes words.private alien combinators
-compiler.constants ;
+compiler.constants math.order ;
 IN: cpu.ppc.architecture
 
 ! PowerPC register assignments
index 628022698f7bbf3c336faf283268aafb3593be9e..b1d7016effadd32e2b3496d9f735d660028f3dd2 100755 (executable)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2005, 2006 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
+USING: generator.fixup generic kernel memory namespaces
+words math math.bitfields math.order io.binary ;
 IN: cpu.ppc.assembler
-USING: generator.fixup generic kernel math memory namespaces
-words math.bitfields io.binary ;
 
 ! See the Motorola or IBM documentation for details. The opcode
 ! names are standard, and the operand order is the same as in
index d79ce58d88852e2aef3bd714e0d92ba28b60cd65..5f396e77510c354d82c7a419b6e793bcc2ad2821 100755 (executable)
@@ -181,7 +181,7 @@ stack-params "__stack_value" c-type set-c-type-reg-class >>
 : split-struct ( pairs -- seq )
     [
         [ 8 mod zero? [ t , ] when , ] assoc-each
-    ] { } make { t } split [ empty? not ] subset ;
+    ] { } make { t } split [ empty? not ] filter ;
 
 : flatten-large-struct ( type -- )
     heap-size cell align
index 7e7ff8a334e461b9f2ce3eb6cbb5333829e974dc..f0ca47a1ba05513f135101fbf0013f32bf607139 100755 (executable)
@@ -3,7 +3,8 @@
 USING: alien alien.c-types alien.compiler arrays
 cpu.x86.assembler cpu.architecture kernel kernel.private math
 memory namespaces sequences words generator generator.registers
-generator.fixup system layouts combinators compiler.constants ;
+generator.fixup system layouts combinators compiler.constants
+math.order ;
 IN: cpu.x86.architecture
 
 HOOK: ds-reg cpu
index 3ad7d4f7b5c02b85d2ad39fb18d808a89ca043c3..cabd81dad659f238f3b3384124b199722dd5e2f9 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays generator.fixup io.binary kernel
 combinators kernel.private math namespaces parser sequences
-words system layouts ;
+words system layouts math.order ;
 IN: cpu.x86.assembler
 
 ! A postfix assembler for x86 and AMD64.
index ca6aa59cc4d58d81caa70eb9d151da09755df82b..9dd23c6011964364f18ee96a056fce15a2cd8a8e 100755 (executable)
@@ -1,7 +1,7 @@
 USING: alien arrays generic generic.math help.markup help.syntax
 kernel math memory strings sbufs vectors io io.files classes
 help generic.standard continuations system debugger.private
-io.files.private ;
+io.files.private listener ;
 IN: debugger
 
 ARTICLE: "errors-assert" "Assertions"
@@ -64,7 +64,7 @@ HELP: :3
 
 HELP: error.
 { $values { "error" "an error" } }
-{ $contract "Print an error to the " { $link stdio } " stream.  You can define methods on this generic word to print human-readable messages for custom errors." }
+{ $contract "Print an error to " { $link output-stream } ". You can define methods on this generic word to print human-readable messages for custom errors." }
 { $notes "Code should call " { $link print-error } " instead, which handles the case where the printing of the error itself throws an error." } ;
 
 HELP: error-help
@@ -75,19 +75,15 @@ HELP: error-help
 
 HELP: print-error
 { $values { "error" "an error" } }
-{ $description "Print an error to the " { $link stdio } " stream." }
+{ $description "Print an error to " { $link output-stream } "." }
 { $notes "This word is called by the listener and other tools which report caught errors to the user." } ;
 
 HELP: restarts.
-{ $description "Print a list of restarts for the most recently thrown error to the " { $link stdio } " stream." } ;
-
-HELP: error-hook
-{ $var-description "A quotation with stack effect " { $snippet "( error -- )" } " which is used by " { $link try } " to report the error to the user." }
-{ $examples "The default value prints the error with " { $link print-error } ", followed by a list of restarts and a help message. The graphical listener sets this variable to display a popup instead." } ;
+{ $description "Print a list of restarts for the most recently thrown error to " { $link output-stream } "." } ;
 
 HELP: try
 { $values { "quot" "a quotation" } }
-{ $description "Attempts to call a quotation; if it throws an error, the " { $link error-hook } " gets called, stacks are restored, and execution continues after the call to " { $link try } "." }
+{ $description "Attempts to call a quotation; if it throws an error, the error is printed to " { $link output-stream } ", stacks are restored, and execution continues after the call to " { $link try } "." }
 { $examples
     "The following example prints an error and keeps going:"
     { $code
index 827a5c4e8d312b3f1fea3c0190c6b9672f9168ed..df7d33f41c7d3f229ed54fbe12a3e97dd3b250d1 100755 (executable)
@@ -1,12 +1,13 @@
 ! Copyright (C) 2004, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays definitions generic hashtables inspector io kernel
-math namespaces prettyprint sequences assocs sequences.private
-strings io.styles vectors words system splitting math.parser
-classes.tuple continuations continuations.private combinators
-generic.math io.streams.duplex classes.builtin classes
-compiler.units generic.standard vocabs threads threads.private
-init kernel.private libc io.encodings accessors ;
+math namespaces prettyprint prettyprint.config sequences assocs
+sequences.private strings io.styles vectors words system
+splitting math.parser classes.tuple continuations
+continuations.private combinators generic.math
+classes.builtin classes compiler.units generic.standard vocabs
+threads threads.private init kernel.private libc io.encodings
+mirrors accessors math.order ;
 IN: debugger
 
 GENERIC: error. ( error -- )
@@ -63,17 +64,14 @@ M: string error. print ;
     [ global [ "Error in print-error!" print drop ] bind ]
     recover ;
 
-SYMBOL: error-hook
-
-[
+: print-error-and-restarts ( error -- )
     print-error
     restarts.
     nl
-    "Type :help for debugging help." print flush
-] error-hook set-global
+    "Type :help for debugging help." print flush ;
 
 : try ( quot -- )
-    [ error-hook get call ] recover ;
+    [ print-error-and-restarts ] recover ;
 
 ERROR: assert got expect ;
 
@@ -96,10 +94,10 @@ M: relative-overflow summary
 
 : assert-depth ( quot -- )
     >r datastack r> swap slip >r datastack r>
-    2dup [ length ] compare sgn {
-        { -1 [ trim-datastacks nip relative-underflow ] }
-        { 0 [ 2drop ] }
-        { 1 [ trim-datastacks drop relative-overflow ] }
+    2dup [ length ] compare {
+        { +lt+ [ trim-datastacks nip relative-underflow ] }
+        { +eq+ [ 2drop ] }
+        { +gt+ [ trim-datastacks drop relative-overflow ] }
     } case ; inline
 
 : expired-error. ( obj -- )
@@ -208,9 +206,6 @@ M: no-next-method summary
 M: inconsistent-next-method summary
     drop "Executing call-next-method with inconsistent parameters" ;
 
-M: stream-closed-twice summary
-    drop "Attempt to perform I/O on closed stream" ;
-
 M: check-method summary
     drop "Invalid parameters for create-method" ;
 
@@ -240,6 +235,15 @@ M: condition error-help error>> error-help ;
 
 M: assert summary drop "Assertion failed" ;
 
+M: assert error.
+    "Assertion failed" print
+    standard-table-style [
+        15 length-limit set
+        5 line-limit set
+        [ expect>> [ [ "Expect:" write ] with-cell pprint-cell ] with-row ]
+        [ got>> [ [ "Got:" write ] with-cell pprint-cell ] with-row ] bi
+    ] tabular-output ;
+
 M: immutable summary drop "Sequence is immutable" ;
 
 M: redefine-error error.
@@ -266,8 +270,7 @@ M: double-free summary
 M: realloc-error summary
     drop "Memory reallocation failed" ;
 
-: error-in-thread. ( -- )
-    error-thread get-global
+: error-in-thread. ( thread -- )
     "Error in thread " write
     [
         dup thread-id #
@@ -281,7 +284,7 @@ M: thread error-in-thread ( error thread -- )
         die drop
     ] [
         global [
-            error-in-thread. print-error flush
+            error-thread get-global error-in-thread. print-error flush
         ] bind
     ] if ;
 
@@ -289,6 +292,12 @@ M: encode-error summary drop "Character encoding error" ;
 
 M: decode-error summary drop "Character decoding error" ;
 
+M: no-such-slot summary drop "No such slot" ;
+
+M: immutable-slot summary drop "Slot is immutable" ;
+
+M: bad-create summary drop "Bad parameters to create" ;
+
 <PRIVATE
 
 : init-debugger ( -- )
index b20d81ec7ca6ed74d372d40539e622ec90023951..b2d265a2e3cf3a43032f048171b36086109f8f5a 100755 (executable)
@@ -1,6 +1,6 @@
-IN: definitions.tests
 USING: tools.test generic kernel definitions sequences
 compiler.units words ;
+IN: definitions.tests
 
 GENERIC: some-generic ( a -- b )
 
index b0fe2a1157ddfa56b5c819f44ca3a82768740a7c..3bf324664f7d8804f720ce60a7d9360e32ab5634 100755 (executable)
@@ -79,7 +79,7 @@ IN: dlists.tests
         [ dlist-push-all ] keep
         [ dlist-delete-all ] keep
         dlist>array
-    ] 2keep diff assert-same-elements
+    ] 2keep swap diff assert-same-elements
 ] unit-test
 
 [ ] [
index e79907f11f68af9a668ddc3686492aa00d6faabf..d9aa6b1c19b371f0e29e4ed0c69a1d1cca027a9c 100755 (executable)
@@ -153,7 +153,7 @@ PRIVATE>
     drop ;
 
 : dlist-each ( dlist quot -- )
-    [ obj>> ] swap compose dlist-each-node ; inline
+    [ obj>> ] prepose dlist-each-node ; inline
 
 : dlist-slurp ( dlist quot -- )
     over dlist-empty?
index ad6cd3051c9f3409ac1d1f27f02c729097bd4700..06895cd8ac6196aa4927d80069ae38ceb51b9d97 100755 (executable)
@@ -3,7 +3,7 @@
 USING: arrays generic assocs hashtables
 kernel kernel.private math namespaces sequences words
 quotations strings alien.strings layouts system combinators
-math.bitfields words.private cpu.architecture ;
+math.bitfields words.private cpu.architecture math.order ;
 IN: generator.fixup
 
 : no-stack-frame -1 ; inline
index 6a1d9ec0f443cf618664e45833e2cd2b0173beff..c5e1ea54a63f562095cde24d5aa881d37b865d35 100755 (executable)
@@ -4,7 +4,7 @@ USING: arrays assocs classes classes.private classes.algebra
 combinators cpu.architecture generator.fixup hashtables kernel
 layouts math namespaces quotations sequences system vectors
 words effects alien byte-arrays bit-arrays float-arrays
-accessors sets ;
+accessors sets math.order ;
 IN: generator.registers
 
 SYMBOL: +input+
@@ -181,11 +181,11 @@ INSTANCE: constant value
 
 : %unbox-c-ptr ( dst src -- )
     dup operand-class {
-        { [ dup \ f class< ] [ drop %unbox-f ] }
-        { [ dup simple-alien class< ] [ drop %unbox-alien ] }
-        { [ dup byte-array class< ] [ drop %unbox-byte-array ] }
-        { [ dup bit-array class< ] [ drop %unbox-byte-array ] }
-        { [ dup float-array class< ] [ drop %unbox-byte-array ] }
+        { [ dup \ f class<= ] [ drop %unbox-f ] }
+        { [ dup simple-alien class<= ] [ drop %unbox-alien ] }
+        { [ dup byte-array class<= ] [ drop %unbox-byte-array ] }
+        { [ dup bit-array class<= ] [ drop %unbox-byte-array ] }
+        { [ dup float-array class<= ] [ drop %unbox-byte-array ] }
         [ drop %unbox-any-c-ptr ]
     } cond ; inline
 
@@ -314,7 +314,7 @@ M: phantom-retainstack finalize-height
 : (live-locs) ( phantom -- seq )
     #! Discard locs which haven't moved
     [ phantom-locs* ] [ stack>> ] bi zip
-    [ live-loc? ] assoc-subset
+    [ live-loc? ] assoc-filter
     values ;
 
 : live-locs ( -- seq )
@@ -372,7 +372,7 @@ M: value (lazy-load)
 : (compute-free-vregs) ( used class -- vector )
     #! Find all vregs in 'class' which are not in 'used'.
     [ vregs length reverse ] keep
-    [ <vreg> ] curry map diff
+    [ <vreg> ] curry map swap diff
     >vector ;
 
 : compute-free-vregs ( -- )
@@ -484,7 +484,7 @@ M: loc lazy-store
 
 : substitute-vregs ( values vregs -- )
     [ vreg-substitution ] 2map
-    [ substitute-vreg? ] assoc-subset >hashtable
+    [ substitute-vreg? ] assoc-filter >hashtable
     [ >r stack>> r> substitute-here ] curry each-phantom ;
 
 : set-operand ( value var -- )
@@ -569,7 +569,7 @@ M: loc lazy-store
     {
         { f [ drop t ] }
         { known-tag [ class-tag >boolean ] }
-        [ class< ]
+        [ class<= ]
     } case ;
 
 : spec-matches? ( value spec -- ? )
@@ -644,7 +644,7 @@ PRIVATE>
 UNION: immediate fixnum POSTPONE: f ;
 
 : operand-immediate? ( operand -- ? )
-    operand-class immediate class< ;
+    operand-class immediate class<= ;
 
 : phantom-push ( obj -- )
     1 phantom-datastack get adjust-phantom
index 1024c377a8c18c5c4a47de2f741dcd7c2372ddd1..39293bfec979c4e32ac0d4d195e11bb19134cbe0 100755 (executable)
@@ -4,22 +4,22 @@ generic.standard generic.math combinators ;
 IN: generic
 
 ARTICLE: "method-order" "Method precedence"
-"Consider the case where a generic word has methods on two classes, say A and B, which share a non-empty intersection. If the generic word is called on an object which is an instance of both A and B, a choice of method must be made. If A is a subclass of B, the method for A to be called; this makes sense, because we're defining general behavior for instances of B, and refining it for instances of A. Conversely, if B is a subclass of A, then we expect B's method to be called. However, if neither is a subclass of the other, we have an ambiguous situation and undefined behavior will result. Either the method for A or B will be called, and there is no way to predict ahead of time."
-$nl
-"The generic word system linearly orders all the methods on a generic word by their class. Conceptually, method dispatch is implemented by testing the object against the predicate word for every class, in order. If methods are defined on overlapping classes, this order will fail to be unique and the problem described above can occur."
+"Conceptually, method dispatch is implemented by testing the object against the predicate word for every class, in linear order (" { $link "class-linearization" } ")."
 $nl
 "Here is an example:"
 { $code
     "GENERIC: explain"
-    "M: number explain drop \"an integer\" print ;"
-    "M: sequence explain drop \"a sequence\" print ;"
     "M: object explain drop \"an object\" print ;"
+    "M: number explain drop \"a number\" print ;"
+    "M: sequence explain drop \"a sequence\" print ;"
 }
-"Neither " { $link number } " nor " { $link sequence } " are subclasses of each other, yet their intersection is the non-empty " { $link integer } " class. As a result, the outcome of calling " { $snippet "bar" } " with an " { $link integer } " on the stack is undefined - either one of the two methods may be called. This situation can lead to subtle bugs. To avoid it, explicitly disambiguate the method order by defining a method on the intersection. If in this case we want integers to behave like numbers, we would also define:"
-{ $code "M: integer explain drop \"an integer\" print ;" }
-"On the other hand, if we want integers to behave like sequences here, we could define:"
+"The linear order is the following, from least-specific to most-specific:"
+{ $code "{ object sequence number }" }
+"Neither " { $link number } " nor " { $link sequence } " are subclasses of each other, yet their intersection is the non-empty " { $link integer } " class. Calling " { $snippet "explain" } " with an integer on the stack will print " { $snippet "a number" } " because " { $link number } " precedes " { $link sequence } " in the class linearization order. If this was not the desired outcome, define a method on the intersection:"
 { $code "M: integer explain drop \"a sequence\" print ;" }
-"The " { $link order } " word can be useful to clarify method dispatch order."
+"Now, the linear order is the following, from least-specific to most-specific:"
+{ $code "{ object sequence number integer }" }
+"The " { $link order } " word can be useful to clarify method dispatch order:"
 { $subsection order } ;
 
 ARTICLE: "generic-introspection" "Generic word introspection"
index bbd7186a113a78f68dbe75455d08130c1a8d8b36..600f422274ed19a67549f9c40bb941c862781854 100755 (executable)
@@ -143,7 +143,7 @@ GENERIC: generic-forget-test-1
 M: integer generic-forget-test-1 / ;
 
 [ t ] [
-    \ / usage [ word? ] subset
+    \ / usage [ word? ] filter
     [ word-name "generic-forget-test-1/integer" = ] contains?
 ] unit-test
 
@@ -152,7 +152,7 @@ M: integer generic-forget-test-1 / ;
 ] unit-test
 
 [ f ] [
-    \ / usage [ word? ] subset
+    \ / usage [ word? ] filter
     [ word-name "generic-forget-test-1/integer" = ] contains?
 ] unit-test
 
@@ -161,7 +161,7 @@ GENERIC: generic-forget-test-2
 M: sequence generic-forget-test-2 = ;
 
 [ t ] [
-    \ = usage [ word? ] subset
+    \ = usage [ word? ] filter
     [ word-name "generic-forget-test-2/sequence" = ] contains?
 ] unit-test
 
@@ -170,7 +170,7 @@ M: sequence generic-forget-test-2 = ;
 ] unit-test
 
 [ f ] [
-    \ = usage [ word? ] subset
+    \ = usage [ word? ] filter
     [ word-name "generic-forget-test-2/sequence" = ] contains?
 ] unit-test
 
index 6c59d76d07511269fb243b45c7546fe55dd4f5fd..d35ba01e52f9a4133f490e25876c07ef10320a62 100755 (executable)
@@ -35,7 +35,7 @@ PREDICATE: method-spec < pair
 GENERIC: effective-method ( ... generic -- method )
 
 : next-method-class ( class generic -- class/f )
-    order [ class< ] with subset reverse dup length 1 =
+    order [ class<= ] with filter reverse dup length 1 =
     [ drop f ] [ second ] if ;
 
 : next-method ( class generic -- class/f )
@@ -137,7 +137,7 @@ M: method-body forget*
     all-words [
         "methods" word-prop keys
         swap [ key? ] curry contains?
-    ] with subset ;
+    ] with filter ;
 
 : implementors ( class -- seq )
     dup associate implementors* ;
index 884ab8027ef637f1ddd23923eecc1ad900f26b7f..1c1368a6c22991fcacaaeb3e04015af8f36f7178 100755 (executable)
@@ -3,27 +3,27 @@
 USING: arrays generic hashtables kernel kernel.private
 math namespaces sequences words quotations layouts combinators
 sequences.private classes classes.builtin classes.algebra
-definitions ;
+definitions math.order ;
 IN: generic.math
 
 PREDICATE: math-class < class
     dup null bootstrap-word eq? [
         drop f
     ] [
-        number bootstrap-word class<
+        number bootstrap-word class<=
     ] if ;
 
 : last/first ( seq -- pair ) [ peek ] [ first ] bi 2array ;
 
 : math-precedence ( class -- pair )
     {
-        { [ dup null class< ] [ drop { -1 -1 } ] }
+        { [ dup null class<= ] [ drop { -1 -1 } ] }
         { [ dup math-class? ] [ class-types last/first ] }
         [ drop { 100 100 } ]
     } cond ;
     
 : math-class-max ( class class -- class )
-    [ [ math-precedence ] compare 0 > ] most ;
+    [ [ math-precedence ] compare +gt+ eq? ] most ;
 
 : (math-upgrade) ( max class -- quot )
     dupd = [ drop [ ] ] [ "coercer" word-prop [ ] or ] if ;
index 1f0b80e016e2ab69dea116d83640fbc4e4ed8f60..20e22fde82dd77bb53ab67eabdccd5ffe7c50074 100644 (file)
@@ -26,8 +26,8 @@ M: method-body engine>quot 1quotation ;
     alist>quot ;
 
 : split-methods ( assoc class -- first second )
-    [ [ nip class< not ] curry assoc-subset ]
-    [ [ nip class<     ] curry assoc-subset ] 2bi ;
+    [ [ nip class<= not ] curry assoc-filter ]
+    [ [ nip class<=     ] curry assoc-filter ] 2bi ;
 
 : convert-methods ( assoc class word -- assoc' )
     over >r >r split-methods dup assoc-empty? [
index 5335074deaf68784cf142de1d7499361d37349f1..b1bfc659df7aeec4e0e70dae58c963cf381a3348 100644 (file)
@@ -11,14 +11,14 @@ C: <predicate-dispatch-engine> predicate-dispatch-engine
     [ >r "predicate" word-prop picker prepend r> ] assoc-map ;
 
 : keep-going? ( assoc -- ? )
-    assumed get swap second first class< ;
+    assumed get swap second first class<= ;
 
 : prune-redundant-predicates ( assoc -- default assoc' )
     {
         { [ dup empty? ] [ drop [ "Unreachable" throw ] { } ] }
         { [ dup length 1 = ] [ first second { } ] }
-        { [ dup keep-going? ] [ 1 tail-slice prune-redundant-predicates ] }
-        [ [ first second ] [ 1 tail-slice ] bi ]
+        { [ dup keep-going? ] [ rest-slice prune-redundant-predicates ] }
+        [ [ first second ] [ rest-slice ] bi ]
     } cond ;
 
 : sort-methods ( assoc -- assoc' )
index 7639d1d49912f9f25ccb37db6d3207df41d08845..51ea4f8225cec8c64eb22f1294bfbf6659a728a8 100644 (file)
@@ -127,8 +127,6 @@ M: echelon-dispatch-engine engine>quot
     1 slot { tuple-layout } declare
     5 slot ; inline
 
-: unclip-last [ 1 head* ] [ peek ] bi ;
-
 M: tuple-dispatch-engine engine>quot
     [
         picker %
index f4e76aa68e9a6e8e73af490ce3ead7d7871c276e..4e80ed1f6e41e22a8ee33fae543d06f0281f2ddf 100755 (executable)
@@ -10,7 +10,7 @@ continuations ;
 [ ] [ 1000 [ dup sq ] H{ } map>assoc "testhash" set ] unit-test
 
 [ V{ } ]
-[ 1000 [ dup sq swap "testhash" get at = not ] subset ]
+[ 1000 [ dup sq swap "testhash" get at = not ] filter ]
 unit-test
 
 [ t ]
index f9224eafeba97c8f1b744e5cfde452b9bb9ebbd4..d1003ac2f84830d903f2fa885e4feb9e2c985b05 100755 (executable)
@@ -1,4 +1,5 @@
-USING: heaps.private help.markup help.syntax kernel math assocs ;
+USING: heaps.private help.markup help.syntax kernel math assocs
+math.order ;
 IN: heaps
 
 ARTICLE: "heaps" "Heaps"
index b22d8818c1c2ce4df0d7925a1edd0091f4cffc76..d55b547b8fea290a768e3e0c05182a063684d63e 100755 (executable)
@@ -3,7 +3,7 @@
 
 USING: arrays kernel math namespaces tools.test
 heaps heaps.private math.parser random assocs sequences sorting
-accessors ;
+accessors math.order ;
 IN: heaps.tests
 
 [ <min-heap> heap-pop ] must-fail
index 02a8b8d88b9891fc43134d620c0d747180c947f5..57f0e0ac72b98bfc903dbabb25d50e67fa9453d8 100755 (executable)
@@ -2,7 +2,7 @@
 ! Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel math sequences arrays assocs sequences.private
-growable accessors ;
+growable accessors math.order ;
 IN: heaps
 
 MIXIN: priority-queue
@@ -92,11 +92,11 @@ M: priority-queue heap-size ( heap -- n )
 
 GENERIC: heap-compare ( pair1 pair2 heap -- ? )
 
-: (heap-compare) drop [ entry-key ] compare ; inline
+: (heap-compare) drop [ entry-key ] compare ; inline
 
-M: min-heap heap-compare (heap-compare) > ;
+M: min-heap heap-compare (heap-compare) +gt+ eq? ;
 
-M: max-heap heap-compare (heap-compare) < ;
+M: max-heap heap-compare (heap-compare) +lt+ eq? ;
 
 : heap-bounds-check? ( m heap -- ? )
     heap-size >= ; inline
index f60748a5ac1a4ae5b9852574d583899f30701f2c..5896429ccfb6e17541837741a8a19901751b3ec0 100755 (executable)
@@ -4,7 +4,7 @@ USING: inference.dataflow inference.state arrays generic io
 io.streams.string kernel math namespaces parser prettyprint
 sequences strings vectors words quotations effects classes
 continuations debugger assocs combinators compiler.errors
-generic.standard.engines.tuple accessors ;
+generic.standard.engines.tuple accessors math.order ;
 IN: inference.backend
 
 : recursive-label ( word -- label/f )
@@ -60,7 +60,7 @@ M: object value-literal \ literal-expected inference-warning ;
 : value-vector ( n -- vector ) [ drop <computed> ] V{ } map-as ;
 
 : add-inputs ( seq stack -- n stack )
-    tuck [ length ] compare dup 0 >
+    tuck [ length ] bi@ - dup 0 >
     [ dup value-vector [ swapd push-all ] keep ]
     [ drop 0 swap ] if ;
 
@@ -261,7 +261,7 @@ TUPLE: cannot-unify-specials ;
 
 : balanced? ( in out -- ? )
     [ dup [ length - ] [ 2drop f ] if ] 2map
-    [ ] subset all-equal? ;
+    [ ] filter all-equal? ;
 
 TUPLE: unbalanced-branches-error quots in out ;
 
@@ -281,7 +281,7 @@ TUPLE: unbalanced-branches-error quots in out ;
     2dup balanced? [
         over supremum -rot
         [ >r dupd r> unify-inputs ] 2map
-        [ ] subset unify-stacks
+        [ ] filter unify-stacks
         rot drop
     ] [
         unbalanced-branches-error
index 0c4ff82798bdeec478f925704c3ec4e25bbea8f1..e6ce2cfa0b8406f3ed3db8bdb60848487353fb7d 100755 (executable)
@@ -5,7 +5,7 @@ sequences words inference.class quotations alien
 alien.c-types strings sbufs sequences.private
 slots.private combinators definitions compiler.units
 system layouts vectors optimizer.math.partial accessors
-optimizer.inlining ;
+optimizer.inlining math.order ;
 
 [ t ] [ T{ literal-constraint f 1 2 } T{ literal-constraint f 1 2 } equal? ] unit-test
 
index 6d5b708f346cbe395d754b9f96447eb72907a953..933710aaca396424ab56c9c899e13a7263756205 100755 (executable)
@@ -143,7 +143,7 @@ M: literal-constraint constraint-satisfied?
     [ swap literal>> eql? ] [ 2drop f ] if ;
 
 M: class-constraint constraint-satisfied?
-    [ value>> value-class* ] [ class>> ] bi class< ;
+    [ value>> value-class* ] [ class>> ] bi class<= ;
 
 M: pair apply-constraint
     first2 2dup constraints get set-at
@@ -153,7 +153,7 @@ M: pair constraint-satisfied?
     first constraint-satisfied? ;
 
 : extract-keys ( seq assoc -- newassoc )
-    [ dupd at ] curry H{ } map>assoc [ nip ] assoc-subset f assoc-like ;
+    [ dupd at ] curry H{ } map>assoc [ nip ] assoc-filter f assoc-like ;
 
 : annotate-node ( node -- )
     #! Annotate the node with the currently-inferred set of
index bb66a5386cf0610ab03d79797c5e744a7a0653d9..d7e3e78308fec3445760880b4cc0c0d8ce35e380 100755 (executable)
@@ -300,7 +300,7 @@ SYMBOL: node-stack
     dup in-d>> first node-class ;
 
 : active-children ( node -- seq )
-    children>> [ last-node ] map [ #terminate? not ] subset ;
+    children>> [ last-node ] map [ #terminate? not ] filter ;
 
 DEFER: #tail?
 
index e32c94ed371263df9655a1a95b0293cd5205ce35..d79c82ed6518699cc1f7bed44ed931f787d24d66 100755 (executable)
@@ -135,7 +135,7 @@ HELP: infer
 
 HELP: infer.
 { $values { "quot" "a quotation" } }
-{ $description "Attempts to infer the quotation's stack effect, and prints this data to the " { $link stdio } " stream." }
+{ $description "Attempts to infer the quotation's stack effect, and prints this data to " { $link output-stream } "." }
 { $errors "Throws an " { $link inference-error } " if stack effect inference fails." } ;
 
 { infer infer. } related-words
index 84d72bdd9b25f55de88569d466dc550a33ee5c63..c63786dc9e6390404ed7e77358ab094e45d22882 100644 (file)
@@ -1,5 +1,9 @@
 IN: inference.state.tests
-USING: tools.test inference.state words ;
+USING: tools.test inference.state words kernel namespaces ;
+
+: computing-dependencies ( quot -- dependencies )
+    H{ } clone [ dependencies rot with-variable ] keep ;
+    inline
 
 SYMBOL: a
 SYMBOL: b
index a426f410e27720165cb81bbedd24ab1d0e530825..6f0eecf2d9617419863fdfb55c6e3ebdec4ae454 100755 (executable)
@@ -36,10 +36,6 @@ SYMBOL: dependencies
         2dup at +inlined+ eq? [ 3drop ] [ set-at ] if
     ] [ 3drop ] if ;
 
-: computing-dependencies ( quot -- dependencies )
-    H{ } clone [ dependencies rot with-variable ] keep ;
-    inline
-
 ! Did the current control-flow path throw an error?
 SYMBOL: terminated?
 
index 624dcbbf980ae8d0a6284dda7d4b05d7b4856d7f..0040629edd444786c06184f78f5b03d064c70025 100755 (executable)
@@ -32,7 +32,7 @@ IN: inference.transforms
         drop [ no-case ]
     ] [
         dup peek quotation? [
-            dup peek swap 1 head*
+            dup peek swap but-last
         ] [
             [ no-case ] swap
         ] if case>quot
index 84ae34480d540424e2e09ffd6b02a7fea2e190b6..ab1c38b0b736facf41c7fbff11928a0499384bf5 100644 (file)
@@ -108,4 +108,4 @@ HELP: me
 HELP: inspector-hook
 { $var-description "A quotation with stack effect " { $snippet "( obj -- )" } ", called by the inspector to display an overview of an object."
 $nl
-"The default implementation calls " { $link describe } " which outputs on the " { $link stdio } " stream, but the graphical listener sets this variable so that calling " { $link inspect } " in the UI opens the graphical inspector." } ;
+"The default implementation calls " { $link describe } " which outputs on " { $link output-stream } ", but the graphical listener sets this variable so that calling " { $link inspect } " in the UI opens the graphical inspector." } ;
index c9bfbfad54cb43779aace0b3ee1d3b902fd3235f..0ab016b0fa40e35d0aed65e6ab1ce1578dc2de24 100755 (executable)
@@ -96,7 +96,7 @@ SYMBOL: +editable+
 
 : namestack. ( seq -- )
     [
-        [ global eq? not ] subset
+        [ global eq? not ] filter
         [ keys ] map concat prune
     ] keep [ dupd assoc-stack ] curry H{ } map>assoc describe ;
 
index 8bf761e2a691b28fa395562f34ff28707b266233..48b49ed32b66fedc5fea449161db80c253f3479b 100644 (file)
@@ -9,4 +9,4 @@ HELP: init-io
 { $contract "Initializes the I/O system. Called on startup." } ;
 
 HELP: init-stdio
-{ $contract "Initializes the global " { $link stdio } " stream.  Called on startup." } ;
+{ $contract "Initializes the global " { $link input-stream } " and " { $link output-stream } ".  Called on startup." } ;
index 44b1eea349e1a0fe910b6fb13a516fdd079606d5..0760063f0df9ff7c7394c833d8e502a55851e486 100755 (executable)
@@ -11,8 +11,10 @@ HOOK: init-io io-backend ( -- )
 HOOK: (init-stdio) io-backend ( -- stdin stdout stderr )
 
 : init-stdio ( -- )
-    (init-stdio) utf8 <encoder> stderr set-global
-    utf8 <encoder-duplex> stdio set-global ;
+    (init-stdio)
+    [ utf8 <decoder> input-stream set-global ]
+    [ utf8 <encoder> output-stream set-global ]
+    [ utf8 <encoder> error-stream set-global ] tri* ;
 
 HOOK: io-multiplex io-backend ( ms -- )
 
diff --git a/core/io/crc32/authors.txt b/core/io/crc32/authors.txt
deleted file mode 100644 (file)
index 1901f27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Slava Pestov
diff --git a/core/io/crc32/crc32-docs.factor b/core/io/crc32/crc32-docs.factor
deleted file mode 100644 (file)
index 7f85ee2..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-USING: help.markup help.syntax math ;
-IN: io.crc32
-
-HELP: crc32
-{ $values { "seq" "a sequence of bytes" } { "n" integer } }
-{ $description "Computes the CRC32 checksum of a sequence of bytes." } ;
-
-HELP: lines-crc32
-{ $values { "seq" "a sequence of strings" } { "n" integer } }
-{ $description "Computes the CRC32 checksum of a sequence of lines of bytes." } ;
-
-ARTICLE: "io.crc32" "CRC32 checksum calculation"
-"The CRC32 checksum algorithm provides a quick but unreliable way to detect changes in data."
-{ $subsection crc32 }
-{ $subsection lines-crc32 } ;
-
-ABOUT: "io.crc32"
diff --git a/core/io/crc32/crc32-tests.factor b/core/io/crc32/crc32-tests.factor
deleted file mode 100644 (file)
index 5eafae2..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-USING: io.crc32 kernel math tools.test namespaces ;
-
-[ 0 ] [ "" crc32 ] unit-test
-[ HEX: cbf43926 ] [ "123456789" crc32 ] unit-test
-
diff --git a/core/io/crc32/crc32.factor b/core/io/crc32/crc32.factor
deleted file mode 100755 (executable)
index afe7e4b..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-! Copyright (C) 2006 Doug Coleman
-! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math sequences sequences.private namespaces
-words io io.binary io.files io.streams.string quotations
-definitions ;
-IN: io.crc32
-
-: crc32-polynomial HEX: edb88320 ; inline
-
-: crc32-table V{ } ; inline
-
-256 [
-    8 [
-        dup even? >r 2/ r> [ crc32-polynomial bitxor ] unless
-    ] times >bignum
-] map 0 crc32-table copy
-
-: (crc32) ( crc ch -- crc )
-    >bignum dupd bitxor
-    mask-byte crc32-table nth-unsafe >bignum
-    swap -8 shift bitxor ; inline
-
-: crc32 ( seq -- n )
-    >r HEX: ffffffff dup r> [ (crc32) ] each bitxor ;
-
-: lines-crc32 ( seq -- n )
-    HEX: ffffffff tuck [
-        [ (crc32) ] each CHAR: \n (crc32)
-    ] reduce bitxor ;
diff --git a/core/io/crc32/summary.txt b/core/io/crc32/summary.txt
deleted file mode 100644 (file)
index 041d7ff..0000000
+++ /dev/null
@@ -1 +0,0 @@
-CRC32 checksum algorithm
index 8a176ce4ec7db6b7a30df6d3b6ce5146e96c2074..92471acb5d0b680088b8d8d93679a11eadb7e3db 100644 (file)
@@ -12,8 +12,7 @@ ARTICLE: "io.encodings" "I/O encodings"
 ARTICLE: "encodings-constructors" "Manually constructing an encoded stream"
 "The following words can be used to construct encoded streams. Note that they are usually not used directly, but rather by the stream constructors themselves. Most stream constructors take an encoding descriptor as a parameter and internally call these constructors."
 { $subsection <encoder> }
-{ $subsection <decoder> }
-{ $subsection <encoder-duplex> } ;
+{ $subsection <decoder> } ;
 
 HELP: <encoder>
 { $values { "stream" "an output stream" }
@@ -29,16 +28,6 @@ HELP: <decoder>
 { $description "Wraps the given stream in a new stream using the given encoding for all input. The encoding descriptor can either be a class or an instance of something conforming to the " { $link "encodings-protocol" } "." }
 $low-level-note ;
 
-HELP: <encoder-duplex>
-{ $values { "stream-in" "an input stream" }
-    { "stream-out" "an output stream" }
-    { "encoding" "an encoding descriptor" }
-    { "duplex" "an encoded duplex stream" } }
-{ $description "Wraps the given streams in an encoder or decoder stream, and puts them together in a duplex stream for input and output. If either input stream is already encoded, that encoding is stripped off before it is reencoded. The encoding descriptor must conform to the " { $link "encodings-protocol" } "." }
-$low-level-note ;
-
-{ <encoder> <decoder> <encoder-duplex> } related-words
-
 ARTICLE: "encodings-descriptors" "Encoding descriptors"
 "An encoding descriptor is something which can be used for input or output streams to encode or decode files. It must conform to the " { $link "encodings-protocol" } ". Encodings which you can use are defined in the following vocabularies:"
 { $subsection "io.encodings.binary" }
index 397d1ea89c3b40b40dd4784debfc1f2755cc4014..e6b180fde2f249e566fce453a66753d6150b4989 100755 (executable)
@@ -2,35 +2,35 @@ USING: io.files io.streams.string io
 tools.test kernel io.encodings.ascii ;
 IN: io.streams.encodings.tests
 
-: <resource-reader> ( resource -- stream )
-    resource-path ascii <file-reader> ;
-    
 [ { } ]
-[ "core/io/test/empty-file.txt" <resource-reader> lines ]
+[ "resource:core/io/test/empty-file.txt" ascii <file-reader> lines ]
 unit-test
 
 : lines-test ( stream -- line1 line2 )
-    [ readln readln ] with-stream ;
+    [ readln readln ] with-input-stream ;
 
 [
     "This is a line."
     "This is another line."
 ] [
-    "core/io/test/windows-eol.txt" <resource-reader> lines-test
+    "resource:core/io/test/windows-eol.txt"
+    ascii <file-reader> lines-test
 ] unit-test
 
 [
     "This is a line."
     "This is another line."
 ] [
-    "core/io/test/mac-os-eol.txt" <resource-reader> lines-test
+    "resource:core/io/test/mac-os-eol.txt"
+    ascii <file-reader> lines-test
 ] unit-test
 
 [
     "This is a line."
     "This is another line."
 ] [
-    "core/io/test/unix-eol.txt" <resource-reader> lines-test
+    "resource:core/io/test/unix-eol.txt"
+    ascii <file-reader> lines-test
 ] unit-test
 
 [
index 4559cec666c5a1ed166447fa13ee0d20b3aac1c0..0f6e58bdc9186262c16644d5fbb13becd89dfb2b 100755 (executable)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math kernel sequences sbufs vectors namespaces growable
 strings io classes continuations combinators io.styles
-io.streams.plain splitting io.streams.duplex byte-arrays
-sequences.private accessors ;
+io.streams.plain splitting byte-arrays sequences.private
+accessors ;
 IN: io.encodings
 
 ! The encoding descriptor protocol
@@ -131,6 +131,3 @@ INSTANCE: encoder plain-writer
     over decoder? [ >r decoder-stream r> ] when <decoder> ;
 
 PRIVATE>
-
-: <encoder-duplex> ( stream-in stream-out encoding -- duplex )
-    tuck reencode >r redecode r> <duplex-stream> ;
index ba17223a2937eec75a98eb6d5926e8e5a500084b..dd550070a40f4464e90bb846d418b30a641bd781 100755 (executable)
@@ -184,8 +184,12 @@ HELP: +unknown+
 { $description "A unknown file type." } ;
 
 HELP: <file-reader>
-{ $values { "path" "a pathname string" } { "encoding" "an encoding descriptor" { "stream" "an input stream" } }
-    { "stream" "an input stream" } }
+{
+  $values
+  { "path" "a pathname string" }
+  { "encoding" "an encoding descriptor" }
+  { "stream" "an input stream" }
+}
 { $description "Outputs an input stream for reading from the specified pathname using the given encoding." }
 { $errors "Throws an error if the file is unreadable." } ;
 
@@ -201,17 +205,17 @@ HELP: <file-appender>
 
 HELP: with-file-reader
 { $values { "path" "a pathname string" } { "encoding" "an encoding descriptor" } { "quot" "a quotation" } }
-{ $description "Opens a file for reading and calls the quotation using " { $link with-stream } "." }
+{ $description "Opens a file for reading and calls the quotation using " { $link with-input-stream } "." }
 { $errors "Throws an error if the file is unreadable." } ;
 
 HELP: with-file-writer
 { $values { "path" "a pathname string" } { "encoding" "an encoding descriptor" } { "quot" "a quotation" } }
-{ $description "Opens a file for writing using the given encoding and calls the quotation using " { $link with-stream } "." }
+{ $description "Opens a file for writing using the given encoding and calls the quotation using " { $link with-output-stream } "." }
 { $errors "Throws an error if the file cannot be opened for writing." } ;
 
 HELP: with-file-appender
 { $values { "path" "a pathname string" } { "encoding" "an encoding descriptor" } { "quot" "a quotation" } }
-{ $description "Opens a file for appending using the given encoding and calls the quotation using " { $link with-stream } "." }
+{ $description "Opens a file for appending using the given encoding and calls the quotation using " { $link with-output-stream } "." }
 { $errors "Throws an error if the file cannot be opened for writing." } ;
 
 HELP: set-file-lines
@@ -273,7 +277,7 @@ HELP: append-path
 
 HELP: prepend-path
 { $values { "str1" "a string" } { "str2" "a string" } { "str" "a string" } }
-{ $description "Concatenates two pathnames." } ;
+{ $description "Appends str1 onto str2 to form a pathname." } ;
 
 { append-path prepend-path } related-words
 
index 5efbb9496dc95e2276a697608ab33588f3dabf1b..a463fd2e40662dc102dc051913238fb8e97c32a8 100755 (executable)
@@ -135,13 +135,13 @@ strings accessors io.encodings.utf8 ;
 
 [ { { "kernel" t } } ] [
     "core" resource-path [
-        "." directory [ first "kernel" = ] subset
+        "." directory [ first "kernel" = ] filter
     ] with-directory
 ] unit-test
 
 [ { { "kernel" t } } ] [
     "resource:core" [
-        "." directory [ first "kernel" = ] subset
+        "." directory [ first "kernel" = ] filter
     ] with-directory
 ] unit-test
 
index 061e6386dade88cb13f46e5956198b0db8d58554..76c7b144d0aa9a37862767dba6b7f15bad83f97e 100755 (executable)
@@ -3,7 +3,7 @@
 USING: io.backend io.files.private io hashtables kernel math
 memory namespaces sequences strings assocs arrays definitions
 system combinators splitting sbufs continuations io.encodings
-io.encodings.binary init accessors ;
+io.encodings.binary init accessors math.order ;
 IN: io.files
 
 HOOK: (file-reader) io-backend ( path -- stream )
@@ -25,13 +25,13 @@ HOOK: (file-appender) io-backend ( path -- stream )
     <file-reader> lines ;
 
 : with-file-reader ( path encoding quot -- )
-    >r <file-reader> r> with-stream ; inline
+    >r <file-reader> r> with-input-stream ; inline
 
 : file-contents ( path encoding -- str )
     <file-reader> contents ;
 
 : with-file-writer ( path encoding quot -- )
-    >r <file-writer> r> with-stream ; inline
+    >r <file-writer> r> with-output-stream ; inline
 
 : set-file-lines ( seq path encoding -- )
     [ [ print ] each ] with-file-writer ;
@@ -40,7 +40,7 @@ HOOK: (file-appender) io-backend ( path -- stream )
     [ write ] with-file-writer ;
 
 : with-file-appender ( path encoding quot -- )
-    >r <file-appender> r> with-stream ; inline
+    >r <file-appender> r> with-output-stream ; inline
 
 ! Pathnames
 : path-separator? ( ch -- ? ) os windows? "/\\" "/" ? member? ;
@@ -54,7 +54,7 @@ HOOK: (file-appender) io-backend ( path -- stream )
     [ path-separator? ] left-trim ;
 
 : last-path-separator ( path -- n ? )
-    [ length 1- ] keep [ path-separator? ] find-last* ;
+    [ length 1- ] keep [ path-separator? ] find-last-from ;
 
 HOOK: root-directory? io-backend ( path -- ? )
 
@@ -92,7 +92,7 @@ ERROR: no-parent-directory path ;
 : append-path-empty ( path1 path2 -- path' )
     {
         { [ dup head.? ] [
-            1 tail left-trim-separators append-path-empty
+            rest left-trim-separators append-path-empty
         ] }
         { [ dup head..? ] [ drop no-parent-directory ] }
         [ nip ]
@@ -122,7 +122,7 @@ PRIVATE>
         { [ over empty? ] [ append-path-empty ] }
         { [ dup empty? ] [ drop ] }
         { [ dup absolute-path? ] [ nip ] }
-        { [ dup head.? ] [ 1 tail left-trim-separators append-path ] }
+        { [ dup head.? ] [ rest left-trim-separators append-path ] }
         { [ dup head..? ] [
             2 tail left-trim-separators
             >r parent-directory r> append-path
@@ -232,7 +232,7 @@ HOOK: make-directory io-backend ( path -- )
         dup string?
         [ tuck append-path directory? 2array ] [ nip ] if
     ] with map
-    [ first { "." ".." } member? not ] subset ;
+    [ first { "." ".." } member? not ] filter ;
 
 : directory ( path -- seq )
     normalize-directory dup (directory) fixup-directory ;
index fd40950e62e7f2692754efa0e729d16099301a8b..ddea4da5563e5e6631634f04e51e41d115c3c7ad 100755 (executable)
@@ -5,7 +5,7 @@ IN: io
 ARTICLE: "stream-protocol" "Stream protocol"
 "The stream protocol consists of a large number of generic words, many of which are optional."
 $nl
-"Stream protocol words are rarely called directly, since code which only works with one stream at a time should be written use " { $link "stdio" } " instead, wrapping I/O operations such as " { $link read } " and " { $link write } " in a " { $link with-stream } ". This leads more simpler, more reusable and more robust code."
+"Stream protocol words are rarely called directly, since code which only works with one stream at a time should be written use " { $link "stdio" } " instead, wrapping I/O operations such as " { $link read } " and " { $link write } " in " { $link with-input-stream } " and " { $link with-output-stream } "."
 $nl
 "All streams must implement the " { $link dispose } " word in addition to the stream protocol."
 $nl
@@ -26,24 +26,24 @@ $nl
 { $subsection stream-write-table }
 { $see-also "io.timeouts" } ;
 
-ARTICLE: "stdio" "The default stream"
-"Most I/O code only operates on one stream at a time. The " { $emphasis "default stream" } " is an implicit parameter used by many I/O words designed for this particular use-case. Using this idiom improves code in three ways:"
+ARTICLE: "stdio" "Default input and output streams"
+"Most I/O code only operates on one stream at a time. The " { $link input-stream } " and " { $link output-stream } " variables are implicit parameters used by many I/O words. Using this idiom improves code in three ways:"
 { $list
     { "Code becomes simpler because there is no need to keep a stream around on the stack." }
-    { "Code becomes more robust because " { $link with-stream } " automatically closes the stream if there is an error." }
-    { "Code becomes more reusable because it can be written to not worry about which stream is being used, and instead the caller can use " { $link with-stream } " to specify the source or destination for I/O operations." }
+    { "Code becomes more robust because " { $link with-input-stream } " and " { $link with-output-stream } " automatically close the streams if there is an error." }
+    { "Code becomes more reusable because it can be written to not worry about which stream is being used, and instead the caller can use " { $link with-input-stream } " or " { $link with-output-stream } " to specify the source or destination for I/O operations." }
 }
 "For example, here is a program which reads the first line of a file, converts it to an integer, then reads that many characters, and splits them into groups of 16:"
 { $code
     "USING: continuations kernel io io.files math.parser splitting ;"
-    "\"data.txt\" <file-reader>"
+    "\"data.txt\" utf8 <file-reader>"
     "dup stream-readln number>string over stream-read 16 group"
     "swap dispose"
 }
 "This code has two problems: it has some unnecessary stack shuffling, and if either " { $link stream-readln } " or " { $link stream-read } " throws an I/O error, the stream is not closed because " { $link dispose } " is never reached. So we can add a call to " { $link with-disposal } " to ensure the stream is always closed:"
 { $code
     "USING: continuations kernel io io.files math.parser splitting ;"
-    "\"data.txt\" <file-reader> ["
+    "\"data.txt\" utf8 <file-reader> ["
     "    dup stream-readln number>string over stream-read"
     "    16 group"
     "] with-disposal"
@@ -51,17 +51,34 @@ ARTICLE: "stdio" "The default stream"
 "This code is robust however it is more complex than it needs to be since. This is where the default stream words come in; using them, the above can be rewritten as follows:"
 { $code
     "USING: continuations kernel io io.files math.parser splitting ;"
-    "\"data.txt\" <file-reader> ["
+    "\"data.txt\" utf8 <file-reader> ["
     "    readln number>string read 16 group"
-    "] with-stream"
+    "] with-input-stream"
 }
-"The default stream is stored in a dynamically-scoped variable:"
-{ $subsection stdio }
-"Unless rebound in a child namespace, this variable will be set to a console stream for interacting with the user."
+"An even better implementation that takes advantage of a utility word:"
+{ $code
+    "USING: continuations kernel io io.files math.parser splitting ;"
+    "\"data.txt\" utf8 ["
+    "    readln number>string read 16 group"
+    "] with-file-reader"
+}
+"The default input stream is stored in a dynamically-scoped variable:"
+{ $subsection input-stream }
+"Unless rebound in a child namespace, this variable will be set to a console stream for reading input from the user."
+$nl
+"Words reading from the default input stream:"
 { $subsection read1 }
 { $subsection read }
 { $subsection read-until }
 { $subsection readln }
+"A pair of combinators for rebinding the " { $link input-stream } " variable:"
+{ $subsection with-input-stream }
+{ $subsection with-input-stream* }
+"The default output stream is stored in a dynamically-scoped variable:"
+{ $subsection output-stream }
+"Unless rebound in a child namespace, this variable will be set to a console stream for showing output to the user."
+$nl
+"Words writing to the default input stream:"
 { $subsection flush }
 { $subsection write1 }
 { $subsection write }
@@ -78,9 +95,12 @@ ARTICLE: "stdio" "The default stream"
 { $subsection with-row }
 { $subsection with-cell }
 { $subsection write-cell }
-"A pair of combinators support rebinding the " { $link stdio } " variable:"
-{ $subsection with-stream }
-{ $subsection with-stream* } ;
+"A pair of combinators for rebinding the " { $link output-stream } " variable:"
+{ $subsection with-output-stream }
+{ $subsection with-output-stream* }
+"A pair of combinators for rebinding both default streams at once:"
+{ $subsection with-streams }
+{ $subsection with-streams* } ;
 
 ARTICLE: "stream-utils" "Stream utilities"
 "There are a few useful stream-related words which are not generic, but merely built up from the stream protocol."
@@ -204,62 +224,65 @@ HELP: stream-copy
 { $description "Copies the contents of one stream into another, closing both streams when done." } 
 $io-error ;
 
-HELP: stdio
-{ $var-description "Holds a stream, used for various implicit stream operations. Rebound using " { $link with-stream } " and " { $link with-stream* } "." } ;
+HELP: input-stream
+{ $var-description "Holds an input stream for various implicit stream operations. Rebound using " { $link with-input-stream } " and " { $link with-input-stream* } "." } ;
+
+HELP: output-stream
+{ $var-description "Holds an output stream for various implicit stream operations. Rebound using " { $link with-output-stream } " and " { $link with-output-stream* } "." } ;
 
 HELP: readln
 { $values { "str/f" "a string or " { $link f } } }
-{ $description "Reads a line of input from the " { $link stdio } " stream. Outputs " { $link f } " on stream exhaustion." }
+{ $description "Reads a line of input from " { $link input-stream } ". Outputs " { $link f } " on stream exhaustion." }
 $io-error ;
 
 HELP: read1
 { $values { "ch/f" "a character or " { $link f } } }
-{ $description "Reads a character of input from the " { $link stdio } " stream. Outputs " { $link f } " on stream exhaustion." }
+{ $description "Reads a character of input from " { $link input-stream } ". Outputs " { $link f } " on stream exhaustion." }
 $io-error ;
 
 HELP: read
 { $values { "n" "a non-negative integer" } { "str/f" "a string or " { $link f } } }
-{ $description "Reads " { $snippet "n" } " characters of input from the " { $link stdio } " stream. Outputs a truncated string or " { $link f } " on stream exhaustion." }
+{ $description "Reads " { $snippet "n" } " characters of input from " { $link input-stream } ". Outputs a truncated string or " { $link f } " on stream exhaustion." }
 $io-error ;
 
 HELP: read-until
 { $values { "seps" string } { "str/f" "a string or " { $link f } } { "sep/f" "a character or " { $link f } } }
-{ $contract "Reads characters from the " { $link stdio } " stream. until the first occurrence of a separator character, or stream exhaustion. In the former case, the separator character is pushed on the stack, and is not part of the output string. In the latter case, the entire stream contents are output, along with " { $link f } "." }
+{ $contract "Reads characters from " { $link input-stream } ". until the first occurrence of a separator character, or stream exhaustion. In the former case, the separator character is pushed on the stack, and is not part of the output string. In the latter case, the entire stream contents are output, along with " { $link f } "." }
 $io-error ;
 
 HELP: write1
 { $values { "ch" "a character" } }
-{ $contract "Writes a character of output to the " { $link stdio } " stream. If the stream does buffering, output may not be performed immediately; use " { $link flush } " to force output." }
+{ $contract "Writes a character of output to " { $link output-stream } ". If the stream does buffering, output may not be performed immediately; use " { $link flush } " to force output." }
 $io-error ;
 
 HELP: write
 { $values { "str" string } }
-{ $description "Writes a string of output to the " { $link stdio } " stream. If the stream does buffering, output may not be performed immediately; use " { $link flush } " to force output." }
+{ $description "Writes a string of output to " { $link output-stream } ". If the stream does buffering, output may not be performed immediately; use " { $link flush } " to force output." }
 $io-error ;
 
 HELP: flush
-{ $description "Waits for any pending output to the " { $link stdio } " stream to complete." }
+{ $description "Waits for any pending output on " { $link output-stream } " to complete." }
 $io-error ;
 
 HELP: nl
-{ $description "Writes a line terminator to the " { $link stdio } " stream. If the stream does buffering, output may not be performed immediately; use " { $link flush } " to force output." }
+{ $description "Writes a line terminator to " { $link output-stream } ". If the stream does buffering, output may not be performed immediately; use " { $link flush } " to force output." }
 $io-error ;
 
 HELP: format
 { $values { "str" string } { "style" "a hashtable" } }
-{ $description "Writes formatted text to the " { $link stdio } " stream. If the stream does buffering, output may not be performed immediately; use " { $link flush } " to force output." }
+{ $description "Writes formatted text to " { $link output-stream } ". If the stream does buffering, output may not be performed immediately; use " { $link flush } " to force output." }
 { $notes "Details are in the documentation for " { $link stream-format } "." }
 $io-error ;
 
 HELP: with-nesting
-{ $values { "style" "a hashtable" } { "quot" "a quotation" } }
-{ $description "Calls the quotation in a new dynamic scope with the " { $link stdio } " stream rebound to a nested paragraph stream, with formatting information applied." }
+{ $values { "style" "a hashtable" } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope with " { $link output-stream } " rebound to a nested paragraph stream, with formatting information applied." }
 { $notes "Details are in the documentation for " { $link make-block-stream } "." }
 $io-error ;
 
 HELP: tabular-output
 { $values { "style" "a hashtable" } { "quot" quotation } }
-{ $description "Calls a quotation which emits a series of equal-length table rows using " { $link with-row } ". The results are laid out in a tabular fashion on the " { $link stdio } " stream."
+{ $description "Calls a quotation which emits a series of equal-length table rows using " { $link with-row } ". The results are laid out in a tabular fashion on " { $link output-stream } "."
 $nl
 "The " { $snippet "style" } " hashtable holds table style information. See " { $link "table-styles" } "." }
 { $examples
@@ -279,7 +302,7 @@ $io-error ;
 
 HELP: with-cell
 { $values { "quot" quotation } }
-{ $description "Calls a quotation in a new scope with the " { $link stdio } " stream rebound. Output performed by the quotation is displayed in a table cell. This word can only be called inside the quotation given to " { $link with-row } "." }
+{ $description "Calls a quotation in a new scope with " { $link output-stream } " rebound. Output performed by the quotation is displayed in a table cell. This word can only be called inside the quotation given to " { $link with-row } "." }
 $io-error ;
 
 HELP: write-cell
@@ -288,34 +311,54 @@ HELP: write-cell
 $io-error ;
 
 HELP: with-style
-{ $values { "style" "a hashtable" } { "quot" "a quotation" } }
+{ $values { "style" "a hashtable" } { "quot" quotation } }
 { $description "Calls the quotation in a new dynamic scope where calls to " { $link write } ", " { $link format } " and other stream output words automatically inherit style settings from " { $snippet "style" } "." }
 { $notes "Details are in the documentation for " { $link make-span-stream } "." }
 $io-error ;
 
 HELP: print
 { $values { "string" string } }
-{ $description "Writes a newline-terminated string to the " { $link stdio } " stream." }
+{ $description "Writes a newline-terminated string to " { $link output-stream } "." }
 $io-error ;
 
-HELP: with-stream
-{ $values { "stream" "an input or output stream" } { "quot" "a quotation" } }
-{ $description "Calls the quotation in a new dynamic scope, with the " { $link stdio } " variable rebound to  " { $snippet "stream" } ". The stream is closed if the quotation returns or throws an error." } ;
+HELP: with-input-stream
+{ $values { "stream" "an input stream" } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope, with " { $link input-stream } " rebound to  " { $snippet "stream" } ". The stream is closed if the quotation returns or throws an error." } ;
+
+HELP: with-output-stream
+{ $values { "stream" "an output stream" } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope, with " { $link output-stream } " rebound to  " { $snippet "stream" } ". The stream is closed if the quotation returns or throws an error." } ;
+
+HELP: with-streams
+{ $values { "input" "an input stream" } { "output" "an output stream" } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope, with " { $link input-stream } " rebound to  " { $snippet "input" } " and " { $link output-stream } " rebound to  " { $snippet "output" } ". The stream is closed if the quotation returns or throws an error." } ;
+
+HELP: with-streams*
+{ $values { "input" "an input stream" } { "output" "an output stream" } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope, with " { $link input-stream } " rebound to  " { $snippet "input" } " and " { $link output-stream } " rebound to  " { $snippet "output" } "." }
+{ $notes "This word does not close the stream. Compare with " { $link with-streams } "." } ;
+
+{ with-input-stream with-input-stream* } related-words
+
+{ with-output-stream with-output-stream* } related-words
 
-{ with-stream with-stream* } related-words
+HELP: with-input-stream*
+{ $values { "stream" "an input stream" } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope, with " { $link input-stream } " rebound to  " { $snippet "stream" } "." }
+{ $notes "This word does not close the stream. Compare with " { $link with-input-stream } "." } ;
 
-HELP: with-stream*
-{ $values { "stream" "an input or output stream" } { "quot" "a quotation" } }
-{ $description "Calls the quotation in a new dynamic scope, with the " { $link stdio } " variable rebound to  " { $snippet "stream" } "." }
-{ $notes "This word does not close the stream. Compare with " { $link with-stream } "." } ;
+HELP: with-output-stream*
+{ $values { "stream" "an output stream" } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope, with " { $link output-stream } " rebound to  " { $snippet "stream" } "." }
+{ $notes "This word does not close the stream. Compare with " { $link with-output-stream } "." } ;
 
 HELP: bl
-{ $description "Outputs a space character (" { $snippet "\" \"" } ")." }
+{ $description "Outputs a space character (" { $snippet "\" \"" } ") to " { $link output-stream } "." }
 $io-error ;
 
 HELP: write-object
 { $values { "str" string } { "obj" "an object" } }
-{ $description "Writes a string to the " { $link stdio } " stream, associating it with the object. If formatted output is supported, the string will become a clickable presentation of the object, otherwise this word behaves like a call to " { $link write } "." }
+{ $description "Writes a string to " { $link output-stream } ", associating it with the object. If formatted output is supported, the string will become a clickable presentation of the object, otherwise this word behaves like a call to " { $link write } "." }
 $io-error ;
 
 HELP: lines
index b7d1cf81c875567381ec16ec595d0bd33cfb5227..50a798d290e2b6d6fe9e691b942e338818b1dac9 100755 (executable)
@@ -8,21 +8,18 @@ IN: io.tests
     "foo" "io.tests" lookup
 ] unit-test
 
-: <resource-reader> ( resource -- stream )
-    resource-path latin1 <file-reader> ;
-
 [
     "This is a line.\rThis is another line.\r"
 ] [
-    "core/io/test/mac-os-eol.txt" <resource-reader>
-    [ 500 read ] with-stream
+    "resource:core/io/test/mac-os-eol.txt" latin1 <file-reader>
+    [ 500 read ] with-input-stream
 ] unit-test
 
 [
     255
 ] [
-    "core/io/test/binary.txt" <resource-reader>
-    [ read1 ] with-stream >fixnum
+    "resource:core/io/test/binary.txt" latin1 <file-reader>
+    [ read1 ] with-input-stream >fixnum
 ] unit-test
 
 ! Make sure we use correct to_c_string form when writing
@@ -36,11 +33,12 @@ IN: io.tests
     }
 ] [
     [
-        "core/io/test/separator-test.txt" <resource-reader> [
+        "resource:core/io/test/separator-test.txt"
+        latin1 <file-reader> [
             "J" read-until 2array ,
             "i" read-until 2array ,
             "X" read-until 2array ,
-        ] with-stream
+        ] with-input-stream
     ] { } make
 ] unit-test
 
@@ -49,12 +47,3 @@ IN: io.tests
         10 [ 65536 read drop ] times
     ] with-file-reader
 ] unit-test
-
-! [ "" ] [ 0 read ] unit-test
-
-! [ ] [ "123" write 9000 CHAR: x <string> write flush ] unit-test
-
-! [
-!     "/core/io/test/binary.txt" <resource-reader>
-!     [ 0.2 read ] with-stream
-! ] must-fail
index ef9eae790286118ace704db838437566f2cc4594..e28fd28fb399e4828d1f662cfa185de91eb9b666 100755 (executable)
@@ -30,39 +30,52 @@ GENERIC: stream-write-table ( table-cells style stream -- )
     [ 2dup (stream-copy) ] [ dispose dispose ] [ ]
     cleanup ;
 
-! Default stream
-SYMBOL: stdio
+! Default streams
+SYMBOL: input-stream
+SYMBOL: output-stream
+SYMBOL: error-stream
 
-! Default error stream
-SYMBOL: stderr
+: readln ( -- str/f ) input-stream get stream-readln ;
+: read1 ( -- ch/f ) input-stream get stream-read1 ;
+: read ( n -- str/f ) input-stream get stream-read ;
+: read-until ( seps -- str/f sep/f ) input-stream get stream-read-until ;
 
-: readln ( -- str/f ) stdio get stream-readln ;
-: read1 ( -- ch/f ) stdio get stream-read1 ;
-: read ( n -- str/f ) stdio get stream-read ;
-: read-until ( seps -- str/f sep/f ) stdio get stream-read-until ;
+: write1 ( ch -- ) output-stream get stream-write1 ;
+: write ( str -- ) output-stream get stream-write ;
+: flush ( -- ) output-stream get stream-flush ;
 
-: write1 ( ch -- ) stdio get stream-write1 ;
-: write ( str -- ) stdio get stream-write ;
-: flush ( -- ) stdio get stream-flush ;
+: nl ( -- ) output-stream get stream-nl ;
+: format ( str style -- ) output-stream get stream-format ;
 
-: nl ( -- ) stdio get stream-nl ;
-: format ( str style -- ) stdio get stream-format ;
+: with-input-stream* ( stream quot -- )
+    input-stream swap with-variable ; inline
 
-: with-stream* ( stream quot -- )
-    stdio swap with-variable ; inline
+: with-input-stream ( stream quot -- )
+    [ with-input-stream* ] curry with-disposal ; inline
 
-: with-stream ( stream quot -- )
-    [ with-stream* ] curry with-disposal ; inline
+: with-output-stream* ( stream quot -- )
+    output-stream swap with-variable ; inline
+
+: with-output-stream ( stream quot -- )
+    [ with-output-stream* ] curry with-disposal ; inline
+
+: with-streams* ( input output quot -- )
+    [ output-stream set input-stream set ] prepose with-scope ; inline
+
+: with-streams ( input output quot -- )
+    [ [ with-streams* ] 3curry ]
+    [ [ drop dispose dispose ] 3curry ] 3bi
+    [ ] cleanup ; inline
 
 : tabular-output ( style quot -- )
-    swap >r { } make r> stdio get stream-write-table ; inline
+    swap >r { } make r> output-stream get stream-write-table ; inline
 
 : with-row ( quot -- )
     { } make , ; inline
 
 : with-cell ( quot -- )
-    H{ } stdio get make-cell-stream
-    [ swap with-stream ] keep , ; inline
+    H{ } output-stream get make-cell-stream
+    [ swap with-output-stream ] keep , ; inline
 
 : write-cell ( str -- )
     [ write ] with-cell ; inline
@@ -71,13 +84,14 @@ SYMBOL: stderr
     swap dup assoc-empty? [
         drop call
     ] [
-        stdio get make-span-stream swap with-stream
+        output-stream get make-span-stream swap with-output-stream
     ] if ; inline
 
 : with-nesting ( style quot -- )
-    >r stdio get make-block-stream r> with-stream ; inline
+    >r output-stream get make-block-stream
+    r> with-output-stream ; inline
 
-: print ( string -- ) stdio get stream-print ;
+: print ( string -- ) output-stream get stream-print ;
 
 : bl ( -- ) " " write ;
 
@@ -85,9 +99,9 @@ SYMBOL: stderr
     presented associate format ;
 
 : lines ( stream -- seq )
-    [ [ readln dup ] [ ] [ drop ] unfold ] with-stream ;
+    [ [ readln dup ] [ ] [ drop ] unfold ] with-input-stream ;
 
 : contents ( stream -- str )
     [
         [ 65536 read dup ] [ ] [ drop ] unfold concat f like
-    ] with-stream  ;
+    ] with-input-stream ;
index 741725af41f4c94d04d584aeef62c2caca2f3b28..7b276213437770bee91e8a05612f67a2997efb53 100644 (file)
@@ -25,10 +25,10 @@ HELP: <byte-writer>
 HELP: with-byte-reader
 { $values { "encoding" "an encoding descriptor" }
     { "quot" quotation } { "byte-array" byte-array } }
-{ $description "Calls the quotation in a new dynamic scope with " { $link stdio } " rebound to an input stream for reading from a byte array using an encoding." } ;
+{ $description "Calls the quotation in a new dynamic scope with " { $link input-stream } " rebound to an input stream for reading from a byte array using an encoding." } ;
 
 HELP: with-byte-writer
 { $values  { "encoding" "an encoding descriptor" }
     { "quot" quotation }
     { "byte-array" byte-array } }
-{ $description "Calls the quotation in a new dynamic scope with " { $link stdio } " rebound to an output stream writing data to a byte array using an encoding." } ;
+{ $description "Calls the quotation in a new dynamic scope with " { $link output-stream } " rebound to an output stream writing data to a byte array using an encoding." } ;
index 2a8441ff23d6894fc6df312862603969740ccf1f..28d789d66f1ee514e070746c74d422c9307e412c 100644 (file)
@@ -1,16 +1,16 @@
 USING: byte-arrays byte-vectors kernel io.encodings io.streams.string
-sequences io namespaces io.encodings.private ;
+sequences io namespaces io.encodings.private accessors ;
 IN: io.streams.byte-array
 
 : <byte-writer> ( encoding -- stream )
     512 <byte-vector> swap <encoder> ;
 
 : with-byte-writer ( encoding quot -- byte-array )
-    >r <byte-writer> r> [ stdio get ] compose with-stream*
-    dup encoder? [ encoder-stream ] when >byte-array ; inline
+    >r <byte-writer> r> [ output-stream get ] compose with-output-stream*
+    dup encoder? [ stream>> ] when >byte-array ; inline
 
 : <byte-reader> ( byte-array encoding -- stream )
     >r >byte-vector dup reverse-here r> <decoder> ;
 
 : with-byte-reader ( byte-array encoding quot -- )
-    >r <byte-reader> r> with-stream ; inline
+    >r <byte-reader> r> with-input-stream* ; inline
index 372acbe0c1e2ebfa418009457ef1ffac042bdce2..91732f3211b9f1739a26ce30c632b3509c742570 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel kernel.private namespaces io io.encodings
 sequences math generic threads.private classes io.backend
-io.streams.duplex io.files continuations byte-arrays ;
+io.files continuations byte-arrays ;
 IN: io.streams.c
 
 TUPLE: c-writer handle ;
diff --git a/core/io/streams/duplex/authors.txt b/core/io/streams/duplex/authors.txt
deleted file mode 100644 (file)
index 1901f27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Slava Pestov
diff --git a/core/io/streams/duplex/duplex-docs.factor b/core/io/streams/duplex/duplex-docs.factor
deleted file mode 100755 (executable)
index c9691af..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-USING: help.markup help.syntax io continuations ;
-IN: io.streams.duplex
-
-ARTICLE: "io.streams.duplex" "Duplex streams"
-"Duplex streams combine an input stream and an output stream into a bidirectional stream."
-{ $subsection duplex-stream }
-{ $subsection <duplex-stream> } ;
-
-ABOUT: "io.streams.duplex"
-
-HELP: duplex-stream
-{ $class-description "A bidirectional stream wrapping an input and output stream." } ;
-
-HELP: <duplex-stream>
-{ $values { "in" "an input stream" } { "out" "an output stream" } { "stream" " a duplex stream" } }
-{ $description "Creates a duplex stream. Writing to a duplex stream will write to " { $snippet "out" } ", and reading from a duplex stream will read from " { $snippet "in" } ". Closing a duplex stream closes both the input and output streams." } ;
-
-HELP: stream-closed-twice
-{ $error-description "This error is thrown when performing an I/O operation on a " { $link duplex-stream } " which has been closed with " { $link dispose } "." } ;
diff --git a/core/io/streams/duplex/duplex-tests.factor b/core/io/streams/duplex/duplex-tests.factor
deleted file mode 100755 (executable)
index ebc6b3b..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-USING: io.streams.duplex io kernel continuations tools.test ;
-IN: io.streams.duplex.tests
-
-! Test duplex stream close behavior
-TUPLE: closing-stream closed? ;
-
-: <closing-stream> closing-stream new ;
-
-M: closing-stream dispose
-    dup closing-stream-closed? [
-        "Closing twice!" throw
-    ] [
-        t swap set-closing-stream-closed?
-    ] if ;
-
-TUPLE: unclosable-stream ;
-
-: <unclosable-stream> unclosable-stream new ;
-
-M: unclosable-stream dispose
-    "Can't close me!" throw ;
-
-[ ] [
-    <closing-stream> <closing-stream> <duplex-stream>
-    dup dispose dispose
-] unit-test
-
-[ t ] [
-    <unclosable-stream> <closing-stream> [
-        <duplex-stream>
-        [ dup dispose ] [ 2drop ] recover
-    ] keep closing-stream-closed?
-] unit-test
-
-[ t ] [
-    <closing-stream> [ <unclosable-stream>
-        <duplex-stream>
-        [ dup dispose ] [ 2drop ] recover
-    ] keep closing-stream-closed?
-] unit-test
diff --git a/core/io/streams/duplex/duplex.factor b/core/io/streams/duplex/duplex.factor
deleted file mode 100755 (executable)
index 40f0cb6..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-! Copyright (C) 2005, 2008 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: kernel continuations io accessors ;
-IN: io.streams.duplex
-
-! We ensure that the stream can only be closed once, to preserve
-! integrity of duplex I/O ports.
-
-TUPLE: duplex-stream in out closed ;
-
-: <duplex-stream> ( in out -- stream )
-    f duplex-stream boa ;
-
-ERROR: stream-closed-twice ;
-
-<PRIVATE
-
-: check-closed ( stream -- stream )
-    dup closed>> [ stream-closed-twice ] when ; inline
-
-: in ( duplex -- stream ) check-closed in>> ;
-
-: out ( duplex -- stream ) check-closed out>> ;
-
-PRIVATE>
-
-M: duplex-stream stream-flush
-    out stream-flush ;
-
-M: duplex-stream stream-readln
-    in stream-readln ;
-
-M: duplex-stream stream-read1
-    in stream-read1 ;
-
-M: duplex-stream stream-read-until
-    in stream-read-until ;
-
-M: duplex-stream stream-read-partial
-    in stream-read-partial ;
-
-M: duplex-stream stream-read
-    in stream-read ;
-
-M: duplex-stream stream-write1
-    out stream-write1 ;
-
-M: duplex-stream stream-write
-    out stream-write ;
-
-M: duplex-stream stream-nl
-    out stream-nl ;
-
-M: duplex-stream stream-format
-    out stream-format ;
-
-M: duplex-stream make-span-stream
-    out make-span-stream ;
-
-M: duplex-stream make-block-stream
-    out make-block-stream ;
-
-M: duplex-stream make-cell-stream
-    out make-cell-stream ;
-
-M: duplex-stream stream-write-table
-    out stream-write-table ;
-
-M: duplex-stream dispose
-    #! The output stream is closed first, in case both streams
-    #! are attached to the same file descriptor, the output
-    #! buffer needs to be flushed before we close the fd.
-    dup closed>> [
-        t >>closed
-        [ dup out>> dispose ]
-        [ dup in>> dispose ] [ ] cleanup
-    ] unless drop ;
diff --git a/core/io/streams/duplex/summary.txt b/core/io/streams/duplex/summary.txt
deleted file mode 100644 (file)
index b15d3aa..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Combine an input and an output stream into a single duplex stream
index 5b09baa56d06e10f37a5543272b9cb45156d4010..b87e5ca59139838bc0cf9a0316191953e3658060 100644 (file)
@@ -17,7 +17,7 @@ HELP: <string-writer>
 
 HELP: with-string-writer
 { $values { "quot" quotation } { "str" string } }
-{ $description "Calls the quotation in a new dynamic scope with " { $link stdio } " rebound to a new string writer. The accumulated string is output when the quotation returns." } ;
+{ $description "Calls the quotation in a new dynamic scope with " { $link output-stream } " rebound to a new string writer. The accumulated string is output when the quotation returns." } ;
 
 HELP: <string-reader>
 { $values { "str" string } { "stream" "an input stream" } }
@@ -26,4 +26,4 @@ HELP: <string-reader>
 
 HELP: with-string-reader
 { $values { "str" string } { "quot" quotation } }
-{ $description "Calls the quotation in a new dynamic scope with " { $link stdio } " rebound to an input stream reading " { $snippet "str" } " from beginning to end." } ;
+{ $description "Calls the quotation in a new dynamic scope with " { $link input-stream } " rebound to an input stream reading " { $snippet "str" } " from beginning to end." } ;
index ca117534da460783c0ac760030998278204ec1a1..3512ac871db8010701cb59f1254707e3eeab0e48 100644 (file)
@@ -35,7 +35,7 @@ unit-test
             "J" read-until 2array ,
             "i" read-until 2array ,
             "X" read-until 2array ,
-        ] with-stream
+        ] with-input-stream
     ] { } make
 ] unit-test
 
index b7ff37a97190bb4d65ed1930edfd4e79c0fe1b13..d43599776b6ee62c761075c767a499e77a85232d 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io kernel math namespaces sequences sbufs strings
 generic splitting growable continuations io.streams.plain
-io.encodings io.encodings.private ;
+io.encodings io.encodings.private math.order ;
 IN: io.streams.string
 
 M: growable dispose drop ;
@@ -15,7 +15,7 @@ M: growable stream-flush drop ;
     512 <sbuf> ;
 
 : with-string-writer ( quot -- str )
-    <string-writer> swap [ stdio get ] compose with-stream*
+    <string-writer> swap [ output-stream get ] compose with-output-stream*
     >string ; inline
 
 M: growable stream-read1 dup empty? [ drop f ] [ pop ] if ;
@@ -56,7 +56,7 @@ M: null decode-char drop stream-read1 ;
     >sbuf dup reverse-here null <decoder> ;
 
 : with-string-reader ( str quot -- )
-    >r <string-reader> r> with-stream ; inline
+    >r <string-reader> r> with-input-stream ; inline
 
 INSTANCE: growable plain-writer
 
@@ -67,15 +67,14 @@ INSTANCE: growable plain-writer
     ] unless ;
 
 : map-last ( seq quot -- seq )
-    swap dup length <reversed>
-    [ zero? rot [ call ] keep swap ] 2map nip ; inline
+    >r dup length <reversed> [ zero? ] r> compose 2map ; inline
 
 : format-table ( table -- seq )
     flip [ format-column ] map-last
     flip [ " " join ] map ;
 
 M: plain-writer stream-write-table
-    [ drop format-table [ print ] each ] with-stream* ;
+    [ drop format-table [ print ] each ] with-output-stream* ;
 
 M: plain-writer make-cell-stream 2drop <string-writer> ;
 
index 4578e2a93fef465045d012d1742021030de3139a..0ef8919713eafc3117ee9c5f2058dffec7907b0e 100755 (executable)
@@ -1,7 +1,7 @@
 USING: generic help.markup help.syntax math memory
-namespaces sequences kernel.private layouts sorting classes
+namespaces sequences kernel.private layouts classes
 kernel.private vectors combinators quotations strings words
-assocs arrays ;
+assocs arrays math.order ;
 IN: kernel
 
 ARTICLE: "shuffle-words" "Shuffle words"
@@ -241,7 +241,7 @@ ARTICLE: "conditionals" "Conditionals and logic"
 "See " { $link "combinators" } " for forms which abstract away common patterns involving multiple nested branches."
 { $see-also "booleans" "bitwise-arithmetic" both? either? } ;
 
-ARTICLE: "equality" "Equality and comparison testing"
+ARTICLE: "equality" "Equality"
 "There are two distinct notions of ``sameness'' when it comes to objects. You can test if two references point to the same object (" { $emphasis "identity comparison" } "), or you can test if two objects are equal in a domain-specific sense, usually by being instances of the same class, and having equal slot values (" { $emphasis "value comparison" } "). Both notions of equality are equality relations in the mathematical sense."
 $nl
 "Identity comparison:"
@@ -250,15 +250,8 @@ $nl
 { $subsection = }
 "Custom value comparison methods:"
 { $subsection equal? }
+"Utility class:"
 { $subsection identity-tuple }
-"Some types of objects also have an intrinsic order allowing sorting using " { $link natural-sort } ":"
-{ $subsection <=> }
-{ $subsection compare }
-"Utilities for comparing objects:"
-{ $subsection after? }
-{ $subsection before? }
-{ $subsection after=? }
-{ $subsection before=? }
 "An object can be cloned; the clone has distinct identity but equal value:"
 { $subsection clone } ;
 
@@ -393,29 +386,6 @@ HELP: identity-tuple
     { $unchecked-example "T{ foo } dup clone = ." "f" }
 } ;
 
-HELP: <=>
-{ $values { "obj1" object } { "obj2" object } { "n" real } }
-{ $contract
-    "Compares two objects using an intrinsic total order, for example, the natural order for real numbers and lexicographic order for strings."
-    $nl
-    "The output value is one of the following:"
-    { $list
-        { "positive - indicating that " { $snippet "obj1" } " follows " { $snippet "obj2" } }
-        { "zero - indicating that " { $snippet "obj1" } " is equal to " { $snippet "obj2" } }
-        { "negative - indicating that " { $snippet "obj1" } " precedes " { $snippet "obj2" } }
-    }
-    "The default implementation treats the two objects as sequences, and recursively compares their elements. So no extra work is required to compare sequences lexicographically."
-} ;
-
-{ <=> compare natural-sort sort-keys sort-values } related-words
-
-HELP: compare
-{ $values { "obj1" object } { "obj2" object } { "quot" "a quotation with stack effect " { $snippet "( obj -- newobj )" } } { "n" integer } }
-{ $description "Compares the results of applying the quotation to both objects via " { $link <=> } "." }
-{ $examples
-    { $example "USING: kernel prettyprint sequences ;" "\"hello\" \"hi\" [ length ] compare ." "3" }
-} ;
-
 HELP: clone
 { $values { "obj" object } { "cloned" "a new object" } }
 { $contract "Outputs a new object equal to the given object. This is not guaranteed to actually copy the object; it does nothing with immutable objects, and does not copy words either. However, sequences and tuples can be cloned to obtain a shallow copy of the original." } ;
index 95f0d60720fb124d1209f8a8328346f45e061102..a72e25b9e0ca215e8492c8a27dd69c95fe7128a9 100755 (executable)
@@ -133,8 +133,6 @@ M: identity-tuple equal? 2drop f ;
 : = ( obj1 obj2 -- ? )
     2dup eq? [ 2drop t ] [ equal? ] if ; inline
 
-GENERIC: <=> ( obj1 obj2 -- n )
-
 GENERIC: clone ( obj -- cloned )
 
 M: object clone ;
@@ -158,6 +156,9 @@ M: callstack clone (clone) ;
 : with ( param obj quot -- obj curry )
     swapd [ swapd call ] 2curry ; inline
 
+: prepose ( quot1 quot2 -- curry )
+    swap compose ; inline
+
 : 3compose ( quot1 quot2 quot3 -- curry )
     compose compose ; inline
 
@@ -176,8 +177,6 @@ M: callstack clone (clone) ;
 
 : either? ( x y quot -- ? ) bi@ or ; inline
 
-: compare ( obj1 obj2 quot -- n ) bi@ <=> ; inline
-
 : most ( x y quot -- z )
     >r 2dup r> call [ drop ] [ nip ] if ; inline
 
index 879862c926de70c9f4e6145708ba2551a0276444..19fe03202c907604a6eddac56eafd8a787a54db6 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: namespaces math words kernel assocs classes
-kernel.private ;
+math.order kernel.private ;
 IN: layouts
 
 SYMBOL: tag-mask
index 755c79ac6884fca4ea21e5cf6b1937b43307070c..beea9005b4c440d1f63e47fcdf83f2cdbcd12bdf 100755 (executable)
@@ -32,14 +32,14 @@ HELP: listener-hook
 
 HELP: read-quot
 { $values { "quot/f" "a parsed quotation, or " { $link f } " indicating end of file" } }
-{ $description "Reads a Factor expression which possibly spans more than one line from " { $link stdio } " stream. Additional lines of input are read while the parser stack height is greater than one. Since structural parsing words push partial quotations on the stack, this will keep on reading input until all delimited parsing words are terminated." } ;
+{ $description "Reads a Factor expression which possibly spans more than one line from " { $link input-stream } ". Additional lines of input are read while the parser stack height is greater than one. Since structural parsing words push partial quotations on the stack, this will keep on reading input until all delimited parsing words are terminated." } ;
 
 HELP: listen
-{ $description "Prompts for an expression on the " { $link stdio } " stream and evaluates it. On end of file, " { $link quit-flag } " is set to terminate the listener loop." }
-{ $errors "If the expression input by the user throws an error, the error is printed to the " { $link stdio } " stream and the word returns normally." } ;
+{ $description "Prompts for an expression on " { $link input-stream } " and evaluates it. On end of file, " { $link quit-flag } " is set to terminate the listener loop." }
+{ $errors "If the expression input by the user throws an error, the error is printed to " { $link output-stream } " and the word returns normally." } ;
 
 HELP: listener
-{ $description "Prompts for expressions on the " { $link stdio } " stream and evaluates them until end of file is reached." } ;
+{ $description "Prompts for expressions on " { $link input-stream } " and evaluates them until end of file is reached." } ;
 
 HELP: bye
 { $description "Exits the current listener." }
index 2c05c049a77d0b1398d0113bcfe62126765cba08..24449049e02fbf706a7c4bf25c11226a7a575220 100755 (executable)
@@ -51,6 +51,6 @@ IN: listener.tests
 [
     [ ] [
         "IN: listener.tests : hello\n\"world\" ;" parse-interactive
-    drop
+        drop
     ] unit-test
 ] with-file-vocabs
index ddb29bb7686ddfa10ae5731b37b763027304f0c7..e00e64f4bcfc7e0f0d656747760bb687071eb86e 100755 (executable)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays hashtables io kernel math math.parser memory
 namespaces parser sequences strings io.styles
-io.streams.duplex vectors words generic system combinators
-continuations debugger definitions compiler.units accessors ;
+vectors words generic system combinators continuations debugger
+definitions compiler.units accessors ;
 IN: listener
 
 SYMBOL: quit-flag
@@ -35,10 +35,7 @@ GENERIC: stream-read-quot ( stream -- quot/f )
 M: object stream-read-quot
     V{ } clone read-quot-loop ;
 
-M: duplex-stream stream-read-quot
-    duplex-stream-in stream-read-quot ;
-
-: read-quot ( -- quot/f ) stdio get stream-read-quot ;
+: read-quot ( -- quot/f ) input-stream get stream-read-quot ;
 
 : bye ( -- ) quit-flag on ;
 
@@ -46,9 +43,13 @@ M: duplex-stream stream-read-quot
     "( " in get " )" 3append
     H{ { background { 1 0.7 0.7 1 } } } format bl flush ;
 
+SYMBOL: error-hook
+
+[ print-error-and-restarts ] error-hook set-global
+
 : listen ( -- )
     listener-hook get call prompt.
-    [ read-quot [ try ] [ bye ] if* ]
+    [ read-quot [ [ error-hook get call ] recover ] [ bye ] if* ]
     [
         dup parse-error? [
             error-hook get call
index 30abd9cad67ecfec2407d13a923564d61622562e..5cd6f067a9b5a0c16a23ac4b182de9a75735f94e 100755 (executable)
@@ -6,8 +6,6 @@ IN: math.floats.private
 M: fixnum >float fixnum>float ;
 M: bignum >float bignum>float ;
 
-M: float zero? dup 0.0 float= swap -0.0 float= or ;
-
 M: float >fixnum float>fixnum ;
 M: float >bignum float>bignum ;
 M: float >float ;
@@ -22,4 +20,7 @@ M: float + float+ ;
 M: float - float- ;
 M: float * float* ;
 M: float / float/f ;
+M: float /f float/f ;
 M: float mod float-mod ;
+
+M: real abs dup 0 < [ neg ] when ;
index fe8e5bddc8c4b049bbe93a19f4a35feb50341fca..db50d262ad66d222e98c0466245a2d4ac02f5f93 100755 (executable)
@@ -1,5 +1,5 @@
-USING: kernel math namespaces prettyprint
-math.private continuations tools.test sequences ;
+USING: kernel math math.functions namespaces prettyprint
+math.private continuations tools.test sequences random ;
 IN: math.integers.tests
 
 [ "-8" ] [ -8 unparse ] unit-test
@@ -191,3 +191,31 @@ unit-test
 [ f ] [ -128 power-of-2? ] unit-test
 [ f ] [ 0 power-of-2? ] unit-test
 [ t ] [ 1 power-of-2? ] unit-test
+
+: ratio>float [ >bignum ] bi@ /f ;
+
+[ 5. ] [ 5 1 ratio>float ] unit-test
+[ 4. ] [ 4 1 ratio>float ] unit-test
+[ 2. ] [ 2 1 ratio>float ] unit-test
+[ .5 ] [ 1 2 ratio>float ] unit-test
+[ .75 ] [ 3 4 ratio>float ] unit-test
+[ 1. ] [ 2000 2^ 2000 2^ 1+ ratio>float ] unit-test
+[ -1. ] [ 2000 2^ neg 2000 2^ 1+ ratio>float ] unit-test
+[ 0.4 ] [ 6 15 ratio>float ] unit-test
+
+[ HEX: 3fe553522d230931 ]
+[ 61967020039 92984792073 ratio>float double>bits ] unit-test
+
+: random-integer
+    32 random-bits
+    1 random zero? [ neg ] when
+    1 random zero? [ >bignum ] when ;
+
+[ t ] [
+    1000 [
+        drop
+        random-integer
+        random-integer
+        [ >float / ] [ /f ] 2bi 0.1 ~
+    ] all?
+] unit-test
index 70a6d2e087a0d5b81e64bfe6f51dfbad2b55ac69..6563a1cd11745fe0a5041ca2a0d35b5168cf33fc 100755 (executable)
@@ -1,4 +1,5 @@
 ! Copyright (C) 2004, 2007 Slava Pestov.
+! Copyright (C) 2008, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel kernel.private sequences
 sequences.private math math.private combinators ;
@@ -22,6 +23,8 @@ M: fixnum + fixnum+ ;
 M: fixnum - fixnum- ;
 M: fixnum * fixnum* ;
 M: fixnum /i fixnum/i ;
+M: fixnum /f >r >float r> >float float/f ;
+
 M: fixnum mod fixnum-mod ;
 
 M: fixnum /mod fixnum/mod ;
@@ -67,4 +70,57 @@ M: bignum bitnot bignum-bitnot ;
 M: bignum bit? bignum-bit? ;
 M: bignum (log2) bignum-log2 ;
 
-M: integer zero? 0 number= ;
+! Converting ratios to floats. Based on FLOAT-RATIO from
+! sbcl/src/code/float.lisp, which has the following license:
+
+! "The software is in the public domain and is
+! provided with absolutely no warranty."
+
+! First step: pre-scaling
+: twos ( x -- y ) dup 1- bitxor log2 ; inline
+
+: scale-denonimator ( den -- scaled-den scale' )
+    dup twos neg [ shift ] keep ; inline
+
+: pre-scale ( num den -- scale shifted-num scaled-den )
+    2dup [ log2 ] bi@ -
+    tuck [ neg 54 + shift ] [ >r scale-denonimator r> + ] 2bi*
+    -rot ; inline
+
+! Second step: loop
+: shift-mantissa ( scale mantissa -- scale' mantissa' )
+    [ 1+ ] [ 2/ ] bi* ; inline
+
+: /f-loop ( scale mantissa den -- scale' fraction-and-guard rem )
+    [ 2dup /i log2 53 > ]
+    [ >r shift-mantissa r> ]
+    [ ] while /mod ; inline
+
+! Third step: post-scaling
+: unscaled-float ( mantissa -- n )
+    52 2^ 1- bitand 1022 52 shift bitor bits>double ; inline
+
+: scale-float ( scale mantissa -- float' )
+    >r dup 0 < [ neg 2^ recip ] [ 2^ ] if r> * ; inline
+
+: post-scale ( scale mantissa -- n )
+    2/ dup log2 52 > [ shift-mantissa ] when
+    unscaled-float scale-float ; inline
+
+! Main word
+: /f-abs ( m n -- f )
+    over zero? [
+        2drop 0.0
+    ] [
+        dup zero? [
+            2drop 1.0/0.0
+        ] [
+            pre-scale
+            /f-loop over odd?
+            [ zero? [ 1+ ] unless ] [ drop ] if
+            post-scale
+        ] if
+    ] if ; inline
+
+M: bignum /f ( m n -- f )
+    [ [ abs ] bi@ /f-abs ] [ [ 0 < ] bi@ xor ] 2bi [ neg ] when ;
index 7eb20090ab0f401dafd64ea4999963178813d410..59fb0df18e8a03ef480fcd75df4ec9b08d775954 100644 (file)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax math ;
+USING: help.markup help.syntax math math.order ;
 IN: math.intervals
 
 ARTICLE: "math-intervals-new" "Creating intervals"
index 5204d7d45ac459d0b770c7f39dca085e83f02f13..ba728e67c0dcd7c42530b74962072cfd504f355a 100755 (executable)
@@ -1,5 +1,5 @@
-USING: math.intervals kernel sequences words math arrays
-prettyprint tools.test random vocabs combinators ;
+USING: math.intervals kernel sequences words math math.order
+arrays prettyprint tools.test random vocabs combinators ;
 IN: math.intervals.tests
 
 [ T{ interval f { 1 t } { 2 t } } ] [ 1 2 [a,b] ] unit-test
index 77d60e67f8cfc07e012c0c2369e92da876d8db63..324d628fd1c9e217a798e8c8d85cf484170cdaf7 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 ! Based on Slate's src/unfinished/interval.slate by Brian Rice.
-USING: kernel sequences arrays math combinators ;
+USING: kernel sequences arrays math combinators math.order ;
 IN: math.intervals
 
 TUPLE: interval from to ;
index c8a763b5f7b91dcb1d6b35ddc4fcb8305de89787..b15f09e49d44ecfd79b5365758326a242cb16e96 100755 (executable)
@@ -79,28 +79,6 @@ HELP: >=
 { $values { "x" real } { "y" real } { "?" "a boolean" } }
 { $description "Tests if " { $snippet "x" } " is greater than or equal to " { $snippet "y" } "." } ;
 
-HELP: before?
-{ $values { "obj1" "an object" } { "obj2" "an object" } { "?" "a boolean" } }
-{ $description "Tests if " { $snippet "obj1" } " comes before " { $snippet "obj2" } " using an intrinsic total order." }
-{ $notes "Implemented using " { $link <=> } "." } ;
-
-HELP: after?
-{ $values { "obj1" "an object" } { "obj2" "an object" } { "?" "a boolean" } }
-{ $description "Tests if " { $snippet "obj1" } " comes after " { $snippet "obj2" } " using an intrinsic total order." }
-{ $notes "Implemented using " { $link <=> } "." } ;
-
-HELP: before=?
-{ $values { "obj1" "an object" } { "obj2" "an object" } { "?" "a boolean" } }
-{ $description "Tests if " { $snippet "obj1" } " comes before or equals " { $snippet "obj2" } " using an intrinsic total order." }
-{ $notes "Implemented using " { $link <=> } "." } ;
-
-HELP: after=?
-{ $values { "obj1" "an object" } { "obj2" "an object" } { "?" "a boolean" } }
-{ $description "Tests if " { $snippet "obj1" } " comes after or equals " { $snippet "obj2" } " using an intrinsic total order." }
-{ $notes "Implemented using " { $link <=> } "." } ;
-
-{ before? after? before=? after=? } related-words
-
 
 HELP: +
 { $values { "x" number } { "y" number } { "z" number } }
@@ -275,19 +253,6 @@ HELP: recip
 { $description "Computes a number's multiplicative inverse." }
 { $errors "Throws an error if " { $snippet "x" } " is the integer 0." } ;
 
-HELP: max
-{ $values { "x" real } { "y" real } { "z" real } }
-{ $description "Outputs the greatest of two real numbers." } ;
-
-HELP: min
-{ $values { "x" real } { "y" real } { "z" real } }
-{ $description "Outputs the smallest of two real numbers." } ;
-
-HELP: between?
-{ $values { "x" real } { "y" real } { "z" real } { "?" "a boolean" } }
-{ $description "Tests if " { $snippet "x" } " is in the interval " { $snippet "[y,z]" } "." }
-{ $notes "As per the closed interval notation, the end-points are included in the interval." } ;
-
 HELP: rem
 { $values { "x" integer } { "y" integer } { "z" integer } }
 { $description
@@ -333,10 +298,6 @@ HELP: times
 { $description "Calls the quotation " { $snippet "n" } " times." }
 { $notes "If you need to pass the current index to the quotation, use " { $link each } "." } ;
 
-HELP: [-]
-{ $values { "x" real } { "y" real } { "z" real } }
-{ $description "Subtracts " { $snippet "y" } " from " { $snippet "x" } ". If the result is less than zero, outputs zero." } ;
-
 HELP: fp-nan?
 { $values { "x" real } { "?" "a boolean" } }
 { $description "Tests if " { $snippet "x" } " is an IEEE Not-a-Number value. While " { $snippet "x" } " can be any real number, this word will only ever yield true if " { $snippet "x" } " is a " { $link float } "." } ;
index 14cbe683519fe7566e5043114bb7d114d1bd3723..0218ded6ff61c3323318d1f8775b56698569ba1b 100755 (executable)
@@ -17,15 +17,11 @@ MATH: <= ( x y -- ? ) foldable
 MATH: >  ( x y -- ? ) foldable
 MATH: >= ( x y -- ? ) foldable
 
-: after? ( obj1 obj2 -- ? ) <=> 0 > ; inline
-: before? ( obj1 obj2 -- ? ) <=> 0 < ; inline
-: after=? ( obj1 obj2 -- ? ) <=> 0 >= ; inline
-: before=? ( obj1 obj2 -- ? ) <=> 0 <= ; inline
-
 MATH: +   ( x y -- z ) foldable
 MATH: -   ( x y -- z ) foldable
 MATH: *   ( x y -- z ) foldable
 MATH: /   ( x y -- z ) foldable
+MATH: /f  ( x y -- z ) foldable
 MATH: /i  ( x y -- z ) foldable
 MATH: mod ( x y -- z ) foldable
 
@@ -38,6 +34,8 @@ GENERIC# shift 1 ( x n -- y ) foldable
 GENERIC: bitnot ( x -- y ) foldable
 GENERIC# bit? 1 ( x n -- ? ) foldable
 
+GENERIC: abs ( x -- y ) foldable
+
 <PRIVATE
 
 GENERIC: (log2) ( x -- n ) foldable
@@ -51,33 +49,19 @@ PRIVATE>
         (log2)
     ] if ; foldable
 
-GENERIC: zero? ( x -- ? ) foldable
-
-M: object zero? drop f ;
-
+: zero? ( x -- ? ) 0 number= ; inline
 : 1+ ( x -- y ) 1 + ; inline
 : 1- ( x -- y ) 1 - ; inline
 : 2/ ( x -- y ) -1 shift ; inline
 : sq ( x -- y ) dup * ; inline
 : neg ( x -- -x ) 0 swap - ; inline
 : recip ( x -- y ) 1 swap / ; inline
+: sgn ( x -- n ) dup 0 < [ drop -1 ] [ 0 > 1 0 ? ] if ; inline
 
 : ?1+ [ 1+ ] [ 0 ] if* ; inline
 
-: /f  ( x y -- z ) >r >float r> >float float/f ; inline
-
-: max ( x y -- z ) [ > ] most ; inline
-: min ( x y -- z ) [ < ] most ; inline
-
-: between? ( x y z -- ? )
-    pick >= [ >= ] [ 2drop f ] if ; inline
-
 : rem ( x y -- z ) tuck mod over + swap mod ; foldable
 
-: sgn ( x -- n ) dup 0 < [ drop -1 ] [ 0 > 1 0 ? ] if ; inline
-
-: [-] ( x y -- z ) - 0 max ; inline
-
 : 2^ ( n -- 2^n ) 1 swap shift ; inline
 
 : even? ( n -- ? ) 1 bitand zero? ;
@@ -96,13 +80,6 @@ M: number equal? number= ;
 
 M: real hashcode* nip >fixnum ;
 
-M: real <=> - ;
-
-! real and sequence overlap. we disambiguate:
-M: integer hashcode* nip >fixnum ;
-
-M: integer <=> - ;
-
 GENERIC: fp-nan? ( x -- ? )
 
 M: object fp-nan?
@@ -161,7 +138,7 @@ PRIVATE>
     iterate-prep (each-integer) ; inline
 
 : times ( n quot -- )
-    [ drop ] swap compose each-integer ; inline
+    [ drop ] prepose each-integer ; inline
 
 : find-integer ( n quot -- i )
     iterate-prep (find-integer) ; inline
diff --git a/core/math/order/order-docs.factor b/core/math/order/order-docs.factor
new file mode 100644 (file)
index 0000000..23ea105
--- /dev/null
@@ -0,0 +1,94 @@
+USING: help.markup help.syntax kernel math quotations
+math.private words ;
+IN: math.order
+
+HELP: <=>
+{ $values { "obj1" object } { "obj2" object } { "symbol" symbol } }
+{ $contract
+    "Compares two objects using an intrinsic total order, for example, the natural order for real numbers and lexicographic order for strings."
+    $nl
+    "The output value is one of the following:"
+    { $list
+        { { $link +lt+ } " - indicating that " { $snippet "obj1" } " precedes " { $snippet "obj2" } }
+        { { $link +eq+ } " - indicating that " { $snippet "obj1" } " is equal to " { $snippet "obj2" } }
+        { { $link +gt+ } " - indicating that " { $snippet "obj1" } " follows " { $snippet "obj2" } }
+    }
+} ;
+
+HELP: +lt+
+{ $description "Returned by " { $link <=> } " when the first object is strictly less than the second object." } ;
+
+HELP: +eq+
+{ $description "Returned by " { $link <=> } " when the first object is equal to the second object." } ;
+
+HELP: +gt+
+{ $description "Returned by " { $link <=> } " when the first object is strictly greater than the second object." } ;
+
+HELP: invert-comparison
+{ $values { "symbol" symbol }
+          { "new-symbol" symbol } }
+{ $description "Invert the comparison symbol returned by " { $link <=> } ". The output for the symbol " { $snippet "+eq+" } " is itself." }
+{ $examples
+    { $example "USING: math.order prettyprint ;" "+lt+ invert-comparison ." "+gt+" } } ;
+
+HELP: compare
+{ $values { "obj1" object } { "obj2" object } { "quot" "a quotation with stack effect " { $snippet "( obj -- newobj )" } } { "symbol" "a comparison symbol, +lt+, +eq+, or +gt+" } }
+{ $description "Compares the results of applying the quotation to both objects via " { $link <=> } "." }
+{ $examples { $example "USING: kernel math.order prettyprint sequences ;" "\"hello\" \"hi\" [ length ] compare ." "+gt+" }
+} ;
+
+HELP: max
+{ $values { "x" real } { "y" real } { "z" real } }
+{ $description "Outputs the greatest of two real numbers." } ;
+
+HELP: min
+{ $values { "x" real } { "y" real } { "z" real } }
+{ $description "Outputs the smallest of two real numbers." } ;
+
+HELP: between?
+{ $values { "x" real } { "y" real } { "z" real } { "?" "a boolean" } }
+{ $description "Tests if " { $snippet "x" } " is in the interval " { $snippet "[y,z]" } "." }
+{ $notes "As per the closed interval notation, the end-points are included in the interval." } ;
+
+HELP: before?
+{ $values { "obj1" "an object" } { "obj2" "an object" } { "?" "a boolean" } }
+{ $description "Tests if " { $snippet "obj1" } " comes before " { $snippet "obj2" } " using an intrinsic total order." }
+{ $notes "Implemented using " { $link <=> } "." } ;
+
+HELP: after?
+{ $values { "obj1" "an object" } { "obj2" "an object" } { "?" "a boolean" } }
+{ $description "Tests if " { $snippet "obj1" } " comes after " { $snippet "obj2" } " using an intrinsic total order." }
+{ $notes "Implemented using " { $link <=> } "." } ;
+
+HELP: before=?
+{ $values { "obj1" "an object" } { "obj2" "an object" } { "?" "a boolean" } }
+{ $description "Tests if " { $snippet "obj1" } " comes before or equals " { $snippet "obj2" } " using an intrinsic total order." }
+{ $notes "Implemented using " { $link <=> } "." } ;
+
+HELP: after=?
+{ $values { "obj1" "an object" } { "obj2" "an object" } { "?" "a boolean" } }
+{ $description "Tests if " { $snippet "obj1" } " comes after or equals " { $snippet "obj2" } " using an intrinsic total order." }
+{ $notes "Implemented using " { $link <=> } "." } ;
+
+{ before? after? before=? after=? } related-words
+
+HELP: [-]
+{ $values { "x" real } { "y" real } { "z" real } }
+{ $description "Subtracts " { $snippet "y" } " from " { $snippet "x" } ". If the result is less than zero, outputs zero." } ;
+
+ARTICLE: "math.order" "Ordered objects"
+"Some classes have an intrinsic order amongst instances:"
+{ $subsection <=> }
+{ $subsection compare }
+{ $subsection invert-comparison }
+"The above words return one of the following symbols:"
+{ $subsection +lt+ }
+{ $subsection +eq+ }
+{ $subsection +gt+ }
+"Utilities for comparing objects:"
+{ $subsection after? }
+{ $subsection before? }
+{ $subsection after=? }
+{ $subsection before=? } ;
+
+ABOUT: "math.order"
diff --git a/core/math/order/order-tests.factor b/core/math/order/order-tests.factor
new file mode 100644 (file)
index 0000000..665537b
--- /dev/null
@@ -0,0 +1,9 @@
+USING: kernel math.order tools.test ;
+IN: math.order.tests
+
+[ +lt+ ] [ "ab" "abc" <=> ] unit-test
+[ +gt+ ] [ "abc" "ab" <=> ] unit-test
+[ +lt+ ] [ 3 4 <=> ] unit-test
+[ +eq+ ] [ 4 4 <=> ] unit-test
+[ +gt+ ] [ 4 3 <=> ] unit-test
+
diff --git a/core/math/order/order.factor b/core/math/order/order.factor
new file mode 100644 (file)
index 0000000..76fe058
--- /dev/null
@@ -0,0 +1,41 @@
+! Copyright (C) 2008 Slava Pestov, Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel math ;
+IN: math.order
+
+SYMBOL: +lt+
+SYMBOL: +eq+
+SYMBOL: +gt+
+
+: invert-comparison ( symbol -- new-symbol )
+    #! Can't use case, index or nth here
+    dup +lt+ eq? [ drop +gt+ ] [ +eq+ eq? +eq+ +lt+ ? ] if ;
+
+GENERIC: <=> ( obj1 obj2 -- symbol )
+
+M: real <=> 2dup < [ 2drop +lt+ ] [ number= +eq+ +gt+ ? ] if ;
+
+GENERIC: before? ( obj1 obj2 -- ? )
+GENERIC: after? ( obj1 obj2 -- ? )
+GENERIC: before=? ( obj1 obj2 -- ? )
+GENERIC: after=? ( obj1 obj2 -- ? )
+
+M: object before? ( obj1 obj2 -- ? ) <=> +lt+ eq? ;
+M: object after? ( obj1 obj2 -- ? ) <=> +gt+ eq? ;
+M: object before=? ( obj1 obj2 -- ? ) <=> +gt+ eq? not ;
+M: object after=? ( obj1 obj2 -- ? ) <=> +lt+ eq? not ;
+
+M: real before? ( obj1 obj2 -- ? ) < ;
+M: real after? ( obj1 obj2 -- ? ) > ;
+M: real before=? ( obj1 obj2 -- ? ) <= ;
+M: real after=? ( obj1 obj2 -- ? ) >= ;
+
+: min ( x y -- z ) [ before? ] most ; inline 
+: max ( x y -- z ) [ after? ] most ; inline
+
+: between? ( x y z -- ? )
+    pick after=? [ after=? ] [ 2drop f ] if ; inline
+
+: [-] ( x y -- z ) - 0 max ; inline
+
+: compare ( obj1 obj2 quot -- symbol ) bi@ <=> ; inline
index baa6634a9fb01eeeeb5acddc9089b8740c17b848..15234ee3108b60c7f8aaae478f1909e57fdedca8 100755 (executable)
@@ -98,3 +98,9 @@ unit-test
 [ 1 1 >base ] must-fail
 [ 1 0 >base ] must-fail
 [ 1 -1 >base ] must-fail
+
+[ "0.0/0.0" ] [ 0.0 0.0 / number>string ] unit-test
+
+[ "1.0/0.0" ] [ 1.0 0.0 / number>string ] unit-test
+
+[ "-1.0/0.0" ] [ -1.0 0.0 / number>string ] unit-test
index 1a1a080564ab1637cbd92e13fde0e0069631ed62..d1b8e6fd37dafc30fbdc6fa09a3a0d1d7dcf0e6e 100755 (executable)
@@ -140,9 +140,9 @@ M: ratio >base
 
 M: float >base
     drop {
+        { [ dup fp-nan? ] [ drop "0.0/0.0" ] }
         { [ dup 1.0/0.0 = ] [ drop "1.0/0.0" ] }
         { [ dup -1.0/0.0 = ] [ drop "-1.0/0.0" ] }
-        { [ dup fp-nan? ] [ drop "0.0/0.0" ] }
         [ float>string fix-float ]
     } cond ;
 
index dc4315fb39d7cd7b3e6fae9dc234c28bd06a8f5a..60de8415684cea7e7c3bc96272db9c2393e22200 100755 (executable)
@@ -30,6 +30,7 @@ HELP: <mirror>
 { $examples
     { $example
         "USING: assocs mirrors prettyprint ;"
+        "IN: scratchpad"
         "TUPLE: circle center radius ;"
         "C: <circle> circle"
         "{ 100 50 } 15 <circle> <mirror> >alist ."
@@ -37,10 +38,6 @@ HELP: <mirror>
     }
 } ;
 
-HELP: >mirror<
-{ $values { "mirror" mirror } { "obj" object } { "slots" "a sequence of " { $link slot-spec } " instances" } }
-{ $description "Pushes the object being viewed in the mirror together with its slots." } ;
-
 HELP: make-mirror
 { $values { "obj" object } { "assoc" assoc } }
 { $description "Creates an assoc which reflects the internal structure of the object." } ;
index 11e57720004d16190b532f645dba572e6d561590..45970c8bae05c4518bedb2d3cc839a7e8d9d59e5 100755 (executable)
@@ -1,4 +1,4 @@
-USING: mirrors tools.test assocs kernel arrays ;
+USING: mirrors tools.test assocs kernel arrays accessors ;
 IN: mirrors.tests
 
 TUPLE: foo bar baz ;
@@ -14,3 +14,15 @@ C: <foo> foo
 [ 3 ] [
     3 "baz" 1 2 <foo> [ <mirror> set-at ] keep foo-baz
 ] unit-test
+
+[ 3 "hi" 1 2 <foo> <mirror> set-at ] [
+    [ no-such-slot? ]
+    [ name>> "hi" = ]
+    [ object>> foo? ] tri and and
+] must-fail-with
+
+[ 3 "numerator" 1/2 <mirror> set-at ] [
+    [ immutable-slot? ]
+    [ name>> "numerator" = ]
+    [ object>> 1/2 = ] tri and and
+] must-fail-with
index 02afaf07fc65dc80fe0f41b1eeba3022c41d3c5e..0a49163075f612bea573a1d1ab1844b9e019cdc5 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: assocs hashtables kernel sequences generic words
 arrays classes slots slots.private classes.tuple math vectors
-quotations sorting prettyprint ;
+quotations sorting prettyprint accessors ;
 IN: mirrors
 
 : all-slots ( class -- slots )
@@ -16,33 +16,32 @@ TUPLE: mirror object slots ;
 : <mirror> ( object -- mirror )
     dup object-slots mirror boa ;
 
-: >mirror< ( mirror -- obj slots )
-    dup mirror-object swap mirror-slots ;
+ERROR: no-such-slot object name ;
 
-: mirror@ ( slot-name mirror -- obj slot-spec )
-    >mirror< swapd slot-named ;
+ERROR: immutable-slot object name ;
 
 M: mirror at*
-    mirror@ dup [ slot-spec-offset slot t ] [ 2drop f f ] if ;
+    [ nip object>> ] [ slots>> slot-named ] 2bi
+    dup [ offset>> slot t ] [ 2drop f f ] if ;
 
 M: mirror set-at ( val key mirror -- )
-    mirror@ dup [
-        dup slot-spec-writer [
-            slot-spec-offset set-slot
+    [ nip object>> ] [ drop ] [ slots>> slot-named ] 2tri dup [
+        dup writer>> [
+            nip offset>> set-slot
         ] [
-            "Immutable slot" throw
+            drop immutable-slot
         ] if
     ] [
-        "No such slot" throw
+        drop no-such-slot
     ] if ;
 
 M: mirror delete-at ( key mirror -- )
     f -rot set-at ;
 
 M: mirror >alist ( mirror -- alist )
-    >mirror<
-    [ [ slot-spec-offset slot ] with map ] keep
-    [ slot-spec-name ] map swap zip ;
+    [ slots>> [ name>> ] map ]
+    [ [ object>> ] [ slots>> ] bi [ offset>> slot ] with map ] bi
+    zip ;
 
 M: mirror assoc-size mirror-slots length ;
 
@@ -50,7 +49,7 @@ INSTANCE: mirror assoc
 
 : sort-assoc ( assoc -- alist )
     >alist
-    [ dup first unparse-short swap ] { } map>assoc
+    [ [ first unparse-short ] keep ] { } map>assoc
     sort-keys values ;
 
 GENERIC: make-mirror ( obj -- assoc )
index 971477cd4d0812e42d1e6fa082f2b8e7a67bba90..1da3bc45db16cd3b864c518128a40c1a2d998e9b 100755 (executable)
@@ -87,7 +87,7 @@ HELP: +@
 { $description "Adds " { $snippet "n" } " to the value of the variable. A variable value of " { $link f } " is interpreted as being zero." }
 { $side-effects "variable" }
 { $examples
-    { $example "USING: namespaces prettyprint ;" "SYMBOL: foo\n1 foo +@\n10 foo +@\nfoo get ." "11" }
+    { $example "USING: namespaces prettyprint ;" "IN: scratchpad" "SYMBOL: foo\n1 foo +@\n10 foo +@\nfoo get ." "11" }
 } ;
 
 HELP: inc
index 8dc065c04a4b703cae1bc1564b8da783f99278ec..4c11e2389f1605ebeb1679d59b8be01c6e03c702 100644 (file)
@@ -1,5 +1,5 @@
-IN: namespaces.tests
 USING: kernel namespaces tools.test words ;
+IN: namespaces.tests
 
 H{ } clone "test-namespace" set
 
index 9630f9dc7047d22018655dd3677c0163a7e0a676..9b70ccdd9d74778e8715dbd24459d790f6e32b58 100755 (executable)
@@ -87,7 +87,7 @@ M: node optimize-node* drop t f ;
 
 : compute-value-substitutions ( #call/#merge #return/#values -- assoc )
     [ out-d>> ] [ in-d>> ] bi* 2array unify-lengths flip
-    [ = not ] assoc-subset >hashtable ;
+    [ = not ] assoc-filter >hashtable ;
 
 : cleanup-inlining ( #return/#values -- newnode changed? )
     dup node-successor [
index 976156db7713cfec3255824b7df2f53f7c7b33fa..7ab0ffc8067e117ff3dc2e6ec550abf3fbfc948f 100755 (executable)
@@ -75,7 +75,7 @@ USE: prettyprint
 M: #call-label collect-label-info*
     node-param label-info get at
     node-stack get over third tail
-    [ [ #label? ] subset [ node-param ] map ] keep
+    [ [ #label? ] filter [ node-param ] map ] keep
     [ node-successor #tail? ] all? 2array
     swap second push ;
 
@@ -91,7 +91,7 @@ SYMBOL: potential-loops
 
 : remove-non-tail-calls ( -- )
     label-info get
-    [ nip second [ second ] all? ] assoc-subset
+    [ nip second [ second ] all? ] assoc-filter
     [ first ] assoc-map
     potential-loops set ;
 
@@ -154,9 +154,9 @@ SYMBOL: potential-loops
         node-literal t
     ] [
         node-class {
-            { [ dup null class< ] [ drop f f ] }
-            { [ dup \ f class-not class< ] [ drop t t ] }
-            { [ dup \ f class< ] [ drop f t ] }
+            { [ dup null class<= ] [ drop f f ] }
+            { [ dup \ f class-not class<= ] [ drop t t ] }
+            { [ dup \ f class<= ] [ drop f t ] }
             [ drop f f ]
         } cond
     ] if ;
index 914018437ab406cda0773e1557470435d6d1f1c9..f49ab7fcba8bc57c559a38e28153692c9acdce10 100755 (executable)
@@ -1,6 +1,6 @@
 IN: optimizer.def-use.tests
 USING: inference inference.dataflow optimizer optimizer.def-use
-namespaces assocs kernel sequences math tools.test words ;
+namespaces assocs kernel sequences math tools.test words sets ;
 
 [ 3 { 1 1 1 } ] [
     [ 1 2 3 ] dataflow compute-def-use drop
@@ -11,10 +11,6 @@ namespaces assocs kernel sequences math tools.test words ;
     dataflow compute-def-use drop compute-dead-literals keys
     [ value-literal ] map ;
 
-: subset? [ member? ] curry all? ;
-
-: set= 2dup subset? >r swap subset? r> and ;
-
 [ { [ + ] } ] [
     [ [ 1 2 3 ] [ + ] over drop drop ] kill-set
 ] unit-test
index 66bffd9767885f152a717870b9f2dc677c159492..a2e9f881354705c79f372b9457cbbab1e3dd7f40 100755 (executable)
@@ -56,7 +56,7 @@ UNION: #killable
 : purge-invariants ( stacks -- seq )
     #! Output a sequence of values which are not present in the
     #! same position in each sequence of the stacks sequence.
-    unify-lengths flip [ all-eq? not ] subset concat ;
+    unify-lengths flip [ all-eq? not ] filter concat ;
 
 M: #label node-def-use
     [
@@ -75,7 +75,7 @@ M: #branch node-def-use
     dup branch-def-use (node-def-use) ;
 
 : compute-dead-literals ( -- values )
-    def-use get [ >r value? r> empty? and ] assoc-subset ;
+    def-use get [ >r value? r> empty? and ] assoc-filter ;
 
 DEFER: kill-nodes
 SYMBOL: dead-literals
index 33c8244b4c0d68bb36eb9bd27e368e3a81e3626d..393264e459e89905926274a9f0fe5d1975f26374 100755 (executable)
@@ -77,7 +77,7 @@ DEFER: (flat-length)
         float real
         complex number
         object
-    } [ class< ] with find nip ;
+    } [ class<= ] with find nip ;
 
 : inlining-math-method ( #call word -- quot/f )
     swap node-input-classes
@@ -111,7 +111,7 @@ DEFER: (flat-length)
 : comparable? ( actual testing -- ? )
     #! If actual is a subset of testing or if the two classes
     #! are disjoint, return t.
-    2dup class< >r classes-intersect? not r> or ;
+    2dup class<= >r classes-intersect? not r> or ;
 
 : optimize-predicate? ( #call -- ? )
     dup node-param "predicating" word-prop dup [
@@ -132,7 +132,7 @@ DEFER: (flat-length)
 
 : evaluate-predicate ( #call -- ? )
     dup node-param "predicating" word-prop >r
-    node-class-first r> class< ;
+    node-class-first r> class<= ;
 
 : optimize-predicate ( #call -- node )
     #! If the predicate is followed by a branch we fold it
index 91d0c1c0de0838665e22f1e357254992daedead7..d1dbefe26b00a73bcf561cc7f4e5bff14cc915a8 100755 (executable)
@@ -4,7 +4,7 @@ IN: optimizer.known-words
 USING: alien arrays generic hashtables inference.dataflow
 inference.class kernel assocs math math.private kernel.private
 sequences words parser vectors strings sbufs io namespaces
-assocs quotations sequences.private io.binary io.crc32
+assocs quotations sequences.private io.binary
 io.streams.string layouts splitting math.intervals
 math.floats.private classes.tuple classes.tuple.private classes
 classes.algebra optimizer.def-use optimizer.backend
@@ -60,7 +60,8 @@ sequences.private combinators ;
     [ value-literal sequence? ] [ drop f ] if ;
 
 : member-quot ( seq -- newquot )
-    [ [ t ] ] { } map>assoc [ drop f ] suffix [ nip case ] curry ;
+    [ literalize [ t ] ] { } map>assoc
+    [ drop f ] suffix [ nip case ] curry ;
 
 : expand-member ( #call -- )
     dup node-in-d peek value-literal member-quot f splice-quot ;
@@ -125,8 +126,6 @@ sequences.private combinators ;
 
 \ >sbuf { string } "specializer" set-word-prop
 
-\ crc32 { string } "specializer" set-word-prop
-
 \ split, { string string } "specializer" set-word-prop
 
 \ memq? { array } "specializer" set-word-prop
index ab8a1f3edade40a745034710709b85240ba36925..72e64d5b95e22e555ba2583eb80f4815e1e3121e 100755 (executable)
@@ -96,7 +96,7 @@ optimizer.math.partial generic.standard system accessors ;
 
 : math-closure ( class -- newclass )
     { null fixnum bignum integer rational float real number }
-    [ class< ] with find nip number or ;
+    [ class<= ] with find nip number or ;
 
 : fits? ( interval class -- ? )
     "interval" word-prop dup
@@ -108,7 +108,7 @@ optimizer.math.partial generic.standard system accessors ;
     dup r> at swap or ;
 
 : won't-overflow? ( interval node -- ? )
-    node-in-d [ value-class* fixnum class< ] all?
+    node-in-d [ value-class* fixnum class<= ] all?
     swap fixnum fits? and ;
 
 : post-process ( class interval node -- classes intervals )
@@ -214,7 +214,7 @@ optimizer.math.partial generic.standard system accessors ;
 : twiddle-interval ( i1 -- i2 )
     dup [
         node get node-in-d
-        [ value-class* integer class< ] all?
+        [ value-class* integer class<= ] all?
         [ integral-closure ] when
     ] when ;
 
@@ -293,7 +293,7 @@ most-negative-fixnum most-positive-fixnum [a,b]
 ! Removing overflow checks
 : remove-overflow-check? ( #call -- ? )
     dup out-d>> first node-class
-    [ fixnum class< ] [ null eq? not ] bi and ;
+    [ fixnum class<= ] [ null eq? not ] bi and ;
 
 {
     { + [ fixnum+fast ] }
@@ -356,7 +356,7 @@ most-negative-fixnum most-positive-fixnum [a,b]
     dup #call? [ node-param eq? ] [ 2drop f ] if ;
 
 : coerced-to-fixnum? ( #call -- ? )
-    dup dup node-in-d [ node-class integer class< ] with all?
+    dup dup node-in-d [ node-class integer class<= ] with all?
     [ \ >fixnum consumed-by? ] [ drop f ] if ;
 
 {
@@ -377,7 +377,7 @@ most-negative-fixnum most-positive-fixnum [a,b]
 
 : convert-rem-to-and? ( #call -- ? )
     dup node-in-d {
-        { [ 2dup first node-class integer class< not ] [ f ] }
+        { [ 2dup first node-class integer class<= not ] [ f ] }
         { [ 2dup second node-literal integer? not ] [ f ] }
         { [ 2dup second node-literal power-of-2? not ] [ f ] }
         [ t ]
index bbe1d0a83f6a831824c20dc3b98a4b6f96697bc7..8b5e25deb1e1b4deeb0d4a05b8497246650ecf82 100644 (file)
@@ -85,7 +85,7 @@ PREDICATE: math-partial < word
 : define-math-ops ( op -- )
     { fixnum bignum float }
     [ [ dup 3array ] [ swap method ] 2bi ] with { } map>assoc
-    [ nip ] assoc-subset
+    [ nip ] assoc-filter
     [ word-def peek ] assoc-map % ;
 
 SYMBOL: math-ops
@@ -155,7 +155,7 @@ SYMBOL: fast-math-ops
     [ drop math-class-max swap specific-method >boolean ] if ;
 
 : (derived-ops) ( word assoc -- words )
-    swap [ rot first eq? nip ] curry assoc-subset values ;
+    swap [ rot first eq? nip ] curry assoc-filter values ;
 
 : derived-ops ( word -- words )
     [ 1array ]
index 14dcd62c61884f14b417f53994a907befaf42774..6f4ae2c1d5bccb4cb0983b03ab50f91295aef5b7 100755 (executable)
@@ -1,9 +1,9 @@
 USING: arrays compiler.units generic hashtables inference kernel
-kernel.private math optimizer prettyprint sequences sbufs
-strings tools.test vectors words sequences.private quotations
-optimizer.backend classes classes.algebra inference.dataflow
-classes.tuple.private continuations growable optimizer.inlining
-namespaces hints ;
+kernel.private math optimizer generator prettyprint sequences
+sbufs strings tools.test vectors words sequences.private
+quotations optimizer.backend classes classes.algebra
+inference.dataflow classes.tuple.private continuations growable
+optimizer.inlining namespaces hints ;
 IN: optimizer.tests
 
 [ H{ { 1 5 } { 3 4 } { 2 5 } } ] [
@@ -349,3 +349,10 @@ USE: sequences.private
     1 2 3.0 3 counter-example ;
 
 [ 2 4 6.0 0 ] [ counter-example' ] unit-test
+
+: member-test { + - * / /i } member? ;
+
+\ member-test must-infer
+[ ] [ \ member-test word-dataflow optimize 2drop ] unit-test
+[ t ] [ \ + member-test ] unit-test
+[ f ] [ \ append member-test ] unit-test
index 5beb2555f0412fe52697036a882c41d38a87f28d..51fa254a258e81d9e625148f479381e0fdada8af 100755 (executable)
@@ -12,7 +12,7 @@ SYMBOL: @
     @ get [ eq? ] [ @ set t ] if* ;
 
 : match-class ( value spec -- ? )
-    >r node get swap node-class r> class< ;
+    >r node get swap node-class r> class<= ;
 
 : value-match? ( value spec -- ? )
     {
index b33a9e8fc27440a19553063209fc8ac06ea4a138..c3702e9805f2529cb4b7ef31398df7de209d73df 100755 (executable)
@@ -12,7 +12,7 @@ IN: optimizer.specializers
 : make-specializer ( classes -- quot )\r
     dup length <reversed>\r
     [ (picker) 2array ] 2map\r
-    [ drop object eq? not ] assoc-subset\r
+    [ drop object eq? not ] assoc-filter\r
     dup empty? [ drop [ t ] ] [\r
         [ (make-specializer) ] { } assoc>map\r
         unclip [ swap [ f ] \ if 3array append [ ] like ] reduce\r
index 23363c30ad13cf588d8c9ec88ad9189d55a725a1..418278baeedea73385999404db1b0d97126311af 100755 (executable)
@@ -5,7 +5,7 @@ quotations namespaces compiler.units assocs ;
 IN: parser
 
 ARTICLE: "vocabulary-search-shadow" "Shadowing word names"
-"If adding a vocabulary to the search path results in a word in another vocabulary becoming inaccessible due to the new vocabulary defining a word with the same name, a message is printed to the " { $link stdio } " stream. Except when debugging suspected name clashes, these messages can be ignored."
+"If adding a vocabulary to the search path results in a word in another vocabulary becoming inaccessible due to the new vocabulary defining a word with the same name, we say that the old word has been " { $emphasis "shadowed" } "."
 $nl
 "Here is an example where shadowing occurs:"
 { $code
@@ -13,18 +13,18 @@ $nl
     "USING: sequences io ;"
     ""
     ": append"
-    "    \"foe::append calls sequences::append\" print  append ;"
+    "    \"foe::append calls sequences:append\" print  append ;"
     ""
     "IN: fee"
     ""
     ": append"
-    "    \"fee::append calls fee::append\" print  append ;"
+    "    \"fee::append calls fee:append\" print  append ;"
     ""
     "IN: fox"
     "USE: foe"
     ""
     ": append"
-    "    \"fox::append calls foe::append\" print  append ;"
+    "    \"fox::append calls foe:append\" print  append ;"
     ""
     "\"1234\" \"5678\" append print"
     ""
@@ -33,12 +33,13 @@ $nl
 }
 "When placed in a source file and run, the above code produces the following output:"
 { $code
-    "foe::append calls sequences::append"
+    "foe:append calls sequences:append"
     "12345678"
-    "fee::append calls foe::append"
-    "foe::append calls sequences::append"
+    "fee:append calls foe:append"
+    "foe:append calls sequences:append"
     "12345678"
-} ;
+}
+"The " { $vocab-link "qualified" } " vocabulary contains some tools for helping with shadowing." ;
 
 ARTICLE: "vocabulary-search-errors" "Word lookup errors"
 "If the parser cannot not find a word in the current vocabulary search path, it attempts to look for the word in all loaded vocabularies. Then, one of three things happen:"
@@ -51,9 +52,11 @@ ARTICLE: "vocabulary-search-errors" "Word lookup errors"
 ARTICLE: "vocabulary-search" "Vocabulary search path"
 "When the parser reads a token, it attempts to look up a word named by that token. The lookup is performed by searching each vocabulary in the search path, in order."
 $nl
-"For a source file the vocabulary search path starts off with two vocabularies:"
-{ $code "syntax\nscratchpad" }
-"The " { $vocab-link "syntax" } " vocabulary consists of a set of parsing words for reading Factor data and defining new words. The " { $vocab-link "scratchpad" } " vocabulary is the default vocabulary for new word definitions."
+"For a source file the vocabulary search path starts off with one vocabulary:"
+{ $code "syntax" }
+"The " { $vocab-link "syntax" } " vocabulary consists of a set of parsing words for reading Factor data and defining new words."
+$nl
+"In the listener, the " { $vocab-link "scratchpad" } " is the default vocabulary for new word definitions. However, when loading source files, there is no default vocabulary. Defining words before declaring a vocabulary with " { $link POSTPONE: IN: } " results in an error."
 $nl
 "At the interactive listener, the default search path contains many more vocabularies. Details on the default search path and parser invocation are found in " { $link "parser" } "."
 $nl
@@ -213,7 +216,7 @@ HELP: save-location
 { $description "Saves the location of a definition and associates this definition with the current source file." } ;
 
 HELP: parser-notes
-{ $var-description "A boolean controlling whether the parser will print various notes and warnings. Switched on by default. If a source file is being run for its effect on the " { $link stdio } " stream, this variable should be switched off, to prevent parser notes from polluting the output." } ;
+{ $var-description "A boolean controlling whether the parser will print various notes and warnings. Switched on by default. If a source file is being run for its effect on " { $link output-stream } ", this variable should be switched off, to prevent parser notes from polluting the output." } ;
 
 HELP: parser-notes?
 { $values { "?" "a boolean" } }
@@ -294,6 +297,10 @@ HELP: use
 HELP: in
 { $var-description "A variable holding the name of the current vocabulary for new definitions." } ;
 
+HELP: current-vocab
+{ $values { "str" "a vocabulary" } }
+{ $description "Returns the vocabulary stored in the " { $link in } " symbol. Throws an error if the current vocabulary is " { $link f } "." } ;
+
 HELP: (use+)
 { $values { "vocab" "an assoc mapping strings to words" } }
 { $description "Adds an assoc at the front of the search path." }
@@ -323,7 +330,7 @@ HELP: set-in
 $parsing-note ;
 
 HELP: create-in
-{ $values { "string" "a word name" } { "word" "a new word" } }
+{ $values { "str" "a word name" } { "word" "a new word" } }
 { $description "Creates a word in the current vocabulary. Until re-defined, the word throws an error when invoked." }
 $parsing-note ;
 
@@ -451,7 +458,7 @@ HELP: bootstrap-syntax
 
 HELP: with-file-vocabs
 { $values { "quot" quotation } }
-{ $description "Calls the quotation in a scope with the initial the vocabulary search path for parsing a file. This consists of the " { $snippet "syntax" } " vocabulary together with the " { $snippet "scratchpad" } " vocabulary." } ;
+{ $description "Calls the quotation in a scope with the initial the vocabulary search path for parsing a file. This consists of just the " { $snippet "syntax" } " vocabulary." } ;
 
 HELP: parse-fresh
 { $values { "lines" "a sequence of strings" } { "quot" quotation } }
@@ -500,7 +507,7 @@ HELP: bootstrap-file
 
 HELP: eval>string
 { $values { "str" string } { "output" string } }
-{ $description "Evaluates the Factor code in " { $snippet "str" } " with the " { $link stdio } " stream rebound to a string output stream, then outputs the resulting string." } ;
+{ $description "Evaluates the Factor code in " { $snippet "str" } " with " { $link output-stream } " rebound to a string output stream, then outputs the resulting string." } ;
 
 HELP: staging-violation
 { $values { "word" word } }
index ab193e1c0248e3a1096a27b6ccc6085f5392b08a..9c3c1d9f6ca7cd47a7e0f3b1bba1eacb336a7312 100755 (executable)
@@ -3,6 +3,7 @@ io.streams.string namespaces classes effects source-files
 assocs sequences strings io.files definitions continuations
 sorting classes.tuple compiler.units debugger vocabs
 vocabs.loader accessors ;
+
 IN: parser.tests
 
 [
@@ -429,3 +430,8 @@ must-fail-with
 [
     "USE: this-better-not-exist" eval
 ] must-fail
+
+[ ": foo ;" eval ] [ error>> no-current-vocab? ] must-fail-with
+
+[ 92 ] [ "CHAR: \\" eval ] unit-test
+[ 92 ] [ "CHAR: \\\\" eval ] unit-test
index 7639ebaa692a619982dd1aed217217952b8d0913..76c831cf13753b3cb090410e4cb04855d91fb7ca 100755 (executable)
@@ -63,7 +63,7 @@ t parser-notes set-global
 
 : skip ( i seq ? -- n )
     over >r
-    [ swap CHAR: \s eq? xor ] curry find* drop
+    [ swap CHAR: \s eq? xor ] curry find-from drop
     [ r> drop ] [ r> length ] if* ;
 
 : change-lexer-column ( lexer quot -- )
@@ -132,7 +132,7 @@ name>char-hook global [
     "{" ?head-slice [
         CHAR: } over index cut-slice
         >r >string name>char-hook get call r>
-        1 tail-slice
+        rest-slice
     ] [
         6 cut-slice >r hex> r>
     ] if ;
@@ -146,7 +146,7 @@ name>char-hook global [
 
 : (parse-string) ( str -- m )
     dup [ "\"\\" member? ] find dup [
-        >r cut-slice >r % r> 1 tail-slice r>
+        >r cut-slice >r % r> rest-slice r>
         dup CHAR: " = [
             drop slice-from
         ] [
@@ -207,7 +207,7 @@ SYMBOL: in
 : add-use ( seq -- ) [ use+ ] each ;
 
 : set-use ( seq -- )
-    [ vocab-words ] map [ ] subset >vector use set ;
+    [ vocab-words ] map [ ] filter >vector use set ;
 
 : check-vocab-string ( name -- name )
     dup string?
@@ -233,8 +233,16 @@ PREDICATE: unexpected-eof < unexpected
 : parse-tokens ( end -- seq )
     100 <vector> swap (parse-tokens) >array ;
 
-: create-in ( string -- word )
-    in get create dup set-word dup save-location ;
+ERROR: no-current-vocab ;
+
+M: no-current-vocab summary ( obj -- )
+    drop "Current vocabulary is f, use IN:" ;
+
+: current-vocab ( -- str )
+    in get [ no-current-vocab ] unless* ;
+
+: create-in ( str -- word )
+    current-vocab create dup set-word dup save-location ;
 
 : CREATE ( -- word ) scan create-in ;
 
@@ -243,7 +251,7 @@ PREDICATE: unexpected-eof < unexpected
 : CREATE-WORD ( -- word ) CREATE dup reset-generic ;
 
 : create-class-in ( word -- word )
-    in get create
+    current-vocab create
     dup save-class-location
     dup predicate-word dup set-word save-location ;
 
@@ -262,7 +270,7 @@ M: no-word-error summary
 
 : no-word ( name -- newword )
     dup no-word-error boa
-    swap words-named [ forward-reference? not ] subset
+    swap words-named [ forward-reference? not ] filter
     word-restarts throw-restarts
     dup word-vocabulary (use+) ;
 
@@ -270,7 +278,7 @@ M: no-word-error summary
     dup forward-reference? [
         drop
         use get
-        [ at ] with map [ ] subset
+        [ at ] with map [ ] filter
         [ forward-reference? not ] find nip
     ] [
         nip
@@ -337,6 +345,11 @@ M: invalid-slot-name summary
         [ >r tuple parse-tuple-slots r> prefix ]
     } case 3dup check-slot-shadowing ;
 
+ERROR: not-in-a-method-error ;
+
+M: not-in-a-method-error summary
+    drop "call-next-method can only be called in a method definition" ;
+
 ERROR: staging-violation word ;
 
 M: staging-violation summary
@@ -408,14 +421,17 @@ ERROR: bad-number ;
 SYMBOL: current-class
 SYMBOL: current-generic
 
-: (M:)
-    CREATE-METHOD
+: with-method-definition ( quot -- parsed )
     [
+        >r
         [ "method-class" word-prop current-class set ]
         [ "method-generic" word-prop current-generic set ]
         [ ] tri
-        parse-definition
-    ] with-scope ;
+        r> call
+    ] with-scope ; inline
+
+: (M:)
+    CREATE-METHOD [ parse-definition ] with-method-definition ;
 
 : scan-object ( -- object )
     scan-word dup parsing?
@@ -440,8 +456,7 @@ SYMBOL: bootstrap-syntax
 
 : with-file-vocabs ( quot -- )
     [
-        "scratchpad" in set
-        { "syntax" "scratchpad" } set-use
+        f in set { "syntax" } set-use
         bootstrap-syntax get [ use get push ] when*
         call
     ] with-scope ; inline
@@ -506,10 +521,10 @@ SYMBOL: interactive-vocabs
     ] if ;
 
 : filter-moved ( assoc1 assoc2 -- seq )
-    assoc-diff [
+    swap assoc-diff [
         drop where dup [ first ] when
         file get source-file-path =
-    ] assoc-subset keys ;
+    ] assoc-filter keys ;
 
 : removed-definitions ( -- assoc1 assoc2 )
     new-definitions old-definitions
@@ -524,7 +539,7 @@ SYMBOL: interactive-vocabs
 
 : reset-removed-classes ( -- )
     removed-classes
-    filter-moved [ class? ] subset [ reset-class ] each ;
+    filter-moved [ class? ] filter [ reset-class ] each ;
 
 : fix-class-words ( -- )
     #! If a class word had a compound definition which was
index c9933d5be2cf8b18d240d995d0623dac2c2a0fc7..f992b9ca01cfa0290df21f50f46651d3ea9a8857 100755 (executable)
@@ -1,10 +1,11 @@
 ! Copyright (C) 2003, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays byte-arrays bit-arrays generic hashtables io
-assocs kernel math namespaces sequences strings sbufs io.styles
-vectors words prettyprint.config prettyprint.sections quotations
-io io.files math.parser effects classes.tuple
-classes.tuple.private classes float-arrays ;
+USING: arrays byte-arrays byte-vectors bit-arrays generic
+hashtables io assocs kernel math namespaces sequences strings
+sbufs io.styles vectors words prettyprint.config
+prettyprint.sections quotations io io.files math.parser effects
+classes.tuple math.order classes.tuple.private classes
+float-arrays ;
 IN: prettyprint.backend
 
 GENERIC: pprint* ( obj -- )
@@ -140,6 +141,7 @@ M: compose pprint-delims drop \ [ \ ] ;
 M: array pprint-delims drop \ { \ } ;
 M: byte-array pprint-delims drop \ B{ \ } ;
 M: bit-array pprint-delims drop \ ?{ \ } ;
+M: byte-vector pprint-delims drop \ BV{ \ } ;
 M: float-array pprint-delims drop \ F{ \ } ;
 M: vector pprint-delims drop \ V{ \ } ;
 M: hashtable pprint-delims drop \ H{ \ } ;
@@ -152,6 +154,7 @@ GENERIC: >pprint-sequence ( obj -- seq )
 M: object >pprint-sequence ;
 
 M: vector >pprint-sequence ;
+M: byte-vector >pprint-sequence ;
 M: curry >pprint-sequence ;
 M: compose >pprint-sequence ;
 M: hashtable >pprint-sequence >alist ;
index 7cc141be22290947a762e5fe358654a23f95b874..f7f0f7ee4496c69132288a57cc7e2e8114d5901b 100755 (executable)
@@ -135,7 +135,7 @@ ARTICLE: "prettyprint" "The prettyprinter"
 $nl
 "Prettyprinter words are found in the " { $vocab-link "prettyprint" } " vocabulary."
 $nl
-"The key words to print an object to the " { $link stdio } " stream; the first two emit a trailing newline, the second two do not:"
+"The key words to print an object to " { $link output-stream } "; the first two emit a trailing newline, the second two do not:"
 { $subsection . }
 { $subsection short. }
 { $subsection pprint }
@@ -161,17 +161,17 @@ ABOUT: "prettyprint"
 
 HELP: with-pprint
 { $values { "obj" object } { "quot" quotation } }
-{ $description "Sets up the prettyprinter and calls the quotation in a new scope. The quotation should add sections to the top-level block. When the quotation returns, the top-level block is printed to the " { $link stdio } " stream." } ;
+{ $description "Sets up the prettyprinter and calls the quotation in a new scope. The quotation should add sections to the top-level block. When the quotation returns, the top-level block is printed to " { $link output-stream } "." } ;
 
 HELP: pprint
 { $values { "obj" object } }
-{ $description "Prettyprints an object to the " { $link stdio } " stream. Output is influenced by many variables; see " { $link "prettyprint-variables" } "." } ;
+{ $description "Prettyprints an object to " { $link output-stream } ". Output is influenced by many variables; see " { $link "prettyprint-variables" } "." } ;
 
 { pprint pprint* with-pprint } related-words
 
 HELP: .
 { $values { "obj" object } }
-{ $description "Prettyprints an object to the " { $link stdio } " stream with a trailing line break. Output is influenced by many variables; see " { $link "prettyprint-variables" } "." } ;
+{ $description "Prettyprints an object to " { $link output-stream } " with a trailing line break. Output is influenced by many variables; see " { $link "prettyprint-variables" } "." } ;
 
 HELP: unparse
 { $values { "obj" object } { "str" "Factor source string" } }
@@ -179,11 +179,11 @@ HELP: unparse
 
 HELP: pprint-short
 { $values { "obj" object } }
-{ $description "Prettyprints an object to the " { $link stdio } " stream. This word rebinds printer control variables to enforce ``shorter'' output. See " { $link "prettyprint-variables" } "." } ;
+{ $description "Prettyprints an object to " { $link output-stream } ". This word rebinds printer control variables to enforce ``shorter'' output. See " { $link "prettyprint-variables" } "." } ;
 
 HELP: short.
 { $values { "obj" object } }
-{ $description "Prettyprints an object to the " { $link stdio } " stream with a trailing line break. This word rebinds printer control variables to enforce ``shorter'' output." } ;
+{ $description "Prettyprints an object to " { $link output-stream } " with a trailing line break. This word rebinds printer control variables to enforce ``shorter'' output." } ;
 
 HELP: .b
 { $values { "n" "an integer" } }
@@ -242,8 +242,16 @@ HELP: definer
 { $values { "defspec" "a definition specifier" } { "start" word } { "end" "a word or " { $link f } } }
 { $contract "Outputs the parsing words which delimit the definition." }
 { $examples
-    { $example "USING: definitions prettyprint ;" ": foo ; \\ foo definer . ." ";\nPOSTPONE: :" }
-    { $example "USING: definitions prettyprint ;" "SYMBOL: foo \\ foo definer . ." "f\nPOSTPONE: SYMBOL:" }
+    { $example "USING: definitions prettyprint ;"
+               "IN: scratchpad"
+               ": foo ; \\ foo definer . ."
+               ";\nPOSTPONE: :"
+    }
+    { $example "USING: definitions prettyprint ;"
+               "IN: scratchpad"
+               "SYMBOL: foo \\ foo definer . ."
+               "f\nPOSTPONE: SYMBOL:"
+    }
 }
 { $notes "This word is used in the implementation of " { $link see } "." } ;
 
index e94670992c67c5c6b1354de70f4aa3e95e3dede0..0faae398e934d68a169a5b9e51a7af967aebe50a 100755 (executable)
@@ -114,7 +114,7 @@ unit-test
             [ parse-fresh drop ] with-compilation-unit
             [
                 "prettyprint.tests" lookup see
-            ] with-string-writer "\n" split 1 head*
+            ] with-string-writer "\n" split but-last
         ] keep =
     ] with-scope ;
 
index 981c8dcfd04447dda4917e7b9c93e09b3e8b3d6a..4974e1df3c2058a04982e066a340945e8d93dc0c 100755 (executable)
@@ -45,7 +45,7 @@ sets ;
     ] if ;
 
 : vocabs. ( in use -- )
-    dupd remove [ { "syntax" "scratchpad" } member? not ] subset
+    dupd remove [ { "syntax" "scratchpad" } member? not ] filter
     use. in. ;
 
 : with-use ( obj quot -- )
index ceb37c2fe40ea5a59ef5862b372c14e3cdc17c68..842a36a13b5163feff5409e9032b1541f05d93c8 100755 (executable)
@@ -15,7 +15,7 @@ HELP: line-limit?
 
 
 HELP: do-indent
-{ $description "Outputs the current indent nesting to the " { $link stdio } " stream." } ;
+{ $description "Outputs the current indent nesting to " { $link output-stream } "." } ;
 
 HELP: fresh-line
 { $values { "n" "the current column position" } }
index 803f6e24599451ae75095f8e3ede4eee5ff43670..11fa4da28ee990199377ef7de0760d3134822b15 100644 (file)
@@ -15,9 +15,9 @@ SYMBOL: pprinter-stack
 SYMBOL: pprinter-in
 SYMBOL: pprinter-use
 
-TUPLE: pprinter last-newline line-count end-printing indent ;
+TUPLE: pprinter last-newline line-count indent ;
 
-: <pprinter> ( -- pprinter ) 0 1 0 pprinter boa ;
+: <pprinter> ( -- pprinter ) 0 1 0 pprinter boa ;
 
 : record-vocab ( word -- )
     word-vocabulary [ dup pprinter-use get set-at ] when* ;
@@ -34,7 +34,7 @@ TUPLE: pprinter last-newline line-count end-printing indent ;
     ] [
         pprinter get (>>last-newline)
         line-limit? [
-            "..." write pprinter get end-printing>> continue
+            "..." write pprinter get return
         ] when
         pprinter get [ 1+ ] change-line-count drop
         nl do-indent
@@ -171,7 +171,7 @@ M: block section-fits? ( section -- ? )
     line-limit? [ drop t ] [ call-next-method ] if ;
 
 : pprint-sections ( block advancer -- )
-    swap sections>> [ line-break? not ] subset
+    swap sections>> [ line-break? not ] filter
     unclip pprint-section [
         dup rot call pprint-section
     ] with each ; inline
@@ -275,16 +275,15 @@ M: colon unindent-first-line? drop t ;
         [
             dup style>> [
                 [
-                    >r pprinter get (>>end-printing) r>
                     short-section
-                ] curry callcc0
+                ] curry with-return
             ] with-nesting
         ] if-nonempty
     ] with-variable ;
 
 ! Long section layout algorithm
 : chop-break ( seq -- seq )
-    dup peek line-break? [ 1 head-slice* chop-break ] when ;
+    dup peek line-break? [ but-last-slice chop-break ] when ;
 
 SYMBOL: prev
 SYMBOL: next
@@ -310,7 +309,7 @@ M: f section-end-group? drop f ;
             2dup 1+ swap ?nth next set
             swap nth dup split-before dup , split-after
         ] with each
-    ] { } make { t } split [ empty? not ] subset ;
+    ] { } make { t } split [ empty? not ] filter ;
 
 : break-group? ( seq -- ? )
     [ first section-fits? ] [ peek section-fits? not ] bi and ;
index c0f15a9388c7e8edfd1fbc342ce430650bb3d748..2a0f5d289ff9364072a0b31407012ab56248fc5e 100755 (executable)
@@ -50,14 +50,14 @@ M: curry nth
 INSTANCE: curry immutable-sequence
 
 M: compose length
-    dup compose-first length
-    swap compose-second length + ;
+    [ compose-first length ]
+    [ compose-second length ] bi + ;
 
 M: compose nth
     2dup compose-first length < [
         compose-first
     ] [
-        [ compose-first length - ] keep compose-second
+        [ compose-first length - ] [ compose-second ] bi
     ] if nth ;
 
 INSTANCE: compose immutable-sequence
index 0dea0f43d96d7c632590888de34341c7f1ae06ca..8b15f5b980bd8ec3d6b0ac995668a96cb6af61b3 100755 (executable)
@@ -1,5 +1,5 @@
-USING: arrays bit-arrays help.markup help.syntax
-sequences.private vectors strings sbufs kernel math ;
+USING: arrays bit-arrays help.markup help.syntax math
+sequences.private vectors strings sbufs kernel math.order ;
 IN: sequences
 
 ARTICLE: "sequences-unsafe" "Unsafe sequence operations"
@@ -94,6 +94,9 @@ ARTICLE: "sequences-slices" "Subsequences and slices"
 { $subsection tail }
 { $subsection head* }
 { $subsection tail* }
+"Removing the first or last element:"
+{ $subsection rest }
+{ $subsection but-last }
 "Taking a sequence apart into a head and a tail:"
 { $subsection unclip }
 { $subsection cut }
@@ -105,6 +108,8 @@ ARTICLE: "sequences-slices" "Subsequences and slices"
 { $subsection <slice> }
 { $subsection head-slice }
 { $subsection tail-slice }
+{ $subsection but-last-slice }
+{ $subsection rest-slice }
 { $subsection head-slice* }
 { $subsection tail-slice* }
 "Taking a sequence apart into a head and a tail:"
@@ -127,7 +132,7 @@ ARTICLE: "sequences-combinators" "Sequence combinators"
 { $subsection unfold }
 "Filtering:"
 { $subsection push-if }
-{ $subsection subset } ;
+{ $subsection filter } ;
 
 ARTICLE: "sequences-tests" "Testing sequences"
 "Testing for an empty sequence:"
@@ -153,17 +158,17 @@ ARTICLE: "sequences-tests" "Testing sequences"
 ARTICLE: "sequences-search" "Searching sequences"
 "Finding the index of an element:"
 { $subsection index }
-{ $subsection index* }
+{ $subsection index-from }
 { $subsection last-index }
-{ $subsection last-index* }
+{ $subsection last-index-from }
 "Finding the start of a subsequence:"
 { $subsection start }
 { $subsection start* }
 "Finding the index of an element satisfying a predicate:"
 { $subsection find }
-{ $subsection find* }
+{ $subsection find-from }
 { $subsection find-last }
-{ $subsection find-last* } ;
+{ $subsection find-last-from } ;
 
 ARTICLE: "sequences-destructive" "Destructive operations"
 "These words modify their input, instead of creating a new sequence."
@@ -500,9 +505,9 @@ HELP: find
                    { $snippet "( elt -- ? )" } }
           { "i" "the index of the first match, or f" }
           { "elt" "the first matching element, or " { $link f } } }
-{ $description "A simpler variant of " { $link find* } " where the starting index is 0." } ;
+{ $description "A simpler variant of " { $link find-from } " where the starting index is 0." } ;
 
-HELP: find*
+HELP: find-from
 { $values { "n" "a starting index" }
           { "seq" sequence }
           { "quot" "a quotation with stack effect "
@@ -513,9 +518,9 @@ HELP: find*
 
 HELP: find-last
 { $values { "seq" sequence } { "quot" "a quotation with stack effect " { $snippet "( elt -- ? )" } } { "i" "the index of the first match, or f" } { "elt" "the first matching element, or " { $link f } } }
-{ $description "A simpler variant of " { $link find-last* } " where the starting index is one less than the length of the sequence." } ;
+{ $description "A simpler variant of " { $link find-last-from } " where the starting index is one less than the length of the sequence." } ;
 
-HELP: find-last*
+HELP: find-last-from
 { $values { "n" "a starting index" } { "seq" sequence } { "quot" "a quotation with stack effect " { $snippet "( elt -- ? )" } } { "i" "the index of the first match, or f" } { "elt" "the first matching element, or " { $link f } } }
 { $description "Applies the quotation to each element of the sequence in reverse order, until it outputs a true value or the start of the sequence is reached. If the quotation yields a true value for some sequence element, the word outputs the element index and the element itself. Otherwise, the word outputs an index of f and " { $link f } " as the element." } ;
 
@@ -530,9 +535,9 @@ HELP: all?
 HELP: push-if
 { $values { "elt" object } { "quot" "a quotation with stack effect " { $snippet "( elt -- ? )" } } { "accum" "a resizable mutable sequence" } }
 { $description "Adds the element at the end of the sequence if the quotation yields a true value." } 
-{ $notes "This word is a factor of " { $link subset } "." } ;
+{ $notes "This word is a factor of " { $link filter } "." } ;
 
-HELP: subset
+HELP: filter
 { $values { "seq" sequence } { "quot" "a quotation with stack effect " { $snippet "( elt -- ? )" } } { "subseq" "a new sequence" } }
 { $description "Applies the quotation to each element in turn, and outputs a new sequence containing the elements of the original sequence for which the quotation output a true value." } ;
 
@@ -562,9 +567,9 @@ HELP: index
 { $values { "obj" object } { "seq" sequence } { "n" "an index" } }
 { $description "Outputs the index of the first element in the sequence equal to " { $snippet "obj" } ". If no element is found, outputs " { $link f } "." } ;
 
-{ index index* last-index last-index* member? memq? } related-words
+{ index index-from last-index last-index-from member? memq? } related-words
 
-HELP: index*
+HELP: index-from
 { $values { "obj" object } { "i" "a start index" } { "seq" sequence } { "n" "an index" } }
 { $description "Outputs the index of the first element in the sequence equal to " { $snippet "obj" } ", starting the search from the " { $snippet "i" } "th element. If no element is found, outputs " { $link f } "." } ;
 
@@ -572,7 +577,7 @@ HELP: last-index
 { $values { "obj" object } { "seq" sequence } { "n" "an index" } }
 { $description "Outputs the index of the last element in the sequence equal to " { $snippet "obj" } "; the sequence is traversed back to front. If no element is found, outputs " { $link f } "." } ;
 
-HELP: last-index*
+HELP: last-index-from
 { $values { "obj" object } { "i" "a start index" } { "seq" sequence } { "n" "an index" } }
 { $description "Outputs the index of the last element in the sequence equal to " { $snippet "obj" } ", traversing the sequence backwards starting from the " { $snippet "i" } "th element and finishing at the first. If no element is found, outputs " { $link f } "." } ;
 
@@ -834,6 +839,17 @@ HELP: tail-slice
 { $description "Outputs a virtual sequence sharing storage with all elements from the " { $snippet "n" } "th index until the end of the input sequence." }
 { $errors "Throws an error if the index is out of bounds." } ;
 
+HELP: but-last-slice
+{ $values { "seq" sequence } { "slice" "a slice" } }
+{ $description "Outputs a virtual sequence sharing storage with all but the last element of the input sequence." }
+{ $errors "Throws an error on an empty sequence." } ;
+
+HELP: rest-slice
+{ $values { "seq" sequence } { "slice" "a slice" } }
+{ $description "Outputs a virtual sequence sharing storage with all elements from the 1st index until the end of the input sequence." }
+{ $notes "Equivalent to " { $snippet "1 tail" } }
+{ $errors "Throws an error on an empty sequence." } ;
+
 HELP: head-slice*
 { $values { "seq" sequence } { "n" "a non-negative integer" } { "slice" "a slice" } }
 { $description "Outputs a virtual sequence sharing storage with all elements of " { $snippet "seq" } " until the " { $snippet "n" } "th element from the end. In other words, it outputs a sequence of the first " { $snippet "l-n" } " elements of the input sequence, where " { $snippet "l" } " is its length." }
@@ -854,6 +870,16 @@ HELP: tail
 { $description "Outputs a new sequence consisting of the input sequence with the first n items removed." }
 { $errors "Throws an error if the index is out of bounds." } ;
 
+HELP: but-last
+{ $values { "seq" sequence } { "headseq" "a new sequence" } }
+{ $description "Outputs a new sequence consisting of the input sequence with the last item removed." }
+{ $errors "Throws an error on an empty sequence." } ;
+
+HELP: rest
+{ $values { "seq" sequence } { "tailseq" "a new sequence" } }
+{ $description "Outputs a new sequence consisting of the input sequence with the first item removed." }
+{ $errors "Throws an error on an empty sequence." } ;
+
 HELP: head*
 { $values { "seq" sequence } { "n" "a non-negative integer" } { "headseq" "a new sequence" } }
 { $description "Outputs a new sequence consisting of all elements of " { $snippet "seq" } " until the " { $snippet "n" } "th element from the end. In other words, it outputs a sequence of the first " { $snippet "l-n" } " elements of the input sequence, where " { $snippet "l" } " is its length." }
index 100184798ce6ad89994bfd1f12b8351b35e18dee..2479c125a26fbda76fdc1413702a140ac69049e2 100755 (executable)
@@ -27,7 +27,7 @@ IN: sequences.tests
 [ "hello world" "aeiou" [ member? ] curry find ] unit-test
 
 [ 4 CHAR: o ]
-[ 3 "hello world" "aeiou" [ member? ] curry find* ] unit-test
+[ 3 "hello world" "aeiou" [ member? ] curry find-from ] unit-test
 
 [ f         ] [ 3 [ ]     member? ] unit-test
 [ f         ] [ 3 [ 1 2 ] member? ] unit-test
@@ -39,18 +39,18 @@ IN: sequences.tests
 
 [ 4 ] [ CHAR: x "tuvwxyz" >vector index ] unit-test 
 
-[ f ] [ CHAR: x 5 "tuvwxyz" >vector index* ] unit-test 
+[ f ] [ CHAR: x 5 "tuvwxyz" >vector index-from ] unit-test 
 
-[ f ] [ CHAR: a 0 "tuvwxyz" >vector index* ] unit-test
+[ f ] [ CHAR: a 0 "tuvwxyz" >vector index-from ] unit-test
 
 [ f ] [ [ "Hello" { } 0.75 ] [ string? ] all? ] unit-test
 [ t ] [ [ ] [ ] all? ] unit-test
 [ t ] [ [ "hi" t 0.5 ] [ ] all? ] unit-test
 
-[ [ 1 2 3 ] ] [ [ 1 4 2 5 3 6 ] [ 4 < ] subset ] unit-test
-[ { 4 2 6 } ] [ { 1 4 2 5 3 6 } [ 2 mod 0 = ] subset ] unit-test
+[ [ 1 2 3 ] ] [ [ 1 4 2 5 3 6 ] [ 4 < ] filter ] unit-test
+[ { 4 2 6 } ] [ { 1 4 2 5 3 6 } [ 2 mod 0 = ] filter ] unit-test
 
-[ [ 3 ] ] [ [ 1 2 3 ] 2 [ swap < ] curry subset ] unit-test
+[ [ 3 ] ] [ [ 1 2 3 ] 2 [ swap < ] curry filter ] unit-test
 
 [ "hello world how are you" ]
 [ { "hello" "world" "how" "are" "you" } " " join ]
@@ -169,9 +169,9 @@ unit-test
 
 [ 3 "a" ] [ { "a" "b" "c" "a" "d" } [ "a" = ] find-last ] unit-test
 
-[ f f ] [ 100 { 1 2 3 } [ 1 = ] find* ] unit-test
-[ f f ] [ 100 { 1 2 3 } [ 1 = ] find-last* ] unit-test
-[ f f ] [ -1 { 1 2 3 } [ 1 = ] find* ] unit-test
+[ f f ] [ 100 { 1 2 3 } [ 1 = ] find-from ] unit-test
+[ f f ] [ 100 { 1 2 3 } [ 1 = ] find-last-from ] unit-test
+[ f f ] [ -1 { 1 2 3 } [ 1 = ] find-from ] unit-test
 
 [ 0 ] [ { "a" "b" "c" } { "A" "B" "C" } mismatch ] unit-test
 
@@ -187,9 +187,6 @@ unit-test
 
 [ V{ "a" "b" } V{ } ] [ { "X" "a" "b" } { "X" } drop-prefix [ >vector ] bi@ ] unit-test
 
-[ -1 ] [ "ab" "abc" <=> ] unit-test
-[ 1 ] [ "abc" "ab" <=> ] unit-test
-
 [ 1 4 9 16 16 V{ f 1 4 9 16 } ] [
     V{ } clone "cache-test" set
     1 "cache-test" get [ sq ] cache-nth
index 924d9a05cb84df55e8606db17c06c6ebc284e103..8d0e3eec18d5512bbc0d3e9af2e4596482f63e99 100755 (executable)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2005, 2008 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
+USING: kernel kernel.private slots.private math math.private
+math.order ;
 IN: sequences
-USING: kernel kernel.private slots.private math math.private ;
 
 MIXIN: sequence
 
@@ -36,7 +37,7 @@ M: sequence lengthen 2dup length > [ set-length ] [ 2drop ] if ;
 : set-third ( third seq -- ) 2 swap set-nth ; inline
 : set-fourth  ( fourth seq -- ) 3 swap set-nth ; inline
 
-: push ( elt seq -- ) dup length swap set-nth ;
+: push ( elt seq -- ) [ length ] [ set-nth ] bi ;
 
 : bounds-check? ( n seq -- ? )
     length 1- 0 swap between? ; inline
@@ -100,13 +101,13 @@ M: integer nth-unsafe drop ;
 INSTANCE: integer immutable-sequence
 
 : first2-unsafe
-    [ 0 swap nth-unsafe ] keep 1 swap nth-unsafe ; inline
+    [ 0 swap nth-unsafe 1 ] [ nth-unsafe ] bi ; inline
 
 : first3-unsafe
-    [ first2-unsafe ] keep 2 swap nth-unsafe ; inline
+    [ first2-unsafe 2 ] [ nth-unsafe ] bi ; inline
 
 : first4-unsafe
-    [ first3-unsafe ] keep 3 swap nth-unsafe ; inline
+    [ first3-unsafe 3 ] [ nth-unsafe ] bi ; inline
 
 : exchange-unsafe ( m n seq -- )
     [ tuck nth-unsafe >r nth-unsafe r> ] 3keep tuck
@@ -179,7 +180,7 @@ M: reversed length reversed-seq length ;
 
 INSTANCE: reversed virtual-sequence
 
-: reverse ( seq -- newseq ) [ <reversed> ] keep like ;
+: reverse ( seq -- newseq ) [ <reversed> ] [ like ] bi ;
 
 ! A slice of another sequence.
 TUPLE: slice from to seq ;
@@ -201,7 +202,7 @@ ERROR: slice-error reason ;
 
 M: slice virtual-seq slice-seq ;
 
-M: slice virtual@ [ slice-from + ] keep slice-seq ;
+M: slice virtual@ [ slice-from + ] [ slice-seq ] bi ;
 
 M: slice length dup slice-to swap slice-from - ;
 
@@ -209,10 +210,14 @@ M: slice length dup slice-to swap slice-from - ;
 
 : tail-slice ( seq n -- slice ) (tail) <slice> ;
 
+: rest-slice ( seq -- slice ) 1 tail-slice ;
+
 : head-slice* ( seq n -- slice ) from-end head-slice ;
 
 : tail-slice* ( seq n -- slice ) from-end tail-slice ;
 
+: but-last-slice ( seq -- slice ) 1 head-slice* ;
+
 INSTANCE: slice virtual-sequence
 
 ! One element repeated many times
@@ -248,16 +253,20 @@ INSTANCE: repetition immutable-sequence
 PRIVATE>
 
 : subseq ( from to seq -- subseq )
-    [ check-slice prepare-subseq (copy) ] keep like ;
+    [ check-slice prepare-subseq (copy) ] [ like ] bi ;
 
 : head ( seq n -- headseq ) (head) subseq ;
 
 : tail ( seq n -- tailseq ) (tail) subseq ;
 
+: rest ( seq -- tailseq ) 1 tail ;
+
 : head* ( seq n -- headseq ) from-end head ;
 
 : tail* ( seq n -- tailseq ) from-end tail ;
 
+: but-last ( seq -- headseq ) 1 head* ;
+
 : copy ( src i dst -- )
     pick length >r 3dup check-copy spin 0 r>
     (copy) drop ; inline
@@ -267,11 +276,12 @@ M: sequence clone-like
 
 M: immutable-sequence clone-like like ;
 
-: push-all ( src dest -- ) [ length ] keep copy ;
+: push-all ( src dest -- ) [ length ] [ copy ] bi ;
 
 : ((append)) ( seq1 seq2 accum -- accum )
-    [ >r over length r> copy ] keep
-    [ 0 swap copy ] keep ; inline
+    [ >r over length r> copy ]
+    [ 0 swap copy ] 
+    [ ] tri ; inline
 
 : (append) ( seq1 seq2 exemplar -- newseq )
     >r over length over length + r>
@@ -279,8 +289,8 @@ M: immutable-sequence clone-like like ;
 
 : (3append) ( seq1 seq2 seq3 exemplar -- newseq )
     >r pick length pick length pick length + + r> [
-        [ >r pick length pick length + r> copy ] keep
-        ((append))
+        [ >r pick length pick length + r> copy ]
+        [ ((append)) ] bi
     ] new-like ; inline
 
 : append ( seq1 seq2 -- newseq ) over (append) ;
@@ -323,7 +333,7 @@ M: immutable-sequence clone-like like ;
 : (find) ( seq quot quot' -- i elt )
     pick >r >r (each) r> call r> finish-find ; inline
 
-: (find*) ( n seq quot quot' -- i elt )
+: (find-from) ( n seq quot quot' -- i elt )
     >r >r 2dup bounds-check? [
         r> r> (find)
     ] [
@@ -332,7 +342,7 @@ M: immutable-sequence clone-like like ;
 
 : (monotonic) ( seq quot -- ? )
     [ 2dup nth-unsafe rot 1+ rot nth-unsafe ]
-    swap compose curry ; inline
+    prepose curry ; inline
 
 : (interleave) ( n elt between quot -- )
     roll zero? [ nip ] [ swapd 2slip ] if call ; inline
@@ -373,14 +383,14 @@ PRIVATE>
 : 2all? ( seq1 seq2 quot -- ? )
     (2each) all-integers? ; inline
 
-: find* ( n seq quot -- i elt )
-    [ (find-integer) ] (find*) ; inline
+: find-from ( n seq quot -- i elt )
+    [ (find-integer) ] (find-from) ; inline
 
 : find ( seq quot -- i elt )
     [ find-integer ] (find) ; inline
 
-: find-last* ( n seq quot -- i elt )
-    [ nip find-last-integer ] (find*) ; inline
+: find-last-from ( n seq quot -- i elt )
+    [ nip find-last-integer ] (find-from) ; inline
 
 : find-last ( seq quot -- i elt )
     [ >r 1- r> find-last-integer ] (find) ; inline
@@ -394,7 +404,7 @@ PRIVATE>
 : pusher ( quot -- quot accum )
     V{ } clone [ [ push-if ] 2curry ] keep ; inline
 
-: subset ( seq quot -- subseq )
+: filter ( seq quot -- subseq )
     over >r pusher >r each r> r> like ; inline
 
 : monotonic? ( seq quot -- ? )
@@ -414,14 +424,14 @@ PRIVATE>
 : index ( obj seq -- n )
     [ = ] with find drop ;
 
-: index* ( obj i seq -- n )
-    rot [ = ] curry find* drop ;
+: index-from ( obj i seq -- n )
+    rot [ = ] curry find-from drop ;
 
 : last-index ( obj seq -- n )
     [ = ] with find-last drop ;
 
-: last-index* ( obj i seq -- n )
-    rot [ = ] curry find-last* drop ;
+: last-index-from ( obj i seq -- n )
+    rot [ = ] curry find-last-from drop ;
 
 : contains? ( seq quot -- ? )
     find drop >boolean ; inline
@@ -433,7 +443,7 @@ PRIVATE>
     [ eq? ] with contains? ;
 
 : remove ( obj seq -- newseq )
-    [ = not ] with subset ;
+    [ = not ] with filter ;
 
 : cache-nth ( i seq quot -- elt )
     2over ?nth dup [
@@ -472,7 +482,7 @@ M: slice equal? over slice? [ sequence= ] [ 2drop f ] if ;
 
 : move ( to from seq -- )
     2over number=
-    [ 3drop ] [ [ nth swap ] keep set-nth ] if ; inline
+    [ 3drop ] [ [ nth swap ] [ set-nth ] bi ] if ; inline
 
 : (delete) ( elt store scan seq -- elt store scan seq )
     2dup length < [
@@ -497,9 +507,9 @@ M: slice equal? over slice? [ sequence= ] [ 2drop f ] if ;
         [ 0 swap copy ] keep
     ] new-like ;
 
-: peek ( seq -- elt ) dup length 1- swap nth ;
+: peek ( seq -- elt ) [ length 1- ] [ nth ] bi ;
 
-: pop* ( seq -- ) dup length 1- swap set-length ;
+: pop* ( seq -- ) [ length 1- ] [ set-length ] bi ;
 
 : move-backward ( shift from to seq -- )
     2over number= [
@@ -519,7 +529,7 @@ M: slice equal? over slice? [ sequence= ] [ 2drop f ] if ;
 
 : (open-slice) ( shift from to seq ? -- )
     [
-        >r >r 1- r> 1- r> move-forward
+        >r [ 1- ] bi@ r> move-forward
     ] [
         >r >r over - r> r> move-backward
     ] if ;
@@ -544,7 +554,7 @@ M: slice equal? over slice? [ sequence= ] [ 2drop f ] if ;
     copy ;
 
 : pop ( seq -- elt )
-    dup length 1- swap [ nth ] 2keep set-length ;
+    [ length 1- ] [ [ nth ] [ set-length ] 2bi ] bi ;
 
 : all-equal? ( seq -- ? ) [ = ] monotonic? ;
 
@@ -609,7 +619,7 @@ M: slice equal? over slice? [ sequence= ] [ 2drop f ] if ;
     ] if ;
 
 : cut-slice ( seq n -- before after )
-    [ head-slice ] 2keep tail-slice ;
+    [ head-slice ] [ tail-slice ] 2bi ;
 
 : midpoint@ ( seq -- n ) length 2/ ; inline
 
@@ -634,10 +644,10 @@ M: slice equal? over slice? [ sequence= ] [ 2drop f ] if ;
     ] if ; inline
 
 : cut ( seq n -- before after )
-    [ head ] 2keep tail ;
+    [ head ] [ tail ] 2bi ;
 
 : cut* ( seq n -- before after )
-    [ head* ] 2keep tail* ;
+    [ head* ] [ tail* ] 2bi ;
 
 <PRIVATE
 
@@ -650,7 +660,7 @@ PRIVATE>
 
 : start* ( subseq seq n -- i )
     pick length pick length swap - 1+
-    [ (start) ] find*
+    [ (start) ] find-from
     swap >r 3drop r> ;
 
 : start ( subseq seq -- i ) 0 start* ; inline
@@ -662,10 +672,16 @@ PRIVATE>
     tuck tail-slice >r tail-slice r> ;
 
 : unclip ( seq -- rest first )
-    dup 1 tail swap first ;
+    [ rest ] [ first ] bi ;
+
+: unclip-last ( seq -- butfirst last )
+    [ but-last ] [ peek ] bi ;
 
 : unclip-slice ( seq -- rest first )
-    dup 1 tail-slice swap first ;
+    [ rest-slice ] [ first ] bi ;
+
+: unclip-last-slice ( seq -- butfirst last )
+    [ but-last-slice ] [ peek ] bi ;
 
 : <flat-slice> ( seq -- slice )
     dup slice? [ { } like ] when 0 over length rot <slice> ;
@@ -680,7 +696,7 @@ PRIVATE>
     [ 1+ head ] [ 0 head ] if* ; inline
 
 : trim ( seq quot -- newseq )
-    [ left-trim ] keep right-trim ; inline
+    [ left-trim ] [ right-trim ] bi ; inline
 
 : sum ( seq -- n ) 0 [ + ] binary-reduce ;
 : product ( seq -- n ) 1 [ * ] binary-reduce ;
index 8b6859260dcb29d60b39308f62b2bb198c7e3b9f..f4e2557a718318e76f923d828023c8acedbfc4c1 100644 (file)
@@ -2,7 +2,7 @@ USING: kernel help.markup help.syntax sequences ;
 IN: sets
 
 ARTICLE: "sets" "Set-theoretic operations on sequences"
-"Set-theoretic operations on sequences are defined on the " { $vocab-link "sets" } " vocabulary. These operations use hashtables internally to achieve linear running time."
+"Set-theoretic operations on sequences are defined on the " { $vocab-link "sets" } " vocabulary. All of these operations use hashtables internally to achieve linear running time."
 $nl
 "Remove duplicates:"
 { $subsection prune }
@@ -12,8 +12,14 @@ $nl
 { $subsection diff }
 { $subsection intersect }
 { $subsection union }
+{ $subsection subset? }
+{ $subsection set= }
+"A word used to implement the above:"
+{ $subsection unique }
 { $see-also member? memq? contains? all? "assocs-sets" } ;
 
+ABOUT: "sets"
+
 HELP: unique
 { $values { "seq" "a sequence" } { "assoc" "an assoc" } }
 { $description "Outputs a new assoc where the keys and values are equal." }
@@ -39,9 +45,9 @@ HELP: all-unique?
 
 HELP: diff
 { $values { "seq1" sequence } { "seq2" sequence } { "newseq" sequence } }
-{ $description "Outputs a sequence consisting of elements present in " { $snippet "seq2" } " but not " { $snippet "seq1" } ", comparing elements for equality." 
+{ $description "Outputs a sequence consisting of elements present in " { $snippet "seq1" } " but not " { $snippet "seq2" } ", comparing elements for equality." 
 } { $examples
-    { $example "USING: sets prettyprint ;" "{ 1 2 3 } { 2 3 4 } diff ." "{ 4 }" }
+    { $example "USING: sets prettyprint ;" "{ 1 2 3 } { 2 3 4 } diff ." "{ 1 }" }
 } ;
 
 HELP: intersect
@@ -59,3 +65,11 @@ HELP: union
 } ;
 
 { diff intersect union } related-words
+
+HELP: subset?
+{ $values { "seq1" sequence } { "seq2" sequence } { "?" "a boolean" } }
+{ $description "Tests if every element of " { $snippet "seq1" } " is contained in " { $snippet "seq2" } "." } ;
+
+HELP: set=
+{ $values { "seq1" sequence } { "seq2" sequence } { "?" "a boolean" } }
+{ $description "Tests if both sequences contain the same elements, disregrading order and duplicates." } ;
index 4f8c8cd1035a3cd04ff12db25e7f4be95ab3aae1..86ee100da5a91cca999e3f07ae75eeb0fdaa47f0 100644 (file)
@@ -11,7 +11,7 @@ IN: sets.tests
 [ { 2 3 } ] [ { 1 2 3 } { 2 3 4 } intersect ] unit-test
 
 [ { } ] [ { } { } diff ] unit-test
-[ { 4 } ] [ { 1 2 3 } { 2 3 4 } diff ] unit-test
+[ { 1 } ] [ { 1 2 3 } { 2 3 4 } diff ] unit-test
 
 [ V{ } ] [ { } { } union ] unit-test
 [ V{ 1 2 3 4 } ] [ { 1 2 3 } { 2 3 4 } union ] unit-test
index 31c39c6105b27445c894acc759b8dfd1595609c5..b0d26e0f301cd65b456762d8894ef9af67f1bc17 100644 (file)
@@ -22,10 +22,16 @@ IN: sets
     dup length <hashtable> [ (all-unique?) ] curry all? ;
 
 : intersect ( seq1 seq2 -- newseq )
-    unique [ key? ] curry subset ;
+    unique [ key? ] curry filter ;
 
 : diff ( seq1 seq2 -- newseq )
-    swap unique [ key? not ] curry subset ;
+    unique [ key? not ] curry filter ;
 
 : union ( seq1 seq2 -- newseq )
     append prune ;
+
+: subset? ( seq1 seq2 -- ? )
+    unique [ key? ] curry all? ;
+
+: set= ( seq1 seq2 -- ? )
+    [ unique ] bi@ = ;
index 2ec8f3d0d1398501a1f501ec2fe3723377a8c5bf..90f468a185c3bfe20cbb99af3a269e936a896304 100755 (executable)
@@ -86,7 +86,7 @@ PREDICATE: slot-writer < word "writing" word-prop >boolean ;
             { [ over string? ] [ >r dupd r> short-slot ] }\r
             { [ over array? ] [ long-slot ] }\r
         } cond\r
-    ] 2map [ ] subset nip ;\r
+    ] 2map [ ] filter nip ;\r
 \r
 : slot-of-reader ( reader specs -- spec/f )\r
     [ slot-spec-reader eq? ] with find nip ;\r
index 4fa5c7974d2b15c6e8e386c03bdb72ee47193dee..5827a711c82160f17c8071cf4f133afc8b71e2af 100644 (file)
@@ -1,5 +1,6 @@
-USING: sorting help.markup help.syntax kernel words math
-sequences ;
+USING: help.markup help.syntax kernel words math
+sequences math.order ;
+IN: sorting
 
 ARTICLE: "sequences-sorting" "Sorting and binary search"
 "Sorting and binary search combinators all take comparator quotations with stack effect " { $snippet "( elt1 elt2 -- n )" } " that order the two given elements and output a value whose sign denotes the result:"
@@ -61,3 +62,5 @@ HELP: binsearch*
 { $description "Variant of " { $link binsearch } " which outputs the found element rather than its index in the sequence."
 $nl
 "Outputs " { $link f } " if the sequence is empty. If the sequence has at least one element, this word always outputs a sequence element." } ;
+
+{ <=> compare natural-sort sort-keys sort-values } related-words
index 732aeb045d909cddb43572430e93e452922e9475..a56c41b620193d9a2f3fc8d3499075da5d817888 100755 (executable)
@@ -1,5 +1,5 @@
-USING: sorting sequences kernel math random tools.test
-vectors ;
+USING: sorting sequences kernel math math.order random
+tools.test vectors ;
 IN: sorting.tests
 
 [ [ ] ] [ [ ] natural-sort ] unit-test
@@ -19,10 +19,10 @@ unit-test
 
 [ 3 ] [ { 1 2 3 4 } midpoint ] unit-test
 
-[ f ] [ 3 { } [ - ] binsearch ] unit-test
-[ 0 ] [ 3 { 3 } [ - ] binsearch ] unit-test
-[ 1 ] [ 2 { 1 2 3 } [ - ] binsearch ] unit-test
-[ 3 ] [ 4 { 1 2 3 4 5 6 } [ - ] binsearch ] unit-test
-[ 1 ] [ 3.5 { 1 2 3 4 5 6 7 8 } [ - ] binsearch ] unit-test
-[ 3 ] [ 5.5 { 1 2 3 4 5 6 7 8 } [ - ] binsearch ] unit-test
-[ 10 ] [ 10 20 >vector [ - ] binsearch ] unit-test
+[ f ] [ 3 { } [ <=> ] binsearch ] unit-test
+[ 0 ] [ 3 { 3 } [ <=> ] binsearch ] unit-test
+[ 1 ] [ 2 { 1 2 3 } [ <=> ] binsearch ] unit-test
+[ 3 ] [ 4 { 1 2 3 4 5 6 } [ <=> ] binsearch ] unit-test
+[ 2 ] [ 3.5 { 1 2 3 4 5 6 7 8 } [ <=> ] binsearch ] unit-test
+[ 4 ] [ 5.5 { 1 2 3 4 5 6 7 8 } [ <=> ] binsearch ] unit-test
+[ 10 ] [ 10 20 >vector [ <=> ] binsearch ] unit-test
index 5f81b1718771d4905a94416a617b015d24969b36..dac1c08e46525a6786a7363433258e6665bfc626 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays kernel math sequences vectors
-sequences sequences.private growable ;
+USING: arrays kernel math sequences vectors math.order
+sequences sequences.private growable math.order ;
 IN: sorting
 
 DEFER: sort
@@ -17,7 +17,7 @@ DEFER: sort
     dup slice-from 1+ swap set-slice-from ; inline
 
 : smallest ( iter1 iter2 quot -- elt )
-    >r over this over this r> call 0 <
+    >r over this over this r> call +lt+ eq?
     -rot ? [ this ] keep next ; inline
 
 : (merge) ( iter1 iter2 quot accum -- )
@@ -58,13 +58,13 @@ PRIVATE>
     [ midpoint@ ] keep nth-unsafe ; inline
 
 : partition ( seq n -- slice )
-    1 < swap halves ? ; inline
+    +gt+ eq? not swap halves ? ; inline
 
 : (binsearch) ( elt quot seq -- i )
     dup length 1 <= [
         slice-from 2nip
     ] [
-        [ midpoint swap call ] 3keep roll dup zero?
+        [ midpoint swap call ] 3keep roll dup +eq+ eq?
         [ drop dup slice-from swap midpoint@ + 2nip ]
         [ partition (binsearch) ] if
     ] if ; inline
index 5703b631f4376567f54cdd78835928521d0dc46e..36a1806e12f6594304d4e5e274f83f16db445953 100755 (executable)
@@ -3,8 +3,8 @@
 USING: arrays definitions generic assocs kernel math namespaces
 prettyprint sequences strings vectors words quotations inspector
 io.styles io combinators sorting splitting math.parser effects
-continuations debugger io.files io.crc32 vocabs hashtables
-graphs compiler.units io.encodings.utf8 accessors ;
+continuations debugger io.files checksums checksums.crc32 vocabs
+hashtables graphs compiler.units io.encodings.utf8 accessors ;
 IN: source-files
 
 SYMBOL: source-files
@@ -15,11 +15,11 @@ checksum
 uses definitions ;
 
 : record-checksum ( lines source-file -- )
-    >r lines-crc32 r> set-source-file-checksum ;
+    >r crc32 checksum-lines r> set-source-file-checksum ;
 
 : (xref-source) ( source-file -- pathname uses )
     dup source-file-path <pathname>
-    swap source-file-uses [ crossref? ] subset ;
+    swap source-file-uses [ crossref? ] filter ;
 
 : xref-source ( source-file -- )
     (xref-source) crossref get add-vertex ;
index f840ca15adfb8e778095106c828744105c5e01d8..9f6ae75d321dc5b3463f3481752a0e9bb208ddbd 100755 (executable)
@@ -1,42 +1,72 @@
-! Copyright (C) 2005, 2007 Slava Pestov.
+! Copyright (C) 2005, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel math namespaces strings arrays vectors sequences
-sets ;
+sets math.order accessors ;
 IN: splitting
 
-TUPLE: groups seq n sliced? ;
+TUPLE: abstract-groups seq n ;
 
-: check-groups 0 <= [ "Invalid group count" throw ] when ;
+: check-groups dup 0 <= [ "Invalid group count" throw ] when ; inline
 
-: <groups> ( seq n -- groups )
-    dup check-groups f groups boa ; inline
+: construct-groups ( seq n class -- groups )
+    >r check-groups r> boa ; inline
 
-: <sliced-groups> ( seq n -- groups )
-    <groups> t over set-groups-sliced? ;
+GENERIC: group@ ( n groups -- from to seq )
+
+M: abstract-groups nth group@ subseq ;
+
+M: abstract-groups set-nth group@ <slice> 0 swap copy ;
+
+M: abstract-groups like drop { } like ;
+
+INSTANCE: abstract-groups sequence
+
+TUPLE: groups < abstract-groups ;
+
+: <groups> ( seq n -- groups )
+    groups construct-groups ; inline
 
 M: groups length
-    dup groups-seq length swap groups-n [ + 1- ] keep /i ;
+    [ seq>> length ] [ n>> ] bi [ + 1- ] keep /i ;
 
 M: groups set-length
-    [ groups-n * ] keep groups-seq set-length ;
+    [ n>> * ] [ seq>> ] bi set-length ;
 
-: group@ ( n groups -- from to seq )
-    [ groups-n [ * dup ] keep + ] keep
-    groups-seq [ length min ] keep ;
+M: groups group@
+    [ n>> [ * dup ] keep + ] [ seq>> ] bi [ length min ] keep ;
 
-M: groups nth
-    [ group@ ] keep
-    groups-sliced? [ <slice> ] [ subseq ] if ;
+TUPLE: sliced-groups < groups ;
 
-M: groups set-nth
-    group@ <slice> 0 swap copy ;
+: <sliced-groups> ( seq n -- groups )
+    sliced-groups construct-groups ; inline
+
+M: sliced-groups nth group@ <slice> ;
+
+TUPLE: clumps < abstract-groups ;
+
+: <clumps> ( seq n -- groups )
+    clumps construct-groups ; inline
+
+M: clumps length
+    [ seq>> length ] [ n>> ] bi - 1+ ;
 
-M: groups like drop { } like ;
+M: clumps set-length
+    [ n>> + 1- ] [ seq>> ] bi set-length ;
 
-INSTANCE: groups sequence
+M: clumps group@
+    [ n>> over + ] [ seq>> ] bi ;
+
+TUPLE: sliced-clumps < groups ;
+
+: <sliced-clumps> ( seq n -- groups )
+    sliced-clumps construct-groups ; inline
+
+M: sliced-clumps nth group@ <slice> ;
 
 : group ( seq n -- array ) <groups> { } like ;
 
+: clump ( seq n -- array ) <clumps> { } like ;
+
 : ?head ( seq begin -- newseq ? )
     2dup head? [ length tail t ] [ drop f ] if ;
 
@@ -61,7 +91,7 @@ INSTANCE: groups sequence
     dup [ swap ] when ;
 
 : (split) ( separators n seq -- )
-    3dup rot [ member? ] curry find* drop
+    3dup rot [ member? ] curry find-from drop
     [ [ swap subseq , ] 2keep 1+ swap (split) ]
     [ swap dup zero? [ drop ] [ tail ] if , drop ] if* ; inline
 
@@ -74,7 +104,7 @@ INSTANCE: groups sequence
         1array
     ] [
         "\n" split [
-            1 head-slice* [
+            but-last-slice [
                 "\r" ?tail drop "\r" split
             ] map
         ] keep peek "\r" split suffix concat
index 961c8cdf6eb4730bb008a947ac7b2444dcad7ffc..44e1d8859ffb4f204eb26531b6012e1711307be6 100755 (executable)
@@ -1,4 +1,4 @@
-USING: continuations kernel math namespaces strings
+USING: continuations kernel math math.order namespaces strings
 strings.private sbufs tools.test sequences vectors arrays memory
 prettyprint io.streams.null ;
 IN: strings.tests
@@ -31,6 +31,8 @@ IN: strings.tests
 
 [ t ] [ "abc" "abd" before? ] unit-test
 [ t ] [ "z" "abd" after? ] unit-test
+[ "abc" ] [ "abc" "abd" min ] unit-test
+[ "z" ] [ "z" "abd" max ] unit-test
 
 [ 0 10 "hello" subseq ] must-fail
 
index a2d15d298177c12b7fe47b925ef6e499f293b677..b72ed9a2cb6b967d6ca8afef6d9d19e935c1a6cc 100755 (executable)
@@ -190,7 +190,7 @@ HELP: delimiter
 HELP: parsing
 { $syntax ": foo ... ; parsing" }
 { $description "Declares the most recently defined word as a parsing word." }
-{ $examples "In the below example, the " { $snippet "world" } " word is never called, however its body references a parsing word which executes immediately:" { $example "USE: io" "<< : hello \"Hello parser!\" print ; parsing >>\n: world hello ;" "Hello parser!" } } ;
+{ $examples "In the below example, the " { $snippet "world" } " word is never called, however its body references a parsing word which executes immediately:" { $example "USE: io" "IN: scratchpad" "<< : hello \"Hello parser!\" print ; parsing >>\n: world hello ;" "Hello parser!" } } ;
 
 HELP: inline
 { $syntax ": foo ... ; inline" }
@@ -338,7 +338,7 @@ HELP: SYMBOL:
 { $syntax "SYMBOL: word" }
 { $values { "word" "a new word to define" } }
 { $description "Defines a new symbol word in the current vocabulary. Symbols push themselves on the stack when executed, and are used to identify variables (see " { $link "namespaces" } ") as well as for storing crufties in word properties (see " { $link "word-props" } ")." }
-{ $examples { $example "USE: prettyprint" "SYMBOL: foo\nfoo ." "foo" } } ;
+{ $examples { $example "USE: prettyprint" "IN: scratchpad" "SYMBOL: foo\nfoo ." "foo" } } ;
 
 { define-symbol POSTPONE: SYMBOL: } related-words
 
@@ -472,6 +472,7 @@ HELP: HOOK:
 { $examples
     { $example
         "USING: io namespaces ;"
+        "IN: scratchpad"
         "SYMBOL: transport"
         "TUPLE: land-transport ;"
         "TUPLE: air-transport ;"
index 566f5471f4af1f00829621cfb3ff5d0c2103b154..2e1c46fac1e0bc17883a049a09c8a5ef12f1fb29 100755 (executable)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2004, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien arrays bit-arrays byte-arrays
+USING: alien arrays bit-arrays byte-arrays byte-vectors
 definitions generic hashtables kernel math
 namespaces parser sequences strings sbufs vectors words
 quotations io assocs splitting classes.tuple generic.standard
@@ -79,6 +79,7 @@ IN: bootstrap.syntax
     "{" [ \ } [ >array ] parse-literal ] define-syntax
     "V{" [ \ } [ >vector ] parse-literal ] define-syntax
     "B{" [ \ } [ >byte-array ] parse-literal ] define-syntax
+    "BV{" [ \ } [ >byte-vector ] parse-literal ] define-syntax
     "?{" [ \ } [ >bit-array ] parse-literal ] define-syntax
     "F{" [ \ } [ >float-array ] parse-literal ] define-syntax
     "H{" [ \ } [ >hashtable ] parse-literal ] define-syntax
@@ -189,8 +190,12 @@ IN: bootstrap.syntax
     ] define-syntax
 
     "call-next-method" [
-        current-class get literalize parsed
-        current-generic get literalize parsed
-        \ (call-next-method) parsed
+        current-class get current-generic get
+        2dup [ word? ] both? [
+            [ literalize parsed ] bi@
+            \ (call-next-method) parsed
+        ] [
+            not-in-a-method-error
+        ] if
     ] define-syntax
 ] with-compilation-unit
index 3f9ff54ac858553543d8fef5bc60cf629a5b28a3..7d8791d493c80bda4c15f0094ebaa15ab5810b86 100755 (executable)
@@ -116,10 +116,13 @@ $nl
 "Other threads may interrupt the sleep by calling " { $link interrupt } "." } ;
 
 HELP: sleep
-{ $values { "ms" "a non-negative integer" } }
-{ $description "Suspends the current thread for " { $snippet "ms" } " milliseconds."
+{ $values { "dt" "a duration" } }
+{ $description "Suspends the current thread for the given duration."
 $nl
-"Other threads may interrupt the sleep by calling " { $link interrupt } "." } ;
+"Other threads may interrupt the sleep by calling " { $link interrupt } "." }
+{ $examples
+    { $code "USING: threads calendar ;" "10 seconds sleep" }
+} ;
 
 HELP: interrupt
 { $values { "thread" thread } }
index 0ac607f0ede98baf658806fe7f19a73838079a3c..0e33ccd94cde7365dd7256771886afdf5d53a0fa 100755 (executable)
@@ -1,5 +1,6 @@
 USING: namespaces io tools.test threads kernel
-concurrency.combinators math ;
+concurrency.combinators concurrency.promises locals math
+words ;
 IN: threads.tests
 
 3 "x" set
@@ -27,3 +28,16 @@ yield
         "i" tget
     ] parallel-map
 ] unit-test
+
+[ [ 3 throw ] "A" suspend ] [ 3 = ] must-fail-with
+
+:: spawn-namespace-test ( -- )
+    [let | p [ <promise> ] g [ gensym ] |
+        [
+            g "x" set
+            [ "x" get p fulfill ] "B" spawn drop
+        ] with-scope
+        p ?promise g eq?
+    ] ;
+
+[ t ] [ spawn-namespace-test ] unit-test
index 2f9c3a73de3c8efe2597c047108d825c51a9d5a9..a1c7e208dc15021682ed287dd43a9ec6c62eb53c 100755 (executable)
@@ -1,17 +1,18 @@
 ! Copyright (C) 2004, 2008 Slava Pestov.
 ! Copyright (C) 2005 Mackenzie Straight.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: threads
 USING: arrays hashtables heaps kernel kernel.private math
 namespaces sequences vectors continuations continuations.private
-dlists assocs system combinators init boxes accessors ;
+dlists assocs system combinators init boxes accessors
+math.order ;
+IN: threads
 
 SYMBOL: initial-thread
 
 TUPLE: thread
 name quot exit-handler
 id
-continuation state
+continuation state runnable
 mailbox variables sleep-entry ;
 
 : self ( -- thread ) 40 getenv ; inline
@@ -90,9 +91,11 @@ PRIVATE>
         [ sleep-queue heap-peek nip millis [-] ]
     } cond ;
 
+DEFER: stop
+
 <PRIVATE
 
-: schedule-sleep ( thread ms -- )
+: schedule-sleep ( thread dt -- )
     >r check-registered dup r> sleep-queue heap-push*
     >>sleep-entry drop ;
 
@@ -110,36 +113,57 @@ PRIVATE>
     [ ] while
     drop ;
 
+: start ( namestack thread -- )
+    [
+        set-self
+        set-namestack
+        V{ } set-catchstack
+        { } set-retainstack
+        { } set-datastack
+        self quot>> [ call stop ] call-clear
+    ] 2 (throw) ;
+
+DEFER: next
+
+: no-runnable-threads ( -- * )
+    ! We should never be in a state where the only threads
+    ! are sleeping; the I/O wait thread is always runnable.
+    ! However, if it dies, we handle this case
+    ! semi-gracefully.
+    !
+    ! And if sleep-time outputs f, there are no sleeping
+    ! threads either... so WTF.
+    sleep-time [ die 0 ] unless* (sleep) next ;
+
+: (next) ( arg thread -- * )
+    f >>state
+    dup set-self
+    dup runnable>> [
+        continuation>> box> continue-with
+    ] [
+        t >>runnable start
+    ] if ;
+
 : next ( -- * )
     expire-sleep-loop
     run-queue dup dlist-empty? [
-        ! We should never be in a state where the only threads
-        ! are sleeping; the I/O wait thread is always runnable.
-        ! However, if it dies, we handle this case
-        ! semi-gracefully.
-        !
-        ! And if sleep-time outputs f, there are no sleeping
-        ! threads either... so WTF.
-        drop sleep-time [ die 0 ] unless* (sleep) next
+        drop no-runnable-threads
     ] [
-        pop-back
-        dup array? [ first2 ] [ f swap ] if dup set-self
-        f >>state
-        continuation>> box>
-        continue-with
+        pop-back dup array? [ first2 ] [ f swap ] if (next)
     ] if ;
 
 PRIVATE>
 
 : stop ( -- )
-    self dup exit-handler>> call
-    unregister-thread next ;
+    self [ exit-handler>> call ] [ unregister-thread ] bi next ;
 
 : suspend ( quot state -- obj )
     [
-        self continuation>> >box
-        self (>>state)
-        self swap call next
+        >r
+        >r self swap call
+        r> self (>>state)
+        r> self continuation>> >box
+        next
     ] callcc1 2nip ; inline
 
 : yield ( -- ) [ resume ] f suspend drop ;
@@ -152,7 +176,7 @@ M: integer sleep-until
 M: f sleep-until
     drop [ drop ] "interrupt" suspend drop ;
 
-GENERIC: sleep ( ms -- )
+GENERIC: sleep ( dt -- )
 
 M: real sleep
     millis + >integer sleep-until ;
@@ -165,16 +189,7 @@ M: real sleep
     ] when drop ;
 
 : (spawn) ( thread -- )
-    [
-        resume-now [
-            dup set-self
-            dup register-thread
-            V{ } set-catchstack
-            { } set-retainstack
-            >r { } set-datastack r>
-            quot>> [ call stop ] call-clear
-        ] 1 (throw)
-    ] "spawn" suspend 2drop ;
+    [ register-thread ] [ namestack swap resume-with ] bi ;
 
 : spawn ( quot name -- thread )
     <thread> [ (spawn) ] keep ;
@@ -183,8 +198,8 @@ M: real sleep
     >r [ [ ] [ ] while ] curry r> spawn ;
 
 : in-thread ( quot -- )
-    >r datastack namestack r>
-    [ >r set-namestack set-datastack r> call ] 3curry
+    >r datastack r>
+    [ >r set-datastack r> call ] 2curry
     "Thread" spawn drop ;
 
 GENERIC: error-in-thread ( error thread -- )
@@ -198,6 +213,7 @@ GENERIC: error-in-thread ( error thread -- )
     initial-thread global
     [ drop f "Initial" <thread> ] cache
     <box> >>continuation
+    t >>runnable
     f >>state
     dup register-thread
     set-self ;
index 24a00189e4b021e2a537951e133f51437bf9c358..edd82b2596332e99728c686bed05013201c2ae06 100755 (executable)
@@ -76,14 +76,14 @@ SYMBOL: load-vocab-hook ! ( name -- )
 : words-named ( str -- seq )
     dictionary get values
     [ vocab-words at ] with map
-    [ ] subset ;
+    [ ] filter ;
 
 : child-vocab? ( prefix name -- ? )
     2dup = pick empty? or
     [ 2drop t ] [ swap CHAR: . suffix head? ] if ;
 
 : child-vocabs ( vocab -- seq )
-    vocab-name vocabs [ child-vocab? ] with subset ;
+    vocab-name vocabs [ child-vocab? ] with filter ;
 
 TUPLE: vocab-link name ;
 
index f259378f7e72ef24cc4894e4f53a102ead1b8a5a..14e6197683c1411220af1872cdd7228734b8fbe9 100755 (executable)
@@ -197,7 +197,7 @@ HELP: execute ( word -- )
 { $values { "word" word } }
 { $description "Executes a word." }
 { $examples
-    { $example "USING: kernel io words ;" ": twice dup execute execute ;\n: hello \"Hello\" print ;\n\\ hello twice" "Hello\nHello" }
+    { $example "USING: kernel io words ;" "IN: scratchpad" ": twice dup execute execute ;\n: hello \"Hello\" print ;\n\\ hello twice" "Hello\nHello" }
 } ;
 
 HELP: word-props ( word -- props )
@@ -278,7 +278,7 @@ HELP: reset-generic
 $low-level-note
 { $side-effects "word" } ;
 
-HELP: <word>
+HELP: <word> ( name vocab -- word )
 { $values { "name" string } { "vocab" string } { "word" word } }
 { $description "Allocates an uninterned word with the specified name and vocabulary, and a blank word property hashtable. User code should call " { $link gensym } " to create uninterned words and " { $link create } " to create interned words." } ;
 
@@ -300,7 +300,7 @@ HELP: word
 
 HELP: set-word
 { $values { "word" word } }
-{ $description "Sets the recently defined word. Usually you would call " { $link save-location } " on a newly-defined word instead, which will in turn call this word." } ;
+{ $description "Sets the recently defined word." } ;
 
 HELP: lookup
 { $values { "name" string } { "vocab" string } { "word" "a word or " { $link f } } }
index 694e54cf96102236826e1ceb6f6f939f3f55d2dd..2a164ab11dae747b19d12c8e00a96a3f8c9069cd 100755 (executable)
@@ -68,7 +68,7 @@ FORGET: another-forgotten
 : foe fee ;
 : fie foe ;
 
-[ t ] [ \ fee usage [ word? ] subset empty? ] unit-test
+[ t ] [ \ fee usage [ word? ] filter empty? ] unit-test
 [ t ] [ \ foe usage empty? ] unit-test
 [ f ] [ \ foe crossref get key? ] unit-test
 
@@ -80,7 +80,7 @@ FORGET: foe
 ] unit-test
 
 [ t ] [
-    \ * usage [ word? ] subset [ crossref? ] all?
+    \ * usage [ word? ] filter [ crossref? ] all?
 ] unit-test
 
 DEFER: calls-a-gensym
index 3466544eef0f407afd9b0b84855693b01cf07686..138b1ef928d6782c2769d3b49da7eefafadf3192 100755 (executable)
@@ -2,7 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays definitions graphs assocs kernel kernel.private
 slots.private math namespaces sequences strings vectors sbufs
-quotations assocs hashtables sorting words.private vocabs ;
+quotations assocs hashtables sorting words.private vocabs
+math.order ;
 IN: words
 
 : word ( -- word ) \ word get-global ;
@@ -101,7 +102,7 @@ SYMBOL: compiled-crossref
 compiled-crossref global [ H{ } assoc-like ] change-at
 
 : compiled-xref ( word dependencies -- )
-    [ drop compiled-crossref? ] assoc-subset
+    [ drop compiled-crossref? ] assoc-filter
     2dup "compiled-uses" set-word-prop
     compiled-crossref get add-vertex* ;
 
@@ -121,7 +122,7 @@ SYMBOL: +called+
 
 : compiled-usages ( words -- seq )
     [ [ dup ] H{ } map>assoc dup ] keep [
-        compiled-usage [ nip +inlined+ eq? ] assoc-subset update
+        compiled-usage [ nip +inlined+ eq? ] assoc-filter update
     ] with each keys ;
 
 <PRIVATE
@@ -135,9 +136,9 @@ SYMBOL: visited
         [ reset-on-redefine reset-props ]
         [ dup visited get set-at ]
         [
-            crossref get at keys [ word? ] subset [
+            crossref get at keys [ word? ] filter [
                 reset-on-redefine [ word-prop ] with contains?
-            ] subset
+            ] filter
             [ (redefined) ] each
         ] tri
     ] if ;
index bd1f02c44c58653abd0bacfff9720e6070a15a2d..ddc1d34121f72ab83b0eca24a676949069df0cde 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays calendar combinators generic init kernel math
 namespaces sequences heaps boxes threads debugger quotations
-assocs ;
+assocs math.order ;
 IN: alarms
 
 TUPLE: alarm quot time interval entry ;
index b2b13b1d78a11d8039c3162e94a078b4f7094ae9..7dacce734b7562da14a0f8be48a076ac7c763faf 100644 (file)
@@ -1,5 +1,5 @@
-IN: ascii.tests
 USING: ascii tools.test sequences kernel math ;
+IN: ascii.tests
 
 [ t ] [ CHAR: a letter? ] unit-test
 [ f ] [ CHAR: A letter? ] unit-test
@@ -8,7 +8,6 @@ USING: ascii tools.test sequences kernel math ;
 [ t ] [ CHAR: 0 digit? ] unit-test
 [ f ] [ CHAR: x digit? ] unit-test
 
-
 [ 4 ] [
     0 "There are Four Upper Case characters"
     [ LETTER? [ 1+ ] when ] each
index e4a365cd1bd83c41f4c073945b8edfb280f65972..30b801a95080276f15ecae86d7091310feab5d79 100755 (executable)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2005, 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: sequences math kernel ;\r
+USING: kernel math math.order sequences ;\r
 IN: ascii\r
 \r
 : blank? ( ch -- ? ) " \t\n\r" member? ; inline\r
index 329ba8256d05df136459abfab482409ba7992ead..1908e28d39365d30ecb350a51850e15bca3ea173 100755 (executable)
@@ -1,16 +1,16 @@
 USING: asn1 asn1.ldap io io.streams.string tools.test ;
 
 [ 6 ] [
-    "\u000002\u000001\u000006" <string-reader> [ asn-syntax read-ber ] with-stream
+    "\u000002\u000001\u000006" <string-reader> [ asn-syntax read-ber ] with-input-stream
 ] unit-test
 
 [ "testing" ] [
-    "\u000004\u000007testing" <string-reader> [ asn-syntax read-ber ] with-stream
+    "\u000004\u000007testing" <string-reader> [ asn-syntax read-ber ] with-input-stream
 ] unit-test
 
 [ { 1 { 3 "Administrator" "ad_is_bogus" } } ] [
     "0$\u000002\u000001\u000001`\u00001f\u000002\u000001\u000003\u000004\rAdministrator\u000080\u00000bad_is_bogus"
-    <string-reader> [ asn-syntax read-ber ] with-stream
+    <string-reader> [ asn-syntax read-ber ] with-input-stream
 ] unit-test
 
 [
index 32e3602f8fa9936d166d3816d7f408239ae677cc..50102d19292973af4a694e1a2e5b727c5486a1cd 100644 (file)
@@ -98,7 +98,7 @@ DEFER: read-ber
 
 SYMBOL: end
 
-: (read-array) ( stream -- )
+: (read-array) ( -- )
     elements get element-id [
         elements get element-syntax read-ber
         dup end = [ drop ] [ , (read-array) ] if
@@ -106,7 +106,7 @@ SYMBOL: end
 
 : read-array ( -- array ) [ (read-array) ] { } make ;
 
-: set-case ( -- )
+: set-case ( -- object )
     elements get element-newobj
     elements get element-objtype {
         { "boolean" [ "\0" = not ] }
index 92fb9aac81211ac2241a922b61aa6f1bacaad08d..247be44bad1d4bf0ecb8b2c3a32f07c5c0c0d21e 100755 (executable)
@@ -38,7 +38,7 @@ IN: assocs.lib
 : insert ( value variable -- ) namespace insert-at ;
 
 : generate-key ( assoc -- str )
-    >r 256 random-bits >hex r>
+    >r 32 random-bits >hex r>
     2dup key? [ nip generate-key ] [ drop ] if ;
 
 : set-at-unique ( value assoc -- key )
diff --git a/extra/bank/authors.txt b/extra/bank/authors.txt
new file mode 100644 (file)
index 0000000..e9c193b
--- /dev/null
@@ -0,0 +1 @@
+Alex Chapman
diff --git a/extra/bank/bank-tests.factor b/extra/bank/bank-tests.factor
new file mode 100644 (file)
index 0000000..2aa31f1
--- /dev/null
@@ -0,0 +1,34 @@
+USING: accessors arrays bank calendar kernel math math.functions namespaces tools.test tools.walker ;
+IN: bank.tests
+
+SYMBOL: my-account
+[
+    "Alex's Take Over the World Fund" 0.07 1 2007 11 1 <date> 6101.94 open-account my-account set
+    [ 6137 ] [ my-account get 2007 12 2 <date> process-to-date balance>> round >integer ] unit-test
+    [ 6137 ] [ my-account get 2007 12 2 <date> process-to-date balance>> round >integer ] unit-test
+] with-scope
+
+[
+    "Petty Cash" 0.07 1 2006 12 1 <date> 10962.18 open-account my-account set
+    [ 11027 ] [ my-account get 2007 1 2 <date> process-to-date balance>> round >integer ] unit-test
+] with-scope
+
+[
+    "Saving to buy a pony" 0.0725 1 2008 3 3 <date> 11106.24 open-account my-account set
+    [ 8416 ] [
+            my-account get [
+               2008 3 11 <date> -750 "Need to buy food" <transaction> ,
+               2008 3 25 <date> -500 "Going to a party" <transaction> ,
+               2008 4  8 <date> -800 "Losing interest in the pony..." <transaction> ,
+               2008 4  8 <date> -700 "Buying a rocking horse" <transaction> ,
+            ] { } make inserting-transactions balance>> round >integer
+        ] unit-test
+] with-scope
+
+[
+    [ 6781 ] [
+        "..." 0.07 1 2007 4 10 <date> 4398.50 open-account
+        2007 10 26 <date> 2000 "..." <transaction> 1array inserting-transactions
+        2008 4 10 <date> process-to-date dup balance>> swap unpaid-interest>> + round >integer
+    ] unit-test
+] with-scope
diff --git a/extra/bank/bank.factor b/extra/bank/bank.factor
new file mode 100644 (file)
index 0000000..abe3250
--- /dev/null
@@ -0,0 +1,67 @@
+USING: accessors calendar kernel math math.order money sequences ;
+IN: bank
+
+TUPLE: account name interest-rate interest-payment-day opening-date transactions unpaid-interest interest-last-paid ;
+
+: <account> ( name interest-rate interest-payment-day opening-date -- account )
+    V{ } clone 0 pick account boa ;
+
+TUPLE: transaction date amount description ;
+C: <transaction> transaction
+
+: >>transaction ( account transaction -- account )
+    over transactions>> push ;
+
+: total ( transactions -- balance )
+    0 [ amount>> + ] reduce ;
+
+: balance>> ( account -- balance ) transactions>> total ;
+
+: open-account ( name interest-rate interest-payment-day opening-date opening-balance -- account )
+    >r [ <account> ] keep r> "Account Opened" <transaction> >>transaction ;
+
+: daily-rate ( yearly-rate day -- daily-rate )
+    days-in-year / ;
+
+: daily-rate>> ( account date -- rate )
+    [ interest-rate>> ] dip daily-rate ;
+
+: transactions-on-date ( account date -- transactions )
+    [ before? ] curry filter ;
+
+: balance-on-date ( account date -- balance )
+    transactions-on-date total ;
+
+: pay-interest ( account date -- )
+    over unpaid-interest>> "Interest Credit" <transaction>
+    >>transaction 0 >>unpaid-interest drop ;
+
+: interest-payment-day? ( account date -- ? )
+    day>> swap interest-payment-day>> = ;
+
+: ?pay-interest ( account date -- )
+    2dup interest-payment-day? [ pay-interest ] [ 2drop ] if ;
+
+: unpaid-interest+ ( account amount -- account )
+    over unpaid-interest>> + >>unpaid-interest ;
+
+: accumulate-interest ( account date -- )
+    [ dupd daily-rate>> over balance>> * unpaid-interest+ ] keep
+    >>interest-last-paid drop ;
+
+: process-day ( account date -- )
+    2dup accumulate-interest ?pay-interest ;
+
+: each-day ( quot start end -- )
+    2dup before? [
+        >r dup >r over >r swap call r> r> 1 days time+ r> each-day
+    ] [
+        3drop
+    ] if ;
+
+: process-to-date ( account date -- account )
+    over interest-last-paid>> 1 days time+
+    [ dupd process-day ] spin each-day ;
+
+: inserting-transactions ( account transactions -- account )
+    [ [ date>> process-to-date ] keep >>transaction ] each ;
diff --git a/extra/bank/summary.txt b/extra/bank/summary.txt
new file mode 100644 (file)
index 0000000..efd8878
--- /dev/null
@@ -0,0 +1 @@
+Bank account simulator for compound interest calculated daily and paid monthly
index be4620bff6bb4d03c25ad69aecb6f3bfdf36505b..6e63877989e22d2c8e82832a11c6d2eec038ef3c 100644 (file)
@@ -1,5 +1,5 @@
 USING: kernel math accessors prettyprint io locals sequences
-math.ranges ;
+math.ranges math.order ;
 IN: benchmark.binary-trees
 
 TUPLE: tree-node item left right ;
index ec424e89c9161a3996f935db422e403221037a35..0e5482da303678f9c395d6dd87b15f21e27aef48 100755 (executable)
@@ -1,10 +1,10 @@
-USING: io.crc32 io.encodings.ascii io.files kernel math ;
+USING: checksums checksums.crc32 io.encodings.ascii io.files kernel math ;
 IN: benchmark.crc32
 
 : crc32-primes-list ( -- )
     10 [
-        "extra/math/primes/list/list.factor" resource-path
-        ascii file-contents crc32 drop
+        "resource:extra/math/primes/list/list.factor"
+        crc32 checksum-file drop
     ] times ;
 
 MAIN: crc32-primes-list
index 3317348f45e1c9eb2ada10d26d5164d3446fdd5d..1c8701f73f5c3964d52884498b41d519889cd4a9 100644 (file)
@@ -65,7 +65,7 @@ TUPLE: x30 ;
 M: x30 g ;
 
 : my-classes ( -- seq )
-    "benchmark.dispatch1" words [ tuple-class? ] subset ;
+    "benchmark.dispatch1" words [ tuple-class? ] filter ;
 
 : a-bunch-of-objects ( -- seq )
     my-classes [ new ] map ;
index a2f096695b32fcad0211ef91cb09b114fa01ccdd..727d28876591859f2475c2620a93eb1f07af0442 100755 (executable)
@@ -65,7 +65,7 @@ TUPLE: x30 ;
 INSTANCE: x30 g\r
 \r
 : my-classes ( -- seq )\r
-    "benchmark.dispatch5" words [ tuple-class? ] subset ;\r
+    "benchmark.dispatch5" words [ tuple-class? ] filter ;\r
 \r
 : a-bunch-of-objects ( -- seq )\r
     my-classes [ new ] map ;\r
index 215b677e1620a934d8fb794de841a35dc5c81ef4..d449c0fc5b43a0d044ab4dd96a1167f844e585d0 100755 (executable)
@@ -81,7 +81,7 @@ HINTS: random fixnum ;
     write-description
     [let | k! [ 0 ] alu [ ] |
         [| len | k len alu make-repeat-fasta k! ] split-lines
-    ] with-locals ; inline
+    ] ; inline
 
 : fasta ( n out -- )
     homo-sapiens make-cumulative
@@ -103,7 +103,7 @@ HINTS: random fixnum ;
             drop
         ] with-file-writer
 
-    ] with-locals ;
+    ] ;
 
 : run-fasta 2500000 reverse-complement-in fasta ;
 
index e06b81f6deb7e49eb6195e9ae45db45b6f93d266..6bd2d69cfa50a1f58ef820243adcf15658942cb9 100644 (file)
@@ -56,7 +56,7 @@ IN: benchmark.knucleotide
     drop ;
 
 : knucleotide ( -- )
-    "extra/benchmark/knucleotide/knucleotide-input.txt" resource-path
+    "resource:extra/benchmark/knucleotide/knucleotide-input.txt"
     ascii [ read-input ] with-file-reader
     process-input ;
 
index b890fdc8e8716c419d399d14c91c647794441cf3..b9b139d7e344835da1aaccd382b2d39cad76c602 100755 (executable)
@@ -1,5 +1,5 @@
 IN: benchmark.mandel
-USING: arrays io kernel math namespaces sequences
+USING: arrays io kernel math math.order namespaces sequences
 byte-arrays byte-vectors math.functions math.parser io.files
 colors.hsv io.encodings.binary ;
 
index 3043725acd7af303c152b3ff66d1f086e18c2430..8a259c121789503676b66df2a1510ddc9824d787 100644 (file)
@@ -1,7 +1,7 @@
-USING: crypto.md5 io.files kernel ;
+USING: checksums checksums.md5 io.files kernel ;
 IN: benchmark.md5
 
 : md5-primes-list ( -- )
-    "extra/math/primes/list/list.factor" resource-path file>md5 drop ;
+    "resource:extra/math/primes/list/list.factor" md5 checksum-file drop ;
 
 MAIN: md5-primes-list
index b4bb1fa8d2235567b2d79acd5440d3d456a166de..8eb883241be0b16c5408496ecaffb19675035886 100644 (file)
@@ -3,7 +3,8 @@ prettyprint words hints ;
 IN: benchmark.partial-sums
 
 : summing ( n quot -- y )
-    [ + ] compose 0.0 -rot 1 -rot (each-integer) ; inline
+    [ >float ] swap [ + ] 3compose
+    0.0 -rot 1 -rot (each-integer) ; inline
 
 : 2/3^k ( n -- y ) [ 2.0 3.0 / swap 1- ^ ] summing ;
 
index c66de87cb584152ab1d86c6c05dad852939ad88c..883124105b954865d4b54572a58571704713e94c 100755 (executable)
@@ -1,13 +1,13 @@
 IN: benchmark.reverse-complement.tests\r
-USING: tools.test benchmark.reverse-complement crypto.md5\r
+USING: tools.test benchmark.reverse-complement\r
+checksums checksums.md5\r
 io.files kernel ;\r
 \r
 [ "c071aa7e007a9770b2fb4304f55a17e5" ] [\r
-    "extra/benchmark/reverse-complement/reverse-complement-test-in.txt"\r
-    "extra/benchmark/reverse-complement/reverse-complement-test-out.txt"\r
-    [ resource-path ] bi@\r
+    "resource:extra/benchmark/reverse-complement/reverse-complement-test-in.txt"\r
+    "resource:extra/benchmark/reverse-complement/reverse-complement-test-out.txt"\r
     reverse-complement\r
 \r
-    "extra/benchmark/reverse-complement/reverse-complement-test-out.txt"\r
-    resource-path file>md5str\r
+    "resource:extra/benchmark/reverse-complement/reverse-complement-test-out.txt"\r
+    md5 checksum-file hex-string\r
 ] unit-test\r
index d83b72018799976f11277f7c3726fbcbaad47d86..5fdaf49d8f4bad3132d9d25fece63910a865c497 100755 (executable)
@@ -32,13 +32,11 @@ HINTS: do-line vector string ;
     readln [ do-line (reverse-complement) ] [ show-seq ] if* ;
 
 : reverse-complement ( infile outfile -- )
-    ascii <file-writer> [
-        swap ascii <file-reader> [
-            swap <duplex-stream> [
-                500000 <vector> (reverse-complement)
-            ] with-stream
-        ] with-disposal
-    ] with-disposal ;
+    ascii [
+        ascii [
+            500000 <vector> (reverse-complement)
+        ] with-file-reader
+    ] with-file-writer ;
 
 : reverse-complement-in
     "reverse-complement-in.txt" temp-file ;
index 897d83ea0e3587cbb090ae7e0e4de2eb82496489..d5ff5673c2f5f120dfbfdb7aec1c77af41ead77e 100644 (file)
@@ -1,7 +1,7 @@
-USING: crypto.sha1 io.files kernel ;
+USING: checksums checksums.sha1 io.files kernel ;
 IN: benchmark.sha1
 
 : sha1-primes-list ( -- )
-    "extra/math/primes/list/list.factor" resource-path file>sha1 drop ;
+    "resource:extra/math/primes/list/list.factor" sha1 checksum-file drop ;
 
 MAIN: sha1-primes-list
index 25212c7264ca7ad633d222a1c166ab303b3740c8..6defd94290c8fb1496da9417fb3932b676c4e311 100755 (executable)
@@ -1,6 +1,6 @@
 USING: io.sockets io kernel math threads io.encodings.ascii
-debugger tools.time prettyprint concurrency.count-downs
-namespaces arrays continuations ;
+io.streams.duplex debugger tools.time prettyprint
+concurrency.count-downs namespaces arrays continuations ;
 IN: benchmark.sockets
 
 SYMBOL: counter
@@ -10,7 +10,7 @@ SYMBOL: counter
 : server-addr "127.0.0.1" 7777 <inet4> ;
 
 : server-loop ( server -- )
-    dup accept [
+    dup accept drop [
         [
             read1 CHAR: x = [
                 "server" get dispose
@@ -30,17 +30,17 @@ SYMBOL: counter
     ] ignore-errors ;
 
 : simple-client ( -- )
-    server-addr ascii <client> [
+    server-addr ascii [
         CHAR: b write1 flush
         number-of-requests
         [ CHAR: a dup write1 flush read1 assert= ] times
         counter get count-down
-    ] with-stream ;
+    ] with-client ;
 
 : stop-server ( -- )
-    server-addr ascii <client> [
+    server-addr ascii [
         CHAR: x write1
-    ] with-stream ;
+    ] with-client ;
 
 : clients ( n -- )
     dup pprint " clients: " write [
index 9ceb2df342d2d45b3f97c93c58234dfdc40787f2..41f32b4cdbb365a3fd58a828a56b36dccc3947a9 100755 (executable)
@@ -3,7 +3,7 @@ bit-vectors.private combinators ;
 IN: bit-vectors\r
 \r
 ARTICLE: "bit-vectors" "Bit vectors"\r
-"A bit vector is a resizable mutable sequence of bits. The literal syntax is covered in " { $link "syntax-bit-vectors" } ". Bit vector words are found in the " { $vocab-link "bit-vectors" } " vocabulary."\r
+"A bit vector is a resizable mutable sequence of bits. Bit vector words are found in the " { $vocab-link "bit-vectors" } " vocabulary."\r
 $nl\r
 "Bit vectors form a class:"\r
 { $subsection bit-vector }\r
@@ -19,7 +19,7 @@ $nl
 ABOUT: "bit-vectors"\r
 \r
 HELP: bit-vector\r
-{ $description "The class of resizable bit vectors. See " { $link "syntax-bit-vectors" } " for syntax and " { $link "bit-vectors" } " for general information." } ;\r
+{ $description "The class of resizable bit vectors. See " { $link "bit-vectors" } " for information." } ;\r
 \r
 HELP: <bit-vector>\r
 { $values { "n" "a positive integer specifying initial capacity" } { "bit-vector" bit-vector } }\r
index fca0568adf6c7ff251c1ca844121a0d418a8f05f..7fcec00e984a6dba2885adf55a269b7c974b0871 100644 (file)
@@ -93,7 +93,7 @@ M: check< summary drop "Number exceeds upper bound" ;
     >r keys r> define-slots ;
 
 : filter-pad ( slots -- slots )
-    [ drop padding-name? not ] assoc-subset ;
+    [ drop padding-name? not ] assoc-filter ;
 
 : define-bitfield ( classname slots -- ) 
     [
index 4ea20629c1192a3a0b644fb8aeb7d9df16201580..40ce7adb35e20dda554fcae3a8d6dd7cffc811f3 100644 (file)
@@ -3,6 +3,7 @@ USING: kernel namespaces
        math
        math.constants
        math.functions
+       math.order
        math.vectors
        math.trig
        combinators arrays sequences random vars
@@ -116,7 +117,7 @@ over boid-vel -rot relative-position angle-between ;
   <--&& ;
 
 : cohesion-neighborhood ( self -- boids )
-  boids> [ within-cohesion-neighborhood? ] with subset ;
+  boids> [ within-cohesion-neighborhood? ] with filter ;
 
 : cohesion-force ( self -- force )
   dup cohesion-neighborhood
@@ -136,7 +137,7 @@ over boid-vel -rot relative-position angle-between ;
   <--&& ;
 
 : separation-neighborhood ( self -- boids )
-  boids> [ within-separation-neighborhood? ] with subset ;
+  boids> [ within-separation-neighborhood? ] with filter ;
 
 : separation-force ( self -- force )
   dup separation-neighborhood
@@ -156,7 +157,7 @@ over boid-vel -rot relative-position angle-between ;
   <--&& ;
 
 : alignment-neighborhood ( self -- boids )
-boids> [ within-alignment-neighborhood? ] with subset ;
+boids> [ within-alignment-neighborhood? ] with filter ;
 
 : alignment-force ( self -- force )
   alignment-neighborhood
index 4326fcf61b2c82e18a87d2b321ad7ef42cb4a485..9dd4fd04b25ffd3fa8806556e676479b9b28108a 100755 (executable)
@@ -11,7 +11,7 @@ IN: bootstrap.help
 
     [ drop ] load-vocab-hook [
         vocabs
-        [ vocab-docs-loaded? not ] subset
+        [ vocab-docs-loaded? not ] filter
         [ load-docs ] each
     ] with-variable ;
 
index a186954ef08af7ec440185435e317bba1e0a2761..46aca6cc6ba3205bb01ab4cbec9fe8d1f5886159 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 IN: bootstrap.image.download
-USING: http.client crypto.md5 splitting assocs kernel io.files
-bootstrap.image sequences io ;
+USING: http.client checksums checksums.md5 splitting assocs
+kernel io.files bootstrap.image sequences io ;
 
 : url "http://factorcode.org/images/latest/" ;
 
@@ -12,7 +12,7 @@ bootstrap.image sequences io ;
 
 : need-new-image? ( image -- ? )
     dup exists?
-    [ dup file>md5str swap download-checksums at = not ]
+    [ [ md5 checksum-file hex-string ] [ download-checksums at ] bi = not ]
     [ drop t ] if ;
 
 : download-image ( arch -- )
index ab26a4ff1398a0de5b572739bc8848cd625000d8..30d0428744a9826c588b1e9d84764367c1db6e69 100755 (executable)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
+USING: http.client checksums checksums.md5 splitting assocs
+kernel io.files bootstrap.image sequences io namespaces
+io.launcher math io.encodings.ascii ;
 IN: bootstrap.image.upload
-USING: http.client crypto.md5 splitting assocs kernel io.files
-bootstrap.image sequences io namespaces io.launcher math io.encodings.ascii ;
 
 SYMBOL: upload-images-destination
 
@@ -17,7 +18,9 @@ SYMBOL: upload-images-destination
 
 : compute-checksums ( -- )
     checksums ascii [
-        boot-image-names [ dup write bl file>md5str print ] each
+        boot-image-names [
+            [ write bl ] [ md5 checksum-file hex-string print ] bi
+        ] each
     ] with-file-writer ;
 
 : upload-images ( -- )
index ab72f65b4b4c268a87d892cb034d6692890f37b1..e68fff5efdbff40624d8e02247a015ef7db1d4b3 100644 (file)
@@ -1,5 +1,5 @@
 
-USING: kernel sequences math math.constants accessors
+USING: kernel sequences math math.constants math.order accessors
        processing
        processing.color ;
 
index 9e5e9328318fb653ac0d885436e9dede67ed8a7e..afe277d30b78eb400887771637bef2e9f7765d39 100644 (file)
@@ -5,9 +5,9 @@ USING: kernel continuations arrays assocs sequences sorting math
 IN: builder.benchmark
 
 ! : passing-benchmarks ( table -- table )
-!   [ second first2 number? swap number? and ] subset ;
+!   [ second first2 number? swap number? and ] filter ;
 
-: passing-benchmarks ( table -- table ) [ second number? ] subset ;
+: passing-benchmarks ( table -- table ) [ second number? ] filter ;
 
 ! : simplify-table ( table -- table ) [ first2 second 2array ] map ;
 
index 6218a2ea90051c6dfc352db0de7532f6a9992acf..6b1266bb4548b3084618aca1d12eee986e8b3dae 100644 (file)
@@ -21,7 +21,7 @@ IN: builder.release.branch
   {
     "scp"
     my-boot-image-name
-    "factorcode.org:/var/www/factorcode.org/newsite/images/clean"
+    { "factorcode.org:/var/www/factorcode.org/newsite/images/clean/" platform }
   }
   to-strings
   try-process ;
index 3b0834b19056556137265a969d6d7184b9a2f1c7..c40efaaa04f47d949dde79477d5c550d34f3d1e4 100644 (file)
@@ -16,7 +16,7 @@ IN: builder.util
 
 : minutes>ms ( min -- ms ) 60 * 1000 * ;
 
-: file>string ( file -- string ) utf8 [ stdio get contents ] with-file-reader ;
+: file>string ( file -- string ) utf8 file-contents ;
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -107,5 +107,5 @@ USE: prettyprint
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 : git-id ( -- id )
-  { "git" "show" } utf8 <process-stream> [ readln ] with-stream
+  { "git" "show" } utf8 <process-reader> [ readln ] with-input-stream
   " " split second ;
index 43b9edcd0098d6a8ca3adfbc3dc9c8ad96cf10f6..d546f9ea41c229a136732ca8fc8e7b70c6d86662 100755 (executable)
@@ -4,7 +4,7 @@ opengl.glu shuffle http.client vectors namespaces ui.gadgets
 ui.gadgets.canvas ui.render ui splitting combinators tools.time
 system combinators.lib float-arrays continuations
 opengl.demo-support multiline ui.gestures bunny.fixed-pipeline
-bunny.cel-shaded bunny.outlined bunny.model ;
+bunny.cel-shaded bunny.outlined bunny.model accessors ;
 IN: bunny
 
 TUPLE: bunny-gadget model geom draw-seq draw-n ;
@@ -13,38 +13,33 @@ TUPLE: bunny-gadget model geom draw-seq draw-n ;
     0.0 0.0 0.375 <demo-gadget>
     maybe-download read-model {
         set-delegate
-        set-bunny-gadget-model
+        (>>model)
     } bunny-gadget construct ;
 
 : bunny-gadget-draw ( gadget -- draw )
-    { bunny-gadget-draw-n bunny-gadget-draw-seq }
+    { draw-n>> draw-seq>> }
     get-slots nth ;
 
 : bunny-gadget-next-draw ( gadget -- )
-    dup { bunny-gadget-draw-seq bunny-gadget-draw-n }
+    dup { draw-seq>> draw-n>> }
     get-slots
     1+ swap length mod
-    swap [ set-bunny-gadget-draw-n ] keep relayout-1 ;
+    >>draw-n relayout-1 ;
 
 M: bunny-gadget graft* ( gadget -- )
     GL_DEPTH_TEST glEnable
-    dup bunny-gadget-model <bunny-geom>
-    over {
-        [ <bunny-fixed-pipeline> ]
-        [ <bunny-cel-shaded> ]
-        [ <bunny-outlined> ]
-    } map-call-with [ ] subset
-    0
-    roll {
-        set-bunny-gadget-geom
-        set-bunny-gadget-draw-seq
-        set-bunny-gadget-draw-n
-    } set-slots ;
+    dup model>> <bunny-geom> >>geom
+    dup
+    [ <bunny-fixed-pipeline> ]
+    [ <bunny-cel-shaded> ]
+    [ <bunny-outlined> ] tri 3array
+    [ ] filter >>draw-seq
+    0 >>draw-n
+    drop ;
 
 M: bunny-gadget ungraft* ( gadget -- )
-    { bunny-gadget-geom bunny-gadget-draw-seq } get-slots
-    [ [ dispose ] when* ] each
-    [ dispose ] when* ;
+    [ geom>> [ dispose ] when* ]
+    [ draw-seq>> [ [ dispose ] when* ] each ] bi ;
 
 M: bunny-gadget draw-gadget* ( gadget -- )
     0.15 0.15 0.15 1.0 glClearColor
@@ -52,7 +47,7 @@ M: bunny-gadget draw-gadget* ( gadget -- )
     dup demo-gadget-set-matrices
     GL_MODELVIEW glMatrixMode
     0.02 -0.105 0.0 glTranslatef
-    { bunny-gadget-geom bunny-gadget-draw } get-slots
+    { geom>> bunny-gadget-draw } get-slots
     draw-bunny ;
 
 M: bunny-gadget pref-dim* ( gadget -- dim )
index d4f0b7612d2b6bfb51c0b969341a39e900afc864..08bea0515b2797a2764e590fe6ca60fe9e81fa3f 100644 (file)
@@ -1,5 +1,5 @@
 USING: arrays bunny.model continuations kernel multiline opengl opengl.shaders
-    opengl.capabilities opengl.gl sequences sequences.lib ;
+    opengl.capabilities opengl.gl sequences sequences.lib accessors ;
 IN: bunny.cel-shaded
 
 STRING: vertex-shader-source
@@ -68,11 +68,12 @@ TUPLE: bunny-cel-shaded program ;
 : <bunny-cel-shaded> ( gadget -- draw )
     drop
     cel-shading-supported? [
+        bunny-cel-shaded new
         vertex-shader-source <vertex-shader> check-gl-shader
         cel-shaded-fragment-shader-lib-source <fragment-shader> check-gl-shader
         cel-shaded-fragment-shader-main-source <fragment-shader> check-gl-shader
         3array <gl-program> check-gl-program
-        { set-bunny-cel-shaded-program } bunny-cel-shaded construct
+        >>program
     ] [ f ] if ;
 
 : (draw-cel-shaded-bunny) ( geom program -- )
@@ -85,8 +86,8 @@ TUPLE: bunny-cel-shaded program ;
     } [ bunny-geom ] with-gl-program ;
 
 M: bunny-cel-shaded draw-bunny
-    bunny-cel-shaded-program (draw-cel-shaded-bunny) ;
+    program>> (draw-cel-shaded-bunny) ;
 
 M: bunny-cel-shaded dispose
-    bunny-cel-shaded-program delete-gl-program ;
+    program>> delete-gl-program ;
 
index f3fb68e515c3cb9d010875422583defeb0de83b0..bf0fc45f0fc652fe236aa4d4e934225ae6aa6097 100644 (file)
@@ -6,7 +6,7 @@ TUPLE: bunny-fixed-pipeline ;
 
 : <bunny-fixed-pipeline> ( gadget -- draw )
     drop
-    { } bunny-fixed-pipeline construct ;
+    bunny-fixed-pipeline new ;
 
 M: bunny-fixed-pipeline draw-bunny
     drop
index 897a30c417841d4d4fff90b3f0a395ccb8961caa..239603755d795f344a1d43af7ac44697c208068e 100755 (executable)
@@ -2,17 +2,17 @@ USING: alien alien.c-types arrays sequences math math.vectors
 math.matrices math.parser io io.files kernel opengl opengl.gl
 opengl.glu io.encodings.ascii opengl.capabilities shuffle
 http.client vectors splitting tools.time system combinators
-float-arrays continuations namespaces sequences.lib ;
+float-arrays continuations namespaces sequences.lib accessors ;
 IN: bunny.model
 
 : numbers ( str -- seq )
-    " " split [ string>number ] map [ ] subset ;
+    " " split [ string>number ] map [ ] filter ;
 
 : (parse-model) ( vs is -- vs is )
     readln [
         numbers {
             { [ dup length 5 = ] [ 3 head pick push ] }
-            { [ dup first 3 = ] [ 1 tail over push ] }
+            { [ dup first 3 = ] [ rest over push ] }
             [ drop ]
         } cond (parse-model)
     ] when* ;
@@ -85,24 +85,24 @@ M: bunny-dlist bunny-geom
     bunny-dlist-list glCallList ;
 
 M: bunny-buffers bunny-geom
-    dup {
-        bunny-buffers-array
-        bunny-buffers-element-array
-    } get-slots [
+    dup { array>> element-array>> } get-slots [
         { GL_VERTEX_ARRAY GL_NORMAL_ARRAY } [
             GL_DOUBLE 0 0 buffer-offset glNormalPointer
-            dup bunny-buffers-nv "double" heap-size * buffer-offset
-            3 GL_DOUBLE 0 roll glVertexPointer
-            bunny-buffers-ni
-            GL_TRIANGLES swap GL_UNSIGNED_INT 0 buffer-offset glDrawElements
+            [
+                nv>> "double" heap-size * buffer-offset
+                3 GL_DOUBLE 0 roll glVertexPointer
+            ] [
+                ni>>
+                GL_TRIANGLES swap GL_UNSIGNED_INT 0 buffer-offset glDrawElements
+            ] bi
         ] all-enabled-client-state
     ] with-array-element-buffers ;
 
 M: bunny-dlist dispose
-    bunny-dlist-list delete-dlist ;
+    list>> delete-dlist ;
 
 M: bunny-buffers dispose
-    { bunny-buffers-array bunny-buffers-element-array } get-slots
+    { array>> element-array>> } get-slots
     delete-gl-buffer delete-gl-buffer ;
 
 : <bunny-geom> ( model -- geom )
index 6a2f54cceb2014239e6be6f761f101b60eafa4d7..fef57d95d2d12b02ade36316a862afb7b32e96ce 100755 (executable)
@@ -1,6 +1,7 @@
 USING: arrays bunny.model bunny.cel-shaded continuations kernel
 math multiline opengl opengl.shaders opengl.framebuffers
-opengl.gl opengl.capabilities sequences ui.gadgets combinators ;
+opengl.gl opengl.capabilities sequences ui.gadgets combinators
+accessors ;
 IN: bunny.outlined
 
 STRING: outlined-pass1-fragment-shader-main-source
@@ -139,9 +140,9 @@ TUPLE: bunny-outlined
 : <bunny-outlined> ( gadget -- draw )
     outlining-supported? [
         pass1-program pass2-program {
-            set-bunny-outlined-gadget
-            set-bunny-outlined-pass1-program
-            set-bunny-outlined-pass2-program
+            (>>gadget)
+            (>>pass1-program)
+            (>>pass2-program)
         } bunny-outlined construct
     ] [ drop f ] if ;
 
@@ -169,35 +170,33 @@ TUPLE: bunny-outlined
     ] with-framebuffer ;
 
 : dispose-framebuffer ( draw -- )
-    dup bunny-outlined-framebuffer-dim [
+    dup framebuffer-dim>> [
         {
-            [ bunny-outlined-framebuffer    [ delete-framebuffer ] when* ]
-            [ bunny-outlined-color-texture  [ delete-texture ] when* ]
-            [ bunny-outlined-normal-texture [ delete-texture ] when* ]
-            [ bunny-outlined-depth-texture  [ delete-texture ] when* ]
-            [ f swap set-bunny-outlined-framebuffer-dim ]
+            [ framebuffer>>    [ delete-framebuffer ] when* ]
+            [ color-texture>>  [ delete-texture ] when* ]
+            [ normal-texture>> [ delete-texture ] when* ]
+            [ depth-texture>>  [ delete-texture ] when* ]
+            [ f >>framebuffer-dim drop ]
         } cleave
     ] [ drop ] if ;
 
 : remake-framebuffer-if-needed ( draw -- )
-    dup bunny-outlined-gadget rect-dim
-    over bunny-outlined-framebuffer-dim
+    dup [ gadget>> dim>> ] [ framebuffer-dim>> ] bi
     over =
-    [ 2drop ]
-    [
-        swap dup dispose-framebuffer >r
-        dup GL_RGBA16F_ARB GL_RGBA (framebuffer-texture)
-        swap dup GL_RGBA16F_ARB GL_RGBA (framebuffer-texture)
-        swap dup GL_DEPTH_COMPONENT32 GL_DEPTH_COMPONENT (framebuffer-texture)
-        swap >r
-        [ (make-framebuffer) ] 3keep
-        r> r> {
-            set-bunny-outlined-framebuffer
-            set-bunny-outlined-color-texture
-            set-bunny-outlined-normal-texture
-            set-bunny-outlined-depth-texture
-            set-bunny-outlined-framebuffer-dim
-        } set-slots
+    [ 2drop ] [
+        [ dup dispose-framebuffer dup ] dip {
+            [
+                GL_RGBA16F_ARB GL_RGBA (framebuffer-texture)
+                [ >>color-texture drop ] keep
+            ] [
+                GL_RGBA16F_ARB GL_RGBA (framebuffer-texture)
+                [ >>normal-texture drop ] keep
+            ] [ 
+                GL_DEPTH_COMPONENT32 GL_DEPTH_COMPONENT (framebuffer-texture)
+                [ >>depth-texture drop ] keep
+            ]
+        } 2cleave
+        (make-framebuffer) >>framebuffer drop
     ] if ;
 
 : clear-framebuffer ( -- )
@@ -209,31 +208,34 @@ TUPLE: bunny-outlined
     GL_COLOR_BUFFER_BIT glClear ;
 
 : (pass1) ( geom draw -- )
-    dup bunny-outlined-framebuffer [
+    dup framebuffer>> [
         clear-framebuffer
         { GL_COLOR_ATTACHMENT0_EXT GL_COLOR_ATTACHMENT1_EXT } set-draw-buffers
-        bunny-outlined-pass1-program (draw-cel-shaded-bunny)
+        pass1-program>> (draw-cel-shaded-bunny)
     ] with-framebuffer ;
 
 : (pass2) ( draw -- )
-    init-matrices
-    dup bunny-outlined-color-texture GL_TEXTURE_2D GL_TEXTURE0 bind-texture-unit
-    dup bunny-outlined-normal-texture GL_TEXTURE_2D GL_TEXTURE1 bind-texture-unit
-    dup bunny-outlined-depth-texture GL_TEXTURE_2D GL_TEXTURE2 bind-texture-unit
-    bunny-outlined-pass2-program {
-        { "colormap"   [ 0 glUniform1i ] }
-        { "normalmap"  [ 1 glUniform1i ] }
-        { "depthmap"   [ 2 glUniform1i ] }
-        { "line_color" [ 0.1 0.0 0.1 1.0 glUniform4f ] }
-    } [ { -1.0 -1.0 } { 1.0 1.0 } rect-vertices ] with-gl-program ;
+    init-matrices {
+        [ color-texture>>  GL_TEXTURE_2D GL_TEXTURE0 bind-texture-unit ]
+        [ normal-texture>> GL_TEXTURE_2D GL_TEXTURE1 bind-texture-unit ]
+        [ depth-texture>>  GL_TEXTURE_2D GL_TEXTURE2 bind-texture-unit ]
+        [
+            pass2-program>> {
+                { "colormap"   [ 0 glUniform1i ] }
+                { "normalmap"  [ 1 glUniform1i ] }
+                { "depthmap"   [ 2 glUniform1i ] }
+                { "line_color" [ 0.1 0.0 0.1 1.0 glUniform4f ] }
+            } [ { -1.0 -1.0 } { 1.0 1.0 } rect-vertices ]
+            with-gl-program
+        ]
+    } cleave ;
 
 M: bunny-outlined draw-bunny
-    dup remake-framebuffer-if-needed
-    [ (pass1) ] keep (pass2) ;
+    [ remake-framebuffer-if-needed ]
+    [ (pass1) ]
+    [ (pass2) ] tri ;
 
 M: bunny-outlined dispose
-    {
-        [ bunny-outlined-pass1-program [ delete-gl-program ] when* ]
-        [ bunny-outlined-pass2-program [ delete-gl-program ] when* ]
-        [ dispose-framebuffer ]
-    } cleave ;
+    [ pass1-program>> [ delete-gl-program ] when* ]
+    [ pass2-program>> [ delete-gl-program ] when* ]
+    [ dispose-framebuffer ] tri ;
diff --git a/extra/byte-vectors/byte-vectors-docs.factor b/extra/byte-vectors/byte-vectors-docs.factor
deleted file mode 100755 (executable)
index f34bc20..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-USING: arrays byte-arrays help.markup help.syntax kernel\r
-byte-vectors.private combinators ;\r
-IN: byte-vectors\r
-\r
-ARTICLE: "byte-vectors" "Byte vectors"\r
-"A byte vector is a resizable mutable sequence of unsigned bytes. Byte vector words are found in the " { $vocab-link "byte-vectors" } " vocabulary."\r
-$nl\r
-"Byte vectors form a class:"\r
-{ $subsection byte-vector }\r
-{ $subsection byte-vector? }\r
-"Creating byte vectors:"\r
-{ $subsection >byte-vector }\r
-{ $subsection <byte-vector> }\r
-"Literal syntax:"\r
-{ $subsection POSTPONE: BV{ }\r
-"If you don't care about initial capacity, a more elegant way to create a new byte vector is to write:"\r
-{ $code "BV{ } clone" } ;\r
-\r
-ABOUT: "byte-vectors"\r
-\r
-HELP: byte-vector\r
-{ $description "The class of resizable byte vectors. See " { $link "syntax-byte-vectors" } " for syntax and " { $link "byte-vectors" } " for general information." } ;\r
-\r
-HELP: <byte-vector>\r
-{ $values { "n" "a positive integer specifying initial capacity" } { "byte-vector" byte-vector } }\r
-{ $description "Creates a new byte vector that can hold " { $snippet "n" } " bytes before resizing." } ;\r
-\r
-HELP: >byte-vector\r
-{ $values { "seq" "a sequence" } { "byte-vector" byte-vector } }\r
-{ $description "Outputs a freshly-allocated byte vector with the same elements as a given sequence." }\r
-{ $errors "Throws an error if the sequence contains elements other than integers." } ;\r
-\r
-HELP: byte-array>vector\r
-{ $values { "byte-array" "an array" } { "length" "a non-negative integer" } { "byte-vector" byte-vector } }\r
-{ $description "Creates a new byte vector using the array for underlying storage with the specified initial length." }\r
-{ $warning "This word is in the " { $vocab-link "byte-vectors.private" } " vocabulary because it does not perform type or bounds checks. User code should call " { $link >byte-vector } " instead." } ;\r
-\r
-HELP: BV{\r
-{ $syntax "BV{ elements... }" }\r
-{ $values { "elements" "a list of bytes" } }\r
-{ $description "Marks the beginning of a literal byte vector. Literal byte vectors are terminated by " { $link POSTPONE: } } "." } \r
-{ $examples { $code "BV{ 1 2 3 12 }" } } ;\r
diff --git a/extra/byte-vectors/byte-vectors-tests.factor b/extra/byte-vectors/byte-vectors-tests.factor
deleted file mode 100755 (executable)
index d457d68..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-IN: byte-vectors.tests\r
-USING: tools.test byte-vectors vectors sequences kernel ;\r
-\r
-[ 0 ] [ 123 <byte-vector> length ] unit-test\r
-\r
-: do-it\r
-    123 [ over push ] each ;\r
-\r
-[ t ] [\r
-    3 <byte-vector> do-it\r
-    3 <vector> do-it sequence=\r
-] unit-test\r
-\r
-[ t ] [ BV{ } byte-vector? ] unit-test\r
diff --git a/extra/byte-vectors/byte-vectors.factor b/extra/byte-vectors/byte-vectors.factor
deleted file mode 100755 (executable)
index a8351dc..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-! Copyright (C) 2008 Slava Pestov.\r
-! See http://factorcode.org/license.txt for BSD license.\r
-USING: arrays kernel kernel.private math sequences\r
-sequences.private growable byte-arrays prettyprint.backend\r
-parser accessors ;\r
-IN: byte-vectors\r
-\r
-TUPLE: byte-vector underlying fill ;\r
-\r
-M: byte-vector underlying underlying>> { byte-array } declare ;\r
-\r
-M: byte-vector set-underlying (>>underlying) ;\r
-\r
-M: byte-vector length fill>> { array-capacity } declare ;\r
-\r
-M: byte-vector set-fill (>>fill) ;\r
-\r
-<PRIVATE\r
-\r
-: byte-array>vector ( byte-array length -- byte-vector )\r
-    byte-vector boa ; inline\r
-\r
-PRIVATE>\r
-\r
-: <byte-vector> ( n -- byte-vector )\r
-    <byte-array> 0 byte-array>vector ; inline\r
-\r
-: >byte-vector ( seq -- byte-vector )\r
-    T{ byte-vector f B{ } 0 } clone-like ;\r
-\r
-M: byte-vector like\r
-    drop dup byte-vector? [\r
-        dup byte-array?\r
-        [ dup length byte-array>vector ] [ >byte-vector ] if\r
-    ] unless ;\r
-\r
-M: byte-vector new-sequence\r
-    drop [ <byte-array> ] keep >fixnum byte-array>vector ;\r
-\r
-M: byte-vector equal?\r
-    over byte-vector? [ sequence= ] [ 2drop f ] if ;\r
-\r
-M: byte-array new-resizable drop <byte-vector> ;\r
-\r
-INSTANCE: byte-vector growable\r
-\r
-: BV{ \ } [ >byte-vector ] parse-literal ; parsing\r
-\r
-M: byte-vector >pprint-sequence ;\r
-\r
-M: byte-vector pprint-delims drop \ BV{ \ } ;\r
diff --git a/extra/byte-vectors/summary.txt b/extra/byte-vectors/summary.txt
deleted file mode 100644 (file)
index e914ebb..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Growable byte arrays
diff --git a/extra/byte-vectors/tags.txt b/extra/byte-vectors/tags.txt
deleted file mode 100644 (file)
index 42d711b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-collections
index 1bbad298358fd478df9291d01ac66499462b003f..a3b13c9691e56f7e1aa2a0521077f84691bf7cd3 100755 (executable)
@@ -21,7 +21,7 @@ ERROR: cairo-error string ;
         { CAIRO_STATUS_FILE_NOT_FOUND [ "Cairo: file not found" cairo-error ] }
         { CAIRO_STATUS_READ_ERROR [ "Cairo: read error" cairo-error ] }
         [ drop ]
-    } cond ;
+    } case ;
 
 : <png> ( path -- png )
     normalize-path
index e49d3ad894c8e3255479b2d896d30573881d6243..7d9716ae1ad18d6a53497831e2f07a5400788303 100755 (executable)
@@ -1,7 +1,11 @@
 USING: arrays calendar kernel math sequences tools.test
-continuations system ;
+continuations system math.order threads ;
 IN: calendar.tests
 
+\ time+ must-infer
+\ time* must-infer
+\ time- must-infer
+
 [ f ] [ 2004 12 32 0   0  0 instant <timestamp> valid-timestamp? ] unit-test
 [ f ] [ 2004  2 30 0   0  0 instant <timestamp> valid-timestamp? ] unit-test
 [ f ] [ 2003  2 29 0   0  0 instant <timestamp> valid-timestamp? ] unit-test
@@ -127,16 +131,16 @@ IN: calendar.tests
 [ t ] [ 2004 1 1 23 0 0 9+1/2 hours <timestamp> >gmt
         2004 1 1 13 30 0 instant <timestamp> = ] unit-test
 
-[ 0 ] [ 2004 1 1 13 30 0 instant <timestamp>
+[ +eq+ ] [ 2004 1 1 13 30 0 instant <timestamp>
         2004 1 1 12 30 0 -1 hours <timestamp> <=> ] unit-test
 
-[ 1 ] [ 2004 1 1 13 30 0 instant <timestamp>
+[ +gt+ ] [ 2004 1 1 13 30 0 instant <timestamp>
         2004 1 1 12 30 0 instant <timestamp> <=> ] unit-test
 
-[ -1 ] [ 2004 1 1 12 30 0 instant <timestamp>
+[ +lt+ ] [ 2004 1 1 12 30 0 instant <timestamp>
         2004 1 1 13 30 0 instant <timestamp> <=> ] unit-test
 
-[ 1 ] [ 2005 1 1 12 30 0 instant <timestamp>
+[ +gt+ ] [ 2005 1 1 12 30 0 instant <timestamp>
         2004 1 1 13 30 0 instant <timestamp> <=> ] unit-test
 
 [ t ] [ now timestamp>millis millis - 1000 < ] unit-test
@@ -159,3 +163,7 @@ IN: calendar.tests
 [ t ] [ 5 months checktime+ ] unit-test
 
 [ t ] [ 5 years checktime+ ] unit-test
+
+[ t ] [ now 50 milliseconds sleep now before? ] unit-test
+[ t ] [ now 50 milliseconds sleep now swap after? ] unit-test
+[ t ] [ now 50 milliseconds sleep now 50 milliseconds sleep now swapd between? ] unit-test
index 8dcb4af7f1f520f59c39a85e100511f8c93d3b47..0e21876fe92bd7de8d54b198ca2f496e47f144a3 100755 (executable)
@@ -3,7 +3,7 @@
 
 USING: arrays kernel math math.functions namespaces sequences
 strings system vocabs.loader calendar.backend threads
-accessors combinators locals classes.tuple ;
+accessors combinators locals classes.tuple math.order ;
 IN: calendar
 
 TUPLE: timestamp year month day hour minute second gmt-offset ;
@@ -211,12 +211,14 @@ M: duration time+
     #! Uses average month/year length since dt loses calendar
     #! data
     0 swap
-    [ year>> + ] keep
-    [ month>> months-per-year / + ] keep
-    [ day>> days-per-year / + ] keep
-    [ hour>> hours-per-year / + ] keep
-    [ minute>> minutes-per-year / + ] keep
-    second>> seconds-per-year / + ;
+    {
+        [ year>> + ]
+        [ month>> months-per-year / + ]
+        [ day>> days-per-year / + ]
+        [ hour>> hours-per-year / + ]
+        [ minute>> minutes-per-year / + ]
+        [ second>> seconds-per-year / + ]
+    } cleave ;
 
 M: duration <=> [ dt>years ] compare ;
 
@@ -252,14 +254,21 @@ M: timestamp time-
     #! Exact calendar-time difference
     (time-) seconds ;
 
+: time* ( obj1 obj2 -- obj3 )
+    dup real? [ swap ] when
+    dup real? [ * ] [
+        {
+            [   year>> * ]
+            [  month>> * ]
+            [    day>> * ]
+            [   hour>> * ]
+            [ minute>> * ]
+            [ second>> * ]
+        } 2cleave <duration>
+    ] if ;
+
 : before ( dt -- -dt )
-    [ year>>   neg ] keep
-    [ month>>  neg ] keep
-    [ day>>    neg ] keep
-    [ hour>>   neg ] keep
-    [ minute>> neg ] keep
-      second>> neg
-    <duration> ;
+    -1 time* ;
 
 M: duration time-
     before time+ ;
index 88bd0733c0e99f1112058d22a379fe75785626bf..f4e1669178e7c501dbcbf5040177ff90efd61af5 100755 (executable)
@@ -1,26 +1,52 @@
-USING: calendar.format calendar kernel tools.test\r
-io.streams.string ;\r
+USING: calendar.format calendar kernel math tools.test\r
+io.streams.string accessors io math.order ;\r
 IN: calendar.format.tests\r
 \r
 [ 0 ] [\r
-    "Z" [ read-rfc3339-gmt-offset ] with-string-reader\r
+    "Z" [ read1 read-rfc3339-gmt-offset ] with-string-reader dt>hours\r
 ] unit-test\r
 \r
 [ 1 ] [\r
-    "+01" [ read-rfc3339-gmt-offset ] with-string-reader\r
+    "+01" [ read1 read-rfc3339-gmt-offset ] with-string-reader dt>hours\r
 ] unit-test\r
 \r
 [ -1 ] [\r
-    "-01" [ read-rfc3339-gmt-offset ] with-string-reader\r
+    "-01" [ read1 read-rfc3339-gmt-offset ] with-string-reader dt>hours\r
 ] unit-test\r
 \r
 [ -1-1/2 ] [\r
-    "-01:30" [ read-rfc3339-gmt-offset ] with-string-reader\r
+    "-01:30" [ read1 read-rfc3339-gmt-offset ] with-string-reader dt>hours\r
 ] unit-test\r
 \r
 [ 1+1/2 ] [\r
-    "+01:30" [ read-rfc3339-gmt-offset ] with-string-reader\r
+    "+01:30" [ read1 read-rfc3339-gmt-offset ] with-string-reader dt>hours\r
 ] unit-test\r
 \r
 [ ] [ now timestamp>rfc3339 drop ] unit-test\r
 [ ] [ now timestamp>rfc822 drop ] unit-test\r
+\r
+[ 8/1000 -4 ] [\r
+    "2008-04-19T04:56:00.008-04:00" rfc3339>timestamp\r
+    [ second>> ] [ gmt-offset>> hour>> ] bi\r
+] unit-test\r
+\r
+[ T{ duration f 0 0 0 0 0 0 } ] [\r
+    "GMT" parse-rfc822-gmt-offset\r
+] unit-test\r
+\r
+[ T{ duration f 0 0 0 -5 0 0 } ] [\r
+    "-0500" parse-rfc822-gmt-offset\r
+] unit-test\r
+\r
+[ T{ timestamp f 2008 4 22 14 36 12 T{ duration f 0 0 0 0 0 0 } } ] [\r
+    "Tue, 22 Apr 2008 14:36:12 GMT" rfc822>timestamp\r
+] unit-test\r
+\r
+[ t ] [ now dup timestamp>rfc822 rfc822>timestamp time- 1 seconds before? ] unit-test\r
+\r
+[ t ] [ now dup timestamp>cookie-string cookie-string>timestamp time- 1 seconds before? ] unit-test\r
+\r
+[ "Sun, 4 May 2008 07:00:00" ] [\r
+    "Sun May 04 07:00:00 2008 GMT" cookie-string>timestamp\r
+    timestamp>string\r
+] unit-test\r
index 26ed873fd33541b573bcb89c252e5b8845cc8ffa..91a034f8bdcddf49f314a3157f4225bc7078bad3 100755 (executable)
@@ -1,7 +1,50 @@
-USING: math math.parser kernel sequences io calendar\r
-accessors arrays io.streams.string combinators accessors ;\r
+USING: math math.order math.parser kernel sequences io\r
+accessors arrays io.streams.string splitting\r
+combinators accessors debugger\r
+calendar calendar.format.macros ;\r
 IN: calendar.format\r
 \r
+: pad-00 number>string 2 CHAR: 0 pad-left ;\r
+\r
+: pad-0000 number>string 4 CHAR: 0 pad-left ;\r
+\r
+: pad-00000 number>string 5 CHAR: 0 pad-left ;\r
+\r
+: write-00 pad-00 write ;\r
+\r
+: write-0000 pad-0000 write ;\r
+\r
+: write-00000 pad-00000 write ;\r
+\r
+: hh hour>> write-00 ;\r
+\r
+: mm minute>> write-00 ;\r
+\r
+: ss second>> >integer write-00 ;\r
+\r
+: D day>> number>string write ;\r
+\r
+: DD day>> write-00 ;\r
+\r
+: DAY day-of-week day-abbreviations3 nth write ;\r
+\r
+: MM month>> write-00 ;\r
+\r
+: MONTH month>> month-abbreviations nth write ;\r
+\r
+: YYYY year>> write-0000 ;\r
+\r
+: YYYYY year>> write-00000 ;\r
+\r
+: expect ( str -- )\r
+    read1 swap member? [ "Parse error" throw ] unless ;\r
+\r
+: read-00 2 read string>number ;\r
+\r
+: read-000 3 read string>number ;\r
+\r
+: read-0000 4 read string>number ;\r
+\r
 GENERIC: day. ( obj -- )\r
 \r
 M: integer day. ( n -- )\r
@@ -24,7 +67,7 @@ M: array month. ( pair -- )
     ] with each nl ;\r
 \r
 M: timestamp month. ( timestamp -- )\r
-    { year>> month>> } get-slots 2array month. ;\r
+    [ year>> ] [ month>> ] bi 2array month. ;\r
 \r
 GENERIC: year. ( obj -- )\r
 \r
@@ -34,43 +77,29 @@ M: integer year. ( n -- )
 M: timestamp year. ( timestamp -- )\r
     year>> year. ;\r
 \r
-: pad-00 number>string 2 CHAR: 0 pad-left ;\r
-\r
-: pad-0000 number>string 4 CHAR: 0 pad-left ;\r
-\r
-: write-00 pad-00 write ;\r
-\r
-: write-0000 pad-0000 write ;\r
-\r
 : (timestamp>string) ( timestamp -- )\r
-    dup day-of-week day-abbreviations3 nth write ", " write\r
-    dup day>> number>string write bl\r
-    dup month>> month-abbreviations nth write bl\r
-    dup year>> number>string write bl\r
-    dup hour>> write-00 ":" write\r
-    dup minute>> write-00 ":" write\r
-    second>> >integer write-00 ;\r
+    { DAY ", " D " " MONTH " " YYYY " " hh ":" mm ":" ss } formatted ;\r
 \r
 : timestamp>string ( timestamp -- str )\r
     [ (timestamp>string) ] with-string-writer ;\r
 \r
 : (write-gmt-offset) ( duration -- )\r
-    [ hour>> write-00 ] [ minute>> write-00 ] bi ;\r
+    [ hh ] [ mm ] bi ;\r
 \r
 : write-gmt-offset ( gmt-offset -- )\r
     dup instant <=> {\r
-        { [ dup 0 = ] [ 2drop "GMT" write ] }\r
-        { [ dup 0 < ] [ drop "-" write before (write-gmt-offset) ] }\r
-        { [ dup 0 > ] [ drop "+" write (write-gmt-offset) ] }\r
-    } cond ;\r
+        { +eq+ [ drop "GMT" write ] }\r
+        { +lt+ [ "-" write before (write-gmt-offset) ] }\r
+        { +gt+ [ "+" write (write-gmt-offset) ] }\r
+    } case ;\r
 \r
 : timestamp>rfc822 ( timestamp -- str )\r
     #! RFC822 timestamp format\r
     #! Example: Tue, 15 Nov 1994 08:12:31 +0200\r
     [\r
-        dup (timestamp>string)\r
-        " " write\r
-        gmt-offset>> write-gmt-offset\r
+        [ (timestamp>string) " " write ]\r
+        [ gmt-offset>> write-gmt-offset ]\r
+        bi\r
     ] with-string-writer ;\r
 \r
 : timestamp>http-string ( timestamp -- str )\r
@@ -78,42 +107,42 @@ M: timestamp year. ( timestamp -- )
     #! Example: Tue, 15 Nov 1994 08:12:31 GMT\r
     >gmt timestamp>rfc822 ;\r
 \r
+: (timestamp>cookie-string) ( timestamp -- )\r
+    >gmt\r
+    { DAY ", " DD "-" MONTH "-" YYYY " " hh ":" mm ":" ss " GMT" } formatted ;\r
+\r
+: timestamp>cookie-string ( timestamp -- str )\r
+    [ (timestamp>cookie-string) ] with-string-writer ;\r
+\r
 : (write-rfc3339-gmt-offset) ( duration -- )\r
-    [ hour>> write-00 CHAR: : write1 ]\r
-    [ minute>> write-00 ] bi ;\r
+    [ hh ":" write ] [ mm ] bi ;\r
 \r
 : write-rfc3339-gmt-offset ( duration -- )\r
     dup instant <=> {\r
-        { [ dup 0 = ] [ 2drop "Z" write ] }\r
-        { [ dup 0 < ] [ drop CHAR: - write1 before (write-rfc3339-gmt-offset) ] }\r
-        { [ dup 0 > ] [ drop CHAR: + write1 (write-rfc3339-gmt-offset) ] }\r
-    } cond ;\r
+        { +eq+ [ drop "Z" write ] }\r
+        { +lt+ [ "-" write before (write-rfc3339-gmt-offset) ] }\r
+        { +gt+ [ "+" write (write-rfc3339-gmt-offset) ] }\r
+    } case ;\r
     \r
 : (timestamp>rfc3339) ( timestamp -- )\r
-    dup year>> number>string write CHAR: - write1\r
-    dup month>> write-00 CHAR: - write1\r
-    dup day>> write-00 CHAR: T write1\r
-    dup hour>> write-00 CHAR: : write1\r
-    dup minute>> write-00 CHAR: : write1\r
-    dup second>> >fixnum write-00\r
-    gmt-offset>> write-rfc3339-gmt-offset ;\r
+    {\r
+        YYYY "-" MM "-" DD "T" hh ":" mm ":" ss\r
+        [ gmt-offset>> write-rfc3339-gmt-offset ]\r
+    } formatted ;\r
 \r
 : timestamp>rfc3339 ( timestamp -- str )\r
     [ (timestamp>rfc3339) ] with-string-writer ;\r
 \r
-: expect ( str -- )\r
-    read1 swap member? [ "Parse error" throw ] unless ;\r
+: signed-gmt-offset ( dt ch -- dt' )\r
+    { { CHAR: + [ 1 ] } { CHAR: - [ -1 ] } } case time* ;\r
 \r
-: read-00 2 read string>number ;\r
-\r
-: read-0000 4 read string>number ;\r
-\r
-: read-rfc3339-gmt-offset ( -- n )\r
-    read1 dup CHAR: Z = [ drop 0 ] [\r
-        { { CHAR: + [ 1 ] } { CHAR: - [ -1 ] } } case\r
-        read-00\r
-        read1 { { CHAR: : [ read-00 ] } { f [ 0 ] } } case\r
-        60 / + *\r
+: read-rfc3339-gmt-offset ( ch -- dt )\r
+    dup CHAR: Z = [ drop instant ] [\r
+        >r\r
+        read-00 hours\r
+        read1 { { CHAR: : [ read-00 ] } { f [ 0 ] } } case minutes\r
+        time+\r
+        r> signed-gmt-offset\r
     ] if ;\r
 \r
 : read-ymd ( -- y m d )\r
@@ -126,66 +155,127 @@ M: timestamp year. ( timestamp -- )
     read-ymd\r
     "Tt" expect\r
     read-hms\r
-    read-rfc3339-gmt-offset ! timezone\r
+    read1 { { CHAR: . [ read-000 1000 / + read1 ] } [ ] } case\r
+    read-rfc3339-gmt-offset\r
     <timestamp> ;\r
 \r
 : rfc3339>timestamp ( str -- timestamp )\r
     [ (rfc3339>timestamp) ] with-string-reader ;\r
 \r
+ERROR: invalid-timestamp-format ;\r
+\r
+: check-timestamp ( obj/f -- obj )\r
+    [ invalid-timestamp-format ] unless* ;\r
+\r
+: read-token ( seps -- token )\r
+    [ read-until ] keep member? check-timestamp drop ;\r
+\r
+: read-sp ( -- token ) " " read-token ;\r
+\r
+: checked-number ( str -- n )\r
+    string>number check-timestamp ;\r
+\r
+: parse-rfc822-gmt-offset ( string -- dt )\r
+    dup "GMT" = [ drop instant ] [\r
+        unclip >r\r
+        2 cut [ string>number ] bi@ [ hours ] [ minutes ] bi* time+\r
+        r> signed-gmt-offset\r
+    ] if ;\r
+\r
+: (rfc822>timestamp) ( -- timestamp )\r
+    timestamp new\r
+        "," read-token day-abbreviations3 member? check-timestamp drop\r
+        read1 CHAR: \s assert=\r
+        read-sp checked-number >>day\r
+        read-sp month-abbreviations index check-timestamp >>month\r
+        read-sp checked-number >>year\r
+        ":" read-token checked-number >>hour\r
+        ":" read-token checked-number >>minute\r
+        " " read-token checked-number >>second\r
+        readln parse-rfc822-gmt-offset >>gmt-offset ;\r
+\r
+: rfc822>timestamp ( str -- timestamp )\r
+    [ (rfc822>timestamp) ] with-string-reader ;\r
+\r
+: (cookie-string>timestamp-1) ( -- timestamp )\r
+    timestamp new\r
+        "," read-token day-abbreviations3 member? check-timestamp drop\r
+        read1 CHAR: \s assert=\r
+        "-" read-token checked-number >>day\r
+        "-" read-token month-abbreviations index check-timestamp >>month\r
+        read-sp checked-number >>year\r
+        ":" read-token checked-number >>hour\r
+        ":" read-token checked-number >>minute\r
+        " " read-token checked-number >>second\r
+        readln parse-rfc822-gmt-offset >>gmt-offset ;\r
+\r
+: cookie-string>timestamp-1 ( str -- timestamp )\r
+    [ (cookie-string>timestamp-1) ] with-string-reader ;\r
+\r
+: (cookie-string>timestamp-2) ( -- timestamp )\r
+    timestamp new\r
+        read-sp day-abbreviations3 member? check-timestamp drop\r
+        read-sp month-abbreviations index check-timestamp >>month\r
+        read-sp checked-number >>day\r
+        ":" read-token checked-number >>hour\r
+        ":" read-token checked-number >>minute\r
+        " " read-token checked-number >>second\r
+        read-sp checked-number >>year\r
+        readln parse-rfc822-gmt-offset >>gmt-offset ;\r
+\r
+: cookie-string>timestamp-2 ( str -- timestamp )\r
+    [ (cookie-string>timestamp-2) ] with-string-reader ;\r
+\r
+: cookie-string>timestamp ( str -- timestamp )\r
+    {\r
+        [ cookie-string>timestamp-1 ]\r
+        [ cookie-string>timestamp-2 ]\r
+        [ rfc822>timestamp ]\r
+    } attempt-all-quots ;\r
+\r
 : (ymdhms>timestamp) ( -- timestamp )\r
-    read-ymd " " expect read-hms 0 <timestamp> ;\r
+    read-ymd " " expect read-hms instant <timestamp> ;\r
 \r
 : ymdhms>timestamp ( str -- timestamp )\r
     [ (ymdhms>timestamp) ] with-string-reader ;\r
 \r
 : (hms>timestamp) ( -- timestamp )\r
-    f f f read-hms f <timestamp> ;\r
+    f f f read-hms instant <timestamp> ;\r
 \r
 : hms>timestamp ( str -- timestamp )\r
     [ (hms>timestamp) ] with-string-reader ;\r
 \r
 : (ymd>timestamp) ( -- timestamp )\r
-    read-ymd f f f f <timestamp> ;\r
+    read-ymd f f f instant <timestamp> ;\r
 \r
 : ymd>timestamp ( str -- timestamp )\r
     [ (ymd>timestamp) ] with-string-reader ;\r
 \r
 : (timestamp>ymd) ( timestamp -- )\r
-    dup timestamp-year write-0000\r
-    "-" write\r
-    dup timestamp-month write-00\r
-    "-" write\r
-    timestamp-day write-00 ;\r
+    { YYYY "-" MM "-" DD } formatted ;\r
 \r
 : timestamp>ymd ( timestamp -- str )\r
     [ (timestamp>ymd) ] with-string-writer ;\r
 \r
 : (timestamp>hms)\r
-    dup timestamp-hour write-00\r
-    ":" write\r
-    dup timestamp-minute write-00\r
-    ":" write\r
-    timestamp-second >integer write-00 ;\r
+    { hh ":" mm ":" ss } formatted ;\r
 \r
 : timestamp>hms ( timestamp -- str )\r
     [ (timestamp>hms) ] with-string-writer ;\r
 \r
 : timestamp>ymdhms ( timestamp -- str )\r
-    >gmt\r
     [\r
-        dup (timestamp>ymd)\r
-        " " write\r
-        (timestamp>hms)\r
+        >gmt\r
+        { (timestamp>ymd) " " (timestamp>hms) } formatted\r
     ] with-string-writer ;\r
 \r
 : file-time-string ( timestamp -- string )\r
     [\r
-        [ month>> month-abbreviations nth write ] keep bl\r
-        [ day>> number>string 2 32 pad-left write ] keep bl\r
-        dup now [ year>> ] bi@ = [\r
-            [ hour>> write-00 ] keep ":" write\r
-            minute>> write-00\r
-        ] [\r
-            year>> number>string 5 32 pad-left write\r
-        ] if\r
+        {\r
+            MONTH " " DD " "\r
+            [\r
+                dup now [ year>> ] bi@ =\r
+                [ [ hh ":" write ] [ mm ] bi ] [ YYYYY ] if\r
+            ]\r
+        } formatted\r
     ] with-string-writer ;\r
diff --git a/extra/calendar/format/macros/macros-tests.factor b/extra/calendar/format/macros/macros-tests.factor
new file mode 100644 (file)
index 0000000..91a8f80
--- /dev/null
@@ -0,0 +1,14 @@
+USING: tools.test kernel ;
+IN: calendar.format.macros
+
+[ 2 ] [ { [ 2 ] } attempt-all-quots ] unit-test
+
+[ 2 ] [ { [ 1 throw ] [ 2 ] } attempt-all-quots ] unit-test
+
+[ { [ 1 throw ] } attempt-all-quots ] [ 1 = ] must-fail-with
+
+: compiled-test-1 { [ 1 throw ] [ 2 ] } attempt-all-quots ;
+
+\ compiled-test-1 must-infer
+
+[ 2 ] [ compiled-test-1 ] unit-test
diff --git a/extra/calendar/format/macros/macros.factor b/extra/calendar/format/macros/macros.factor
new file mode 100644 (file)
index 0000000..6d6dd3a
--- /dev/null
@@ -0,0 +1,19 @@
+USING: macros kernel words quotations io sequences combinators
+continuations ;
+IN: calendar.format.macros
+
+MACRO: formatted ( spec -- )
+    [
+        {
+            { [ dup word? ] [ 1quotation ] }
+            { [ dup quotation? ] [ ] }
+            [ [ nip write ] curry [ ] like ]
+        } cond
+    ] map [ cleave ] curry ;
+
+MACRO: attempt-all-quots ( quots -- )
+    dup length 1 = [ first ] [
+        unclip swap
+        [ nip attempt-all-quots ] curry
+        [ recover ] 2curry
+    ] if ;
diff --git a/extra/checksums/md5/authors.txt b/extra/checksums/md5/authors.txt
new file mode 100755 (executable)
index 0000000..7c1b2f2
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/extra/checksums/md5/md5-docs.factor b/extra/checksums/md5/md5-docs.factor
new file mode 100755 (executable)
index 0000000..dca039d
--- /dev/null
@@ -0,0 +1,11 @@
+USING: help.markup help.syntax ;
+IN: checksums.md5
+
+HELP: md5
+{ $description "MD5 checksum algorithm." } ;
+
+ARTICLE: "checksums.md5" "MD5 checksum"
+"The MD5 checksum algorithm implements a one-way hash function. While it is widely used, many weaknesses are known and it should not be used in new applications (" { $url "http://www.schneier.com/blog/archives/2005/03/more_hash_funct.html" } ")."
+{ $subsection md5 } ;
+
+ABOUT: "checksums.md5"
diff --git a/extra/checksums/md5/md5-tests.factor b/extra/checksums/md5/md5-tests.factor
new file mode 100755 (executable)
index 0000000..8e314f7
--- /dev/null
@@ -0,0 +1,10 @@
+USING: kernel math namespaces checksums checksums.md5 tools.test byte-arrays ;
+
+[ "d41d8cd98f00b204e9800998ecf8427e" ] [ "" >byte-array md5 checksum-bytes hex-string ] unit-test
+[ "0cc175b9c0f1b6a831c399e269772661" ] [ "a" >byte-array md5 checksum-bytes hex-string ] unit-test
+[ "900150983cd24fb0d6963f7d28e17f72" ] [ "abc" >byte-array md5 checksum-bytes hex-string ] unit-test
+[ "f96b697d7cb7938d525a2f31aaf161d0" ] [ "message digest" >byte-array md5 checksum-bytes hex-string ] unit-test
+[ "c3fcd3d76192e4007dfb496cca67e13b" ] [ "abcdefghijklmnopqrstuvwxyz" >byte-array md5 checksum-bytes hex-string ] unit-test
+[ "d174ab98d277d9f5a5611c2c9f419d9f" ] [ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" >byte-array md5 checksum-bytes hex-string ] unit-test
+[ "57edf4a22be3c955ac49da2e2107b67a" ] [ "12345678901234567890123456789012345678901234567890123456789012345678901234567890" >byte-array md5 checksum-bytes hex-string ] unit-test
+
diff --git a/extra/checksums/md5/md5.factor b/extra/checksums/md5/md5.factor
new file mode 100755 (executable)
index 0000000..a385f6d
--- /dev/null
@@ -0,0 +1,183 @@
+! See http://www.faqs.org/rfcs/rfc1321.html
+
+USING: kernel io io.binary io.files io.streams.byte-array math
+math.functions math.parser namespaces splitting strings
+sequences crypto.common byte-arrays locals sequences.private
+io.encodings.binary symbols math.bitfields.lib checksums ;
+IN: checksums.md5
+
+<PRIVATE
+
+SYMBOLS: a b c d old-a old-b old-c old-d ;
+
+: T ( N -- Y )
+    sin abs 4294967296 * >bignum ; foldable
+
+: initialize-md5 ( -- )
+    0 bytes-read set
+    HEX: 67452301 dup a set old-a set
+    HEX: efcdab89 dup b set old-b set
+    HEX: 98badcfe dup c set old-c set
+    HEX: 10325476 dup d set old-d set ;
+
+: update-md ( -- )
+    old-a a update-old-new
+    old-b b update-old-new
+    old-c c update-old-new
+    old-d d update-old-new ;
+
+:: (ABCD) ( x s i k func a b c d -- )
+    #! a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
+    a [
+        b get c get d get func call w+
+        k x nth-unsafe w+
+        i T w+
+        s bitroll-32
+        b get w+
+    ] change ; inline
+
+: ABCD a b c d (ABCD) ; inline
+: BCDA b c d a (ABCD) ; inline
+: CDAB c d a b (ABCD) ; inline
+: DABC d a b c (ABCD) ; inline
+
+: F ( X Y Z -- FXYZ )
+    #! F(X,Y,Z) = XY v not(X) Z
+    pick bitnot bitand [ bitand ] [ bitor ] bi* ;
+
+: G ( X Y Z -- GXYZ )
+    #! G(X,Y,Z) = XZ v Y not(Z)
+    dup bitnot rot bitand [ bitand ] [ bitor ] bi* ;
+
+: H ( X Y Z -- HXYZ )
+    #! H(X,Y,Z) = X xor Y xor Z
+    bitxor bitxor ;
+
+: I ( X Y Z -- IXYZ )
+    #! I(X,Y,Z) = Y xor (X v not(Z))
+    rot swap bitnot bitor bitxor ;
+
+: S11 7  ; inline
+: S12 12 ; inline
+: S13 17 ; inline
+: S14 22 ; inline
+: S21 5  ; inline
+: S22 9  ; inline
+: S23 14 ; inline
+: S24 20 ; inline
+: S31 4 ;  inline
+: S32 11 ; inline
+: S33 16 ; inline
+: S34 23 ; inline
+: S41 6  ; inline
+: S42 10 ; inline
+: S43 15 ; inline
+: S44 21 ; inline
+
+: (process-md5-block-F)
+    dup S11 1  0  [ F ] ABCD
+    dup S12 2  1  [ F ] DABC
+    dup S13 3  2  [ F ] CDAB
+    dup S14 4  3  [ F ] BCDA
+    dup S11 5  4  [ F ] ABCD
+    dup S12 6  5  [ F ] DABC
+    dup S13 7  6  [ F ] CDAB
+    dup S14 8  7  [ F ] BCDA
+    dup S11 9  8  [ F ] ABCD
+    dup S12 10 9  [ F ] DABC
+    dup S13 11 10 [ F ] CDAB
+    dup S14 12 11 [ F ] BCDA
+    dup S11 13 12 [ F ] ABCD
+    dup S12 14 13 [ F ] DABC
+    dup S13 15 14 [ F ] CDAB
+    dup S14 16 15 [ F ] BCDA ;
+
+: (process-md5-block-G)
+    dup S21 17 1  [ G ] ABCD
+    dup S22 18 6  [ G ] DABC
+    dup S23 19 11 [ G ] CDAB
+    dup S24 20 0  [ G ] BCDA
+    dup S21 21 5  [ G ] ABCD
+    dup S22 22 10 [ G ] DABC
+    dup S23 23 15 [ G ] CDAB
+    dup S24 24 4  [ G ] BCDA
+    dup S21 25 9  [ G ] ABCD
+    dup S22 26 14 [ G ] DABC
+    dup S23 27 3  [ G ] CDAB
+    dup S24 28 8  [ G ] BCDA
+    dup S21 29 13 [ G ] ABCD
+    dup S22 30 2  [ G ] DABC
+    dup S23 31 7  [ G ] CDAB
+    dup S24 32 12 [ G ] BCDA ;
+
+: (process-md5-block-H)
+    dup S31 33 5  [ H ] ABCD
+    dup S32 34 8  [ H ] DABC
+    dup S33 35 11 [ H ] CDAB
+    dup S34 36 14 [ H ] BCDA
+    dup S31 37 1  [ H ] ABCD
+    dup S32 38 4  [ H ] DABC
+    dup S33 39 7  [ H ] CDAB
+    dup S34 40 10 [ H ] BCDA
+    dup S31 41 13 [ H ] ABCD
+    dup S32 42 0  [ H ] DABC
+    dup S33 43 3  [ H ] CDAB
+    dup S34 44 6  [ H ] BCDA
+    dup S31 45 9  [ H ] ABCD
+    dup S32 46 12 [ H ] DABC
+    dup S33 47 15 [ H ] CDAB
+    dup S34 48 2  [ H ] BCDA ;
+
+: (process-md5-block-I)
+    dup S41 49 0  [ I ] ABCD
+    dup S42 50 7  [ I ] DABC
+    dup S43 51 14 [ I ] CDAB
+    dup S44 52 5  [ I ] BCDA
+    dup S41 53 12 [ I ] ABCD
+    dup S42 54 3  [ I ] DABC
+    dup S43 55 10 [ I ] CDAB
+    dup S44 56 1  [ I ] BCDA
+    dup S41 57 8  [ I ] ABCD
+    dup S42 58 15 [ I ] DABC
+    dup S43 59 6  [ I ] CDAB
+    dup S44 60 13 [ I ] BCDA
+    dup S41 61 4  [ I ] ABCD
+    dup S42 62 11 [ I ] DABC
+    dup S43 63 2  [ I ] CDAB
+    dup S44 64 9  [ I ] BCDA ;
+
+: (process-md5-block) ( block -- )
+    4 <groups> [ le> ] map
+
+    (process-md5-block-F)
+    (process-md5-block-G)
+    (process-md5-block-H)
+    (process-md5-block-I)
+
+    drop
+
+    update-md ;
+
+: process-md5-block ( str -- )
+    dup length [ bytes-read [ + ] change ] keep 64 = [
+        (process-md5-block)
+    ] [
+        f bytes-read get pad-last-block
+        [ (process-md5-block) ] each
+    ] if ;
+    
+: stream>md5 ( -- )
+    64 read [ process-md5-block ] keep
+    length 64 = [ stream>md5 ] when ;
+
+: get-md5 ( -- str )
+    [ a b c d ] [ get 4 >le ] map concat >byte-array ;
+
+PRIVATE>
+
+SINGLETON: md5
+
+INSTANCE: md5 checksum
+
+M: md5 checksum-stream ( stream -- byte-array )
+    drop [ initialize-md5 stream>md5 get-md5 ] with-input-stream ;
diff --git a/extra/checksums/null/null.factor b/extra/checksums/null/null.factor
new file mode 100644 (file)
index 0000000..d3ab878
--- /dev/null
@@ -0,0 +1,8 @@
+USING: checksums kernel ;
+IN: checksums.null
+
+SINGLETON: null
+
+INSTANCE: null checksum
+
+M: null checksum-bytes drop ;
diff --git a/extra/checksums/sha1/authors.txt b/extra/checksums/sha1/authors.txt
new file mode 100755 (executable)
index 0000000..7c1b2f2
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/extra/checksums/sha1/sha1-docs.factor b/extra/checksums/sha1/sha1-docs.factor
new file mode 100644 (file)
index 0000000..8b8bf1c
--- /dev/null
@@ -0,0 +1,11 @@
+USING: help.markup help.syntax ;
+IN: checksums.sha1
+
+HELP: sha1
+{ $description "SHA1 checksum algorithm." } ;
+
+ARTICLE: "checksums.sha1" "SHA1 checksum"
+"The SHA1 checksum algorithm implements a one-way hash function. It is generally considered to be stronger than MD5, however there is a known algorithm for finding collisions more effectively than a brute-force search (" { $url "http://www.schneier.com/blog/archives/2005/02/sha1_broken.html" } ")."
+{ $subsection sha1 } ;
+
+ABOUT: "checksums.sha1"
diff --git a/extra/checksums/sha1/sha1-tests.factor b/extra/checksums/sha1/sha1-tests.factor
new file mode 100755 (executable)
index 0000000..808d37d
--- /dev/null
@@ -0,0 +1,14 @@
+USING: arrays kernel math namespaces sequences tools.test checksums checksums.sha1 ;
+
+[ "a9993e364706816aba3e25717850c26c9cd0d89d" ] [ "abc" sha1 checksum-bytes hex-string ] unit-test
+[ "84983e441c3bd26ebaae4aa1f95129e5e54670f1" ] [ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" sha1 checksum-bytes hex-string ] unit-test
+! [ "34aa973cd4c4daa4f61eeb2bdbad27316534016f" ] [ 1000000 CHAR: a fill string>sha1str ] unit-test ! takes a long time...
+[ "dea356a2cddd90c7a7ecedc5ebb563934f460452" ] [ "0123456701234567012345670123456701234567012345670123456701234567"
+10 swap <array> concat sha1 checksum-bytes hex-string ] unit-test
+
+[
+    ";\u00009b\u0000fd\u0000cdK\u0000a3^s\u0000d0*\u0000e3\\\u0000b5\u000013<\u0000e8wA\u0000b2\u000083\u0000d20\u0000f1\u0000e6\u0000cc\u0000d8\u00001e\u00009c\u000004\u0000d7PT]\u0000ce,\u000001\u000012\u000080\u000096\u000099"
+] [
+    "\u000066\u000053\u0000f1\u00000c\u00001a\u0000fa\u0000b5\u00004c\u000061\u0000c8\u000025\u000075\u0000a8\u00004a\u0000fe\u000030\u0000d8\u0000aa\u00001a\u00003a\u000096\u000096\u0000b3\u000018\u000099\u000092\u0000bf\u0000e1\u0000cb\u00007f\u0000a6\u0000a7"
+    sha1-interleave
+] unit-test
diff --git a/extra/checksums/sha1/sha1.factor b/extra/checksums/sha1/sha1.factor
new file mode 100755 (executable)
index 0000000..6427e0e
--- /dev/null
@@ -0,0 +1,120 @@
+USING: arrays combinators crypto.common kernel io
+io.encodings.binary io.files io.streams.byte-array math.vectors
+strings sequences namespaces math parser sequences vectors
+io.binary hashtables symbols math.bitfields.lib checksums ;
+IN: checksums.sha1
+
+! Implemented according to RFC 3174.
+
+SYMBOLS: h0 h1 h2 h3 h4 A B C D E w K ;
+
+: get-wth ( n -- wth ) w get nth ; inline
+: shift-wth ( n -- x ) get-wth 1 bitroll-32 ; inline
+
+: initialize-sha1 ( -- )
+    0 bytes-read set
+    HEX: 67452301 dup h0 set A set
+    HEX: efcdab89 dup h1 set B set
+    HEX: 98badcfe dup h2 set C set
+    HEX: 10325476 dup h3 set D set
+    HEX: c3d2e1f0 dup h4 set E set
+    [
+        20 HEX: 5a827999 <array> %
+        20 HEX: 6ed9eba1 <array> %
+        20 HEX: 8f1bbcdc <array> %
+        20 HEX: ca62c1d6 <array> %
+    ] { } make K set ;
+
+! W(t) = S^1(W(t-3) XOR W(t-8) XOR W(t-14) XOR W(t-16))
+: sha1-W ( t -- W_t )
+     dup 3 - get-wth
+     over 8 - get-wth bitxor
+     over 14 - get-wth bitxor
+     swap 16 - get-wth bitxor 1 bitroll-32 ;
+
+! f(t;B,C,D) = (B AND C) OR ((NOT B) AND D)         ( 0 <= t <= 19)
+! f(t;B,C,D) = B XOR C XOR D                        (20 <= t <= 39)
+! f(t;B,C,D) = (B AND C) OR (B AND D) OR (C AND D)  (40 <= t <= 59)
+! f(t;B,C,D) = B XOR C XOR D                        (60 <= t <= 79)
+: sha1-f ( B C D t -- f_tbcd )
+    20 /i
+    {   
+        { 0 [ >r over bitnot r> bitand >r bitand r> bitor ] }
+        { 1 [ bitxor bitxor ] }
+        { 2 [ 2dup bitand >r pick bitand >r bitand r> r> bitor bitor ] }
+        { 3 [ bitxor bitxor ] }
+    } case ;
+
+: make-w ( str -- )
+    #! compute w, steps a-b of RFC 3174, section 6.1
+    16 [ nth-int-be w get push ] with each
+    16 80 dup <slice> [ sha1-W w get push ] each ;
+
+: init-letters ( -- )
+    ! step c of RFC 3174, section 6.1
+    h0 get A set
+    h1 get B set
+    h2 get C set
+    h3 get D set
+    h4 get E set ;
+
+: inner-loop ( n -- temp )
+    ! TEMP = S^5(A) + f(t;B,C,D) + E + W(t) + K(t);
+    [
+        [ B get C get D get ] keep sha1-f ,
+        dup get-wth ,
+        K get nth ,
+        A get 5 bitroll-32 ,
+        E get ,
+    ] { } make sum 32 bits ; inline
+
+: set-vars ( temp -- )
+    ! E = D;  D = C;  C = S^30(B);  B = A; A = TEMP;
+    D get E set
+    C get D set
+    B get 30 bitroll-32 C set
+    A get B set
+    A set ;
+
+: calculate-letters ( -- )
+    ! step d of RFC 3174, section 6.1
+    80 [ inner-loop set-vars ] each ;
+
+: update-hs ( -- )
+    ! step e of RFC 3174, section 6.1
+    A h0 update-old-new
+    B h1 update-old-new
+    C h2 update-old-new
+    D h3 update-old-new
+    E h4 update-old-new ;
+
+: (process-sha1-block) ( str -- )
+    80 <vector> w set make-w init-letters calculate-letters update-hs ;
+
+: process-sha1-block ( str -- )
+    dup length [ bytes-read [ + ] change ] keep 64 = [
+        (process-sha1-block)
+    ] [
+        t bytes-read get pad-last-block
+        [ (process-sha1-block) ] each
+    ] if ;
+
+: stream>sha1 ( -- )
+    64 read [ process-sha1-block ] keep
+    length 64 = [ stream>sha1 ] when ;
+
+: get-sha1 ( -- str )
+    [ [ h0 h1 h2 h3 h4 ] [ get 4 >be % ] each ] "" make ;
+
+SINGLETON: sha1
+
+INSTANCE: sha1 checksum
+
+M: sha1 checksum-stream ( stream -- sha1 )
+    drop [ initialize-sha1 stream>sha1 get-sha1 ] with-input-stream ;
+
+: sha1-interleave ( string -- seq )
+    [ zero? ] left-trim
+    dup length odd? [ rest ] when
+    seq>2seq [ sha1 checksum-bytes ] bi@
+    2seq>seq ;
diff --git a/extra/checksums/sha2/authors.txt b/extra/checksums/sha2/authors.txt
new file mode 100755 (executable)
index 0000000..7c1b2f2
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/extra/checksums/sha2/sha2-docs.factor b/extra/checksums/sha2/sha2-docs.factor
new file mode 100644 (file)
index 0000000..c39831b
--- /dev/null
@@ -0,0 +1,11 @@
+USING: help.markup help.syntax ;
+IN: checksums.sha2
+
+HELP: sha-256
+{ $description "SHA-256 checksum algorithm." } ;
+
+ARTICLE: "checksums.sha2" "SHA2 checksum"
+"The SHA2 checksum algorithm implements a one-way hash function. It is generally considered to be pretty strong."
+{ $subsection sha-256 } ;
+
+ABOUT: "checksums.sha2"
diff --git a/extra/checksums/sha2/sha2-tests.factor b/extra/checksums/sha2/sha2-tests.factor
new file mode 100755 (executable)
index 0000000..2f4e3c5
--- /dev/null
@@ -0,0 +1,7 @@
+USING: arrays kernel math namespaces sequences tools.test checksums.sha2 checksums ;
+[ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ] [ "" sha-256 checksum-bytes hex-string ] unit-test
+[ "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" ] [ "abc" sha-256 checksum-bytes hex-string ] unit-test
+[ "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650" ] [ "message digest" sha-256 checksum-bytes hex-string ] unit-test
+[ "71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73" ] [ "abcdefghijklmnopqrstuvwxyz" sha-256 checksum-bytes hex-string ] unit-test
+[ "db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0" ] [ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" sha-256 checksum-bytes hex-string ] unit-test
+[ "f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e" ] [ "12345678901234567890123456789012345678901234567890123456789012345678901234567890" sha-256 checksum-bytes hex-string ] unit-test
diff --git a/extra/checksums/sha2/sha2.factor b/extra/checksums/sha2/sha2.factor
new file mode 100755 (executable)
index 0000000..e5f16c9
--- /dev/null
@@ -0,0 +1,132 @@
+USING: crypto.common kernel splitting math sequences namespaces
+io.binary symbols math.bitfields.lib checksums ;
+IN: checksums.sha2
+
+<PRIVATE
+
+SYMBOLS: vars M K H S0 S1 process-M word-size block-size ;
+
+: a 0 ; inline
+: b 1 ; inline
+: c 2 ; inline
+: d 3 ; inline
+: e 4 ; inline
+: f 5 ; inline
+: g 6 ; inline
+: h 7 ; inline
+
+: initial-H-256 ( -- seq )
+    {
+        HEX: 6a09e667 HEX: bb67ae85 HEX: 3c6ef372 HEX: a54ff53a
+        HEX: 510e527f HEX: 9b05688c HEX: 1f83d9ab HEX: 5be0cd19
+    } ;
+
+: K-256 ( -- seq )
+    {
+        HEX: 428a2f98 HEX: 71374491 HEX: b5c0fbcf HEX: e9b5dba5
+        HEX: 3956c25b HEX: 59f111f1 HEX: 923f82a4 HEX: ab1c5ed5
+        HEX: d807aa98 HEX: 12835b01 HEX: 243185be HEX: 550c7dc3
+        HEX: 72be5d74 HEX: 80deb1fe HEX: 9bdc06a7 HEX: c19bf174
+        HEX: e49b69c1 HEX: efbe4786 HEX: 0fc19dc6 HEX: 240ca1cc
+        HEX: 2de92c6f HEX: 4a7484aa HEX: 5cb0a9dc HEX: 76f988da
+        HEX: 983e5152 HEX: a831c66d HEX: b00327c8 HEX: bf597fc7
+        HEX: c6e00bf3 HEX: d5a79147 HEX: 06ca6351 HEX: 14292967
+        HEX: 27b70a85 HEX: 2e1b2138 HEX: 4d2c6dfc HEX: 53380d13
+        HEX: 650a7354 HEX: 766a0abb HEX: 81c2c92e HEX: 92722c85
+        HEX: a2bfe8a1 HEX: a81a664b HEX: c24b8b70 HEX: c76c51a3
+        HEX: d192e819 HEX: d6990624 HEX: f40e3585 HEX: 106aa070
+        HEX: 19a4c116 HEX: 1e376c08 HEX: 2748774c HEX: 34b0bcb5
+        HEX: 391c0cb3 HEX: 4ed8aa4a HEX: 5b9cca4f HEX: 682e6ff3
+        HEX: 748f82ee HEX: 78a5636f HEX: 84c87814 HEX: 8cc70208
+        HEX: 90befffa HEX: a4506ceb HEX: bef9a3f7 HEX: c67178f2
+    } ;
+
+: s0-256 ( x -- x' )
+    [ -7 bitroll-32 ] keep
+    [ -18 bitroll-32 ] keep
+    -3 shift bitxor bitxor ; inline
+
+: s1-256 ( x -- x' )
+    [ -17 bitroll-32 ] keep
+    [ -19 bitroll-32 ] keep
+    -10 shift bitxor bitxor ; inline
+
+: process-M-256 ( seq n -- )
+    [ 16 - swap nth ] 2keep
+    [ 15 - swap nth s0-256 ] 2keep
+    [ 7 - swap nth ] 2keep
+    [ 2 - swap nth s1-256 ] 2keep
+    >r >r + + w+ r> r> swap set-nth ; inline
+
+: prepare-message-schedule ( seq -- w-seq )
+    word-size get group [ be> ] map block-size get 0 pad-right
+    dup 16 64 dup <slice> [
+        process-M-256
+    ] with each ;
+
+: ch ( x y z -- x' )
+    [ bitxor bitand ] keep bitxor ;
+
+: maj ( x y z -- x' )
+    >r [ bitand ] 2keep bitor r> bitand bitor ;
+
+: S0-256 ( x -- x' )
+    [ -2 bitroll-32 ] keep
+    [ -13 bitroll-32 ] keep
+    -22 bitroll-32 bitxor bitxor ; inline
+
+: S1-256 ( x -- x' )
+    [ -6 bitroll-32 ] keep
+    [ -11 bitroll-32 ] keep
+    -25 bitroll-32 bitxor bitxor ; inline
+
+: T1 ( W n -- T1 )
+    [ swap nth ] keep
+    K get nth +
+    e vars get slice3 ch +
+    e vars get nth S1-256 +
+    h vars get nth w+ ;
+
+: T2 ( -- T2 )
+    a vars get nth S0-256
+    a vars get slice3 maj w+ ;
+
+: update-vars ( T1 T2 -- )
+    vars get
+    h g pick exchange
+    g f pick exchange
+    f e pick exchange
+    pick d pick nth w+ e pick set-nth
+    d c pick exchange
+    c b pick exchange
+    b a pick exchange
+    >r w+ a r> set-nth ;
+
+: process-chunk ( M -- )
+    H get clone vars set
+    prepare-message-schedule block-size get [
+        T1 T2 update-vars
+    ] with each vars get H get [ w+ ] 2map H set ;
+
+: seq>byte-array ( n seq -- string )
+    [ swap [ >be % ] curry each ] B{ } make ;
+
+: byte-array>sha2 ( byte-array -- string )
+    t preprocess-plaintext
+    block-size get group [ process-chunk ] each
+    4 H get seq>byte-array ;
+
+PRIVATE>
+
+SINGLETON: sha-256
+
+INSTANCE: sha-256 checksum
+
+M: sha-256 checksum-bytes
+    drop [
+        K-256 K set
+        initial-H-256 H set
+        4 word-size set
+        64 block-size set
+        byte-array>sha2
+    ] with-scope ;
index 34dd181d3b59c3b01e5d979b496484a59ce12bfa..0c4c11e46f54f0a675f4fdf38fd6a1fd07c02958 100644 (file)
@@ -6,6 +6,7 @@ HELP: >tuple<
 { $description "Explodes the tuple so that tuple slots are on the stack in the order listed in the tuple." }
 { $example
     "USING: kernel prettyprint classes.tuple.lib ;"
+    "IN: scratchpad"
     "TUPLE: foo a b c ;"
     "1 2 3 \\ foo boa \\ foo >tuple< .s"
     "1\n2\n3"
@@ -18,6 +19,7 @@ HELP: >tuple*<
 { $description "Explodes the tuple so that tuple slots ending with '*' are on the stack in the order listed in the tuple." }
 { $example
     "USING: kernel prettyprint classes.tuple.lib ;"
+    "IN: scratchpad"
     "TUPLE: foo a bb* ccc dddd* ;"
     "1 2 3 4 \\ foo boa \\ foo >tuple*< .s"
     "2\n4"
index 38104a45db551c6e3cbec1730b6c6bdedd40a957..10261a1df7d0d151e08127c8f6dd4d806592c73a 100755 (executable)
@@ -7,11 +7,11 @@ IN: classes.tuple.lib
     [ slot-spec-reader ] map [ get-slots ] curry ;
 
 MACRO: >tuple< ( class -- )
-    all-slots 1 tail-slice reader-slots ;
+    all-slots rest-slice reader-slots ;
 
 MACRO: >tuple*< ( class -- )
     all-slots
-    [ slot-spec-name "*" tail? ] subset
+    [ slot-spec-name "*" tail? ] filter
     reader-slots ;
 
 
index df3f84d45121b203dc013ae1db66f23eff329c02..f917e20bc4d36dc462707c01b29708a4d4a33367 100755 (executable)
@@ -142,7 +142,7 @@ H{
 } assoc-union alien>objc-types set-global
 
 : objc-struct-type ( i string -- ctype )
-    2dup CHAR: = -rot index* swap subseq
+    2dup CHAR: = -rot index-from swap subseq
     dup c-types get key? [
         "Warning: no such C type: " write dup print
         drop "void*"
index 6b2adce9d9387e5f54875501622ba8f539669f0f..a2f0cccf3bd704529178f8aa3319a50460daac27 100644 (file)
@@ -14,7 +14,7 @@ HELP: <column> ( seq n -- column )
 { $description "Outputs a new virtual sequence which presents a fixed column of a matrix represented as a sequence of rows." "The " { $snippet "i" } "th element of a column is the " { $snippet "n" } "th element of the " { $snippet "i" } "th element of" { $snippet "seq" } ". Every element of " { $snippet "seq" } " must be a sequence, and all sequences must have equal length." }
 { $examples
     { $example
-        "USING: arrays prettyprint sequences ;"
+        "USING: arrays prettyprint columns ;"
         "{ { 1 2 3 } { 4 5 6 } { 7 8 9 } } 0 <column> >array ."
         "{ 1 4 7 }"
     }
index 84b41a91ff6ae3006c23ecd70b61907f5add5f0a..5dfe8527c1a80d75b24f6d95535bafacee4338b4 100755 (executable)
@@ -169,3 +169,8 @@ MACRO: multikeep ( word out-indexes -- ... )
 : generate ( generator predicate -- obj )
     [ dup ] swap [ dup [ nip ] unless not ] 3compose
     swap [ ] do-while ;
+
+MACRO: predicates ( seq -- quot/f )
+    dup [ 1quotation [ drop ] prepend ] map
+    >r [ [ dup ] prepend ] map r> zip [ drop f ] suffix
+    [ cond ] curry ;
index 0db235d9e6d40c818aa4fbccd85d7c869712b1d1..a23301c1e281a238def0312b3ec0159b0da5b2b9 100755 (executable)
@@ -6,20 +6,32 @@ HELP: parallel-map
 { $description "Spawns a new thread for applying " { $snippet "quot" } " to every element of " { $snippet "seq" } ", collecting the results at the end." }\r
 { $errors "Throws an error if one of the iterations throws an error." } ;\r
 \r
+HELP: 2parallel-map\r
+{ $values { "seq1" sequence } { "seq2" sequence } { "quot" "a quotation with stack effect " { $snippet "( elt -- newelt )" } } { "newseq" sequence } }\r
+{ $description "Spawns a new thread for applying " { $snippet "quot" } " to pairwise elements of " { $snippet "seq1" } " and " { $snippet "seq2" } ", collecting the results at the end." }\r
+{ $errors "Throws an error if one of the iterations throws an error." } ;\r
+\r
 HELP: parallel-each\r
 { $values { "seq" sequence } { "quot" "a quotation with stack effect " { $snippet "( elt -- )" } } }\r
 { $description "Spawns a new thread for applying " { $snippet "quot" } " to every element of " { $snippet "seq" } ", blocking until all quotations complete." }\r
 { $errors "Throws an error if one of the iterations throws an error." } ;\r
 \r
-HELP: parallel-subset\r
+HELP: 2parallel-each\r
+{ $values { "seq1" sequence } { "seq2" sequence } { "quot" "a quotation with stack effect " { $snippet "( elt -- )" } } }\r
+{ $description "Spawns a new thread for applying " { $snippet "quot" } " to pairwise elements of " { $snippet "seq1" } " and " { $snippet "seq2" } ", blocking until all quotations complete." }\r
+{ $errors "Throws an error if one of the iterations throws an error." } ;\r
+\r
+HELP: parallel-filter\r
 { $values { "seq" sequence } { "quot" "a quotation with stack effect " { $snippet "( elt -- ? )" } } { "newseq" sequence } }\r
 { $description "Spawns a new thread for applying " { $snippet "quot" } " to every element of " { $snippet "seq" } ", collecting the elements for which the quotation yielded a true value." }\r
 { $errors "Throws an error if one of the iterations throws an error." } ;\r
 \r
 ARTICLE: "concurrency.combinators" "Concurrent combinators"\r
-"The " { $vocab-link "concurrency.combinators" } " vocabulary provides concurrent variants of " { $link each } ", " { $link map } " and " { $link subset } ":"\r
+"The " { $vocab-link "concurrency.combinators" } " vocabulary provides concurrent variants of " { $link each } ", " { $link map } " and " { $link filter } ":"\r
 { $subsection parallel-each }\r
+{ $subsection 2parallel-each }\r
 { $subsection parallel-map }\r
-{ $subsection parallel-subset } ;\r
+{ $subsection 2parallel-map }\r
+{ $subsection parallel-filter } ;\r
 \r
 ABOUT: "concurrency.combinators"\r
index 731a740983efe97ecd0dc4c0258d11da48f051e5..562111242d0040d56d629b572e896e7d1dd27358 100755 (executable)
@@ -1,10 +1,12 @@
 IN: concurrency.combinators.tests\r
 USING: concurrency.combinators tools.test random kernel math \r
-concurrency.mailboxes threads sequences accessors ;\r
+concurrency.mailboxes threads sequences accessors arrays ;\r
 \r
 [ [ drop ] parallel-each ] must-infer\r
+{ 2 0 } [ [ 2drop ] 2parallel-each ] must-infer-as\r
 [ [ ] parallel-map ] must-infer\r
-[ [ ] parallel-subset ] must-infer\r
+{ 2 1 } [ [ 2array ] 2parallel-map ] must-infer-as\r
+[ [ ] parallel-filter ] must-infer\r
 \r
 [ { 1 4 9 } ] [ { 1 2 3 } [ sq ] parallel-map ] unit-test\r
 \r
@@ -14,7 +16,7 @@ concurrency.mailboxes threads sequences accessors ;
 [ error>> "Even" = ] must-fail-with\r
 \r
 [ V{ 0 3 6 9 } ]\r
-[ 10 [ 3 mod zero? ] parallel-subset ] unit-test\r
+[ 10 [ 3 mod zero? ] parallel-filter ] unit-test\r
 \r
 [ 10 ]\r
 [\r
@@ -22,3 +24,24 @@ concurrency.mailboxes threads sequences accessors ;
     10 over [ push ] curry parallel-each\r
     length\r
 ] unit-test\r
+\r
+[ { 10 20 30 } ] [\r
+    { 1 4 3 } { 10 5 10 } [ * ] 2parallel-map\r
+] unit-test\r
+\r
+[ { -9 -1 -7 } ] [\r
+    { 1 4 3 } { 10 5 10 } [ - ] 2parallel-map\r
+] unit-test\r
+\r
+[\r
+    { 1 4 3 } { 1 0 1 } [ / drop ] 2parallel-each\r
+] must-fail\r
+\r
+[ 20 ]\r
+[\r
+    V{ } clone\r
+    10 10 pick [ [ push ] [ push ] bi ] curry 2parallel-each\r
+    length\r
+] unit-test\r
+\r
+[ { f } [ "OOPS" throw ] parallel-each ] must-fail\r
index 76c3cfa77d96ff80a1cb984b37736b63de637845..eab0ed4cb415efccab028709fbcc5e96b9fbc5c9 100755 (executable)
@@ -4,14 +4,27 @@ USING: concurrency.futures concurrency.count-downs sequences
 kernel ;\r
 IN: concurrency.combinators\r
 \r
-: parallel-map ( seq quot -- newseq )\r
-    [ curry future ] curry map dup [ ?future ] change-each ;\r
-    inline\r
+: (parallel-each) ( n quot -- )\r
+    >r <count-down> r> keep await ; inline\r
 \r
 : parallel-each ( seq quot -- )\r
-    over length <count-down>\r
-    [ [ >r curry r> spawn-stage ] 2curry each ] keep await ;\r
-    inline\r
+    over length [\r
+        [ >r curry r> spawn-stage ] 2curry each\r
+    ] (parallel-each) ; inline\r
 \r
-: parallel-subset ( seq quot -- newseq )\r
+: 2parallel-each ( seq1 seq2 quot -- )\r
+    2over min-length [\r
+        [ >r 2curry r> spawn-stage ] 2curry 2each\r
+    ] (parallel-each) ; inline\r
+\r
+: parallel-filter ( seq quot -- newseq )\r
     over >r pusher >r each r> r> like ; inline\r
+\r
+: future-values dup [ ?future ] change-each ; inline\r
+\r
+: parallel-map ( seq quot -- newseq )\r
+    [ curry future ] curry map future-values ;\r
+    inline\r
+\r
+: 2parallel-map ( seq1 seq2 quot -- newseq )\r
+    [ 2curry future ] curry 2map future-values ;\r
index 6a75f7206c8cf183ad7cc69f489db2608c2ecd26..93cef250a193625abe8aa853c1fb996a4ae12890 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: dlists kernel math concurrency.promises\r
-concurrency.mailboxes ;\r
+concurrency.mailboxes debugger accessors ;\r
 IN: concurrency.count-downs\r
 \r
 ! http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html\r
@@ -9,9 +9,7 @@ IN: concurrency.count-downs
 TUPLE: count-down n promise ;\r
 \r
 : count-down-check ( count-down -- )\r
-    dup count-down-n zero? [\r
-        t swap count-down-promise fulfill\r
-    ] [ drop ] if ;\r
+    dup n>> zero? [ t swap promise>> fulfill ] [ drop ] if ;\r
 \r
 : <count-down> ( n -- count-down )\r
     dup 0 < [ "Invalid count for count down" throw ] when\r
@@ -19,15 +17,12 @@ TUPLE: count-down n promise ;
     dup count-down-check ;\r
 \r
 : count-down ( count-down -- )\r
-    dup count-down-n dup zero? [\r
-        "Count down already done" throw\r
-    ] [\r
-        1- over set-count-down-n\r
-        count-down-check\r
-    ] if ;\r
+    dup n>> dup zero?\r
+    [ "Count down already done" throw ]\r
+    [ 1- >>n count-down-check ] if ;\r
 \r
 : await-timeout ( count-down timeout -- )\r
-    >r count-down-promise r> ?promise-timeout drop ;\r
+    >r promise>> r> ?promise-timeout ?linked t assert= ;\r
 \r
 : await ( count-down -- )\r
     f await-timeout ;\r
@@ -35,5 +30,4 @@ TUPLE: count-down n promise ;
 : spawn-stage ( quot count-down -- )\r
     [ [ count-down ] curry compose ] keep\r
     "Count down stage"\r
-    swap count-down-promise\r
-    promise-mailbox spawn-linked-to drop ;\r
+    swap promise>> mailbox>> spawn-linked-to drop ;\r
index 6704272305e16cc1afd520953f54f57d97016000..c637f4baa34bf3e4a51116a1a97bdcb6292a01c8 100755 (executable)
@@ -3,7 +3,7 @@
 USING: serialize sequences concurrency.messaging threads io
 io.server qualified arrays namespaces kernel io.encodings.binary
 accessors ;
-QUALIFIED: io.sockets
+FROM: io.sockets => host-name <inet> with-client ;
 IN: concurrency.distributed
 
 SYMBOL: local-node
@@ -23,7 +23,7 @@ SYMBOL: local-node
 
 : start-node ( port -- )
     [ internet-server ]
-    [ io.sockets:host-name swap io.sockets:<inet> ] bi
+    [ host-name swap <inet> ] bi
     (start-node) ;
 
 TUPLE: remote-process id node ;
@@ -31,8 +31,7 @@ TUPLE: remote-process id node ;
 C: <remote-process> remote-process
 
 : send-remote-message ( message node -- )
-    binary io.sockets:<client>
-    [ serialize ] with-stream ;
+    binary [ serialize ] with-client ;
 
 M: remote-process send ( message thread -- )
     [ id>> 2array ] [ node>> ] bi
index f23ea951670ae2283cc81bcaa56e2c9af0476c4d..9d3f6de98cb0cba25824145fc231d369960a58f2 100755 (executable)
@@ -1,11 +1,12 @@
 IN: concurrency.flags.tests\r
-USING: tools.test concurrency.flags kernel threads locals ;\r
+USING: tools.test concurrency.flags concurrency.combinators\r
+kernel threads locals accessors ;\r
 \r
 :: flag-test-1 ( -- )\r
     [let | f [ <flag> ] |\r
         [ f raise-flag ] "Flag test" spawn drop\r
         f lower-flag\r
-        f flag-value?\r
+        f value>>\r
     ] ;\r
 \r
 [ f ] [ flag-test-1 ] unit-test\r
@@ -14,7 +15,7 @@ USING: tools.test concurrency.flags kernel threads locals ;
     [let | f [ <flag> ] |\r
         [ 1000 sleep f raise-flag ] "Flag test" spawn drop\r
         f lower-flag\r
-        f flag-value?\r
+        f value>>\r
     ] ;\r
 \r
 [ f ] [ flag-test-2 ] unit-test\r
@@ -22,7 +23,7 @@ USING: tools.test concurrency.flags kernel threads locals ;
 :: flag-test-3 ( -- )\r
     [let | f [ <flag> ] |\r
         f raise-flag\r
-        f flag-value?\r
+        f value>>\r
     ] ;\r
 \r
 [ t ] [ flag-test-3 ] unit-test\r
@@ -31,7 +32,7 @@ USING: tools.test concurrency.flags kernel threads locals ;
     [let | f [ <flag> ] |\r
         [ f raise-flag ] "Flag test" spawn drop\r
         f wait-for-flag\r
-        f flag-value?\r
+        f value>>\r
     ] ;\r
 \r
 [ t ] [ flag-test-4 ] unit-test\r
@@ -40,7 +41,13 @@ USING: tools.test concurrency.flags kernel threads locals ;
     [let | f [ <flag> ] |\r
         [ 1000 sleep f raise-flag ] "Flag test" spawn drop\r
         f wait-for-flag\r
-        f flag-value?\r
+        f value>>\r
     ] ;\r
 \r
 [ t ] [ flag-test-5 ] unit-test\r
+\r
+[ ] [\r
+    { 1 2 } <flag>\r
+    [ [ 1000 sleep raise-flag ] curry "Flag test" spawn drop ]\r
+    [ [ wait-for-flag drop ] curry parallel-each ] bi\r
+] unit-test\r
index b3c76a7a01694bd7a6ee4ac6989194c1e7109a99..ec260961d0417c7ca3a2407d2ba320cb92c2a3be 100755 (executable)
@@ -1,22 +1,20 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: boxes kernel threads ;
+USING: dlists kernel threads concurrency.conditions accessors ;
 IN: concurrency.flags
 
-TUPLE: flag value? thread ;
+TUPLE: flag value threads ;
 
-: <flag> ( -- flag ) f <box> flag boa ;
+: <flag> ( -- flag ) f <dlist> flag boa ;
 
 : raise-flag ( flag -- )
-    dup flag-value? [
-        t over set-flag-value?
-        dup flag-thread [ resume ] if-box?
-    ] unless drop ;
+    dup value>> [ drop ] [ t >>value threads>> notify-all ] if ;
+
+: wait-for-flag-timeout ( flag timeout -- )
+    over value>> [ 2drop ] [ >r threads>> r> "flag" wait ] if ;
 
 : wait-for-flag ( flag -- )
-    dup flag-value? [ drop ] [
-        [ flag-thread >box ] curry "flag" suspend drop
-    ] if ;
+    f wait-for-flag-timeout ;
 
 : lower-flag ( flag -- )
-    dup wait-for-flag f swap set-flag-value? ;
+    [ wait-for-flag ] [ f >>value drop ] bi ;
index ac0319770817a0fc3814e110d29c804744609f82..aa4dc2df3d1878e29f633c506e646c5e8f2431e9 100755 (executable)
@@ -3,7 +3,7 @@
 IN: concurrency.mailboxes\r
 USING: dlists threads sequences continuations\r
 namespaces random math quotations words kernel arrays assocs\r
-init system concurrency.conditions accessors ;\r
+init system concurrency.conditions accessors debugger ;\r
 \r
 TUPLE: mailbox threads data closed ;\r
 \r
@@ -83,6 +83,9 @@ M: mailbox dispose
 \r
 TUPLE: linked-error error thread ;\r
 \r
+M: linked-error error.\r
+    [ thread>> error-in-thread. ] [ error>> error. ] bi ;\r
+\r
 C: <linked-error> linked-error\r
 \r
 : ?linked dup linked-error? [ rethrow ] when ;\r
diff --git a/extra/contributors/contributors-tests.factor b/extra/contributors/contributors-tests.factor
new file mode 100644 (file)
index 0000000..1476715
--- /dev/null
@@ -0,0 +1,5 @@
+IN: contributors.tests
+USING: contributors tools.test ;
+
+\ contributors must-infer
+[ ] [ contributors ] unit-test
index 868e9681696344c79e6e2ded3d6c753fcee913a1..9f2d5a55fa1cc1f8e51b6dc93be9723cea782b97 100755 (executable)
@@ -1,13 +1,13 @@
 ! Copyright (C) 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: io.files io.launcher io.styles io hashtables kernel
-sequences sequences.lib assocs system sorting math.parser
-sets ;
+USING: io.files io.launcher io.styles io.encodings.ascii io
+hashtables kernel sequences sequences.lib assocs system sorting
+math.parser sets ;
 IN: contributors
 
 : changelog ( -- authors )
     image parent-directory [
-        "git-log --pretty=format:%an" <process-stream> lines
+        "git-log --pretty=format:%an" ascii <process-reader> lines
     ] with-directory ;
 
 : patch-counts ( authors -- assoc )
index 67a4e59d04151ba90e840319da4a156efcbed380..4698aa45ae007e274b745e739c030d7917cb43aa 100644 (file)
@@ -153,7 +153,7 @@ SYMBOL: event-stream-callbacks
 
 [
     event-stream-callbacks global
-    [ [ drop expired? not ] assoc-subset H{ } assoc-like ] change-at
+    [ [ drop expired? not ] assoc-filter H{ } assoc-like ] change-at
 ] "core-foundation" add-init-hook
 
 : add-event-source-callback ( quot -- id )
index ecc998e99ca563f0ffe7c4029e2bc23a5d908f63..f1af0ef15ef07366d165a744298b2b82547d79fd 100755 (executable)
@@ -573,7 +573,7 @@ SYMBOL: $4
   #! $1, $2, etc with the relevant item from the 
   #! given index.
   dup quotation? over [ ] = not and [ ! vector tree
-    dup first swap 1 tail ! vector car cdr
+    dup first swap rest ! vector car cdr
     >r dupd replace-patterns ! vector v R: cdr
     swap r> replace-patterns >r 1quotation r> append
   ] [ ! vector value
index 85f27d7e4081e527847d2eb42560aa02394113ae..f88db2935fa39363385a77006b6d998e4dd19ab2 100755 (executable)
@@ -1,5 +1,5 @@
 USING: kernel cpu.8080 cpu.8080.emulator math math io\r
-tools.time combinators sequences io.files ;\r
+tools.time combinators sequences io.files io.encodings.ascii ;\r
 IN: cpu.8080.test\r
 \r
 : step ( cpu -- )\r
@@ -29,7 +29,7 @@ IN: cpu.8080.test
 \r
 : >ppm ( cpu filename -- cpu )\r
   #! Dump the current screen image to a ppm image file with the given name.\r
-  <file-writer> [\r
+  ascii [\r
     "P3" print\r
     "256 224" print\r
     "1" print\r
@@ -45,7 +45,7 @@ IN: cpu.8080.test
         ] each-8bit drop\r
       ] each drop nl\r
     ] each\r
-  ] with-stream ;\r
+  ] with-file-writer ;\r
 \r
 : time-test ( -- )\r
   test-cpu [ 1000000 run-n drop ] time ;\r
diff --git a/extra/crypto/common/common-docs.factor b/extra/crypto/common/common-docs.factor
deleted file mode 100644 (file)
index 559c793..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-USING: help.markup help.syntax kernel math sequences quotations
-math.private ;
-IN: crypto.common
-
-HELP: hex-string
-{ $values { "seq" "a sequence" } { "str" "a string" } }
-{ $description "Converts a sequence of values from 0-255 to a string of hex numbers from 0-ff." }
-{ $examples
-    { $example "USING: crypto.common io ;" "B{ 1 2 3 4 } hex-string print" "01020304" }
-}
-{ $notes "Numbers are zero-padded on the left." } ;
-
-
index a714727ad9891c682cfab611c5b147e87492114b..efe4653ebafef13209a83f27d9ffb9ba2de862fa 100644 (file)
@@ -1,5 +1,6 @@
 USING: arrays kernel io io.binary sbufs splitting strings sequences
-namespaces math math.parser parser hints math.bitfields.lib ;
+namespaces math math.parser parser hints math.bitfields.lib
+assocs ;
 IN: crypto.common
 
 : w+ ( int int -- int ) + 32 bits ; inline
@@ -39,9 +40,6 @@ SYMBOL: big-endian?
 : update-old-new ( old new -- )
     [ get >r get r> ] 2keep >r >r w+ dup r> set r> set ; inline
 
-: hex-string ( seq -- str )
-    [ [ >hex 2 48 pad-left % ] each ] "" make ;
-
 : slice3 ( n seq -- a b c ) >r dup 3 + r> <slice> first3 ;
 
 : seq>2seq ( seq -- seq1 seq2 )
@@ -50,7 +48,7 @@ SYMBOL: big-endian?
 
 : 2seq>seq ( seq1 seq2 -- seq )
     #! { aceg } { bdfh } -> { abcdefgh }
-    [ 2array flip concat ] keep like ;
+    [ zip concat ] keep like ;
 
 : mod-nth ( n seq -- elt )
     #! 5 "abcd" -> b
index 91d404aead4277ef93868894f85ff5b96cd7c93c..6e30f19775cd1f1ec596124dad8775ae420eec94 100755 (executable)
@@ -1,18 +1,19 @@
-USING: arrays combinators crypto.common crypto.md5 crypto.sha1
-crypto.md5.private io io.binary io.files io.streams.byte-array
-kernel math math.vectors memoize sequences io.encodings.binary ;
+USING: arrays combinators crypto.common checksums checksums.md5
+checksums.sha1 checksums.md5.private io io.binary io.files
+io.streams.byte-array kernel math math.vectors memoize sequences
+io.encodings.binary ;
 IN: crypto.hmac
 
 : sha1-hmac ( Ko Ki -- hmac )
     initialize-sha1 process-sha1-block
-    (stream>sha1) get-sha1
+    stream>sha1 get-sha1
     initialize-sha1
     >r process-sha1-block r>
     process-sha1-block get-sha1 ;
 
 : md5-hmac ( Ko Ki -- hmac )
     initialize-md5 process-md5-block
-    (stream>md5) get-md5
+    stream>md5 get-md5
     initialize-md5
     >r process-md5-block r>
     process-md5-block get-md5 ;
@@ -29,7 +30,7 @@ MEMO: opad ( -- seq ) 64 HEX: 5c <array> ;
     ipad seq-bitxor ;
 
 : stream>sha1-hmac ( K stream -- hmac )
-    [ init-hmac sha1-hmac ] with-stream ;
+    [ init-hmac sha1-hmac ] with-input-stream ;
 
 : file>sha1-hmac ( K path -- hmac )
     binary <file-reader> stream>sha1-hmac ;
@@ -38,7 +39,7 @@ MEMO: opad ( -- seq ) 64 HEX: 5c <array> ;
     binary <byte-reader> stream>sha1-hmac ;
 
 : stream>md5-hmac ( K stream -- hmac )
-    [ init-hmac md5-hmac ] with-stream ;
+    [ init-hmac md5-hmac ] with-input-stream ;
 
 : file>md5-hmac ( K path -- hmac )
     binary <file-reader> stream>md5-hmac ;
diff --git a/extra/crypto/md5/authors.txt b/extra/crypto/md5/authors.txt
deleted file mode 100755 (executable)
index 7c1b2f2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Doug Coleman
diff --git a/extra/crypto/md5/md5-docs.factor b/extra/crypto/md5/md5-docs.factor
deleted file mode 100755 (executable)
index 667e044..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-USING: help.markup help.syntax kernel math sequences quotations
-crypto.common byte-arrays ;
-IN: crypto.md5
-
-HELP: stream>md5
-{ $values { "stream" "a stream" } { "byte-array" "md5 hash" } }
-{ $description "Take the MD5 hash until end of stream." }
-{ $notes "Used to implement " { $link byte-array>md5 } " and " { $link file>md5 } ".  Call " { $link hex-string } " to convert to the canonical string representation." } ;
-
-HELP: byte-array>md5
-{ $values { "byte-array" byte-array } { "checksum" "an md5 hash" } }
-{ $description "Outputs the MD5 hash of a byte array." }
-{ $notes "Call " { $link hex-string } " to convert to the canonical string representation." } ;
-
-HELP: file>md5
-{ $values { "path" "a path" } { "byte-array" "byte-array md5 hash" } }
-{ $description "Outputs the MD5 hash of a file." }
-{ $notes "Call " { $link hex-string } " to convert to the canonical string representation." } ;
diff --git a/extra/crypto/md5/md5-tests.factor b/extra/crypto/md5/md5-tests.factor
deleted file mode 100755 (executable)
index 73bd240..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-USING: kernel math namespaces crypto.md5 tools.test byte-arrays ;
-
-[ "d41d8cd98f00b204e9800998ecf8427e" ] [ "" >byte-array byte-array>md5str ] unit-test
-[ "0cc175b9c0f1b6a831c399e269772661" ] [ "a" >byte-array byte-array>md5str ] unit-test
-[ "900150983cd24fb0d6963f7d28e17f72" ] [ "abc" >byte-array byte-array>md5str ] unit-test
-[ "f96b697d7cb7938d525a2f31aaf161d0" ] [ "message digest" >byte-array byte-array>md5str ] unit-test
-[ "c3fcd3d76192e4007dfb496cca67e13b" ] [ "abcdefghijklmnopqrstuvwxyz" >byte-array byte-array>md5str ] unit-test
-[ "d174ab98d277d9f5a5611c2c9f419d9f" ] [ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" >byte-array byte-array>md5str ] unit-test
-[ "57edf4a22be3c955ac49da2e2107b67a" ] [ "12345678901234567890123456789012345678901234567890123456789012345678901234567890" >byte-array byte-array>md5str ] unit-test
-
diff --git a/extra/crypto/md5/md5.factor b/extra/crypto/md5/md5.factor
deleted file mode 100755 (executable)
index 45e10da..0000000
+++ /dev/null
@@ -1,191 +0,0 @@
-! See http://www.faqs.org/rfcs/rfc1321.html
-
-USING: kernel io io.binary io.files io.streams.byte-array math
-math.functions math.parser namespaces splitting strings
-sequences crypto.common byte-arrays locals sequences.private
-io.encodings.binary symbols math.bitfields.lib ;
-IN: crypto.md5
-
-<PRIVATE
-
-SYMBOLS: a b c d old-a old-b old-c old-d ;
-
-: T ( N -- Y )
-    sin abs 4294967296 * >bignum ; foldable
-
-: initialize-md5 ( -- )
-    0 bytes-read set
-    HEX: 67452301 dup a set old-a set
-    HEX: efcdab89 dup b set old-b set
-    HEX: 98badcfe dup c set old-c set
-    HEX: 10325476 dup d set old-d set ;
-
-: update-md ( -- )
-    old-a a update-old-new
-    old-b b update-old-new
-    old-c c update-old-new
-    old-d d update-old-new ;
-
-:: (ABCD) ( x s i k func a b c d -- )
-    #! a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
-    a [
-        b get c get d get func call w+
-        k x nth-unsafe w+
-        i T w+
-        s bitroll-32
-        b get w+
-    ] change ; inline
-
-: ABCD a b c d (ABCD) ; inline
-: BCDA b c d a (ABCD) ; inline
-: CDAB c d a b (ABCD) ; inline
-: DABC d a b c (ABCD) ; inline
-
-: F ( X Y Z -- FXYZ )
-    #! F(X,Y,Z) = XY v not(X) Z
-    pick bitnot bitand [ bitand ] [ bitor ] bi* ;
-
-: G ( X Y Z -- GXYZ )
-    #! G(X,Y,Z) = XZ v Y not(Z)
-    dup bitnot rot bitand [ bitand ] [ bitor ] bi* ;
-
-: H ( X Y Z -- HXYZ )
-    #! H(X,Y,Z) = X xor Y xor Z
-    bitxor bitxor ;
-
-: I ( X Y Z -- IXYZ )
-    #! I(X,Y,Z) = Y xor (X v not(Z))
-    rot swap bitnot bitor bitxor ;
-
-: S11 7  ; inline
-: S12 12 ; inline
-: S13 17 ; inline
-: S14 22 ; inline
-: S21 5  ; inline
-: S22 9  ; inline
-: S23 14 ; inline
-: S24 20 ; inline
-: S31 4 ;  inline
-: S32 11 ; inline
-: S33 16 ; inline
-: S34 23 ; inline
-: S41 6  ; inline
-: S42 10 ; inline
-: S43 15 ; inline
-: S44 21 ; inline
-
-: (process-md5-block-F)
-    dup S11 1  0  [ F ] ABCD
-    dup S12 2  1  [ F ] DABC
-    dup S13 3  2  [ F ] CDAB
-    dup S14 4  3  [ F ] BCDA
-    dup S11 5  4  [ F ] ABCD
-    dup S12 6  5  [ F ] DABC
-    dup S13 7  6  [ F ] CDAB
-    dup S14 8  7  [ F ] BCDA
-    dup S11 9  8  [ F ] ABCD
-    dup S12 10 9  [ F ] DABC
-    dup S13 11 10 [ F ] CDAB
-    dup S14 12 11 [ F ] BCDA
-    dup S11 13 12 [ F ] ABCD
-    dup S12 14 13 [ F ] DABC
-    dup S13 15 14 [ F ] CDAB
-    dup S14 16 15 [ F ] BCDA ;
-
-: (process-md5-block-G)
-    dup S21 17 1  [ G ] ABCD
-    dup S22 18 6  [ G ] DABC
-    dup S23 19 11 [ G ] CDAB
-    dup S24 20 0  [ G ] BCDA
-    dup S21 21 5  [ G ] ABCD
-    dup S22 22 10 [ G ] DABC
-    dup S23 23 15 [ G ] CDAB
-    dup S24 24 4  [ G ] BCDA
-    dup S21 25 9  [ G ] ABCD
-    dup S22 26 14 [ G ] DABC
-    dup S23 27 3  [ G ] CDAB
-    dup S24 28 8  [ G ] BCDA
-    dup S21 29 13 [ G ] ABCD
-    dup S22 30 2  [ G ] DABC
-    dup S23 31 7  [ G ] CDAB
-    dup S24 32 12 [ G ] BCDA ;
-
-: (process-md5-block-H)
-    dup S31 33 5  [ H ] ABCD
-    dup S32 34 8  [ H ] DABC
-    dup S33 35 11 [ H ] CDAB
-    dup S34 36 14 [ H ] BCDA
-    dup S31 37 1  [ H ] ABCD
-    dup S32 38 4  [ H ] DABC
-    dup S33 39 7  [ H ] CDAB
-    dup S34 40 10 [ H ] BCDA
-    dup S31 41 13 [ H ] ABCD
-    dup S32 42 0  [ H ] DABC
-    dup S33 43 3  [ H ] CDAB
-    dup S34 44 6  [ H ] BCDA
-    dup S31 45 9  [ H ] ABCD
-    dup S32 46 12 [ H ] DABC
-    dup S33 47 15 [ H ] CDAB
-    dup S34 48 2  [ H ] BCDA ;
-
-: (process-md5-block-I)
-    dup S41 49 0  [ I ] ABCD
-    dup S42 50 7  [ I ] DABC
-    dup S43 51 14 [ I ] CDAB
-    dup S44 52 5  [ I ] BCDA
-    dup S41 53 12 [ I ] ABCD
-    dup S42 54 3  [ I ] DABC
-    dup S43 55 10 [ I ] CDAB
-    dup S44 56 1  [ I ] BCDA
-    dup S41 57 8  [ I ] ABCD
-    dup S42 58 15 [ I ] DABC
-    dup S43 59 6  [ I ] CDAB
-    dup S44 60 13 [ I ] BCDA
-    dup S41 61 4  [ I ] ABCD
-    dup S42 62 11 [ I ] DABC
-    dup S43 63 2  [ I ] CDAB
-    dup S44 64 9  [ I ] BCDA ;
-
-: (process-md5-block) ( block -- )
-    4 <groups> [ le> ] map
-
-    (process-md5-block-F)
-    (process-md5-block-G)
-    (process-md5-block-H)
-    (process-md5-block-I)
-
-    drop
-
-    update-md ;
-
-: process-md5-block ( str -- )
-    dup length [ bytes-read [ + ] change ] keep 64 = [
-        (process-md5-block)
-    ] [
-        f bytes-read get pad-last-block
-        [ (process-md5-block) ] each
-    ] if ;
-    
-: (stream>md5) ( -- )
-    64 read [ process-md5-block ] keep
-    length 64 = [ (stream>md5) ] when ;
-
-: get-md5 ( -- str )
-    [ a b c d ] [ get 4 >le ] map concat >byte-array ;
-
-PRIVATE>
-
-: stream>md5 ( stream -- byte-array )
-    [ initialize-md5 (stream>md5) get-md5 ] with-stream ;
-
-: byte-array>md5 ( byte-array -- checksum )
-    binary <byte-reader> stream>md5 ;
-
-: byte-array>md5str ( byte-array -- md5-string )
-    byte-array>md5 hex-string ;
-
-: file>md5 ( path -- byte-array )
-    binary <file-reader> stream>md5 ;
-
-: file>md5str ( path -- md5-string )
-    file>md5 hex-string ;
diff --git a/extra/crypto/sha1/authors.txt b/extra/crypto/sha1/authors.txt
deleted file mode 100755 (executable)
index 7c1b2f2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Doug Coleman
diff --git a/extra/crypto/sha1/sha1-tests.factor b/extra/crypto/sha1/sha1-tests.factor
deleted file mode 100755 (executable)
index 1430735..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-USING: arrays kernel math namespaces sequences tools.test crypto.sha1 ;
-
-[ "a9993e364706816aba3e25717850c26c9cd0d89d" ] [ "abc" byte-array>sha1str ] unit-test
-[ "84983e441c3bd26ebaae4aa1f95129e5e54670f1" ] [ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" byte-array>sha1str ] unit-test
-! [ "34aa973cd4c4daa4f61eeb2bdbad27316534016f" ] [ 1000000 CHAR: a fill string>sha1str ] unit-test ! takes a long time...
-[ "dea356a2cddd90c7a7ecedc5ebb563934f460452" ] [ "0123456701234567012345670123456701234567012345670123456701234567"
-10 swap <array> concat byte-array>sha1str ] unit-test
-
-[
-    ";\u00009b\u0000fd\u0000cdK\u0000a3^s\u0000d0*\u0000e3\\\u0000b5\u000013<\u0000e8wA\u0000b2\u000083\u0000d20\u0000f1\u0000e6\u0000cc\u0000d8\u00001e\u00009c\u000004\u0000d7PT]\u0000ce,\u000001\u000012\u000080\u000096\u000099"
-] [
-    "\u000066\u000053\u0000f1\u00000c\u00001a\u0000fa\u0000b5\u00004c\u000061\u0000c8\u000025\u000075\u0000a8\u00004a\u0000fe\u000030\u0000d8\u0000aa\u00001a\u00003a\u000096\u000096\u0000b3\u000018\u000099\u000092\u0000bf\u0000e1\u0000cb\u00007f\u0000a6\u0000a7"
-    byte-array>sha1-interleave
-] unit-test
diff --git a/extra/crypto/sha1/sha1.factor b/extra/crypto/sha1/sha1.factor
deleted file mode 100755 (executable)
index 37e92db..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-USING: arrays combinators crypto.common kernel io
-io.encodings.binary io.files io.streams.byte-array math.vectors
-strings sequences namespaces math parser sequences vectors
-io.binary hashtables symbols math.bitfields.lib ;
-IN: crypto.sha1
-
-! Implemented according to RFC 3174.
-
-SYMBOLS: h0 h1 h2 h3 h4 A B C D E w K ;
-
-: get-wth ( n -- wth ) w get nth ; inline
-: shift-wth ( n -- x ) get-wth 1 bitroll-32 ; inline
-
-: initialize-sha1 ( -- )
-    0 bytes-read set
-    HEX: 67452301 dup h0 set A set
-    HEX: efcdab89 dup h1 set B set
-    HEX: 98badcfe dup h2 set C set
-    HEX: 10325476 dup h3 set D set
-    HEX: c3d2e1f0 dup h4 set E set
-    [
-        20 HEX: 5a827999 <array> %
-        20 HEX: 6ed9eba1 <array> %
-        20 HEX: 8f1bbcdc <array> %
-        20 HEX: ca62c1d6 <array> %
-    ] { } make K set ;
-
-! W(t) = S^1(W(t-3) XOR W(t-8) XOR W(t-14) XOR W(t-16))
-: sha1-W ( t -- W_t )
-     dup 3 - get-wth
-     over 8 - get-wth bitxor
-     over 14 - get-wth bitxor
-     swap 16 - get-wth bitxor 1 bitroll-32 ;
-
-! f(t;B,C,D) = (B AND C) OR ((NOT B) AND D)         ( 0 <= t <= 19)
-! f(t;B,C,D) = B XOR C XOR D                        (20 <= t <= 39)
-! f(t;B,C,D) = (B AND C) OR (B AND D) OR (C AND D)  (40 <= t <= 59)
-! f(t;B,C,D) = B XOR C XOR D                        (60 <= t <= 79)
-: sha1-f ( B C D t -- f_tbcd )
-    20 /i
-    {   
-        { 0 [ >r over bitnot r> bitand >r bitand r> bitor ] }
-        { 1 [ bitxor bitxor ] }
-        { 2 [ 2dup bitand >r pick bitand >r bitand r> r> bitor bitor ] }
-        { 3 [ bitxor bitxor ] }
-    } case ;
-
-: make-w ( str -- )
-    #! compute w, steps a-b of RFC 3174, section 6.1
-    16 [ nth-int-be w get push ] with each
-    16 80 dup <slice> [ sha1-W w get push ] each ;
-
-: init-letters ( -- )
-    ! step c of RFC 3174, section 6.1
-    h0 get A set
-    h1 get B set
-    h2 get C set
-    h3 get D set
-    h4 get E set ;
-
-: inner-loop ( n -- temp )
-    ! TEMP = S^5(A) + f(t;B,C,D) + E + W(t) + K(t);
-    [
-        [ B get C get D get ] keep sha1-f ,
-        dup get-wth ,
-        K get nth ,
-        A get 5 bitroll-32 ,
-        E get ,
-    ] { } make sum 32 bits ; inline
-
-: set-vars ( temp -- )
-    ! E = D;  D = C;  C = S^30(B);  B = A; A = TEMP;
-    D get E set
-    C get D set
-    B get 30 bitroll-32 C set
-    A get B set
-    A set ;
-
-: calculate-letters ( -- )
-    ! step d of RFC 3174, section 6.1
-    80 [ inner-loop set-vars ] each ;
-
-: update-hs ( -- )
-    ! step e of RFC 3174, section 6.1
-    A h0 update-old-new
-    B h1 update-old-new
-    C h2 update-old-new
-    D h3 update-old-new
-    E h4 update-old-new ;
-
-: (process-sha1-block) ( str -- )
-    80 <vector> w set make-w init-letters calculate-letters update-hs ;
-
-: process-sha1-block ( str -- )
-    dup length [ bytes-read [ + ] change ] keep 64 = [
-        (process-sha1-block)
-    ] [
-        t bytes-read get pad-last-block
-        [ (process-sha1-block) ] each
-    ] if ;
-
-: (stream>sha1) ( -- )
-    64 read [ process-sha1-block ] keep
-    length 64 = [ (stream>sha1) ] when ;
-
-: get-sha1 ( -- str )
-    [ [ h0 h1 h2 h3 h4 ] [ get 4 >be % ] each ] "" make ;
-
-: stream>sha1 ( stream -- sha1 )
-    [ initialize-sha1 (stream>sha1) get-sha1 ] with-stream ;
-
-: byte-array>sha1 ( string -- sha1 )
-    binary <byte-reader> stream>sha1 ;
-
-: byte-array>sha1str ( string -- str )
-    byte-array>sha1 hex-string ;
-
-: byte-array>sha1-bignum ( string -- n )
-    byte-array>sha1 be> ;
-
-: file>sha1 ( file -- sha1 )
-    binary <file-reader> stream>sha1 ;
-
-: byte-array>sha1-interleave ( string -- seq )
-    [ zero? ] left-trim
-    dup length odd? [ 1 tail ] when
-    seq>2seq [ byte-array>sha1 ] bi@
-    2seq>seq ;
diff --git a/extra/crypto/sha2/authors.txt b/extra/crypto/sha2/authors.txt
deleted file mode 100755 (executable)
index 7c1b2f2..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Doug Coleman
diff --git a/extra/crypto/sha2/sha2-tests.factor b/extra/crypto/sha2/sha2-tests.factor
deleted file mode 100755 (executable)
index 8fe655f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-USING: arrays kernel math namespaces sequences tools.test crypto.sha2 ;
-[ "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" ] [ "" byte-array>sha-256-string ] unit-test
-[ "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" ] [ "abc" byte-array>sha-256-string ] unit-test
-[ "f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650" ] [ "message digest" byte-array>sha-256-string ] unit-test
-[ "71c480df93d6ae2f1efad1447c66c9525e316218cf51fc8d9ed832f2daf18b73" ] [ "abcdefghijklmnopqrstuvwxyz" byte-array>sha-256-string ] unit-test
-[ "db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0" ] [ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" byte-array>sha-256-string ] unit-test
-[ "f371bc4a311f2b009eef952dd83ca80e2b60026c8e935592d0f9c308453c813e" ] [ "12345678901234567890123456789012345678901234567890123456789012345678901234567890" byte-array>sha-256-string ] unit-test
diff --git a/extra/crypto/sha2/sha2.factor b/extra/crypto/sha2/sha2.factor
deleted file mode 100755 (executable)
index 0acc5c1..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-USING: crypto.common kernel splitting math sequences namespaces
-io.binary symbols math.bitfields.lib ;
-IN: crypto.sha2
-
-<PRIVATE
-
-SYMBOLS: vars M K H S0 S1 process-M word-size block-size ;
-
-: a 0 ; inline
-: b 1 ; inline
-: c 2 ; inline
-: d 3 ; inline
-: e 4 ; inline
-: f 5 ; inline
-: g 6 ; inline
-: h 7 ; inline
-
-: initial-H-256 ( -- seq )
-    {
-        HEX: 6a09e667 HEX: bb67ae85 HEX: 3c6ef372 HEX: a54ff53a
-        HEX: 510e527f HEX: 9b05688c HEX: 1f83d9ab HEX: 5be0cd19
-    } ;
-
-: K-256 ( -- seq )
-    {
-        HEX: 428a2f98 HEX: 71374491 HEX: b5c0fbcf HEX: e9b5dba5
-        HEX: 3956c25b HEX: 59f111f1 HEX: 923f82a4 HEX: ab1c5ed5
-        HEX: d807aa98 HEX: 12835b01 HEX: 243185be HEX: 550c7dc3
-        HEX: 72be5d74 HEX: 80deb1fe HEX: 9bdc06a7 HEX: c19bf174
-        HEX: e49b69c1 HEX: efbe4786 HEX: 0fc19dc6 HEX: 240ca1cc
-        HEX: 2de92c6f HEX: 4a7484aa HEX: 5cb0a9dc HEX: 76f988da
-        HEX: 983e5152 HEX: a831c66d HEX: b00327c8 HEX: bf597fc7
-        HEX: c6e00bf3 HEX: d5a79147 HEX: 06ca6351 HEX: 14292967
-        HEX: 27b70a85 HEX: 2e1b2138 HEX: 4d2c6dfc HEX: 53380d13
-        HEX: 650a7354 HEX: 766a0abb HEX: 81c2c92e HEX: 92722c85
-        HEX: a2bfe8a1 HEX: a81a664b HEX: c24b8b70 HEX: c76c51a3
-        HEX: d192e819 HEX: d6990624 HEX: f40e3585 HEX: 106aa070
-        HEX: 19a4c116 HEX: 1e376c08 HEX: 2748774c HEX: 34b0bcb5
-        HEX: 391c0cb3 HEX: 4ed8aa4a HEX: 5b9cca4f HEX: 682e6ff3
-        HEX: 748f82ee HEX: 78a5636f HEX: 84c87814 HEX: 8cc70208
-        HEX: 90befffa HEX: a4506ceb HEX: bef9a3f7 HEX: c67178f2
-    } ;
-
-: s0-256 ( x -- x' )
-    [ -7 bitroll-32 ] keep
-    [ -18 bitroll-32 ] keep
-    -3 shift bitxor bitxor ; inline
-
-: s1-256 ( x -- x' )
-    [ -17 bitroll-32 ] keep
-    [ -19 bitroll-32 ] keep
-    -10 shift bitxor bitxor ; inline
-
-: process-M-256 ( seq n -- )
-    [ 16 - swap nth ] 2keep
-    [ 15 - swap nth s0-256 ] 2keep
-    [ 7 - swap nth ] 2keep
-    [ 2 - swap nth s1-256 ] 2keep
-    >r >r + + w+ r> r> swap set-nth ; inline
-
-: prepare-message-schedule ( seq -- w-seq )
-    word-size get group [ be> ] map block-size get 0 pad-right
-    dup 16 64 dup <slice> [
-        process-M-256
-    ] with each ;
-
-: ch ( x y z -- x' )
-    [ bitxor bitand ] keep bitxor ;
-
-: maj ( x y z -- x' )
-    >r [ bitand ] 2keep bitor r> bitand bitor ;
-
-: S0-256 ( x -- x' )
-    [ -2 bitroll-32 ] keep
-    [ -13 bitroll-32 ] keep
-    -22 bitroll-32 bitxor bitxor ; inline
-
-: S1-256 ( x -- x' )
-    [ -6 bitroll-32 ] keep
-    [ -11 bitroll-32 ] keep
-    -25 bitroll-32 bitxor bitxor ; inline
-
-: T1 ( W n -- T1 )
-    [ swap nth ] keep
-    K get nth +
-    e vars get slice3 ch +
-    e vars get nth S1-256 +
-    h vars get nth w+ ;
-
-: T2 ( -- T2 )
-    a vars get nth S0-256
-    a vars get slice3 maj w+ ;
-
-: update-vars ( T1 T2 -- )
-    vars get
-    h g pick exchange
-    g f pick exchange
-    f e pick exchange
-    pick d pick nth w+ e pick set-nth
-    d c pick exchange
-    c b pick exchange
-    b a pick exchange
-    >r w+ a r> set-nth ;
-
-: process-chunk ( M -- )
-    H get clone vars set
-    prepare-message-schedule block-size get [
-        T1 T2 update-vars
-    ] with each vars get H get [ w+ ] 2map H set ;
-
-: seq>byte-array ( n seq -- string )
-    [ swap [ >be % ] curry each ] B{ } make ;
-
-: byte-array>sha2 ( byte-array -- string )
-    t preprocess-plaintext
-    block-size get group [ process-chunk ] each
-    4 H get seq>byte-array ;
-
-PRIVATE>
-
-: byte-array>sha-256 ( string -- string )
-    [
-        K-256 K set
-        initial-H-256 H set
-        4 word-size set
-        64 block-size set
-        byte-array>sha2
-    ] with-scope ;
-
-: byte-array>sha-256-string ( string -- hexstring )
-    byte-array>sha-256 hex-string ;
diff --git a/extra/csv/authors.txt b/extra/csv/authors.txt
new file mode 100644 (file)
index 0000000..0be42b2
--- /dev/null
@@ -0,0 +1 @@
+Phil Dawes
diff --git a/extra/csv/csv-docs.factor b/extra/csv/csv-docs.factor
new file mode 100644 (file)
index 0000000..c9f3990
--- /dev/null
@@ -0,0 +1,21 @@
+USING: help.syntax help.markup kernel prettyprint sequences ;
+IN: csv
+
+HELP: csv
+{ $values { "stream" "a stream" }
+          { "rows" "an array of arrays of fields" } } 
+{ $description "parses a csv stream into an array of row arrays"
+} ;
+
+HELP: csv-row
+{ $values { "stream" "a stream" }
+          { "row" "an array of fields" } } 
+{ $description "parses a row from a csv stream"
+} ;
+
+
+HELP: with-delimiter
+{ $values { "char" "field delimiter (e.g. CHAR: \t)" }
+          { "quot" "a quotation" } }
+{ $description "Sets the field delimiter for csv or csv-row words "
+} ;
diff --git a/extra/csv/csv-tests.factor b/extra/csv/csv-tests.factor
new file mode 100644 (file)
index 0000000..7e96dbc
--- /dev/null
@@ -0,0 +1,70 @@
+USING: io.streams.string csv tools.test shuffle ;
+IN: csv.tests
+
+! I like to name my unit tests
+: named-unit-test ( name output input -- ) 
+  nipd unit-test ; inline
+
+! tests nicked from the wikipedia csv article
+! http://en.wikipedia.org/wiki/Comma-separated_values
+
+"Fields are separated by commas"
+[ { { "1997" "Ford" "E350" } } ] 
+[ "1997,Ford,E350" <string-reader> csv ] named-unit-test
+
+"ignores whitespace before and after elements. n.b.specifically prohibited by RFC 4180, which states, 'Spaces are considered part of a field and should not be ignored.'"
+[ { { "1997" "Ford" "E350" } } ]
+[ "1997,   Ford   , E350" <string-reader> csv ] named-unit-test
+
+"keeps spaces in quotes"
+[ { { "1997" "Ford" "E350" "Super, luxurious truck" } } ]
+[ "1997,Ford,E350,\"Super, luxurious truck\"" <string-reader> csv ] named-unit-test
+
+"double quotes mean escaped in quotes"
+[ { { "1997" "Ford" "E350" "Super \"luxurious\" truck" } } ]
+[ "1997,Ford,E350,\"Super \"\"luxurious\"\" truck\"" 
+  <string-reader> csv ] named-unit-test
+
+"Fields with embedded line breaks must be delimited by double-quote characters."
+[ { { "1997" "Ford" "E350" "Go get one now\nthey are going fast" } } ]
+[ "1997,Ford,E350,\"Go get one now\nthey are going fast\""
+  <string-reader> csv ] named-unit-test
+
+"Fields with leading or trailing spaces must be delimited by double-quote characters. (See comment about leading and trailing spaces above)"
+[ { { "1997" "Ford" "E350" "  Super luxurious truck    " } } ]
+[ "1997,Ford,E350,\"  Super luxurious truck    \""
+  <string-reader> csv ] named-unit-test
+
+"Fields may always be delimited by double-quote characters, whether necessary or not."
+[ { { "1997" "Ford" "E350" } } ]
+[ "\"1997\",\"Ford\",\"E350\"" <string-reader> csv ] named-unit-test
+
+"The first record in a csv file may contain column names in each of the fields."
+[ { { "Year" "Make" "Model" } 
+    { "1997" "Ford" "E350" }
+    { "2000" "Mercury" "Cougar" } } ]
+[ "Year,Make,Model\n1997,Ford,E350\n2000,Mercury,Cougar" 
+   <string-reader> csv ] named-unit-test
+
+
+! !!!!!!!!  other tests
+   
+[ { { "Phil Dawes" } } ] 
+[ "\"Phil Dawes\"" <string-reader> csv ] unit-test
+
+[ { { "1" "2" "3" } { "4" "5" "6" } } ] 
+[ "1,2,3\n4,5,6\n" <string-reader> csv ] unit-test
+
+"trims leading and trailing whitespace - n.b. this isn't really conformant, but lots of csv seems to assume this"
+[ { { "foo yeah" "bah" "baz" } } ] 
+[ "  foo yeah  , bah ,baz\n" <string-reader> csv ] named-unit-test
+
+
+"allows setting of delimiting character"
+[ { { "foo" "bah" "baz" } } ] 
+[ "foo\tbah\tbaz\n" <string-reader> CHAR: \t [ csv ] with-delimiter ] named-unit-test
+
+"Quoted field followed immediately by newline"
+[ { { "foo" "bar" }
+    { "1"   "2" } } ]
+[ "foo,\"bar\"\n1,2" <string-reader> csv ] named-unit-test
diff --git a/extra/csv/csv.factor b/extra/csv/csv.factor
new file mode 100644 (file)
index 0000000..8ba0832
--- /dev/null
@@ -0,0 +1,71 @@
+! Copyright (C) 2007, 2008 Phil Dawes
+! See http://factorcode.org/license.txt for BSD license.
+
+! Simple CSV Parser
+! Phil Dawes phil@phildawes.net
+
+USING: kernel sequences io namespaces combinators unicode.categories vars ;
+IN: csv
+
+DEFER: quoted-field
+
+VAR: delimiter
+
+! trims whitespace from either end of string
+: trim-whitespace ( str -- str )
+  [ blank? ] trim ; inline
+
+: skip-to-field-end ( -- endchar )
+  "\n" delimiter> suffix read-until nip ; inline
+  
+: not-quoted-field ( -- endchar )
+  "\"\n" delimiter> suffix read-until   ! "
+  dup
+  { { CHAR: "     [ drop drop quoted-field ] }  ! " 
+    { delimiter> [ swap trim-whitespace % ] } 
+    { CHAR: \n    [ swap trim-whitespace % ] }    
+    { f           [ swap trim-whitespace % ] }       ! eof
+  } case ;
+  
+: maybe-escaped-quote ( -- endchar )
+  read1 dup 
+  { { CHAR: "    [ , quoted-field ] }  ! " is an escaped quote
+    { delimiter> [ ] }                 ! end of quoted field 
+    { CHAR: \n   [ ] }
+    [ 2drop skip-to-field-end ]       ! end of quoted field + padding
+  } case ;
+  
+: quoted-field ( -- endchar )
+  "\"" read-until                                 ! "
+  drop % maybe-escaped-quote ;
+
+: field ( -- sep string )
+  [ not-quoted-field ] "" make  ; ! trim-whitespace
+
+: (row) ( -- sep )
+  field , 
+  dup delimiter> = [ drop (row) ] when ;
+
+: row ( -- eof? array[string] )
+  [ (row) ] { } make ;
+
+: append-if-row-not-empty ( row -- )
+  dup { "" } = [ drop ] [ , ] if ;
+
+: (csv) ( -- )
+  row append-if-row-not-empty
+  [ (csv) ] when ;
+
+: init-vars ( -- )
+  delimiter> [ CHAR: , >delimiter ] unless ; inline
+  
+: csv-row ( stream -- row )
+  init-vars
+  [ row nip ] with-input-stream ;
+
+: csv ( stream -- rows )
+  init-vars
+  [ [ (csv) ] { } make ] with-input-stream ;
+
+: with-delimiter ( char quot -- )
+  delimiter swap with-variable ; inline
diff --git a/extra/csv/summary.txt b/extra/csv/summary.txt
new file mode 100644 (file)
index 0000000..503cc1b
--- /dev/null
@@ -0,0 +1 @@
+CSV parser
index 9c32f9e32628f2b58f197eabefae9b1fd4be1c13..0d95e3aea7dd20bad168251c80c2253c7b00ebf5 100755 (executable)
@@ -3,3 +3,4 @@ USING: tools.test db kernel ;
 \r
 { 1 0 } [ [ drop ] query-each ] must-infer-as\r
 { 1 1 } [ [ ] query-map ] must-infer-as\r
+{ 2 0 } [ [ ] with-db ] must-infer-as\r
index 82193ed4678c460159785e7555b84491d394de27..237d8698a65ebe9d687f12635ac6ccf830ba3eae 100755 (executable)
@@ -35,7 +35,6 @@ HOOK: db-close db ( handle -- )
         handle>> db-close
     ] with-variable ;
 
-! TUPLE: sql sql in-params out-params ;
 TUPLE: statement handle sql in-params out-params bind-params bound? type ;
 TUPLE: simple-statement < statement ;
 TUPLE: prepared-statement < statement ;
@@ -130,7 +129,8 @@ M: nonthrowable execute-statement* ( statement type -- )
 
 : with-db ( db seq quot -- )
     >r make-db db-open db r>
-    [ db get swap [ drop ] swap compose with-disposal ] curry with-variable ;
+    [ db get swap [ drop ] prepose with-disposal ] curry with-variable ;
+    inline
 
 : default-query ( query -- result-set )
     query-results [ [ sql-row ] query-map ] with-disposal ;
diff --git a/extra/db/pooling/pooling-tests.factor b/extra/db/pooling/pooling-tests.factor
new file mode 100644 (file)
index 0000000..7b0de65
--- /dev/null
@@ -0,0 +1,8 @@
+IN: db.pooling.tests
+USING: db.pooling tools.test ;
+
+\ <pool> must-infer
+
+{ 2 0 } [ [ ] with-db-pool ] must-infer-as
+
+{ 1 0 } [ [ ] with-pooled-connection ] must-infer-as
diff --git a/extra/db/pooling/pooling.factor b/extra/db/pooling/pooling.factor
new file mode 100644 (file)
index 0000000..8382029
--- /dev/null
@@ -0,0 +1,43 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors kernel arrays namespaces sequences continuations
+destructors db ;
+IN: db.pooling
+
+TUPLE: pool db params connections ;
+
+: <pool> ( db params -- pool )
+    V{ } clone pool boa ;
+
+M: pool dispose [ dispose-each f ] change-connections drop ;
+
+: with-db-pool ( db params quot -- )
+    >r <pool> r> [ pool swap with-variable ] curry with-disposal ; inline
+
+TUPLE: return-connection db pool ;
+
+: return-connection ( db pool -- )
+    connections>> push ;
+
+: new-connection ( pool -- )
+    [ [ db>> ] [ params>> ] bi make-db db-open ] keep
+    return-connection ;
+
+: acquire-connection ( pool -- db )
+    [ dup connections>> empty? ] [ dup new-connection ] [ ] while
+    connections>> pop ;
+
+: (with-pooled-connection) ( db pool quot -- )
+    [ >r drop db r> with-variable ]
+    [ drop return-connection ]
+    3bi ; inline
+
+: with-pooled-connection ( pool quot -- )
+    >r [ acquire-connection ] keep r>
+    [ (with-pooled-connection) ] [ ] [ 2drop dispose ] cleanup ; inline
+
+M: return-connection dispose
+    [ db>> ] [ pool>> ] bi return-connection ;
+
+: return-connection-later ( db pool -- )
+    \ return-connection boa add-always-destructor ;
index d270e6f40d8ea6a7a2fa4c67e03f4bfdbac5b179..8b0026b6e5903ba7309c87e6597faca2cf3925e8 100755 (executable)
@@ -69,6 +69,11 @@ M: postgresql-result-null summary ( obj -- str )
 : malloc-byte-array/length
     [ malloc-byte-array dup free-always ] [ length ] bi ;
 
+: default-param-value
+    number>string* dup [
+        utf8 malloc-string dup free-always
+    ] when 0 ;
+
 : param-values ( statement -- seq seq2 )
     [ bind-params>> ] [ in-params>> ] bi
     [
@@ -77,11 +82,11 @@ M: postgresql-result-null summary ( obj -- str )
                 dup [ object>bytes malloc-byte-array/length ] [ 0 ] if
             ] }
             { BLOB [ dup [ malloc-byte-array/length ] [ 0 ] if ] }
-            [
-                drop number>string* dup [
-                    utf8 malloc-string dup free-always
-                ] when 0
-            ]
+            { DATE [ dup [ timestamp>ymd ] when default-param-value ] }
+            { TIME [ dup [ timestamp>hms ] when default-param-value ] }
+            { DATETIME [ dup [ timestamp>ymdhms ] when default-param-value ] }
+            { TIMESTAMP [ dup [ timestamp>ymdhms ] when default-param-value ] }
+            [ drop default-param-value ]
         } case 2array
     ] 2map flip dup empty? [
         drop f f
@@ -149,7 +154,7 @@ M: postgresql-malloc-destructor dispose ( obj -- )
 : postgresql-column-typed ( handle row column type -- obj )
     dup array? [ first ] when
     {
-        { +native-id+ [ pq-get-number ] }
+        { +db-assigned-id+ [ pq-get-number ] }
         { +random-id+ [ pq-get-number ] }
         { INTEGER [ pq-get-number ] }
         { BIG-INTEGER [ pq-get-number ] }
index 687146af11db5d8f7dd4918979cb0af95d322c63..9f747082c65b3ba2f931acb8e8fe1f3717dc23eb 100755 (executable)
@@ -6,6 +6,7 @@ sequences debugger db db.postgresql.lib db.postgresql.ffi
 db.tuples db.types tools.annotations math.ranges
 combinators sequences.lib classes locals words tools.walker
 namespaces.lib accessors random db.queries ;
+USE: tools.walker
 IN: db.postgresql
 
 TUPLE: postgresql-db < db
@@ -48,7 +49,8 @@ M: literal-bind postgresql-bind-conversion ( tuple literal-bind -- obj )
     nip value>> <low-level-binding> ;
 
 M: generator-bind postgresql-bind-conversion ( tuple generate-bind -- obj )
-    nip singleton>> eval-generator <low-level-binding> ;
+    dup generator-singleton>> eval-generator
+    [ swap slot-name>> rot set-slot-named ] [ <low-level-binding> ] bi ;
 
 M: postgresql-statement bind-tuple ( tuple statement -- )
     tuck in-params>>
@@ -158,7 +160,7 @@ M: postgresql-db bind# ( spec obj -- )
 M: postgresql-db create-sql-statement ( class -- seq )
     [
         [ create-table-sql , ] keep
-        dup db-columns find-primary-key native-id?
+        dup db-columns find-primary-key db-assigned-id-spec?
         [ create-function-sql , ] [ drop ] if
     ] { } make ;
 
@@ -179,11 +181,11 @@ M: postgresql-db create-sql-statement ( class -- seq )
 M: postgresql-db drop-sql-statement ( class -- seq )
     [
         [ drop-table-sql , ] keep
-        dup db-columns find-primary-key native-id?
+        dup db-columns find-primary-key db-assigned-id-spec?
         [ drop-function-sql , ] [ drop ] if
     ] { } make ;
 
-M: postgresql-db <insert-native-statement> ( class -- statement )
+M: postgresql-db <insert-db-assigned-statement> ( class -- statement )
     [
         "select add_" 0% 0%
         "(" 0%
@@ -193,7 +195,7 @@ M: postgresql-db <insert-native-statement> ( class -- statement )
         ");" 0%
     ] query-make ;
 
-M: postgresql-db <insert-nonnative-statement> ( class -- statement )
+M: postgresql-db <insert-user-assigned-statement> ( class -- statement )
     [
         "insert into " 0% 0%
         "(" 0%
@@ -204,8 +206,10 @@ M: postgresql-db <insert-nonnative-statement> ( class -- statement )
         [ ", " 0% ] [
             dup type>> +random-id+ = [
                 [
-                    drop bind-name%
-                    f random-id-generator
+                    bind-name%
+                    slot-name>>
+                    f
+                    random-id-generator
                 ] [ type>> ] bi <generator-bind> 1,
             ] [
                 bind%
@@ -219,8 +223,8 @@ M: postgresql-db insert-tuple* ( tuple statement -- )
 
 M: postgresql-db persistent-table ( -- hashtable )
     H{
-        { +native-id+ { "integer" "serial primary key" f } }
-        { +assigned-id+ { f f "primary key" } }
+        { +db-assigned-id+ { "integer" "serial primary key" f } }
+        { +user-assigned-id+ { f f "primary key" } }
         { +random-id+ { "bigint" "bigint primary key" f } }
         { TEXT { "text" "text" f } }
         { VARCHAR { "varchar" "varchar" f } }
index c9fd9a38a4b98eb8fdfe50ced767a7f3adb6e2ee..6dab4f80b8119183edfda59c7a581bfb792039db 100644 (file)
@@ -15,7 +15,7 @@ GENERIC: where ( specs obj -- )
 
 : query-make ( class quot -- )
     >r sql-props r>
-    [ 0 sql-counter rot with-variable ] { "" { } { } } nmake
+    [ 0 sql-counter rot with-variable ";" 0% ] { "" { } { } } nmake
     <simple-statement> maybe-make-retryable ; inline
 
 M: db begin-transaction ( -- ) "BEGIN" sql-command ;
@@ -35,14 +35,6 @@ M: db <update-tuple-statement> ( class -- statement )
         where-primary-key%
     ] query-make ;
 
-M: db <delete-tuple-statement> ( specs table -- sql )
-    [
-        "delete from " 0% 0%
-        " where " 0%
-        find-primary-key
-        dup column-name>> 0% " = " 0% bind%
-    ] query-make ;
-
 M: random-id-generator eval-generator ( singleton -- obj )
     drop
     system-random-generator get [
@@ -52,18 +44,40 @@ M: random-id-generator eval-generator ( singleton -- obj )
 : interval-comparison ( ? str -- str )
     "from" = " >" " <" ? swap [ "= " append ] when ;
 
+: fp-infinity? ( float -- ? )
+    dup float? [
+        double>bits -52 shift 11 2^ 1- [ bitand ] keep =
+    ] [
+        drop f
+    ] if ;
+
+: (infinite-interval?) ( interval -- ?1 ?2 )
+    [ from>> ] [ to>> ] bi
+    [ first fp-infinity? ] bi@ ;
+
+: double-infinite-interval? ( obj -- ? )
+    dup interval? [ (infinite-interval?) and ] [ drop f ] if ;
+
+: infinite-interval? ( obj -- ? )
+    dup interval? [ (infinite-interval?) or ] [ drop f ] if ;
+
 : where-interval ( spec obj from/to -- )
-    pick column-name>> 0%
-    >r first2 r> interval-comparison 0%
-    bind# ;
+    over first fp-infinity? [
+        3drop
+    ] [
+        pick column-name>> 0%
+        >r first2 r> interval-comparison 0%
+        bind#
+    ] if ;
 
 : in-parens ( quot -- )
     "(" 0% call ")" 0% ; inline
 
 M: interval where ( spec obj -- )
     [
-        [ from>> "from" where-interval " and " 0% ]
-        [ to>> "to" where-interval ] 2bi
+        [ from>> "from" where-interval ] [
+            nip infinite-interval? [ " and " 0% ] unless
+        ] [ to>> "to" where-interval ] 2tri
     ] in-parens ;
 
 M: sequence where ( spec obj -- )
@@ -80,12 +94,29 @@ M: integer where ( spec obj -- ) object-where ;
 
 M: string where ( spec obj -- ) object-where ;
 
+: filter-slots ( tuple specs -- specs' )
+    [
+        slot-name>> swap get-slot-named
+        dup double-infinite-interval? [ drop f ] when
+    ] with filter ;
+
 : where-clause ( tuple specs -- )
-    " where " 0% [
-        " and " 0%
+    dupd filter-slots
+    dup empty? [
+        2drop
     ] [
-        2dup slot-name>> swap get-slot-named where
-    ] interleave drop ;
+        " where " 0% [
+            " and " 0%
+        ] [
+            2dup slot-name>> swap get-slot-named where
+        ] interleave drop
+    ] if ;
+
+M: db <delete-tuples-statement> ( tuple table -- sql )
+    [
+        "delete from " 0% 0%
+        where-clause
+    ] query-make ;
 
 M: db <select-by-slots-statement> ( tuple class -- statement )
     [
@@ -94,7 +125,5 @@ M: db <select-by-slots-statement> ( tuple class -- statement )
         [ dup column-name>> 0% 2, ] interleave
 
         " from " 0% 0%
-        dupd
-        [ slot-name>> swap get-slot-named ] with subset
-        dup empty? [ 2drop ] [ where-clause ] if ";" 0%
+        where-clause
     ] query-make ;
index 4561424a9dc21b692579435452acd7a23a7de865..82c6e370bd6dfd4456549be8dcb23d5839e63f2c 100755 (executable)
@@ -1,7 +1,6 @@
-USING: kernel parser quotations classes.tuple words
+USING: kernel parser quotations classes.tuple words math.order
 namespaces.lib namespaces sequences arrays combinators
 prettyprint strings math.parser sequences.lib math symbols ;
-USE: tools.walker
 IN: db.sql
 
 SYMBOLS: insert update delete select distinct columns from as
index 4b5a019fcae5cc032f30eca8c6ba538fb7026651..b443f53e78adf08b15183183280e87702de89575 100755 (executable)
@@ -108,6 +108,7 @@ LIBRARY: sqlite
 FUNCTION: int sqlite3_open ( char* filename, void* ppDb ) ;
 FUNCTION: int sqlite3_close ( sqlite3* pDb ) ;
 FUNCTION: char* sqlite3_errmsg ( sqlite3* pDb ) ;
+FUNCTION: int sqlite3_prepare ( sqlite3* pDb, char* zSql, int nBytes, void* ppStmt, void* pzTail ) ;
 FUNCTION: int sqlite3_prepare_v2 ( sqlite3* pDb, char* zSql, int nBytes, void* ppStmt, void* pzTail ) ;
 FUNCTION: int sqlite3_finalize ( sqlite3_stmt* pStmt ) ;
 FUNCTION: int sqlite3_reset ( sqlite3_stmt* pStmt ) ;
index b6078fc983d99e8ff688d128f38b7fb989ef5930..e92c4bbd8a415506fd6477bcf16a6063fd669956 100755 (executable)
@@ -4,7 +4,7 @@ USING: alien.c-types arrays assocs kernel math math.parser
 namespaces sequences db.sqlite.ffi db combinators
 continuations db.types calendar.format serialize
 io.streams.byte-array byte-arrays io.encodings.binary
-tools.walker io.backend ;
+io.backend ;
 IN: db.sqlite.lib
 
 : sqlite-error ( n -- * )
@@ -97,16 +97,16 @@ IN: db.sqlite.lib
         { TEXT [ sqlite-bind-text-by-name ] }
         { VARCHAR [ sqlite-bind-text-by-name ] }
         { DOUBLE [ sqlite-bind-double-by-name ] }
-        { DATE [ sqlite-bind-text-by-name ] }
-        { TIME [ sqlite-bind-text-by-name ] }
-        { DATETIME [ sqlite-bind-text-by-name ] }
-        { TIMESTAMP [ sqlite-bind-text-by-name ] }
+        { DATE [ timestamp>ymd sqlite-bind-text-by-name ] }
+        { TIME [ timestamp>hms sqlite-bind-text-by-name ] }
+        { DATETIME [ timestamp>ymdhms sqlite-bind-text-by-name ] }
+        { TIMESTAMP [ timestamp>ymdhms sqlite-bind-text-by-name ] }
         { BLOB [ sqlite-bind-blob-by-name ] }
         { FACTOR-BLOB [
             object>bytes
             sqlite-bind-blob-by-name
         ] }
-        { +native-id+ [ sqlite-bind-int-by-name ] }
+        { +db-assigned-id+ [ sqlite-bind-int-by-name ] }
         { +random-id+ [ sqlite-bind-int64-by-name ] }
         { NULL [ sqlite-bind-null-by-name ] }
         [ no-sql-type ]
@@ -132,7 +132,7 @@ IN: db.sqlite.lib
 : sqlite-column-typed ( handle index type -- obj )
     dup array? [ first ] when
     {
-        { +native-id+ [ sqlite3_column_int64  ] }
+        { +db-assigned-id+ [ sqlite3_column_int64  ] }
         { +random-id+ [ sqlite3-column-uint64 ] }
         { INTEGER [ sqlite3_column_int ] }
         { BIG-INTEGER [ sqlite3_column_int64 ] }
index 2175b69f35411b7eee2530a994a962502330aebf..4aaa9668f0f1b4e5367b9b71fbb9e617625c8d7d 100755 (executable)
@@ -79,8 +79,10 @@ M: literal-bind sqlite-bind-conversion ( tuple literal-bind -- array )
     <sqlite-low-level-binding> ;
 
 M: generator-bind sqlite-bind-conversion ( tuple generate-bind -- array )
-    nip [ key>> ] [ singleton>> eval-generator ] [ type>> ] tri
-    <sqlite-low-level-binding> ;
+    tuck
+    [ generator-singleton>> eval-generator tuck ] [ slot-name>> ] bi
+    rot set-slot-named
+    >r [ key>> ] [ type>> ] bi r> swap <sqlite-low-level-binding> ;
 
 M: sqlite-statement bind-tuple ( tuple statement -- )
     [
@@ -124,24 +126,25 @@ M: sqlite-db create-sql-statement ( class -- statement )
             dup type>> lookup-create-type 0%
             modifiers 0%
         ] interleave ");" 0%
-    ] query-make dup sql>> . ;
+    ] query-make ;
 
 M: sqlite-db drop-sql-statement ( class -- statement )
     [ "drop table " 0% 0% ";" 0% drop ] query-make ;
 
-M: sqlite-db <insert-native-statement> ( tuple -- statement )
+M: sqlite-db <insert-db-assigned-statement> ( tuple -- statement )
     [
         "insert into " 0% 0%
         "(" 0%
-        maybe-remove-id
+        remove-db-assigned-id
         dup [ ", " 0% ] [ column-name>> 0% ] interleave
         ") values(" 0%
         [ ", " 0% ] [
             dup type>> +random-id+ = [
+                [ slot-name>> ]
                 [
                     column-name>> ":" prepend dup 0%
                     random-id-generator
-                ] [ type>> ] bi <generator-bind> 1,
+                ] [ type>> ] tri <generator-bind> 1,
             ] [
                 bind%
             ] if
@@ -149,8 +152,8 @@ M: sqlite-db <insert-native-statement> ( tuple -- statement )
         ");" 0%
     ] query-make ;
 
-M: sqlite-db <insert-nonnative-statement> ( tuple -- statement )
-    <insert-native-statement> ;
+M: sqlite-db <insert-user-assigned-statement> ( tuple -- statement )
+    <insert-db-assigned-statement> ;
 
 M: sqlite-db bind# ( spec obj -- )
     >r
@@ -163,9 +166,9 @@ M: sqlite-db bind% ( spec -- )
 
 M: sqlite-db persistent-table ( -- assoc )
     H{
-        { +native-id+ { "integer primary key" "integer primary key" f } }
-        { +assigned-id+ { f f "primary key" } }
-        { +random-id+ { "integer primary key" "integer primary key" f } }
+        { +db-assigned-id+ { "integer primary key" "integer primary key" "primary key" } }
+        { +user-assigned-id+ { f f "primary key" } }
+        { +random-id+ { "integer primary key" "integer primary key" "primary key" } }
         { INTEGER { "integer" "integer" "primary key" } }
         { BIG-INTEGER { "bigint" "bigint" } }
         { SIGNED-BIG-INTEGER { "bigint" "bigint" } }
index 1c900edc689252c69c5370f3da7f2b7908bd5e47..4da82d92d6a1167b75c3cce2a51e35af2480aa5c 100755 (executable)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io.files kernel tools.test db db.tuples classes
 db.types continuations namespaces math math.ranges
-prettyprint tools.walker calendar sequences db.sqlite
-math.intervals db.postgresql accessors random math.bitfields.lib ;
+prettyprint calendar sequences db.sqlite math.intervals
+db.postgresql accessors random math.bitfields.lib ;
 IN: db.tuples.tests
 
 TUPLE: person the-id the-name the-number the-real
@@ -21,7 +21,7 @@ ts date time blob factor-blob ;
         set-person-factor-blob
     } person construct ;
 
-: <assigned-person> ( id name age real ts date time blob factor-blob -- person )
+: <user-assigned-person> ( id name age real ts date time blob factor-blob -- person )
     <person> [ set-person-the-id ] keep ;
 
 SYMBOL: person1
@@ -30,6 +30,7 @@ SYMBOL: person3
 SYMBOL: person4
 
 : test-tuples ( -- )
+    [ ] [ person recreate-table ] unit-test
     [ ] [ person ensure-table ] unit-test
     [ ] [ person drop-table ] unit-test
     [ ] [ person create-table ] unit-test
@@ -40,7 +41,7 @@ SYMBOL: person4
 
     [ 1 ] [ person1 get person-the-id ] unit-test
 
-    200 person1 get set-person-the-number
+    [ ] [ 200 person1 get set-person-the-number ] unit-test
 
     [ ] [ person1 get update-tuple ] unit-test
 
@@ -67,7 +68,7 @@ SYMBOL: person4
     ] [ T{ person f f f 10 3.14 } select-tuples ] unit-test
 
 
-    [ ] [ person1 get delete-tuple ] unit-test
+    [ ] [ person1 get delete-tuples ] unit-test
     [ f ] [ T{ person f 1 } select-tuple ] unit-test
 
     [ ] [ person3 get insert-tuple ] unit-test
@@ -80,9 +81,9 @@ SYMBOL: person4
             "teddy"
             10
             3.14
-            T{ timestamp f 2008 3 5 16 24 11 0 }
-            T{ timestamp f 2008 11 22 f f f f }
-            T{ timestamp f f f f 12 34 56 f }
+            T{ timestamp f 2008 3 5 16 24 11 T{ duration f 0 0 0 0 0 0 } }
+            T{ timestamp f 2008 11 22 f f f T{ duration f 0 0 0 0 0 0 } }
+            T{ timestamp f f f f 12 34 56 T{ duration f 0 0 0 0 0 0 } }
             B{ 115 116 111 114 101 105 110 97 98 108 111 98 }
         }
     ] [ T{ person f 3 } select-tuple ] unit-test
@@ -96,9 +97,9 @@ SYMBOL: person4
             "eddie"
             10
             3.14
-            T{ timestamp f 2008 3 5 16 24 11 0 }
-            T{ timestamp f 2008 11 22 f f f f }
-            T{ timestamp f f f f 12 34 56 f }
+            T{ timestamp f 2008 3 5 16 24 11 T{ duration f 0 0 0 0 0 0 } }
+            T{ timestamp f 2008 11 22 f f f T{ duration f 0 0 0 0 0 0 } }
+            T{ timestamp f f f f 12 34 56 T{ duration f 0 0 0 0 0 0 } }
             f
             H{ { 1 2 } { 3 4 } { 5 "lol" } }
         }
@@ -106,10 +107,10 @@ SYMBOL: person4
 
     [ ] [ person drop-table ] unit-test ;
 
-: native-person-schema ( -- )
+: db-assigned-person-schema ( -- )
     person "PERSON"
     {
-        { "the-id" "ID" +native-id+ }
+        { "the-id" "ID" +db-assigned-id+ }
         { "the-name" "NAME" { VARCHAR 256 } +not-null+ }
         { "the-number" "AGE" INTEGER { +default+ 0 } }
         { "the-real" "REAL" DOUBLE { +default+ 0.3 } }
@@ -121,13 +122,21 @@ SYMBOL: person4
     } define-persistent
     "billy" 10 3.14 f f f f f <person> person1 set
     "johnny" 10 3.14 f f f f f <person> person2 set
-    "teddy" 10 3.14 "2008-03-05 16:24:11" "2008-11-22" "12:34:56" B{ 115 116 111 114 101 105 110 97 98 108 111 98 } f <person> person3 set
-    "eddie" 10 3.14 "2008-03-05 16:24:11" "2008-11-22" "12:34:56" f H{ { 1 2 } { 3 4 } { 5 "lol" } } <person> person4 set ;
-
-: assigned-person-schema ( -- )
+    "teddy" 10 3.14
+        T{ timestamp f 2008 3 5 16 24 11 T{ duration f 0 0 0 0 0 0 } }
+        T{ timestamp f 2008 11 22 0 0 0 T{ duration f 0 0 0 0 0 0 } }
+        T{ timestamp f f f f 12 34 56 T{ duration f 0 0 0 0 0 0 } }
+        B{ 115 116 111 114 101 105 110 97 98 108 111 98 } f <person> person3 set
+    "eddie" 10 3.14
+        T{ timestamp f 2008 3 5 16 24 11 T{ duration f 0 0 0 0 0 0 } }
+        T{ timestamp f 2008 11 22 0 0 0 T{ duration f 0 0 0 0 0 0 } }
+        T{ timestamp f f f f 12 34 56 T{ duration f 0 0 0 0 0 0 } }
+        f H{ { 1 2 } { 3 4 } { 5 "lol" } } <person> person4 set ;
+
+: user-assigned-person-schema ( -- )
     person "PERSON"
     {
-        { "the-id" "ID" INTEGER +assigned-id+ }
+        { "the-id" "ID" INTEGER +user-assigned-id+ }
         { "the-name" "NAME" { VARCHAR 256 } +not-null+ }
         { "the-number" "AGE" INTEGER { +default+ 0 } }
         { "the-real" "REAL" DOUBLE { +default+ 0.3 } }
@@ -137,18 +146,27 @@ SYMBOL: person4
         { "blob" "B" BLOB }
         { "factor-blob" "FB" FACTOR-BLOB }
     } define-persistent
-    1 "billy" 10 3.14 f f f f f <assigned-person> person1 set
-    2 "johnny" 10 3.14 f f f f f <assigned-person> person2 set
-    3 "teddy" 10 3.14 "2008-03-05 16:24:11" "2008-11-22" "12:34:56" B{ 115 116 111 114 101 105 110 97 98 108 111 98 } f <assigned-person> person3 set
-    4 "eddie" 10 3.14 "2008-03-05 16:24:11" "2008-11-22" "12:34:56" f H{ { 1 2 } { 3 4 } { 5 "lol" } } <assigned-person> person4 set ;
+    1 "billy" 10 3.14 f f f f f <user-assigned-person> person1 set
+    2 "johnny" 10 3.14 f f f f f <user-assigned-person> person2 set
+    3 "teddy" 10 3.14
+        T{ timestamp f 2008 3 5 16 24 11 T{ duration f 0 0 0 0 0 0 } }
+        T{ timestamp f 2008 11 22 0 0 0 T{ duration f 0 0 0 0 0 0 } }
+        T{ timestamp f f f f 12 34 56 T{ duration f 0 0 0 0 0 0 } }
+        B{ 115 116 111 114 101 105 110 97 98 108 111 98 }
+        f <user-assigned-person> person3 set
+    4 "eddie" 10 3.14
+        T{ timestamp f 2008 3 5 16 24 11 T{ duration f 0 0 0 0 0 0 } }
+        T{ timestamp f 2008 11 22 0 0 0 T{ duration f 0 0 0 0 0 0 } }
+        T{ timestamp f f f f 12 34 56 T{ duration f 0 0 0 0 0 0 } }
+        f H{ { 1 2 } { 3 4 } { 5 "lol" } } <user-assigned-person> person4 set ;
 
 TUPLE: paste n summary author channel mode contents timestamp annotations ;
 TUPLE: annotation n paste-id summary author mode contents ;
 
-: native-paste-schema ( -- )
+: db-assigned-paste-schema ( -- )
     paste "PASTE"
     {
-        { "n" "ID" +native-id+ }
+        { "n" "ID" +db-assigned-id+ }
         { "summary" "SUMMARY" TEXT }
         { "author" "AUTHOR" TEXT }
         { "channel" "CHANNEL" TEXT }
@@ -160,7 +178,7 @@ TUPLE: annotation n paste-id summary author mode contents ;
 
     annotation "ANNOTATION"
     {
-        { "n" "ID" +native-id+ }
+        { "n" "ID" +db-assigned-id+ }
         { "paste-id" "PASTE_ID" INTEGER { +foreign-id+ paste "n" } }
         { "summary" "SUMMARY" TEXT }
         { "author" "AUTHOR" TEXT }
@@ -193,7 +211,7 @@ TUPLE: serialize-me id data ;
 : test-serialize ( -- )
     serialize-me "SERIALIZED"
     {
-        { "id" "ID" +native-id+ }
+        { "id" "ID" +db-assigned-id+ }
         { "data" "DATA" FACTOR-BLOB }
     } define-persistent
     [ serialize-me drop-table ] [ drop ] recover
@@ -209,7 +227,7 @@ TUPLE: exam id name score ;
 : test-intervals ( -- )
     exam "EXAM"
     {
-        { "id" "ID" +native-id+ }
+        { "id" "ID" +db-assigned-id+ }
         { "name" "NAME" TEXT }
         { "score" "SCORE" INTEGER }
     } define-persistent
@@ -275,6 +293,46 @@ TUPLE: exam id name score ;
         }
     ] [
         T{ exam f T{ range f 1 3 1 } } select-tuples
+    ] unit-test
+
+    [
+        {
+            T{ exam f 2 "Stan" 80 }
+            T{ exam f 3 "Kenny" 60 }
+            T{ exam f 4 "Cartman" 41 }
+        }
+    ] [
+        T{ exam f T{ interval f { 2 t } { 1.0/0.0 f } } } select-tuples
+    ] unit-test
+
+    [
+        {
+            T{ exam f 1 "Kyle" 100 }
+        }
+    ] [
+        T{ exam f T{ interval f { -1.0/0.0 t } { 2 f } } } select-tuples
+    ] unit-test
+
+    [
+        {
+            T{ exam f 1 "Kyle" 100 }
+            T{ exam f 2 "Stan" 80 }
+            T{ exam f 3 "Kenny" 60 }
+            T{ exam f 4 "Cartman" 41 }
+        }
+    ] [
+        T{ exam f T{ interval f { -1.0/0.0 t } { 1/0. f } } } select-tuples
+    ] unit-test
+    
+    [
+        {
+            T{ exam f 1 "Kyle" 100 }
+            T{ exam f 2 "Stan" 80 }
+            T{ exam f 3 "Kenny" 60 }
+            T{ exam f 4 "Cartman" 41 }
+        }
+    ] [
+        T{ exam } select-tuples
     ] unit-test ;
 
 TUPLE: bignum-test id m n o ;
@@ -287,7 +345,7 @@ TUPLE: bignum-test id m n o ;
 : test-bignum
     bignum-test "BIGNUM_TEST"
     {
-        { "id" "ID" +native-id+ }
+        { "id" "ID" +db-assigned-id+ }
         { "m" "M" BIG-INTEGER }
         { "n" "N" UNSIGNED-BIG-INTEGER }
         { "o" "O" SIGNED-BIG-INTEGER }
@@ -311,9 +369,9 @@ C: <secret> secret
         { "message" "MESSAGE" TEXT }
     } define-persistent
 
-    [ ] [ secret ensure-table ] unit-test
+    [ ] [ secret recreate-table ] unit-test
 
-    [ ] [ f "kilroy was here" <secret> insert-tuple ] unit-test
+    [ t ] [ f "kilroy was here" <secret> [ insert-tuple ] keep n>> integer? ] unit-test
 
     [ ] [ f "kilroy was here2" <secret> insert-tuple ] unit-test
 
@@ -328,17 +386,17 @@ C: <secret> secret
         T{ secret } select-tuples length 3 =
     ] unit-test ;
 
-[ native-person-schema test-tuples ] test-sqlite
-[ assigned-person-schema test-tuples ] test-sqlite
-[ assigned-person-schema test-repeated-insert ] test-sqlite
+[ db-assigned-person-schema test-tuples ] test-sqlite
+[ user-assigned-person-schema test-tuples ] test-sqlite
+[ user-assigned-person-schema test-repeated-insert ] test-sqlite
 [ test-bignum ] test-sqlite
 [ test-serialize ] test-sqlite
 [ test-intervals ] test-sqlite
 [ test-random-id ] test-sqlite
 
-[ native-person-schema test-tuples ] test-postgresql
-[ assigned-person-schema test-tuples ] test-postgresql
-[ assigned-person-schema test-repeated-insert ] test-postgresql
+[ db-assigned-person-schema test-tuples ] test-postgresql
+[ user-assigned-person-schema test-tuples ] test-postgresql
+[ user-assigned-person-schema test-repeated-insert ] test-postgresql
 [ test-bignum ] test-postgresql
 [ test-serialize ] test-postgresql
 [ test-intervals ] test-postgresql
@@ -360,6 +418,9 @@ TUPLE: does-not-persist ;
 \ bind-tuple must-infer
 \ insert-tuple must-infer
 \ update-tuple must-infer
-\ delete-tuple must-infer
+\ delete-tuples must-infer
 \ select-tuple must-infer
 \ define-persistent must-infer
+\ ensure-table must-infer
+\ create-table must-infer
+\ drop-table must-infer
index fd4cfb906f1cb0b578e493ddc13efe50b707ae7e..5747fa7de798fbefad1c34d1aab919f0efc0b05e 100755 (executable)
@@ -3,7 +3,7 @@
 USING: arrays assocs classes db kernel namespaces
 classes.tuple words sequences slots math accessors
 math.parser io prettyprint db.types continuations
-mirrors sequences.lib tools.walker combinators.lib ;
+mirrors sequences.lib combinators.lib ;
 IN: db.tuples
 
 : define-persistent ( class table columns -- )
@@ -37,15 +37,10 @@ SYMBOL: sql-counter
 HOOK: create-sql-statement db ( class -- obj )
 HOOK: drop-sql-statement db ( class -- obj )
 
-HOOK: <insert-native-statement> db ( class -- obj )
-HOOK: <insert-nonnative-statement> db ( class -- obj )
-
+HOOK: <insert-db-assigned-statement> db ( class -- obj )
+HOOK: <insert-user-assigned-statement> db ( class -- obj )
 HOOK: <update-tuple-statement> db ( class -- obj )
-HOOK: <update-tuples-statement> db ( class -- obj )
-
-HOOK: <delete-tuple-statement> db ( class -- obj )
-HOOK: <delete-tuples-statement> db ( class -- obj )
-
+HOOK: <delete-tuples-statement> db ( tuple class -- obj )
 HOOK: <select-by-slots-statement> db ( tuple class -- tuple )
 
 HOOK: insert-tuple* db ( tuple statement -- )
@@ -65,7 +60,7 @@ SINGLETON: retryable
     [ bind-params>> ] [ in-params>> ] bi
     [
         dup generator-bind? [
-            singleton>> eval-generator >>value
+            generator-singleton>> eval-generator >>value
         ] [
             drop
         ] if
@@ -105,7 +100,7 @@ M: retryable execute-statement* ( statement type -- )
         [ with-disposal ] curry each
     ] [
         with-disposal
-    ] if ;
+    ] if ; inline
 
 : create-table ( class -- )
     create-sql-statement [ execute-statement ] with-disposals ;
@@ -113,35 +108,38 @@ M: retryable execute-statement* ( statement type -- )
 : drop-table ( class -- )
     drop-sql-statement [ execute-statement ] with-disposals ;
 
-: ensure-table ( class -- )
+: recreate-table ( class -- )
     [
         drop-sql-statement make-nonthrowable
         [ execute-statement ] with-disposals
     ] [ create-table ] bi ;
 
-: insert-native ( tuple -- )
+: ensure-table ( class -- )
+    [ create-table ] curry ignore-errors ;
+
+: insert-db-assigned-statement ( tuple -- )
     dup class
-    db get db-insert-statements [ <insert-native-statement> ] cache
+    db get db-insert-statements [ <insert-db-assigned-statement> ] cache
     [ bind-tuple ] 2keep insert-tuple* ;
 
-: insert-nonnative ( tuple -- )
+: insert-user-assigned-statement ( tuple -- )
     dup class
-    db get db-insert-statements [ <insert-nonnative-statement> ] cache
+    db get db-insert-statements [ <insert-user-assigned-statement> ] cache
     [ bind-tuple ] keep execute-statement ;
 
 : insert-tuple ( tuple -- )
-    dup class db-columns find-primary-key nonnative-id?
-    [ insert-nonnative ] [ insert-native ] if ;
+    dup class db-columns find-primary-key db-assigned-id-spec?
+    [ insert-db-assigned-statement ] [ insert-user-assigned-statement ] if ;
 
 : update-tuple ( tuple -- )
     dup class
     db get db-update-statements [ <update-tuple-statement> ] cache
     [ bind-tuple ] keep execute-statement ;
 
-: delete-tuple ( tuple -- )
-    dup class
-    db get db-delete-statements [ <delete-tuple-statement> ] cache
-    [ bind-tuple ] keep execute-statement ;
+: delete-tuples ( tuple -- )
+    dup dup class <delete-tuples-statement> [
+        [ bind-tuple ] keep execute-statement
+    ] with-disposal ;
 
 : select-tuples ( tuple -- tuples )
     dup dup class <select-by-slots-statement> [
index 110a8a388aa525ebecd81bbb877875c3d43b6e38..8dbf6786bc197fc9fa45ae7df191921f0baa5152 100755 (executable)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays assocs db kernel math math.parser
 sequences continuations sequences.deep sequences.lib
-words namespaces tools.walker slots slots.private classes
-mirrors classes.tuple combinators calendar.format symbols
+words namespaces slots slots.private classes mirrors
+classes.tuple combinators calendar.format symbols
 classes.singleton accessors quotations random ;
 IN: db.types
 
@@ -15,18 +15,17 @@ TUPLE: sql-spec class slot-name column-name type primary-key modifiers ;
 TUPLE: literal-bind key type value ;
 C: <literal-bind> literal-bind
 
-TUPLE: generator-bind key singleton type ;
+TUPLE: generator-bind slot-name key generator-singleton type ;
 C: <generator-bind> generator-bind
 SINGLETON: random-id-generator
 
 TUPLE: low-level-binding value ;
 C: <low-level-binding> low-level-binding
 
-SINGLETON: +native-id+
-SINGLETON: +assigned-id+
+SINGLETON: +db-assigned-id+
+SINGLETON: +user-assigned-id+
 SINGLETON: +random-id+
-UNION: +primary-key+ +native-id+ +assigned-id+ +random-id+ ;
-UNION: +nonnative-id+ +random-id+ +assigned-id+ ;
+UNION: +primary-key+ +db-assigned-id+ +user-assigned-id+ +random-id+ ;
 
 SYMBOLS: +autoincrement+ +serial+ +unique+ +default+ +null+ +not-null+
 +foreign-id+ +has-many+ ;
@@ -43,11 +42,11 @@ SYMBOLS: +autoincrement+ +serial+ +unique+ +default+ +null+ +not-null+
 : primary-key? ( spec -- ? )
     primary-key>> +primary-key+? ;
 
-: native-id? ( spec -- ? )
-    primary-key>> +native-id+? ;
+: db-assigned-id-spec? ( spec -- ? )
+    primary-key>> +db-assigned-id+? ;
 
-: nonnative-id? ( spec -- ? )
-    primary-key>> +nonnative-id+? ;
+: assigned-id-spec? ( spec -- ? )
+    primary-key>> +user-assigned-id+? ;
 
 : normalize-spec ( spec -- )
     dup type>> dup +primary-key+? [
@@ -82,14 +81,14 @@ FACTOR-BLOB NULL ;
 : number>string* ( n/str -- str )
     dup number? [ number>string ] when ;
 
-: maybe-remove-id ( specs -- obj )
-    [ +native-id+? not ] subset ;
+: remove-db-assigned-id ( specs -- obj )
+    [ +db-assigned-id+? not ] filter ;
 
 : remove-relations ( specs -- newcolumns )
-    [ relation? not ] subset ;
+    [ relation? not ] filter ;
 
 : remove-id ( specs -- obj )
-    [ primary-key>> not ] subset ;
+    [ primary-key>> not ] filter ;
 
 ! SQLite Types: http://www.sqlite.org/datatype3.html
 ! NULL INTEGER REAL TEXT BLOB
@@ -152,7 +151,7 @@ HOOK: bind# db ( spec obj -- )
     tuck offset-of-slot set-slot ;
 
 : tuple>filled-slots ( tuple -- alist )
-    <mirror> [ nip ] assoc-subset ;
+    <mirror> [ nip ] assoc-filter ;
 
 : tuple>params ( specs tuple -- obj )
     [
index f123c3a8023628789b8600d3c2f3b011a595e0ce..e6a2ad7bf4c347fa5bd13d01d95208985aa5c5a4 100644 (file)
@@ -24,30 +24,17 @@ HELP: CONSULT:
 
 { define-consult POSTPONE: CONSULT: } related-words
 
-HELP: define-mimic
-{ $values { "group" "a protocol, generic word or tuple class" } { "mimicker" "a class" } { "mimicked" "a class" } }
-{ $description "For the generic words in the group, the given mimicker copies the methods of the mimicked. This only works for the methods that have already been defined when the word is called." }
-{ $notes "Usually, " { $link POSTPONE: MIMIC: } " should be used instead. This is only for runtime use." } ;
-
-HELP: MIMIC:
-{ $syntax "MIMIC: group mimicker mimicked" }
-{ $values { "group" "a protocol, generic word or tuple class" } { "mimicker" "a class" } { "mimicked" "a class" } }
-{ $description "For the generic words in the group, the given mimicker copies the methods of the mimicked. This only works for the methods that have already been defined when the syntax is used. Mimicking overwrites existing methods." } ;
-
 HELP: group-words
 { $values { "group" "a group" } { "words" "an array of words" } }
-{ $description "Given a protocol, generic word or tuple class, this returns the corresponding generic words that this group contains." } ;
+{ $description "Given a protocol or tuple class, this returns the corresponding generic words that this group contains." } ;
 
 ARTICLE: { "delegate" "intro" } "Delegation module"
-"This vocabulary defines methods for consultation and mimicry, independent of the current Factor object system; it is a replacement for Factor's builtin delegation system. Fundamental to the concept of generic word groups, which can be specific protocols, generic words or tuple slot accessors. Fundamentally, a group is a word which has a method for " { $link group-words } ". To define a group as a set of words, use"
+"This vocabulary defines methods for consultation and mimicry, independent of the current Factor object system; it is a replacement for Factor's builtin delegation system. Fundamental to the concept of generic word groups, which can be specific protocols, generic words or tuple slot accessors. Fundamentally, a group is a word which has a method for " { $link group-words } ". One type of group is a tuple, which consists of the slot words. To define a group as a set of words, use"
 { $subsection POSTPONE: PROTOCOL: }
 { $subsection define-protocol }
 "One method of object extension which this vocabulary defines is consultation. This is slightly different from the current Factor concept of delegation, in that instead of delegating for all generic words not implemented, only generic words included in a specific group are consulted. Additionally, instead of using a single hard-coded delegate slot, you can specify any quotation to execute in order to retrieve who to consult. The literal syntax and defining word are"
 { $subsection POSTPONE: CONSULT: }
-{ $subsection define-consult }
-"Another object extension mechanism is mimicry. This is the copying of methods in a group from one class to another. For certain applications, this is more appropriate than delegation, as it avoids the slicing problem. It is inappropriate for tuple slots, however. The literal syntax and defining word are"
-{ $subsection POSTPONE: MIMIC: }
-{ $subsection define-mimic } ;
+{ $subsection define-consult } ;
 
 IN: delegate
 ABOUT: { "delegate" "intro" }
index 5e0abcd5ba5fa58da1948df4b19f69a543513853..6aa015a74da14ccc4a9fe6807c01c0cd94e5e438 100644 (file)
@@ -2,11 +2,6 @@ USING: delegate kernel arrays tools.test words math definitions
 compiler.units parser generic prettyprint io.streams.string ;
 IN: delegate.tests
 
-DEFER: example
-[ 1 ] [ \ example 1 "prop" set-word-prop \ example "prop" word-prop ] unit-test
-[ ] [ \ example "prop" [ 1+ ] change-word-prop ] unit-test
-[ 2 ] [ \ example "prop" word-prop ] unit-test
-
 TUPLE: hello this that ;
 C: <hello> hello
 
@@ -30,21 +25,19 @@ GENERIC: bing ( c -- d )
 PROTOCOL: bee bing ;
 CONSULT: hello goodbye goodbye-those ;
 M: hello bing hello-test ;
-MIMIC: bee goodbye hello
 
 [ 1 { t 1 0 } ] [ 1 0 <hello> [ foo ] [ bar ] bi ] unit-test
 [ { t 1 0 } ] [ 1 0 <hello> bing ] unit-test
 [ 1 ] [ 1 0 <hello> f <goodbye> foo ] unit-test
 [ { t 1 0 } ] [ 1 0 <hello> f <goodbye> bar ] unit-test
-! [ { f 1 0 } ] [ f 1 0 <hello> <goodbye> bing ] unit-test
 [ 3 ] [ 1 0 <hello> 2 whoa ] unit-test
 [ 3 ] [ 1 0 <hello> f <goodbye> 2 whoa ] unit-test
 
 [ ] [ 10 [ "USE: delegate IN: delegate.tests CONSULT: baz goodbye goodbye-these ;" eval ] times ] unit-test
-[ V{ goodbye } ] [ baz protocol-users ] unit-test
+[ H{ { goodbye [ goodbye-these ] } } ] [ baz protocol-consult ] unit-test
+[ H{ } ] [ bee protocol-consult ] unit-test
 
-! [ "USING: delegate ;\nIN: delegate.tests\nPROTOCOL: baz foo bar { whoa 1 } ;\n" ]
-! [ [ baz see ] with-string-writer ] unit-test
+[ "USING: delegate ;\nIN: delegate.tests\nPROTOCOL: baz foo bar { whoa 1 } ;\n" ] [ [ baz see ] with-string-writer ] unit-test
 
 ! [ ] [ [ baz forget ] with-compilation-unit ] unit-test
 ! [ f ] [ goodbye baz method ] unit-test
index 506d7175b651d9b5e54d3b3e475943126d1582a0..39eccfd194d25fc6669a1a572b6541f206c83e8c 100755 (executable)
@@ -1,9 +1,44 @@
 ! Copyright (C) 2007 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
 USING: parser generic kernel classes words slots assocs sequences arrays
-vectors definitions prettyprint combinators.lib math sets ;
+vectors definitions prettyprint combinators.lib math hashtables sets ;
 IN: delegate
 
+: protocol-words ( protocol -- words )
+    \ protocol-words word-prop ;
+
+: protocol-consult ( protocol -- consulters )
+    \ protocol-consult word-prop ;
+
+GENERIC: group-words ( group -- words )
+
+M: tuple-class group-words
+    "slot-names" word-prop [
+        [ reader-word ] [ writer-word ] bi
+        2array [ 0 2array ] map
+    ] map concat ;
+
+! Consultation
+
+: consult-method ( word class quot -- )
+    [ drop swap first create-method ]
+    [ nip swap first2 swapd [ ndip ] 2curry swap suffix ] 3bi define ;
+
+: change-word-prop ( word prop quot -- )
+    rot word-props swap change-at ; inline
+
+: register-protocol ( group class quot -- )
+    rot \ protocol-consult [ swapd ?set-at ] change-word-prop ;
+
+: define-consult ( group class quot -- )
+    [ register-protocol ] [
+        rot group-words -rot
+        [ consult-method ] 2curry each
+    ] 3bi ;
+
+: CONSULT:
+    scan-word scan-word parse-definition define-consult ; parsing
+
 ! Protocols
 
 : cross-2each ( seq1 seq2 quot -- )
@@ -12,36 +47,46 @@ IN: delegate
 : forget-all-methods ( classes words -- )
     [ 2array forget ] cross-2each ;
 
-: protocol-words ( protocol -- words )
-    "protocol-words" word-prop ;
-
 : protocol-users ( protocol -- users )
-    "protocol-users" word-prop ;
+    protocol-consult keys ;
 
-: users-and-words ( protocol -- users words )
-    [ protocol-users ] [ protocol-words ] bi ;
+: lost-words ( protocol wordlist -- lost-words )
+    >r protocol-words r> diff ;
 
 : forget-old-definitions ( protocol new-wordlist -- )
-    >r users-and-words r>
-    diff forget-all-methods ;
+    >r [ protocol-users ] [ protocol-words ] bi r>
+    swap diff forget-all-methods ;
 
-: define-protocol ( protocol wordlist -- )
-    ! 2dup forget-old-definitions
-    { } like "protocol-words" set-word-prop ;
+: added-words ( protocol wordlist -- added-words )
+    swap protocol-words swap diff ;
+
+: add-new-definitions ( protocol wordlist -- )
+     dupd added-words >r protocol-consult >alist r>
+     [ first2 consult-method ] cross-2each ;
+
+: initialize-protocol-props ( protocol wordlist -- )
+    [ drop H{ } clone \ protocol-consult set-word-prop ]
+    [ { } like \ protocol-words set-word-prop ] 2bi ;
 
 : fill-in-depth ( wordlist -- wordlist' )
     [ dup word? [ 0 2array ] when ] map ;
 
+: define-protocol ( protocol wordlist -- )
+    fill-in-depth
+    [ forget-old-definitions ]
+    [ add-new-definitions ]
+    [ initialize-protocol-props ] 2tri ;
+
 : PROTOCOL:
     CREATE-WORD
-    dup define-symbol
-    dup f "inline" set-word-prop
-    parse-definition fill-in-depth define-protocol ; parsing
+    [ define-symbol ]
+    [ f "inline" set-word-prop ]
+    [ parse-definition define-protocol ] tri ; parsing
 
 PREDICATE: protocol < word protocol-words ; ! Subclass of symbol?
 
 M: protocol forget*
-    [ users-and-words forget-all-methods ] [ call-next-method ] bi ;
+    [ f forget-old-definitions ] [ call-next-method ] bi ;
 
 : show-words ( wordlist' -- wordlist )
     [ dup second zero? [ first ] when ] map ;
@@ -52,51 +97,4 @@ M: protocol definer drop \ PROTOCOL: \ ; ;
 
 M: protocol synopsis* word-synopsis ; ! Necessary?
 
-GENERIC: group-words ( group -- words )
-
-M: protocol group-words
-    "protocol-words" word-prop ;
-
-M: tuple-class group-words
-    "slot-names" word-prop [
-        [ reader-word ] [ writer-word ] bi
-        2array [ 0 2array ] map
-    ] map concat ;
-
-! Consultation
-
-: define-consult-method ( word class quot -- )
-    [ drop swap first create-method ]
-    [ nip swap first2 swapd [ ndip ] 2curry swap suffix ] 3bi define ;
-
-: change-word-prop ( word prop quot -- )
-    >r swap word-props r> change-at ; inline
-
-: add ( item vector/f -- vector )
-    2dup member? [ nip ] [ ?push ] if ;
-
-: use-protocol ( class group -- )
-    "protocol-users" [ add ] change-word-prop ;
-
-: define-consult ( group class quot -- )
-    swapd >r 2dup use-protocol group-words swap r>
-    [ define-consult-method ] 2curry each ;
-
-: CONSULT:
-    scan-word scan-word parse-definition define-consult ; parsing
-
-! Mimic still needs to be updated
-
-: mimic-method ( mimicker mimicked generic -- )
-    tuck method 
-    [ [ create-method-in ] [ word-def ] bi* define ]
-    [ 2drop ] if* ;
-
-: define-mimic ( group mimicker mimicked -- )
-    [ drop swap use-protocol ] [
-        rot group-words -rot
-        [ rot first mimic-method ] 2curry each
-    ] 3bi ;
-
-: MIMIC:
-    scan-word scan-word scan-word define-mimic ; parsing
+M: protocol group-words protocol-words ;
index f1ad068fe22efbdf06f070764ff536be7c036a4c..c1d7e1e4ab12b8f875495e6207f489b32bc6beb7 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
 USING: delegate sequences.private sequences assocs prettyprint.sections 
-io definitions kernel continuations ;
+io definitions kernel continuations listener ;
 IN: delegate.protocols
 
 PROTOCOL: sequence-protocol
@@ -12,8 +12,10 @@ PROTOCOL: assoc-protocol
     at* assoc-size >alist set-at assoc-clone-like { assoc-find 1 }
     delete-at clear-assoc new-assoc assoc-like ;
 
-PROTOCOL: stream-protocol
-    stream-read1 stream-read stream-read-until dispose
+PROTOCOL: input-stream-protocol
+    stream-read1 stream-read stream-read-until stream-read-quot ;
+
+PROTOCOL: output-stream-protocol
     stream-flush stream-write1 stream-write stream-format
     stream-nl make-span-stream make-block-stream stream-readln
     make-cell-stream stream-write-table ;
index 87b574078691ec16b612223e52a10e33bf14b2a5..6fc7ab249f7956361864fc74d378159964b7cae6 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: continuations io.backend libc kernel namespaces
-sequences system vectors ;
+USING: continuations io.backend io.nonblocking libc kernel
+namespaces sequences system vectors ;
 IN: destructors
 
 SYMBOL: error-destructors
@@ -26,14 +26,11 @@ M: destructor dispose
 : add-always-destructor ( obj -- )
     <destructor> always-destructors get push ;
 
-: dispose-each ( seq -- )
-    <reversed> [ dispose ] each ;
-
 : do-always-destructors ( -- )
-    always-destructors get dispose-each ;
+    always-destructors get <reversed> dispose-each ;
 
 : do-error-destructors ( -- )
-    error-destructors get dispose-each ;
+    error-destructors get <reversed> dispose-each ;
 
 : with-destructors ( quot -- )
     [
@@ -62,10 +59,8 @@ TUPLE: handle-destructor alien ;
 
 C: <handle-destructor> handle-destructor
 
-HOOK: destruct-handle io-backend ( obj -- )
-
 M: handle-destructor dispose ( obj -- )
-    handle-destructor-alien destruct-handle ;
+    handle-destructor-alien close-handle ;
 
 : close-always ( handle -- )
     <handle-destructor> add-always-destructor ;
index 4fa4ed3c09d3b571fcd90f073d2f8da62845089d..435a0aca55a16b330563c93ebe67ed2ab592c8f5 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006, 2007 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays io kernel math models namespaces sequences strings
-splitting combinators unicode.categories ;
+splitting combinators unicode.categories math.order ;
 IN: documents
 
 : +col ( loc n -- newloc ) >r first2 r> + 2array ;
@@ -184,10 +184,10 @@ M: one-char-elt next-elt 2drop ;
     [ >r blank? r> xor ] curry ; inline
 
 : (prev-word) ( ? col str -- col )
-    rot break-detector find-last* drop ?1+ ;
+    rot break-detector find-last-from drop ?1+ ;
 
 : (next-word) ( ? col str -- col )
-    [ rot break-detector find* drop ] keep
+    [ rot break-detector find-from drop ] keep
     over not [ nip length ] [ drop ] if ;
 
 TUPLE: one-word-elt ;
index e4f19781ef83c80cb6fed370bfc742355a2afbfc..fe9abc0e76b4640cb9f50f2f09583f926a235271 100755 (executable)
@@ -25,11 +25,11 @@ IN: editors.jedit
     ] with-byte-writer ;
 
 : send-jedit-request ( request -- )
-    jedit-server-info "localhost" rot <inet> binary <client> [
+    jedit-server-info "localhost" rot <inet> binary [
         4 >be write
         dup length 2 >be write
         write
-    ] with-stream ;
+    ] with-client ;
 
 : jedit-location ( file line -- )
     number>string "+line:" prepend 2array
index 5b0c575771d06b713377ba779b6190fa0414bd4b..6bf5ee8d4f834da61ad05087184bd8e165e415d2 100644 (file)
@@ -35,7 +35,7 @@ pointer-window up-till-frame dup <wm-frame> is? [ ] [ drop f ] if ;
 
 wm-root>
   <- children
-  [ <- mapped? ] subset
+  [ <- mapped? ] filter
   [ check-window-table ] map
   reverse
 
@@ -64,7 +64,7 @@ drop
 
 ! wm-root>
 !   <- children
-!   [ <- mapped? ] subset
+!   [ <- mapped? ] filter
 !   [ check-window-table ] map
 !   reverse
 
index ca534f12c145150d5f3fd5c87b624b8bbb147ae5..6faf334fc323cba8b1eb2c48664ab01eed2502d5 100644 (file)
@@ -13,7 +13,7 @@ IN: factory
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 : manage-windows ( -- )
-dpy get $default-root <- children [ <- mapped? ] subset
+dpy get $default-root <- children [ <- mapped? ] filter
 [ $id <wm-frame> new* drop ] each ;
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
index 1022a02d7ed8622dc2208eedada3b91a7fefb224..3cb17cf08becca680099c97f22c5569f5dc1e9bd 100644 (file)
@@ -16,7 +16,7 @@ TUPLE: q/a question answer ;
 C: <q/a> q/a
 
 : li>q/a ( li -- q/a )
-    [ "br" tag-named*? not ] subset
+    [ "br" tag-named*? not ] filter
     [ "strong" tag-named*? ] find-after
     >r tag-children r> <q/a> ;
 
@@ -39,7 +39,7 @@ C: <question-list> question-list
 
 : xml>question-list ( list -- question-list )
     [ "title" swap at ] keep
-    tag-children [ tag? ] subset [ xml>q/a ] map
+    tag-children [ tag? ] filter [ xml>q/a ] map
     <question-list> ;
 
 : question-list>xml ( question-list -- list )
@@ -85,7 +85,7 @@ C: <faq> faq
 : toc, ( faq -- )
     "div" { { "style" "background-color: #eee; margin-left: 30%; margin-right: 30%; width: auto; padding: 5px; margin-top: 1em; margin-bottom: 1em" } } [
         "strong" [ "The big questions" , ] tag, br,
-        faq-lists 1 tail dup length [ toc-link, ] 2each
+        faq-lists rest dup length [ toc-link, ] 2each
     ] tag*, ;
 
 : faq-sections, ( question-lists -- )
index 527ba8b4fa403c0be3640ec93cbcf7cf09fccf3b..15b7b4b72ce42ae75f71f4600cb108adb531b609 100755 (executable)
@@ -63,8 +63,14 @@ MEMO: eq ( -- parser )
         ] with-html-stream
     ] with-string-writer ;
 
+: check-url ( href -- href' )
+    CHAR: : over member? [
+        dup { "http://" "https://" "ftp://" } [ head? ] with contains?
+        [ drop "/" ] unless
+    ] when ;
+
 : escape-link ( href text -- href-esc text-esc )
-    >r escape-quoted-string r> escape-string ;
+    >r check-url escape-quoted-string r> escape-string ;
 
 : make-link ( href text -- seq )
     escape-link
index 8d25da54bef439d633b823baa6eaab5f51bd9449..5e06f05a2b062125f33246a79a3ffa06ffe2e823 100755 (executable)
@@ -3,7 +3,7 @@ float-vectors.private combinators ;
 IN: float-vectors\r
 \r
 ARTICLE: "float-vectors" "Float vectors"\r
-"A float vector is a resizable mutable sequence of unsigned floats. The literal syntax is covered in " { $link "syntax-float-vectors" } ". Float vector words are found in the " { $vocab-link "float-vectors" } " vocabulary."\r
+"A float vector is a resizable mutable sequence of unsigned floats. Float vector words are found in the " { $vocab-link "float-vectors" } " vocabulary."\r
 $nl\r
 "Float vectors form a class:"\r
 { $subsection float-vector }\r
@@ -19,7 +19,7 @@ $nl
 ABOUT: "float-vectors"\r
 \r
 HELP: float-vector\r
-{ $description "The class of resizable float vectors. See " { $link "syntax-float-vectors" } " for syntax and " { $link "float-vectors" } " for general information." } ;\r
+{ $description "The class of resizable float vectors. See " { $link "float-vectors" } " for information." } ;\r
 \r
 HELP: <float-vector>\r
 { $values { "n" "a positive integer specifying initial capacity" } { "float-vector" float-vector } }\r
index 84d02d529d4be2cd4da108d0d5b957ee78b245f6..7a444fecbc1a28765582f3cb6774252509b63986 100755 (executable)
@@ -87,7 +87,7 @@ $nl
 } ;\r
 \r
 ARTICLE: "fry.limitations" "Fried quotation limitations"\r
-"As with " { $link "locals" } ", fried quotations cannot contain " { $link >r } " and " { $link r> } ". Unlike " { $link "locals" } ", using " { $link dip } " is not a suitable workaround since unlike closure conversion, fry conversion is not recursive, and so the quotation passed to " { $link dip } " cannot contain fry specifiers." ;\r
+"As with " { $vocab-link "locals" } ", fried quotations cannot contain " { $link >r } " and " { $link r> } "." ;\r
 \r
 ARTICLE: "fry" "Fried quotations"\r
 "A " { $emphasis "fried quotation" } " differs from a literal quotation in that when it is evaluated, instead of just pushing itself on the stack, it consumes zero or more stack values and inserts them into the quotation."\r
index 4d2c9fe1c819ce462ed1cd7ff3c2bd8b9caab833..eb59ffae4e7282c19ace7f8b9d11adc2196ebbc0 100755 (executable)
@@ -44,3 +44,11 @@ sequences ;
 : funny-dip '[ @ _ ] call ; inline
 
 [ "hi" 3 ] [ "h" "i" 3 [ append ] funny-dip ] unit-test
+
+[ { 1 2 3 } ] [
+    3 1 '[ , [ , + ] map ] call
+] unit-test
+
+[ { 1 { 2 { 3 } } } ] [
+    1 2 3 '[ , [ , [ , 1array ] call 2array ] call 2array ] call
+] unit-test
index 6c20aac7f2dcd08232592525f62ca1bd91bbe726..27a321ed921f84b771e1feb9d433a98de799a4de 100755 (executable)
@@ -9,41 +9,54 @@ IN: fry
 : @ "Only valid inside a fry" throw ;
 : _ "Only valid inside a fry" throw ;
 
-DEFER: (fry)
+DEFER: (shallow-fry)
 
-: ((fry)) ( accum quot adder -- result )
-    >r [ ] swap (fry) r>
+: ((shallow-fry)) ( accum quot adder -- result )
+    >r [ ] swap (shallow-fry) r>
     append swap dup empty? [ drop ] [
-        [ swap compose ] curry append
+        [ prepose ] curry append
     ] if ; inline
 
-: (fry) ( accum quot -- result )
+: (shallow-fry) ( accum quot -- result )
     dup empty? [
         drop 1quotation
     ] [
         unclip {
-            { \ , [ [ curry ] ((fry)) ] }
-            { \ @ [ [ compose ] ((fry)) ] }
+            { \ , [ [ curry ] ((shallow-fry)) ] }
+            { \ @ [ [ compose ] ((shallow-fry)) ] }
 
             ! to avoid confusion, remove if fry goes core
-            { \ namespaces:, [ [ curry ] ((fry)) ] }
+            { \ namespaces:, [ [ curry ] ((shallow-fry)) ] }
 
-            [ swap >r suffix r> (fry) ]
+            [ swap >r suffix r> (shallow-fry) ]
         } case
     ] if ;
 
-: trivial-fry ( quot -- quot' ) [ ] swap (fry) ;
+: shallow-fry ( quot -- quot' ) [ ] swap (shallow-fry) ;
 
-: fry ( quot -- quot' )
+: deep-fry ( quot -- quot' )
     { _ } last-split1 [
         [
-            trivial-fry %
+            shallow-fry %
             [ >r ] %
-            fry %
+            deep-fry %
             [ [ dip ] curry r> compose ] %
         ] [ ] make
     ] [
-        trivial-fry
+        shallow-fry
     ] if* ;
 
+: fry ( quot -- quot' )
+    [
+        [
+            dup callable? [
+                [
+                    [ { , namespaces:, @ } member? ] filter length
+                    \ , <repetition> %
+                ]
+                [ fry % ] bi
+            ] [ namespaces:, ] if
+        ] each
+    ] [ ] make deep-fry ;
+
 : '[ \ ] parse-until fry over push-all ; parsing
index d3b946afe9ba6368a9b254adb4007cef02c2fd1e..55a1276dd44351fb15b6f73ef5b68bc5ddd43846 100644 (file)
@@ -4,7 +4,8 @@
 ! gap buffer -- largely influenced by Strandh and Villeneuve's Flexichain
 ! for a good introduction see:
 ! http://p-cos.net/lisp-ecoop/submissions/StrandhVilleneuveMoore.pdf
-USING: kernel arrays sequences sequences.private circular math math.functions generic ;
+USING: kernel arrays sequences sequences.private circular math
+math.order math.functions generic ;
 IN: gap-buffer
 
 ! gap-start     -- the first element of the gap
index fd3a2d285ada1995d8d0a244ffb5254cceafc7b6..b5e44711345a2ec40e4b941bccbdf15452da3aef 100644 (file)
@@ -1,2 +1,2 @@
 collections
-collections sequences
+sequences
diff --git a/extra/geo-ip/authors.txt b/extra/geo-ip/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/geo-ip/geo-ip.factor b/extra/geo-ip/geo-ip.factor
new file mode 100644 (file)
index 0000000..5926dd5
--- /dev/null
@@ -0,0 +1,46 @@
+USING: kernel sequences io.files io.launcher io.encodings.ascii
+io.streams.string http.client sequences.lib combinators
+math.parser math.vectors math.intervals interval-maps memoize
+csv accessors assocs strings math splitting ;
+IN: geo-ip
+
+: db-path "IpToCountry.csv" temp-file ;
+
+: db-url "http://software77.net/cgi-bin/ip-country/geo-ip.pl?action=download" ;
+
+: download-db ( -- path )
+    db-path dup exists? [
+        db-url over ".gz" append download-to
+        { "gunzip" } over ".gz" append (normalize-path) suffix try-process
+    ] unless ;
+
+TUPLE: ip-entry from to registry assigned city cntry country ;
+
+: parse-ip-entry ( row -- ip-entry )
+    7 firstn {
+        [ string>number ]
+        [ string>number ]
+        [ ]
+        [ ]
+        [ ]
+        [ ]
+        [ ]
+    } spread ip-entry boa ;
+
+MEMO: ip-db ( -- seq )
+    download-db ascii file-lines
+    [ "#" head? not ] filter "\n" join <string-reader> csv
+    [ parse-ip-entry ] map ;
+
+MEMO: ip-intervals ( -- interval-map )
+    ip-db [ [ [ from>> ] [ to>> ] bi [a,b] ] keep ] { } map>assoc
+    <interval-map> ;
+
+GENERIC: lookup-ip ( ip -- ip-entry )
+
+M: string lookup-ip
+    "." split [ string>number ] map
+    { HEX: 1000000 HEX: 10000 HEX: 100 1 } v.
+    lookup-ip ;
+
+M: integer lookup-ip ip-intervals interval-at ;
diff --git a/extra/geo-ip/summary.txt b/extra/geo-ip/summary.txt
new file mode 100644 (file)
index 0000000..402d323
--- /dev/null
@@ -0,0 +1 @@
+IP address geolocation using database from http://software77.net/cgi-bin/ip-country/
diff --git a/extra/geo-ip/tags.txt b/extra/geo-ip/tags.txt
new file mode 100644 (file)
index 0000000..0aef4fe
--- /dev/null
@@ -0,0 +1 @@
+enterprise
index 1977efd3f930c8fd0a92adacb35000f5875063e0..b9de7c1b74fbd109c0b3f3739346d1291e15bdd9 100644 (file)
@@ -15,13 +15,13 @@ TUPLE: gesture-logger stream ;
 M: gesture-logger handle-gesture*
     drop
     dup T{ button-down } = [ over request-focus ] when
-    swap gesture-logger-stream [ . ] with-stream*
+    swap gesture-logger-stream [ . ] with-output-stream*
     t ;
 
 M: gesture-logger user-input*
     gesture-logger-stream [
         "User input: " write print
-    ] with-stream* t ;
+    ] with-output-stream* t ;
 
 : gesture-logger ( -- )
     [
index 861894c8f4bbb16188b1b4a49b5943cd7d47e3bc..611319e28b81c71e60283360541c291f3fafb07a 100755 (executable)
@@ -1,9 +1,9 @@
 ! Copyright (C) 2007 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 
-USING: alien arrays byte-arrays combinators
-graphics.viewer io io.binary io.files kernel libc math
-math.functions namespaces opengl opengl.gl prettyprint
+USING: alien arrays byte-arrays combinators inspector
+io.backend graphics.viewer io io.binary io.files kernel libc
+math math.functions namespaces opengl opengl.gl prettyprint
 sequences strings ui ui.gadgets.panes io.encodings.binary ;
 IN: graphics.bitmap
 
@@ -25,10 +25,14 @@ TUPLE: bitmap magic size reserved offset header-length width
         { 1 [ "1bit" throw ] }
     } case ;
 
+ERROR: bitmap-magic ;
+
+M: bitmap-magic summary
+    drop "First two bytes of bitmap stream must be 'BM'" ;
+
 : parse-file-header ( bitmap -- )
-    2 read [ over set-bitmap-magic ] keep "BM" = [
-        "BITMAPFILEHEADER: First two bytes must be BM" throw
-    ] unless
+    2 read >string dup "BM" = [ bitmap-magic ] unless
+        over set-bitmap-magic
     4 read le> over set-bitmap-size
     4 read le> over set-bitmap-reserved
     4 read le> swap set-bitmap-offset ;
@@ -59,7 +63,7 @@ TUPLE: bitmap magic size reserved offset header-length width
     dup color-index-length read swap set-bitmap-color-index ;
 
 : load-bitmap ( path -- bitmap )
-    binary [
+    normalize-path binary [
         T{ bitmap } clone
         dup parse-file-header
         dup parse-bitmap-header
@@ -113,20 +117,18 @@ M: bitmap height ( bitmap -- ) bitmap-height ;
 : bitmap. ( path -- )
     load-bitmap <graphics-gadget> gadget. ;
 
-: bitmap-window ( path -- )
-    load-bitmap [ <graphics-gadget> "bitmap" open-window ] keep ;
+: bitmap-window ( path -- gadget )
+    load-bitmap <graphics-gadget> [ "bitmap" open-window ] keep ;
 
 : test-bitmap24 ( -- )
-    "extra/graphics/bitmap/test-data/thiswayup24.bmp" resource-path bitmap. ;
+    "resource:extra/graphics/bitmap/test-images/thiswayup24.bmp" bitmap. ;
 
 : test-bitmap8 ( -- )
-    "extra/graphics/bitmap/test-data/rgb8bit.bmp" resource-path bitmap. ;
+    "resource:extra/graphics/bitmap/test-images/rgb8bit.bmp" bitmap. ;
 
 : test-bitmap4 ( -- )
-    "extra/graphics/bitmap/test-data/rgb4bit.bmp" resource-path
-    load-bitmap ;
-    ! bitmap. ;
+    "resource:extra/graphics/bitmap/test-images/rgb4bit.bmp" bitmap. ;
 
 : test-bitmap1 ( -- )
-    "extra/graphics/bitmap/test-data/1bit.bmp" resource-path bitmap. ;
+    "resource:extra/graphics/bitmap/test-images/1bit.bmp" bitmap. ;
 
index de7b3f40a5592594ff8e92bc1b05742e04ea79e6..5d9ca6eaa7a9fbed0e6846bff571e54585bc3f70 100644 (file)
@@ -7,7 +7,7 @@ IN: hardware-info.linux
 
 : uname ( -- seq )
     65536 "char" <c-array> [ (uname) io-error ] keep
-    "\0" split [ empty? not ] subset [ >string ] map
+    "\0" split [ empty? not ] filter [ >string ] map
     6 "" pad-right ;
 
 : sysname ( -- string ) uname first ;
@@ -18,4 +18,4 @@ IN: hardware-info.linux
 : domainname ( -- string ) uname 5 swap nth ;
 
 : kernel-version ( -- seq )
-    release ".-" split [ ] subset 5 "" pad-right ;
+    release ".-" split [ ] filter 5 "" pad-right ;
index 10474c09f75e393132072bc0d2015e3eeed9c10e..31624969742e9a8d6f5bdb635fdc6b7d945b06eb 100755 (executable)
@@ -1,7 +1,7 @@
 USING: alien alien.c-types kernel libc math namespaces
 windows windows.kernel32 windows.advapi32
 words combinators vocabs.loader hardware-info.backend
-system ;
+system alien.strings ;
 IN: hardware-info.windows
 
 : system-info ( -- SYSTEM_INFO )
index 9b21bf7fff552f76ceb591ae7d49a732b82f0a71..c2e12469c559c6fbc67d75aacf0f590208d8cc95 100755 (executable)
@@ -111,7 +111,7 @@ $nl
 "You can create a new array, only containing elements which satisfy some condition:"
 { $example
     ": negative? ( n -- ? ) 0 < ;"
-    "{ -12 10 16 0 -1 -3 -9 } [ negative? ] subset ."
+    "{ -12 10 16 0 -1 -3 -9 } [ negative? ] filter ."
     "{ -12 -1 -3 -9 }"
 }
 { $references
@@ -205,8 +205,8 @@ ARTICLE: "cookbook-io" "Input and output cookbook"
 }
 "Send some bytes to a remote host:"
 { $code
-    "\"myhost\" 1033 <inet> <client>"
-    "[ { 12 17 102 } >string write ] with-stream"
+    "\"myhost\" 1033 <inet>"
+    "[ { 12 17 102 } >string write ] with-client"
 }
 { $references
     { }
index 0b17461a9964360c4b71caa3d9f95468f57dd382..54ede93aa1d4378722333a60e01f7825a2796a37 100644 (file)
@@ -14,7 +14,7 @@ M: link uses
     collect-elements [ \ f or ] map ;
 
 : help-path ( topic -- seq )
-    [ article-parent ] follow 1 tail ;
+    [ article-parent ] follow rest ;
 
 : set-article-parents ( parent article -- )
     article-children [ set-article-parent ] with each ;
index 15e3b8be1d48efe2596088bd8d28bf0f7c279464..a8271a0e3b7f13bb3c2eec65a4bd8927346481cc 100755 (executable)
@@ -31,7 +31,7 @@ $nl
     { { $snippet "set-" { $emphasis "foo" } } { "sets " { $snippet "foo" } " to a new value" } { $links set-length } }
     { { $snippet { $emphasis "foo" } "-" { $emphasis "bar" } } { "(tuple accessors) outputs the value of the " { $snippet "bar" } " slot of the " { $snippet "foo" } " at the top of the stack" } { } }
     { { $snippet "set-" { $emphasis "foo" } "-" { $emphasis "bar" } } { "(tuple mutators) sets the value of the " { $snippet "bar" } " slot of the " { $snippet "foo" } " at the top of the stack" } { } }
-    { { $snippet "with-" { $emphasis "foo" } } { "performs some kind of initialization and cleanup related to " { $snippet "foo" } ", usually in a new dynamic scope" } { $links with-scope with-stream } }
+    { { $snippet "with-" { $emphasis "foo" } } { "performs some kind of initialization and cleanup related to " { $snippet "foo" } ", usually in a new dynamic scope" } { $links with-scope with-input-stream with-output-stream } }
     { { $snippet "$" { $emphasis "foo" } } { "help markup" } { $links $heading $emphasis } }
 }
 { $heading "Stack effect conventions" }
@@ -104,6 +104,7 @@ $nl
 ARTICLE: "objects" "Objects"
 "An " { $emphasis "object" } " is any datum which may be identified. All values are objects in Factor. Each object carries type information, and types are checked at runtime; Factor is dynamically typed."
 { $subsection "equality" }
+{ $subsection "math.order" }
 { $subsection "classes" }
 { $subsection "tuples" }
 { $subsection "generic" }
@@ -192,18 +193,21 @@ ARTICLE: "io" "Input and output"
 "Utilities:"
 { $subsection "stream-binary" }
 { $subsection "styles" }
-{ $heading "Files" }
-{ $subsection "io.files" }
-{ $subsection "io.mmap" }
-{ $subsection "io.monitors" }
 { $heading "Encodings" }
 { $subsection "encodings-introduction" }
 { $subsection "io.encodings" }
 { $subsection "io.encodings.string" }
-{ $heading "Other features" }
+{ $heading "Files" }
+{ $subsection "io.files" }
+{ $subsection "io.mmap" }
+{ $subsection "io.monitors" }
+{ $heading "Communications" }
 { $subsection "network-streams" }
 { $subsection "io.launcher" }
-{ $subsection "io.timeouts" } ;
+{ $subsection "io.pipes" }
+{ $heading "Other features" }
+{ $subsection "io.timeouts" }
+{ $subsection "checksums" } ;
 
 ARTICLE: "tools" "Developer tools"
 { $subsection "tools.vocabs" }
@@ -228,13 +232,13 @@ ARTICLE: "article-index" "Article index"
 { $index [ articles get keys ] } ;
 
 ARTICLE: "primitive-index" "Primitive index"
-{ $index [ all-words [ primitive? ] subset ] } ;
+{ $index [ all-words [ primitive? ] filter ] } ;
 
 ARTICLE: "error-index" "Error index"
 { $index [ all-errors ] } ;
 
 ARTICLE: "type-index" "Type index"
-{ $index [ builtins get [ ] subset ] } ;
+{ $index [ builtins get [ ] filter ] } ;
 
 ARTICLE: "class-index" "Class index"
 { $index [ classes ] } ;
index 1d2af5fb39149f460b5f1b74927cce7e14b2214e..f20ce89263dfc5857c085f41c8e1653a282ff6c3 100755 (executable)
@@ -113,7 +113,7 @@ ARTICLE: "help" "Help system"
 "The help system maintains documentation written in a simple markup language, along with cross-referencing and search. Documentation can either exist as free-standing " { $emphasis "articles" } " or be associated with words."
 { $subsection "browsing-help" }
 { $subsection "writing-help" }
-{ $subsection "help.lint" }
+{ $vocab-subsection "Help lint tool" "help.lint" }
 { $subsection "help-impl" } ;
 
 IN: help
@@ -126,7 +126,7 @@ HELP: $title
 HELP: help
 { $values { "topic" "an article name or a word" } }
 { $description
-    "Displays a help article or documentation associated to a word on the " { $link stdio } " stream."
+    "Displays a help article or documentation associated to a word on " { $link output-stream } "."
 } ;
 
 HELP: about
@@ -151,7 +151,7 @@ HELP: $index
 
 HELP: ($index)
 { $values { "articles" "a sequence of help articles" } }
-{ $description "Writes a list of " { $link $subsection } " elements to the " { $link stdio } " stream." } ;
+{ $description "Writes a list of " { $link $subsection } " elements to " { $link output-stream } "." } ;
 
 HELP: xref-help
 { $description "Update help cross-referencing. Usually this is done automatically." } ;
@@ -168,11 +168,11 @@ HELP: $predicate
 
 HELP: print-element
 { $values { "element" "a markup element" } }
-{ $description "Prints a markup element to the " { $link stdio } " stream." } ;
+{ $description "Prints a markup element to " { $link output-stream } "." } ;
 
 HELP: print-content
 { $values { "element" "a markup element" } }
-{ $description "Prints a top-level markup element to the " { $link stdio } " stream." } ;
+{ $description "Prints a top-level markup element to " { $link output-stream } "." } ;
 
 HELP: simple-element
 { $class-description "Class of simple elements, which are just arrays of elements." } ;
index e0b27099329974b4714e356455c8ab0bf65be80e..2d56251392b4348f256d1eda6b7e2bb4472e9c65 100755 (executable)
@@ -29,7 +29,7 @@ M: predicate word-help* drop \ $predicate ;
 
 : all-articles ( -- seq )
     articles get keys
-    all-words [ word-help ] subset append ;
+    all-words [ word-help ] filter append ;
 
 : xref-help ( -- )
     all-articles [ xref-article ] each ;
@@ -41,7 +41,7 @@ M: predicate word-help* drop \ $predicate ;
     [ dup article-title ] { } map>assoc sort-values keys ;
 
 : all-errors ( -- seq )
-    all-words [ error? ] subset sort-articles ;
+    all-words [ error? ] filter sort-articles ;
 
 M: word article-name word-name ;
 
@@ -135,7 +135,7 @@ M: word set-article-parent swap "help-parent" set-word-prop ;
     ":vars - list all variables at error time" print ;
 
 : :help ( -- )
-    error get delegates [ error-help ] map [ ] subset
+    error get delegates [ error-help ] map [ ] filter
     {
         { [ dup empty? ] [ (:help-none) ] }
         { [ dup length 1 = ] [ first help ] }
index 28af93f295c170d81da3eecf2b79a80ac402b392..a9ec7f92675abf0b61d5b4e90d6c45b2cff071be 100755 (executable)
@@ -9,8 +9,8 @@ macros combinators.lib sequences.lib math sets ;
 IN: help.lint
 
 : check-example ( element -- )
-    1 tail [
-        1 head* "\n" join 1vector
+    rest [
+        but-last "\n" join 1vector
         [
             use [ clone ] change
             [ eval>string ] with-datastack
@@ -23,7 +23,7 @@ IN: help.lint
 
 : extract-values ( element -- seq )
     \ $values swap elements dup empty? [
-        first 1 tail [ first ] map prune natural-sort
+        first rest [ first ] map prune natural-sort
     ] unless ;
 
 : effect-values ( word -- seq )
@@ -59,7 +59,7 @@ IN: help.lint
 
 : check-see-also ( word element -- )
     nip \ $see-also swap elements [
-        1 tail dup prune [ length ] bi@ assert=
+        rest dup prune [ length ] bi@ assert=
     ] each ;
 
 : vocab-exists? ( name -- ? )
@@ -75,7 +75,7 @@ IN: help.lint
     [ help ] with-string-writer drop ;
 
 : all-word-help ( words -- seq )
-    [ word-help ] subset ;
+    [ word-help ] filter ;
 
 TUPLE: help-error topic ;
 
@@ -131,7 +131,7 @@ M: help-error error.
         articles get keys "group-articles" set
         child-vocabs
         [ dup check-vocab ] { } map>assoc
-        [ nip empty? not ] assoc-subset
+        [ nip empty? not ] assoc-filter
     ] with-scope ;
 
 : typos. ( assoc -- )
@@ -150,12 +150,12 @@ M: help-error error.
 : help-lint-all ( -- ) "" help-lint ;
 
 : unlinked-words ( words -- seq )
-    all-word-help [ article-parent not ] subset ;
+    all-word-help [ article-parent not ] filter ;
 
 : linked-undocumented-words ( -- seq )
     all-words
-    [ word-help not ] subset
-    [ article-parent ] subset
-    [ "predicating" word-prop not ] subset ;
+    [ word-help not ] filter
+    [ article-parent ] filter
+    [ "predicating" word-prop not ] filter ;
 
 MAIN: help-lint
index 2e2b34ebfdfd7133c64da72c2d24a630ea6f3eef..378dd1e2feb7d834c9f510acf3a6059e8f6b4a09 100755 (executable)
@@ -311,7 +311,7 @@ M: array elements*
     [
         swap [
             elements [
-                1 tail [ dup set ] each
+                rest [ dup set ] each
             ] each
         ] curry each
     ] H{ } make-assoc keys ;
index f01840d9272d8c41e61c80b596894fe5b65a1d4d..cafa758c7e80adb62cf2d5bce0a3a49dee968069 100755 (executable)
@@ -123,8 +123,8 @@ $nl
 { $code "\"A man, a plan, a canal: Panama.\"" }
 "Now, place a quotation containing " { $link Letter? } " on the stack; quoting code places it on the stack instead of executing it immediately:"
 { $code "[ Letter? ]" }
-"Finally, pass the string and the quotation to the " { $link subset } " word:"
-{ $code "subset" }
+"Finally, pass the string and the quotation to the " { $link filter } " word:"
+{ $code "filter" }
 "Now the stack should contain the following string:"
 { "\"AmanaplanacanalPanama\"" }
 "This is almost what we want; we just need to convert the string to lower case now. This can be done by calling " { $link >lower } "; the " { $snippet ">" } " prefix is a naming convention for conversion operations, and should be read as ``to'':"
@@ -132,10 +132,10 @@ $nl
 "Finally, let's print the top of the stack and discard it:"
 { $code "." }
 "This will output " { $snippet "amanaplanacanalpanama" } ". This string is in the form that we want, and we evaluated the following code to get it into this form:"
-{ $code "[ Letter? ] subset >lower" }
+{ $code "[ Letter? ] filter >lower" }
 "This code starts with a string on the stack, removes non-alphabetical characters, and converts the result to lower case, leaving a new string on the stack. We put this code in a new word, and add the new word to " { $snippet "palindrome.factor" } ":"
-{ $code ": normalize ( str -- newstr ) [ Letter? ] subset >lower ;" }
-"You will need to add " { $vocab-link "unicode.categories" } " to the vocabulary search path, so that " { $link Letter? } " can be used in the source file."
+{ $code ": normalize ( str -- newstr ) [ Letter? ] filter >lower ;" }
+"You will need to add " { $vocab-link "unicode.case" } " and " { $vocab-link "unicode.categories" } " to the vocabulary search path, so that " { $link Letter? } " can be used in the source file."
 $nl
 "We modify " { $snippet "palindrome?" } " to first apply " { $snippet "normalize" } " to its input:"
 { $code ": palindrome? ( str -- ? ) normalize dup reverse = ;" }
index 41e29fc7128ae4d2e727f6cec88db34ccc18e929..49782fa305e4c611e61d72543ed0a901c0b6a670 100644 (file)
@@ -143,7 +143,7 @@ SYMBOL: html
         "h1" "h2" "h3" "h4" "h5" "h6" "h7" "h8" "h9"
         "ol" "li" "form" "a" "p" "html" "head" "body" "title"
         "b" "i" "ul" "table" "tbody" "tr" "td" "th" "pre" "textarea"
-        "script" "div" "span" "select" "option" "style"
+        "script" "div" "span" "select" "option" "style" "input"
     ] [ define-closed-html-word ] each
 
     ! Define some open HTML tags
@@ -161,6 +161,6 @@ SYMBOL: html
         "id" "onclick" "style" "valign" "accesskey"
         "src" "language" "colspan" "onchange" "rel"
         "width" "selected" "onsubmit" "xmlns" "lang" "xml:lang"
-        "media" "title"
+        "media" "title" "multiple"
     ] [ define-attribute-word ] each
 ] with-compilation-unit
index ce320ca75b447c4c66c84fece801070a9e279cd5..9f1ce6b6896b79bfd445a5b80ea18bfce77cdb35 100644 (file)
@@ -24,7 +24,7 @@ IN: html.tests
 ] unit-test
 
 [ "<" ] [
-    [ "<" H{ } stdio get format-html-span ] make-html-string
+    [ "<" H{ } output-stream get format-html-span ] make-html-string
 ] unit-test
 
 TUPLE: funky town ;
index 5c82b7f0384c1688ffabd5f3240f1bf54a240260..c154c35223d9b5ffa3329d955de20b12f9665e46 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2004, 2006 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: generic assocs help http io io.styles io.files continuations
-io.streams.string kernel math math.parser namespaces
+io.streams.string kernel math math.order math.parser namespaces
 quotations assocs sequences strings words html.elements
 xml.entities sbufs continuations ;
 IN: html
@@ -44,7 +44,7 @@ TUPLE: html-sub-stream style stream ;
     rot html-sub-stream-stream ;
 
 : delegate-write ( string -- )
-    stdio get delegate stream-write ;
+    output-stream get delegate stream-write ;
 
 : object-link-tag ( style quot -- )
     presented pick at [
@@ -101,7 +101,7 @@ TUPLE: html-sub-stream style stream ;
 : format-html-span ( string style stream -- )
     [
         [ [ drop delegate-write ] span-tag ] object-link-tag
-    ] with-stream* ;
+    ] with-output-stream* ;
 
 TUPLE: html-span-stream ;
 
@@ -134,7 +134,7 @@ M: html-span-stream dispose
 : format-html-div ( string style stream -- )
     [
         [ [ delegate-write ] div-tag ] object-link-tag
-    ] with-stream* ;
+    ] with-output-stream* ;
 
 TUPLE: html-block-stream ;
 
@@ -184,17 +184,17 @@ M: html-stream stream-write-table ( grid style stream -- )
                 </td>
             ] with each </tr>
         ] with each </table>
-    ] with-stream* ;
+    ] with-output-stream* ;
 
 M: html-stream make-cell-stream ( style stream -- stream' )
     (html-sub-stream) ;
 
 M: html-stream stream-nl ( stream -- )
-    dup test-last-div? [ drop ] [ [ <br/> ] with-stream* ] if ;
+    dup test-last-div? [ drop ] [ [ <br/> ] with-output-stream* ] if ;
 
 ! Utilities
 : with-html-stream ( quot -- )
-    stdio get <html-stream> swap with-stream* ; inline
+    output-stream get <html-stream> swap with-output-stream* ; inline
 
 : xhtml-preamble
     "<?xml version=\"1.0\"?>" write-html
@@ -225,13 +225,13 @@ M: html-stream stream-nl ( stream -- )
 
 : vertical-layout ( list -- )
     #! Given a list of HTML components, arrange them vertically.
-    <table> 
+    <table>
     [ <tr> <td> call </td> </tr> ] each
     </table> ;
 
 : horizontal-layout ( list -- )
     #! Given a list of HTML components, arrange them horizontally.
-    <table> 
+    <table>
      <tr "top" =valign tr> [ <td> call </td> ] each </tr>
     </table> ;
 
@@ -246,8 +246,8 @@ M: html-stream stream-nl ( stream -- )
 : simple-page ( title quot -- )
     #! Call the quotation, with all output going to the
     #! body of an html page with the given title.
-    <html>  
-        <head> <title> swap write </title> </head> 
+    <html>
+        <head> <title> swap write </title> </head>
         <body> call </body>
     </html> ;
 
@@ -255,10 +255,13 @@ M: html-stream stream-nl ( stream -- )
     #! Call the quotation, with all output going to the
     #! body of an html page with the given title. stylesheet-quot
     #! is called to generate the required stylesheet.
-    <html>  
-        <head>  
-             <title> rot write </title> 
-             swap call 
-        </head> 
+    <html>
+        <head>
+             <title> rot write </title>
+             swap call
+        </head>
         <body> call </body>
     </html> ;
+
+: render-error ( message -- )
+    <span "error" =class span> escape-string write </span> ;
index 1a60390f64b346ec5815c16212f8efe9195539d5..e9906f3f2a048b333dba6d1c67d577f9ee2b6e78 100755 (executable)
@@ -11,7 +11,7 @@ IN: html.parser.analyzer
     (find-relative) ;
 
 : (find-all) ( n seq quot -- )
-    2dup >r >r find* [
+    2dup >r >r find-from [
         dupd 2array , 1+ r> r> (find-all)
     ] [
         r> r> 3drop
@@ -21,7 +21,7 @@ IN: html.parser.analyzer
     [ 0 -rot (find-all) ] { } make ;
 
 : (find-nth) ( offset seq quot n count -- obj )
-    >r >r [ find* ] 2keep 4 npick [
+    >r >r [ find-from ] 2keep 4 npick [
         r> r> 1+ 2dup <= [
             4drop
         ] [
@@ -46,7 +46,7 @@ IN: html.parser.analyzer
         ] [
             drop t
         ] if
-    ] subset ;
+    ] filter ;
 
 : trim-text ( vector -- vector' )
     [
@@ -57,14 +57,14 @@ IN: html.parser.analyzer
     ] map ;
 
 : find-by-id ( id vector -- vector )
-    [ tag-attributes "id" swap at = ] with subset ;
+    [ tag-attributes "id" swap at = ] with filter ;
 
 : find-by-class ( id vector -- vector )
-    [ tag-attributes "class" swap at = ] with subset ;
+    [ tag-attributes "class" swap at = ] with filter ;
 
 : find-by-name ( str vector -- vector )
     >r >lower r>
-    [ tag-name = ] with subset ;
+    [ tag-name = ] with filter ;
 
 : find-first-name ( str vector -- i/f tag/f )
     >r >lower r>
@@ -76,13 +76,13 @@ IN: html.parser.analyzer
 
 : find-by-attribute-key ( key vector -- vector )
     >r >lower r>
-    [ tag-attributes at ] with subset
-    [ ] subset ;
+    [ tag-attributes at ] with filter
+    [ ] filter ;
 
 : find-by-attribute-key-value ( value key vector -- vector )
     >r >lower r>
-    [ tag-attributes at over = ] with subset nip
-    [ ] subset ;
+    [ tag-attributes at over = ] with filter nip
+    [ ] filter ;
 
 : find-first-attribute-key-value ( value key vector -- i/f tag/f )
     >r >lower r>
@@ -99,7 +99,7 @@ IN: html.parser.analyzer
     
 : find-between ( i/f tag/f vector -- vector )
     find-between* dup length 3 >= [
-        [ 1 tail-slice 1 head-slice* ] keep like
+        [ rest-slice but-last-slice ] keep like
     ] when ;
 
 : find-between-first ( string vector -- vector' )
@@ -109,12 +109,12 @@ IN: html.parser.analyzer
     tag-attributes [ "href" swap at ] [ f ] if* ;
 
 : find-links ( vector -- vector )
-    [ tag-name "a" = ] subset
-    [ tag-link ] subset ;
+    [ tag-name "a" = ] filter
+    [ tag-link ] filter ;
 
 
 : find-by-text ( seq quot -- tag )
-    [ dup tag-name text = ] swap compose find drop ;
+    [ dup tag-name text = ] prepose find drop ;
 
 : find-opening-tags-by-name ( name seq -- seq )
     [ [ tag-name = ] keep tag-closing? not and ] with find-all ;
@@ -125,11 +125,11 @@ IN: html.parser.analyzer
 : query>assoc* ( str -- hash )
     "?" split1 nip query>assoc ;
 
-! clear "http://fark.com" http-get parse-html find-links [ "go.pl" swap start ] subset [ "=" split peek ] map
+! clear "http://fark.com" http-get parse-html find-links [ "go.pl" swap start ] filter [ "=" split peek ] map
 
 ! clear "http://www.sailwx.info/shiptrack/cruiseships.phtml" http-get parse-html remove-blank-text
 ! "a" over find-opening-tags-by-name
-! [ nip "shipposition.phtml?call=GBTT" swap href-contains? ] assoc-subset
+! [ nip "shipposition.phtml?call=GBTT" swap href-contains? ] assoc-filter
 ! first first 8 + over nth
 ! tag-attributes "href" swap at query>assoc*
 ! "lat" over at "lon" rot at
index b574799b38efcb4e01325c8ed7964d4d0c50a197..5083b1cec26581618def86f4bad67224f041d22e 100644 (file)
@@ -36,7 +36,7 @@ IN: html.parser.utils
     dup quoted? [ quote ] unless ;
 
 : unquote ( str -- newstr )
-    dup quoted? [ 1 head-slice* 1 tail-slice >string ] when ;
+    dup quoted? [ but-last-slice rest-slice >string ] when ;
 
 : quote? ( ch -- ? ) "'\"" member? ;
 
index 0f684f782af39a08cca1770eba11c4b9e8568f9d..1d947b99e526f21f6ed56f3a0d624668984e96d4 100755 (executable)
@@ -6,9 +6,9 @@ tuple-syntax namespaces ;
 [ "/" "localhost" 8888 ] [ "http://localhost:8888" parse-url ] unit-test
 
 [ "foo.txt" ] [ "http://www.paulgraham.com/foo.txt" download-name ] unit-test
-[ "foo.txt" ] [ "http://www.arcsucks.com/foo.txt?xxx" download-name ] unit-test
-[ "foo.txt" ] [ "http://www.arcsucks.com/foo.txt/" download-name ] unit-test
-[ "www.arcsucks.com" ] [ "http://www.arcsucks.com////" download-name ] unit-test
+[ "foo.txt" ] [ "http://www.arc.com/foo.txt?xxx" download-name ] unit-test
+[ "foo.txt" ] [ "http://www.arc.com/foo.txt/" download-name ] unit-test
+[ "www.arc.com" ] [ "http://www.arc.com////" download-name ] unit-test
 
 [
     TUPLE{ request
@@ -18,7 +18,7 @@ tuple-syntax namespaces ;
         port: 80
         version: "1.1"
         cookies: V{ }
-        header: H{ }
+        header: H{ { "connection" "close" } }
     }
 ] [
     [
index e4bbf0279f1e4992933ae717ae6d72ae76419cec..17882277a3bdb66578fc7d89d321042a27e764e1 100755 (executable)
@@ -2,10 +2,19 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: assocs http kernel math math.parser namespaces sequences
 io io.sockets io.streams.string io.files io.timeouts strings
-splitting calendar continuations accessors vectors
-io.encodings.8-bit io.encodings.binary fry ;
+splitting calendar continuations accessors vectors math.order
+io.encodings.8-bit io.encodings.binary io.streams.duplex
+fry debugger inspector ;
 IN: http.client
 
+: max-redirects 10 ;
+
+ERROR: too-many-redirects ;
+
+M: too-many-redirects summary
+    drop
+    [ "Redirection limit of " % max-redirects # " exceeded" % ] "" make ;
+
 DEFER: http-request
 
 <PRIVATE
@@ -18,81 +27,93 @@ DEFER: http-request
 : store-path ( request path -- request )
     "?" split1 >r >>path r> dup [ query>assoc ] when >>query ;
 
-: request-with-url ( url request -- request )
-    swap parse-url >r >r store-path r> >>host r> >>port ;
+: request-with-url ( request url -- request )
+    parse-url >r >r store-path r> >>host r> >>port ;
 
-! This is all pretty complex because it needs to handle
-! HTTP redirects, which might be absolute or relative
-: absolute-redirect ( url -- request )
-    request get request-with-url ;
+SYMBOL: redirects
 
-: relative-redirect ( path -- request )
-    request get swap store-path ;
+: absolute-url? ( url -- ? )
+    [ "http://" head? ] [ "https://" head? ] bi or ;
 
-: do-redirect ( response -- response stream )
-    dup response-code 300 399 between? [
-        stdio get dispose
-        header>> "location" swap at
-        dup "http://" head? [
-            absolute-redirect
+: do-redirect ( response data -- response data )
+    over code>> 300 399 between? [
+        drop
+        redirects inc
+        redirects get max-redirects < [
+            request get
+            swap "location" header dup absolute-url?
+            [ request-with-url ] [ store-path ] if
+            "GET" >>method http-request
         ] [
-            relative-redirect
-        ] if "GET" >>method http-request
-    ] [
-        stdio get
-    ] if ;
+            too-many-redirects
+        ] if
+    ] when ;
 
-: request-addr ( request -- addr )
-    dup host>> swap port>> <inet> ;
+PRIVATE>
 
-: close-on-error ( stream quot -- )
-    '[ , with-stream* ] [ ] pick '[ , dispose ] cleanup ; inline
+: read-chunks ( -- )
+    read-crlf ";" split1 drop hex> dup { f 0 } member?
+    [ drop ] [ read % read-crlf "" assert= read-chunks ] if ;
 
-PRIVATE>
+: read-response-body ( response -- response data )
+    dup "transfer-encoding" header "chunked" =
+    [ [ read-chunks ] "" make ] [ input-stream get contents ] if ;
 
-: http-request ( request -- response stream )
+: http-request ( request -- response data )
     dup request [
-        dup request-addr latin1 <client>
-        1 minutes over set-timeout
-        [
-            write-request flush
+        dup request-addr latin1 [
+            1 minutes timeouts
+            write-request
             read-response
-            do-redirect
-        ] close-on-error
+            read-response-body
+        ] with-client
+        do-redirect
     ] with-variable ;
 
 : <get-request> ( url -- request )
-    <request> request-with-url "GET" >>method ;
+    <request>
+        swap request-with-url
+        "GET" >>method ;
 
-: http-get-stream ( url -- response stream )
+: http-get* ( url -- response data )
     <get-request> http-request ;
 
 : success? ( code -- ? ) 200 = ;
 
-: check-response ( response -- )
-    code>> success?
-    [ "HTTP download failed" throw ] unless ;
+ERROR: download-failed response body ;
+
+M: download-failed error.
+    "HTTP download failed:" print nl
+    [
+        response>>
+            write-response-code
+            write-response-message nl
+        drop
+    ]
+    [ body>> write ] bi ;
+
+: check-response ( response string -- string )
+    over code>> success? [ nip ] [ download-failed ] if ;
 
 : http-get ( url -- string )
-    http-get-stream contents swap check-response ;
+    http-get* check-response ;
 
 : download-name ( url -- name )
     file-name "?" split1 drop "/" ?tail drop ;
 
 : download-to ( url file -- )
     #! Downloads the contents of a URL to a file.
-    swap http-get-stream swap check-response
-    [ swap latin1 <file-writer> stream-copy ] with-disposal ;
+    >r http-get r> latin1 [ write ] with-file-writer ;
 
 : download ( url -- )
     dup download-name download-to ;
 
 : <post-request> ( content-type content url -- request )
     <request>
-    request-with-url
-    "POST" >>method
-    swap >>post-data
-    swap >>post-data-type ;
+        "POST" >>method
+        swap request-with-url
+        swap >>post-data
+        swap >>post-data-type ;
 
-: http-post ( content-type content url -- response string )
-    <post-request> http-request contents ;
+: http-post ( content-type content url -- response data )
+    <post-request> http-request ;
index d1ffce721d9854026bdba407dda9ff57ad21e782..21eb241b846fd5896de99ad1a2d58d2a76a6d0b2 100755 (executable)
@@ -1,6 +1,6 @@
 USING: http tools.test multiline tuple-syntax
 io.streams.string kernel arrays splitting sequences
-assocs io.sockets ;
+assocs io.sockets db db.sqlite continuations ;
 IN: http.tests
 
 [ "hello%20world" ] [ "hello world" url-encode ] unit-test
@@ -24,6 +24,16 @@ IN: http.tests
 [ "/bar" ] [ "http://foo.com/bar" url>path ] unit-test
 [ "/bar" ] [ "/bar" url>path ] unit-test
 
+[ "a=b&a=c" ] [ { { "a" { "b" "c" } } } assoc>query ] unit-test
+
+[ H{ { "a" "b" } } ] [ "a=b" query>assoc ] unit-test
+
+[ H{ { "a" { "b" "c" } } } ] [ "a=b&a=c" query>assoc ] unit-test
+
+[ "a=3" ] [ { { "a" 3 } } assoc>query ] unit-test
+
+: lf>crlf "\n" split "\r\n" join ;
+
 STRING: read-request-test-1
 GET http://foo/bar HTTP/1.1
 Some-Header: 1
@@ -45,7 +55,7 @@ blah
         cookies: V{ }
     }
 ] [
-    read-request-test-1 [
+    read-request-test-1 lf>crlf [
         read-request
     ] with-string-reader
 ] unit-test
@@ -59,7 +69,7 @@ blah
 ;
 
 read-request-test-1' 1array [
-    read-request-test-1
+    read-request-test-1 lf>crlf
     [ read-request ] with-string-reader
     [ write-request ] with-string-writer
     ! normalize crlf
@@ -69,6 +79,7 @@ read-request-test-1' 1array [
 STRING: read-request-test-2
 HEAD  http://foo/bar   HTTP/1.1
 Host: www.sex.com
+
 ;
 
 [
@@ -83,14 +94,14 @@ Host: www.sex.com
         cookies: V{ }
     }
 ] [
-    read-request-test-2 [
+    read-request-test-2 lf>crlf [
         read-request
     ] with-string-reader
 ] unit-test
 
 STRING: read-response-test-1
 HTTP/1.1 404 not found
-Content-Type: text/html
+Content-Type: text/html; charset=UTF8
 
 blah
 ;
@@ -100,24 +111,26 @@ blah
         version: "1.1"
         code: 404
         message: "not found"
-        header: H{ { "content-type" "text/html" } }
+        header: H{ { "content-type" "text/html; charset=UTF8" } }
         cookies: V{ }
+        content-type: "text/html"
+        content-charset: "UTF8"
     }
 ] [
-    read-response-test-1
+    read-response-test-1 lf>crlf
     [ read-response ] with-string-reader
 ] unit-test
 
 
 STRING: read-response-test-1'
 HTTP/1.1 404 not found
-content-type: text/html
+content-type: text/html; charset=UTF8
 
 
 ;
 
 read-response-test-1' 1array [
-    read-response-test-1
+    read-response-test-1 lf>crlf
     [ read-response ] with-string-reader
     [ write-response ] with-string-writer
     ! normalize crlf
@@ -130,19 +143,34 @@ read-response-test-1' 1array [
 ] unit-test
 
 ! Live-fire exercise
-USING: http.server http.server.static http.server.actions
-http.client io.server io.files io accessors namespaces threads
-io.encodings.ascii ;
+USING: http.server http.server.static http.server.sessions
+http.server.actions http.server.auth.login http.server.db http.client
+io.server io.files io io.encodings.ascii
+accessors namespaces threads ;
+
+: add-quit-action
+    <action>
+        [ stop-server [ "Goodbye" write ] <html-content> ] >>display
+    "quit" add-responder ;
+
+: test-db "test.db" temp-file sqlite-db ;
+
+[ test-db drop delete-file ] ignore-errors
+
+test-db [
+    init-sessions-table
+] with-db
 
 [ ] [
     [
         <dispatcher>
-            <action>
-                [ stop-server "text/html" <content> [ "Goodbye" write ] >>body ] >>display
-            "quit" add-responder
+            add-quit-action
             <dispatcher>
-                "extra/http/test" resource-path <static> >>default
+                "resource:extra/http/test" <static> >>default
             "nested" add-responder
+            <action>
+                [ "redirect-loop" f <standard-redirect> ] >>display
+            "redirect-loop" add-responder
         main-responder set
 
         [ 1237 httpd ] "HTTPD test" spawn drop
@@ -150,20 +178,75 @@ io.encodings.ascii ;
 ] unit-test
 
 [ t ] [
-    "extra/http/test/foo.html" resource-path ascii file-contents
+    "resource:extra/http/test/foo.html" ascii file-contents
     "http://localhost:1237/nested/foo.html" http-get =
 ] unit-test
 
 ! Try with a slightly malformed request
 [ t ] [
-    "localhost" 1237 <inet> ascii <client> [
+    "localhost" 1237 <inet> ascii [
         "GET nested HTTP/1.0\r\n" write flush
         "\r\n" write flush
-        readln drop
-        read-header USE: prettyprint
-    ] with-stream dup . "location" swap at "/" head?
+        read-crlf drop
+        read-header
+    ] with-client "location" swap at "/" head?
 ] unit-test
 
+[ "http://localhost:1237/redirect-loop" http-get ]
+[ too-many-redirects? ] must-fail-with
+
 [ "Goodbye" ] [
     "http://localhost:1237/quit" http-get
 ] unit-test
+
+! Dispatcher bugs
+[ ] [
+    [
+        <dispatcher>
+            <action> f <protected>
+            <login>
+            <sessions>
+            "" add-responder
+            add-quit-action
+            <dispatcher>
+                <action> "a" add-main-responder
+            "d" add-responder
+        test-db <db-persistence>
+        main-responder set
+
+        [ 1237 httpd ] "HTTPD test" spawn drop
+    ] with-scope
+] unit-test
+
+[ ] [ 1000 sleep ] unit-test
+
+: 404? [ download-failed? ] [ response>> code>> 404 = ] bi and ;
+
+! This should give a 404 not an infinite redirect loop
+[ "http://localhost:1237/d/blah" http-get ] [ 404? ] must-fail-with
+
+! This should give a 404 not an infinite redirect loop
+[ "http://localhost:1237/blah/" http-get ] [ 404? ] must-fail-with
+
+[ "Goodbye" ] [ "http://localhost:1237/quit" http-get ] unit-test
+
+[ ] [
+    [
+        <dispatcher>
+            <action> [ "text/plain" <content> [ "Hi" write ] >>body ] >>display
+            <login>
+            <sessions>
+            "" add-responder
+            add-quit-action
+        test-db <db-persistence>
+        main-responder set
+
+        [ 1237 httpd ] "HTTPD test" spawn drop
+    ] with-scope
+] unit-test
+
+[ ] [ 1000 sleep ] unit-test
+
+[ "Hi" ] [ "http://localhost:1237/" http-get ] unit-test
+
+[ "Goodbye" ] [ "http://localhost:1237/quit" http-get ] unit-test
index 9e31855e53a98f6f156d3ce848b034b6cdb8ff04..786210123d5aadb592b1ae6f8cba530e3d1be6db 100755 (executable)
@@ -1,10 +1,18 @@
 ! Copyright (C) 2003, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: fry hashtables io io.streams.string kernel math sets
-namespaces math.parser assocs sequences strings splitting ascii
-io.encodings.utf8 io.encodings.string namespaces unicode.case
-combinators vectors sorting accessors calendar
-calendar.format quotations arrays combinators.lib byte-arrays ;
+USING: accessors kernel combinators math namespaces
+
+assocs sequences splitting sorting sets debugger
+strings vectors hashtables quotations arrays byte-arrays
+math.parser calendar calendar.format
+
+io io.streams.string io.encodings.utf8 io.encodings.string
+io.sockets
+
+unicode.case unicode.categories qualified ;
+
+EXCLUDE: fry => , ;
+
 IN: http
 
 : http-port 80 ; inline
@@ -13,11 +21,12 @@ IN: http
     #! In a URL, can this character be used without
     #! URL-encoding?
     {
-        [ dup letter? ]
-        [ dup LETTER? ]
-        [ dup digit? ]
-        [ dup "/_-.:" member? ]
-    } || nip ; foldable
+        { [ dup letter? ] [ t ] }
+        { [ dup LETTER? ] [ t ] }
+        { [ dup digit? ] [ t ] }
+        { [ dup "/_-.:" member? ] [ t ] }
+        [ f ]
+    } cond nip ; foldable
 
 : push-utf8 ( ch -- )
     1string utf8 encode
@@ -75,8 +84,15 @@ IN: http
         ] if
     ] if ;
 
+: read-lf ( -- string )
+    "\n" read-until CHAR: \n assert= ;
+
+: read-crlf ( -- string )
+    "\r" read-until
+    [ CHAR: \r assert= read1 CHAR: \n assert= ] when* ;
+
 : read-header-line ( -- )
-    readln dup
+    read-crlf dup
     empty? [ drop ] [ header-line read-header-line ] if ;
 
 : read-header ( -- assoc )
@@ -103,27 +119,48 @@ IN: http
         header-value>string check-header-string write crlf
     ] assoc-each crlf ;
 
+: add-query-param ( value key assoc -- )
+    [
+        at [
+            {
+                { [ dup string? ] [ swap 2array ] }
+                { [ dup array? ] [ swap suffix ] }
+                { [ dup not ] [ drop ] }
+            } cond
+        ] when*
+    ] 2keep set-at ;
+
 : query>assoc ( query -- assoc )
     dup [
-        "&" split [
-            "=" split1 [ dup [ url-decode ] when ] bi@
-        ] H{ } map>assoc
+        "&" split H{ } clone [
+            [
+                >r "=" split1 [ dup [ url-decode ] when ] bi@ swap r>
+                add-query-param
+            ] curry each
+        ] keep
     ] when ;
 
 : assoc>query ( hash -- str )
     [
-        [ url-encode ]
-        [ dup number? [ number>string ] when url-encode ]
-        bi*
-        "=" swap 3append
-    ] { } assoc>map
-    "&" join ;
+        {
+            { [ dup number? ] [ number>string 1array ] }
+            { [ dup string? ] [ 1array ] }
+            { [ dup sequence? ] [ ] }
+        } cond
+    ] assoc-map
+    [
+        [
+            >r url-encode r>
+            [ url-encode "=" swap 3append , ] with each
+        ] assoc-each
+    ] { } make "&" join ;
 
-TUPLE: cookie name value path domain expires http-only ;
+TUPLE: cookie name value path domain expires max-age http-only ;
 
 : <cookie> ( value name -- cookie )
     cookie new
-    swap >>name swap >>value ;
+        swap >>name
+        swap >>value ;
 
 : parse-cookies ( string -- seq )
     [
@@ -131,7 +168,8 @@ TUPLE: cookie name value path domain expires http-only ;
 
         ";" split [
             [ blank? ] trim "=" split1 swap >lower {
-                { "expires" [ >>expires ] }
+                { "expires" [ cookie-string>timestamp >>expires ] }
+                { "max-age" [ string>number seconds >>max-age ] }
                 { "domain" [ >>domain ] }
                 { "path" [ >>path ] }
                 { "httponly" [ drop t >>http-only ] }
@@ -147,7 +185,14 @@ TUPLE: cookie name value path domain expires http-only ;
     {
         { f [ drop ] }
         { t [ , ] }
-        [ "=" swap 3append , ]
+        [
+            {
+                { [ dup timestamp? ] [ timestamp>cookie-string ] }
+                { [ dup duration? ] [ dt>seconds number>string ] }
+                [ ]
+            } cond
+            "=" swap 3append ,
+        ]
     } case ;
 
 : unparse-cookie ( cookie -- strings )
@@ -156,6 +201,7 @@ TUPLE: cookie name value path domain expires http-only ;
         "path" over path>> (unparse-cookie)
         "domain" over domain>> (unparse-cookie)
         "expires" over expires>> (unparse-cookie)
+        "max-age" over max-age>> (unparse-cookie)
         "httponly" over http-only>> (unparse-cookie)
         drop
     ] { } make ;
@@ -175,13 +221,17 @@ post-data
 post-data-type
 cookies ;
 
+: set-header ( request/response value key -- request/response )
+    pick header>> set-at ;
+
 : <request>
     request new
         "1.1" >>version
         http-port >>port
         H{ } clone >>header
         H{ } clone >>query
-        V{ } clone >>cookies ;
+        V{ } clone >>cookies
+        "close" "connection" set-header ;
 
 : query-param ( request key -- value )
     swap query>> at ;
@@ -220,7 +270,7 @@ cookies ;
     dup { "1.0" "1.1" } member? [ "Bad version" throw ] unless ;
 
 : read-request-version ( request -- request )
-    readln [ CHAR: \s = ] left-trim
+    read-crlf [ CHAR: \s = ] left-trim
     parse-version
     >>version ;
 
@@ -261,6 +311,12 @@ SYMBOL: max-post-request
 : extract-cookies ( request -- request )
     dup "cookie" header [ parse-cookies >>cookies ] when* ;
 
+: parse-content-type-attributes ( string -- attributes )
+    " " split [ empty? not ] filter [ "=" split1 >r >lower r> ] { } map>assoc ;
+
+: parse-content-type ( content-type -- type encoding )
+    ";" split1 parse-content-type-attributes "charset" swap at ;
+
 : read-request ( -- request )
     <request>
     read-method
@@ -295,9 +351,16 @@ SYMBOL: max-post-request
         "application/x-www-form-urlencoded" >>post-data-type
     ] if ;
 
+: request-addr ( request -- addr )
+    [ host>> ] [ port>> ] bi <inet> ;
+
+: request-host ( request -- string )
+    [ host>> ] [ port>> ] bi
+    dup 80 = [ drop ] [ ":" swap number>string 3append ] if ;
+
 : write-request-header ( request -- request )
     dup header>> >hashtable
-    over host>> [ "host" pick set-at ] when*
+    over host>> [ over request-host "host" pick set-at ] when
     over post-data>> [ length "content-length" pick set-at ] when*
     over post-data-type>> [ "content-type" pick set-at ] when*
     over cookies>> f like [ unparse-cookies "cookie" pick set-at ] when*
@@ -330,9 +393,6 @@ SYMBOL: max-post-request
         tri
     ] with-string-writer ;
 
-: set-header ( request/response value key -- request/response )
-    pick header>> set-at ;
-
 GENERIC: write-response ( response -- )
 
 GENERIC: write-full-response ( request response -- )
@@ -343,15 +403,17 @@ code
 message
 header
 cookies
+content-type
+content-charset
 body ;
 
 : <response>
     response new
-    "1.1" >>version
-    H{ } clone >>header
-    "close" "connection" set-header
-    now timestamp>http-string "date" set-header
-    V{ } clone >>cookies ;
+        "1.1" >>version
+        H{ } clone >>header
+        "close" "connection" set-header
+        now timestamp>http-string "date" set-header
+        V{ } clone >>cookies ;
 
 : read-response-version
     " \t" read-until
@@ -365,11 +427,14 @@ body ;
     >>code ;
 
 : read-response-message
-    readln >>message ;
+    read-crlf >>message ;
 
 : read-response-header
     read-header >>header
-    dup "set-cookie" header [ parse-cookies >>cookies ] when* ;
+    extract-cookies
+    dup "content-type" header [
+        parse-content-type [ >>content-type ] [ >>content-charset ] bi*
+    ] when* ;
 
 : read-response ( -- response )
     <response>
@@ -388,10 +453,15 @@ body ;
 : write-response-message ( response -- response )
     dup message>> write crlf ;
 
+: unparse-content-type ( request -- content-type )
+    [ content-type>> "application/octet-stream" or ]
+    [ content-charset>> ] bi
+    [ "; charset=" swap 3append ] when* ;
+
 : write-response-header ( response -- response )
     dup header>> clone
-    over cookies>> f like
-    [ unparse-cookies "set-cookie" pick set-at ] when*
+    over cookies>> f like [ unparse-cookies "set-cookie" pick set-at ] when*
+    over unparse-content-type "content-type" pick set-at
     write-header ;
 
 GENERIC: write-response-body* ( body -- )
@@ -402,7 +472,7 @@ M: string write-response-body* write ;
 
 M: callable write-response-body* call ;
 
-M: object write-response-body* stdio get stream-copy ;
+M: object write-response-body* output-stream get stream-copy ;
 
 : write-response-body ( response -- response )
     dup body>> write-response-body* ;
@@ -419,9 +489,6 @@ M: response write-full-response ( request response -- )
     dup write-response
     swap method>> "HEAD" = [ write-response-body ] unless ;
 
-: set-content-type ( request/response content-type -- request/response )
-    "content-type" set-header ;
-
 : get-cookie ( request/response name -- cookie/f )
     >r cookies>> r> '[ , _ name>> = ] find nip ;
 
@@ -432,7 +499,7 @@ M: response write-full-response ( request response -- )
     [ name>> dupd get-cookie [ dupd delete-cookie ] when* ] keep
     over cookies>> push ;
 
-TUPLE: raw-response 
+TUPLE: raw-response
 version
 code
 message
index ebf8e8770b53049752fec800e1a09ae21ebd1335..5aa761603fc33c94ac72889b1398b76e1f240eb9 100755 (executable)
@@ -1,7 +1,7 @@
-IN: http.server.actions.tests
 USING: http.server.actions http.server.validators
 tools.test math math.parser multiline namespaces http
-io.streams.string http.server sequences accessors ;
+io.streams.string http.server sequences splitting accessors ;
+IN: http.server.actions.tests
 
 [
     "a" [ v-number ] { { "a" "123" } } validate-param
@@ -13,6 +13,8 @@ io.streams.string http.server sequences accessors ;
     { { "a" [ v-number ] } { "b" [ v-number ] } } >>get-params
 "action-1" set
 
+: lf>crlf "\n" split "\r\n" join ;
+
 STRING: action-request-test-1
 GET http://foo/bar?a=12&b=13 HTTP/1.1
 
@@ -20,28 +22,9 @@ blah
 ;
 
 [ 25 ] [
-    action-request-test-1 [ read-request ] with-string-reader
-    request set
-    "/blah"
-    "action-1" get call-responder
-] unit-test
-
-<action>
-    [ +append-path get "xxx" get "X" <repetition> concat append ] >>submit
-    { { +append-path [ ] } { "xxx" [ v-number ] } } >>post-params
-"action-2" set
-
-STRING: action-request-test-2
-POST http://foo/bar/baz HTTP/1.1
-content-length: 5
-content-type: application/x-www-form-urlencoded
-
-xxx=4
-;
-
-[ "/blahXXXX" ] [
-    action-request-test-2 [ read-request ] with-string-reader
+    init-request
+    action-request-test-1 lf>crlf
+    [ read-request ] with-string-reader
     request set
-    "/blah"
-    "action-2" get call-responder
+    { } "action-1" get call-responder
 ] unit-test
index 2b2aaea6a8adbd4208d0954afa8e361a791df727..2d73cb46a786ed0b58b812b65b193385fde561a1 100755 (executable)
@@ -2,13 +2,20 @@
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: accessors sequences kernel assocs combinators\r
 http.server http.server.validators http hashtables namespaces\r
-fry continuations locals ;\r
+fry continuations locals boxes xml.entities html.elements io ;\r
 IN: http.server.actions\r
 \r
-SYMBOL: +append-path\r
-\r
 SYMBOL: params\r
 \r
+SYMBOL: validation-message\r
+\r
+: render-validation-message ( -- )\r
+    validation-message get value>> [\r
+        <span "error" =class span>\r
+            escape-string write\r
+        </span>\r
+    ] when* ;\r
+\r
 TUPLE: action init display submit get-params post-params ;\r
 \r
 : <action>\r
@@ -37,14 +44,25 @@ TUPLE: action init display submit get-params post-params ;
 : validation-failed ( -- * )\r
     action get display>> call exit-with ;\r
 \r
-M: action call-responder ( path action -- response )\r
+: validation-failed-with ( string -- * )\r
+    validation-message get >box\r
+    validation-failed ;\r
+\r
+M: action call-responder* ( path action -- response )\r
     '[\r
-        , ,\r
-        [ +append-path associate request-params assoc-union params set ]\r
-        [ action set ] bi*\r
-        request get method>> {\r
-            { "GET" [ handle-get ] }\r
-            { "HEAD" [ handle-get ] }\r
-            { "POST" [ handle-post ] }\r
-        } case\r
+        , [ CHAR: / = ] right-trim empty? [\r
+            , action set\r
+            request get\r
+            <box> validation-message set\r
+            [ request-params params set ]\r
+            [\r
+                method>> {\r
+                    { "GET" [ handle-get ] }\r
+                    { "HEAD" [ handle-get ] }\r
+                    { "POST" [ handle-post ] }\r
+                } case\r
+            ] bi\r
+        ] [\r
+            <404>\r
+        ] if\r
     ] with-exit-continuation ;\r
diff --git a/extra/http/server/auth/admin/admin.factor b/extra/http/server/auth/admin/admin.factor
new file mode 100644 (file)
index 0000000..21e1a61
--- /dev/null
@@ -0,0 +1,179 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel sequences accessors namespaces combinators words
+assocs locals db.tuples arrays splitting strings qualified
+
+http.server.templating.chloe
+http.server.boilerplate
+http.server.auth.providers
+http.server.auth.providers.db
+http.server.auth.login
+http.server.auth
+http.server.forms
+http.server.components.inspector
+http.server.validators
+http.server.sessions
+http.server.actions
+http.server.crud
+http.server ;
+EXCLUDE: http.server.components => string? number? ;
+IN: http.server.auth.admin
+
+: admin-template ( name -- template )
+    "resource:extra/http/server/auth/admin/" swap ".xml" 3append <chloe> ;
+
+: words>strings ( seq -- seq' )
+    [ [ word-vocabulary ] [ drop ":" ] [ word-name ] tri 3append ] map ;
+
+: strings>words ( seq -- seq' )
+    [ ":" split1 swap lookup ] map ;
+
+: <capabilities> ( id -- component )
+    capabilities get words>strings <menu> ;
+
+: <new-user-form> ( -- form )
+    "user" <form>
+        "new-user" admin-template >>edit-template
+        "username" <string> add-field
+        "realname" <string> add-field
+        "new-password" <password> t >>required add-field
+        "verify-password" <password> t >>required add-field
+        "email" <email> add-field
+        "capabilities" <capabilities> add-field ;
+
+: <edit-user-form> ( -- form )
+    "user" <form>
+        "edit-user" admin-template >>edit-template
+        "user-summary" admin-template >>summary-template
+        "username" <string> hidden >>renderer add-field
+        "realname" <string> add-field
+        "new-password" <password> add-field
+        "verify-password" <password> add-field
+        "email" <email> add-field
+        "profile" <inspector> add-field
+        "capabilities" <capabilities> add-field ;
+
+: <user-list-form> ( -- form )
+    "user-list" <form>
+        "user-list" admin-template >>view-template
+        "list" <edit-user-form> +unordered+ <list> add-field ;
+
+:: <new-user-action> ( form ctor next -- action )
+    <action>
+        [
+            blank-values
+
+            "username" get ctor call
+
+            {
+                [ username>> "username" set-value ]
+                [ realname>> "realname" set-value ]
+                [ email>> "email" set-value ]
+                [ profile>> "profile" set-value ]
+            } cleave
+        ] >>init
+
+        [ form edit-form ] >>display
+
+        [
+            blank-values
+
+            form validate-form
+
+            same-password-twice
+
+            user new "username" value >>username select-tuple
+            [ user-exists ] when
+
+            "username" value <user>
+                "realname" value >>realname
+                "email" value >>email
+                "new-password" value >>encoded-password
+                H{ } clone >>profile
+
+            insert-tuple
+
+            next f <standard-redirect>
+        ] >>submit ;
+    
+:: <edit-user-action> ( form ctor next -- action )
+    <action>
+        { { "username" [ v-required ] } } >>get-params
+
+        [
+            blank-values
+
+            "username" get ctor call select-tuple
+
+            {
+                [ username>> "username" set-value ]
+                [ realname>> "realname" set-value ]
+                [ email>> "email" set-value ]
+                [ profile>> "profile" set-value ]
+                [ capabilities>> words>strings "capabilities" set-value ]
+            } cleave
+        ] >>init
+
+        [ form edit-form ] >>display
+
+        [
+            blank-values
+
+            form validate-form
+
+            "username" value <user> select-tuple
+                "realname" value >>realname
+                "email" value >>email
+
+            { "new-password" "verify-password" }
+            [ value empty? ] all? [
+                same-password-twice
+                "new-password" value >>encoded-password
+            ] unless
+
+            "capabilities" value {
+                { [ dup string? ] [ 1array ] }
+                { [ dup array? ] [ ] }
+            } cond strings>words >>capabilities
+
+            update-tuple
+
+            next f <standard-redirect>
+        ] >>submit ;
+
+:: <delete-user-action> ( ctor next -- action )
+    <action>
+        { { "username" [ ] } } >>post-params
+
+        [
+            "username" get
+            [ <user> select-tuple 1 >>deleted update-tuple ]
+            [ logout-all-sessions ]
+            bi
+
+            next f <standard-redirect>
+        ] >>submit ;
+
+TUPLE: user-admin < dispatcher ;
+
+SYMBOL: can-administer-users?
+
+can-administer-users? define-capability
+
+:: <user-admin> ( -- responder )
+    [let | ctor [ [ <user> ] ] |
+        user-admin new-dispatcher
+            <user-list-form> ctor <list-action> "" add-responder
+            <new-user-form> ctor "$user-admin" <new-user-action> "new" add-responder
+            <edit-user-form> ctor "$user-admin" <edit-user-action> "edit" add-responder
+            ctor "$user-admin" <delete-user-action> "delete" add-responder
+        <boilerplate>
+            "admin" admin-template >>template
+        { can-administer-users? } <protected>
+    ] ;
+
+: make-admin ( username -- )
+    <user>
+    select-tuple
+    [ can-administer-users? suffix ] change-capabilities
+    update-tuple ;
diff --git a/extra/http/server/auth/admin/admin.xml b/extra/http/server/auth/admin/admin.xml
new file mode 100644 (file)
index 0000000..0581756
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <div class="navbar">
+                 <t:a t:href="$user-admin">List Users</t:a>
+               | <t:a t:href="$user-admin/new">Add User</t:a>
+
+               <t:if t:code="http.server.auth.login:allow-edit-profile?">
+                       | <t:a t:href="$login/edit-profile" t:flow="begin">Edit Profile</t:a>
+               </t:if>
+
+               | <t:button t:action="$login/logout" t:flow="begin" class="link-button link">Logout</t:button>
+       </div>
+
+       <h1><t:write-title /></h1>
+
+       <t:call-next-template />
+
+</t:chloe>
diff --git a/extra/http/server/auth/admin/edit-user.xml b/extra/http/server/auth/admin/edit-user.xml
new file mode 100644 (file)
index 0000000..9c0fe70
--- /dev/null
@@ -0,0 +1,56 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>Edit User</t:title>
+
+       <t:form t:action="$user-admin/edit" t:for="username">
+
+       <table>
+       
+       <tr>
+               <th class="field-label">User name:</th>
+               <td><t:view t:component="username" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">Real name:</th>
+               <td><t:edit t:component="realname" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">New password:</th>
+               <td><t:edit t:component="new-password" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">Verify:</th>
+               <td><t:edit t:component="verify-password" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">E-mail:</th>
+               <td><t:edit t:component="email" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label big-field-label">Capabilities:</th>
+               <td><t:edit t:component="capabilities" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">Profile:</th>
+               <td><t:view t:component="profile" /></td>
+       </tr>
+
+       </table>
+       
+       <p>
+               <button type="submit" class="link-button link">Update</button>
+               <t:validation-message />
+       </p>
+
+       </t:form>
+
+       <t:button t:action="$user-admin/delete" t:for="username" class="link-button link">Delete</t:button>
+</t:chloe>
diff --git a/extra/http/server/auth/admin/new-user.xml b/extra/http/server/auth/admin/new-user.xml
new file mode 100644 (file)
index 0000000..2d67639
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>New User</t:title>
+
+       <t:form t:action="$user-admin/new">
+
+       <table>
+       
+       <tr>
+               <th class="field-label">User name:</th>
+               <td><t:edit t:component="username" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">Real name:</th>
+               <td><t:edit t:component="realname" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">New password:</th>
+               <td><t:edit t:component="new-password" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">Verify:</th>
+               <td><t:edit t:component="verify-password" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label">E-mail:</th>
+               <td><t:edit t:component="email" /></td>
+       </tr>
+       
+       <tr>
+               <th class="field-label big-field-label">Capabilities:</th>
+               <td><t:edit t:component="capabilities" /></td>
+       </tr>
+
+       </table>
+       
+       <p>
+               <button type="submit" class="link-button link">Create</button>
+               <t:validation-message />
+       </p>
+
+       </t:form>
+</t:chloe>
diff --git a/extra/http/server/auth/admin/user-list.xml b/extra/http/server/auth/admin/user-list.xml
new file mode 100644 (file)
index 0000000..520b7f2
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>Users</t:title>
+
+       <t:summary t:component="list" />
+
+</t:chloe>
diff --git a/extra/http/server/auth/admin/user-summary.xml b/extra/http/server/auth/admin/user-summary.xml
new file mode 100644 (file)
index 0000000..c426e7c
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:a t:href="$user-admin/edit" t:query="username">
+               <t:view t:component="username" />
+       </t:a>
+
+</t:chloe>
index 69a3c76c2bf7325d0c1e2cd0e70c2b1c64fa1379..36fcff4b2ef47da0d70ba5e6a358f9536e91cd4e 100755 (executable)
@@ -1,26 +1,41 @@
 ! Copyright (c) 2008 Slava Pestov\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: http.server.sessions accessors\r
-http.server.auth.providers assocs namespaces kernel ;\r
+USING: accessors assocs namespaces kernel sequences\r
+http.server\r
+http.server.sessions\r
+http.server.auth.providers ;\r
 IN: http.server.auth\r
 \r
 SYMBOL: logged-in-user\r
-SYMBOL: user-profile-changed?\r
 \r
 GENERIC: init-user-profile ( responder -- )\r
 \r
 M: object init-user-profile drop ;\r
 \r
-: uid ( -- string ) logged-in-user sget username>> ;\r
+M: dispatcher init-user-profile\r
+    default>> init-user-profile ;\r
 \r
-: profile ( -- assoc ) logged-in-user sget profile>> ;\r
+M: filter-responder init-user-profile\r
+    responder>> init-user-profile ;\r
+\r
+: profile ( -- assoc ) logged-in-user get profile>> ;\r
+\r
+: user-changed ( -- )\r
+    logged-in-user get t >>changed? drop ;\r
 \r
 : uget ( key -- value )\r
     profile at ;\r
 \r
 : uset ( value key -- )\r
-    profile set-at user-profile-changed? on ;\r
+    profile set-at\r
+    user-changed ;\r
 \r
 : uchange ( quot key -- )\r
     profile swap change-at\r
-    user-profile-changed? on ; inline\r
+    user-changed ; inline\r
+\r
+SYMBOL: capabilities\r
+\r
+V{ } clone capabilities set-global\r
+\r
+: define-capability ( word -- ) capabilities get push-new ;\r
index 04c0e62d0734c70c5aa9cc216e60dbdcbe77bfd1..ff071b34e37456e4c445a026a2f97bc7c87a36af 100755 (executable)
@@ -2,11 +2,11 @@
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: accessors quotations assocs kernel splitting\r
 base64 html.elements io combinators http.server\r
-http.server.auth.providers http.server.auth.providers.null\r
+http.server.auth.providers http.server.auth.login\r
 http sequences ;\r
 IN: http.server.auth.basic\r
 \r
-TUPLE: basic-auth responder realm provider ;\r
+TUPLE: basic-auth < filter-responder realm provider ;\r
 \r
 C: <basic-auth> basic-auth\r
 \r
@@ -36,6 +36,6 @@ C: <basic-auth> basic-auth
 : logged-in? ( request responder -- ? )\r
     provider>> swap "authorization" header authorization-ok? ;\r
 \r
-M: basic-auth call-responder ( request path responder -- response )\r
+M: basic-auth call-responder* ( request path responder -- response )\r
     pick over logged-in?\r
-    [ responder>> call-responder ] [ 2nip realm>> <401> ] if ;\r
+    [ call-next-method ] [ 2nip realm>> <401> ] if ;\r
index 86a4e865515c6f1f33e54d32d1b50abc4a02c54e..1eaf65fa07e09d52519edf9b3457525f717db1c7 100644 (file)
@@ -4,18 +4,18 @@
 
        <t:title>Edit Profile</t:title>
 
-       <t:form action="edit-profile">
+       <t:form t:action="$login/edit-profile">
 
        <table>
        
        <tr>
                <th class="field-label">User name:</th>
-               <td><t:view component="username" /></td>
+               <td><t:view t:component="username" /></td>
        </tr>
        
        <tr>
                <th class="field-label">Real name:</th>
-               <td><t:edit component="realname" /></td>
+               <td><t:edit t:component="realname" /></td>
        </tr>
        
        <tr>
@@ -25,7 +25,7 @@
        
        <tr>
                <th class="field-label">Current password:</th>
-               <td><t:edit component="password" /></td>
+               <td><t:edit t:component="password" /></td>
        </tr>
        
        <tr>
        
        <tr>
                <th class="field-label">New password:</th>
-               <td><t:edit component="new-password" /></td>
+               <td><t:edit t:component="new-password" /></td>
        </tr>
        
        <tr>
                <th class="field-label">Verify:</th>
-               <td><t:edit component="verify-password" /></td>
+               <td><t:edit t:component="verify-password" /></td>
        </tr>
        
        <tr>
@@ -50,7 +50,7 @@
        
        <tr>
                <th class="field-label">E-mail:</th>
-               <td><t:edit component="email" /></td>
+               <td><t:edit t:component="email" /></td>
        </tr>
        
        <tr>
 
        <p>
                <input type="submit" value="Update" />
-
-               <t:if var="http.server.auth.login:login-failed?">
-                       <t:error>invalid password</t:error>
-               </t:if>
-               
-               <t:if var="http.server.auth.login:password-mismatch?">
-                       <t:error>passwords do not match</t:error>
-               </t:if>
+               <t:validation-message />
        </p>
 
        </t:form>
index b0cc0c21d10ae126e4384bc0746df23baa887d5b..9f1fe6fe77b842d0e1311872989bd11a07988888 100755 (executable)
@@ -1,18 +1,26 @@
 ! Copyright (c) 2008 Slava Pestov\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: accessors quotations assocs kernel splitting\r
-base64 io combinators sequences io.files namespaces hashtables\r
-fry io.sockets arrays threads locals qualified continuations\r
+combinators sequences namespaces hashtables sets\r
+fry arrays threads locals qualified random\r
+io\r
+io.sockets\r
+io.encodings.utf8\r
+io.encodings.string\r
+io.binary\r
+continuations\r
 destructors\r
-\r
+checksums\r
+checksums.sha2\r
 html.elements\r
 http\r
 http.server\r
 http.server.auth\r
 http.server.auth.providers\r
-http.server.auth.providers.null\r
+http.server.auth.providers.db\r
 http.server.actions\r
 http.server.components\r
+http.server.flows\r
 http.server.forms\r
 http.server.sessions\r
 http.server.boilerplate\r
@@ -22,12 +30,24 @@ http.server.validators ;
 IN: http.server.auth.login\r
 QUALIFIED: smtp\r
 \r
-SYMBOL: post-login-url\r
-SYMBOL: login-failed?\r
+TUPLE: login < dispatcher users checksum ;\r
+\r
+: users ( -- provider )\r
+    login get users>> ;\r
+\r
+: encode-password ( string salt -- bytes )\r
+    [ utf8 encode ] [ 4 >be ] bi* append\r
+    login get checksum>> checksum-bytes ;\r
 \r
-TUPLE: login < dispatcher users ;\r
+: >>encoded-password ( user string -- user )\r
+    32 random-bits [ encode-password ] keep\r
+    [ >>password ] [ >>salt ] bi* ; inline\r
 \r
-: users login get users>> ;\r
+: valid-login? ( password user -- ? )\r
+    [ salt>> encode-password ] [ password>> ] bi = ;\r
+\r
+: check-login ( password username -- user/f )\r
+    users get-user dup [ [ valid-login? ] keep and ] [ 2drop f ] if ;\r
 \r
 ! Destructor\r
 TUPLE: user-saver user ;\r
@@ -35,9 +55,7 @@ TUPLE: user-saver user ;
 C: <user-saver> user-saver\r
 \r
 M: user-saver dispose\r
-    user-profile-changed? get [\r
-        user>> users update-user\r
-    ] [ drop ] if ;\r
+    user>> dup changed?>> [ users update-user ] [ drop ] if ;\r
 \r
 : save-user-after ( user -- )\r
     <user-saver> add-always-destructor ;\r
@@ -59,9 +77,10 @@ M: user-saver dispose
             add-field ;\r
 \r
 : successful-login ( user -- response )\r
-    logged-in-user sset\r
-    post-login-url sget "" or f <permanent-redirect>\r
-    f post-login-url sset ;\r
+    username>> set-uid\r
+    "$login" end-flow ;\r
+\r
+: login-failed "invalid username or password" validation-failed-with ;\r
 \r
 :: <login-action> ( -- action )\r
     [let | form [ <login-form> ] |\r
@@ -75,13 +94,8 @@ M: user-saver dispose
 \r
                 form validate-form\r
 \r
-                "password" value "username" value\r
-                users check-login [\r
-                    successful-login\r
-                ] [\r
-                    login-failed? on\r
-                    validation-failed\r
-                ] if*\r
+                "password" value "username" value check-login\r
+                [ successful-login ] [ login-failed ] if*\r
             ] >>submit\r
     ] ;\r
 \r
@@ -103,14 +117,13 @@ M: user-saver dispose
         "email" <email> add-field\r
         "captcha" <captcha> add-field ;\r
 \r
-SYMBOL: password-mismatch?\r
-SYMBOL: user-exists?\r
+: password-mismatch "passwords do not match" validation-failed-with ;\r
+\r
+: user-exists "username taken" validation-failed-with ;\r
 \r
 : same-password-twice ( -- )\r
-    "new-password" value "verify-password" value = [ \r
-        password-mismatch? on\r
-        validation-failed\r
-    ] unless ;\r
+    "new-password" value "verify-password" value =\r
+    [ password-mismatch ] unless ;\r
 \r
 :: <register-action> ( -- action )\r
     [let | form [ <register-form> ] |\r
@@ -126,20 +139,17 @@ SYMBOL: user-exists?
 \r
                 same-password-twice\r
 \r
-                <user>\r
-                    "username" value >>username\r
+                "username" value <user>\r
                     "realname" value >>realname\r
-                    "new-password" value >>password\r
+                    "new-password" value >>encoded-password\r
                     "email" value >>email\r
+                    H{ } clone >>profile\r
 \r
-                users new-user [\r
-                    user-exists? on\r
-                    validation-failed\r
-                ] unless*\r
+                users new-user [ user-exists ] unless*\r
 \r
                 successful-login\r
 \r
-                login get default>> responder>> init-user-profile\r
+                login get init-user-profile\r
             ] >>submit\r
     ] ;\r
 \r
@@ -155,17 +165,17 @@ SYMBOL: user-exists?
         "verify-password" <password> add-field\r
         "email" <email> add-field ;\r
 \r
-SYMBOL: previous-page\r
-\r
 :: <edit-profile-action> ( -- action )\r
     [let | form [ <edit-profile-form> ] |\r
         <action>\r
             [\r
                 blank-values\r
-                logged-in-user sget\r
-                dup username>> "username" set-value\r
-                dup realname>> "realname" set-value\r
-                dup email>> "email" set-value\r
+\r
+                logged-in-user get\r
+                [ username>> "username" set-value ]\r
+                [ realname>> "realname" set-value ]\r
+                [ email>> "email" set-value ]\r
+                tri\r
             ] >>init\r
 \r
             [ form edit-form ] >>display\r
@@ -176,23 +186,26 @@ SYMBOL: previous-page
 \r
                 form validate-form\r
 \r
-                logged-in-user sget\r
+                logged-in-user get\r
 \r
-                "password" value empty? [\r
+                { "password" "new-password" "verify-password" }\r
+                [ value empty? ] all? [\r
                     same-password-twice\r
 \r
-                    "password" value uid users check-login\r
-                    [ login-failed? on validation-failed ] unless\r
+                    "password" value uid check-login\r
+                    [ login-failed ] unless\r
 \r
-                    "new-password" value >>password\r
+                    "new-password" value >>encoded-password\r
                 ] unless\r
 \r
                 "realname" value >>realname\r
                 "email" value >>email\r
 \r
-                user-profile-changed? on\r
+                t >>changed?\r
+\r
+                drop\r
 \r
-                previous-page sget f <permanent-redirect>\r
+                "$login" end-flow\r
             ] >>submit\r
     ] ;\r
 \r
@@ -314,7 +327,7 @@ SYMBOL: lost-password-from
                 "ticket" value\r
                 "username" value\r
                 users claim-ticket [\r
-                    "new-password" value >>password\r
+                    "new-password" value >>encoded-password\r
                     users update-user\r
 \r
                     "recover-4" login-template serve-template\r
@@ -328,32 +341,36 @@ SYMBOL: lost-password-from
 : <logout-action> ( -- action )\r
     <action>\r
         [\r
-            f logged-in-user sset\r
-            "login" f <permanent-redirect>\r
+            f set-uid\r
+            "$login/login" end-flow\r
         ] >>submit ;\r
 \r
 ! ! ! Authentication logic\r
 \r
-TUPLE: protected responder ;\r
+TUPLE: protected < filter-responder capabilities ;\r
 \r
 C: <protected> protected\r
 \r
 : show-login-page ( -- response )\r
-    request get request-url post-login-url sset\r
-    "login" f <permanent-redirect> ;\r
-\r
-M: protected call-responder ( path responder -- response )\r
-    logged-in-user sget dup [\r
-        save-user-after\r
-        request get request-url previous-page sset\r
-        responder>> call-responder\r
+    begin-flow\r
+    "$login/login" f <standard-redirect> ;\r
+\r
+: check-capabilities ( responder user -- ? )\r
+    [ capabilities>> ] bi@ subset? ;\r
+\r
+M: protected call-responder* ( path responder -- response )\r
+    uid dup [\r
+        users get-user 2dup check-capabilities [\r
+            [ logged-in-user set ] [ save-user-after ] bi\r
+            call-next-method\r
+        ] [\r
+            3drop show-login-page\r
+        ] if\r
     ] [\r
-        3drop\r
-        request get method>> { "GET" "HEAD" } member?\r
-        [ show-login-page ] [ <400> ] if\r
+        3drop show-login-page\r
     ] if ;\r
 \r
-M: login call-responder ( path responder -- response )\r
+M: login call-responder* ( path responder -- response )\r
     dup login set\r
     call-next-method ;\r
 \r
@@ -363,15 +380,16 @@ M: login call-responder ( path responder -- response )
 \r
 : <login> ( responder -- auth )\r
     login new-dispatcher\r
-        swap <protected> >>default\r
+        swap >>default\r
         <login-action> <login-boilerplate> "login" add-responder\r
         <logout-action> <login-boilerplate> "logout" add-responder\r
-        no-users >>users ;\r
+        users-in-db >>users\r
+        sha-256 >>checksum ;\r
 \r
 ! ! ! Configuration\r
 \r
 : allow-edit-profile ( login -- login )\r
-    <edit-profile-action> <protected> <login-boilerplate>\r
+    <edit-profile-action> <protected> <login-boilerplate>\r
         "edit-profile" add-responder ;\r
 \r
 : allow-registration ( login -- login )\r
index 2f16c09d8d91b82726abb16501f774c9e10d7d60..d0a73a4d8b07046b19660899ffbb36f41f70a93a 100644 (file)
@@ -4,18 +4,18 @@
 
        <t:title>Login</t:title>
 
-       <t:form action="login">
+       <t:form t:action="login">
 
                <table>
 
                        <tr>
                                <th class="field-label">User name:</th>
-                               <td><t:edit component="username" /></td>
+                               <td><t:edit t:component="username" /></td>
                        </tr>
 
                        <tr>
                                <th class="field-label">Password:</th>
-                               <td><t:edit component="password" /></td>
+                               <td><t:edit t:component="password" /></td>
                        </tr>
 
                </table>
                <p>
 
                        <input type="submit" value="Log in" />
+                       <t:validation-message />
 
-                       <t:if var="http.server.auth.login:login-failed?">
-                               <t:error>invalid username or password</t:error>
-                       </t:if>
                </p>
 
        </t:form>
 
        <p>
                <t:if code="http.server.auth.login:login-failed?">
-                       <t:a href="register">Register</t:a>
+                       <t:a t:href="register">Register</t:a>
                </t:if>
                |
                <t:if code="http.server.auth.login:allow-password-recovery?">
-                       <t:a href="recover-password">Recover Password</t:a>
+                       <t:a t:href="recover-password">Recover Password</t:a>
                </t:if>
        </p>
 
index dd3a60f1d1f75f435645fe18310f84de8b69d922..7c72181c10e27ff5cc8b35b4c752d3d4aff03aee 100644 (file)
@@ -6,23 +6,23 @@
 
        <p>Enter the username and e-mail address you used to register for this site, and you will receive a link for activating a new password.</p>
 
-       <t:form action="recover-password">
+       <t:form t:action="recover-password">
 
                <table>
 
                <tr>
                <th class="field-label">User name:</th>
-               <td><t:edit component="username" /></td>
+               <td><t:edit t:component="username" /></td>
                </tr>
 
                <tr>
                <th class="field-label">E-mail:</th>
-               <td><t:edit component="email" /></td>
+               <td><t:edit t:component="email" /></td>
                </tr>
 
                <tr>
                <th class="field-label">Captcha:</th>
-               <td><t:edit component="captcha" /></td>
+               <td><t:edit t:component="captcha" /></td>
                </tr>
 
                <tr>
index 115c2cea21f9d6bb511e43822f4ab2fea3658ac1..6c60b257a890bdd5fd80a677c8c8d9487435bb9c 100644 (file)
@@ -6,21 +6,21 @@
 
        <p>Choose a new password for your account.</p>
 
-       <t:form action="new-password">
+       <t:form t:action="new-password">
 
                <table>
 
-                       <t:edit component="username" />
-                       <t:edit component="ticket" />
+                       <t:edit t:component="username" />
+                       <t:edit t:component="ticket" />
 
                        <tr>
                        <th class="field-label">Password:</th>
-                       <td><t:edit component="new-password" /></td>
+                       <td><t:edit t:component="new-password" /></td>
                        </tr>
 
                        <tr>
                        <th class="field-label">Verify password:</th>
-                       <td><t:edit component="verify-password" /></td>
+                       <td><t:edit t:component="verify-password" /></td>
                        </tr>
 
                        <tr>
 
                <p>
                        <input type="submit" value="Set password" />
-
-                       <t:if var="http.server.auth.login:password-mismatch?">
-                               <t:error>passwords do not match</t:error>
-                       </t:if>
+                       <t:validation-message />
                </p>
 
        </t:form>
index 3c10869fbd3d9d380a0b7cbe6ca5505fb87689c9..f5d02fa858a073b417da3b2a7a6c505bbe54c5c1 100755 (executable)
@@ -4,6 +4,6 @@
 \r
        <t:title>Recover lost password: step 4 of 4</t:title>\r
 \r
-       <p>Your password has been reset. You may now <t:a href="login">log in</t:a>.</p>\r
+       <p>Your password has been reset. You may now <t:a t:href="login">log in</t:a>.</p>\r
 \r
 </t:chloe>\r
index 1bacf71801197156811a2a39ac68b8ab09ad8b8c..9b45a7f0876d70a7bc66286886adb903c2c71213 100644 (file)
@@ -4,18 +4,18 @@
 
        <t:title>New User Registration</t:title>
 
-       <t:form action="register">
+       <t:form t:action="register">
 
                <table>
 
                <tr>
                <th class="field-label">User name:</th>
-               <td><t:edit component="username" /></td>
+               <td><t:edit t:component="username" /></td>
                </tr>
 
                <tr>
                <th class="field-label">Real name:</th>
-               <td><t:edit component="realname" /></td>
+               <td><t:edit t:component="realname" /></td>
                </tr>
 
                <tr>
 
                <tr>
                <th class="field-label">Password:</th>
-               <td><t:edit component="new-password" /></td>
+               <td><t:edit t:component="new-password" /></td>
                </tr>
 
                <tr>
                <th class="field-label">Verify:</th>
-               <td><t:edit component="verify-password" /></td>
+               <td><t:edit t:component="verify-password" /></td>
                </tr>
 
                <tr>
@@ -40,7 +40,7 @@
 
                <tr>
                <th class="field-label">E-mail:</th>
-               <td><t:edit component="email" /></td>
+               <td><t:edit t:component="email" /></td>
                </tr>
 
                <tr>
@@ -50,7 +50,7 @@
 
                <tr>
                <th class="field-label">Captcha:</th>
-               <td><t:edit component="captcha" /></td>
+               <td><t:edit t:component="captcha" /></td>
                </tr>
 
                <tr>
                <p>
 
                        <input type="submit" value="Register" />
-
-                       <t:if var="http.server.auth.login:user-exists?">
-                               <t:error>username taken</t:error>
-                       </t:if>
-
-                       <t:if var="http.server.auth.login:password-mismatch?">
-                               <t:error>passwords do not match</t:error>
-                       </t:if>
+                       <t:validation-message />
 
                </p>
 
index a8f17d6f5dbce8cd3f0ec92005d69e2ccf5b94c0..91e802b91c1393f545d7cea6488c54aa56adc72d 100755 (executable)
@@ -1,33 +1,35 @@
 IN: http.server.auth.providers.assoc.tests\r
-USING: http.server.auth.providers \r
-http.server.auth.providers.assoc tools.test\r
-namespaces accessors kernel ;\r
+USING: http.server.actions http.server.auth.providers \r
+http.server.auth.providers.assoc http.server.auth.login\r
+tools.test namespaces accessors kernel ;\r
 \r
-<users-in-memory> "provider" set\r
+<action> <login>\r
+    <users-in-memory> >>users\r
+login set\r
 \r
 [ t ] [\r
-    <user>\r
-        "slava" >>username\r
-        "foobar" >>password\r
+    "slava" <user>\r
+        "foobar" >>encoded-password\r
         "slava@factorcode.org" >>email\r
-    "provider" get new-user\r
+        H{ } clone >>profile\r
+    users new-user\r
     username>> "slava" =\r
 ] unit-test\r
 \r
 [ f ] [\r
-    <user>\r
-        "slava" >>username\r
-    "provider" get new-user\r
+    "slava" <user>\r
+        H{ } clone >>profile\r
+    users new-user\r
 ] unit-test\r
 \r
-[ f ] [ "fdasf" "slava" "provider" get check-login >boolean ] unit-test\r
+[ f ] [ "fdasf" "slava" check-login >boolean ] unit-test\r
 \r
-[ ] [ "foobar" "slava" "provider" get check-login "user" set ] unit-test\r
+[ ] [ "foobar" "slava" check-login "user" set ] unit-test\r
 \r
 [ t ] [ "user" get >boolean ] unit-test\r
 \r
-[ ] [ "user" get "fdasf" >>password drop ] unit-test\r
+[ ] [ "user" get "fdasf" >>encoded-password drop ] unit-test\r
 \r
-[ t ] [ "fdasf" "slava" "provider" get check-login >boolean ] unit-test\r
+[ t ] [ "fdasf" "slava" check-login >boolean ] unit-test\r
 \r
-[ f ] [ "foobar" "slava" "provider" get check-login >boolean ] unit-test\r
+[ f ] [ "foobar" "slava" check-login >boolean ] unit-test\r
index 6daddac30463653a9168afebcffc529328234ed3..a6a92356b68380941f65deb45314c45c319bde57 100755 (executable)
@@ -1,41 +1,47 @@
 IN: http.server.auth.providers.db.tests\r
-USING: http.server.auth.providers\r
+USING: http.server.actions\r
+http.server.auth.login\r
+http.server.auth.providers\r
 http.server.auth.providers.db tools.test\r
 namespaces db db.sqlite db.tuples continuations\r
 io.files accessors kernel ;\r
 \r
-users-in-db "provider" set\r
+<action> <login>\r
+    users-in-db >>users\r
+login set\r
+\r
+[ "auth-test.db" temp-file delete-file ] ignore-errors\r
 \r
 "auth-test.db" temp-file sqlite-db [\r
 \r
     init-users-table\r
 \r
     [ t ] [\r
-        <user>\r
-            "slava" >>username\r
-            "foobar" >>password\r
+        "slava" <user>\r
+            "foobar" >>encoded-password\r
             "slava@factorcode.org" >>email\r
-            "provider" get new-user\r
+            H{ } clone >>profile\r
+            users new-user\r
             username>> "slava" =\r
     ] unit-test\r
 \r
     [ f ] [\r
-        <user>\r
-            "slava" >>username\r
-        "provider" get new-user\r
+        "slava" <user>\r
+            H{ } clone >>profile\r
+        users new-user\r
     ] unit-test\r
 \r
-    [ f ] [ "fdasf" "slava" "provider" get check-login >boolean ] unit-test\r
+    [ f ] [ "fdasf" "slava" check-login >boolean ] unit-test\r
 \r
-    [ ] [ "foobar" "slava" "provider" get check-login "user" set ] unit-test\r
+    [ ] [ "foobar" "slava" check-login "user" set ] unit-test\r
 \r
     [ t ] [ "user" get >boolean ] unit-test\r
 \r
-    [ ] [ "user" get "fdasf" >>password drop ] unit-test\r
+    [ ] [ "user" get "fdasf" >>encoded-password drop ] unit-test\r
 \r
-    [ ] [ "user" get "provider" get update-user ] unit-test\r
+    [ ] [ "user" get users update-user ] unit-test\r
 \r
-    [ t ] [ "fdasf" "slava" "provider" get check-login >boolean ] unit-test\r
+    [ t ] [ "fdasf" "slava" check-login >boolean ] unit-test\r
 \r
-    [ f ] [ "foobar" "slava" "provider" get check-login >boolean ] unit-test\r
+    [ f ] [ "foobar" "slava" check-login >boolean ] unit-test\r
 ] with-db\r
index deab40e8d484a313e67c7385bab701e718682be1..3ed48456090f19bad34e6888ae956c54286bfd41 100755 (executable)
@@ -7,31 +7,30 @@ IN: http.server.auth.providers.db
 
 user "USERS"
 {
-    { "username" "USERNAME" { VARCHAR 256 } +assigned-id+ }
+    { "username" "USERNAME" { VARCHAR 256 } +user-assigned-id+ }
     { "realname" "REALNAME" { VARCHAR 256 } }
-    { "password" "PASSWORD" { VARCHAR 256 } +not-null+ }
+    { "password" "PASSWORD" BLOB +not-null+ }
+    { "salt" "SALT" INTEGER +not-null+ }
     { "email" "EMAIL" { VARCHAR 256 } }
     { "ticket" "TICKET" { VARCHAR 256 } }
+    { "capabilities" "CAPABILITIES" FACTOR-BLOB }
     { "profile" "PROFILE" FACTOR-BLOB }
+    { "deleted" "DELETED" INTEGER +not-null+ }
 } define-persistent
 
 : init-users-table user ensure-table ;
 
 SINGLETON: users-in-db
 
-: find-user ( username -- user )
-    <user>
-        swap >>username
-    select-tuple ;
-
 M: users-in-db get-user
-    drop
-    find-user ;
+    drop <user> select-tuple ;
 
 M: users-in-db new-user
     drop
     [
-        dup username>> find-user [
+        user new
+            over username>> >>username
+        select-tuple [
             drop f
         ] [
             dup insert-tuple
index a867b2381e563e39093f56c4f59d59ac41b4f167..a51c4da1b926477fe2bd766cc90ad186608dc65e 100755 (executable)
@@ -1,12 +1,18 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: kernel accessors random math.parser locals\r
-sequences math crypto.sha2 ;\r
+sequences math ;\r
 IN: http.server.auth.providers\r
 \r
-TUPLE: user username realname password email ticket profile ;\r
+TUPLE: user\r
+username realname\r
+password salt\r
+email ticket capabilities profile deleted changed? ;\r
 \r
-: <user> user new H{ } clone >>profile ;\r
+: <user> ( username -- user )\r
+    user new\r
+        swap >>username\r
+        0 >>deleted ;\r
 \r
 GENERIC: get-user ( username provider -- user/f )\r
 \r
@@ -14,9 +20,6 @@ GENERIC: update-user ( user provider -- )
 \r
 GENERIC: new-user ( user provider -- user/f )\r
 \r
-: check-login ( password username provider -- user/f )\r
-    get-user dup [ [ password>> = ] keep and ] [ 2drop f ] if ;\r
-\r
 ! Password recovery support\r
 \r
 :: issue-ticket ( email username provider -- user/f )\r
index 6c62452ec295ca8a77c4bcb7adaeb1477ee9622d..e0a4037e31897cab7d51898dfec20dafe2165566 100644 (file)
@@ -1,14 +1,15 @@
 ! Copyright (c) 2008 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel namespaces boxes sequences strings
-io io.streams.string arrays
+io io.streams.string arrays locals
 html.elements
 http
 http.server
+http.server.sessions
 http.server.templating ;
 IN: http.server.boilerplate
 
-TUPLE: boilerplate responder template ;
+TUPLE: boilerplate < filter-responder template ;
 
 : <boilerplate> f boilerplate boa ;
 
@@ -46,9 +47,9 @@ SYMBOL: nested-template?
 SYMBOL: next-template
 
 : call-next-template ( -- )
-    next-template get write ;
+    next-template get write-html ;
 
-M: f call-template drop call-next-template ;
+M: f call-template* drop call-next-template ;
 
 : with-boilerplate ( body template -- )
     [
@@ -67,9 +68,10 @@ M: f call-template drop call-next-template ;
         bi*
     ] with-scope ; inline
 
-M: boilerplate call-responder
-    tuck responder>> call-responder
-    dup "content-type" header "text/html" = [
-        clone swap template>>
-        [ [ with-boilerplate ] 2curry ] curry change-body
-    ] [ nip ] if ;
+M:: boilerplate call-responder* ( path responder -- )
+    path responder call-next-method
+    dup content-type>> "text/html" = [
+        clone [| body |
+            [ body responder template>> with-boilerplate ]
+        ] change-body
+    ] when ;
index 4cad097cf501a12e046b0640a550caf8e62f30f0..31ea164a58bc3619df028c752ba664dba969bc6e 100755 (executable)
@@ -5,10 +5,12 @@ splitting kernel hashtables continuations ;
 \r
 [ 123 ] [\r
     [\r
+        init-request\r
+\r
         <request> "GET" >>method request set\r
         [\r
             exit-continuation set\r
-            "xxx"\r
+            { }\r
             <action> [ [ "hello" print 123 ] show-final ] >>display\r
             <callback-responder>\r
             call-responder\r
@@ -17,10 +19,12 @@ splitting kernel hashtables continuations ;
 ] unit-test\r
 \r
 [\r
+    init-request\r
+\r
     <action> [\r
         [\r
             "hello" print\r
-            "text/html" <content> swap '[ , write ] >>body\r
+            '[ , write ] <html-content>\r
         ] show-page\r
         "byebye" print\r
         [ 123 ] show-final\r
@@ -31,7 +35,7 @@ splitting kernel hashtables continuations ;
         [\r
             exit-continuation set\r
             <request> "GET" >>method request set\r
-            "" "r" get call-responder\r
+            { } "r" get call-responder\r
         ] callcc1\r
 \r
         body>> first\r
@@ -44,7 +48,7 @@ splitting kernel hashtables continuations ;
 \r
         [\r
             exit-continuation set\r
-            "/"\r
+            { }\r
             "r" get call-responder\r
         ] callcc1\r
 \r
@@ -57,7 +61,7 @@ splitting kernel hashtables continuations ;
 \r
         [\r
             exit-continuation set\r
-            "/"\r
+            { }\r
             "r" get call-responder\r
         ] callcc1\r
     ] unit-test\r
index 42213d015f4f796205c55e2b9078bfc46e990f87..5325ee3b55c66e50a967ad3b59358cbb369bc00f 100755 (executable)
@@ -96,7 +96,7 @@ SYMBOL: current-show
 : resuming-callback ( responder request -- id )\r
     cont-id query-param swap callbacks>> at ;\r
 \r
-M: callback-responder call-responder ( path responder -- response )\r
+M: callback-responder call-responder* ( path responder -- response )\r
     '[\r
         , ,\r
 \r
index 509943faa8fe7d0c3c7d8462ce3484d4a985c561..20eb7318d0d6fc9d6c230418dee028a36d025378 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007, 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: namespaces kernel assocs io.files combinators\r
-arrays io.launcher io http.server.static http.server\r
+USING: namespaces kernel assocs io.files io.streams.duplex\r
+combinators arrays io.launcher io http.server.static http.server\r
 http accessors sequences strings math.parser fry ;\r
 IN: http.server.cgi\r
 \r
@@ -51,9 +51,9 @@ IN: http.server.cgi
     200 >>code\r
     "CGI output follows" >>message\r
     swap '[\r
-        , stdio get swap <cgi-process> <process-stream> [\r
+        , output-stream get swap <cgi-process> <process-stream> [\r
             post? [ request get post-data>> write flush ] when\r
-            stdio get swap (stream-copy)\r
+            input-stream get swap (stream-copy)\r
         ] with-stream\r
     ] >>body ;\r
 \r
diff --git a/extra/http/server/components/code/code.factor b/extra/http/server/components/code/code.factor
new file mode 100644 (file)
index 0000000..19fc8c5
--- /dev/null
@@ -0,0 +1,20 @@
+! Copyright (C) 2008 Slava Pestov
+! See http://factorcode.org/license.txt for BSD license.
+USING: splitting kernel io sequences xmode.code2html accessors
+http.server.components html xml.entities ;
+IN: http.server.components.code
+
+TUPLE: code-renderer < text-renderer mode ;
+
+: <code-renderer> ( mode -- renderer )
+    code-renderer new-text-renderer
+        swap >>mode ;
+
+M: code-renderer render-view*
+    [
+        [ string-lines ] [ mode>> value ] bi* htmlize-lines
+    ] with-html-stream ;
+
+: <code> ( id mode -- component )
+    swap <text>
+        swap <code-renderer> >>renderer ;
index bdcdd95c715773fe93dc09dacb44b8aac4647fb8..7f2a5a9ce182928699e78cfae99324b91394b1d5 100755 (executable)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors namespaces kernel io math.parser assocs classes
 words classes.tuple arrays sequences splitting mirrors
-hashtables fry combinators continuations math
-calendar.format html.elements
+hashtables fry locals combinators continuations math
+calendar.format html html.elements xml.entities
 http.server.validators ;
 IN: http.server.components
 
@@ -18,20 +18,16 @@ TUPLE: field type ;
 
 C: <field> field
 
-M: field render-view* drop write ;
+M: field render-view*
+    drop escape-string write ;
 
 M: field render-edit*
-    <input type>> =type [ =id ] [ =name ] bi =value input/> ;
-
-: render-error ( message -- )
-    <span "error" =class span> write </span> ;
+    <input type>> =type =name =value input/> ;
 
 TUPLE: hidden < field ;
 
 : hidden ( -- renderer ) T{ hidden f "hidden" } ; inline
 
-M: hidden render-view* 2drop ;
-
 ! Component protocol
 SYMBOL: components
 
@@ -234,7 +230,7 @@ TUPLE: text-renderer rows cols ;
     text-renderer new-text-renderer ;
 
 M: text-renderer render-view*
-    drop write ;
+    drop escape-string write ;
 
 M: text-renderer render-edit*
     <textarea
@@ -243,7 +239,7 @@ M: text-renderer render-edit*
         [ =id   ]
         [ =name ] bi
     textarea>
-        write
+        escape-string write
     </textarea> ;
 
 TUPLE: text < string ;
@@ -263,7 +259,7 @@ TUPLE: html-text-renderer < text-renderer ;
     html-text-renderer new-text-renderer ;
 
 M: html-text-renderer render-view*
-    drop write ;
+    drop escape-string write ;
 
 TUPLE: html-text < text ;
 
@@ -280,6 +276,22 @@ TUPLE: date < string ;
 M: date component-string
     drop timestamp>string ;
 
+! Link components
+
+GENERIC: link-title ( obj -- string )
+GENERIC: link-href ( obj -- url )
+
+SINGLETON: link-renderer
+
+M: link-renderer render-view*
+    drop <a dup link-href =href a> link-title escape-string write </a> ;
+
+TUPLE: link < string ;
+
+: <link> ( id -- component )
+    link new-string
+        link-renderer >>renderer ;
+
 ! List components
 SYMBOL: +plain+
 SYMBOL: +ordered+
@@ -289,17 +301,20 @@ TUPLE: list-renderer component type ;
 
 C: <list-renderer> list-renderer
 
-: render-plain-list ( seq quot component -- )
-    swap '[ , @ ] each ; inline
+: render-plain-list ( seq component quot -- )
+    '[ , component>> renderer>> @ ] each ; inline
+
+: render-li-list ( seq component quot -- )
+    '[ <li> @ </li> ] render-plain-list ; inline
 
 : render-ordered-list ( seq quot component -- )
-    swap <ol> '[ <li> , @ </li> ] each </ol> ; inline
+    <ol> render-li-list </ol> ; inline
 
 : render-unordered-list ( seq quot component -- )
-    swap <ul> '[ <li> , @ </li> ] each </ul> ; inline
+    <ul> render-li-list </ul> ; inline
 
 : render-list ( value renderer quot -- )
-    swap [ component>> ] [ type>> ] bi {
+    over type>> {
         { +plain+     [ render-plain-list ] }
         { +ordered+   [ render-ordered-list ] }
         { +unordered+ [ render-unordered-list ] }
@@ -317,3 +332,70 @@ TUPLE: list < component ;
     <list-renderer> list swap new-component ;
 
 M: list component-string drop ;
+
+! Choice
+TUPLE: choice-renderer choices ;
+
+C: <choice-renderer> choice-renderer
+
+M: choice-renderer render-view*
+    drop escape-string write ;
+
+: render-option ( text selected? -- )
+    <option [ "true" =selected ] when option>
+        escape-string write
+    </option> ;
+
+: render-options ( options selected -- )
+    '[ dup , member? render-option ] each ;
+
+M: choice-renderer render-edit*
+    <select swap =name select>
+        choices>> swap 1array render-options
+    </select> ;
+
+TUPLE: choice < string ;
+
+: <choice> ( id choices -- component )
+    swap choice new-string
+        swap <choice-renderer> >>renderer ;
+
+! Menu
+TUPLE: menu-renderer choices size ;
+
+: <menu-renderer> ( choices -- renderer )
+    5 menu-renderer boa ;
+
+M:: menu-renderer render-edit* ( value id renderer -- )
+    <select
+        renderer size>> [ number>string =size ] when*
+        id =name
+        "true" =multiple
+    select>
+        renderer choices>> value render-options
+    </select> ;
+
+TUPLE: menu < string ;
+
+: <menu> ( id choices -- component )
+    swap menu new-string
+        swap <menu-renderer> >>renderer ;
+
+! Checkboxes
+TUPLE: checkbox-renderer label ;
+
+C: <checkbox-renderer> checkbox-renderer
+
+M: checkbox-renderer render-edit*
+    <input
+        "checkbox" =type
+        swap =id
+        swap [ "true" =selected ] when
+    input>
+        label>> escape-string write
+    </input> ;
+
+TUPLE: checkbox < string ;
+
+: <checkbox> ( id label -- component )
+    checkbox swap <checkbox-renderer> new-component ;
index a8d320f82f7fca8afd734aef9f8ee0777cca2407..87b7170bbfdf79dd75f4d265cadfb40f565a1c14 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Slava Pestov\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: splitting kernel io sequences farkup accessors\r
-http.server.components ;\r
+http.server.components xml.entities ;\r
 IN: http.server.components.farkup\r
 \r
 TUPLE: farkup-renderer < text-renderer ;\r
diff --git a/extra/http/server/components/inspector/inspector.factor b/extra/http/server/components/inspector/inspector.factor
new file mode 100644 (file)
index 0000000..42366b5
--- /dev/null
@@ -0,0 +1,17 @@
+! Copyright (C) 2008 Slava Pestov
+! See http://factorcode.org/license.txt for BSD license.
+USING: splitting kernel io sequences inspector accessors
+http.server.components xml.entities html ;
+IN: http.server.components.inspector
+
+SINGLETON: inspector-renderer
+
+M: inspector-renderer render-view*
+    drop [ describe ] with-html-stream ;
+
+TUPLE: inspector < component ;
+
+M: inspector component-string drop ;
+
+: <inspector> ( id -- component )
+    inspector inspector-renderer new-component ;
index 65de881adbfad022dcbde17b34b962780aefc9a9..28c1b02005ee41058f33f474a3cc19e84db06f51 100755 (executable)
@@ -18,7 +18,7 @@ IN: http.server.crud
         [ form view-form ] >>display ;
 
 : <id-redirect> ( id next -- response )
-    swap number>string "id" associate <permanent-redirect> ;
+    swap number>string "id" associate <standard-redirect> ;
 
 :: <edit-action> ( form ctor next -- action )
     <action>
@@ -51,9 +51,9 @@ IN: http.server.crud
         { { "id" [ v-number ] } } >>post-params
 
         [
-            "id" get ctor call delete-tuple
+            "id" get ctor call delete-tuples
 
-            next f <permanent-redirect>
+            next f <standard-redirect>
         ] >>submit ;
 
 :: <list-action> ( form ctor -- action )
diff --git a/extra/http/server/db/db-tests.factor b/extra/http/server/db/db-tests.factor
new file mode 100644 (file)
index 0000000..0c34745
--- /dev/null
@@ -0,0 +1,4 @@
+IN: http.server.db.tests
+USING: tools.test http.server.db ;
+
+\ <db-persistence> must-infer
index a8b929bc98c8671aadcc412c132400fd25aeb974..3d8f78fbdd6eac4192c7bbb6f5673097653a8d03 100755 (executable)
@@ -1,16 +1,17 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: db http.server kernel accessors\r
-continuations namespaces destructors ;\r
+USING: db db.pooling http.server http.server.sessions kernel\r
+accessors continuations namespaces destructors ;\r
 IN: http.server.db\r
 \r
-TUPLE: db-persistence responder db params ;\r
+TUPLE: db-persistence < filter-responder pool ;\r
 \r
-C: <db-persistence> db-persistence\r
+: <db-persistence> ( responder db params -- responder' )\r
+    <pool> db-persistence boa ;\r
 \r
-: connect-db ( db-persistence -- )\r
-    [ db>> ] [ params>> ] bi make-db db-open\r
-    [ db set ] [ add-always-destructor ] bi ;\r
-\r
-M: db-persistence call-responder\r
-    [ connect-db ] [ responder>> call-responder ] bi ;\r
+M: db-persistence call-responder*\r
+    [\r
+        pool>> [ acquire-connection ] keep\r
+        [ return-connection-later ] [ drop db set ] 2bi\r
+    ]\r
+    [ call-next-method ] bi ;\r
diff --git a/extra/http/server/flows/flows.factor b/extra/http/server/flows/flows.factor
new file mode 100644 (file)
index 0000000..7a9b362
--- /dev/null
@@ -0,0 +1,64 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors namespaces sequences arrays kernel
+assocs assocs.lib hashtables math.parser
+html.elements http http.server http.server.sessions ;
+IN: http.server.flows
+
+TUPLE: flows < filter-responder ;
+
+C: <flows> flows
+
+: begin-flow* ( -- id )
+    request get
+    [ path>> ] [ request-params ] [ method>> ] tri 3array
+    flows sget set-at-unique
+    session-changed ;
+
+: end-flow-post ( path params -- response )
+    request [
+        clone
+            "POST" >>method
+            swap >>post-data
+            swap >>path
+    ] change
+    request get path>> split-path
+    flows get responder>> call-responder ;
+
+: end-flow* ( default id -- response )
+    flows sget at
+    [ first3 "POST" = [ end-flow-post ] [ <standard-redirect> ] if ]
+    [ f <standard-redirect> ] ?if ;
+
+SYMBOL: flow-id
+
+: flow-id-key "factorflowid" ;
+
+: begin-flow ( -- )
+    begin-flow* flow-id set ;
+
+: end-flow ( default -- response )
+    flow-id get end-flow* ;
+
+: add-flow-id ( query -- query' )
+    flow-id get [ flow-id-key associate assoc-union ] when* ;
+
+: flow-form-field ( -- )
+    flow-id get [
+        <input
+            "hidden" =type
+            flow-id-key =name
+            =value
+        input/>
+    ] when* ;
+
+M: flows call-responder*
+    dup flows set
+    [ add-flow-id ] add-link-hook
+    [ flow-form-field ] add-form-hook
+    flow-id-key request get request-params at flow-id set
+    call-next-method ;
+
+M: flows init-session*
+    H{ } clone flows sset
+    call-next-method ;
index f45bf6ec65ba23dfab3f362921b61348ee786a7f..92fb25bb162ac1fb4cf8073b56f56b157705acad 100644 (file)
@@ -37,9 +37,7 @@ M: form init V{ } clone >>components ;
     ] with-form ;
 
 : <form-response> ( form template -- response )
-    [ components>> components set ]
-    [ "text/html" <content> swap >>body ]
-    bi* ;
+    [ components>> components set ] [ <html-content> ] bi* ;
 
 : view-form ( form -- response )
     dup view-template>> <form-response> ;
@@ -78,4 +76,4 @@ M: form render-view*
     dup view-template>> render-form ;
 
 M: form render-edit*
-    dup edit-template>> render-form ;
+    nip dup edit-template>> render-form ;
index 346a31f30fe383c7b10b6b9893d5d26e947196c6..a5dffbc58b394b7ff43cc9ab8adbed636fdc6c4d 100755 (executable)
@@ -1,7 +1,9 @@
 USING: http.server tools.test kernel namespaces accessors
-io http math sequences assocs ;
+io http math sequences assocs arrays classes words ;
 IN: http.server.tests
 
+\ find-responder must-infer
+
 [
     <request>
     "www.apple.com" >>host
@@ -9,6 +11,8 @@ IN: http.server.tests
     { { "a" "b" } } >>query
     request set
 
+    [ ] link-hook set
+
     [ "http://www.apple.com:80/xxx/bar?a=b" ] [ f f derive-url ] unit-test
     [ "http://www.apple.com:80/xxx/baz?a=b" ] [ "baz" f derive-url ] unit-test
     [ "http://www.apple.com:80/xxx/baz?c=d" ] [ "baz" { { "c" "d" } } derive-url ] unit-test
@@ -23,13 +27,15 @@ TUPLE: mock-responder path ;
 
 C: <mock-responder> mock-responder
 
-M: mock-responder call-responder
+M: mock-responder call-responder*
     nip
     path>> on
     "text/plain" <content> ;
 
 : check-dispatch ( tag path -- ? )
+    H{ } clone base-paths set
     over off
+    split-path
     main-responder get call-responder
     write-response get ;
 
@@ -44,11 +50,11 @@ M: mock-responder call-responder
     main-responder set
 
     [ "foo" ] [
-        "foo" main-responder get find-responder path>> nip
+        { "foo" } main-responder get find-responder path>> nip
     ] unit-test
 
     [ "bar" ] [
-        "bar" main-responder get find-responder path>> nip
+        { "bar" } main-responder get find-responder path>> nip
     ] unit-test
 
     [ t ] [ "foo" "foo" check-dispatch ] unit-test
@@ -60,14 +66,6 @@ M: mock-responder call-responder
     [ t ] [ "123" "baz/123" check-dispatch ] unit-test
     [ t ] [ "123" "baz///123" check-dispatch ] unit-test
 
-    [ t ] [
-        <request>
-        "baz" >>path
-        request set
-        "baz" main-responder get call-responder
-        dup code>> 300 399 between? >r
-        header>> "location" swap at "baz/" tail? r> and
-    ] unit-test
 ] with-scope
 
 [
@@ -77,3 +75,67 @@ M: mock-responder call-responder
 
     [ "/default" ] [ "/default" main-responder get find-responder drop ] unit-test
 ] with-scope
+
+! Make sure path for default responder isn't chopped
+TUPLE: path-check-responder ;
+
+C: <path-check-responder> path-check-responder
+
+M: path-check-responder call-responder*
+    drop
+    "text/plain" <content> swap >array >>body ;
+
+[ { "c" } ] [
+    H{ } clone base-paths set
+
+    { "b" "c" }
+    <dispatcher>
+        <dispatcher>
+            <path-check-responder> >>default
+        "b" add-responder
+    call-responder
+    body>>
+] unit-test
+
+! Test that "" dispatcher works with default>>
+[ ] [
+    <dispatcher>
+        "" <mock-responder> "" add-responder
+        "bar" <mock-responder> "bar" add-responder
+        "baz" <mock-responder> >>default
+    main-responder set
+
+    [ t ] [ "" "" check-dispatch ] unit-test
+    [ f ] [ "" "quux" check-dispatch ] unit-test
+    [ t ] [ "baz" "quux" check-dispatch ] unit-test
+    [ f ] [ "foo" "bar" check-dispatch ] unit-test
+    [ t ] [ "bar" "bar" check-dispatch ] unit-test
+    [ t ] [ "baz" "xxx" check-dispatch ] unit-test
+] unit-test
+
+TUPLE: funny-dispatcher < dispatcher ;
+
+: <funny-dispatcher> funny-dispatcher new-dispatcher ;
+
+TUPLE: base-path-check-responder ;
+
+C: <base-path-check-responder> base-path-check-responder
+
+M: base-path-check-responder call-responder*
+    2drop
+    "$funny-dispatcher" resolve-base-path
+    "text/plain" <content> swap >>body ;
+
+[ ] [
+    <dispatcher>
+        <dispatcher>
+            <funny-dispatcher>
+                <base-path-check-responder> "c" add-responder
+            "b" add-responder
+        "a" add-responder
+    main-responder set
+] unit-test
+
+[ "/a/b/" ] [
+    "a/b/c" split-path main-responder get call-responder body>>
+] unit-test
index db03645a24f78b3fb0c7bb903c0f5cc120493b92..70c1e9a1f56abf5c0d029d6a4b600836ca6a5ed2 100755 (executable)
@@ -1,16 +1,18 @@
 ! Copyright (C) 2003, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: assocs kernel namespaces io io.timeouts strings splitting
-threads http sequences prettyprint io.server logging calendar
-html.elements accessors math.parser combinators.lib
-tools.vocabs debugger html continuations random combinators
-destructors io.encodings.8-bit fry ;
+threads sequences prettyprint io.server logging calendar
+http html html.elements accessors math.parser combinators.lib
+tools.vocabs debugger continuations random combinators
+destructors io.encodings.8-bit fry classes words ;
 IN: http.server
 
-GENERIC: call-responder ( path responder -- response )
+! path is a sequence of path component strings
 
-: request-params ( -- assoc )
-    request get dup method>> {
+GENERIC: call-responder* ( path responder -- response )
+
+: request-params ( request -- assoc )
+    dup method>> {
         { "GET" [ query>> ] }
         { "HEAD" [ query>> ] }
         { "POST" [ post-data>> ] }
@@ -20,13 +22,16 @@ GENERIC: call-responder ( path responder -- response )
     <response>
         200 >>code
         "Document follows" >>message
-        swap set-content-type ;
+        swap >>content-type ;
+
+: <html-content> ( quot -- response )
+    "text/html" <content> swap >>body ;
 
 TUPLE: trivial-responder response ;
 
 C: <trivial-responder> trivial-responder
 
-M: trivial-responder call-responder nip response>> call ;
+M: trivial-responder call-responder* nip response>> call ;
 
 : trivial-response-body ( code message -- )
     <html>
@@ -36,9 +41,7 @@ M: trivial-responder call-responder nip response>> call ;
     </html> ;
 
 : <trivial-response> ( code message -- response )
-    2dup '[ , , trivial-response-body ]
-    "text/html" <content>
-        swap >>body
+    2dup '[ , , trivial-response-body ] <html-content>
         swap >>message
         swap >>code ;
 
@@ -52,27 +55,63 @@ SYMBOL: 404-responder
 
 [ <404> ] <trivial-responder> 404-responder set-global
 
+SYMBOL: base-paths
+
+: invert-slice ( slice -- slice' )
+    dup slice? [
+        [ seq>> ] [ from>> ] bi head-slice
+    ] [
+        drop { }
+    ] if ;
+
+: add-base-path ( path dispatcher -- )
+    [ invert-slice ] [ class word-name ] bi*
+    base-paths get set-at ;
+
+: call-responder ( path responder -- response )
+    [ add-base-path ] [ call-responder* ] 2bi ;
+
 SYMBOL: link-hook
 
+: add-link-hook ( quot -- )
+    link-hook [ compose ] change ; inline
+
 : modify-query ( query -- query )
-    link-hook get [ ] or call ;
+    link-hook get call ;
+
+: base-path ( string -- path )
+    dup base-paths get at
+    [ ] [ "No such responder: " swap append throw ] ?if ;
+
+: resolve-base-path ( string -- string' )
+    "$" ?head [
+        [
+            "/" split1 >r
+            base-path [ "/" % % ] each "/" %
+            r> %
+        ] "" make
+    ] when ;
 
 : link>string ( url query -- url' )
-    modify-query (link>string) ;
+    [ resolve-base-path ] [ modify-query ] bi* (link>string) ;
 
 : write-link ( url query -- )
     link>string write ;
 
 SYMBOL: form-hook
 
+: add-form-hook ( quot -- )
+    form-hook [ compose ] change ;
+
 : hidden-form-field ( -- )
-    form-hook get [ ] or call ;
+    form-hook get call ;
 
 : absolute-redirect ( to query -- url )
     #! Same host.
     request get clone
-        swap [ >>query ] when*
-        swap url-encode >>path
+    swap [ >>query ] when*
+    swap url-encode >>path
+    [ modify-query ] change-query
     request-url ;
 
 : replace-last-component ( path with -- path' )
@@ -82,13 +121,14 @@ SYMBOL: form-hook
     request get clone
     swap [ >>query ] when*
     swap [ '[ , replace-last-component ] change-path ] when*
-    dup query>> modify-query >>query
+    [ modify-query ] change-query
     request-url ;
 
 : derive-url ( to query -- url )
     {
         { [ over "http://" head? ] [ link>string ] }
         { [ over "/" head? ] [ absolute-redirect ] }
+        { [ over "$" head? ] [ >r resolve-base-path r> derive-url ] }
         [ relative-redirect ]
     } cond ;
 
@@ -103,6 +143,10 @@ SYMBOL: form-hook
 : <temporary-redirect> ( to query -- response )
     307 "Temporary Redirect" <redirect> ;
 
+: <standard-redirect> ( to query -- response )
+    request get method>> "POST" =
+    [ <permanent-redirect> ] [ <temporary-redirect> ] if ;
+
 TUPLE: dispatcher default responders ;
 
 : new-dispatcher ( class -- dispatcher )
@@ -113,23 +157,18 @@ TUPLE: dispatcher default responders ;
 : <dispatcher> ( -- dispatcher )
     dispatcher new-dispatcher ;
 
-: split-path ( path -- rest first )
-    [ CHAR: / = ] left-trim "/" split1 swap ;
-
 : find-responder ( path dispatcher -- path responder )
-    over split-path pick responders>> at*
-    [ >r >r 2drop r> r> ] [ 2drop default>> ] if ;
-
-: redirect-with-/ ( -- response )
-    request get path>> "/" append f <permanent-redirect> ;
-
-M: dispatcher call-responder ( path dispatcher -- response )
-    over [
-        find-responder call-responder
+    over empty? [
+        "" over responders>> at*
+        [ nip ] [ drop default>> ] if
     ] [
-        2drop redirect-with-/
+        over first over responders>> at*
+        [ >r drop rest-slice r> ] [ drop default>> ] if
     ] if ;
 
+M: dispatcher call-responder* ( path dispatcher -- response )
+    find-responder call-responder ;
+
 TUPLE: vhost-dispatcher default responders ;
 
 : <vhost-dispatcher> ( -- dispatcher )
@@ -139,18 +178,21 @@ TUPLE: vhost-dispatcher default responders ;
     request get host>> over responders>> at*
     [ nip ] [ drop default>> ] if ;
 
-M: vhost-dispatcher call-responder ( path dispatcher -- response )
+M: vhost-dispatcher call-responder* ( path dispatcher -- response )
     find-vhost call-responder ;
 
-: set-main ( dispatcher name -- dispatcher )
-    '[ , f <permanent-redirect> ] <trivial-responder>
-    >>default ;
-
 : add-responder ( dispatcher responder path -- dispatcher )
     pick responders>> set-at ;
 
 : add-main-responder ( dispatcher responder path -- dispatcher )
-    [ add-responder ] keep set-main ;
+    [ add-responder drop ]
+    [ drop "" add-responder drop ]
+    [ 2drop ] 3tri ;
+
+TUPLE: filter-responder responder ;
+
+M: filter-responder call-responder*
+    responder>> call-responder ;
 
 SYMBOL: main-responder
 
@@ -160,23 +202,30 @@ drop
 
 SYMBOL: development-mode
 
+: http-error. ( error -- )
+    "Internal server error" [
+        development-mode get [
+            [ print-error nl :c ] with-html-stream
+        ] [
+            500 "Internal server error"
+            trivial-response-body
+        ] if
+    ] simple-page ;
+
 : <500> ( error -- response )
     500 "Internal server error" <trivial-response>
-    swap '[
-        , "Internal server error" [
-            development-mode get [
-                [ print-error nl :c ] with-html-stream
-            ] [
-                500 "Internal server error"
-                trivial-response-body
-            ] if
-        ] simple-page
-    ] >>body ;
+    swap '[ , http-error. ] >>body ;
 
 : do-response ( response -- )
     dup write-response
     request get method>> "HEAD" =
-    [ drop ] [ write-response-body ] if ;
+    [ drop ] [
+        '[
+            , write-response-body
+        ] [
+            http-error.
+        ] recover
+    ] if ;
 
 LOG: httpd-hit NOTICE
 
@@ -190,11 +239,20 @@ SYMBOL: exit-continuation
 : with-exit-continuation ( quot -- )
     '[ exit-continuation set @ ] callcc1 exit-continuation off ;
 
+: split-path ( string -- path )
+    "/" split [ empty? not ] filter ;
+
+: init-request ( -- )
+    H{ } clone base-paths set
+    [ ] link-hook set
+    [ ] form-hook set ;
+
 : do-request ( request -- response )
     [
-        [ log-request ]
+        init-request
         [ request set ]
-        [ path>> main-responder get call-responder ] tri
+        [ log-request ]
+        [ path>> split-path main-responder get call-responder ] tri
         [ <404> ] unless*
     ] [
         [ \ do-request log-error ]
@@ -202,15 +260,13 @@ SYMBOL: exit-continuation
         bi
     ] recover ;
 
-: default-timeout 1 minutes stdio get set-timeout ;
-
 : ?refresh-all ( -- )
     development-mode get-global
     [ global [ refresh-all ] bind ] when ;
 
 : handle-client ( -- )
     [
-        default-timeout
+        1 minutes timeouts
         ?refresh-all
         read-request
         do-request
index 26e6927d7cb616aa3df7ada078fddd97723caf3a..0d98bf2150cb27da5534438200fa759b3436239e 100755 (executable)
@@ -1,12 +1,13 @@
 IN: http.server.sessions.tests\r
 USING: tools.test http http.server.sessions\r
-http.server.sessions.storage http.server.sessions.storage.assoc\r
 http.server.actions http.server math namespaces kernel accessors\r
-prettyprint io.streams.string splitting destructors sequences ;\r
+prettyprint io.streams.string io.files splitting destructors\r
+sequences db db.sqlite continuations ;\r
 \r
-[ H{ } ] [ H{ } add-session-id ] unit-test\r
-\r
-: with-session \ session swap with-variable ; inline\r
+: with-session\r
+    [\r
+        >r [ save-session-after ] [ session set ] bi r> call\r
+    ] with-destructors ; inline\r
 \r
 TUPLE: foo ;\r
 \r
@@ -14,61 +15,11 @@ C: <foo> foo
 \r
 M: foo init-session* drop 0 "x" sset ;\r
 \r
-M: foo call-responder\r
+M: foo call-responder*\r
     2drop\r
     "x" [ 1+ ] schange\r
     "text/html" <content> [ "x" sget pprint ] >>body ;\r
 \r
-[\r
-    "123" session-id set\r
-    H{ } clone session set\r
-    session-changed? off\r
-\r
-    [ H{ { "factorsessid" "123" } } ] [ H{ } add-session-id ] unit-test\r
-\r
-    [ ] [ 3 "x" sset ] unit-test\r
-    \r
-    [ 9 ] [ "x" sget sq ] unit-test\r
-    \r
-    [ ] [ "x" [ 1- ] schange ] unit-test\r
-    \r
-    [ 4 ] [ "x" sget sq ] unit-test\r
-\r
-    [ t ] [ session-changed? get ] unit-test\r
-] with-scope\r
-\r
-[ t ] [ f <url-sessions> url-sessions? ] unit-test\r
-[ t ] [ f <cookie-sessions> cookie-sessions? ] unit-test\r
-\r
-[ ] [\r
-    <foo> <url-sessions>\r
-        <sessions-in-memory> >>sessions\r
-    "manager" set\r
-] unit-test\r
-\r
-[ { 5 0 } ] [\r
-    [\r
-        "manager" get begin-session drop\r
-        dup "manager" get sessions>> get-session [ 5 "a" sset ] with-session\r
-        dup "manager" get sessions>> get-session [ "a" sget , ] with-session\r
-        dup "manager" get sessions>> get-session [ "x" sget , ] with-session\r
-        "manager" get sessions>> get-session\r
-        "manager" get sessions>> delete-session\r
-    ] { } make\r
-] unit-test\r
-\r
-[ ] [\r
-    <request>\r
-        "GET" >>method\r
-    request set\r
-    "/etc" "manager" get call-responder\r
-    response set\r
-] unit-test\r
-\r
-[ 307 ] [ response get code>> ] unit-test\r
-\r
-[ ] [ response get "location" header "=" split1 nip "id" set ] unit-test\r
-\r
 : url-responder-mock-test\r
     [\r
         <request>\r
@@ -76,70 +27,124 @@ M: foo call-responder
             "id" get session-id-key set-query-param\r
             "/" >>path\r
         request set\r
-        "/" "manager" get call-responder\r
+        { } sessions get call-responder\r
         [ write-response-body drop ] with-string-writer\r
     ] with-destructors ;\r
 \r
-[ "1" ] [ url-responder-mock-test ] unit-test\r
-[ "2" ] [ url-responder-mock-test ] unit-test\r
-[ "3" ] [ url-responder-mock-test ] unit-test\r
-[ "4" ] [ url-responder-mock-test ] unit-test\r
-\r
-[ ] [\r
-    <foo> <cookie-sessions>\r
-        <sessions-in-memory> >>sessions\r
-    "manager" set\r
-] unit-test\r
-\r
-[\r
-    <request>\r
-    "GET" >>method\r
-    "/" >>path\r
-    request set\r
-    "/etc" "manager" get call-responder response set\r
-    [ "1" ] [ [ response get write-response-body drop ] with-string-writer ] unit-test\r
-    response get\r
-] with-destructors\r
-response set\r
-\r
-[ ] [ response get cookies>> "cookies" set ] unit-test\r
-\r
-: cookie-responder-mock-test\r
+: sessions-mock-test\r
     [\r
         <request>\r
             "GET" >>method\r
             "cookies" get >>cookies\r
             "/" >>path\r
         request set\r
-        "/" "manager" get call-responder\r
+        { } sessions get call-responder\r
         [ write-response-body drop ] with-string-writer\r
     ] with-destructors ;\r
 \r
-[ "2" ] [ cookie-responder-mock-test ] unit-test\r
-[ "3" ] [ cookie-responder-mock-test ] unit-test\r
-[ "4" ] [ cookie-responder-mock-test ] unit-test\r
-\r
 : <exiting-action>\r
     <action>\r
         [\r
             "text/plain" <content> exit-with\r
         ] >>display ;\r
 \r
-[\r
+[ "auth-test.db" temp-file sqlite-db delete-file ] ignore-errors\r
+\r
+"auth-test.db" temp-file sqlite-db [\r
+\r
+    init-request\r
+    init-sessions-table\r
+\r
     [ ] [\r
-        <request>\r
-            "GET" >>method\r
-            "id" get session-id-key set-query-param\r
-            "/" >>path\r
-        request set\r
+        <foo> <sessions>\r
+        sessions set\r
+    ] unit-test\r
 \r
+    [\r
+        [ ] [\r
+            empty-session\r
+                123 >>id session set\r
+        ] unit-test\r
+\r
+        [ ] [ 3 "x" sset ] unit-test\r
+\r
+        [ 9 ] [ "x" sget sq ] unit-test\r
+\r
+        [ ] [ "x" [ 1- ] schange ] unit-test\r
+\r
+        [ 4 ] [ "x" sget sq ] unit-test\r
+\r
+        [ t ] [ session get changed?>> ] unit-test\r
+    ] with-scope\r
+\r
+    [ t ] [\r
+        begin-session id>>\r
+        get-session session?\r
+    ] unit-test\r
+\r
+    [ { 5 0 } ] [\r
+        [\r
+            begin-session\r
+            dup [ 5 "a" sset ] with-session\r
+            dup [ "a" sget , ] with-session\r
+            dup [ "x" sget , ] with-session\r
+            drop\r
+        ] { } make\r
+    ] unit-test\r
+\r
+    [ 0 ] [\r
+        begin-session id>>\r
+        get-session [ "x" sget ] with-session\r
+    ] unit-test\r
+\r
+    [ { 5 0 } ] [\r
         [\r
-            "/" <exiting-action> <cookie-sessions>\r
-            call-responder\r
-        ] with-destructors response set\r
+            begin-session id>>\r
+            dup get-session [ 5 "a" sset ] with-session\r
+            dup get-session [ "a" sget , ] with-session\r
+            dup get-session [ "x" sget , ] with-session\r
+            drop\r
+        ] { } make\r
+    ] unit-test\r
+\r
+    [ ] [\r
+        <foo> <sessions>\r
+        sessions set\r
     ] unit-test\r
 \r
-    [ "text/plain" ] [ response get "content-type" header ] unit-test\r
+    [\r
+        <request>\r
+        "GET" >>method\r
+        "/" >>path\r
+        request set\r
+        { "etc" } sessions get call-responder response set\r
+        [ "1" ] [ [ response get write-response-body drop ] with-string-writer ] unit-test\r
+        response get\r
+    ] with-destructors\r
+    response set\r
+\r
+    [ ] [ response get cookies>> "cookies" set ] unit-test\r
+\r
+    [ "2" ] [ sessions-mock-test ] unit-test\r
+    [ "3" ] [ sessions-mock-test ] unit-test\r
+    [ "4" ] [ sessions-mock-test ] unit-test\r
 \r
-    [ f ] [ response get cookies>> empty? ] unit-test\r
-] with-scope\r
+    [\r
+        [ ] [\r
+            <request>\r
+                "GET" >>method\r
+                "id" get session-id-key set-query-param\r
+                "/" >>path\r
+            request set\r
+\r
+            [\r
+                { } <exiting-action> <sessions>\r
+                call-responder\r
+            ] with-destructors response set\r
+        ] unit-test\r
+\r
+        [ "text/plain" ] [ response get content-type>> ] unit-test\r
+\r
+        [ f ] [ response get cookies>> empty? ] unit-test\r
+    ] with-scope\r
+] with-db\r
index 9e4f5385831cd6f10898232e6555e9d923b5e69e..fe32327c2416f95564c62b7a7947acd54da9aabc 100755 (executable)
 ! Copyright (C) 2008 Doug Coleman, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: assocs calendar kernel math.parser namespaces random
-accessors http http.server
-http.server.sessions.storage http.server.sessions.storage.assoc
-quotations hashtables sequences fry html.elements symbols
-continuations destructors ;
+USING: assocs kernel math.intervals math.parser namespaces
+random accessors quotations hashtables sequences continuations
+fry calendar combinators destructors alarms
+db db.tuples db.types
+http http.server html.elements ;
 IN: http.server.sessions
 
-! ! ! ! ! !
-! WARNING: this session manager is vulnerable to XSRF attacks
-! ! ! ! ! !
+TUPLE: session id expires uid namespace changed? ;
+
+: <session> ( id -- session )
+    session new
+        swap >>id ;
+
+session "SESSIONS"
+{
+    { "id" "ID" +random-id+ system-random-generator }
+    { "expires" "EXPIRES" TIMESTAMP +not-null+ }
+    { "uid" "UID" { VARCHAR 255 } }
+    { "namespace" "NAMESPACE" FACTOR-BLOB }
+} define-persistent
+
+: get-session ( id -- session )
+    dup [ <session> select-tuple ] when ;
+
+: init-sessions-table session ensure-table ;
+
+: start-expiring-sessions ( db seq -- )
+    '[
+        , , [
+            session new
+                -1.0/0.0 now [a,b] >>expires
+            delete-tuples
+        ] with-db
+    ] 5 minutes every drop ;
 
 GENERIC: init-session* ( responder -- )
 
 M: object init-session* drop ;
 
-TUPLE: session-manager responder sessions ;
+M: dispatcher init-session* default>> init-session* ;
 
-: new-session-manager ( responder class -- responder' )
-    new
-        <sessions-in-memory> >>sessions
-        swap >>responder ; inline
+M: filter-responder init-session* responder>> init-session* ;
 
-SYMBOLS: session session-id session-changed? ;
+TUPLE: sessions < filter-responder timeout domain ;
+
+: <sessions> ( responder -- responder' )
+    sessions new
+        swap >>responder
+        20 minutes >>timeout ;
+
+: (session-changed) ( session -- )
+    t >>changed? drop ;
+
+: session-changed ( -- )
+    session get (session-changed) ;
 
 : sget ( key -- value )
-    session get at ;
+    session get namespace>> at ;
 
 : sset ( value key -- )
-    session get set-at
-    session-changed? on ;
+    session get
+    [ namespace>> set-at ] [ (session-changed) ] bi ;
 
 : schange ( key quot -- )
-    session get swap change-at
-    session-changed? on ; inline
+    session get
+    [ namespace>> swap change-at ] keep
+    (session-changed) ; inline
+
+: uid ( -- uid )
+    session get uid>> ;
+
+: set-uid ( uid -- )
+    session get [ (>>uid) ] [ (session-changed) ] bi ;
 
-: sessions session-manager get sessions>> ;
+: init-session ( session -- )
+    session [ sessions get init-session* ] with-variable ;
 
-: managed-responder session-manager get responder>> ;
+: cutoff-time ( -- time )
+    sessions get timeout>> from-now ;
 
-: init-session ( managed -- session )
-    H{ } clone [ session [ init-session* ] with-variable ] keep ;
+: touch-session ( session -- )
+    cutoff-time >>expires drop ;
 
-: begin-session ( responder -- id session )
-    [ responder>> init-session ] [ sessions>> ] bi
-    [ new-session ] [ drop ] 2bi ;
+: empty-session ( -- session )
+    f <session>
+        H{ } clone >>namespace
+        dup touch-session ;
+
+: begin-session ( -- session )
+    empty-session [ init-session ] [ insert-tuple ] [ ] tri ;
 
 ! Destructor
-TUPLE: session-saver id session ;
+TUPLE: session-saver session ;
 
 C: <session-saver> session-saver
 
 M: session-saver dispose
-    session-changed? get [
-        [ session>> ] [ id>> ] bi
-        sessions update-session
+    session>> dup changed?>> [
+        [ touch-session ] [ update-tuple ] bi
     ] [ drop ] if ;
 
-: save-session-after ( id session -- )
+: save-session-after ( session -- )
     <session-saver> add-always-destructor ;
 
-: call-responder/session ( path responder id session -- response )
-    [ save-session-after ]
-    [ [ session-id set ] [ session set ] bi* ] 2bi
-    [ session-manager set ] [ responder>> call-responder ] bi ;
+: existing-session ( path session -- response )
+    [ session set ] [ save-session-after ] bi
+    sessions get responder>> call-responder ;
 
-TUPLE: null-sessions < session-manager ;
+: session-id-key "factorsessid" ;
 
-: <null-sessions>
-    null-sessions new-session-manager ;
+: cookie-session-id ( request -- id/f )
+    session-id-key get-cookie
+    dup [ value>> string>number ] when ;
 
-M: null-sessions call-responder ( path responder -- response )
-    H{ } clone f call-responder/session ;
+: post-session-id ( request -- id/f )
+    session-id-key swap post-data>> at string>number ;
 
-TUPLE: url-sessions < session-manager ;
+: request-session-id ( -- id/f )
+    request get dup method>> {
+        { "GET" [ cookie-session-id ] }
+        { "HEAD" [ cookie-session-id ] }
+        { "POST" [ post-session-id ] }
+    } case ;
 
-: <url-sessions> ( responder -- responder' )
-    url-sessions new-session-manager ;
+: request-session ( -- session/f )
+    request-session-id get-session ;
 
-: session-id-key "factorsessid" ;
-
-: current-url-session ( responder -- id/f session/f )
-    [ request-params session-id-key swap at ] [ sessions>> ] bi*
-    [ drop ] [ get-session ] 2bi ;
+: <session-cookie> ( id -- cookie )
+    session-id-key <cookie>
+        "$sessions" resolve-base-path >>path
+        sessions get timeout>> from-now >>expires
+        sessions get domain>> >>domain ;
 
-: add-session-id ( query -- query' )
-    session-id get [ session-id-key associate assoc-union ] when* ;
+: put-session-cookie ( response -- response' )
+    session get id>> number>string <session-cookie> put-cookie ;
 
 : session-form-field ( -- )
     <input
         "hidden" =type
-        session-id-key =id
         session-id-key =name
-        session-id get =value
+        session get id>> number>string =value
     input/> ;
 
-: new-url-session ( responder -- response )
-    [ f ] [ begin-session drop session-id-key associate ] bi*
-    <temporary-redirect> ;
+M: sessions call-responder* ( path responder -- response )
+    [ session-form-field ] add-form-hook
+    sessions set
+    request-session [ begin-session ] unless*
+    existing-session put-session-cookie ;
 
-M: url-sessions call-responder ( path responder -- response )
-    [ add-session-id ] link-hook set
-    [ session-form-field ] form-hook set
-    dup current-url-session dup [
-        call-responder/session
-    ] [
-        2drop nip new-url-session
-    ] if ;
-
-TUPLE: cookie-sessions < session-manager ;
-
-: <cookie-sessions> ( responder -- responder' )
-    cookie-sessions new-session-manager ;
-
-: current-cookie-session ( responder -- id namespace/f )
-    request get session-id-key get-cookie dup
-    [ value>> dup rot sessions>> get-session ] [ 2drop f f ] if ;
-
-: <session-cookie> ( id -- cookie )
-    session-id-key <cookie> ;
-
-: call-responder/new-session ( path responder -- response )
-    dup begin-session
-    [ call-responder/session ]
-    [ drop <session-cookie> ] 2bi
-    put-cookie ;
-
-M: cookie-sessions call-responder ( path responder -- response )
-    dup current-cookie-session dup [
-        call-responder/session
-    ] [
-        2drop call-responder/new-session
-    ] if ;
+: logout-all-sessions ( uid -- )
+    session new swap >>uid delete-tuples ;
diff --git a/extra/http/server/sessions/storage/assoc/assoc.factor b/extra/http/server/sessions/storage/assoc/assoc.factor
deleted file mode 100755 (executable)
index 6e4a84d..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-! Copyright (C) 2008 Slava Pestov.\r
-! See http://factorcode.org/license.txt for BSD license.\r
-USING: assocs assocs.lib accessors http.server.sessions.storage\r
-alarms kernel fry http.server ;\r
-IN: http.server.sessions.storage.assoc\r
-\r
-TUPLE: sessions-in-memory sessions alarms ;\r
-\r
-: <sessions-in-memory> ( -- storage )\r
-    H{ } clone H{ } clone sessions-in-memory boa ;\r
-\r
-: cancel-session-timeout ( id storage -- )\r
-    alarms>> at [ cancel-alarm ] when* ;\r
-\r
-: touch-session ( id storage -- )\r
-    [ cancel-session-timeout ]\r
-    [ '[ , , delete-session ] timeout later ]\r
-    [ alarms>> set-at ]\r
-    2tri ;\r
-\r
-M: sessions-in-memory get-session ( id storage -- namespace )\r
-    [ sessions>> at ] [ touch-session ] 2bi ;\r
-\r
-M: sessions-in-memory update-session ( namespace id storage -- )\r
-    [ sessions>> set-at ]\r
-    [ touch-session ]\r
-    2bi ;\r
-\r
-M: sessions-in-memory delete-session ( id storage -- )\r
-    [ sessions>> delete-at ]\r
-    [ cancel-session-timeout ]\r
-    2bi ;\r
-\r
-M: sessions-in-memory new-session ( namespace storage -- id )\r
-    [ sessions>> set-at-unique ]\r
-    [ [ touch-session ] [ drop ] 2bi ]\r
-    bi ;\r
diff --git a/extra/http/server/sessions/storage/db/db-tests.factor b/extra/http/server/sessions/storage/db/db-tests.factor
deleted file mode 100755 (executable)
index 4e6ae8a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-IN: http.server.sessions.storage.db\r
-USING: http.server.sessions.storage\r
-http.server.sessions.storage.db namespaces io.files\r
-db.sqlite db accessors math tools.test kernel assocs\r
-sequences ;\r
-\r
-sessions-in-db "storage" set\r
-\r
-"auth-test.db" temp-file sqlite-db [\r
-    [ ] [ init-sessions-table ] unit-test\r
-\r
-    [ f ] [ H{ } "storage" get new-session empty? ] unit-test\r
-\r
-    H{ } "storage" get new-session "id" set\r
-\r
-    "id" get "storage" get get-session "session" set\r
-    "a" "b" "session" get set-at\r
-\r
-    "session" get "id" get "storage" get update-session\r
-\r
-    [ H{ { "b" "a" } } ] [\r
-        "id" get "storage" get get-session\r
-    ] unit-test\r
-] with-db\r
diff --git a/extra/http/server/sessions/storage/db/db.factor b/extra/http/server/sessions/storage/db/db.factor
deleted file mode 100755 (executable)
index 0245db1..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-! Copyright (C) 2008 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: assocs accessors http.server.sessions.storage
-alarms kernel http.server db.tuples db.types math.parser
-classes.singleton ;
-IN: http.server.sessions.storage.db
-
-SINGLETON: sessions-in-db
-
-TUPLE: session id namespace ;
-
-session "SESSIONS"
-{
-    { "id" "ID" INTEGER +native-id+ }
-    { "namespace" "NAMESPACE" FACTOR-BLOB }
-} define-persistent
-
-: init-sessions-table session ensure-table ;
-
-: <session> ( id -- session )
-    session new
-        swap dup [ string>number ] when >>id ;
-
-M: sessions-in-db get-session ( id storage -- namespace/f )
-    drop
-    dup [
-        <session>
-        select-tuple dup [ namespace>> ] when
-    ] when ;
-
-M: sessions-in-db update-session ( namespace id storage -- )
-    drop
-    <session>
-        swap >>namespace
-    update-tuple ;
-
-M: sessions-in-db delete-session ( id storage -- )
-    drop
-    <session>
-    delete-tuple ;
-
-M: sessions-in-db new-session ( namespace storage -- id )
-    drop
-    f <session>
-        swap >>namespace
-    [ insert-tuple ] [ id>> number>string ] bi ;
diff --git a/extra/http/server/sessions/storage/storage.factor b/extra/http/server/sessions/storage/storage.factor
deleted file mode 100755 (executable)
index df96c81..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-! Copyright (C) 2008 Slava Pestov.\r
-! See http://factorcode.org/license.txt for BSD license.\r
-USING: calendar ;\r
-IN: http.server.sessions.storage\r
-\r
-: timeout 20 minutes ;\r
-\r
-GENERIC: get-session ( id storage -- namespace )\r
-\r
-GENERIC: update-session ( namespace id storage -- )\r
-\r
-GENERIC: delete-session ( id storage -- )\r
-\r
-GENERIC: new-session ( namespace storage -- id )\r
index 2d4a97c3c062276a74befd917d41e3612e12a3c5..b9a8e9d46ee2f493e579ccdc4fa48ae423543789 100755 (executable)
@@ -1,41 +1,47 @@
 ! Copyright (C) 2004, 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: calendar html io io.files kernel math math.parser http\r
-http.server namespaces parser sequences strings assocs\r
-hashtables debugger http.mime sorting html.elements logging\r
-calendar.format accessors io.encodings.binary fry ;\r
+USING: calendar html io io.files kernel math math.order\r
+math.parser http http.server namespaces parser sequences strings\r
+assocs hashtables debugger http.mime sorting html.elements\r
+logging calendar.format accessors io.encodings.binary fry ;\r
 IN: http.server.static\r
 \r
 ! special maps mime types to quots with effect ( path -- )\r
-TUPLE: file-responder root hook special ;\r
+TUPLE: file-responder root hook special allow-listings ;\r
 \r
-: file-http-date ( filename -- string )\r
-    file-info modified>> timestamp>http-string ;\r
-\r
-: last-modified-matches? ( filename -- ? )\r
-    file-http-date dup [\r
-        request get "if-modified-since" header =\r
-    ] when ;\r
+: modified-since? ( filename -- ? )\r
+    request get "if-modified-since" header dup [\r
+        [ file-info modified>> ] [ rfc822>timestamp ] bi* after?\r
+    ] [\r
+        2drop t\r
+    ] if ;\r
 \r
 : <304> ( -- response )\r
     304 "Not modified" <trivial-response> ;\r
 \r
+: <403> ( -- response )\r
+    403 "Forbidden" <trivial-response> ;\r
+\r
 : <file-responder> ( root hook -- responder )\r
-    H{ } clone file-responder boa ;\r
+    file-responder new\r
+        swap >>hook\r
+        swap >>root\r
+        H{ } clone >>special ;\r
 \r
 : <static> ( root -- responder )\r
     [\r
         <content>\r
-        swap\r
-        [ file-info size>> "content-length" set-header ]\r
-        [ file-http-date "last-modified" set-header ]\r
-        [ '[ , binary <file-reader> stdio get stream-copy ] >>body ]\r
-        tri\r
+        swap [\r
+            file-info\r
+            [ size>> "content-length" set-header ]\r
+            [ modified>> "last-modified" set-header ] bi\r
+        ]\r
+        [ '[ , binary <file-reader> output-stream get stream-copy ] >>body ] bi\r
     ] <file-responder> ;\r
 \r
 : serve-static ( filename mime-type -- response )\r
-    over last-modified-matches?\r
-    [ 2drop <304> ] [ file-responder get hook>> call ] if ;\r
+    over modified-since?\r
+    [ file-responder get hook>> call ] [ 2drop <304> ] if ;\r
 \r
 : serving-path ( filename -- filename )\r
     file-responder get root>> right-trim-separators\r
@@ -65,36 +71,31 @@ TUPLE: file-responder root hook special ;
     ] simple-html-document ;\r
 \r
 : list-directory ( directory -- response )\r
-    "text/html" <content>\r
-    swap '[ , directory. ] >>body ;\r
+    file-responder get allow-listings>> [\r
+        '[ , directory. ] <html-content>\r
+    ] [\r
+        drop <403>\r
+    ] if ;\r
 \r
 : find-index ( filename -- path )\r
-    { "index.html" "index.fhtml" } [ append-path ] with map\r
-    [ exists? ] find nip ;\r
+    "index.html" append-path dup exists? [ drop f ] unless ;\r
 \r
 : serve-directory ( filename -- response )\r
-    dup "/" tail? [\r
-        dup find-index\r
-        [ serve-file ] [ list-directory ] ?if\r
+    request get path>> "/" tail? [\r
+        dup\r
+        find-index [ serve-file ] [ list-directory ] ?if\r
     ] [\r
-        drop request get redirect-with-/\r
+        drop\r
+        request get path>> "/" append f <standard-redirect>\r
     ] if ;\r
 \r
 : serve-object ( filename -- response )\r
-    serving-path dup exists? [\r
-        dup directory? [ serve-directory ] [ serve-file ] if\r
-    ] [\r
-        drop <404>\r
-    ] if ;\r
+    serving-path dup exists?\r
+    [ dup directory? [ serve-directory ] [ serve-file ] if ]\r
+    [ drop <404> ]\r
+    if ;\r
 \r
-M: file-responder call-responder ( path responder -- response )\r
+M: file-responder call-responder* ( path responder -- response )\r
     file-responder set\r
-    dup [\r
-        ".." over subseq? [\r
-            drop <400>\r
-        ] [\r
-            serve-object\r
-        ] if\r
-    ] [\r
-        drop redirect-with-/\r
-    ] if ;\r
+    ".." over member?\r
+    [ drop <400> ] [ "/" join serve-object ] if ;\r
index f517af4a12f7d0cd72d95b89b456b549bba9bbc1..61f72a2f149d9179f3e0c22459965f5d0e388568 100644 (file)
@@ -4,14 +4,6 @@ io.streams.string kernel sequences ascii boxes namespaces xml
 splitting ;
 IN: http.server.templating.chloe.tests
 
-[ "foo" ]
-[ "<a href=\"foo\">blah</a>" string>xml "href" required-attr ]
-unit-test
-
-[ "<a name=\"foo\">blah</a>" string>xml "href" required-attr ]
-[ "href attribute is required" = ]
-must-fail-with
-
 [ f ] [ f parse-query-attr ] unit-test
 
 [ f ] [ "" parse-query-attr ] unit-test
@@ -30,7 +22,7 @@ must-fail-with
 ] unit-test
 
 : run-template
-    with-string-writer [ "\r\n\t" member? not ] subset
+    with-string-writer [ "\r\n\t" member? not ] filter
     "?>" split1 nip ; inline
 
 : test-template ( name -- template )
index 8142c5e3b77d453ad5a3ec07e12bd9be0955a86d..c3d93f59099a202ea9f188fb48e39ef95fe87d4d 100644 (file)
@@ -1,9 +1,14 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel sequences combinators kernel namespaces
-classes.tuple assocs splitting words arrays
-io io.files io.encodings.utf8 html.elements unicode.case
-tuple-syntax xml xml.data xml.writer xml.utilities
+classes.tuple assocs splitting words arrays memoize
+io io.files io.encodings.utf8 io.streams.string
+unicode.case tuple-syntax html html.elements
+multiline xml xml.data xml.writer xml.utilities
 http.server
 http.server.auth
+http.server.flows
+http.server.actions
 http.server.components
 http.server.sessions
 http.server.templating
@@ -18,23 +23,40 @@ C: <chloe> chloe
 
 DEFER: process-template
 
-: chloe-ns TUPLE{ name url: "http://factorcode.org/chloe/1.0" } ;
+: chloe-ns "http://factorcode.org/chloe/1.0" ; inline
+
+: chloe-attrs-only ( assoc -- assoc' )
+    [ drop name-url chloe-ns = ] assoc-filter ;
+
+: non-chloe-attrs-only ( assoc -- assoc' )
+    [ drop name-url chloe-ns = not ] assoc-filter ;
 
 : chloe-tag? ( tag -- ? )
     {
         { [ dup tag? not ] [ f ] }
-        { [ dup chloe-ns names-match? not ] [ f ] }
+        { [ dup url>> chloe-ns = not ] [ f ] }
         [ t ]
     } cond nip ;
 
 SYMBOL: tags
 
+MEMO: chloe-name ( string -- name )
+    name new
+        swap >>tag
+        chloe-ns >>url ;
+
 : required-attr ( tag name -- value )
-    dup rot at*
+    dup chloe-name rot at*
     [ nip ] [ drop " attribute is required" append throw ] if ;
 
 : optional-attr ( tag name -- value )
-    swap at ;
+    chloe-name swap at ;
+
+: children>string ( tag -- string )
+    [ [ process-template ] each ] with-string-writer ;
+
+: title-tag ( tag -- )
+    children>string set-title ;
 
 : write-title-tag ( tag -- )
     drop
@@ -83,14 +105,33 @@ SYMBOL: tags
     dup empty?
     [ drop f ] [ "," split [ dup value ] H{ } map>assoc ] if ;
 
+: flow-attr ( tag -- )
+    "flow" optional-attr {
+        { "none" [ flow-id off ] }
+        { "begin" [ begin-flow ] }
+        { "current" [ ] }
+        { f [ ] }
+    } case ;
+
+: session-attr ( tag -- )
+    "session" optional-attr {
+        { "none" [ session off flow-id off ] }
+        { "current" [ ] }
+        { f [ ] }
+    } case ;
+
 : a-start-tag ( tag -- )
-    <a
-    dup "value" optional-attr [ value f ] [
-        [ "href" required-attr ]
-        [ "query" optional-attr parse-query-attr ]
-        bi
-    ] ?if link>string =href
-    a> ;
+    [
+        <a
+        dup flow-attr
+        dup session-attr
+        dup "value" optional-attr [ value f ] [
+            [ "href" required-attr ]
+            [ "query" optional-attr parse-query-attr ]
+            bi
+        ] ?if link>string =href
+        a>
+    ] with-scope ;
 
 : process-tag-children ( tag -- )
     [ process-template ] each ;
@@ -102,11 +143,22 @@ SYMBOL: tags
     tri ;
 
 : form-start-tag ( tag -- )
-    <form
-    "POST" =method
-    tag-attrs print-attrs
-    form>
-    hidden-form-field ;
+    [
+        [
+            <form
+            "POST" =method
+            {
+                [ flow-attr ]
+                [ session-attr ]
+                [ "action" required-attr resolve-base-path =action ]
+                [ tag-attrs non-chloe-attrs-only print-attrs ]
+            } cleave
+            form>
+        ] [
+            hidden-form-field
+            "for" optional-attr [ component render-edit ] when*
+        ] bi
+    ] with-scope ;
 
 : form-tag ( tag -- )
     [ form-start-tag ]
@@ -114,6 +166,26 @@ SYMBOL: tags
     [ drop </form> ]
     tri ;
 
+DEFER: process-chloe-tag
+
+STRING: button-tag-markup
+<t:form class="inline" xmlns:t="http://factorcode.org/chloe/1.0">
+    <button type="submit"></button>
+</t:form>
+;
+
+: add-tag-attrs ( attrs tag -- )
+    tag-attrs swap update ;
+
+: button-tag ( tag -- )
+    button-tag-markup string>xml delegate
+    {
+        [ >r tag-attrs chloe-attrs-only r> add-tag-attrs ]
+        [ >r tag-attrs non-chloe-attrs-only r> "button" tag-named add-tag-attrs ]
+        [ >r children>string 1array r> "button" tag-named set-tag-children ]
+        [ nip ]
+    } 2cleave process-chloe-tag ;
+
 : attr>word ( value -- word/f )
     dup ":" split1 swap lookup
     [ ] [ "No such word: " swap append throw ] ?if ;
@@ -124,23 +196,25 @@ SYMBOL: tags
     ] unless ;
 
 : if-satisfied? ( tag -- ? )
+    t swap
     {
-        [ "code" optional-attr [ attr>word execute ] [ t ] if* ]
-        [  "var" optional-attr [ attr>var      get ] [ t ] if* ]
-        [ "svar" optional-attr [ attr>var     sget ] [ t ] if* ]
-        [ "uvar" optional-attr [ attr>var     uget ] [ t ] if* ]
-    } cleave 4array [ ] all? ;
+        [ "code"  optional-attr [ attr>word execute and ] when* ]
+        [  "var"  optional-attr [ attr>var      get and ] when* ]
+        [ "svar"  optional-attr [ attr>var     sget and ] when* ]
+        [ "uvar"  optional-attr [ attr>var     uget and ] when* ]
+        [ "value" optional-attr [ value             and ] when* ]
+    } cleave ;
 
 : if-tag ( tag -- )
     dup if-satisfied? [ process-tag-children ] [ drop ] if ;
 
-: error-tag ( tag -- )
+: error-message-tag ( tag -- )
     children>string render-error ;
 
 : process-chloe-tag ( tag -- )
     dup name-tag {
         { "chloe" [ [ process-template ] each ] }
-        { "title" [ children>string set-title ] }
+        { "title" [ title-tag ] }
         { "write-title" [ write-title-tag ] }
         { "style" [ style-tag ] }
         { "write-style" [ write-style-tag ] }
@@ -151,8 +225,11 @@ SYMBOL: tags
         { "summary" [ summary-tag ] }
         { "a" [ a-tag ] }
         { "form" [ form-tag ] }
-        { "error" [ error-tag ] }
+        { "button" [ button-tag ] }
+        { "error-message" [ error-message-tag ] }
+        { "validation-message" [ drop render-validation-message ] }
         { "if" [ if-tag ] }
+        { "comment" [ drop ] }
         { "call-next-template" [ drop call-next-template ] }
         [ "Unknown chloe tag: " swap append throw ]
     } case ;
@@ -189,7 +266,7 @@ SYMBOL: tags
         ] if
     ] with-scope ;
 
-M: chloe call-template
+M: chloe call-template*
     path>> utf8 <file-reader> read-xml process-chloe ;
 
 INSTANCE: chloe template
index 0381bcc27ad8f28c8d37401231097bd6c8b14560..dd9b232d73ff53390bc1ea53e529c72e20a702e5 100644 (file)
@@ -2,7 +2,7 @@
 
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
 
-       <t:if code="http.server.templating.chloe.tests:test4-aux?">
+       <t:if t:code="http.server.templating.chloe.tests:test4-aux?">
                True
        </t:if>
 
index d74a5e5368a4c1684ab2dcb6a4e799a25218ebd2..3bd39e45bd4237e8d8d2673861ebe05abb2b97b0 100644 (file)
@@ -2,7 +2,7 @@
 
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
 
-       <t:if code="http.server.templating.chloe.tests:test5-aux?">
+       <t:if t:code="http.server.templating.chloe.tests:test5-aux?">
                True
        </t:if>
 
index 5b6a71cf6b36a93ee9fd86ce3baf0b16711ac13a..56234a5f0d7696bac485b3521c8d318b87c6e59b 100644 (file)
@@ -2,7 +2,7 @@
 
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
 
-       <t:if var="http.server.templating.chloe.tests:test6-aux?">
+       <t:if t:var="http.server.templating.chloe.tests:test6-aux?">
                True
        </t:if>
 
index 4381b5cec4e93ade1d8731444a7d8242c0bb858e..a4f8e06e7d7aa934e25c8d8ccfa93370ea44c13d 100644 (file)
@@ -2,7 +2,7 @@
 
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
 
-       <t:if var="http.server.templating.chloe.tests:test7-aux?">
+       <t:if t:var="http.server.templating.chloe.tests:test7-aux?">
                True
        </t:if>
 
index 1cba4b9b2eaf7a3d6155fd0180c4ef54087246c0..2cc053a0cabf76a121eb1d95f140da0bfe29caf7 100755 (executable)
@@ -76,7 +76,7 @@ TUPLE: fhtml path ;
 
 C: <fhtml> fhtml
 
-M: fhtml call-template ( filename -- )
+M: fhtml call-template* ( filename -- )
     '[
         , path>> [
             "quiet" on
index f69dd9bfe0acfed1e49e5733f146bf3ca87fe2e8..73f6095eae98f8f2467b6d6adbb7422bb55b859e 100644 (file)
@@ -1,10 +1,21 @@
-USING: accessors kernel fry io.encodings.utf8 io.files
-http http.server ;
+USING: accessors kernel fry io io.encodings.utf8 io.files
+http http.server debugger prettyprint continuations ;
 IN: http.server.templating
 
 MIXIN: template
 
-GENERIC: call-template ( template -- )
+GENERIC: call-template* ( template -- )
+
+ERROR: template-error template error ;
+
+M: template-error error.
+    "Error while processing template " write
+    [ template>> pprint ":" print nl ]
+    [ error>> error. ]
+    bi ;
+
+: call-template ( template -- )
+    [ call-template* ] [ template-error ] recover ;
 
 M: template write-response-body* call-template ;
 
@@ -13,5 +24,4 @@ M: template write-response-body* call-template ;
 
 ! responder integration
 : serve-template ( template -- response )
-    "text/html" <content>
-    swap '[ , call-template ] >>body ;
+    '[ , call-template ] <html-content> ;
index e88301c7f88ac7d8d45d7747def55e53580bd88e..ca6f9d590553ac9cc3d6e610caa0494bbc56fbd0 100755 (executable)
@@ -148,4 +148,4 @@ SYMBOL: open-arrays
     init f exec-loop ;
 
 : run-sand ( -- )
-    "extra/icfp/2006/sandmark.umz" resource-path run-prog ;
+    "resource:extra/icfp/2006/sandmark.umz" run-prog ;
diff --git a/extra/interval-maps/authors.txt b/extra/interval-maps/authors.txt
new file mode 100755 (executable)
index 0000000..504363d
--- /dev/null
@@ -0,0 +1 @@
+Daniel Ehrenberg\r
diff --git a/extra/interval-maps/interval-maps-docs.factor b/extra/interval-maps/interval-maps-docs.factor
new file mode 100755 (executable)
index 0000000..1a862fb
--- /dev/null
@@ -0,0 +1,29 @@
+USING: help.markup help.syntax ;\r
+IN: interval-maps\r
+\r
+HELP: interval-at*\r
+{ $values { "key" "an object" } { "map" "an interval map" } { "value" "the value for the key, or f" } { "?" "whether the key is present" } }\r
+{ $description "Looks up a key in an interval map, returning the corresponding value if the item is in an interval in the map, and a boolean flag. The operation takes O(log n) time." } ;\r
+\r
+HELP: interval-at\r
+{ $values { "key" "an object" } { "map" "an interval map" } { "value" "the value for the key, or f" } }\r
+{ $description "Looks up a key in an interval map, returning the value of the corresponding interval, or f if the interval is not present in the map." } ;\r
+\r
+HELP: interval-key?\r
+{ $values { "key" "an object" } { "map" "an interval map" } { "?" "a boolean" } }\r
+{ $description "Tests whether an object is in an interval in the interval map, returning t if the object is present." } ;\r
+\r
+HELP: <interval-map>\r
+{ $values { "specification" "an assoc" } { "map" "an interval map" } }\r
+{ $description "From a specification, produce an interval tree. The specification is an assoc where the keys are intervals, or pairs of numbers to represent intervals, or individual numbers to represent singleton intervals. The values are the values int he interval map. Construction time is O(n log n)." } ;\r
+\r
+ARTICLE: "interval-maps" "Interval maps"\r
+"Interval maps are a mechanism, similar to assocs, where a set of closed intervals of keys are associated with values. As such, interval maps do not conform to the assoc protocol, because intervals of floats, for example, can be used, and it is impossible to get a list of keys in between."\r
+"The following operations are used to query interval maps:"\r
+{ $subsection interval-at* }\r
+{ $subsection interval-at }\r
+{ $subsection interval-key? }\r
+"Use the following to construct interval maps"\r
+{ $subsection <interval-map> } ;\r
+\r
+ABOUT: "interval-maps"\r
diff --git a/extra/interval-maps/interval-maps-tests.factor b/extra/interval-maps/interval-maps-tests.factor
new file mode 100755 (executable)
index 0000000..5a4b508
--- /dev/null
@@ -0,0 +1,18 @@
+USING: kernel namespaces interval-maps tools.test ;\r
+IN: interval-maps.test\r
+\r
+SYMBOL: test\r
+\r
+[ ] [ { { { 4 8 } 3 } { 1 2 } } <interval-map> test set ] unit-test\r
+[ 3 ] [ 5 test get interval-at ] unit-test\r
+[ 3 ] [ 8 test get interval-at ] unit-test\r
+[ 3 ] [ 4 test get interval-at ] unit-test\r
+[ f ] [ 9 test get interval-at ] unit-test\r
+[ 2 ] [ 1 test get interval-at ] unit-test\r
+[ f ] [ 2 test get interval-at ] unit-test\r
+[ f ] [ 0 test get interval-at ] unit-test\r
+\r
+[ { { { 1 4 } 3 } { { 4 8 } 6 } } <interval-map> ] must-fail\r
+\r
+[ { { { 1 3 } 2 } { { 4 5 } 4 } { { 7 8 } 4 } } ]\r
+[ { { 1 2 } { 2 2 } { 3 2 } { 4 4 } { 5 4 } { 7 4 } { 8 4 } } coalesce ] unit-test\r
diff --git a/extra/interval-maps/interval-maps.factor b/extra/interval-maps/interval-maps.factor
new file mode 100755 (executable)
index 0000000..7dcb946
--- /dev/null
@@ -0,0 +1,56 @@
+USING: kernel sequences arrays math.intervals accessors\r
+math.order sorting math assocs locals namespaces ;\r
+IN: interval-maps\r
+\r
+TUPLE: interval-map array ;\r
+\r
+<PRIVATE\r
+TUPLE: interval-node interval value ;\r
+\r
+: fixup-value ( value ? -- value/f ? )\r
+    [ drop f f ] unless* ;\r
+\r
+: find-interval ( key interval-map -- i )\r
+    [ interval>> from>> first <=> ] binsearch ;\r
+\r
+GENERIC: >interval ( object -- interval )\r
+M: number >interval [a,a] ;\r
+M: sequence >interval first2 [a,b] ;\r
+M: interval >interval ;\r
+\r
+: all-intervals ( sequence -- intervals )\r
+    [ >r >interval r> ] assoc-map ;\r
+\r
+: ensure-disjoint ( intervals -- intervals )\r
+    dup keys [ interval-intersect not ] monotonic?\r
+    [ "Intervals are not disjoint" throw ] unless ;\r
+\r
+\r
+PRIVATE>\r
+\r
+: interval-at* ( key map -- value ? )\r
+    array>> [ find-interval ] 2keep swapd nth\r
+    [ nip value>> ] [ interval>> interval-contains? ] 2bi\r
+    fixup-value ;\r
+\r
+: interval-at ( key map -- value ) interval-at* drop ;\r
+: interval-key? ( key map -- ? ) interval-at* nip ;\r
+\r
+: <interval-map> ( specification -- map )\r
+    all-intervals { } assoc-like\r
+    [ [ first to>> ] compare ] sort ensure-disjoint\r
+    [ interval-node boa ] { } assoc>map\r
+    interval-map boa ;\r
+\r
+:: coalesce ( alist -- specification )\r
+    ! Only works with integer keys, because they're discrete\r
+    ! Makes 2array keys\r
+    [\r
+        alist sort-keys unclip first2 dupd roll\r
+        [| oldkey oldval key val | ! Underneath is start\r
+            oldkey 1+ key =\r
+            oldval val = and\r
+            [ oldkey 2array oldval 2array , key ] unless\r
+            key val\r
+        ] assoc-each [ 2array ] bi@ ,\r
+    ] { } make ;\r
diff --git a/extra/interval-maps/summary.txt b/extra/interval-maps/summary.txt
new file mode 100755 (executable)
index 0000000..d252632
--- /dev/null
@@ -0,0 +1 @@
+Interval maps for disjoint closed ranges\r
diff --git a/extra/interval-maps/tags.txt b/extra/interval-maps/tags.txt
new file mode 100755 (executable)
index 0000000..5e9549f
--- /dev/null
@@ -0,0 +1 @@
+collections\r
index 7a2856e311993580ee7881597b735fad3173661e..705c2d070b7b061eec157846fbd0eccea74f4f2c 100755 (executable)
@@ -197,14 +197,14 @@ DEFER: _
 
 \ prefix [ unclip ] define-inverse
 \ unclip [ prefix ] define-inverse
-\ suffix [ dup 1 head* swap peek ] define-inverse
+\ suffix [ dup but-last swap peek ] define-inverse
 
 ! Constructor inverse
 : deconstruct-pred ( class -- quot )
     "predicate" word-prop [ dupd call assure ] curry ;
 
 : slot-readers ( class -- quot )
-    all-slots 1 tail ! tail gets rid of delegate
+    all-slots rest ! tail gets rid of delegate
     [ slot-spec-reader 1quotation [ keep ] curry ] map concat
     [ ] like [ drop ] compose ;
 
@@ -218,7 +218,7 @@ DEFER: _
 
 : empty-inverse ( class -- quot )
     deconstruct-pred
-    [ tuple>array 1 tail [ ] contains? [ fail ] when ]
+    [ tuple>array rest [ ] contains? [ fail ] when ]
     compose ;
 
 \ new 1 [ ?wrapped empty-inverse ] define-pop-inverse
index a9014755446ab9cd6828b82835decee50295eb36..d5b917246a304d6c5084fb7fa451b5259cf53c92 100755 (executable)
@@ -1,10 +1,10 @@
 ! Copyright (C) 2004, 2005 Mackenzie Straight.
 ! Copyright (C) 2006, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: io.buffers
 USING: alien alien.accessors alien.c-types alien.syntax kernel
 kernel.private libc math sequences byte-arrays strings hints
-accessors ;
+accessors math.order ;
+IN: io.buffers
 
 TUPLE: buffer size ptr fill pos ;
 
index dc6e52d67efacc252038f1ecf169bac36ec21040..88414efd16bfaab66d22c6e7c3713914e464d759 100755 (executable)
@@ -30,16 +30,15 @@ IN: io.encodings.8-bit
 } ;
 
 : encoding-file ( file-name -- stream )
-    "extra/io/encodings/8-bit/" ".TXT"
-    swapd 3append resource-path
-    ascii <file-reader> ;
+    "resource:extra/io/encodings/8-bit/" ".TXT"
+    swapd 3append ascii <file-reader> ;
 
 : tail-if ( seq n -- newseq )
     2dup swap length <= [ tail ] [ drop ] if ;
 
 : process-contents ( lines -- assoc )
     [ "#" split1 drop ] map
-    [ empty? not ] subset
+    [ empty? not ] filter
     [ "\t" split 2 head [ 2 tail-if hex> ] map ] map ;
 
 : byte>ch ( assoc -- array )
diff --git a/extra/io/encodings/iana/authors.txt b/extra/io/encodings/iana/authors.txt
new file mode 100644 (file)
index 0000000..f990dd0
--- /dev/null
@@ -0,0 +1 @@
+Daniel Ehrenberg
diff --git a/extra/io/encodings/iana/character-sets b/extra/io/encodings/iana/character-sets
new file mode 100644 (file)
index 0000000..253c471
--- /dev/null
@@ -0,0 +1,1697 @@
+Name: ANSI_X3.4-1968                                   [RFC1345,KXS2]
+MIBenum: 3
+Source: ECMA registry
+Alias: iso-ir-6
+Alias: ANSI_X3.4-1986
+Alias: ISO_646.irv:1991
+Alias: ASCII
+Alias: ISO646-US
+Alias: US-ASCII (preferred MIME name)
+Alias: us
+Alias: IBM367
+Alias: cp367
+Alias: csASCII
+
+Name: ISO_8859-1:1987                                    [RFC1345,KXS2]
+MIBenum: 4
+Source: ECMA registry
+Alias: iso-ir-100
+Alias: ISO_8859-1
+Alias: ISO-8859-1 (preferred MIME name)
+Alias: latin1
+Alias: l1
+Alias: IBM819
+Alias: CP819
+Alias: csISOLatin1
+
+Name: ISO_8859-2:1987                                    [RFC1345,KXS2]
+MIBenum: 5
+Source: ECMA registry
+Alias: iso-ir-101
+Alias: ISO_8859-2
+Alias: ISO-8859-2 (preferred MIME name)
+Alias: latin2
+Alias: l2
+Alias: csISOLatin2
+
+Name: ISO_8859-3:1988                                    [RFC1345,KXS2]
+MIBenum: 6
+Source: ECMA registry
+Alias: iso-ir-109
+Alias: ISO_8859-3
+Alias: ISO-8859-3 (preferred MIME name)
+Alias: latin3
+Alias: l3
+Alias: csISOLatin3
+
+Name: ISO_8859-4:1988                                    [RFC1345,KXS2]
+MIBenum: 7
+Source: ECMA registry
+Alias: iso-ir-110
+Alias: ISO_8859-4
+Alias: ISO-8859-4 (preferred MIME name)
+Alias: latin4
+Alias: l4
+Alias: csISOLatin4
+
+Name: ISO_8859-5:1988                                     [RFC1345,KXS2]
+MIBenum: 8
+Source: ECMA registry
+Alias: iso-ir-144
+Alias: ISO_8859-5
+Alias: ISO-8859-5 (preferred MIME name)
+Alias: cyrillic
+Alias: csISOLatinCyrillic
+
+Name: ISO_8859-6:1987                                    [RFC1345,KXS2]
+MIBenum: 9
+Source: ECMA registry
+Alias: iso-ir-127
+Alias: ISO_8859-6
+Alias: ISO-8859-6 (preferred MIME name)
+Alias: ECMA-114
+Alias: ASMO-708
+Alias: arabic
+Alias: csISOLatinArabic
+
+Name: ISO_8859-7:1987                            [RFC1947,RFC1345,KXS2]
+MIBenum: 10
+Source: ECMA registry
+Alias: iso-ir-126
+Alias: ISO_8859-7
+Alias: ISO-8859-7 (preferred MIME name)
+Alias: ELOT_928
+Alias: ECMA-118
+Alias: greek
+Alias: greek8
+Alias: csISOLatinGreek
+
+Name: ISO_8859-8:1988                                     [RFC1345,KXS2]
+MIBenum: 11
+Source: ECMA registry
+Alias: iso-ir-138
+Alias: ISO_8859-8
+Alias: ISO-8859-8 (preferred MIME name)
+Alias: hebrew
+Alias: csISOLatinHebrew
+
+Name: ISO_8859-9:1989                                     [RFC1345,KXS2]
+MIBenum: 12
+Source: ECMA registry
+Alias: iso-ir-148
+Alias: ISO_8859-9
+Alias: ISO-8859-9 (preferred MIME name)
+Alias: latin5
+Alias: l5
+Alias: csISOLatin5
+
+Name: ISO-8859-10 (preferred MIME name)                          [RFC1345,KXS2]
+MIBenum: 13
+Source: ECMA registry
+Alias: iso-ir-157
+Alias: l6
+Alias: ISO_8859-10:1992
+Alias: csISOLatin6
+Alias: latin6
+
+Name: ISO_6937-2-add                                      [RFC1345,KXS2]
+MIBenum: 14
+Source: ECMA registry and ISO 6937-2:1983
+Alias: iso-ir-142
+Alias: csISOTextComm
+
+Name: JIS_X0201                                           [RFC1345,KXS2]
+MIBenum: 15
+Source: JIS X 0201-1976.   One byte only, this is equivalent to 
+        JIS/Roman (similar to ASCII) plus eight-bit half-width 
+        Katakana
+Alias: X0201
+Alias: csHalfWidthKatakana
+
+Name: JIS_Encoding
+MIBenum: 16
+Source: JIS X 0202-1991.  Uses ISO 2022 escape sequences to
+        shift code sets as documented in JIS X 0202-1991.
+Alias: csJISEncoding
+
+Name: Shift_JIS  (preferred MIME name)
+MIBenum: 17
+Source: This charset is an extension of csHalfWidthKatakana by
+        adding graphic characters in JIS X 0208.  The CCS's are
+        JIS X0201:1997 and JIS X0208:1997.  The
+        complete definition is shown in Appendix 1 of JIS
+        X0208:1997.
+        This charset can be used for the top-level media type "text".
+Alias: MS_Kanji 
+Alias: csShiftJIS
+
+Name: Extended_UNIX_Code_Packed_Format_for_Japanese
+MIBenum: 18
+Source: Standardized by OSF, UNIX International, and UNIX Systems
+        Laboratories Pacific.  Uses ISO 2022 rules to select
+               code set 0: US-ASCII (a single 7-bit byte set)
+               code set 1: JIS X0208-1990 (a double 8-bit byte set)
+                           restricted to A0-FF in both bytes
+               code set 2: Half Width Katakana (a single 7-bit byte set)
+                           requiring SS2 as the character prefix
+               code set 3: JIS X0212-1990 (a double 7-bit byte set)
+                           restricted to A0-FF in both bytes
+                           requiring SS3 as the character prefix
+Alias: csEUCPkdFmtJapanese
+Alias: EUC-JP  (preferred MIME name)
+
+Name: Extended_UNIX_Code_Fixed_Width_for_Japanese
+MIBenum: 19
+Source: Used in Japan.  Each character is 2 octets.
+                code set 0: US-ASCII (a single 7-bit byte set)
+                              1st byte = 00
+                              2nd byte = 20-7E
+                code set 1: JIS X0208-1990 (a double 7-bit byte set)
+                            restricted  to A0-FF in both bytes 
+                code set 2: Half Width Katakana (a single 7-bit byte set)
+                              1st byte = 00
+                              2nd byte = A0-FF
+                code set 3: JIS X0212-1990 (a double 7-bit byte set)
+                            restricted to A0-FF in 
+                            the first byte
+                and 21-7E in the second byte
+Alias: csEUCFixWidJapanese
+
+Name: BS_4730                                           [RFC1345,KXS2]
+MIBenum: 20
+Source: ECMA registry
+Alias: iso-ir-4
+Alias: ISO646-GB
+Alias: gb
+Alias: uk
+Alias: csISO4UnitedKingdom
+
+Name: SEN_850200_C                                      [RFC1345,KXS2]
+MIBenum: 21
+Source: ECMA registry
+Alias: iso-ir-11
+Alias: ISO646-SE2
+Alias: se2
+Alias: csISO11SwedishForNames
+
+Name: IT                                                [RFC1345,KXS2]
+MIBenum: 22
+Source: ECMA registry
+Alias: iso-ir-15
+Alias: ISO646-IT
+Alias: csISO15Italian
+
+Name: ES                                                [RFC1345,KXS2]
+MIBenum: 23
+Source: ECMA registry
+Alias: iso-ir-17
+Alias: ISO646-ES
+Alias: csISO17Spanish
+
+Name: DIN_66003                                         [RFC1345,KXS2]
+MIBenum: 24
+Source: ECMA registry
+Alias: iso-ir-21
+Alias: de
+Alias: ISO646-DE
+Alias: csISO21German
+
+Name: NS_4551-1                                         [RFC1345,KXS2]
+MIBenum: 25
+Source: ECMA registry
+Alias: iso-ir-60
+Alias: ISO646-NO
+Alias: no
+Alias: csISO60DanishNorwegian
+Alias: csISO60Norwegian1
+
+Name: NF_Z_62-010                                        [RFC1345,KXS2]
+MIBenum: 26
+Source: ECMA registry
+Alias: iso-ir-69
+Alias: ISO646-FR
+Alias: fr
+Alias: csISO69French
+
+Name: ISO-10646-UTF-1
+MIBenum: 27
+Source: Universal Transfer Format (1), this is the multibyte
+        encoding, that subsets ASCII-7. It does not have byte
+        ordering issues.
+Alias: csISO10646UTF1
+
+Name: ISO_646.basic:1983                                [RFC1345,KXS2]
+MIBenum: 28
+Source: ECMA registry
+Alias: ref
+Alias: csISO646basic1983
+
+Name: INVARIANT                                         [RFC1345,KXS2]
+MIBenum: 29
+Alias: csINVARIANT
+
+Name: ISO_646.irv:1983                                  [RFC1345,KXS2]
+MIBenum: 30
+Source: ECMA registry
+Alias: iso-ir-2
+Alias: irv
+Alias: csISO2IntlRefVersion
+
+Name: NATS-SEFI                                         [RFC1345,KXS2]
+MIBenum: 31
+Source: ECMA registry
+Alias: iso-ir-8-1
+Alias: csNATSSEFI
+
+Name: NATS-SEFI-ADD                                     [RFC1345,KXS2]
+MIBenum: 32
+Source: ECMA registry
+Alias: iso-ir-8-2
+Alias: csNATSSEFIADD
+
+Name: NATS-DANO                                         [RFC1345,KXS2]
+MIBenum: 33
+Source: ECMA registry
+Alias: iso-ir-9-1
+Alias: csNATSDANO
+
+Name: NATS-DANO-ADD                                     [RFC1345,KXS2]
+MIBenum: 34
+Source: ECMA registry
+Alias: iso-ir-9-2
+Alias: csNATSDANOADD
+
+Name: SEN_850200_B                                      [RFC1345,KXS2]
+MIBenum: 35
+Source: ECMA registry
+Alias: iso-ir-10
+Alias: FI
+Alias: ISO646-FI
+Alias: ISO646-SE
+Alias: se
+Alias: csISO10Swedish
+
+Name: KS_C_5601-1987                                    [RFC1345,KXS2]
+MIBenum: 36
+Source: ECMA registry
+Alias: iso-ir-149
+Alias: KS_C_5601-1989
+Alias: KSC_5601
+Alias: korean
+Alias: csKSC56011987
+
+Name: ISO-2022-KR  (preferred MIME name)                [RFC1557,Choi]
+MIBenum: 37
+Source: RFC-1557 (see also KS_C_5601-1987)
+Alias: csISO2022KR
+
+Name: EUC-KR  (preferred MIME name)                     [RFC1557,Choi]
+MIBenum: 38
+Source: RFC-1557 (see also KS_C_5861-1992)
+Alias: csEUCKR
+
+Name: ISO-2022-JP  (preferred MIME name)               [RFC1468,Murai]
+MIBenum: 39
+Source: RFC-1468 (see also RFC-2237)
+Alias: csISO2022JP
+
+Name: ISO-2022-JP-2  (preferred MIME name)              [RFC1554,Ohta]
+MIBenum: 40
+Source: RFC-1554
+Alias: csISO2022JP2
+
+Name: JIS_C6220-1969-jp                                 [RFC1345,KXS2]
+MIBenum: 41
+Source: ECMA registry
+Alias: JIS_C6220-1969
+Alias: iso-ir-13
+Alias: katakana
+Alias: x0201-7
+Alias: csISO13JISC6220jp
+
+Name: JIS_C6220-1969-ro                                 [RFC1345,KXS2]
+MIBenum: 42
+Source: ECMA registry
+Alias: iso-ir-14
+Alias: jp
+Alias: ISO646-JP
+Alias: csISO14JISC6220ro
+
+Name: PT                                                [RFC1345,KXS2]
+MIBenum: 43
+Source: ECMA registry
+Alias: iso-ir-16
+Alias: ISO646-PT
+Alias: csISO16Portuguese
+
+Name: greek7-old                                        [RFC1345,KXS2]
+MIBenum: 44
+Source: ECMA registry
+Alias: iso-ir-18
+Alias: csISO18Greek7Old
+
+Name: latin-greek                                       [RFC1345,KXS2]
+MIBenum: 45
+Source: ECMA registry
+Alias: iso-ir-19
+Alias: csISO19LatinGreek
+
+Name: NF_Z_62-010_(1973)                                [RFC1345,KXS2]
+MIBenum: 46
+Source: ECMA registry
+Alias: iso-ir-25
+Alias: ISO646-FR1
+Alias: csISO25French
+
+Name: Latin-greek-1                                     [RFC1345,KXS2]
+MIBenum: 47
+Source: ECMA registry
+Alias: iso-ir-27
+Alias: csISO27LatinGreek1
+
+Name: ISO_5427                                          [RFC1345,KXS2]
+MIBenum: 48
+Source: ECMA registry
+Alias: iso-ir-37
+Alias: csISO5427Cyrillic
+
+Name: JIS_C6226-1978                                    [RFC1345,KXS2]
+MIBenum: 49
+Source: ECMA registry
+Alias: iso-ir-42
+Alias: csISO42JISC62261978
+
+Name: BS_viewdata                                       [RFC1345,KXS2]
+MIBenum: 50
+Source: ECMA registry
+Alias: iso-ir-47
+Alias: csISO47BSViewdata
+
+Name: INIS                                              [RFC1345,KXS2]
+MIBenum: 51
+Source: ECMA registry
+Alias: iso-ir-49
+Alias: csISO49INIS
+
+Name: INIS-8                                            [RFC1345,KXS2]
+MIBenum: 52
+Source: ECMA registry
+Alias: iso-ir-50
+Alias: csISO50INIS8
+
+Name: INIS-cyrillic                                     [RFC1345,KXS2]
+MIBenum: 53
+Source: ECMA registry
+Alias: iso-ir-51
+Alias: csISO51INISCyrillic
+
+Name: ISO_5427:1981                                     [RFC1345,KXS2]
+MIBenum: 54
+Source: ECMA registry
+Alias: iso-ir-54
+Alias: ISO5427Cyrillic1981
+
+Name: ISO_5428:1980                                     [RFC1345,KXS2]
+MIBenum: 55
+Source: ECMA registry
+Alias: iso-ir-55
+Alias: csISO5428Greek
+
+Name: GB_1988-80                                        [RFC1345,KXS2]
+MIBenum: 56
+Source: ECMA registry
+Alias: iso-ir-57
+Alias: cn
+Alias: ISO646-CN
+Alias: csISO57GB1988
+
+Name: GB_2312-80                                        [RFC1345,KXS2]
+MIBenum: 57
+Source: ECMA registry
+Alias: iso-ir-58
+Alias: chinese
+Alias: csISO58GB231280
+
+Name: NS_4551-2                                          [RFC1345,KXS2]
+MIBenum: 58
+Source: ECMA registry
+Alias: ISO646-NO2
+Alias: iso-ir-61
+Alias: no2
+Alias: csISO61Norwegian2
+
+Name: videotex-suppl                                     [RFC1345,KXS2]
+MIBenum: 59
+Source: ECMA registry
+Alias: iso-ir-70
+Alias: csISO70VideotexSupp1
+
+Name: PT2                                                [RFC1345,KXS2]
+MIBenum: 60
+Source: ECMA registry
+Alias: iso-ir-84
+Alias: ISO646-PT2
+Alias: csISO84Portuguese2
+
+Name: ES2                                                [RFC1345,KXS2]
+MIBenum: 61
+Source: ECMA registry
+Alias: iso-ir-85
+Alias: ISO646-ES2
+Alias: csISO85Spanish2
+
+Name: MSZ_7795.3                                         [RFC1345,KXS2]
+MIBenum: 62
+Source: ECMA registry
+Alias: iso-ir-86
+Alias: ISO646-HU
+Alias: hu
+Alias: csISO86Hungarian
+
+Name: JIS_C6226-1983                                     [RFC1345,KXS2]
+MIBenum: 63
+Source: ECMA registry
+Alias: iso-ir-87
+Alias: x0208
+Alias: JIS_X0208-1983
+Alias: csISO87JISX0208
+
+Name: greek7                                             [RFC1345,KXS2]
+MIBenum: 64
+Source: ECMA registry
+Alias: iso-ir-88
+Alias: csISO88Greek7
+
+Name: ASMO_449                                           [RFC1345,KXS2]
+MIBenum: 65
+Source: ECMA registry
+Alias: ISO_9036
+Alias: arabic7
+Alias: iso-ir-89
+Alias: csISO89ASMO449
+
+Name: iso-ir-90                                          [RFC1345,KXS2]
+MIBenum: 66
+Source: ECMA registry
+Alias: csISO90
+
+Name: JIS_C6229-1984-a                                   [RFC1345,KXS2]
+MIBenum: 67
+Source: ECMA registry
+Alias: iso-ir-91
+Alias: jp-ocr-a
+Alias: csISO91JISC62291984a
+
+Name: JIS_C6229-1984-b                                   [RFC1345,KXS2]
+MIBenum: 68
+Source: ECMA registry
+Alias: iso-ir-92
+Alias: ISO646-JP-OCR-B
+Alias: jp-ocr-b
+Alias: csISO92JISC62991984b
+
+Name: JIS_C6229-1984-b-add                               [RFC1345,KXS2]
+MIBenum: 69
+Source: ECMA registry
+Alias: iso-ir-93
+Alias: jp-ocr-b-add
+Alias: csISO93JIS62291984badd
+
+Name: JIS_C6229-1984-hand                                [RFC1345,KXS2]
+MIBenum: 70
+Source: ECMA registry
+Alias: iso-ir-94
+Alias: jp-ocr-hand
+Alias: csISO94JIS62291984hand
+
+Name: JIS_C6229-1984-hand-add                            [RFC1345,KXS2]
+MIBenum: 71
+Source: ECMA registry
+Alias: iso-ir-95
+Alias: jp-ocr-hand-add
+Alias: csISO95JIS62291984handadd
+
+Name: JIS_C6229-1984-kana                                [RFC1345,KXS2]
+MIBenum: 72
+Source: ECMA registry
+Alias: iso-ir-96
+Alias: csISO96JISC62291984kana
+
+Name: ISO_2033-1983                                      [RFC1345,KXS2]
+MIBenum: 73
+Source: ECMA registry
+Alias: iso-ir-98
+Alias: e13b
+Alias: csISO2033
+
+Name: ANSI_X3.110-1983                                   [RFC1345,KXS2]
+MIBenum: 74
+Source: ECMA registry
+Alias: iso-ir-99
+Alias: CSA_T500-1983
+Alias: NAPLPS
+Alias: csISO99NAPLPS
+
+Name: T.61-7bit                                          [RFC1345,KXS2]
+MIBenum: 75
+Source: ECMA registry
+Alias: iso-ir-102
+Alias: csISO102T617bit
+
+Name: T.61-8bit                                          [RFC1345,KXS2]
+MIBenum: 76
+Alias: T.61
+Source: ECMA registry
+Alias: iso-ir-103
+Alias: csISO103T618bit
+
+Name: ECMA-cyrillic                                     
+MIBenum: 77
+Source: ISO registry (formerly ECMA registry)
+         http://www.itscj.ipsj.jp/ISO-IR/111.pdf
+Alias: iso-ir-111
+Alias: KOI8-E
+Alias: csISO111ECMACyrillic
+
+Name: CSA_Z243.4-1985-1                                  [RFC1345,KXS2]
+MIBenum: 78
+Source: ECMA registry
+Alias: iso-ir-121
+Alias: ISO646-CA
+Alias: csa7-1
+Alias: ca
+Alias: csISO121Canadian1
+
+Name: CSA_Z243.4-1985-2                                  [RFC1345,KXS2]
+MIBenum: 79
+Source: ECMA registry
+Alias: iso-ir-122
+Alias: ISO646-CA2
+Alias: csa7-2
+Alias: csISO122Canadian2
+
+Name: CSA_Z243.4-1985-gr                                 [RFC1345,KXS2]
+MIBenum: 80
+Source: ECMA registry
+Alias: iso-ir-123
+Alias: csISO123CSAZ24341985gr
+
+Name: ISO_8859-6-E                                       [RFC1556,IANA]
+MIBenum: 81
+Source: RFC1556
+Alias: csISO88596E
+Alias: ISO-8859-6-E (preferred MIME name)
+
+Name: ISO_8859-6-I                                       [RFC1556,IANA]
+MIBenum: 82
+Source: RFC1556
+Alias: csISO88596I
+Alias: ISO-8859-6-I (preferred MIME name)
+
+Name: T.101-G2                                            [RFC1345,KXS2]
+MIBenum: 83
+Source: ECMA registry
+Alias: iso-ir-128
+Alias: csISO128T101G2
+
+Name: ISO_8859-8-E                                  [RFC1556,Nussbacher]
+MIBenum: 84
+Source: RFC1556
+Alias: csISO88598E
+Alias: ISO-8859-8-E (preferred MIME name)
+
+Name: ISO_8859-8-I                                  [RFC1556,Nussbacher]
+MIBenum: 85
+Source: RFC1556
+Alias: csISO88598I
+Alias: ISO-8859-8-I (preferred MIME name)
+
+Name: CSN_369103                                          [RFC1345,KXS2]
+MIBenum: 86
+Source: ECMA registry
+Alias: iso-ir-139
+Alias: csISO139CSN369103
+
+Name: JUS_I.B1.002                                        [RFC1345,KXS2]
+MIBenum: 87
+Source: ECMA registry
+Alias: iso-ir-141
+Alias: ISO646-YU
+Alias: js
+Alias: yu
+Alias: csISO141JUSIB1002
+
+Name: IEC_P27-1                                           [RFC1345,KXS2]
+MIBenum: 88
+Source: ECMA registry
+Alias: iso-ir-143
+Alias: csISO143IECP271
+
+Name: JUS_I.B1.003-serb                                   [RFC1345,KXS2]
+MIBenum: 89
+Source: ECMA registry
+Alias: iso-ir-146
+Alias: serbian
+Alias: csISO146Serbian
+
+Name: JUS_I.B1.003-mac                                    [RFC1345,KXS2]
+MIBenum: 90
+Source: ECMA registry
+Alias: macedonian
+Alias: iso-ir-147
+Alias: csISO147Macedonian
+
+Name: greek-ccitt                                         [RFC1345,KXS2]
+MIBenum: 91
+Source: ECMA registry
+Alias: iso-ir-150
+Alias: csISO150
+Alias: csISO150GreekCCITT
+
+Name: NC_NC00-10:81                                       [RFC1345,KXS2]
+MIBenum: 92
+Source: ECMA registry
+Alias: cuba
+Alias: iso-ir-151
+Alias: ISO646-CU
+Alias: csISO151Cuba
+
+Name: ISO_6937-2-25                                       [RFC1345,KXS2]
+MIBenum: 93
+Source: ECMA registry
+Alias: iso-ir-152
+Alias: csISO6937Add
+
+Name: GOST_19768-74                                       [RFC1345,KXS2]
+MIBenum: 94
+Source: ECMA registry
+Alias: ST_SEV_358-88
+Alias: iso-ir-153
+Alias: csISO153GOST1976874
+
+Name: ISO_8859-supp                                       [RFC1345,KXS2]
+MIBenum: 95
+Source: ECMA registry
+Alias: iso-ir-154
+Alias: latin1-2-5
+Alias: csISO8859Supp
+
+Name: ISO_10367-box                                       [RFC1345,KXS2]
+MIBenum: 96
+Source: ECMA registry
+Alias: iso-ir-155
+Alias: csISO10367Box
+
+Name: latin-lap                                           [RFC1345,KXS2]
+MIBenum: 97
+Source: ECMA registry
+Alias: lap
+Alias: iso-ir-158
+Alias: csISO158Lap
+
+Name: JIS_X0212-1990                                      [RFC1345,KXS2]
+MIBenum: 98
+Source: ECMA registry
+Alias: x0212
+Alias: iso-ir-159
+Alias: csISO159JISX02121990
+
+Name: DS_2089                                             [RFC1345,KXS2]
+MIBenum: 99
+Source: Danish Standard, DS 2089, February 1974
+Alias: DS2089
+Alias: ISO646-DK
+Alias: dk
+Alias: csISO646Danish
+
+Name: us-dk                                               [RFC1345,KXS2]
+MIBenum: 100
+Alias: csUSDK
+
+Name: dk-us                                               [RFC1345,KXS2]
+MIBenum: 101
+Alias: csDKUS
+
+Name: KSC5636                                             [RFC1345,KXS2]
+MIBenum: 102
+Alias: ISO646-KR
+Alias: csKSC5636
+
+Name: UNICODE-1-1-UTF-7                                        [RFC1642]
+MIBenum: 103
+Source: RFC 1642
+Alias: csUnicode11UTF7
+
+Name: ISO-2022-CN                                            [RFC1922]
+MIBenum: 104
+Source: RFC-1922
+
+Name: ISO-2022-CN-EXT                                        [RFC1922]
+MIBenum: 105
+Source: RFC-1922
+
+Name: UTF-8                                                    [RFC3629]
+MIBenum: 106
+Source: RFC 3629
+Alias: None 
+
+Name: ISO-8859-13
+MIBenum: 109
+Source: ISO See (http://www.iana.org/assignments/charset-reg/ISO-8859-13)[Tumasonis] 
+Alias: None
+
+Name: ISO-8859-14
+MIBenum: 110
+Source: ISO See (http://www.iana.org/assignments/charset-reg/ISO-8859-14) [Simonsen]
+Alias: iso-ir-199
+Alias: ISO_8859-14:1998
+Alias: ISO_8859-14
+Alias: latin8
+Alias: iso-celtic
+Alias: l8
+
+Name: ISO-8859-15
+MIBenum: 111
+Source: ISO 
+        Please see: <http://www.iana.org/assignments/charset-reg/ISO-8859-15>
+Alias: ISO_8859-15
+Alias: Latin-9
+
+Name: ISO-8859-16
+MIBenum: 112
+Source: ISO
+Alias: iso-ir-226
+Alias: ISO_8859-16:2001
+Alias: ISO_8859-16
+Alias: latin10
+Alias: l10 
+
+Name: GBK                                                 
+MIBenum: 113
+Source: Chinese IT Standardization Technical Committee  
+        Please see: <http://www.iana.org/assignments/charset-reg/GBK>
+Alias: CP936
+Alias: MS936
+Alias: windows-936
+
+Name: GB18030
+MIBenum: 114
+Source: Chinese IT Standardization Technical Committee
+        Please see: <http://www.iana.org/assignments/charset-reg/GB18030>
+Alias: None
+
+Name:  OSD_EBCDIC_DF04_15
+MIBenum:  115
+Source:  Fujitsu-Siemens standard mainframe EBCDIC encoding
+         Please see: <http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-15>
+Alias:   None
+
+Name:  OSD_EBCDIC_DF03_IRV
+MIBenum:  116
+Source:  Fujitsu-Siemens standard mainframe EBCDIC encoding
+         Please see: <http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF03-IRV>
+Alias:  None
+
+Name:  OSD_EBCDIC_DF04_1
+MIBenum:  117
+Source:  Fujitsu-Siemens standard mainframe EBCDIC encoding
+         Please see: <http://www.iana.org/assignments/charset-reg/OSD-EBCDIC-DF04-1>
+Alias:  None   
+
+Name: ISO-11548-1
+MIBenum: 118 
+Source: See <http://www.iana.org/assignments/charset-reg/ISO-11548-1>            [Thibault]
+Alias: ISO_11548-1
+Alias: ISO_TR_11548-1
+Alias: csISO115481
+
+Name: KZ-1048
+MIBenum: 119 
+Source: See <http://www.iana.org/assignments/charset-reg/KZ-1048>      [Veremeev, Kikkarin]
+Alias: STRK1048-2002
+Alias: RK1048
+Alias: csKZ1048
+
+Name: ISO-10646-UCS-2
+MIBenum: 1000
+Source: the 2-octet Basic Multilingual Plane, aka Unicode
+        this needs to specify network byte order: the standard
+        does not specify (it is a 16-bit integer space)
+Alias: csUnicode
+
+Name: ISO-10646-UCS-4
+MIBenum: 1001
+Source: the full code space. (same comment about byte order,
+        these are 31-bit numbers.
+Alias: csUCS4
+
+Name: ISO-10646-UCS-Basic
+MIBenum: 1002
+Source: ASCII subset of Unicode.  Basic Latin = collection 1
+        See ISO 10646, Appendix A
+Alias: csUnicodeASCII
+
+Name: ISO-10646-Unicode-Latin1
+MIBenum: 1003
+Source: ISO Latin-1 subset of Unicode. Basic Latin and Latin-1 
+         Supplement  = collections 1 and 2.  See ISO 10646, 
+         Appendix A.  See RFC 1815.
+Alias: csUnicodeLatin1
+Alias: ISO-10646
+
+Name: ISO-10646-J-1
+Source: ISO 10646 Japanese, see RFC 1815.
+
+Name: ISO-Unicode-IBM-1261
+MIBenum: 1005
+Source: IBM Latin-2, -3, -5, Extended Presentation Set, GCSGID: 1261
+Alias: csUnicodeIBM1261
+
+Name: ISO-Unicode-IBM-1268
+MIBenum: 1006
+Source: IBM Latin-4 Extended Presentation Set, GCSGID: 1268
+Alias: csUnicodeIBM1268
+
+Name: ISO-Unicode-IBM-1276
+MIBenum: 1007
+Source: IBM Cyrillic Greek Extended Presentation Set, GCSGID: 1276
+Alias: csUnicodeIBM1276
+
+Name: ISO-Unicode-IBM-1264
+MIBenum: 1008
+Source: IBM Arabic Presentation Set, GCSGID: 1264
+Alias: csUnicodeIBM1264
+
+Name: ISO-Unicode-IBM-1265
+MIBenum: 1009
+Source: IBM Hebrew Presentation Set, GCSGID: 1265
+Alias: csUnicodeIBM1265
+
+Name: UNICODE-1-1                                              [RFC1641]
+MIBenum: 1010
+Source: RFC 1641
+Alias: csUnicode11
+
+Name: SCSU
+MIBenum: 1011
+Source: SCSU See (http://www.iana.org/assignments/charset-reg/SCSU)     [Scherer]
+Alias: None 
+
+Name: UTF-7                                                    [RFC2152]
+MIBenum: 1012
+Source: RFC 2152
+Alias: None
+
+Name: UTF-16BE                                                 [RFC2781]
+MIBenum: 1013
+Source: RFC 2781
+Alias: None
+
+Name: UTF-16LE                                                 [RFC2781]
+MIBenum: 1014
+Source: RFC 2781
+Alias: None
+
+Name: UTF-16                                                   [RFC2781]
+MIBenum: 1015
+Source: RFC 2781
+Alias: None
+
+Name: CESU-8                                                    [Phipps]
+MIBenum: 1016
+Source: <http://www.unicode.org/unicode/reports/tr26>
+Alias: csCESU-8
+
+Name: UTF-32                                                     [Davis] 
+MIBenum: 1017
+Source: <http://www.unicode.org/unicode/reports/tr19/>
+Alias: None
+
+Name: UTF-32BE                                                   [Davis]
+MIBenum: 1018
+Source: <http://www.unicode.org/unicode/reports/tr19/>
+Alias: None
+
+Name: UTF-32LE                                                   [Davis]
+MIBenum: 1019
+Source: <http://www.unicode.org/unicode/reports/tr19/>
+Alias: None
+
+Name: BOCU-1                                                   [Scherer]
+MIBenum: 1020
+Source: http://www.unicode.org/notes/tn6/
+Alias: csBOCU-1
+
+Name: ISO-8859-1-Windows-3.0-Latin-1                           [HP-PCL5] 
+MIBenum: 2000
+Source: Extended ISO 8859-1 Latin-1 for Windows 3.0.  
+        PCL Symbol Set id: 9U
+Alias: csWindows30Latin1
+
+Name: ISO-8859-1-Windows-3.1-Latin-1                           [HP-PCL5] 
+MIBenum: 2001
+Source: Extended ISO 8859-1 Latin-1 for Windows 3.1.  
+        PCL Symbol Set id: 19U
+Alias: csWindows31Latin1
+
+Name: ISO-8859-2-Windows-Latin-2                               [HP-PCL5] 
+MIBenum: 2002
+Source: Extended ISO 8859-2.  Latin-2 for Windows 3.1.
+        PCL Symbol Set id: 9E
+Alias: csWindows31Latin2
+
+Name: ISO-8859-9-Windows-Latin-5                               [HP-PCL5] 
+MIBenum: 2003
+Source: Extended ISO 8859-9.  Latin-5 for Windows 3.1
+        PCL Symbol Set id: 5T
+Alias: csWindows31Latin5
+
+Name: hp-roman8                                  [HP-PCL5,RFC1345,KXS2]
+MIBenum: 2004
+Source: LaserJet IIP Printer User's Manual, 
+        HP part no 33471-90901, Hewlet-Packard, June 1989.
+Alias: roman8
+Alias: r8
+Alias: csHPRoman8
+
+Name: Adobe-Standard-Encoding                                    [Adobe]
+MIBenum: 2005
+Source: PostScript Language Reference Manual
+        PCL Symbol Set id: 10J
+Alias: csAdobeStandardEncoding
+
+Name: Ventura-US                                               [HP-PCL5]
+MIBenum: 2006
+Source: Ventura US.  ASCII plus characters typically used in 
+        publishing, like pilcrow, copyright, registered, trade mark, 
+        section, dagger, and double dagger in the range A0 (hex) 
+        to FF (hex).  
+        PCL Symbol Set id: 14J
+Alias: csVenturaUS  
+
+Name: Ventura-International                                    [HP-PCL5]
+MIBenum: 2007
+Source: Ventura International.  ASCII plus coded characters similar 
+        to Roman8.
+        PCL Symbol Set id: 13J
+Alias: csVenturaInternational
+
+Name: DEC-MCS                                             [RFC1345,KXS2]
+MIBenum: 2008
+Source: VAX/VMS User's Manual, 
+        Order Number: AI-Y517A-TE, April 1986.
+Alias: dec
+Alias: csDECMCS
+
+Name: IBM850                                              [RFC1345,KXS2]
+MIBenum: 2009
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp850
+Alias: 850
+Alias: csPC850Multilingual
+
+Name: PC8-Danish-Norwegian                                     [HP-PCL5]
+MIBenum: 2012
+Source: PC Danish Norwegian
+        8-bit PC set for Danish Norwegian
+        PCL Symbol Set id: 11U
+Alias: csPC8DanishNorwegian
+
+Name: IBM862                                              [RFC1345,KXS2]
+MIBenum: 2013
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp862
+Alias: 862
+Alias: csPC862LatinHebrew
+
+Name: PC8-Turkish                                              [HP-PCL5]
+MIBenum: 2014
+Source: PC Latin Turkish.  PCL Symbol Set id: 9T
+Alias: csPC8Turkish
+
+Name: IBM-Symbols                                             [IBM-CIDT] 
+MIBenum: 2015
+Source: Presentation Set, CPGID: 259
+Alias: csIBMSymbols
+
+Name: IBM-Thai                                                [IBM-CIDT] 
+MIBenum: 2016
+Source: Presentation Set, CPGID: 838
+Alias: csIBMThai
+
+Name: HP-Legal                                                 [HP-PCL5]
+MIBenum: 2017
+Source: PCL 5 Comparison Guide, Hewlett-Packard,
+        HP part number 5961-0510, October 1992
+        PCL Symbol Set id: 1U
+Alias: csHPLegal
+
+Name: HP-Pi-font                                               [HP-PCL5]
+MIBenum: 2018
+Source: PCL 5 Comparison Guide, Hewlett-Packard,
+        HP part number 5961-0510, October 1992
+        PCL Symbol Set id: 15U
+Alias: csHPPiFont
+
+Name: HP-Math8                                                 [HP-PCL5]
+MIBenum: 2019
+Source: PCL 5 Comparison Guide, Hewlett-Packard,
+        HP part number 5961-0510, October 1992
+        PCL Symbol Set id: 8M
+Alias: csHPMath8
+
+Name: Adobe-Symbol-Encoding                                      [Adobe]
+MIBenum: 2020
+Source: PostScript Language Reference Manual
+        PCL Symbol Set id: 5M
+Alias: csHPPSMath
+
+Name: HP-DeskTop                                               [HP-PCL5]
+MIBenum: 2021
+Source: PCL 5 Comparison Guide, Hewlett-Packard,
+        HP part number 5961-0510, October 1992
+        PCL Symbol Set id: 7J
+Alias: csHPDesktop
+
+Name: Ventura-Math                                             [HP-PCL5]
+MIBenum: 2022
+Source: PCL 5 Comparison Guide, Hewlett-Packard,
+        HP part number 5961-0510, October 1992
+        PCL Symbol Set id: 6M
+Alias: csVenturaMath
+
+Name: Microsoft-Publishing                                     [HP-PCL5]
+MIBenum: 2023
+Source: PCL 5 Comparison Guide, Hewlett-Packard,
+        HP part number 5961-0510, October 1992
+        PCL Symbol Set id: 6J
+Alias: csMicrosoftPublishing
+
+Name: Windows-31J
+MIBenum: 2024
+Source: Windows Japanese.  A further extension of Shift_JIS
+        to include NEC special characters (Row 13), NEC
+        selection of IBM extensions (Rows 89 to 92), and IBM
+        extensions (Rows 115 to 119).  The CCS's are
+        JIS X0201:1997, JIS X0208:1997, and these extensions.
+        This charset can be used for the top-level media type "text",
+        but it is of limited or specialized use (see RFC2278).
+        PCL Symbol Set id: 19K
+Alias: csWindows31J
+
+Name: GB2312  (preferred MIME name)
+MIBenum: 2025
+Source: Chinese for People's Republic of China (PRC) mixed one byte, 
+        two byte set: 
+          20-7E = one byte ASCII 
+          A1-FE = two byte PRC Kanji 
+        See GB 2312-80 
+        PCL Symbol Set Id: 18C
+Alias: csGB2312
+
+Name: Big5  (preferred MIME name)
+MIBenum: 2026
+Source: Chinese for Taiwan Multi-byte set.
+        PCL Symbol Set Id: 18T
+Alias: csBig5
+
+Name: macintosh                                           [RFC1345,KXS2]
+MIBenum: 2027
+Source: The Unicode Standard ver1.0, ISBN 0-201-56788-1, Oct 1991
+Alias: mac
+Alias: csMacintosh
+
+Name: IBM037                                              [RFC1345,KXS2]
+MIBenum: 2028
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp037
+Alias: ebcdic-cp-us
+Alias: ebcdic-cp-ca
+Alias: ebcdic-cp-wt
+Alias: ebcdic-cp-nl
+Alias: csIBM037
+
+Name: IBM038                                              [RFC1345,KXS2]
+MIBenum: 2029
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+Alias: EBCDIC-INT
+Alias: cp038
+Alias: csIBM038
+
+Name: IBM273                                              [RFC1345,KXS2]
+MIBenum: 2030
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP273
+Alias: csIBM273
+
+Name: IBM274                                              [RFC1345,KXS2]
+MIBenum: 2031
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+Alias: EBCDIC-BE
+Alias: CP274
+Alias: csIBM274
+
+Name: IBM275                                              [RFC1345,KXS2]
+MIBenum: 2032
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: EBCDIC-BR
+Alias: cp275
+Alias: csIBM275
+
+Name: IBM277                                              [RFC1345,KXS2]
+MIBenum: 2033
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: EBCDIC-CP-DK
+Alias: EBCDIC-CP-NO
+Alias: csIBM277
+
+Name: IBM278                                              [RFC1345,KXS2]
+MIBenum: 2034
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP278
+Alias: ebcdic-cp-fi
+Alias: ebcdic-cp-se
+Alias: csIBM278
+
+Name: IBM280                                              [RFC1345,KXS2]
+MIBenum: 2035
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP280
+Alias: ebcdic-cp-it
+Alias: csIBM280
+
+Name: IBM281                                              [RFC1345,KXS2]
+MIBenum: 2036
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+Alias: EBCDIC-JP-E
+Alias: cp281
+Alias: csIBM281
+
+Name: IBM284                                              [RFC1345,KXS2]
+MIBenum: 2037
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP284
+Alias: ebcdic-cp-es
+Alias: csIBM284
+
+Name: IBM285                                              [RFC1345,KXS2]
+MIBenum: 2038
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP285
+Alias: ebcdic-cp-gb
+Alias: csIBM285
+
+Name: IBM290                                              [RFC1345,KXS2]
+MIBenum: 2039
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+Alias: cp290
+Alias: EBCDIC-JP-kana
+Alias: csIBM290
+
+Name: IBM297                                              [RFC1345,KXS2]
+MIBenum: 2040
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp297
+Alias: ebcdic-cp-fr
+Alias: csIBM297
+
+Name: IBM420                                              [RFC1345,KXS2]
+MIBenum: 2041
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990, 
+        IBM NLS RM p 11-11
+Alias: cp420
+Alias: ebcdic-cp-ar1
+Alias: csIBM420
+
+Name: IBM423                                              [RFC1345,KXS2]
+MIBenum: 2042
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp423
+Alias: ebcdic-cp-gr
+Alias: csIBM423
+
+Name: IBM424                                              [RFC1345,KXS2]
+MIBenum: 2043
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp424
+Alias: ebcdic-cp-he
+Alias: csIBM424
+
+Name: IBM437                                              [RFC1345,KXS2]
+MIBenum: 2011
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp437
+Alias: 437
+Alias: csPC8CodePage437
+
+Name: IBM500                                              [RFC1345,KXS2]
+MIBenum: 2044
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP500
+Alias: ebcdic-cp-be
+Alias: ebcdic-cp-ch
+Alias: csIBM500
+
+Name: IBM851                                              [RFC1345,KXS2]
+MIBenum: 2045
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp851
+Alias: 851
+Alias: csIBM851
+
+Name: IBM852                                              [RFC1345,KXS2]
+MIBenum: 2010
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp852
+Alias: 852
+Alias: csPCp852
+
+Name: IBM855                                              [RFC1345,KXS2]
+MIBenum: 2046
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp855
+Alias: 855
+Alias: csIBM855
+
+Name: IBM857                                              [RFC1345,KXS2]
+MIBenum: 2047
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp857
+Alias: 857
+Alias: csIBM857
+
+Name: IBM860                                              [RFC1345,KXS2]
+MIBenum: 2048
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp860
+Alias: 860
+Alias: csIBM860
+
+Name: IBM861                                              [RFC1345,KXS2]
+MIBenum: 2049
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp861
+Alias: 861
+Alias: cp-is
+Alias: csIBM861
+
+Name: IBM863                                              [RFC1345,KXS2]
+MIBenum: 2050
+Source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+Alias: cp863
+Alias: 863
+Alias: csIBM863
+
+Name: IBM864                                              [RFC1345,KXS2]
+MIBenum: 2051
+Source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+Alias: cp864
+Alias: csIBM864
+
+Name: IBM865                                              [RFC1345,KXS2]
+MIBenum: 2052
+Source: IBM DOS 3.3 Ref (Abridged), 94X9575 (Feb 1987)
+Alias: cp865
+Alias: 865
+Alias: csIBM865
+
+Name: IBM868                                              [RFC1345,KXS2]
+MIBenum: 2053
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP868
+Alias: cp-ar
+Alias: csIBM868
+
+Name: IBM869                                              [RFC1345,KXS2]
+MIBenum: 2054
+Source: IBM Keyboard layouts and code pages, PN 07G4586 June 1991
+Alias: cp869
+Alias: 869
+Alias: cp-gr
+Alias: csIBM869
+
+Name: IBM870                                              [RFC1345,KXS2]
+MIBenum: 2055
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP870
+Alias: ebcdic-cp-roece
+Alias: ebcdic-cp-yu
+Alias: csIBM870
+
+Name: IBM871                                              [RFC1345,KXS2]
+MIBenum: 2056
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP871
+Alias: ebcdic-cp-is
+Alias: csIBM871
+
+Name: IBM880                                              [RFC1345,KXS2]
+MIBenum: 2057
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp880
+Alias: EBCDIC-Cyrillic
+Alias: csIBM880
+
+Name: IBM891                                              [RFC1345,KXS2]
+MIBenum: 2058
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp891
+Alias: csIBM891
+
+Name: IBM903                                              [RFC1345,KXS2]
+MIBenum: 2059
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp903
+Alias: csIBM903
+
+Name: IBM904                                              [RFC1345,KXS2]
+MIBenum: 2060
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: cp904
+Alias: 904
+Alias: csIBBM904
+
+Name: IBM905                                              [RFC1345,KXS2]
+MIBenum: 2061
+Source: IBM 3174 Character Set Ref, GA27-3831-02, March 1990
+Alias: CP905
+Alias: ebcdic-cp-tr
+Alias: csIBM905
+
+Name: IBM918                                              [RFC1345,KXS2]
+MIBenum: 2062
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP918
+Alias: ebcdic-cp-ar2
+Alias: csIBM918
+
+Name: IBM1026                                             [RFC1345,KXS2]
+MIBenum: 2063
+Source: IBM NLS RM Vol2 SE09-8002-01, March 1990
+Alias: CP1026
+Alias: csIBM1026
+
+Name: EBCDIC-AT-DE                                        [RFC1345,KXS2]
+MIBenum: 2064
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csIBMEBCDICATDE
+
+Name: EBCDIC-AT-DE-A                                      [RFC1345,KXS2]
+MIBenum: 2065 
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987 
+Alias: csEBCDICATDEA
+
+Name: EBCDIC-CA-FR                                        [RFC1345,KXS2]
+MIBenum: 2066
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICCAFR
+
+Name: EBCDIC-DK-NO                                        [RFC1345,KXS2]
+MIBenum: 2067
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICDKNO
+
+Name: EBCDIC-DK-NO-A                                      [RFC1345,KXS2]
+MIBenum: 2068
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICDKNOA
+
+Name: EBCDIC-FI-SE                                        [RFC1345,KXS2]
+MIBenum: 2069
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICFISE
+
+Name: EBCDIC-FI-SE-A                                      [RFC1345,KXS2]
+MIBenum: 2070
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICFISEA
+
+Name: EBCDIC-FR                                           [RFC1345,KXS2]
+MIBenum: 2071
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICFR
+
+Name: EBCDIC-IT                                           [RFC1345,KXS2]
+MIBenum: 2072
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICIT
+
+Name: EBCDIC-PT                                           [RFC1345,KXS2]
+MIBenum: 2073
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICPT
+
+Name: EBCDIC-ES                                           [RFC1345,KXS2]
+MIBenum: 2074
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICES
+
+Name: EBCDIC-ES-A                                         [RFC1345,KXS2]
+MIBenum: 2075
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICESA
+
+Name: EBCDIC-ES-S                                         [RFC1345,KXS2]
+MIBenum: 2076
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICESS
+
+Name: EBCDIC-UK                                           [RFC1345,KXS2]
+MIBenum: 2077
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICUK
+
+Name: EBCDIC-US                                           [RFC1345,KXS2]
+MIBenum: 2078
+Source: IBM 3270 Char Set Ref Ch 10, GA27-2837-9, April 1987
+Alias: csEBCDICUS
+
+Name: UNKNOWN-8BIT                                             [RFC1428]
+MIBenum: 2079
+Alias: csUnknown8BiT
+
+Name: MNEMONIC                                            [RFC1345,KXS2]
+MIBenum: 2080
+Source: RFC 1345, also known as "mnemonic+ascii+38"
+Alias: csMnemonic
+
+Name: MNEM                                                [RFC1345,KXS2]
+MIBenum: 2081
+Source: RFC 1345, also known as "mnemonic+ascii+8200"
+Alias: csMnem
+
+Name: VISCII                                                   [RFC1456]
+MIBenum: 2082
+Source: RFC 1456
+Alias: csVISCII
+
+Name: VIQR                                                     [RFC1456]
+MIBenum: 2083
+Source: RFC 1456
+Alias: csVIQR
+
+Name: KOI8-R  (preferred MIME name)                            [RFC1489]
+MIBenum: 2084
+Source: RFC 1489, based on GOST-19768-74, ISO-6937/8, 
+        INIS-Cyrillic, ISO-5427.
+Alias: csKOI8R
+
+Name: HZ-GB-2312
+MIBenum: 2085
+Source: RFC 1842, RFC 1843                                       [RFC1842, RFC1843]
+
+Name: IBM866                                                     [Pond]
+MIBenum: 2086
+Source: IBM NLDG Volume 2 (SE09-8002-03) August 1994
+Alias: cp866
+Alias: 866
+Alias: csIBM866
+
+Name: IBM775                                                   [HP-PCL5]
+MIBenum: 2087
+Source: HP PCL 5 Comparison Guide (P/N 5021-0329) pp B-13, 1996
+Alias: cp775
+Alias: csPC775Baltic
+
+Name: KOI8-U                                                   [RFC2319]
+MIBenum: 2088
+Source: RFC 2319
+
+Name: IBM00858
+MIBenum: 2089
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM00858)    [Mahdi]
+Alias: CCSID00858
+Alias: CP00858
+Alias: PC-Multilingual-850+euro
+
+Name: IBM00924
+MIBenum: 2090
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM00924)    [Mahdi]
+Alias: CCSID00924
+Alias: CP00924
+Alias: ebcdic-Latin9--euro
+
+Name: IBM01140
+MIBenum: 2091
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01140)    [Mahdi]
+Alias: CCSID01140
+Alias: CP01140
+Alias: ebcdic-us-37+euro
+
+Name: IBM01141
+MIBenum: 2092
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01141)    [Mahdi]
+Alias: CCSID01141
+Alias: CP01141
+Alias: ebcdic-de-273+euro
+
+Name: IBM01142
+MIBenum: 2093
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01142)    [Mahdi]
+Alias: CCSID01142
+Alias: CP01142
+Alias: ebcdic-dk-277+euro
+Alias: ebcdic-no-277+euro
+
+Name: IBM01143
+MIBenum: 2094
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01143)    [Mahdi]
+Alias: CCSID01143
+Alias: CP01143
+Alias: ebcdic-fi-278+euro
+Alias: ebcdic-se-278+euro
+
+Name: IBM01144
+MIBenum: 2095
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01144)    [Mahdi]
+Alias: CCSID01144
+Alias: CP01144
+Alias: ebcdic-it-280+euro
+
+Name: IBM01145
+MIBenum: 2096
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01145)    [Mahdi]
+Alias: CCSID01145
+Alias: CP01145
+Alias: ebcdic-es-284+euro
+
+Name: IBM01146
+MIBenum: 2097
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01146)    [Mahdi]
+Alias: CCSID01146
+Alias: CP01146
+Alias: ebcdic-gb-285+euro
+
+Name: IBM01147
+MIBenum: 2098
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01147)    [Mahdi]
+Alias: CCSID01147
+Alias: CP01147
+Alias: ebcdic-fr-297+euro
+
+Name: IBM01148
+MIBenum: 2099
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01148)    [Mahdi]
+Alias: CCSID01148
+Alias: CP01148
+Alias: ebcdic-international-500+euro
+
+Name: IBM01149
+MIBenum: 2100
+Source: IBM See (http://www.iana.org/assignments/charset-reg/IBM01149)    [Mahdi]
+Alias: CCSID01149
+Alias: CP01149
+Alias: ebcdic-is-871+euro
+
+Name: Big5-HKSCS                                                  [Yick]
+MIBenum: 2101
+Source:   See (http://www.iana.org/assignments/charset-reg/Big5-HKSCS) 
+Alias: None
+
+Name: IBM1047                                                [Robrigado]
+MIBenum: 2102
+Source: IBM1047 (EBCDIC Latin 1/Open Systems)
+http://www-1.ibm.com/servers/eserver/iseries/software/globalization/pdf/cp01047z.pdf
+Alias: IBM-1047
+
+Name: PTCP154                                                    [Uskov]
+MIBenum: 2103
+Source: See (http://www.iana.org/assignments/charset-reg/PTCP154)
+Alias: csPTCP154
+Alias: PT154
+Alias: CP154
+Alias: Cyrillic-Asian
+
+Name:  Amiga-1251
+MIBenum:  2104
+Source:  See (http://www.amiga.ultranet.ru/Amiga-1251.html)
+Alias:  Ami1251
+Alias:  Amiga1251
+Alias:  Ami-1251
+(Aliases are provided for historical reasons and should not be used)
+                                                              [Malyshev]
+
+Name:  KOI7-switched
+MIBenum:  2105
+Source:  See <http://www.iana.org/assignments/charset-reg/KOI7-switched>
+Aliases:  None
+
+Name: BRF
+MIBenum: 2106
+Source: See <http://www.iana.org/assignments/charset-reg/BRF>                    [Thibault]
+Alias: csBRF
+
+Name: TSCII
+MIBenum: 2107
+Source: See <http://www.iana.org/assignments/charset-reg/TSCII>           [Kalyanasundaram]
+Alias: csTSCII
+
+Name: windows-1250
+MIBenum: 2250
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1250) [Lazhintseva]
+Alias: None
+
+Name: windows-1251
+MIBenum: 2251
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1251) [Lazhintseva]
+Alias: None
+
+Name: windows-1252
+MIBenum: 2252
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1252)       [Wendt]
+Alias: None
+
+Name: windows-1253
+MIBenum: 2253
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1253) [Lazhintseva]
+Alias: None
+
+Name: windows-1254
+MIBenum: 2254
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1254) [Lazhintseva]
+Alias: None
+
+Name: windows-1255
+MIBenum: 2255
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1255) [Lazhintseva]
+Alias: None
+
+Name: windows-1256
+MIBenum: 2256
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1256) [Lazhintseva]
+Alias: None 
+
+Name: windows-1257
+MIBenum: 2257
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1257) [Lazhintseva]
+Alias: None
+
+Name: windows-1258
+MIBenum: 2258
+Source: Microsoft  (http://www.iana.org/assignments/charset-reg/windows-1258) [Lazhintseva]
+Alias: None
+
+Name: TIS-620
+MIBenum: 2259
+Source: Thai Industrial Standards Institute (TISI)                             [Tantsetthi]
+
diff --git a/extra/io/encodings/iana/iana-docs.factor b/extra/io/encodings/iana/iana-docs.factor
new file mode 100644 (file)
index 0000000..d4a7a65
--- /dev/null
@@ -0,0 +1,12 @@
+USING: help.syntax help.markup ;
+IN: io.encodings.iana
+
+HELP: name>encoding
+{ $values { "name" "an encoding name" } { "encoding" "an encoding descriptor" } }
+{ "Given an IANA-registered encoding name, find the encoding descriptor that represents it, or " { $code f } " if it is not found (either not implemented in Factor or not registered)." } ;
+
+HELP: encoding>name
+{ $values { "encoding" "an encoding descriptor" } { "name" "an encoding name" } }
+{ "Given an encoding descriptor, return the preferred IANA name." } ;
+
+{ name>encoding encoding>name } related-words
diff --git a/extra/io/encodings/iana/iana-tests.factor b/extra/io/encodings/iana/iana-tests.factor
new file mode 100644 (file)
index 0000000..8cee07b
--- /dev/null
@@ -0,0 +1,5 @@
+USING: io.encodings.iana io.encodings.ascii tools.test ;
+
+[ ascii ] [ "US-ASCII" name>encoding ] unit-test
+[ ascii ] [ "ASCII" name>encoding ] unit-test
+[ "US-ASCII" ] [ ascii encoding>name ] unit-test
diff --git a/extra/io/encodings/iana/iana.factor b/extra/io/encodings/iana/iana.factor
new file mode 100644 (file)
index 0000000..24badaf
--- /dev/null
@@ -0,0 +1,55 @@
+! Copyright (C) 2008 Daniel Ehrenberg
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel strings unicode.syntax.backend io.files assocs
+splitting sequences io namespaces sets
+io.encodings.ascii io.encodings.utf8 io.encodings.utf16 io.encodings.8-bit ;
+IN: io.encodings.iana
+
+<PRIVATE
+VALUE: n>e-table
+
+: e>n-table H{
+    { ascii "US-ASCII" }
+    { utf8 "UTF-8" }
+    { utf16 "UTF-16" }
+    { utf16be "UTF-16BE" }
+    { utf16le "UTF-16LE" }
+    { latin1 "ISO-8859-1" }
+    { latin2 "ISO-8859-2" }
+    { latin3 "ISO-8859-3" }
+    { latin4 "ISO-8859-4" }
+    { latin/cyrillic "ISO-8859-5" }
+    { latin/arabic "ISO-8859-6" }
+    { latin/greek "ISO-8859-7" }
+    { latin/hebrew "ISO-8859-8" }
+    { latin5 "ISO-8859-9" }
+    { latin6 "ISO-8859-10" }
+} ;
+PRIVATE>
+
+: name>encoding ( name -- encoding )
+    n>e-table at ;
+
+: encoding>name ( encoding -- name )
+    e>n-table at ;
+
+<PRIVATE
+: parse-iana ( stream -- synonym-set )
+    lines { "" } split [
+        [ " " split ] map
+        [ first { "Name:" "Alias:" } member? ] filter
+        [ second ] map { "None" } diff
+    ] map ;
+
+: make-n>e ( stream -- n>e )
+    parse-iana [ [
+        dup [
+            e>n-table value-at
+            [ swap [ set ] with each ]
+            [ drop ] if*
+        ] with each
+    ] each ] H{ } make-assoc ;
+PRIVATE>
+
+"resource:extra/io/encodings/iana/character-sets"
+ascii <file-reader> make-n>e \ n>e-table set-value
diff --git a/extra/io/encodings/iana/summary.txt b/extra/io/encodings/iana/summary.txt
new file mode 100644 (file)
index 0000000..c95d763
--- /dev/null
@@ -0,0 +1 @@
+Tables for IANA encoding names
index dadb627fc073fcf2ce826438b61c858d7b3bf553..45bbec20e345cd0cd9d70a4da7c26edfd56e1752 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: help.markup help.syntax quotations kernel io math
-calendar ;
+USING: help.markup help.syntax quotations kernel io io.files
+math calendar ;
 IN: io.launcher
 
 ARTICLE: "io.launcher.command" "Specifying a command"
@@ -26,10 +26,10 @@ $nl
 "To specify redirection, set the " { $snippet "stdin" } ", " { $snippet "stdout" } " and " { $snippet "stderr" } " slots of a " { $link process } " to one of the following values:"
 { $list
     { { $link f } " - default value; the stream is either inherited from the current process, or is a " { $link <process-stream> } " pipe" }
-    { { $link +inherit+ } " - the stream is inherited from the current process, overriding a " { $link <process-stream> } " pipe" }
     { { $link +closed+ } " - the stream is closed; reads will return end of file and writes will fails" }
     { { $link +stdout+ } " - a special value for the " { $snippet "stderr" } " slot only, indicating that the standard output and standard error streams should be merged" }
     { "a path name - the stream is sent to the given file, which must exist for input and is created automatically on output" }
+    { "an " { $link appender } " wrapping a path name - output is sent to the end given file, as with " { $link <file-appender> } }
     { "a file stream or a socket - the stream is connected to the given Factor stream, which cannot be used again from within Factor and must be closed after the process has been started" }
 } ;
 
@@ -47,12 +47,16 @@ ARTICLE: "io.launcher.priority" "Setting process priority"
 HELP: +closed+
 { $description "Possible value for the " { $snippet "stdin" } ", " { $snippet "stdout" } ", and " { $snippet "stderr" } " slots of a " { $link process } "." } ;
 
-HELP: +inherit+
-{ $description "Possible value for the " { $snippet "stdin" } ", " { $snippet "stdout" } ", and " { $snippet "stderr" } " slots of a " { $link process } "." } ;
-
 HELP: +stdout+
 { $description "Possible value for the " { $snippet "stderr" } " slot of a " { $link process } "." } ;
 
+HELP: appender
+{ $class-description "An object representing a file to append to. Instances are created with " { $link <appender> } "." } ;
+
+HELP: <appender>
+{ $values { "path" "a pathname string" } { "appender" appender } }
+{ $description "Creates an object which may be stored in the " { $snippet "stdout" } " or " { $snippet "stderr" } " slot of a " { $link process } " instance." } ;
+
 HELP: +prepend-environment+
 { $description "Possible value of " { $snippet "environment-mode" } " slot of a " { $link process } "."
 $nl
@@ -138,13 +142,6 @@ HELP: <process-stream>
   { "stream" "a bidirectional stream" } }
 { $description "Launches a process and redirects its input and output via a pair of pipes which may be read and written as a stream of the given encoding." } ;
 
-HELP: with-process-stream
-{ $values
-  { "desc" "a launch descriptor" }
-  { "quot" quotation }
-  { "status" "an exit code" } }
-{ $description "Calls " { $snippet "quot" } " in a dynamic scope where " { $link stdio } " is rebound to a process stream. After the quotation returns, waits for the process to end and outputs the exit code." } ;
-
 HELP: wait-for-process
 { $values { "process" process } { "status" integer } }
 { $description "If the process is still running, waits for it to exit, otherwise outputs the exit code immediately. Can be called multiple times on the same process." } ;
@@ -175,8 +172,9 @@ ARTICLE: "io.launcher.launch" "Launching processes"
 { $subsection try-process }
 { $subsection run-detached }
 "Redirecting standard input and output to a pipe:"
-{ $subsection <process-stream> }
-{ $subsection with-process-stream } ;
+{ $subsection <process-reader> }
+{ $subsection <process-writer> }
+{ $subsection <process-stream> } ;
 
 ARTICLE: "io.launcher.examples" "Launcher examples"
 "Starting a command and waiting for it to finish:"
@@ -212,7 +210,7 @@ ARTICLE: "io.launcher.examples" "Launcher examples"
     "    <process>"
     "        swap >>stderr"
     "        \"report\" >>command"
-    "    ascii <process-stream> lines sort reverse [ print ] each"
+    "    ascii <process-reader> lines sort reverse [ print ] each"
     "] with-disposal"
 } ;
 
index bacb8eb5a965d1a3f0911c857589530b6bdc433c..003f38202073b19339ba25eacf182cfa3857bd25 100755 (executable)
@@ -2,3 +2,5 @@ IN: io.launcher.tests
 USING: tools.test io.launcher ;
 
 \ <process-stream> must-infer
+\ <process-reader> must-infer
+\ <process-writer> must-infer
index 6ee866052866b8ef007215c15505806ca1b42471..e9fbdaea62d6a9f70a2a139b85771c0d5a7ddc2e 100755 (executable)
@@ -1,9 +1,10 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: io io.backend io.timeouts system kernel namespaces
-strings hashtables sequences assocs combinators vocabs.loader
-init threads continuations math io.encodings io.streams.duplex
-io.nonblocking accessors concurrency.flags ;
+USING: system kernel namespaces strings hashtables sequences 
+assocs combinators vocabs.loader init threads continuations
+math accessors concurrency.flags destructors
+io io.backend io.timeouts io.pipes io.pipes.private io.encodings
+io.streams.duplex io.nonblocking ;
 IN: io.launcher
 
 TUPLE: process < identity-tuple
@@ -26,9 +27,12 @@ handle status
 killed ;
 
 SYMBOL: +closed+
-SYMBOL: +inherit+
 SYMBOL: +stdout+
 
+TUPLE: appender path ;
+
+: <appender> ( path -- appender ) appender boa ;
+
 SYMBOL: +prepend-environment+
 SYMBOL: +replace-environment+
 SYMBOL: +append-environment+
@@ -145,20 +149,63 @@ M: process set-timeout set-process-timeout ;
 
 M: process timed-out kill-process ;
 
-HOOK: (process-stream) io-backend ( process -- handle in out )
+M: object run-pipeline-element
+    [ >process swap >>stdout swap >>stdin run-detached ]
+    [ drop [ [ close-handle ] when* ] bi@ ]
+    3bi
+    wait-for-process ;
 
-: <process-stream*> ( desc encoding -- stream process )
-    >r >process dup dup (process-stream) <reader&writer>
-    r> <encoder-duplex> -roll
-    process-started ;
+: <process-reader*> ( process encoding -- process stream )
+    [
+        >r (pipe) {
+            [ add-error-destructor ]
+            [
+                swap >process
+                    [ swap out>> or ] change-stdout
+                run-detached
+            ]
+            [ out>> close-handle ]
+            [ in>> <reader> ]
+        } cleave r> <decoder>
+    ] with-destructors ;
+
+: <process-reader> ( desc encoding -- stream )
+    <process-reader*> nip ; inline
+
+: <process-writer*> ( process encoding -- process stream )
+    [
+        >r (pipe) {
+            [ add-error-destructor ]
+            [
+                swap >process
+                    [ swap in>> or ] change-stdout
+                run-detached
+            ]
+            [ in>> close-handle ]
+            [ out>> <writer> ]
+        } cleave r> <encoder>
+    ] with-destructors ;
+
+: <process-writer> ( desc encoding -- stream )
+    <process-writer*> nip ; inline
+
+: <process-stream*> ( process encoding -- process stream )
+    [
+        >r (pipe) (pipe) {
+            [ [ add-error-destructor ] bi@ ]
+            [
+                rot >process
+                    [ swap out>> or ] change-stdout
+                    [ swap in>> or ] change-stdin
+                run-detached
+            ]
+            [ [ in>> close-handle ] [ out>> close-handle ] bi* ]
+            [ [ in>> <reader> ] [ out>> <writer> ] bi* ]
+        } 2cleave r> <encoder-duplex>
+    ] with-destructors ;
 
 : <process-stream> ( desc encoding -- stream )
-    <process-stream*> drop ; inline
-
-: with-process-stream ( desc quot -- status )
-    swap <process-stream*> >r
-    [ swap with-stream ] keep
-    r> wait-for-process ; inline
+    <process-stream*> nip ; inline
 
 : notify-exit ( process status -- )
     >>status
@@ -168,9 +215,9 @@ HOOK: (process-stream) io-backend ( process -- handle in out )
 
 GENERIC: underlying-handle ( stream -- handle )
 
-M: port underlying-handle port-handle ;
+M: port underlying-handle handle>> ;
 
 M: duplex-stream underlying-handle
-    dup duplex-stream-in underlying-handle
-    swap duplex-stream-out underlying-handle tuck =
-    [ "Invalid duplex stream" throw ] when ;
+    [ in>> underlying-handle ]
+    [ out>> underlying-handle ] bi
+    [ = [ "Invalid duplex stream" throw ] when ] keep ;
index a00f7cd92b38248bc8e734e51986d8b97036dea9..da3ed38688fc6dac31cfacf09e15c4ab75ff9fdc 100755 (executable)
@@ -2,9 +2,11 @@ USING: io io.mmap io.files kernel tools.test continuations
 sequences io.encodings.ascii accessors ;
 IN: io.mmap.tests
 
-[ "mmap-test-file.txt" resource-path delete-file ] ignore-errors
-[ ] [ "12345" "mmap-test-file.txt" resource-path ascii set-file-contents ] unit-test
-[ ] [ "mmap-test-file.txt" resource-path dup file-info size>> [ CHAR: 2 0 pick set-nth drop ] with-mapped-file ] unit-test
-[ 5 ] [ "mmap-test-file.txt" resource-path dup file-info size>> [ length ] with-mapped-file ] unit-test
-[ "22345" ] [ "mmap-test-file.txt" resource-path ascii file-contents ] unit-test
-[ "mmap-test-file.txt" resource-path delete-file ] ignore-errors
+[ "resource:mmap-test-file.txt" delete-file ] ignore-errors
+[ ] [ "12345" "resource:mmap-test-file.txt" ascii set-file-contents ] unit-test
+[ ] [ "resource:mmap-test-file.txt" dup file-info size>> [ CHAR: 2 0 pick set-nth drop ] with-mapped-file ] unit-test
+[ 5 ] [ "resource:mmap-test-file.txt" dup file-info size>> [ length ] with-mapped-file ] unit-test
+[ "22345" ] [ "resource:mmap-test-file.txt" ascii file-contents ] unit-test
+[ "resource:mmap-test-file.txt" delete-file ] ignore-errors
+
+
index 59246115cfc8a8f486f897d3b11456de81c36406..a07443783c61bb551b7805d93d216c9d638aeed8 100755 (executable)
@@ -21,7 +21,10 @@ M: mapped-file set-nth-unsafe
 
 INSTANCE: mapped-file sequence
 
-HOOK: <mapped-file> io-backend ( path length -- mmap )
+HOOK: (mapped-file) io-backend ( path length -- mmap )
+
+: <mapped-file> ( path length -- mmap )
+    >r normalize-path r> (mapped-file) ;
 
 HOOK: close-mapped-file io-backend ( mmap -- )
 
index 0bf7a6ccec7495dfc49dfb938ef5acea316ec012..d25d4b70504f191add8f1adb502716d000ded2b1 100755 (executable)
@@ -1,9 +1,9 @@
 ! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math kernel io sequences io.buffers io.timeouts generic
-byte-vectors system io.streams.duplex io.encodings
-io.backend continuations debugger classes byte-arrays namespaces
-splitting dlists assocs io.encodings.binary inspector accessors ;
+byte-vectors system io.encodings math.order io.backend
+continuations debugger classes byte-arrays namespaces splitting
+dlists assocs io.encodings.binary inspector accessors ;
 IN: io.nonblocking
 
 SYMBOL: default-buffer-size
diff --git a/extra/io/pipes/pipes-docs.factor b/extra/io/pipes/pipes-docs.factor
new file mode 100644 (file)
index 0000000..d51ae94
--- /dev/null
@@ -0,0 +1,47 @@
+USING: help.markup help.syntax continuations io ;
+IN: io.pipes
+
+HELP: pipe
+{ $class-description "A low-level pipe. Instances are created by calling " { $link (pipe) } " and closed by calling " { $link dispose } "." } ;
+
+HELP: (pipe)
+{ $values { "pipe" pipe } }
+{ $description "Opens a new pipe. This is a low-level word; the " { $link <pipe> } " and " { $link run-pipeline } " words can be used in most cases instead." } ;
+
+HELP: <pipe>
+{ $values { "encoding" "an encoding specifier" } { "stream" "a bidirectional stream" } }
+{ $description "Opens a new pipe and wraps it in a stream. Data written from the stream can be read back from the same stream instance." }
+{ $notes "Pipe streams must be disposed by calling " { $link dispose } " or " { $link with-disposal } " to avoid resource leaks." } ;
+
+HELP: run-pipeline
+{ $values { "seq" "a sequence of pipeline components" } { "results" "a sequence of pipeline results" } }
+{ $description
+    "Creates a pipe between each pipeline component, with the output of each component becoming the input of the next."
+    $nl
+    "The first component reads input from " { $link input-stream } " and the last component writes output to " { $link output-stream } "."
+    $nl
+    "Each component runs in its own thread, and the word returns when all components finish executing. Each component outputs a result value."
+    $nl
+    "Pipeline components must be one of the following:"
+    { $list
+        { "A quotation. The quotation is called with both " { $link input-stream } " and " { $link output-stream } " rebound, except for the first and last pipeline components, and it must output a single value." }
+        { "A process launch descriptor. See " { $link "io.launcher.descriptors" } "." }
+    }
+}
+{ $examples
+    "Print the lines of a log file which contain the string ``error'', sort them and filter out duplicates, using Unix shell commands only:"
+    { $code "{ \"cat log.txt\" \"grep error\" \"sort\" \"uniq\" } run-pipeline" }
+} ;
+
+ARTICLE: "io.pipes" "Pipes"
+"A " { $emphasis "pipe" } " is a unidirectional channel for transfer of bytes. Data written to one end of the pipe can be read from the other. Pipes can be used to pass data between processes; they can also be used within a single process to implement communication between coroutines."
+$nl
+"Low-level pipes:"
+{ $subsection pipe }
+{ $subsection (pipe) }
+"High-level pipe streams:"
+{ $subsection <pipe> }
+"Pipelines of coroutines and processes:"
+{ $subsection run-pipeline } ;
+
+ABOUT: "io.pipes"
diff --git a/extra/io/pipes/pipes-tests.factor b/extra/io/pipes/pipes-tests.factor
new file mode 100755 (executable)
index 0000000..c1b37f6
--- /dev/null
@@ -0,0 +1,26 @@
+USING: io io.pipes io.streams.string io.encodings.utf8
+io.streams.duplex io.encodings namespaces continuations
+tools.test kernel ;
+IN: io.pipes.tests
+
+[ "Hello" ] [
+    utf8 <pipe> [
+        "Hello" print flush
+        readln
+    ] with-stream
+] unit-test
+
+[ { } ] [ { } run-pipeline ] unit-test
+[ { f } ] [ { [ f ] } run-pipeline ] unit-test
+[ { "Hello" } ] [
+    "Hello" [
+        { [ input-stream [ utf8 <decoder> ] change readln ] } run-pipeline
+    ] with-string-reader
+] unit-test
+
+[ { f "Hello" } ] [
+    {
+        [ output-stream [ utf8 <encoder> ] change "Hello" print flush f ]
+        [ input-stream [ utf8 <decoder> ] change readln ]
+    } run-pipeline
+] unit-test
diff --git a/extra/io/pipes/pipes.factor b/extra/io/pipes/pipes.factor
new file mode 100644 (file)
index 0000000..72d2737
--- /dev/null
@@ -0,0 +1,53 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: io.encodings io.backend io.nonblocking io.streams.duplex
+io splitting sequences sequences.lib namespaces kernel
+destructors math concurrency.combinators accessors
+arrays continuations quotations ;
+IN: io.pipes
+
+TUPLE: pipe in out ;
+
+M: pipe dispose ( pipe -- )
+    [ in>> close-handle ] [ out>> close-handle ] bi ;
+
+HOOK: (pipe) io-backend ( -- pipe )
+
+: <pipe> ( encoding -- stream )
+    [
+        >r (pipe)
+        [ add-error-destructor ]
+        [ in>> <reader> ]
+        [ out>> <writer> ]
+        tri
+        r> <encoder-duplex>
+    ] with-destructors ;
+
+<PRIVATE
+
+: ?reader [ <reader> dup add-always-destructor ] [ input-stream get ] if* ;
+: ?writer [ <writer> dup add-always-destructor ] [ output-stream get ] if* ;
+
+GENERIC: run-pipeline-element ( input-fd output-fd obj -- quot )
+
+M: callable run-pipeline-element
+    [
+        >r [ ?reader ] [ ?writer ] bi*
+        r> with-streams*
+    ] with-destructors ;
+
+: <pipes> ( n -- pipes )
+    [
+        [ (pipe) dup add-error-destructor ] replicate
+        T{ pipe } [ prefix ] [ suffix ] bi
+        2 <clumps>
+    ] with-destructors ;
+
+PRIVATE>
+
+: run-pipeline ( seq -- results )
+    [ length dup zero? [ drop { } ] [ 1- <pipes> ] if ] keep
+    [
+        >r [ first in>> ] [ second out>> ] bi
+        r> run-pipeline-element
+    ] 2parallel-map ;
index 7eda48f747e3458a909ed686456e0f412691c5f0..50f38cb1465fc08224082d8085c2d175511f5f2b 100755 (executable)
@@ -3,8 +3,8 @@ IN: io.server
 
 HELP: with-server
 { $values { "seq" "a sequence of address specifiers" } { "service" "a string or " { $link f } } { "encoding" "an encoding to use for client connections" } { "quot" "a quotation" } }
-{ $description "Starts a TCP/IP server. The quotation is called in a new thread for each client connection, with the client connection being the " { $link stdio } " stream. Client connections are logged to the " { $link stdio } " stream at the time the server was started." } ;
+{ $description "Starts a TCP/IP server. The quotation is called in a new thread for each client connection, with the client connection being both the " { $link input-stream } " and " { $link output-stream } "." } ;
 
 HELP: with-datagrams
 { $values { "seq" "a sequence of address specifiers" } { "service" "a string or " { $link f } } { "quot" "a quotation" } }
-{ $description "Starts a UDP/IP server. The quotation is called for each datagram packet received. Datagram packets are logged to the " { $link stdio } " stream at the time the server was started." } ;
+{ $description "Starts a UDP/IP server. The quotation is called for each datagram packet received." } ;
index 1d5ed16dc58596af8d4e412cc3b5838f806bbde7..1d626a9e152a1bb6822ca2e10a2a62981a4c665d 100755 (executable)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2003, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: io io.sockets io.files logging continuations kernel
-math math.parser namespaces parser sequences strings
-prettyprint debugger quotations calendar
+USING: io io.sockets io.files io.streams.duplex logging
+continuations kernel math math.parser namespaces parser
+sequences strings prettyprint debugger quotations calendar
 threads concurrency.combinators assocs ;
 IN: io.server
 
@@ -47,7 +47,7 @@ PRIVATE>
     ] with-variable ; inline
 
 : stop-server ( -- )
-    servers get [ dispose ] each ;
+    servers get dispose-each ;
 
 <PRIVATE
 
index 2a376e18c2cc7cb25525d1984df53390dd6966c2..fa82080259529c709110ff8179540b874b32dc98 100755 (executable)
@@ -103,7 +103,7 @@ M: f parse-sockaddr nip ;
 : parse-addrinfo-list ( addrinfo -- seq )
     [ addrinfo-next ] follow
     [ addrinfo>addrspec ] map
-    [ ] subset ;
+    [ ] filter ;
 
 : prepare-resolve-host ( host serv passive? -- host' serv' flags )
     #! If the port is a number, we resolve for 'http' then
index ad78b4631cac2472f3b5dacb9d204575f5b98ecc..ee3cb3aa7ba0ad77945ec8c353ac232b452a34ca 100755 (executable)
@@ -14,6 +14,7 @@ ARTICLE: "network-addressing" "Address specifiers"
 ARTICLE: "network-connection" "Connection-oriented networking"
 "Network connections can be established with this word:"
 { $subsection <client> }
+{ $subsection with-client }
 "Connection-oriented network servers are implemented by first opening a server socket, then waiting for connections:"
 { $subsection <server> }
 { $subsection accept }
index 859dcb4cdc69a31f53f389112e32e553272df0b4..f835f0beb2d03ac1e876061cd91a236c35b1f843 100755 (executable)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2007, 2008 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: generic kernel io.backend namespaces continuations
-sequences arrays io.encodings io.nonblocking accessors ;
+sequences arrays io.encodings io.nonblocking io.streams.duplex
+accessors ;
 IN: io.sockets
 
 TUPLE: local path ;
@@ -30,6 +31,9 @@ M: object (client) ((client)) ;
 : <client> ( addrspec encoding -- stream )
     >r (client) r> <encoder-duplex> ;
 
+: with-client ( addrspec encoding quot -- )
+    >r <client> r> with-stream ; inline
+
 HOOK: (server) io-backend ( addrspec -- handle )
 
 : <server> ( addrspec encoding -- server )
diff --git a/extra/io/streams/duplex/authors.txt b/extra/io/streams/duplex/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/io/streams/duplex/duplex-docs.factor b/extra/io/streams/duplex/duplex-docs.factor
new file mode 100755 (executable)
index 0000000..15d401a
--- /dev/null
@@ -0,0 +1,39 @@
+USING: help.markup help.syntax io continuations quotations ;
+IN: io.streams.duplex
+
+ARTICLE: "io.streams.duplex" "Duplex streams"
+"Duplex streams combine an input stream and an output stream into a bidirectional stream."
+{ $subsection duplex-stream }
+{ $subsection <duplex-stream> }
+"A pair of combinators for rebinding both default streams at once:"
+{ $subsection with-stream }
+{ $subsection with-stream* } ;
+
+ABOUT: "io.streams.duplex"
+
+HELP: duplex-stream
+{ $class-description "A bidirectional stream wrapping an input and output stream." } ;
+
+HELP: <duplex-stream>
+{ $values { "in" "an input stream" } { "out" "an output stream" } { "stream" " a duplex stream" } }
+{ $description "Creates a duplex stream. Writing to a duplex stream will write to " { $snippet "out" } ", and reading from a duplex stream will read from " { $snippet "in" } ". Closing a duplex stream closes both the input and output streams." } ;
+
+HELP: stream-closed-twice
+{ $error-description "This error is thrown when performing an I/O operation on a " { $link duplex-stream } " which has been closed with " { $link dispose } "." } ;
+
+HELP: with-stream
+{ $values { "stream" duplex-stream } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope, with both " { $link input-stream } " and " { $link output-stream } " rebound to  " { $snippet "stream" } ". The stream is closed if the quotation returns or throws an error." } ;
+
+HELP: with-stream*
+{ $values { "stream" duplex-stream } { "quot" quotation } }
+{ $description "Calls the quotation in a new dynamic scope, with both " { $link input-stream } " and " { $link output-stream } " rebound to  " { $snippet "stream" } "." }
+{ $notes "This word does not close the stream. Compare with " { $link with-stream } "." } ;
+
+HELP: <encoder-duplex>
+{ $values { "stream-in" "an input stream" }
+    { "stream-out" "an output stream" }
+    { "encoding" "an encoding descriptor" }
+    { "duplex" "an encoded duplex stream" } }
+{ $description "Wraps the given streams in an encoder or decoder stream, and puts them together in a duplex stream for input and output. If either input stream is already encoded, that encoding is stripped off before it is reencoded. The encoding descriptor must conform to the " { $link "encodings-protocol" } "." }
+$low-level-note ;
diff --git a/extra/io/streams/duplex/duplex-tests.factor b/extra/io/streams/duplex/duplex-tests.factor
new file mode 100755 (executable)
index 0000000..ebc6b3b
--- /dev/null
@@ -0,0 +1,40 @@
+USING: io.streams.duplex io kernel continuations tools.test ;
+IN: io.streams.duplex.tests
+
+! Test duplex stream close behavior
+TUPLE: closing-stream closed? ;
+
+: <closing-stream> closing-stream new ;
+
+M: closing-stream dispose
+    dup closing-stream-closed? [
+        "Closing twice!" throw
+    ] [
+        t swap set-closing-stream-closed?
+    ] if ;
+
+TUPLE: unclosable-stream ;
+
+: <unclosable-stream> unclosable-stream new ;
+
+M: unclosable-stream dispose
+    "Can't close me!" throw ;
+
+[ ] [
+    <closing-stream> <closing-stream> <duplex-stream>
+    dup dispose dispose
+] unit-test
+
+[ t ] [
+    <unclosable-stream> <closing-stream> [
+        <duplex-stream>
+        [ dup dispose ] [ 2drop ] recover
+    ] keep closing-stream-closed?
+] unit-test
+
+[ t ] [
+    <closing-stream> [ <unclosable-stream>
+        <duplex-stream>
+        [ dup dispose ] [ 2drop ] recover
+    ] keep closing-stream-closed?
+] unit-test
diff --git a/extra/io/streams/duplex/duplex.factor b/extra/io/streams/duplex/duplex.factor
new file mode 100755 (executable)
index 0000000..cb96d80
--- /dev/null
@@ -0,0 +1,56 @@
+! Copyright (C) 2005, 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel continuations io io.encodings io.encodings.private
+io.timeouts debugger inspector listener accessors delegate
+delegate.protocols ;
+IN: io.streams.duplex
+
+! We ensure that the stream can only be closed once, to preserve
+! integrity of duplex I/O ports.
+
+TUPLE: duplex-stream in out closed ;
+
+: <duplex-stream> ( in out -- stream )
+    f duplex-stream boa ;
+
+ERROR: stream-closed-twice ;
+
+M: stream-closed-twice summary
+    drop "Attempt to perform I/O on closed stream" ;
+
+<PRIVATE
+
+: check-closed ( stream -- stream )
+    dup closed>> [ stream-closed-twice ] when ; inline
+
+: in ( duplex -- stream ) check-closed in>> ;
+
+: out ( duplex -- stream ) check-closed out>> ;
+
+PRIVATE>
+
+CONSULT: input-stream-protocol duplex-stream in ;
+
+CONSULT: output-stream-protocol duplex-stream out ;
+
+M: duplex-stream set-timeout
+    [ in set-timeout ] [ out set-timeout ] 2bi ;
+
+M: duplex-stream dispose
+    #! The output stream is closed first, in case both streams
+    #! are attached to the same file descriptor, the output
+    #! buffer needs to be flushed before we close the fd.
+    dup closed>> [
+        t >>closed
+        [ dup out>> dispose ]
+        [ dup in>> dispose ] [ ] cleanup
+    ] unless drop ;
+
+: <encoder-duplex> ( stream-in stream-out encoding -- duplex )
+    tuck reencode >r redecode r> <duplex-stream> ;
+
+: with-stream* ( stream quot -- )
+    >r [ in>> ] [ out>> ] bi r> with-streams* ; inline
+
+: with-stream ( stream quot -- )
+    >r [ in>> ] [ out>> ] bi r> with-streams ; inline
diff --git a/extra/io/streams/duplex/summary.txt b/extra/io/streams/duplex/summary.txt
new file mode 100644 (file)
index 0000000..b15d3aa
--- /dev/null
@@ -0,0 +1 @@
+Combine an input and an output stream into a single duplex stream
index eee66239bed268c12515b778d84df2a1b857f0ce..384a3806b8511e249917bef338f28110a0ee251f 100755 (executable)
@@ -1,25 +1,38 @@
 ! Copyright (C) 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 IN: io.streams.null
-USING: kernel io io.timeouts continuations ;
+USING: kernel io io.timeouts io.streams.duplex continuations ;
 
 TUPLE: null-stream ;
 
 M: null-stream dispose drop ;
 M: null-stream set-timeout 2drop ;
-M: null-stream stream-readln drop f ;
-M: null-stream stream-read1 drop f ;
-M: null-stream stream-read-until 2drop f f ;
-M: null-stream stream-read 2drop f ;
-M: null-stream stream-write1 2drop ;
-M: null-stream stream-write 2drop ;
-M: null-stream stream-nl drop ;
-M: null-stream stream-flush drop ;
-M: null-stream stream-format 3drop ;
-M: null-stream make-span-stream nip ;
-M: null-stream make-block-stream nip ;
-M: null-stream make-cell-stream nip ;
-M: null-stream stream-write-table 3drop ;
+
+TUPLE: null-reader < null-stream ;
+
+M: null-reader stream-readln drop f ;
+M: null-reader stream-read1 drop f ;
+M: null-reader stream-read-until 2drop f f ;
+M: null-reader stream-read 2drop f ;
+
+TUPLE: null-writer < null-stream ;
+
+M: null-writer stream-write1 2drop ;
+M: null-writer stream-write 2drop ;
+M: null-writer stream-nl drop ;
+M: null-writer stream-flush drop ;
+M: null-writer stream-format 3drop ;
+M: null-writer make-span-stream nip ;
+M: null-writer make-block-stream nip ;
+M: null-writer make-cell-stream nip ;
+M: null-writer stream-write-table 3drop ;
+
+: with-null-reader ( quot -- )
+    T{ null-reader } swap with-input-stream* ; inline
+
+: with-null-writer ( quot -- )
+    T{ null-writer } swap with-output-stream* ; inline
 
 : with-null-stream ( quot -- )
-    T{ null-stream } swap with-stream* ; inline
+    T{ duplex-stream f T{ null-reader } T{ null-writer } }
+    swap with-stream* ; inline
index f1031e98e2b0619b873795796458937d31753143..f9ffd5e98ffd6aee7e6e05c45b61bc72ccc6a62d 100755 (executable)
@@ -1,20 +1,16 @@
 ! Copyright (C) 2008 Slava Pestov, Doug Coleman\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: kernel calendar alarms io.streams.duplex io.encodings ;\r
+USING: kernel calendar alarms io io.encodings accessors\r
+namespaces ;\r
 IN: io.timeouts\r
 \r
 ! Won't need this with new slot accessors\r
 GENERIC: timeout ( obj -- dt/f )\r
 GENERIC: set-timeout ( dt/f obj -- )\r
 \r
-M: duplex-stream set-timeout\r
-    2dup\r
-    duplex-stream-in set-timeout\r
-    duplex-stream-out set-timeout ;\r
+M: decoder set-timeout stream>> set-timeout ;\r
 \r
-M: decoder set-timeout decoder-stream set-timeout ;\r
-\r
-M: encoder set-timeout encoder-stream set-timeout ;\r
+M: encoder set-timeout stream>> set-timeout ;\r
 \r
 GENERIC: timed-out ( obj -- )\r
 \r
@@ -29,3 +25,7 @@ M: object timed-out drop ;
     ] [\r
         2drop call\r
     ] if ; inline\r
+\r
+: timeouts ( dt -- )\r
+    [ input-stream get set-timeout ]\r
+    [ output-stream get set-timeout ] bi ;\r
index ba4e587d13f918dd9912d1364bfb041f4f99506f..08ff526f14ac9849ecfe19b920547d1a78c6af6e 100644 (file)
@@ -1,10 +1,10 @@
 ! Copyright (C) 2004, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien generic assocs kernel kernel.private math
-io.nonblocking sequences strings structs sbufs
-threads unix vectors io.buffers io.backend io.encodings
-io.streams.duplex math.parser continuations system libc
-qualified namespaces io.timeouts io.encodings.utf8 accessors ;
+io.nonblocking sequences strings structs sbufs threads unix
+vectors io.buffers io.backend io.encodings math.parser
+continuations system libc qualified namespaces io.timeouts
+io.encodings.utf8 accessors ;
 QUALIFIED: io
 IN: io.unix.backend
 
@@ -78,7 +78,8 @@ M: integer init-handle ( fd -- )
     #! since on OS X 10.3, this operation fails from init-io
     #! when running the Factor.app (presumably because fd 0 and
     #! 1 are closed).
-    F_SETFL O_NONBLOCK fcntl drop ;
+    [ F_SETFL O_NONBLOCK fcntl drop ]
+    [ F_SETFD FD_CLOEXEC fcntl drop ] bi ;
 
 M: integer close-handle ( fd -- )
     close ;
index 7e527196be012b579b8ab2fb9ecee12a2afe5fc3..177c5775dcd86d83eeb559b952e7cc9c7f7c2b5b 100755 (executable)
@@ -31,16 +31,7 @@ accessors kernel sequences io.encodings.utf8 ;
     "cat"
     "launcher-test-1" temp-file
     2array
-    ascii <process-stream> contents
-] unit-test
-
-[ f ] [
-    <process>
-        "cat"
-        "launcher-test-1" temp-file
-        2array >>command
-        +inherit+ >>stdout
-    ascii <process-stream> contents
+    ascii <process-reader> contents
 ] unit-test
 
 [ ] [
@@ -59,7 +50,7 @@ accessors kernel sequences io.encodings.utf8 ;
     "cat"
     "launcher-test-1" temp-file
     2array
-    ascii <process-stream> contents
+    ascii <process-reader> contents
 ] unit-test
 
 [ ] [
@@ -77,14 +68,14 @@ accessors kernel sequences io.encodings.utf8 ;
     "cat"
     "launcher-test-1" temp-file
     2array
-    ascii <process-stream> contents
+    ascii <process-reader> contents
 ] unit-test
 
 [ t ] [
     <process>
         "env" >>command
         { { "A" "B" } } >>environment
-    ascii <process-stream> lines
+    ascii <process-reader> lines
     "A=B" swap member?
 ] unit-test
 
@@ -93,7 +84,7 @@ accessors kernel sequences io.encodings.utf8 ;
         "env" >>command
         { { "A" "B" } } >>environment
         +replace-environment+ >>environment-mode
-    ascii <process-stream> lines
+    ascii <process-reader> lines
 ] unit-test
 
 [ "hi\n" ] [
@@ -107,3 +98,15 @@ accessors kernel sequences io.encodings.utf8 ;
     temp-directory "aloha" append-path
     utf8 file-contents
 ] unit-test
+
+[ "append-test" temp-file delete-file ] ignore-errors
+
+[ "hi\nhi\n" ] [
+    2 [
+        <process>
+            "echo hi" >>command
+            "append-test" temp-file <appender> >>stdout
+        try-process
+    ] times
+    "append-test" temp-file utf8 file-contents
+] unit-test
index 2c1e6261c045301224a8aa24ab86d1f5dfcfde74..043b2bd73ed9fdb2e9cfbd29f71cb63160468a98 100755 (executable)
@@ -1,10 +1,12 @@
 ! Copyright (C) 2007, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: io io.backend io.launcher io.nonblocking io.unix.backend
-io.unix.files io.nonblocking sequences kernel namespaces math
-system alien.c-types debugger continuations arrays assocs
-combinators unix.process strings threads unix
-io.unix.launcher.parser accessors io.files io.files.private ;
+USING: kernel namespaces math system sequences debugger
+continuations arrays assocs combinators alien.c-types strings
+threads accessors
+io io.backend io.launcher io.nonblocking io.files
+io.files.private io.unix.files io.unix.backend
+io.unix.launcher.parser
+unix unix.process ;
 IN: io.unix.launcher
 
 ! Search unix first
@@ -34,7 +36,8 @@ USE: unix
 : reset-fd ( fd -- )
     #! We drop the error code because on *BSD, fcntl of
     #! /dev/null fails.
-    F_SETFL 0 fcntl drop ;
+    [ F_SETFL 0 fcntl drop ]
+    [ F_SETFD 0 fcntl drop ] bi ;
 
 : redirect-inherit ( obj mode fd -- )
     2nip reset-fd ;
@@ -43,19 +46,20 @@ USE: unix
     >r >r normalize-path r> file-mode
     open dup io-error r> redirect-fd ;
 
+: redirect-file-append ( obj mode fd -- )
+    >r drop path>> normalize-path open-append r> redirect-fd ;
+
 : redirect-closed ( obj mode fd -- )
     >r >r drop "/dev/null" r> r> redirect-file ;
 
-: redirect-stream ( obj mode fd -- )
-    >r drop underlying-handle dup reset-fd r> redirect-fd ;
-
 : redirect ( obj mode fd -- )
     {
         { [ pick not ] [ redirect-inherit ] }
         { [ pick string? ] [ redirect-file ] }
+        { [ pick appender? ] [ redirect-file-append ] }
         { [ pick +closed+ eq? ] [ redirect-closed ] }
-        { [ pick +inherit+ eq? ] [ redirect-closed ] }
-        [ redirect-stream ]
+        { [ pick integer? ] [ >r drop dup reset-fd r> redirect-fd ] }
+        [ >r >r underlying-handle r> r> redirect ]
     } cond ;
 
 : ?closed dup +closed+ eq? [ drop "/dev/null" ] when ;
@@ -90,27 +94,10 @@ M: unix run-process* ( process -- pid )
 M: unix kill-process* ( pid -- )
     SIGTERM kill io-error ;
 
-: open-pipe ( -- pair )
-    2 "int" <c-array> dup pipe zero?
-    [ 2 c-int-array> ] [ drop f ] if ;
-
-: setup-stdio-pipe ( stdin stdout -- )
-    2dup first close second close
-    >r first 0 dup2 drop r> second 1 dup2 drop ;
-
-M: unix (process-stream)
-    >r open-pipe open-pipe r>
-    [ >r setup-stdio-pipe r> spawn-process ] curry
-    [ -rot 2dup second close first close ]
-    with-fork
-    first swap second ;
-
 : find-process ( handle -- process )
     processes get swap [ nip swap handle>> = ] curry
     assoc-find 2drop ;
 
-! Inefficient process wait polling, used on Linux and Solaris.
-! On BSD and Mac OS X, we use kqueue() which scales better.
 M: unix wait-for-processes ( -- ? )
     -1 0 <int> tuck WNOHANG waitpid
     dup 0 <= [
index 0a0aec6ab66b2f8290ae63971e7755cb2c4777f4..8a5d0c490fca037c54b2ae954fbb17b60db11f42 100644 (file)
@@ -13,9 +13,11 @@ TUPLE: macosx-monitor < monitor handle ;
     ] curry each ;
 
 M:: macosx (monitor) ( path recursive? mailbox -- monitor )
-    path mailbox macosx-monitor new-monitor
-    dup [ enqueue-notifications ] curry
-    path 1array 0 0 <event-stream> >>handle ;
+    [let | path [ path normalize-path ] |
+        path mailbox macosx-monitor new-monitor
+        dup [ enqueue-notifications ] curry
+        path 1array 0 0 <event-stream> >>handle
+    ] ;
 
 M: macosx-monitor dispose
     handle>> dispose ;
index 2815a49cd39770394f56edc25850f1b6e1b61757..ada1f94d87d7dc8963a5dcf7054244efaf814fea 100755 (executable)
@@ -10,7 +10,7 @@ IN: io.unix.mmap
     >r f -roll r> open-r/w [ 0 mmap ] keep
     over MAP_FAILED = [ close (io-error) ] when ;
 
-M: unix <mapped-file> ( path length -- obj )
+M: unix (mapped-file) ( path length -- obj )
     swap >r
     dup PROT_READ PROT_WRITE bitor MAP_FILE MAP_SHARED bitor
     r> mmap-open f mapped-file boa ;
diff --git a/extra/io/unix/pipes/pipes-tests.factor b/extra/io/unix/pipes/pipes-tests.factor
new file mode 100644 (file)
index 0000000..27a490d
--- /dev/null
@@ -0,0 +1,17 @@
+USING: tools.test io.pipes io.unix.pipes io.encodings.utf8
+io.encodings io namespaces sequences ;
+IN: io.unix.pipes.tests
+
+[ { 0 0 } ] [ { "ls" "grep x" } run-pipeline ] unit-test
+
+[ { 0 f 0 } ] [
+    {
+        "ls"
+        [
+            input-stream [ utf8 <decoder> ] change
+            output-stream [ utf8 <encoder> ] change
+            input-stream get lines reverse [ print ] each f
+        ]
+        "grep x"
+    } run-pipeline
+] unit-test
diff --git a/extra/io/unix/pipes/pipes.factor b/extra/io/unix/pipes/pipes.factor
new file mode 100644 (file)
index 0000000..4fc5acf
--- /dev/null
@@ -0,0 +1,12 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: system alien.c-types kernel unix math sequences
+qualified io.unix.backend io.nonblocking ;
+IN: io.unix.pipes
+QUALIFIED: io.pipes
+
+M: unix io.pipes:(pipe) ( -- pair )
+    2 "int" <c-array>
+    dup pipe io-error
+    2 c-int-array> first2
+    [ [ init-handle ] bi@ ] [ io.pipes:pipe boa ] 2bi ;
index 9413556d4f2480b5fe48853865e5ea9a8b27353f..74b713682305f22f0cb4e12d24647c38b1630591 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien.c-types kernel io.nonblocking io.unix.backend
 bit-arrays sequences assocs unix math namespaces structs
-accessors ;
+accessors math.order ;
 IN: io.unix.select
 
 TUPLE: select-mx < mx read-fdset write-fdset ;
index ff315bc5299e7433f864e2f7dc237e0293491358..61a667b70f4f648c91526a5ab90e92fecee57e2a 100755 (executable)
@@ -1,6 +1,7 @@
 USING: io.files io.sockets io kernel threads
 namespaces tools.test continuations strings byte-arrays
-sequences prettyprint system io.encodings.binary io.encodings.ascii ;
+sequences prettyprint system io.encodings.binary io.encodings.ascii
+io.streams.duplex ;
 IN: io.unix.tests
 
 ! Unix domain stream sockets
@@ -24,12 +25,11 @@ yield
 
 [ { "Hello world" "FOO" } ] [
     [
-        socket-server <local> ascii <client>
-        [
+        socket-server <local> ascii [
             readln ,
             "XYZ" print flush
             readln ,
-        ] with-stream
+        ] with-client
     ] { } make
 ] unit-test
 
@@ -125,16 +125,16 @@ datagram-client delete-file
 ! Invalid parameter tests
 
 [
-    image binary [ stdio get accept ] with-file-reader
+    image binary [ input-stream get accept ] with-file-reader
 ] must-fail
 
 [
-    image binary [ stdio get receive ] with-file-reader
+    image binary [ input-stream get receive ] with-file-reader
 ] must-fail
 
 [
     image binary [
         B{ 1 2 } datagram-server <local>
-        stdio get send
+        input-stream get send
     ] with-file-reader
 ] must-fail
index 1e5638fb4a1c66d1de1bdce41869cd349569dc75..e8e7135e1a1f50f9d9fa311df0f82751c5522e41 100755 (executable)
@@ -1,5 +1,6 @@
-USING: io.unix.backend io.unix.files io.unix.sockets io.timeouts
-io.unix.launcher io.unix.mmap io.backend combinators namespaces
-system vocabs.loader sequences words init ;
+USING: io.unix.backend io.unix.files io.unix.sockets
+io.unix.launcher io.unix.mmap io.unix.pipes io.timeouts
+io.backend combinators namespaces system vocabs.loader
+sequences words init ;
 
 "io.unix." os word-name append require
index 670ea18f5eb3b61800f7139d747eaa9fadbff883..a5d7338cd6d687bc3d4e71f8456e3dfe62966e95 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien alien.c-types arrays continuations io
 io.windows io.windows.nt.pipes libc io.nonblocking
-io.streams.duplex windows.types math windows.kernel32
+windows.types math windows.kernel32
 namespaces io.launcher kernel sequences windows.errors
 splitting system threads init strings combinators
 io.backend accessors concurrency.flags io.files assocs
index 0164ed16976aad4565923e301c7df22245cd426f..dc29405b123705236ba76bf41ad1ad058312c0e1 100755 (executable)
@@ -70,7 +70,7 @@ M: wince with-privileges
         dup close-later
     ] with-privileges ;
     
-M: windows <mapped-file> ( path length -- mmap )
+M: windows (mapped-file) ( path length -- mmap )
     [
         swap
         GENERIC_WRITE GENERIC_READ bitor
index 32126443f434b0047e4dd1207603c6e1d23a4251..8839410d915c5d2478005d54993a438d0eaad2da 100755 (executable)
@@ -1,9 +1,9 @@
 USING: continuations destructors io.buffers io.files io.backend
 io.timeouts io.nonblocking io.windows io.windows.nt.backend
 kernel libc math threads windows windows.kernel32 system
-alien.c-types alien.arrays sequences combinators combinators.lib
-sequences.lib ascii splitting alien strings assocs namespaces
-io.files.private accessors ;
+alien.c-types alien.arrays alien.strings sequences combinators
+combinators.lib sequences.lib ascii splitting alien strings
+assocs namespaces io.files.private accessors ;
 IN: io.windows.nt.files
 
 M: winnt cwd
@@ -52,6 +52,10 @@ M: winnt CreateFile-flags ( DWORD -- DWORD )
 M: winnt FileArgs-overlapped ( port -- overlapped )
     make-overlapped ;
 
+M: winnt open-append
+    [ dup file-info size>> ] [ drop 0 ] recover
+    >r (open-append) r> ;
+
 : update-file-ptr ( n port -- )
     port-handle
     dup win32-file-ptr [
index 8b13b9b3b952bbe007e2a8b49829acbf769b2f5d..254f845c48413817505538e0d15d88bf44919f4d 100755 (executable)
@@ -1,7 +1,7 @@
 IN: io.windows.launcher.nt.tests\r
 USING: io.launcher tools.test calendar accessors\r
 namespaces kernel system arrays io io.files io.encodings.ascii\r
-sequences parser assocs hashtables math ;\r
+sequences parser assocs hashtables math continuations ;\r
 \r
 [ ] [\r
     <process>\r
@@ -41,7 +41,7 @@ sequences parser assocs hashtables math ;
 ] unit-test\r
 \r
 [ ] [\r
-    "extra/io/windows/nt/launcher/test" resource-path [\r
+    "resource:extra/io/windows/nt/launcher/test" [\r
         <process>\r
             vm "-script" "stderr.factor" 3array >>command\r
             "out.txt" temp-file >>stdout\r
@@ -59,7 +59,7 @@ sequences parser assocs hashtables math ;
 ] unit-test\r
 \r
 [ ] [\r
-    "extra/io/windows/nt/launcher/test" resource-path [\r
+    "resource:extra/io/windows/nt/launcher/test" [\r
         <process>\r
             vm "-script" "stderr.factor" 3array >>command\r
             "out.txt" temp-file >>stdout\r
@@ -73,11 +73,11 @@ sequences parser assocs hashtables math ;
 ] unit-test\r
 \r
 [ "output" ] [\r
-    "extra/io/windows/nt/launcher/test" resource-path [\r
+    "resource:extra/io/windows/nt/launcher/test" [\r
         <process>\r
             vm "-script" "stderr.factor" 3array >>command\r
             "err2.txt" temp-file >>stderr\r
-        ascii <process-stream> lines first\r
+        ascii <process-reader> lines first\r
     ] with-directory\r
 ] unit-test\r
 \r
@@ -86,45 +86,45 @@ sequences parser assocs hashtables math ;
 ] unit-test\r
 \r
 [ t ] [\r
-    "extra/io/windows/nt/launcher/test" resource-path [\r
+    "resource:extra/io/windows/nt/launcher/test" [\r
         <process>\r
             vm "-script" "env.factor" 3array >>command\r
-        ascii <process-stream> contents\r
+        ascii <process-reader> contents\r
     ] with-directory eval\r
 \r
     os-envs =\r
 ] unit-test\r
 \r
 [ t ] [\r
-    "extra/io/windows/nt/launcher/test" resource-path [\r
+    "resource:extra/io/windows/nt/launcher/test" [\r
         <process>\r
             vm "-script" "env.factor" 3array >>command\r
             +replace-environment+ >>environment-mode\r
             os-envs >>environment\r
-        ascii <process-stream> contents\r
+        ascii <process-reader> contents\r
     ] with-directory eval\r
     \r
     os-envs =\r
 ] unit-test\r
 \r
 [ "B" ] [\r
-    "extra/io/windows/nt/launcher/test" resource-path [\r
+    "resource:extra/io/windows/nt/launcher/test" [\r
         <process>\r
             vm "-script" "env.factor" 3array >>command\r
             { { "A" "B" } } >>environment\r
-        ascii <process-stream> contents\r
+        ascii <process-reader> contents\r
     ] with-directory eval\r
 \r
     "A" swap at\r
 ] unit-test\r
 \r
 [ f ] [\r
-    "extra/io/windows/nt/launcher/test" resource-path [\r
+    "resource:extra/io/windows/nt/launcher/test" [\r
         <process>\r
             vm "-script" "env.factor" 3array >>command\r
             { { "HOME" "XXX" } } >>environment\r
             +prepend-environment+ >>environment-mode\r
-        ascii <process-stream> contents\r
+        ascii <process-reader> contents\r
     ] with-directory eval\r
 \r
     "HOME" swap at "XXX" =\r
@@ -140,3 +140,18 @@ sequences parser assocs hashtables math ;
 \r
     [ ] [ "dir.txt" temp-file delete-file ] unit-test\r
 ] times\r
+\r
+[ "append-test" temp-file delete-file ] ignore-errors\r
+\r
+[ "Hello appender\r\nHello appender\r\n" ] [\r
+    2 [\r
+        "resource:extra/io/windows/nt/launcher/test" [\r
+            <process>\r
+                vm "-script" "append.factor" 3array >>command\r
+                "append-test" temp-file <appender> >>stdout\r
+            try-process\r
+        ] with-directory\r
+    ] times\r
+   \r
+    "append-test" temp-file ascii file-contents\r
+] unit-test\r
index f57902608f5acad544f01dace0370b495ce5265c..39edd931b17ec6e687a93e41fd176da1b6c4ba2f 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien alien.c-types arrays continuations destructors io
-io.windows libc io.nonblocking io.streams.duplex windows.types
+io.windows libc io.nonblocking io.pipes windows.types
 math windows.kernel32 windows namespaces io.launcher kernel
 sequences windows.errors assocs splitting system strings
 io.windows.launcher io.windows.nt.pipes io.backend io.files
@@ -19,15 +19,25 @@ IN: io.windows.nt.launcher
         DuplicateHandle win32-error=0/f
     ] keep *void* ;
 
+! /dev/null simulation
+: null-input ( -- pipe )
+    (pipe) [ in>> handle>> ] [ out>> close-handle ] bi ;
+
+: null-output ( -- pipe )
+    (pipe) [ in>> close-handle ] [ out>> handle>> ] bi ;
+
+: null-pipe ( mode -- pipe )
+    {
+        { GENERIC_READ [ null-input ] }
+        { GENERIC_WRITE [ null-output ] }
+    } case ;
+
 ! The below code is based on the example given in
 ! http://msdn2.microsoft.com/en-us/library/ms682499.aspx
 
 : redirect-default ( default obj access-mode create-mode -- handle )
     3drop ;
 
-: redirect-inherit ( default obj access-mode create-mode -- handle )
-    4drop f ;
-
 : redirect-closed ( default obj access-mode create-mode -- handle )
     drop 2nip null-pipe ;
 
@@ -41,25 +51,34 @@ IN: io.windows.nt.launcher
     f ! template file
     CreateFile dup invalid-handle? dup close-always ;
 
+: redirect-append ( default path access-mode create-mode -- handle )
+    >r >r path>> r> r>
+    drop OPEN_ALWAYS
+    redirect-file
+    dup 0 FILE_END set-file-pointer ;
+
 : set-inherit ( handle ? -- )
     >r HANDLE_FLAG_INHERIT r> >BOOLEAN SetHandleInformation win32-error=0/f ;
 
-: redirect-stream ( default stream access-mode create-mode -- handle )
+: redirect-handle ( default handle access-mode create-mode -- handle )
     2drop nip
-    underlying-handle win32-file-handle
-    duplicate-handle dup t set-inherit ;
+    handle>> duplicate-handle dup t set-inherit ;
+
+: redirect-stream ( default stream access-mode create-mode -- handle )
+    >r >r underlying-handle r> r> redirect-handle ;
 
 : redirect ( default obj access-mode create-mode -- handle )
     {
         { [ pick not ] [ redirect-default ] }
-        { [ pick +inherit+ eq? ] [ redirect-inherit ] }
         { [ pick +closed+ eq? ] [ redirect-closed ] }
         { [ pick string? ] [ redirect-file ] }
+        { [ pick appender? ] [ redirect-append ] }
+        { [ pick win32-file? ] [ redirect-handle ] }
         [ redirect-stream ]
     } cond ;
 
 : default-stdout ( args -- handle )
-    stdout-pipe>> dup [ pipe-out ] when ;
+    stdout-pipe>> dup [ out>> ] when ;
 
 : redirect-stdout ( process args -- handle )
     default-stdout
@@ -85,7 +104,7 @@ IN: io.windows.nt.launcher
     ] if ;
 
 : default-stdin ( args -- handle )
-    stdin-pipe>> dup [ pipe-in ] when ;
+    stdin-pipe>> dup [ in>> ] when ;
 
 : redirect-stdin ( process args -- handle )
     default-stdin
@@ -95,46 +114,8 @@ IN: io.windows.nt.launcher
     redirect
     STD_INPUT_HANDLE GetStdHandle or ;
 
-: add-pipe-dtors ( pipe -- )
-    dup
-    in>> close-later
-    out>> close-later ;
-
-: fill-stdout-pipe ( args -- args )
-    <unique-incoming-pipe>
-    dup add-pipe-dtors
-    dup pipe-in f set-inherit
-    >>stdout-pipe ;
-
-: fill-stdin-pipe ( args -- args )
-    <unique-outgoing-pipe>
-    dup add-pipe-dtors
-    dup pipe-out f set-inherit
-    >>stdin-pipe ;
-
 M: winnt fill-redirection ( process args -- )
     [ 2dup redirect-stdout ] keep lpStartupInfo>> set-STARTUPINFO-hStdOutput
     [ 2dup redirect-stderr ] keep lpStartupInfo>> set-STARTUPINFO-hStdError
     [ 2dup redirect-stdin  ] keep lpStartupInfo>> set-STARTUPINFO-hStdInput
     2drop ;
-
-M: winnt (process-stream)
-    [
-        current-directory get (normalize-path) cd
-
-        dup make-CreateProcess-args
-
-        fill-stdout-pipe
-        fill-stdin-pipe
-
-        tuck fill-redirection
-
-        dup call-CreateProcess
-
-        dup stdin-pipe>> pipe-in CloseHandle drop
-        dup stdout-pipe>> pipe-out CloseHandle drop
-
-        dup lpProcessInformation>>
-        over stdout-pipe>> in>> f <win32-file>
-        rot stdin-pipe>> out>> f <win32-file>
-    ] with-destructors ;
diff --git a/extra/io/windows/nt/launcher/test/append.factor b/extra/io/windows/nt/launcher/test/append.factor
new file mode 100755 (executable)
index 0000000..4c1de0c
--- /dev/null
@@ -0,0 +1,2 @@
+USE: io\r
+"Hello appender" print\r
index 0b97387cf7cd264a168f29a3af917cbf64dc88ec..f22f50e406e73f57ee78cdc52ee1a769a1e83501 100755 (executable)
@@ -2,4 +2,4 @@ USE: io
 USE: namespaces\r
 \r
 "output" write flush\r
-"error" stderr get stream-write stderr get stream-flush\r
+"error" error-stream get stream-write error-stream get stream-flush\r
index 4c2277acb98ecd4690df487768531782e4bc240d..37784c673c612dcbc3c38d72fccb9740848685c6 100755 (executable)
@@ -3,9 +3,9 @@
 USING: alien alien.c-types libc destructors locals
 kernel math assocs namespaces continuations sequences hashtables
 sorting arrays combinators math.bitfields strings system
-accessors threads
-io.backend io.windows io.windows.nt.backend io.monitors
-io.nonblocking io.buffers io.files io.timeouts io
+accessors threads splitting
+io.backend io.windows io.windows.nt.backend io.windows.nt.files
+io.monitors io.nonblocking io.buffers io.files io.timeouts io
 windows windows.kernel32 windows.types ;
 IN: io.windows.nt.monitors
 
@@ -79,9 +79,12 @@ TUPLE: win32-monitor < monitor port ;
 : file-notify-records ( buffer -- seq )
     [ (file-notify-records) drop ] { } make ;
 
-: parse-notify-records ( monitor buffer -- )
-    file-notify-records
-    [ parse-notify-record rot queue-change ] with each ;
+:: parse-notify-records ( monitor buffer -- )
+    buffer file-notify-records [
+        parse-notify-record
+        [ monitor path>> prepend-path normalize-path ] dip
+        monitor queue-change
+    ] each ;
 
 : fill-queue ( monitor -- )
     dup port>> check-closed
@@ -98,7 +101,7 @@ TUPLE: win32-monitor < monitor port ;
 
 M:: winnt (monitor) ( path recursive? mailbox -- monitor )
     [
-        path mailbox win32-monitor new-monitor
+        path normalize-path mailbox win32-monitor new-monitor
             path open-directory \ win32-monitor-port <buffered-port>
                 recursive? >>recursive
             >>port
index b164d5872b048eeb2276b223f6f0f87075889c35..aa565b52e804a3c32d2428ad448816ebed048a02 100755 (executable)
@@ -1,16 +1,16 @@
 ! Copyright (C) 2007, 2008 Doug Coleman, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien alien.c-types arrays destructors io io.windows libc
-windows.types math windows.kernel32 windows namespaces kernel
-sequences windows.errors assocs math.parser system random
-combinators accessors ;
+windows.types math.bitfields windows.kernel32 windows namespaces
+kernel sequences windows.errors assocs math.parser system random
+combinators accessors io.pipes io.nonblocking ;
 IN: io.windows.nt.pipes
 
 ! This code is based on
 ! http://twistedmatrix.com/trac/browser/trunk/twisted/internet/iocpreactor/process.py
 
-: create-named-pipe ( name mode -- handle )
-    FILE_FLAG_OVERLAPPED bitor
+: create-named-pipe ( name -- handle )
+    { PIPE_ACCESS_INBOUND FILE_FLAG_OVERLAPPED } flags
     PIPE_TYPE_BYTE
     1
     4096
@@ -19,37 +19,20 @@ IN: io.windows.nt.pipes
     security-attributes-inherit
     CreateNamedPipe
     dup win32-error=0/f
-    dup add-completion ;
+    dup add-completion
+    f <win32-file> ;
 
-: open-other-end ( name mode -- handle )
-    FILE_SHARE_READ FILE_SHARE_WRITE bitor
+: open-other-end ( name -- handle )
+    GENERIC_WRITE
+    { FILE_SHARE_READ FILE_SHARE_WRITE } flags
     security-attributes-inherit
     OPEN_EXISTING
     FILE_FLAG_OVERLAPPED
     f
     CreateFile
     dup win32-error=0/f
-    dup add-completion ;
-
-TUPLE: pipe in out ;
-
-: <pipe> ( name in-mode out-mode -- pipe )
-    [
-        >r over >r create-named-pipe dup close-later
-        r> r> open-other-end dup close-later
-        pipe boa
-    ] with-destructors ;
-
-: close-pipe ( pipe -- )
-    dup
-    in>> CloseHandle drop
-    out>> CloseHandle drop ;
-
-: <incoming-pipe> ( name -- pipe )
-    PIPE_ACCESS_INBOUND GENERIC_WRITE <pipe> ;
-
-: <outgoing-pipe> ( name -- pipe )
-    PIPE_ACCESS_DUPLEX GENERIC_READ <pipe> ;
+    dup add-completion
+    f <win32-file> ;
 
 : unique-pipe-name ( -- string )
     [
@@ -61,25 +44,10 @@ TUPLE: pipe in out ;
         millis #
     ] "" make ;
 
-: <unique-incoming-pipe> ( -- pipe )
-    unique-pipe-name <incoming-pipe> ;
-
-: <unique-outgoing-pipe> ( -- pipe )
-    unique-pipe-name <outgoing-pipe> ;
-
-! /dev/null simulation
-: null-input ( -- pipe )
-    <unique-outgoing-pipe>
-    dup out>> CloseHandle drop
-    in>> ;
-
-: null-output ( -- pipe )
-    <unique-incoming-pipe>
-    dup in>> CloseHandle drop
-    out>> ;
-
-: null-pipe ( mode -- pipe )
-    {
-        { [ dup GENERIC_READ = ] [ drop null-input ] }
-        { [ dup GENERIC_WRITE = ] [ drop null-output ] }
-    } cond ;
+M: winnt (pipe) ( -- pipe )
+    [
+        unique-pipe-name
+        [ create-named-pipe dup close-later ]
+        [ open-other-end dup close-later ]
+        bi pipe boa
+    ] with-destructors ;
index 772ad9124f519888185f1aa44b024f2d1ac6e3d4..85c448bdbdf2b093639320d1785ae1d7b6511a63 100755 (executable)
@@ -2,14 +2,12 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien alien.c-types arrays destructors io io.backend
 io.buffers io.files io.nonblocking io.sockets io.binary
-io.sockets.impl windows.errors strings io.streams.duplex
+io.sockets.impl windows.errors strings
 kernel math namespaces sequences windows windows.kernel32
 windows.shell32 windows.types windows.winsock splitting
 continuations math.bitfields system accessors ;
 IN: io.windows
 
-M: windows destruct-handle CloseHandle drop ;
-
 M: windows destruct-socket closesocket drop ;
 
 TUPLE: win32-file handle ptr ;
@@ -43,7 +41,10 @@ M: win32-file init-handle ( handle -- )
     drop ;
 
 M: win32-file close-handle ( handle -- )
-    win32-file-handle CloseHandle drop ;
+    win32-file-handle close-handle ;
+
+M: alien close-handle ( handle -- )
+    CloseHandle drop ;
 
 ! Clean up resources (open handle) if add-completion fails
 : open-file ( path access-mode create-mode flags -- handle )
@@ -85,15 +86,13 @@ M: win32-file close-handle ( handle -- )
     f CreateFileW dup win32-error=0/f
     GetLastError ERROR_ALREADY_EXISTS = not ;
 
-: set-file-pointer ( handle length -- )
-    dupd d>w/w <uint> FILE_BEGIN SetFilePointer
+: set-file-pointer ( handle length method -- )
+    >r dupd d>w/w <uint> r> SetFilePointer
     INVALID_SET_FILE_POINTER = [
         CloseHandle "SetFilePointer failed" throw
     ] when drop ;
 
-: open-append ( path -- handle length )
-    [ dup file-info size>> ] [ drop 0 ] recover
-    >r (open-append) r> 2dup set-file-pointer ;
+HOOK: open-append os ( path -- handle length )
 
 TUPLE: FileArgs
     hFile lpBuffer nNumberOfBytesToRead
index 4dda206c7b9864481e3c26deaecacc1ea43d0cc4..1db17278ad0f77ef3d3c7cf26f0a7687f71780e9 100755 (executable)
@@ -9,7 +9,7 @@ IN: irc
 ! utils
 : split-at-first ( seq separators -- before after )
     dupd '[ , member? ] find
-        [ cut 1 tail ]
+        [ cut rest ]
         [ swap ]
     if ;
 
@@ -101,7 +101,7 @@ SYMBOL: irc-client
 : irc-client> ( -- irc-client ) irc-client get ;
 : irc-stream> ( -- stream ) irc-client> stream>> ;
 
-: remove-heading-: ( seq -- seq ) dup ":" head? [ 1 tail ] when ;
+: remove-heading-: ( seq -- seq ) dup ":" head? [ rest ] when ;
 
 : parse-name ( string -- string )
     remove-heading-: "!" split-at-first drop ;
index d5ee7f3ebc40f625bd9387b563108e0e8973f0a4..c3f6b37fb82311d864fa226b6e598f0e8398a791 100755 (executable)
@@ -84,7 +84,7 @@ TUPLE: segment number color radius ;
     pick >r nearer-segment dup r> = ;
 
 : find-nearest-segment ( oint segments -- segment )
-    dup first swap 1 tail-slice rot [ (find-nearest-segment) ] curry
+    dup first swap rest-slice rot [ (find-nearest-segment) ] curry
     find 2drop ;
     
 : nearest-segment-forward ( segments oint start -- segment )
index b136012433f9abae17570b302be786e8d0f9407d..17c1b272df8c7f9c515092b7c7ddc6a3759806d5 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel parser-combinators namespaces sequences promises strings 
-       assocs math math.parser math.vectors math.functions
+       assocs math math.parser math.vectors math.functions math.order
        lazy-lists hashtables ascii ;
 IN: json.reader
 
index 6ad0774e387b8311daaa3e53bfe32b53584ba245..a68c65087ea149e840d8cda31d11c1e7bdc7d840 100644 (file)
@@ -21,11 +21,6 @@ M: string json-print ( obj -- )
 M: number json-print ( num -- )  
   number>string write ;
 
-! sequence and number overlap, we provide an explicit
-! disambiguation method
-M: integer json-print ( num -- )  
-  number>string write ;
-
 M: sequence json-print ( array -- ) 
   CHAR: [ write1 [ >json ] map "," join write CHAR: ] write1 ;
 
index b079cec42c69f8ee97f208c1a6df2a592477a273..aecae1cf881d92102d29cfb6763e3896c55dc837 100755 (executable)
@@ -3,7 +3,7 @@
 USING: arrays assocs hashtables assocs io kernel math
 math.vectors math.matrices math.matrices.elimination namespaces
 parser prettyprint sequences words combinators math.parser
-splitting sorting shuffle symbols sets ;
+splitting sorting shuffle symbols sets math.order ;
 IN: koszul
 
 ! Utilities
@@ -19,7 +19,7 @@ IN: koszul
     } cond ;
 
 : canonicalize
-    [ nip zero? not ] assoc-subset ;
+    [ nip zero? not ] assoc-filter ;
 
 SYMBOL: terms
 
@@ -71,7 +71,7 @@ SYMBOL: terms
     [ natural-sort ] keep [ index ] curry map ;
 
 : (inversions) ( n seq -- n )
-    [ > ] with subset length ;
+    [ > ] with filter length ;
 
 : inversions ( seq -- n )
     0 swap [ length ] keep [
@@ -148,7 +148,7 @@ DEFER: (d)
 : nth-basis-elt ( generators n -- elt )
     over length [
         3dup bit? [ nth ] [ 2drop f ] if
-    ] map [ ] subset 2nip ;
+    ] map [ ] filter 2nip ;
 
 : basis ( generators -- seq )
     natural-sort dup length 2^ [ nth-basis-elt ] with map ;
@@ -184,7 +184,7 @@ DEFER: (d)
     [ length ] keep [ (graded-ker/im-d) ] curry map ;
 
 : graded-betti ( generators -- seq )
-    basis graded graded-ker/im-d flip first2 1 head* 0 prefix v- ;
+    basis graded graded-ker/im-d flip first2 but-last 0 prefix v- ;
 
 ! Bi-graded for two-step complexes
 : (bigraded-ker/im-d) ( u-deg z-deg bigraded-basis -- null/rank )
@@ -203,7 +203,7 @@ DEFER: (d)
     [ basis graded ] bi@ tensor bigraded-ker/im-d
     [ [ [ first ] map ] map ] keep
     [ [ second ] map 2 head* { 0 0 } prepend ] map
-    1 tail dup first length 0 <array> suffix
+    rest dup first length 0 <array> suffix
     [ v- ] 2map ;
 
 ! Laplacian
@@ -279,7 +279,7 @@ DEFER: (d)
 
 : bigraded-laplacian ( u-generators z-generators quot -- seq )
     >r [ basis graded ] bi@ tensor bigraded-triples r>
-    [ [ first3 ] swap compose map ] curry map ; inline
+    [ [ first3 ] prepose map ] curry map ; inline
 
 : bigraded-laplacian-betti ( u-generators z-generators -- seq )
     [ laplacian-betti ] bigraded-laplacian ;
index 2f7646aab113f18ebdbda48b7283670252a7528a..844ae31085686e7edd3935f0f17ec5c3c8f8a9fe 100644 (file)
@@ -8,7 +8,7 @@ IN: lazy-lists.examples
 : naturals 0 lfrom ;
 : positives 1 lfrom ;
 : evens 0 [ 2 + ] lfrom-by ;
-: odds 1 lfrom [ 2 mod 1 = ] lsubset ;
+: odds 1 lfrom [ 2 mod 1 = ] lfilter ;
 : powers-of-2 1 [ 2 * ] lfrom-by ;
 : ones 1 [ ] lfrom-by ;
 : squares naturals [ dup * ] lmap ;
index ebacea03d84edc2c92d145c09955926969c8fd8a..b240b3fbc2545b114f9cb46e15d06e917d0adffd 100644 (file)
@@ -82,7 +82,7 @@ HELP: uncons
 { $values { "cons" "a cons object" } { "car" "the head of the list" } { "cdr" "the tail of the list" } }
 { $description "Put the head and tail of the list on the stack." } ;
 
-{ leach lreduce lmap lmap-with ltake lsubset lappend lfrom lfrom-by lconcat lcartesian-product lcartesian-product* lcomp lcomp* lmerge lreduce lwhile luntil } related-words
+{ leach lreduce lmap lmap-with ltake lfilter lappend lfrom lfrom-by lconcat lcartesian-product lcartesian-product* lcomp lcomp* lmerge lreduce lwhile luntil } related-words
 
 HELP: leach
 { $values { "list" "a cons object" } { "quot" "a quotation with stack effect ( obj -- )" } }
@@ -104,9 +104,9 @@ HELP: ltake
 { $values { "n" "a non negative integer" } { "list" "a cons object" } { "result" "resulting cons object" } }
 { $description "Outputs a lazy list containing the first n items in the list. This is done a lazy manner. No evaluation of the list elements occurs initially but a " { $link <lazy-take> } " object is returned which conforms to the list protocol. Calling " { $link car } ", " { $link cdr } " or " { $link nil? } " on this will evaluate elements as required." } ;
 
-HELP: lsubset
+HELP: lfilter
 { $values { "list" "a cons object" } { "quot" "a quotation with stack effect ( -- X )" } { "result" "resulting cons object" } }
-{ $description "Perform a similar functionality to that of the " { $link subset } " word, but in a lazy manner. No evaluation of the list elements occurs initially but a " { $link <lazy-subset> } " object is returned which conforms to the list protocol. Calling " { $link car } ", " { $link cdr } " or " { $link nil? } " on this will evaluate elements as required." } ;
+{ $description "Perform a similar functionality to that of the " { $link filter } " word, but in a lazy manner. No evaluation of the list elements occurs initially but a " { $link <lazy-filter> } " object is returned which conforms to the list protocol. Calling " { $link car } ", " { $link cdr } " or " { $link nil? } " on this will evaluate elements as required." } ;
 
 HELP: lwhile
 { $values { "list" "a cons object" } { "quot" "a quotation with stack effect ( X -- bool )" } { "result" "resulting cons object" } }
index b87a1e5f2e5176fe66ae63a94af261ca1d5972dd..6db82ed2c1d9b2ec28303d03faf58f182f17d1f8 100644 (file)
@@ -201,37 +201,37 @@ M: lazy-while cdr ( lazy-while -- cdr )
 M: lazy-while nil? ( lazy-while -- bool )
    [ car ] keep lazy-while-quot call not ;
 
-TUPLE: lazy-subset cons quot ;
+TUPLE: lazy-filter cons quot ;
 
-C: <lazy-subset> lazy-subset
+C: <lazy-filter> lazy-filter
 
-: lsubset ( list quot -- result )
-    over nil? [ 2drop nil ] [ <lazy-subset> <memoized-cons> ] if ;
+: lfilter ( list quot -- result )
+    over nil? [ 2drop nil ] [ <lazy-filter> <memoized-cons> ] if ;
 
-: car-subset?  ( lazy-subset -- ? )
-  [ lazy-subset-cons car ] keep
-  lazy-subset-quot call ;
+: car-filter?  ( lazy-filter -- ? )
+  [ lazy-filter-cons car ] keep
+  lazy-filter-quot call ;
 
-: skip ( lazy-subset -- )
-  [ lazy-subset-cons cdr ] keep
-  set-lazy-subset-cons ;
+: skip ( lazy-filter -- )
+  [ lazy-filter-cons cdr ] keep
+  set-lazy-filter-cons ;
 
-M: lazy-subset car ( lazy-subset -- car )
-  dup car-subset? [ lazy-subset-cons ] [ dup skip ] if car ;
+M: lazy-filter car ( lazy-filter -- car )
+  dup car-filter? [ lazy-filter-cons ] [ dup skip ] if car ;
 
-M: lazy-subset cdr ( lazy-subset -- cdr )
-  dup car-subset? [
-    [ lazy-subset-cons cdr ] keep
-    lazy-subset-quot lsubset
+M: lazy-filter cdr ( lazy-filter -- cdr )
+  dup car-filter? [
+    [ lazy-filter-cons cdr ] keep
+    lazy-filter-quot lfilter
   ] [
     dup skip cdr
   ] if ;
 
-M: lazy-subset nil? ( lazy-subset -- bool )
-  dup lazy-subset-cons nil? [
+M: lazy-filter nil? ( lazy-filter -- bool )
+  dup lazy-filter-cons nil? [
     drop t
   ] [
-    dup car-subset? [
+    dup car-filter? [
       drop f
     ] [
       dup skip nil?
@@ -373,7 +373,7 @@ M: lazy-concat nil? ( lazy-concat -- bool )
   [ lcartesian-product* ] dip lmap ;
 
 : lcomp* ( list guards quot -- result )
-  [ [ lcartesian-product* ] dip [ lsubset ] each ] dip lmap ;
+  [ [ lcartesian-product* ] dip [ lfilter ] each ] dip lmap ;
 
 DEFER: lmerge
 
@@ -442,4 +442,4 @@ INSTANCE: lazy-from-by list
 INSTANCE: lazy-zip list
 INSTANCE: lazy-while list
 INSTANCE: lazy-until list
-INSTANCE: lazy-subset list
+INSTANCE: lazy-filter list
diff --git a/extra/lcs/authors.txt b/extra/lcs/authors.txt
new file mode 100755 (executable)
index 0000000..504363d
--- /dev/null
@@ -0,0 +1 @@
+Daniel Ehrenberg\r
diff --git a/extra/lcs/lcs-docs.factor b/extra/lcs/lcs-docs.factor
new file mode 100755 (executable)
index 0000000..49e46c7
--- /dev/null
@@ -0,0 +1,35 @@
+USING: help.syntax help.markup ;\r
+IN: lcs\r
+\r
+HELP: levenshtein\r
+{ $values { "old" "a sequence" } { "new" "a sequence" } { "n" "the Levenshtein distance" } }\r
+{ $description "Calculates the Levenshtein distance between old and new, that is, the minimal number of changes from the old sequence to the new one, in terms of deleting, inserting and replacing characters." } ;\r
+\r
+HELP: lcs\r
+{ $values { "seq1" "a sequence" } { "seq2" "a sequence" } { "lcs" "a longest common subsequence" } }\r
+{ $description "Given two sequences, calculates a longest common subsequence between them. Note two things: this is only one of the many possible LCSs, and the LCS may not be contiguous." } ;\r
+\r
+HELP: diff\r
+{ $values { "old" "a sequence" } { "new" "a sequence" } { "diff" "an edit script" } }\r
+{ $description "Given two sequences, find a minimal edit script from the old to the new. There may be more than one minimal edit script, and this chooses one arbitrarily. This script is in the form of an array of the tuples of the classes " { $link retain } ", " { $link delete } " and " { $link insert } " which have their information stored in the 'item' slot." } ;\r
+\r
+HELP: retain\r
+{ $class-description "Represents an action in an edit script where an item is kept, going from the initial sequence to the final sequence. This has one slot, called item, containing the thing which is retained" } ;\r
+\r
+HELP: delete\r
+{ $class-description "Represents an action in an edit script where an item is deleted, going from the initial sequence to the final sequence. This has one slot, called item, containing the thing which is deleted" } ;\r
+\r
+HELP: insert\r
+{ $class-description "Represents an action in an edit script where an item is added, going from the initial sequence to the final sequence. This has one slot, called item, containing the thing which is inserted" } ;\r
+\r
+ARTICLE: "lcs" "LCS, Diffing and Distance"\r
+"This vocabulary provides words for three apparently unrelated but in fact very similar problems: finding a longest common subsequence between two sequences, getting a minimal edit script (diff) between two sequences, and calculating the Levenshtein distance between two sequences. The implementations of these algorithms are very closely related, and all running times are O(nm), where n and m are the lengths of the input sequences."\r
+{ $subsection lcs }\r
+{ $subsection diff }\r
+{ $subsection levenshtein }\r
+"The " { $link diff } " word returns a sequence of tuples of the following classes. They all hold their contents in the 'item' slot."\r
+{ $subsection insert }\r
+{ $subsection delete }\r
+{ $subsection retain } ;\r
+\r
+ABOUT: "lcs"\r
diff --git a/extra/lcs/lcs-tests.factor b/extra/lcs/lcs-tests.factor
new file mode 100755 (executable)
index 0000000..3aa10a0
--- /dev/null
@@ -0,0 +1,25 @@
+! Copyright (C) 2006 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: tools.test lcs ;
+
+[ 3 ] [ "sitting" "kitten" levenshtein ] unit-test
+[ 3 ] [ "kitten" "sitting" levenshtein ] unit-test
+[ 1 ] [ "freshpak" "freshpack" levenshtein ] unit-test
+[ 1 ] [ "freshpack" "freshpak" levenshtein ] unit-test
+
+[ "hell" ] [ "hello" "hell" lcs ] unit-test
+[ "hell" ] [ "hell" "hello" lcs ] unit-test
+[ "ell" ] [ "ell" "hell" lcs ] unit-test
+[ "ell" ] [ "hell" "ell" lcs ] unit-test
+[ "abd" ] [ "faxbcd" "abdef" lcs ] unit-test
+
+[ {
+        T{ delete f CHAR: f }
+        T{ retain f CHAR: a }
+        T{ delete f CHAR: x }
+        T{ retain f CHAR: b }
+        T{ delete f CHAR: c }
+        T{ retain f CHAR: d }
+        T{ insert f CHAR: e }
+        T{ insert f CHAR: f }
+} ] [ "faxbcd" "abdef" diff ] unit-test
diff --git a/extra/lcs/lcs.factor b/extra/lcs/lcs.factor
new file mode 100755 (executable)
index 0000000..cdebfc4
--- /dev/null
@@ -0,0 +1,97 @@
+USING: sequences kernel math locals math.order math.ranges\r
+accessors combinators.lib arrays namespaces combinators ;\r
+IN: lcs\r
+\r
+<PRIVATE\r
+: levenshtein-step ( insert delete change same? -- next )\r
+    0 1 ? + >r [ 1+ ] bi@ r> min min ;\r
+\r
+: lcs-step ( insert delete change same? -- next )\r
+    1 -9999 ? + max max ; ! Replace -9999 with -inf when added\r
+\r
+:: loop-step ( i j matrix old new step -- )\r
+    i j 1+ matrix nth nth ! insertion\r
+    i 1+ j matrix nth nth ! deletion\r
+    i j matrix nth nth ! replace/retain\r
+    i old nth j new nth = ! same?\r
+    step call\r
+    i 1+ j 1+ matrix nth set-nth ; inline\r
+\r
+: lcs-initialize ( |str1| |str2| -- matrix )\r
+    [ drop 0 <array> ] with map ;\r
+\r
+: levenshtein-initialize ( |str1| |str2| -- matrix )\r
+    [ [ + ] curry map ] with map ;\r
+\r
+:: run-lcs ( old new init step -- matrix )\r
+    [let | matrix [ old length 1+ new length 1+ init call ] |\r
+        old length [0,b) [| i |\r
+            new length [0,b)\r
+            [| j | i j matrix old new step loop-step ]\r
+            each\r
+        ] each matrix ] ; inline\r
+PRIVATE>\r
+\r
+: levenshtein ( old new -- n )\r
+    [ levenshtein-initialize ] [ levenshtein-step ]\r
+    run-lcs peek peek ;\r
+\r
+TUPLE: retain item ;\r
+TUPLE: delete item ;\r
+TUPLE: insert item ;\r
+\r
+<PRIVATE\r
+TUPLE: trace-state old new table i j ;\r
+\r
+: old-nth ( state -- elt )\r
+    [ i>> 1- ] [ old>> ] bi nth ;\r
+\r
+: new-nth ( state -- elt )\r
+    [ j>> 1- ] [ new>> ] bi nth ;\r
+\r
+: top-beats-side? ( state -- ? )\r
+    [ [ i>> ] [ j>> 1- ] [ table>> ] tri nth nth ]\r
+    [ [ i>> 1- ] [ j>> ] [ table>> ] tri nth nth ] bi > ;\r
+\r
+: retained? ( state -- ? )\r
+    {\r
+        [ i>> 0 > ] [ j>> 0 > ]\r
+        [ [ old-nth ] [ new-nth ] bi = ]\r
+    } <-&& ;\r
+\r
+: do-retain ( state -- state )\r
+    dup old-nth retain boa ,\r
+    [ 1- ] change-i [ 1- ] change-j ;\r
+\r
+: inserted? ( state -- ? )\r
+    [ j>> 0 > ]\r
+    [ [ i>> zero? ] [ top-beats-side? ] or? ] and? ;\r
+\r
+: do-insert ( state -- state )\r
+    dup new-nth insert boa , [ 1- ] change-j ;\r
+\r
+: deleted? ( state -- ? )\r
+    [ i>> 0 > ]\r
+    [ [ j>> zero? ] [ top-beats-side? not ] or? ] and? ;\r
+\r
+: do-delete ( state -- state )\r
+    dup old-nth delete boa , [ 1- ] change-i ;\r
+\r
+: (trace-diff) ( state -- )\r
+    {\r
+        { [ dup retained? ] [ do-retain (trace-diff) ] }\r
+        { [ dup inserted? ] [ do-insert (trace-diff) ] }\r
+        { [ dup deleted? ] [ do-delete (trace-diff) ] }\r
+        [ drop ] ! i=j=0\r
+    } cond ;\r
+\r
+: trace-diff ( old new table -- diff )\r
+    [ ] [ first length 1- ] [ length 1- ] tri trace-state boa\r
+    [ (trace-diff) ] { } make reverse ;\r
+PRIVATE>\r
+\r
+: diff ( old new -- diff )\r
+    2dup [ lcs-initialize ] [ lcs-step ] run-lcs trace-diff ;\r
+\r
+: lcs ( seq1 seq2 -- lcs )\r
+    [ diff [ retain? ] filter ] keep [ item>> ] swap map-as ;\r
diff --git a/extra/lcs/summary.txt b/extra/lcs/summary.txt
new file mode 100755 (executable)
index 0000000..9e70fd7
--- /dev/null
@@ -0,0 +1 @@
+Levenshtein distance and diff between sequences\r
diff --git a/extra/lcs/tags.txt b/extra/lcs/tags.txt
new file mode 100755 (executable)
index 0000000..4d914f4
--- /dev/null
@@ -0,0 +1 @@
+algorithms\r
diff --git a/extra/levenshtein/authors.txt b/extra/levenshtein/authors.txt
deleted file mode 100644 (file)
index 1901f27..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Slava Pestov
diff --git a/extra/levenshtein/levenshtein-tests.factor b/extra/levenshtein/levenshtein-tests.factor
deleted file mode 100644 (file)
index 722ccb8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-! Copyright (C) 2006 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-IN: levenshtein.tests
-USING: tools.test levenshtein ;
-
-[ 3 ] [ "sitting" "kitten" levenshtein ] unit-test
-[ 3 ] [ "kitten" "sitting" levenshtein ] unit-test
-[ 1 ] [ "freshpak" "freshpack" levenshtein ] unit-test
-[ 1 ] [ "freshpack" "freshpak" levenshtein ] unit-test
diff --git a/extra/levenshtein/levenshtein.factor b/extra/levenshtein/levenshtein.factor
deleted file mode 100644 (file)
index 98b3765..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-! Copyright (C) 2006 Slava Pestov.
-! See http://factorcode.org/license.txt for BSD license.
-USING: arrays help io kernel math namespaces sequences ;
-IN: levenshtein
-
-: <matrix> ( m n -- matrix )
-    [ drop 0 <array> ] with map ; inline
-
-: matrix-> nth nth ; inline
-: ->matrix nth set-nth ; inline
-
-SYMBOL: d
-
-: ->d ( n i j -- ) d get ->matrix ; inline
-: d-> ( i j -- n ) d get matrix-> ; inline
-
-SYMBOL: costs
-
-: init-d ( str1 str2 -- )
-    [ length 1+ ] bi@ 2dup <matrix> d set
-    [ 0 over ->d ] each
-    [ dup 0 ->d ] each ; inline
-
-: compute-costs ( str1 str2 -- )
-    swap [
-        [ = 0 1 ? ] with { } map-as
-    ] curry { } map-as costs set ; inline
-
-: levenshtein-step ( i j -- )
-    [ 1+ d-> 1+ ] 2keep
-    [ >r 1+ r> d-> 1+ ] 2keep
-    [ d-> ] 2keep
-    [ costs get matrix-> + min min ] 2keep
-    >r 1+ r> 1+ ->d ; inline
-
-: levenshtein-result ( -- n ) d get peek peek ; inline
-
-: levenshtein ( str1 str2 -- n )
-    [
-        2dup init-d
-        2dup compute-costs
-        [ length ] bi@ [
-            [ levenshtein-step ] curry each
-        ] with each
-        levenshtein-result
-    ] with-scope ;
diff --git a/extra/levenshtein/summary.txt b/extra/levenshtein/summary.txt
deleted file mode 100644 (file)
index 583669a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Levenshtein edit distance algorithm
index 372a567550bdd1b5566c4c022d157d7f6efd478d..961017f39ec1c779bd1001b9d70162e0a002360f 100644 (file)
@@ -1,27 +1,19 @@
-USING: help.syntax help.markup kernel macros prettyprint ;
+USING: help.syntax help.markup kernel macros prettyprint
+memoize ;
 IN: locals
 
-<PRIVATE
-
-: $with-locals-note
-    drop {
-        "This form must appear either in a word defined by " { $link POSTPONE: :: } " or " { $link POSTPONE: MACRO:: } ", or alternatively, " { $link with-locals } " must be called on the top-level form of the word to perform closure conversion."
-    } $notes ;
-
-PRIVATE>
-
 HELP: [|
 { $syntax "[| bindings... | body... ]" }
 { $description "A lambda abstraction. When called, reads stack values into the bindings from left to right; the body may then refer to these bindings." }
 { $examples
     { $example
         "USING: kernel locals math prettyprint ;"
+        "IN: scratchpad"
         ":: adder ( n -- quot ) [| m | m n + ] ;"
         "3 5 adder call ."
         "8"
     }
-}
-$with-locals-note ;
+} ;
 
 HELP: [let
 { $syntax "[let | binding1 [ value1... ]\n       binding2 [ value2... ]\n       ... |\n    body... ]" }
@@ -29,14 +21,14 @@ HELP: [let
 { $examples
     { $example
         "USING: kernel locals math math.functions prettyprint sequences ;"
+        "IN: scratchpad"
         ":: frobnicate ( n seq -- newseq )"
         "    [let | n' [ n 6 * ] |"
         "        seq [ n' gcd nip ] map ] ;"
         "6 { 36 14 } frobnicate ."
         "{ 36 2 }"
     }
-}
-$with-locals-note ;
+} ;
 
 HELP: [let*
 { $syntax "[let* | binding1 [ value1... ]\n       binding2 [ value2... ]\n       ... |\n    body... ]" }
@@ -44,6 +36,7 @@ HELP: [let*
 { $examples
     { $example
         "USING: kernel locals math math.functions prettyprint sequences ;"
+        "IN: scratchpad"
         ":: frobnicate ( n seq -- newseq )"
         "    [let* | a [ n 3 + ]"
         "            b [ a 4 * ] |"
@@ -51,8 +44,7 @@ HELP: [let*
         "1 { 32 48 } frobnicate ."
         "{ 2 3 }"
     }
-}
-$with-locals-note ;
+} ;
 
 { POSTPONE: [let POSTPONE: [let* } related-words
 
@@ -62,6 +54,7 @@ HELP: [wlet
 { $examples
     { $example
         "USING: locals math prettyprint sequences ;"
+        "IN: scratchpad"
         ":: quuxify ( n seq -- newseq )"
         "    [wlet | add-n [| m | m n + ] |"
         "        seq [ add-n ] map ] ;"
@@ -70,23 +63,27 @@ HELP: [wlet
     }
 } ;
 
-HELP: with-locals
-{ $values { "form" "a quotation, lambda, let or wlet form" } { "quot" "a quotation" } }
-{ $description "Performs closure conversion of a lexically-scoped form. All nested sub-forms are converted. This word must be applied to a " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " used in an ordinary definition, however forms in " { $link POSTPONE: :: } " and " { $link POSTPONE: MACRO:: } " definitions are automatically closure-converted and there is no need to use this word." } ;
-
 HELP: ::
 { $syntax ":: word ( bindings... -- outputs... ) body... ;" }
 { $description "Defines a word with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope. Any " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " forms used in the body of the word definition are automatically closure-converted." }
 { $notes "The output names do not affect the word's behavior, however the compiler attempts to check the stack effect as with other definitions." }
 { $examples "See " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " and " { $link POSTPONE: [wlet } "." } ;
 
+{ POSTPONE: : POSTPONE: :: } related-words
+
 HELP: MACRO::
 { $syntax "MACRO:: word ( bindings... -- outputs... ) body... ;" }
-{ $description "Defines a macro with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope. Any " { $link POSTPONE: [| } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [wlet } " forms used in the body of the word definition are automatically closure-converted." }
+{ $description "Defines a macro with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope." }
 { $notes "The output names do not affect the word's behavior, however the compiler attempts to check the stack effect as with other definitions." } ;
 
 { POSTPONE: MACRO: POSTPONE: MACRO:: } related-words
 
+HELP: MEMO::
+{ $syntax "MEMO:: word ( bindings... -- outputs... ) body... ;" }
+{ $description "Defines a memoized word with named inputs; it reads stack values into bindings from left to right, then executes the body with those bindings in lexical scope." } ;
+
+{ POSTPONE: MEMO: POSTPONE: MEMO:: } related-words
+
 ARTICLE: "locals-mutable" "Mutable locals"
 "In the list of bindings supplied to " { $link POSTPONE: :: } ", " { $link POSTPONE: [let } " or " { $link POSTPONE: [| } ", a mutable binding may be introduced by suffixing its named with " { $snippet "!" } ". Mutable bindings are read by giving their name as usual; the suffix is not part of the binding's name. To write to a mutable binding, use the binding's with the " { $snippet "!" } " suffix."
 $nl
@@ -107,9 +104,11 @@ $nl
 "Another limitation is that closure conversion does not descend into arrays, hashtables or other types of literals. For example, the following does not work:"
 { $code
     ":: bad-cond-usage ( a -- ... )"
-    "    { [ a 0 < ] [ ... ] }"
-    "    { [ a 0 > ] [ ... ] }"
-    "    { [ a 0 = ] [ ... ] } ;"
+    "    {"
+    "        { [ a 0 < ] [ ... ] }"
+    "        { [ a 0 > ] [ ... ] }"
+    "        { [ a 0 = ] [ ... ] }"
+    "    } cond ;"
 } ;
 
 ARTICLE: "locals" "Local variables and lexical closures"
@@ -119,9 +118,8 @@ $nl
 $nl
 "Applicative word definitions where the inputs are named local variables:"
 { $subsection POSTPONE: :: }
+{ $subsection POSTPONE: MEMO:: }
 { $subsection POSTPONE: MACRO:: }
-"Explicit closure conversion outside of applicative word definitions:"
-{ $subsection with-locals }
 "Lexical binding forms:"
 { $subsection POSTPONE: [let }
 { $subsection POSTPONE: [let* }
index c13be40c8f73e3996942b71a2e8f9a4f478f5c56..5c3d2005a8a03f375030b9b037af3d8cdba37358 100755 (executable)
@@ -1,6 +1,6 @@
 USING: locals math sequences tools.test hashtables words kernel
 namespaces arrays strings prettyprint io.streams.string parser
-;
+accessors ;
 IN: locals.tests
 
 :: foo ( a b -- a a ) a a ;
@@ -55,7 +55,6 @@ IN: locals.tests
 
 [ 5 ] [
     [let | a [ 3 ] | [wlet | func [ a + ] | 2 func ] ]
-    with-locals
 ] unit-test
 
 :: wlet-test-2 ( a b -- seq )
@@ -108,7 +107,7 @@ write-test-2 "q" set
 
 [ 10 20 ]
 [
-    20 10 [| a! | [| b! | a b ] ] with-locals call call
+    20 10 [| a! | [| b! | a b ] ] call call
 ] unit-test
 
 :: write-test-3 ( a! -- q ) [| b | b a! ] ;
@@ -170,16 +169,22 @@ M:: string lambda-generic ( a b -- c ) a b lambda-generic-2 ;
 
 [ ] [ \ lambda-generic see ] unit-test
 
+:: unparse-test-1 ( a -- ) [let | a! [ ] | ] ;
+
 [ "[let | a! [ ] | ]" ] [
-    [let | a! [ ] | ] unparse
+    \ unparse-test-1 "lambda" word-prop body>> first unparse
 ] unit-test
 
+:: unparse-test-2 ( -- ) [wlet | a! [ ] | ] ;
+
 [ "[wlet | a! [ ] | ]" ] [
-    [wlet | a! [ ] | ] unparse
+    \ unparse-test-2 "lambda" word-prop body>> first unparse
 ] unit-test
 
+:: unparse-test-3 ( -- b ) [| a! | ] ;
+
 [ "[| a! | ]" ] [
-    [| a! | ] unparse
+    \ unparse-test-3 "lambda" word-prop body>> first unparse
 ] unit-test
 
 DEFER: xyzzy
@@ -230,3 +235,14 @@ DEFER: xyzzy
 
 [ "xxx" "yyy" ] [ "yyy" "xxx" let*-test-4 ] unit-test
 
+GENERIC: next-method-test ( a -- b )
+
+M: integer next-method-test 3 + ;
+
+M:: fixnum next-method-test ( a -- b ) a call-next-method 1 + ;
+
+[ 5 ] [ 1 next-method-test ] unit-test
+
+: no-with-locals-test { 1 2 3 } [| x | x 3 + ] map ;
+
+[ { 4 5 6 } ] [ no-with-locals-test ] unit-test
index be73f1db889f2f304e9a29c6811e7d1d111121fd..4b7ab8cdadbf1a01110e2b398ac396edaa64bf60 100755 (executable)
@@ -5,7 +5,7 @@ inference.transforms parser words quotations debugger macros
 arrays macros splitting combinators prettyprint.backend
 definitions prettyprint hashtables prettyprint.sections sets
 sequences.private effects generic compiler.units accessors
-locals.backend ;
+locals.backend memoize ;
 IN: locals
 
 ! Inspired by
@@ -81,19 +81,27 @@ C: <quote> quote
 UNION: special local quote local-word local-reader local-writer ;
 
 : load-locals-quot ( args -- quot )
-    dup [ local-reader? ] contains? [
-        <reversed> [
-            local-reader? [ 1array >r ] [ >r ] ?
-        ] map concat
+    dup empty? [
+        drop [ ]
     ] [
-        length [ load-locals ] curry >quotation
+        dup [ local-reader? ] contains? [
+            <reversed> [
+                local-reader? [ 1array >r ] [ >r ] ?
+            ] map concat
+        ] [
+            length [ load-locals ] curry >quotation
+        ] if
     ] if ;
 
 : drop-locals-quot ( args -- quot )
-    length [ drop-locals ] curry ;
+    dup empty? [
+        drop [ ]
+    ] [
+        length [ drop-locals ] curry
+    ] if ;
 
 : point-free-body ( quot args -- newquot )
-    >r 1 head-slice* r> [ localize ] curry map concat ;
+    >r but-last-slice r> [ localize ] curry map concat ;
 
 : point-free-end ( quot args -- newquot )
     over peek special?
@@ -130,7 +138,7 @@ M: object free-vars* drop ;
 M: quotation free-vars* [ add-if-free ] each ;
 
 M: lambda free-vars*
-    [ vars>> ] [ body>> ] bi free-vars diff % ;
+    [ vars>> ] [ body>> ] bi free-vars swap diff % ;
 
 GENERIC: lambda-rewrite* ( obj -- )
 
@@ -193,8 +201,11 @@ M: object local-rewrite* , ;
 : pop-locals ( assoc -- )
     use get delete ;
 
+SYMBOL: in-lambda?
+
 : (parse-lambda) ( assoc end -- quot )
-    parse-until >quotation swap pop-locals ;
+    t in-lambda? [ parse-until ] with-variable
+    >quotation swap pop-locals ;
 
 : parse-lambda ( -- lambda )
     "|" parse-tokens make-locals dup push-locals
@@ -271,26 +282,28 @@ M: wlet local-rewrite*
 
 : (::) CREATE-WORD parse-locals-definition ;
 
-: (M::) CREATE-METHOD parse-locals-definition ;
+: (M::)
+    CREATE-METHOD
+    [ parse-locals-definition ] with-method-definition ;
+
+: parsed-lambda ( form -- )
+    in-lambda? get [ parsed ] [ lambda-rewrite over push-all ] if ;
 
 PRIVATE>
 
-: [| parse-lambda parsed ; parsing
+: [| parse-lambda parsed-lambda ; parsing
 
 : [let
     scan "|" assert= parse-bindings
-\ ] (parse-lambda) <let> parsed ; parsing
+    \ ] (parse-lambda) <let> parsed-lambda ; parsing
 
 : [let*
     scan "|" assert= parse-bindings*
-    >r \ ] parse-until >quotation <let*> parsed r> pop-locals ;
-    parsing
+    \ ] (parse-lambda) <let*> parsed-lambda ; parsing
 
 : [wlet
     scan "|" assert= parse-wbindings
-    \ ] (parse-lambda) <wlet> parsed ; parsing
-
-MACRO: with-locals ( form -- quot ) lambda-rewrite ;
+    \ ] (parse-lambda) <wlet> parsed-lambda ; parsing
 
 : :: (::) define ; parsing
 
@@ -298,6 +311,8 @@ MACRO: with-locals ( form -- quot ) lambda-rewrite ;
 
 : MACRO:: (::) define-macro ; parsing
 
+: MEMO:: (::) define-memoized ; parsing
+
 <PRIVATE
 
 ! Pretty-printing locals
index e2c77377ac7f4193777d64fa28af0dde5d2770e0..cd1429ac53485d9f332c6c2cc0e626026eac1c5c 100755 (executable)
@@ -14,7 +14,7 @@ SYMBOL: message-histogram
     dup second CRITICAL eq? [ dup errors get push ] when\r
     1 over third word-histogram get at+\r
     dup third word-names get member? [\r
-        1 over 1 tail message-histogram get at+\r
+        1 over rest message-histogram get at+\r
     ] when\r
     drop ;\r
 \r
index 664337c3d3ec78f9c1e8526a1629c1e507233975..f54ab05bbd2e9835c2ad0defd47400493b86ddef 100755 (executable)
@@ -72,7 +72,7 @@ PRIVATE>
     >r >r dup r> r> 2curry annotate ;\r
 \r
 : call-logging-quot ( quot word level -- quot' )\r
-    "called" -rot [ log-message ] 3curry swap compose ;\r
+    "called" -rot [ log-message ] 3curry prepose ;\r
 \r
 : add-logging ( word level -- )\r
     [ call-logging-quot ] (define-logging) ;\r
@@ -88,7 +88,7 @@ PRIVATE>
 : input# stack-effect effect-in length ;\r
 \r
 : input-logging-quot ( quot word level -- quot' )\r
-    over input# -rot [ log-stack ] 3curry swap compose ;\r
+    over input# -rot [ log-stack ] 3curry prepose ;\r
 \r
 : add-input-logging ( word level -- )\r
     [ input-logging-quot ] (define-logging) ;\r
index c6aee034cc75f99b9727a940302ac129ccfee3a1..3bc8637f9061a41cd693a4f7458d113dc22a9231 100755 (executable)
@@ -37,18 +37,18 @@ SYMBOL: log-files
     write bl write ": " write print ;\r
 \r
 : write-message ( msg word-name level -- )\r
-    rot [ empty? not ] subset {\r
+    rot [ empty? not ] filter {\r
         { [ dup empty? ] [ 3drop ] }\r
         { [ dup length 1 = ] [ first -rot f (write-message) ] }\r
         [\r
             [ first -rot f (write-message) ] 3keep\r
-            1 tail -rot [ t (write-message) ] 2curry each\r
+            rest -rot [ t (write-message) ] 2curry each\r
         ]\r
     } cond ;\r
 \r
 : (log-message) ( msg -- )\r
     #! msg: { msg word-name level service }\r
-    first4 log-stream [ write-message flush ] with-stream* ;\r
+    first4 log-stream [ write-message flush ] with-output-stream* ;\r
 \r
 : try-dispose ( stream -- )\r
     [ dispose ] curry [ error. ] recover ;\r
index 87536476eeeb115a377975479d53c9e3f5fa5c93..d75915ae8e1e64bbbfb45c7d054338e8728569e8 100644 (file)
@@ -1,5 +1,5 @@
 
-USING: kernel math vectors sequences opengl.gl math.vectors
+USING: kernel math vectors sequences opengl.gl math.vectors math.order
        math.matrices vars opengl self pos ori turtle lsys.tortoise
 
        lsys.strings.interpret ;
index c8d103a084252d31126d5abe8df5a6ba036fb552..c3b9190c3c45c6d0e3bc85fa2cd76671c2b95716 100644 (file)
@@ -1,5 +1,6 @@
 
-USING: kernel namespaces threads math math.vectors quotations sequences
+USING: kernel namespaces threads math math.order math.vectors
+       quotations sequences
        opengl
        opengl.gl
        colors
@@ -495,4 +496,4 @@ make-pile 1 over set-pack-fill "L-system scenes" open-window ;
 : lsys-window* ( -- )
 [ lsys-controller lsys-viewer ] with-ui ;
 
-MAIN: lsys-window*
\ No newline at end of file
+MAIN: lsys-window*
index 4ac59bb0cc29451e8689551a587297248aea9fa8..2e23721e93e60da5330e44ac97fbad65d00f573e 100644 (file)
@@ -42,6 +42,7 @@ HELP: match-replace
 { $examples
   { $example
       "USING: match prettyprint ;"
+      "IN: scratchpad"
       "MATCH-VARS: ?a ?b ;"
       "{ 1 2 } { ?a ?b } { ?b ?a } match-replace ." 
       "{ 2 1 }"
index e559ebc60d3e78eda47d94a297b0ddf17a90d65a..c5a063ab983e36b0df0c3ec03bc07cc44146914e 100755 (executable)
@@ -67,13 +67,13 @@ MACRO: match-cond ( assoc -- )
     [ replace-patterns ] bind ;
 
 : ?1-tail ( seq -- tail/f )
-    dup length zero? not [ 1 tail ] [ drop f ] if ;
+    dup length zero? not [ rest ] [ drop f ] if ;
 
 : (match-first) ( seq pattern-seq -- bindings leftover/f )
     2dup [ length ] bi@ < [ 2drop f f ]
     [
         2dup length head over match
-        [ nip swap ?1-tail ] [ >r 1 tail r> (match-first) ] if*
+        [ nip swap ?1-tail ] [ >r rest r> (match-first) ] if*
     ] if ;
     
 : match-first ( seq pattern-seq -- bindings )
index 355898a8bd6142fba46db1ab0cf785ff321b95a4..514c808ee0bc5f40a80efe4ea7495d8f5989b1e2 100644 (file)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax kernel math sequences ;
+USING: help.markup help.syntax kernel math math.order sequences ;
 IN: math.combinatorics
 
 HELP: factorial
index 487d9828ea3d4bc2094b14f8c4474b42534dabe1..3376ea640b4ffc6bad0de0c3fa8978daeb032275 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (c) 2007, 2008 Slava Pestov, Doug Coleman, Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: assocs kernel math math.ranges mirrors namespaces sequences sorting ;
+USING: assocs kernel math math.order math.ranges mirrors
+namespaces sequences sorting ;
 IN: math.combinatorics
 
 <PRIVATE
index 9174ac99883f6615bfbb5cd2ae34cf1a7f0c137c..063871ce5be5b8b80f464f756577965b4b99383e 100755 (executable)
@@ -1,5 +1,5 @@
-USING: kernel math math.constants math.functions tools.test
-prettyprint ;
+USING: kernel math math.constants math.functions math.order
+tools.test prettyprint ;
 IN: math.complex.tests
 
 [ 1 C{ 0 1 } rect> ] must-fail
index 35471653dc75a73c9d3710875faf31b283887324..c02325810528a60e98ac7a6592c2a394e9bb9846 100755 (executable)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax kernel math
+USING: help.markup help.syntax kernel math math.order
 sequences quotations math.functions.private ;
 IN: math.functions
 
index 8c71eb545b6b2e3886c1add0e51dab4f97ac3d25..c9215d8de739d9adadc25b34ecd6a94454987016 100755 (executable)
@@ -1,5 +1,5 @@
-USING: kernel math math.constants math.functions math.private
-math.libm tools.test ;
+USING: kernel math math.constants math.functions math.order
+math.private math.libm tools.test ;
 IN: math.functions.tests
 
 [ t ] [ 4 4 .00000001 ~ ] unit-test
index 632939ff71fa023099a10f7fc41ae934f9924852..bce93fbb11b062932ef20fc8a3cbc586902ed66f 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2004, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math kernel math.constants math.private
-math.libm combinators ;
+math.libm combinators math.order ;
 IN: math.functions
 
 <PRIVATE
@@ -80,10 +80,6 @@ M: integer (^)
         -rot (^mod)
     ] if ; foldable
 
-GENERIC: abs ( x -- y ) foldable
-
-M: real abs dup 0 < [ neg ] when ;
-
 GENERIC: absq ( x -- y ) foldable
 
 M: real absq sq ;
index 8ac9771767ce7d80b04e9fa85f34d3f81d8130b7..7638550129d2404c613299fc4940201e5d3127b3 100755 (executable)
@@ -21,7 +21,7 @@ SYMBOL: matrix
 : cols ( -- n ) 0 nth-row length ;
 
 : skip ( i seq quot -- n )
-    over >r find* drop r> length or ; inline
+    over >r find-from drop r> length or ; inline
 
 : first-col ( row# -- n )
     #! First non-zero column
@@ -69,7 +69,7 @@ SYMBOL: matrix
 : echelon ( matrix -- matrix' )
     [ 0 0 (echelon) ] with-matrix ;
 
-: nonzero-rows [ [ zero? ] all? not ] subset ;
+: nonzero-rows [ [ zero? ] all? not ] filter ;
 
 : null/rank ( matrix -- null rank )
     echelon dup length swap nonzero-rows length [ - ] keep ;
index 327bf76552a4440c00550353cd8d56d3f248e80c..294cd6278a7533b2073a1ae0ba33542335a93fa9 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays kernel sequences math math.functions
-math.vectors ;
+math.vectors math.order ;
 IN: math.matrices
 
 ! Matrices
index 7835277b9b2fde1110f13f3082dc3315f0064b5e..c668806fc210c18d822ce5624a464c5a5b1e3fc6 100755 (executable)
@@ -76,7 +76,9 @@ TUPLE: miller-rabin-bounds ;
 : find-relative-prime ( n -- p )
     dup random find-relative-prime* ;
 
+ERROR: too-few-primes ;
+
 : unique-primes ( numbits n -- seq )
     #! generate two primes
-    over 5 < [ "not enough primes below 5 bits" throw ] when
+    over 5 < [ too-few-primes ] when
     [ [ drop random-prime ] with map ] [ all-unique? ] generate ;
index 0b0d3520eff47afe86f72c8688309f124ca15b2a..842c4c7f50a2b845ad3f2546a38ed14e2a007e35 100644 (file)
@@ -1,5 +1,5 @@
 USING: arrays kernel sequences vectors math math.vectors namespaces
-shuffle splitting sequences.lib ;
+shuffle splitting sequences.lib math.order ;
 IN: math.polynomials
 
 ! Polynomials are vectors with the highest powers on the right:
@@ -58,7 +58,7 @@ PRIVATE>
     2dup /-last
     2dup , n*p swapd
     p- >vector
-    dup pop* swap 1 tail-slice ;
+    dup pop* swap rest-slice ;
 
 PRIVATE>
 
index edad69fffc650b94a12a5af5c1842640cc08e894..2eeaca6c921314532e9bf209754a2a1099ece686 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Samuel Tardieu.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: combinators kernel lazy-lists math math.functions math.miller-rabin
-       math.primes.list math.ranges sequences sorting ;
+       math.order math.primes.list math.ranges sequences sorting ;
 IN: math.primes
 
 <PRIVATE
index cc7d0758e57f24e4c49fed9445670f49533efa82..eb2623296916bd6bfa0e8c41fc770ea7b405a078 100755 (executable)
@@ -1,4 +1,4 @@
-USING: kernel layouts math namespaces sequences
+USING: kernel layouts math math.order namespaces sequences
 sequences.private accessors ;
 IN: math.ranges
 
index 75572d8415d6ccdf6972d77b8b7749e68e07ee54..28801fa2e98c7e0c863da704def1c792193f6d31 100755 (executable)
@@ -1,5 +1,5 @@
-USING: kernel math math.parser math.ratios math.functions
-tools.test ;
+USING: kernel math math.order math.parser math.ratios
+math.functions tools.test ;
 IN: math.ratios.tests
 
 [ 1 2 ] [ 1/2 >fraction ] unit-test
index 3c430111ffcb9c0c5bc6f6eae8e82f6b60fa71f4..43cbc3fc107d919077ae4d5997c4403aefedaee4 100755 (executable)
@@ -47,5 +47,6 @@ M: ratio - 2dup scale - -rot ratio+d / ;
 M: ratio * 2>fraction * >r * r> / ;
 M: ratio / scale / ;
 M: ratio /i scale /i ;
+M: ratio /f scale /f ;
 M: ratio mod 2dup >r >r /i r> r> rot * - ;
 M: ratio /mod [ /i ] 2keep mod ;
index 51efd33d4580f0811dff080dcef148d9114ac2e2..9c9015d2424de7f82e060a09b26ca19e3501d759 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays kernel sequences math math.functions hints
-float-arrays ;
+float-arrays math.order ;
 IN: math.vectors
 
 : vneg ( u -- v ) [ neg ] map ;
index 5d7bb9a1a22983fef8bd77a37bd8c1c11bbeb918..dbf983be62b6e9f5ef9fac024f0c282c38856e64 100644 (file)
@@ -1,6 +1,7 @@
 ! From http://www.ffconsultancy.com/ocaml/maze/index.html
 USING: sequences namespaces math math.vectors opengl opengl.gl
-arrays kernel random ui ui.gadgets ui.gadgets.canvas ui.render ;
+arrays kernel random ui ui.gadgets ui.gadgets.canvas ui.render
+math.order ;
 IN: maze
 
 : line-width 8 ;
@@ -17,7 +18,7 @@ SYMBOL: visited
 : choices ( cell -- seq )
     { { -1 0 } { 1 0 } { 0 -1 } { 0 1 } }
     [ v+ ] with map
-    [ unvisited? ] subset ;
+    [ unvisited? ] filter ;
 
 : random-neighbour ( cell -- newcell ) choices random ;
 
index dbd2d3a16a5d826b4789e4a2376f5aae35724074..43428efbe004e6541dbffe59758d58a0342324a2 100644 (file)
@@ -1,10 +1,11 @@
 ! Copyright (C) 2007 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math kernel memoize tools.test parser ;
+IN: memoize.tests
 
 MEMO: fib ( m -- n )
     dup 1 <= [ drop 1 ] [ dup 1 - fib swap 2 - fib + ] if ;
 
 [ 89 ] [ 10 fib ] unit-test
 
-[ "USING: kernel math memoize ; MEMO: x ( a b c d e -- f g h i j ) >r >r >r >r 1+ r> r> r> r> ;" eval ] must-fail
+[ "USING: kernel math memoize ; IN: memoize.tests MEMO: x ( a b c d e -- f g h i j ) >r >r >r >r 1+ r> r> r> r> ;" eval ] must-fail
index 45ae2cc9595f4d1bf459e29c3b86a292b37c1c9b..4136f9eaffc630373e2c6a4dbd0cc731fffc8b00 100755 (executable)
@@ -39,8 +39,7 @@ IN: memoize
     over H{ } clone "memoize" set-word-prop
     over make-memoizer define ;
 
-: MEMO:
-    CREATE-WORD parse-definition define-memoized ; parsing
+: MEMO: (:) define-memoized ; parsing
 
 PREDICATE: memoized < word "memoize" word-prop ;
 
index 58335de3d11371abfd7e3db471261c82d0071b73..7a0b4b532aa414bb595e2792f8ca33400489da44 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: generic kernel math sequences arrays assocs alarms
-calendar ;
+calendar math.order ;
 IN: models
 
 TUPLE: model < identity-tuple
diff --git a/extra/monads/authors.txt b/extra/monads/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/monads/monads-tests.factor b/extra/monads/monads-tests.factor
new file mode 100644 (file)
index 0000000..52cdc47
--- /dev/null
@@ -0,0 +1,128 @@
+USING: tools.test monads math kernel sequences lazy-lists promises ;
+IN: monads.tests
+
+[ 5 ] [ 1 identity-monad return [ 4 + ] fmap run-identity ] unit-test
+[ "OH HAI" identity-monad fail ] must-fail
+
+[ 666 ] [
+    111 just [ 6 * ] fmap [ ] [ "OOPS" throw ] if-maybe
+] unit-test
+
+[ nothing ] [
+    111 just [ maybe-monad fail ] bind
+] unit-test
+
+[ 100 ] [
+    5 either-monad return [ 10 * ] [ 20 * ] if-either
+] unit-test
+
+[ T{ left f "OOPS" } ] [
+    5 either-monad return >>= [ drop "OOPS" either-monad fail ] swap call
+] unit-test
+
+[ { 10 20 30 } ] [
+    { 1 2 3 } [ 10 * ] fmap
+] unit-test
+
+[ { } ] [
+    { 1 2 3 } [ drop "OOPS" array-monad fail ] bind
+] unit-test
+
+[ 5 ] [
+    5 state-monad return "initial state" run-st
+] unit-test
+
+[ 8 ] [
+    5 state-monad return [ 3 + state-monad return ] bind
+    "initial state" run-st
+] unit-test
+
+[ 8 ] [
+    5 state-monad return >>=
+    [ 3 + state-monad return ] swap call
+    "initial state" run-st
+] unit-test
+
+[ 11 ] [
+    f state-monad return >>=
+    [ drop get-st ] swap call
+    11 run-st
+] unit-test
+
+[ 15 ] [
+    f state-monad return
+    [ drop get-st ] bind
+    [ 4 + put-st ] bind
+    [ drop get-st ] bind
+    11 run-st
+] unit-test
+
+[ 15 ] [
+    {
+        [ f return-st ]
+        [ drop get-st ]
+        [ 4 + put-st ]
+        [ drop get-st ]
+    } do
+    11 run-st
+] unit-test
+
+[ nothing ] [
+    {
+        [ "hi" just ]
+        [ " bye" append just ]
+        [ drop nothing ]
+        [ reverse just ]
+    } do
+] unit-test
+
+LAZY: nats-from ( n -- list )
+    dup 1+ nats-from cons ;
+
+: nats 0 nats-from ;
+
+[ 3 ] [
+    {
+        [ nats ]
+        [ dup 3 = [ list-monad return ] [ list-monad fail ] if ]
+    } do car
+] unit-test
+
+[ 9/11 ] [
+    {
+        [ ask ]
+    } do 9/11 run-reader
+] unit-test
+
+[ 8 ] [
+    {
+        [ ask ]
+        [ 3 + reader-monad return ]
+    } do
+    5 run-reader
+] unit-test
+
+[ 6 ] [
+    f reader-monad return [ drop ask ] bind [ 1 + ] local 5 run-reader
+] unit-test
+
+[ f { 1 2 3 } ] [
+    5 writer-monad return
+    [ drop { 1 2 3 } tell ] bind
+    run-writer
+] unit-test
+
+[ T{ identity f 7 } ]
+[
+    4 identity-monad return
+    [ 3 + ] identity-monad return
+    identity-monad apply
+] unit-test
+
+[ nothing ] [
+    5 just nothing maybe-monad apply
+] unit-test
+
+[ T{ just f 15 } ] [
+    5 just [ 10 + ] just maybe-monad apply
+] unit-test
diff --git a/extra/monads/monads.factor b/extra/monads/monads.factor
new file mode 100644 (file)
index 0000000..0f4138c
--- /dev/null
@@ -0,0 +1,192 @@
+! Copyright (C) 2008 Slava Pestov
+! See http://factorcode.org/license.txt for BSD license.
+USING: arrays kernel sequences sequences.deep splitting
+accessors fry locals combinators namespaces lazy-lists
+shuffle ;
+IN: monads
+
+! Functors
+GENERIC# fmap 1 ( functor quot -- functor' ) inline
+
+! Monads
+
+! Mixin type for monad singleton classes, used for return/fail only
+MIXIN: monad
+
+GENERIC: monad-of ( mvalue -- singleton )
+GENERIC: return ( string singleton -- mvalue )
+GENERIC: fail ( value singleton -- mvalue )
+GENERIC: >>= ( mvalue -- quot )
+
+M: monad return monad-of return ;
+M: monad fail   monad-of fail   ;
+
+: bind ( mvalue quot -- mvalue' ) swap >>= call ;
+: >>   ( mvalue k -- mvalue' ) '[ drop , ] bind ;
+
+:: lift-m2 ( m1 m2 f monad -- m3 )
+    m1 [| x1 | m2 [| x2 | x1 x2 f monad return ] bind ] bind ;
+
+:: apply ( mvalue mquot monad -- result )
+    mvalue [| value |
+        mquot [| quot |
+            value quot call monad return
+        ] bind
+    ] bind ;
+
+M: monad fmap over '[ @ , return ] bind ;
+
+! 'do' notation
+: do ( quots -- result ) unclip dip [ bind ] each ;
+
+! Identity
+SINGLETON: identity-monad
+INSTANCE:  identity-monad monad
+
+TUPLE: identity value ;
+INSTANCE: identity monad
+
+M: identity monad-of drop identity-monad ;
+
+M: identity-monad return drop identity boa ;
+M: identity-monad fail   "Fail" throw ;
+
+M: identity >>= value>> '[ , _ call ] ;
+
+: run-identity ( identity -- value ) value>> ;
+
+! Maybe
+SINGLETON: maybe-monad
+INSTANCE:  maybe-monad monad
+
+SINGLETON: nothing
+
+TUPLE: just value ;
+: just \ just boa ;
+
+UNION: maybe just nothing ;
+INSTANCE: maybe monad
+
+M: maybe monad-of drop maybe-monad ;
+
+M: maybe-monad return drop just ;
+M: maybe-monad fail   2drop nothing ;
+
+M: nothing >>= '[ drop , ] ;
+M: just    >>= value>> '[ , _ call ] ;
+
+: if-maybe ( maybe just-quot nothing-quot -- )
+    pick nothing? [ 2nip call ] [ drop [ value>> ] dip call ] if ; inline
+
+! Either
+SINGLETON: either-monad
+INSTANCE:  either-monad monad
+
+TUPLE: left value ;
+: left \ left boa ;
+
+TUPLE: right value ;
+: right \ right boa ;
+
+UNION: either left right ;
+INSTANCE: either monad
+
+M: either monad-of drop either-monad ;
+
+M: either-monad return  drop right ;
+M: either-monad fail    drop left ;
+
+M: left  >>= '[ drop , ] ;
+M: right >>= value>> '[ , _ call ] ;
+
+: if-either ( value left-quot right-quot -- )
+    [ [ value>> ] [ left? ] bi ] 2dip if ; inline
+
+! Arrays
+SINGLETON: array-monad
+INSTANCE:  array-monad monad
+INSTANCE:  array monad
+
+M: array-monad return  drop 1array ;
+M: array-monad fail   2drop { } ;
+
+M: array monad-of drop array-monad ;
+
+M: array >>= '[ , _ map concat ] ;
+
+! List
+SINGLETON: list-monad
+INSTANCE:  list-monad monad
+INSTANCE:  list monad
+
+M: list-monad return drop 1list ;
+M: list-monad fail   2drop nil ;
+
+M: list monad-of drop list-monad ;
+
+M: list >>= '[ , _ lmap lconcat ] ;
+
+! State
+SINGLETON: state-monad
+INSTANCE:  state-monad monad
+
+TUPLE: state quot ;
+: state \ state boa ;
+
+INSTANCE: state monad
+
+M: state monad-of drop state-monad ;
+
+M: state-monad return drop '[ , 2array ] state ;
+M: state-monad fail   "Fail" throw ;
+
+: mcall quot>> call ;
+
+M: state >>= '[ , _ '[ , mcall first2 @ mcall ] state ] ;
+
+: get-st ( -- state ) [ dup 2array ] state ;
+: put-st ( value -- state ) '[ drop , f 2array ] state ;
+
+: run-st ( state initial -- ) swap mcall second ;
+
+: return-st state-monad return ;
+
+! Reader
+SINGLETON: reader-monad
+INSTANCE:  reader-monad monad
+
+TUPLE: reader quot ;
+: reader \ reader boa ;
+INSTANCE: reader monad
+
+M: reader monad-of drop reader-monad ;
+
+M: reader-monad return drop '[ drop , ] reader ;
+M: reader-monad fail   "Fail" throw ;
+
+M: reader >>= '[ , _ '[ dup , mcall @ mcall ] reader ] ;
+
+: run-reader ( reader env -- ) swap mcall ;
+
+: ask ( -- reader ) [ ] reader ;
+: local ( reader quot -- reader' ) swap '[ @ , mcall ] reader ;
+
+! Writer
+SINGLETON: writer-monad
+INSTANCE:  writer-monad monad
+
+TUPLE: writer value log ;
+: writer \ writer boa ;
+
+M: writer monad-of drop writer-monad ;
+
+M: writer-monad return drop { } writer ;
+M: writer-monad fail   "Fail" throw ;
+
+: run-writer ( writer -- value log ) [ value>> ] [ log>> ] bi ;
+
+M: writer >>= '[ , run-writer _ '[ @ run-writer ] dip append writer ] ;
+
+: pass ( writer -- writer' ) run-writer [ first2 ] dip swap call writer ;
+: listen ( writer -- writer' ) run-writer [ 2array ] keep writer ;
+: tell ( seq -- writer ) f swap writer ;
diff --git a/extra/monads/summary.txt b/extra/monads/summary.txt
new file mode 100644 (file)
index 0000000..359722c
--- /dev/null
@@ -0,0 +1 @@
+Haskell-style monads
diff --git a/extra/monads/tags.txt b/extra/monads/tags.txt
new file mode 100644 (file)
index 0000000..f427429
--- /dev/null
@@ -0,0 +1 @@
+extensions
diff --git a/extra/morse/authors.txt b/extra/morse/authors.txt
new file mode 100644 (file)
index 0000000..e9c193b
--- /dev/null
@@ -0,0 +1 @@
+Alex Chapman
index c11ba23db741434f2519677ac98fc4c114b3e1ee..e35967d3e965e85f5703f8faa547991241e8686d 100644 (file)
@@ -23,3 +23,11 @@ HELP: morse>
 { $values { "str" "A string of morse code, in which the character '.' represents dots, '-' dashes, ' ' spaces between letters, and ' / ' spaces between words." } { "str" "The ASCII translation of the given string" } }
 { $description "Translates morse code into ASCII text" }
 { $see-also >morse morse>ch } ;
+
+HELP: play-as-morse*
+{ $values { "str" "A string of ascii characters which can be translated into morse code" } { "unit-length" "The length of a dot" } }
+{ $description "Plays a string as morse code" } ;
+
+HELP: play-as-morse
+{ $values { "str" "A string of ascii characters which can be translated into morse code" } }
+{ $description "Plays a string as morse code" } ;
index 97efe1afb4695684212249c1bb7c5e2908bce79a..9bfdc6b50c76bc4427bf6846c4b22a0998a54807 100644 (file)
@@ -9,3 +9,5 @@ USING: arrays morse strings tools.test ;
 [ "-- --- .-. ... . / -.-. --- -.. ." ] [ "morse code" >morse ] unit-test
 [ "morse code" ] [ "-- --- .-. ... . / -.-. --- -.. ." morse> ] unit-test
 [ "hello, world!" ] [ "Hello, World!" >morse morse> ] unit-test
+[ ] [ "sos" 0.075 play-as-morse* ] unit-test
+[ ] [ "Factor rocks!" play-as-morse ] unit-test
index f493951ed5600eb95a2e60d648fdadbb977b424f..ecade14cdbeafb0d0826c561c6cf5e4836d1074e 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2007 Alex Chapman
 ! See http://factorcode.org/license.txt for BSD license.
-USING: assocs hashtables kernel lazy-lists namespaces openal
-parser-combinators promises sequences strings unicode.case ;
+USING: assocs combinators hashtables kernel lazy-lists math namespaces
+openal openal.waves parser-combinators promises sequences strings symbols
+unicode.case ;
 IN: morse
 
 <PRIVATE
@@ -85,25 +86,25 @@ PRIVATE>
 
 <PRIVATE
 
-: dot ( -- ch ) CHAR: . ;
-: dash ( -- ch ) CHAR: - ;
-: char-gap ( -- ch ) CHAR: \s ;
-: word-gap ( -- ch ) CHAR: / ;
+: dot-char ( -- ch ) CHAR: . ;
+: dash-char ( -- ch ) CHAR: - ;
+: char-gap-char ( -- ch ) CHAR: \s ;
+: word-gap-char ( -- ch ) CHAR: / ;
 
 : =parser ( obj -- parser )
     [ = ] curry satisfy ;
 
 LAZY: 'dot' ( -- parser )
-    dot =parser ;
+    dot-char =parser ;
 
 LAZY: 'dash' ( -- parser )
-    dash =parser ;
+    dash-char =parser ;
 
 LAZY: 'char-gap' ( -- parser )
-    char-gap =parser ;
+    char-gap-char =parser ;
 
 LAZY: 'word-gap' ( -- parser )
-    word-gap =parser ;
+    word-gap-char =parser ;
 
 LAZY: 'morse-char' ( -- parser )
     'dot' 'dash' <|> <+> ;
@@ -123,3 +124,53 @@ PRIVATE>
         ] map >string
     ] map [ [ CHAR: \s , ] [ % ] interleave ] "" make ;
 
+<PRIVATE
+SYMBOLS: source dot-buffer dash-buffer intra-char-gap-buffer letter-gap-buffer ;
+
+: queue ( symbol -- )
+    get source get swap queue-buffer ;
+
+: dot ( -- ) dot-buffer queue ;
+: dash ( -- ) dash-buffer queue ;
+: intra-char-gap ( -- ) intra-char-gap-buffer queue ;
+: letter-gap ( -- ) letter-gap-buffer queue ;
+
+: sine-buffer ( seconds -- id )
+    >r 8 22000 880 r> <sine-wave-buffer> send-buffer* ;
+
+: silent-buffer ( seconds -- id )
+    8 22000 rot <silent-buffer> send-buffer* ;
+
+: make-buffers ( unit-length -- )
+    {
+        [ sine-buffer dot-buffer set ]
+        [ 3 * sine-buffer dash-buffer set ]
+        [ silent-buffer intra-char-gap-buffer set ]
+        [ 3 * silent-buffer letter-gap-buffer set ]
+    } cleave ;
+
+: playing-morse ( quot unit-length -- )
+    [
+        init-openal 1 gen-sources first source set make-buffers
+        call
+        source get source-play
+    ] with-scope ;
+
+: play-char ( ch -- )
+    [ intra-char-gap ] [
+        {
+            { dot-char [ dot ] }
+            { dash-char [ dash ] }
+            { word-gap-char [ intra-char-gap ] }
+        } case
+    ] interleave ;
+
+PRIVATE>
+
+: play-as-morse* ( str unit-length -- )
+    [
+        [ letter-gap ] [ ch>morse play-char ] interleave
+    ] swap playing-morse ;
+
+: play-as-morse ( str -- )
+    0.05 play-as-morse* ;
index b7862af7ac4e59a3f5d061e7b55412d455be2e02..6173669ad031e7fc93cc964bc835e2eaf093e0bf 100644 (file)
@@ -122,7 +122,7 @@ over class-class-methods assoc-stack call ;
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 : send-message-next ( object message -- )
-over object-class class-methods 1 head* assoc-stack call ;
+over object-class class-methods but-last assoc-stack call ;
 
 : <-~ scan parsed \ send-message-next parsed ; parsing
 
index dd6fc7dfff6014c43d473894f141130c7bf2fd25..59e8049232b27a78c2336378aa84221c44c2a6b6 100755 (executable)
@@ -4,7 +4,7 @@ USING: kernel math sequences vectors classes classes.algebra
 combinators arrays words assocs parser namespaces definitions
 prettyprint prettyprint.backend quotations arrays.lib
 debugger io compiler.units kernel.private effects accessors
-hashtables sorting shuffle ;
+hashtables sorting shuffle math.order ;
 IN: multi-methods
 
 ! PART I: Converting hook specializers
@@ -19,12 +19,12 @@ SYMBOL: total
 
 : canonicalize-specializer-1 ( specializer -- specializer' )
     [
-        [ class? ] subset
+        [ class? ] filter
         [ length <reversed> [ 1+ neg ] map ] keep zip
         [ length args [ max ] change ] keep
     ]
     [
-        [ pair? ] subset
+        [ pair? ] filter
         [ keys [ hooks get push-new ] each ] keep
     ] bi append ;
 
@@ -73,7 +73,7 @@ SYMBOL: total
 ! Part II: Topologically sorting specializers
 : maximal-element ( seq quot -- n elt )
     dupd [
-        swapd [ call 0 < ] 2curry subset empty?
+        swapd [ call +lt+ = ] 2curry filter empty?
     ] 2curry find [ "Topological sort failed" throw ] unless* ;
     inline
 
@@ -82,16 +82,16 @@ SYMBOL: total
     [ dupd maximal-element >r over delete-nth r> ] curry
     [ ] unfold nip ; inline
 
-: classes< ( seq1 seq2 -- -1/0/1 )
+: classes< ( seq1 seq2 -- lt/eq/gt )
     [
         {
-            { [ 2dup eq? ] [ 0 ] }
-            { [ 2dup [ class< ] 2keep swap class< and ] [ 0 ] }
-            { [ 2dup class< ] [ -1 ] }
-            { [ 2dup swap class< ] [ 1 ] }
-            [ 0 ]
+            { [ 2dup eq? ] [ +eq+ ] }
+            { [ 2dup [ class<= ] [ swap class<= ] 2bi and ] [ +eq+ ] }
+            { [ 2dup class<= ] [ +lt+ ] }
+            { [ 2dup swap class<= ] [ +gt+ ] }
+            [ +eq+ ]
         } cond 2nip
-    ] 2map [ zero? not ] find nip 0 or ;
+    ] 2map [ +eq+ eq? not ] find nip +eq+ or ;
 
 : sort-methods ( alist -- alist' )
     [ [ first ] bi@ classes< ] topological-sort ;
@@ -111,7 +111,7 @@ SYMBOL: total
 : multi-predicate ( classes -- quot )
     dup length <reversed>
     [ picker 2array ] 2map
-    [ drop object eq? not ] assoc-subset
+    [ drop object eq? not ] assoc-filter
     dup empty? [ drop [ t ] ] [
         [ (multi-predicate) ] { } assoc>map
         unclip [ swap [ f ] \ if 3array append [ ] like ] reduce
index ed8bece4bab14d86dff62371b84fffd97333a01c..f1618374ef0ffbc9f04400b3d4f7345384f55fbd 100644 (file)
@@ -1,18 +1,19 @@
+USING: kernel multi-methods tools.test math arrays sequences
+math.order ;
 IN: multi-methods.tests
-USING: kernel multi-methods tools.test math arrays sequences ;
 
 [ { 1 2 3 4 5 6 } ] [
     { 6 4 5 1 3 2 } [ <=> ] topological-sort
 ] unit-test
 
-[ -1 ] [
+[ +lt+ ] [
     { fixnum array } { number sequence } classes<
 ] unit-test
 
-[ 0 ] [
+[ +eq+ ] [
     { number sequence } { number sequence } classes<
 ] unit-test
 
-[ 1 ] [
+[ +gt+ ] [
     { object object } { number sequence } classes<
 ] unit-test
index 079f4842747ba95740c75c39383aaa5440bde1f8..ce79bdaf5f8f88ef150776edaad939c67b1500ae 100755 (executable)
@@ -14,7 +14,7 @@ IN: multiline
     ] [ ";" unexpected-eof ] if* ;
 
 : parse-here ( -- str )
-    [ (parse-here) ] "" make 1 head*
+    [ (parse-here) ] "" make but-last
     lexer get next-line ;
 
 : STRING:
@@ -34,7 +34,7 @@ IN: multiline
     [
         lexer get lexer-column swap (parse-multiline-string)
         lexer get set-lexer-column
-    ] "" make 1 tail 1 head* ;
+    ] "" make rest but-last ;
 
 : <"
     "\">" parse-multiline-string parsed ; parsing
index 3e5f66eb6fa3032998294e3a1ab5f4cb9a0b3faa..2b2f916aeaa5fb5079c0e0109ff4b58a64bc1e8c 100644 (file)
@@ -143,7 +143,7 @@ METHOD: as-mutate { object object assoc }       set-at ;
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-: subset-of ( quot seq -- seq ) swap subset ;
+: filter-of ( quot seq -- seq ) swap filter ;
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
index d4ad11311fa2264f08bcfaee8c723da9234d884f..251206f1d128daa6ca623a5527c43d9dc4a3fbd6 100755 (executable)
@@ -15,7 +15,7 @@ USING: kernel alien ogg ogg.vorbis ogg.theora io byte-arrays
        namespaces threads shuffle opengl arrays ui.gadgets.worlds\r
        combinators math.parser ui.gadgets ui.render opengl.gl ui\r
        continuations io.files hints combinators.lib sequences.lib\r
-       io.encodings.binary debugger ;\r
+       io.encodings.binary debugger math.order ;\r
 \r
 IN: ogg.player\r
 \r
index ff67a30ea34ad67b3621a25f37a9f28128f75a00..c0a79d8353cd55563aaed6078403b1c2778788a0 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2007 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel alien system combinators alien.syntax namespaces
+USING: kernel arrays alien system combinators alien.syntax namespaces
        alien.c-types sequences vocabs.loader shuffle combinators.lib
        openal.backend ;
 IN: openal
@@ -266,6 +266,12 @@ os macosx? "openal.macosx" "openal.other" ? require
   gen-buffer dup rot load-wav-file
   [ alBufferData ] 4keep alutUnloadWAV ;
 
+: queue-buffers ( source buffers -- )
+    [ length ] [ >c-uint-array ] bi alSourceQueueBuffers ;
+
+: queue-buffer ( source buffer -- )
+    1array queue-buffers ;
+
 : set-source-param ( source param value -- )
   alSourcei ;
 
diff --git a/extra/openal/waves/waves-tests.factor b/extra/openal/waves/waves-tests.factor
new file mode 100644 (file)
index 0000000..b295283
--- /dev/null
@@ -0,0 +1,5 @@
+USING: kernel openal openal.waves sequences tools.test ;
+IN: openal.waves.tests
+
+
+[ ] [ 8 22000 440 1 play-sine-wave ] unit-test
diff --git a/extra/openal/waves/waves.factor b/extra/openal/waves/waves.factor
new file mode 100644 (file)
index 0000000..abe9f8f
--- /dev/null
@@ -0,0 +1,53 @@
+USING: accessors alien.c-types combinators kernel locals math
+math.constants math.functions math.ranges openal sequences ;
+IN: openal.waves
+
+TUPLE: buffer bits channels sample-freq seq id ;
+
+: <buffer> ( bits sample-freq seq -- buffer )
+    ! defaults to 1 channel
+    1 -rot gen-buffer buffer boa ;
+
+: buffer-format ( buffer -- format )
+    dup buffer-channels 1 = swap buffer-bits 8 = [
+        AL_FORMAT_MONO8 AL_FORMAT_STEREO8
+    ] [
+        AL_FORMAT_MONO16 AL_FORMAT_STEREO16
+    ] if ? ;
+
+: buffer-data ( buffer -- data size )
+    #! 8 bit data is integers between 0 and 255,
+    #! 16 bit data is integers between -32768 and 32768
+    #! size is in bytes
+    [ seq>> ] [ bits>> ] bi 8 = [
+        [ 128 * >integer 128 + ] map [ >c-uchar-array ] [ length ] bi
+    ] [
+        [ 32768 * >integer ] map [ >c-short-array ] [ length 2 * ] bi
+    ] if ;
+
+: send-buffer ( buffer -- )
+    { [ id>> ] [ buffer-format ] [ buffer-data ] [ sample-freq>> ] } cleave
+    alBufferData ;
+
+: send-buffer* ( buffer -- id )
+    [ send-buffer ] [ id>> ] bi ;
+
+: (sine-wave-seq) ( samples/wave n-samples -- seq )
+    pi 2 * rot / [ * sin ] curry map ;
+
+: sine-wave-seq ( sample-freq freq seconds -- seq )
+    pick * >integer [ / ] dip (sine-wave-seq) ;
+
+: <sine-wave-buffer> ( bits sample-freq freq seconds -- buffer )
+    >r dupd r> sine-wave-seq <buffer> ;
+
+: <silent-buffer> ( bits sample-freq seconds -- buffer )
+    dupd * >integer [ drop 0 ] map <buffer> ;
+
+: play-sine-wave ( bits sample-freq freq seconds -- )
+    init-openal
+    <sine-wave-buffer> send-buffer*
+    1 gen-sources first
+    [ AL_BUFFER rot set-source-param ] [ source-play ] bi
+    check-error ;
+
index 6802d1537840edff93def27370d224a2ff12180c..d658235cf629ad6371eab320725d2533c1cd87a5 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel namespaces sequences splitting opengl.gl
-continuations math.parser math arrays sets ;
+continuations math.parser math arrays sets math.order ;
 IN: opengl.capabilities
 
 : (require-gl) ( thing require-quot make-error-quot -- )
@@ -15,7 +15,7 @@ IN: opengl.capabilities
 : has-gl-extensions? ( extensions -- ? )
     gl-extensions swap [ over member? ] all? nip ;
 : (make-gl-extensions-error) ( required-extensions -- )
-    gl-extensions swap diff
+    gl-extensions diff
     "Required OpenGL extensions not supported:\n" %
     [ "    " % % "\n" % ] each ;
 : require-gl-extensions ( extensions -- )
index 84515305c8193ea8e3034bf97a1509017651901d..88531a70bc135eb68ca07d10f697a1fd4989f1b5 100755 (executable)
@@ -1,17 +1,11 @@
-USING: arrays combinators.lib kernel math math.functions math.vectors namespaces
-       opengl opengl.gl sequences ui ui.gadgets ui.gestures ui.render ;
+USING: arrays combinators.lib kernel math math.functions
+math.order math.vectors namespaces opengl opengl.gl sequences ui
+ui.gadgets ui.gestures ui.render accessors ;
 IN: opengl.demo-support
 
-: NEAR-PLANE 1.0 64.0 / ; inline
-: FAR-PLANE 4.0 ; inline
 : FOV 2.0 sqrt 1+ ; inline
 : MOUSE-MOTION-SCALE 0.5 ; inline
-: MOUSE-DISTANCE-SCALE 1.0 64.0 / ; inline
 : KEY-ROTATE-STEP 1.0 ; inline
-: KEY-DISTANCE-STEP 1.0 64.0 / ; inline
-: DIMS { 640 480 } ; inline
-
-: FOV-RATIO ( -- fov ) DIMS dup first2 min v/n ;
 
 SYMBOL: last-drag-loc
 
@@ -19,7 +13,20 @@ TUPLE: demo-gadget yaw pitch distance ;
 
 : <demo-gadget> ( yaw pitch distance -- gadget )
     demo-gadget construct-gadget 
-    [ { set-demo-gadget-yaw set-demo-gadget-pitch set-demo-gadget-distance } set-slots ] keep ;
+    [ { (>>yaw) (>>pitch) (>>distance) } set-slots ] keep ;
+
+GENERIC: far-plane ( gadget -- z )
+GENERIC: near-plane ( gadget -- z )
+GENERIC: distance-step ( gadget -- dz )
+
+M: demo-gadget far-plane ( gadget -- z )
+    drop 4.0 ;
+M: demo-gadget near-plane ( gadget -- z )
+    drop 1.0 64.0 / ;
+M: demo-gadget distance-step ( gadget -- dz )
+    drop 1.0 64.0 / ;
+
+: fov-ratio ( gadget -- fov ) dim>> dup first2 min v/n ;
 
 : yaw-demo-gadget ( yaw gadget -- )
     [ [ demo-gadget-yaw + ] keep set-demo-gadget-yaw ] keep relayout-1 ;
@@ -31,26 +38,31 @@ TUPLE: demo-gadget yaw pitch distance ;
     [ [ demo-gadget-distance + ] keep set-demo-gadget-distance ] keep relayout-1 ;
 
 M: demo-gadget pref-dim* ( gadget -- dim )
-    drop DIMS ;
+    drop { 640 480 } ;
 
 : -+ ( x -- -x x )
     dup neg swap ;
 
-: demo-gadget-frustum ( -- -x x -y y near far )
-    FOV-RATIO NEAR-PLANE FOV / v*n
-    first2 [ -+ ] bi@ NEAR-PLANE FAR-PLANE ;
+: demo-gadget-frustum ( gadget -- -x x -y y near far )
+    [ near-plane ] [ far-plane ] [ fov-ratio ] tri [
+        nip swap FOV / v*n
+        first2 [ -+ ] bi@
+    ] 3keep drop ;
 
 : demo-gadget-set-matrices ( gadget -- )
-    GL_PROJECTION glMatrixMode
-    glLoadIdentity
-    demo-gadget-frustum glFrustum
     GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
-    GL_MODELVIEW glMatrixMode
-    glLoadIdentity
-    [ >r 0.0 0.0 r> demo-gadget-distance neg glTranslatef ]
-    [ demo-gadget-pitch 1.0 0.0 0.0 glRotatef ]
-    [ demo-gadget-yaw   0.0 1.0 0.0 glRotatef ]
-    tri ;
+    [
+        GL_PROJECTION glMatrixMode
+        glLoadIdentity
+        demo-gadget-frustum glFrustum
+    ] [
+        GL_MODELVIEW glMatrixMode
+        glLoadIdentity
+        [ >r 0.0 0.0 r> distance>> neg glTranslatef ]
+        [ pitch>> 1.0 0.0 0.0 glRotatef ]
+        [ yaw>>   0.0 1.0 0.0 glRotatef ]
+        tri
+    ] bi ;
 
 : reset-last-drag-rel ( -- )
     { 0 0 } last-drag-loc set-global ;
@@ -65,11 +77,11 @@ demo-gadget H{
     { T{ key-down f f "RIGHT" } [ KEY-ROTATE-STEP     swap yaw-demo-gadget ] }
     { T{ key-down f f "DOWN"  } [ KEY-ROTATE-STEP neg swap pitch-demo-gadget ] }
     { T{ key-down f f "UP"    } [ KEY-ROTATE-STEP     swap pitch-demo-gadget ] }
-    { T{ key-down f f "="     } [ KEY-DISTANCE-STEP neg swap zoom-demo-gadget ] }
-    { T{ key-down f f "-"     } [ KEY-DISTANCE-STEP     swap zoom-demo-gadget ] }
+    { T{ key-down f f "="     } [ dup distance-step neg swap zoom-demo-gadget ] }
+    { T{ key-down f f "-"     } [ dup distance-step     swap zoom-demo-gadget ] }
     
     { T{ button-down f f 1 }    [ drop reset-last-drag-rel ] }
     { T{ drag f 1 }             [ drag-yaw-pitch rot [ pitch-demo-gadget ] keep yaw-demo-gadget ] }
-    { T{ mouse-scroll }         [ scroll-direction get second MOUSE-DISTANCE-SCALE * swap zoom-demo-gadget ] }
+    { T{ mouse-scroll }         [ scroll-direction get second over distance-step * swap zoom-demo-gadget ] }
 } set-gestures
 
index 739ad203a19825f39c951d14c4a447e67f7e0300..8f2eee9459d1cc7ac88d3f5ad4460d20aca5432c 100644 (file)
@@ -43,6 +43,6 @@ reset-gl-function-number-counter
     scan drop "}" parse-tokens swap prefix
     gl-function-number
     [ gl-function-pointer ] 2curry swap
-    ";" parse-tokens [ "()" subseq? not ] subset
+    ";" parse-tokens [ "()" subseq? not ] filter
     define-indirect
     ; parsing
index 2788ebdfc2d72fe5c8e22e6ef723ca50ec6f6336..b168f4cad136a995329b347727e263d44b99035f 100644 (file)
@@ -7,7 +7,7 @@ HELP: gl-color
 { $description "Wrapper for " { $link glColor4d } " taking a color specifier." } ;
 
 HELP: gl-error
-{ $description "If the most recent OpenGL call resulted in an error, print the error to the " { $link stdio } " stream." } ;
+{ $description "If the most recent OpenGL call resulted in an error, print the error to " { $link output-stream } "." } ;
 
 HELP: do-state
   {
index ab9ae38ac1ab7a284b3260b2124af6b8514af874..ee58a4e3451a6a6d24a85a0612aba48aaa709464 100755 (executable)
@@ -87,7 +87,7 @@ MACRO: all-enabled-client-state ( seq quot -- )
 
 : adjust-points [ [ 1 + 0.5 * ] map ] bi@ ;
 
-: scale-points 2array flip [ v* ] with map [ v+ ] with map ;
+: scale-points zip [ v* ] with map [ v+ ] with map ;
 
 : circle-points ( loc dim steps -- points )
     circle-steps unit-circle adjust-points scale-points ;
diff --git a/extra/openssl/authors.txt b/extra/openssl/authors.txt
deleted file mode 100644 (file)
index 7c29e7c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Elie Chaftari
diff --git a/extra/openssl/libcrypto/libcrypto.factor b/extra/openssl/libcrypto/libcrypto.factor
deleted file mode 100755 (executable)
index 312c7b0..0000000
+++ /dev/null
@@ -1,131 +0,0 @@
-! Copyright (C) 2007 Elie CHAFTARI
-! See http://factorcode.org/license.txt for BSD license.
-!
-! Tested with OpenSSL 0.9.8a_0 on Mac OS X 10.4.9 PowerPC
-!
-! export LD_LIBRARY_PATH=/opt/local/lib
-
-USING: alien alien.syntax combinators kernel system ;
-
-IN: openssl.libcrypto
-
-<<
-"libcrypto" {
-    { [ os winnt? ]  [ "libeay32.dll" "cdecl" ] }
-    { [ os macosx? ] [ "libcrypto.dylib" "cdecl" ] }
-    { [ os unix? ]   [ "libcrypto.so" "cdecl" ] }
-} cond add-library
->>
-
-C-STRUCT: bio-method
-    { "int" "type" }
-    { "void*" "name" }
-    { "void*" "bwrite" }
-    { "void*" "bread" }
-    { "void*" "bputs" }
-    { "void*" "bgets" }
-    { "void*" "ctrl" }
-    { "void*" "create" }
-    { "void*" "destroy" }
-    { "void*" "callback-ctrl" } ;
-
-C-STRUCT: bio
-    { "void*" "method" }
-    { "void*" "callback" }
-    { "void*" "cb-arg" }
-    { "int" "init" }
-    { "int" "shutdown" }
-    { "int" "flags" }
-    { "int" "retry-reason" }
-    { "int" "num" }
-    { "void*" "ptr" }
-    { "void*" "next-bio" }
-    { "void*" "prev-bio" }
-    { "int" "references" } 
-    { "ulong" "num-read" }
-    { "ulong" "num-write" } 
-    { "void*" "crypto-ex-data-stack" }
-    { "int" "crypto-ex-data-dummy" } ;
-
-: BIO_NOCLOSE       HEX: 00 ; inline
-: BIO_CLOSE         HEX: 01 ; inline
-
-: RSA_3             HEX: 3 ; inline
-: RSA_F4            HEX: 10001 ; inline
-
-: BIO_C_SET_SSL     109 ; inline
-: BIO_C_GET_SSL     110 ; inline
-
-LIBRARY: libcrypto
-
-! ===============================================
-! bio.h
-! ===============================================
-
-FUNCTION: bio* BIO_new_file ( char* filename, char* mode ) ;
-
-FUNCTION: int BIO_printf ( bio* bio, char* format ) ;
-
-FUNCTION: long BIO_ctrl ( void* bio, int cmd, long larg, void* parg ) ;
-
-FUNCTION: void* BIO_new_socket ( int fd, int close-flag ) ;
-
-FUNCTION: void* BIO_new ( void* method ) ;
-
-FUNCTION: int BIO_set ( void* bio, void* method ) ;
-
-FUNCTION: int BIO_free ( void* bio ) ;
-
-FUNCTION: void* BIO_push ( void* bio, void* append ) ;
-
-FUNCTION: int BIO_read ( void* b, void* buf, int len ) ;
-
-FUNCTION: int BIO_gets ( void* b, char* buf, int size ) ;
-
-FUNCTION: int BIO_write ( void* b, void* buf, int len ) ;
-
-FUNCTION: int BIO_puts ( void* bp, char* buf ) ;
-
-FUNCTION: ulong ERR_get_error (  ) ;
-
-FUNCTION: char* ERR_error_string ( ulong e, void* buf ) ;
-
-FUNCTION: void* BIO_f_buffer (  ) ;
-
-! ===============================================
-! evp.h
-! ===============================================
-
-! Initialize ciphers and digest tables
-FUNCTION: void OpenSSL_add_all_ciphers (  ) ;
-
-FUNCTION: void OpenSSL_add_all_digests (  ) ;
-
-! Clean them up before exiting
-FUNCTION: void EVP_cleanup (  ) ;
-
-FUNCTION: void* EVP_get_digestbyname ( char* name ) ;
-
-FUNCTION: void EVP_MD_CTX_init ( void* ctx ) ;
-
-FUNCTION: void* PEM_read_bio_DHparams ( void* bp, void* x, void* cb,
-                                        void* u ) ;
-
-! ===============================================
-! md5.h
-! ===============================================
-
-FUNCTION: uchar* MD5 ( uchar* d, ulong n, uchar* md ) ;
-
-! ===============================================
-! rsa.h
-! ===============================================
-
-FUNCTION: void* RSA_generate_key ( int num, ulong e, void* callback,
-                                   void* cb_arg ) ;
-
-FUNCTION: int RSA_check_key ( void* rsa ) ;
-
-FUNCTION: void RSA_free ( void* rsa ) ;
-
-FUNCTION: int RSA_print_fp ( void* fp, void* x, int offset ) ;
diff --git a/extra/openssl/libssl/libssl.factor b/extra/openssl/libssl/libssl.factor
deleted file mode 100755 (executable)
index 0f2e7b3..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-! Copyright (C) 2007 Elie CHAFTARI
-! See http://factorcode.org/license.txt for BSD license.
-!
-! Tested with OpenSSL 0.9.8a_0 on Mac OS X 10.4.9 PowerPC
-!
-! export LD_LIBRARY_PATH=/opt/local/lib
-
-USING: alien alien.syntax combinators kernel system ;
-
-IN: openssl.libssl
-
-<< "libssl" {
-    { [ os winnt? ]  [ "ssleay32.dll" "cdecl" ] }
-    { [ os macosx? ] [ "libssl.dylib" "cdecl" ] }
-    { [ os unix? ]   [ "libssl.so" "cdecl" ] }
-} cond add-library >>
-
-: X509_FILETYPE_PEM       1 ; inline
-: X509_FILETYPE_ASN1      2 ; inline
-: X509_FILETYPE_DEFAULT   3 ; inline
-
-: SSL_FILETYPE_ASN1  X509_FILETYPE_ASN1 ; inline
-: SSL_FILETYPE_PEM   X509_FILETYPE_PEM ; inline
-
-: SSL_CTRL_NEED_TMP_RSA      1 ; inline
-: SSL_CTRL_SET_TMP_RSA       2 ; inline
-: SSL_CTRL_SET_TMP_DH        3 ; inline
-: SSL_CTRL_SET_TMP_RSA_CB    4 ; inline
-: SSL_CTRL_SET_TMP_DH_CB     5 ; inline
-
-: SSL_ERROR_NONE             0 ; inline
-: SSL_ERROR_SSL              1 ; inline
-: SSL_ERROR_WANT_READ        2 ; inline
-: SSL_ERROR_WANT_WRITE       3 ; inline
-: SSL_ERROR_WANT_X509_LOOKUP 4 ; inline
-: SSL_ERROR_SYSCALL          5 ; inline ! consult errno for details
-: SSL_ERROR_ZERO_RETURN      6 ; inline
-: SSL_ERROR_WANT_CONNECT     7 ; inline
-: SSL_ERROR_WANT_ACCEPT      8 ; inline
-
-! Error messages table
-: error-messages ( -- hash )
-    H{
-        { 0  "SSL_ERROR_NONE" }
-        { 1  "SSL_ERROR_SSL" }
-        { 2  "SSL_ERROR_WANT_READ" }
-        { 3  "SSL_ERROR_WANT_WRITE" }
-        { 4  "SSL_ERROR_WANT_X509_LOOKUP" }
-        { 5  "SSL_ERROR_SYSCALL" }
-        { 6  "SSL_ERROR_ZERO_RETURN" }
-        { 7  "SSL_ERROR_WANT_CONNECT" }
-        { 8  "SSL_ERROR_WANT_ACCEPT" }
-    } ;
-
-TYPEDEF: void* ssl-method
-TYPEDEF: void* ssl-ctx
-TYPEDEF: void* ssl-pointer
-
-LIBRARY: libssl
-
-! ===============================================
-! ssl.h
-! ===============================================
-
-FUNCTION: char* SSL_get_version ( ssl-pointer ssl ) ;
-
-! Maps OpenSSL errors to strings
-FUNCTION: void SSL_load_error_strings (  ) ;
-
-! Must be called before any other action takes place
-FUNCTION: int SSL_library_init (  ) ;
-
-! Sets the default SSL version
-FUNCTION: ssl-method SSLv2_client_method (  ) ;
-
-FUNCTION: ssl-method SSLv23_client_method (  ) ;
-
-FUNCTION: ssl-method SSLv23_server_method (  ) ;
-
-FUNCTION: ssl-method SSLv23_method (  ) ; ! SSLv3 but can rollback to v2
-
-FUNCTION: ssl-method SSLv3_client_method (  ) ;
-
-FUNCTION: ssl-method SSLv3_server_method (  ) ;
-
-FUNCTION: ssl-method SSLv3_method (  ) ;
-
-FUNCTION: ssl-method TLSv1_client_method (  ) ;
-
-FUNCTION: ssl-method TLSv1_server_method (  ) ;
-
-FUNCTION: ssl-method TLSv1_method (  ) ;
-
-! Creates the context
-FUNCTION: ssl-ctx SSL_CTX_new ( ssl-method method ) ;
-
-! Load the certificates and private keys into the SSL_CTX
-FUNCTION: int SSL_CTX_use_certificate_chain_file ( ssl-ctx ctx,
-                                                   char* file ) ; ! PEM type
-FUNCTION: ssl-pointer SSL_new ( ssl-ctx ctx ) ;
-
-FUNCTION: int SSL_set_fd ( ssl-pointer ssl, int fd ) ;
-
-FUNCTION: void SSL_set_bio ( ssl-pointer ssl, void* rbio, void* wbio ) ;
-
-FUNCTION: int SSL_get_error ( ssl-pointer ssl, int ret ) ;
-
-FUNCTION: void SSL_set_connect_state ( ssl-pointer ssl ) ;
-
-FUNCTION: void SSL_set_accept_state ( ssl-pointer ssl ) ;
-
-FUNCTION: int SSL_connect ( ssl-pointer ssl ) ;
-
-FUNCTION: int SSL_accept ( ssl-pointer ssl ) ;
-
-FUNCTION: int SSL_write ( ssl-pointer ssl, void* buf, int num ) ;
-
-FUNCTION: int SSL_read ( ssl-pointer ssl, void* buf, int num ) ;
-
-FUNCTION: void SSL_shutdown ( ssl-pointer ssl ) ;
-
-FUNCTION: void SSL_free ( ssl-pointer ssl ) ;
-
-FUNCTION: void SSL_CTX_free ( ssl-ctx ctx ) ;
-
-FUNCTION: void RAND_seed ( void* buf, int num ) ;
-
-FUNCTION: int SSL_set_cipher_list ( ssl-pointer ssl, char* str ) ;
-
-FUNCTION: int SSL_use_RSAPrivateKey_file ( ssl-pointer ssl, char* str ) ;
-
-FUNCTION: int SSL_CTX_use_RSAPrivateKey_file ( ssl-ctx ctx, int type ) ;
-
-FUNCTION: int SSL_use_certificate_file ( ssl-pointer ssl,
-                                         char* str, int type ) ;
-
-FUNCTION: int SSL_CTX_load_verify_locations ( ssl-ctx ctx, char* CAfile,
-                                              char* CApath ) ;
-
-FUNCTION: void SSL_CTX_set_client_CA_list ( ssl-ctx ctx, ssl-pointer list ) ;
-
-FUNCTION: ssl-pointer SSL_load_client_CA_file ( char* file ) ;
-
-! Used to manipulate settings of the SSL_CTX and SSL objects.
-! This function should never be called directly
-FUNCTION: long SSL_CTX_ctrl ( ssl-ctx ctx, int cmd, long larg, void* parg ) ;
-
-FUNCTION: void SSL_CTX_set_default_passwd_cb ( ssl-ctx ctx, void* cb ) ;
-
-FUNCTION: void SSL_CTX_set_default_passwd_cb_userdata ( ssl-ctx ctx,
-                                                        void* u ) ;
-
-FUNCTION: int SSL_CTX_use_PrivateKey_file ( ssl-ctx ctx, char* file,
-                                            int type ) ;
-
-! Sets the maximum depth for the allowed ctx certificate chain verification 
-FUNCTION: void SSL_CTX_set_verify_depth ( ssl-ctx ctx, int depth ) ;
-
-! Sets DH parameters to be used to be dh.
-! The key is inherited by all ssl objects created from ctx
-FUNCTION: void SSL_CTX_set_tmp_dh_callback ( ssl-ctx ctx, void* dh ) ;
-
-FUNCTION: void SSL_CTX_set_tmp_rsa_callback ( ssl-ctx ctx, void* rsa ) ;
-
-FUNCTION: void* BIO_f_ssl (  ) ;
-
-! ===============================================
-! sha.h
-! ===============================================
-
-! For a high level interface to message digests
-! use the EVP digest routines in libcrypto.factor
-
-FUNCTION: uchar* SHA1 ( uchar* d, ulong n, uchar* md ) ;
diff --git a/extra/openssl/openssl-docs.factor b/extra/openssl/openssl-docs.factor
deleted file mode 100644 (file)
index dd31bfd..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-
-USING: help.syntax help.markup ;
-
-IN: openssl
-
-ARTICLE: "openssl" "OpenSSL"
-
-"Factor on Windows has been tested with this version of OpenSSL: "
-
-{ $url "http://www.openssl.org/related/binaries.html" } ;
\ No newline at end of file
diff --git a/extra/openssl/openssl-tests.factor b/extra/openssl/openssl-tests.factor
deleted file mode 100755 (executable)
index 5825ca7..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-USING: alien alien.c-types alien.strings assocs bit-arrays
-hashtables io io.files io.encodings.ascii io.sockets kernel
-mirrors openssl.libcrypto openssl.libssl namespaces math
-math.parser openssl prettyprint sequences tools.test ;
-
-! =========================================================
-! Some crypto functions (still to be turned into words)
-! =========================================================
-
-[
-    B{ 201 238 222 100 92 200 182 188 138 255 129 163 115 88 240 136 }
-]
-[ "Hello world from the openssl binding" >md5 ] unit-test
-
-! Not found on netbsd, windows -- why?
-! [
-    ! B{ 63 113 237 255 181 5 152 241 136 181 43 95 160 105 44 87 49
-    ! 82 115 0 }
-! ]
-! [ "Hello world from the openssl binding" >sha1 ] unit-test
-
-! =========================================================
-! Initialize context
-! =========================================================
-
-[ ] [ init load-error-strings ] unit-test
-
-[ ] [ ssl-v23 new-ctx ] unit-test
-
-[ ] [ get-ctx "extra/openssl/test/server.pem" resource-path use-cert-chain ] unit-test
-
-! TODO: debug 'Memory protection fault at address 6c'
-! get-ctx 1024 "char" malloc-array 1024 0 f password-cb set-default-passwd
-
-[ ] [ get-ctx "password" ascii string>alien set-default-passwd-userdata ] unit-test
-
-! Enter PEM pass phrase: password
-[ ] [ get-ctx "extra/openssl/test/server.pem" resource-path
-SSL_FILETYPE_PEM use-private-key ] unit-test
-
-[ ] [ get-ctx "extra/openssl/test/root.pem" resource-path f
-verify-load-locations ] unit-test
-
-[ ] [ get-ctx 1 set-verify-depth ] unit-test
-
-! =========================================================
-! Load Diffie-Hellman parameters
-! =========================================================
-
-[ ] [ "extra/openssl/test/dh1024.pem" resource-path "r" bio-new-file ] unit-test
-
-[ ] [ get-bio f f f read-pem-dh-params ] unit-test
-
-[ ] [ get-bio bio-free ] unit-test
-
-! TODO: debug SSL_CTX_set_tmp_dh 'No such symbol'
-[ ] [ get-ctx get-dh set-tmp-dh-callback ] unit-test
-
-! Workaround (this function should never be called directly)
-! [ ] [ get-ctx SSL_CTRL_SET_TMP_DH 0 get-dh set-ctx-ctrl ] unit-test
-
-! =========================================================
-! Generate ephemeral RSA key
-! =========================================================
-
-[ ] [ 512 RSA_F4 f f generate-rsa-key ] unit-test
-
-! TODO: debug SSL_CTX_set_tmp_rsa 'No such symbol'
-! get-ctx get-rsa set-tmp-rsa-callback
-
-! Workaround (this function should never be called directly)
-[ ] [ get-ctx SSL_CTRL_SET_TMP_RSA 0 get-rsa set-ctx-ctrl ] unit-test
-
-[ ] [ get-rsa free-rsa ] unit-test
-
-! =========================================================
-! Listen and accept on socket
-! =========================================================
-
-! SYMBOL: sock
-! SYMBOL: fdset
-! SYMBOL: acset
-! SYMBOL: sbio
-! SYMBOL: ssl
-! 
-! : is-set ( seq -- newseq )
-!     <enum> >alist [ nip ] assoc-subset >hashtable keys ;
-! 
-! ! 1234 server-socket sock set
-! "127.0.0.1" 1234 <inet4> SOCK_STREAM server-fd sock set
-! 
-! FD_SETSIZE 8 * <bit-array> fdset set
-! 
-! FD_SETSIZE 8 * <bit-array> t 8 rot [ set-nth ] keep fdset set
-! 
-! fdset get is-set .
-
-! : loop ( -- )
-!     sock get f f accept
-!     dup -1 = [ drop ] [
-!         dup number>string print flush
-!         ! BIO_NOCLOSE bio-new-socket sbio set
-!         [ get-ctx new-ssl ssl set ] keep
-!         ssl get swap set-ssl-fd
-!         ! ssl get sbio get dup set-ssl-bio
-!         ! ssl get ssl-accept
-!         ! dup 0 <= [ 
-!         !     ssl get swap ssl-get-error 
-!         ! ] [ drop ] if
-!     ] if
-!     loop ;
-
-! { } acset set
-! 
-! : loop ( -- )
-!     ! FD_SETSIZE fdset get f f f select . flush
-!     FD_SETSIZE fdset get f f 10000 make-timeval select 
-!     0 <= [ acset get [ close ] each "timeout" print ] [
-!         fdset get is-set sock get swap member? [ 
-!              sock get f f accept dup . flush 
-!              acset get swap add acset set
-!     ] [ ] if
-!         loop
-!     ] if ;
-! 
-! loop
-! 
-! sock get close
-
-! =========================================================
-! Dump errors to file
-! =========================================================
-
-[ ] [ "extra/openssl/test/errors.txt" resource-path "w" bio-new-file ] unit-test
-
-[ 6 ] [ get-bio "Hello\n" bio-print ] unit-test
-
-[ ] [ get-bio bio-free ] unit-test
-
-! =========================================================
-! Clean-up
-! =========================================================
-
-! sock get close
-
-get-ctx destroy-ctx
diff --git a/extra/openssl/openssl.factor b/extra/openssl/openssl.factor
deleted file mode 100755 (executable)
index 9b23774..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-! Copyright (C) 2007 Elie CHAFTARI
-! See http://factorcode.org/license.txt for BSD license.
-!
-! Tested with OpenSSL 0.9.8a_0 on Mac OS X 10.4.9 PowerPC
-
-USING: alien alien.c-types alien.strings assocs kernel libc
-namespaces openssl.libcrypto openssl.libssl sequences
-io.encodings.ascii ;
-
-IN: openssl
-
-SYMBOL: bio
-SYMBOL: ssl-bio
-
-SYMBOL: ctx
-SYMBOL: dh
-SYMBOL: rsa
-
-! =========================================================
-! Callback routines
-! =========================================================
-
-: password-cb ( -- alien )
-    "int" { "char*" "int" "int" "void*" } "cdecl"
-    [ 3drop "password" ascii string>alien 1023 memcpy
-    "password" length ] alien-callback ;
-
-! =========================================================
-! Error-handling routines
-! =========================================================
-
-: get-error ( -- num )
-    ERR_get_error ;
-
-: error-string ( num -- str )
-    f ERR_error_string ;
-
-: check-result ( result -- )
-    1 = [  ] [
-        get-error error-string throw
-    ] if ;
-
-: ssl-get-error ( ssl ret -- )
-    SSL_get_error error-messages at throw ;
-
-! Write errors to a file
-: bio-new-file ( path mode -- )
-    BIO_new_file bio set ;
-
-: bio-print ( bio str -- n )
-    BIO_printf ;
-
-: bio-free ( bio -- )
-    BIO_free check-result ;
-
-! =========================================================
-! Initialization routines
-! =========================================================
-
-: init ( -- )
-    SSL_library_init drop ; ! always returns 1
-
-: load-error-strings ( -- )
-    SSL_load_error_strings ;
-
-: ssl-v23 ( -- method )
-    SSLv23_method ;
-
-: new-ctx ( method -- )
-    SSL_CTX_new ctx set ;
-
-: use-cert-chain ( ctx file -- )
-    SSL_CTX_use_certificate_chain_file check-result ;
-
-: set-default-passwd ( ctx cb -- )
-    SSL_CTX_set_default_passwd_cb ;
-
-: set-default-passwd-userdata ( ctx passwd -- )
-    SSL_CTX_set_default_passwd_cb_userdata ;
-
-: use-private-key ( ctx file type -- )
-    SSL_CTX_use_PrivateKey_file check-result ;
-
-: verify-load-locations ( ctx file path -- )
-    SSL_CTX_load_verify_locations check-result ;
-
-: set-verify-depth ( ctx depth -- )
-    SSL_CTX_set_verify_depth ;
-
-: read-pem-dh-params ( bio x cb u -- )
-    PEM_read_bio_DHparams dh set ;
-
-: set-tmp-dh-callback ( ctx dh -- )
-    SSL_CTX_set_tmp_dh_callback ;
-
-: set-ctx-ctrl ( ctx cmd larg parg -- )
-    SSL_CTX_ctrl check-result ;
-
-: generate-rsa-key ( n e cb cbarg -- )
-    RSA_generate_key rsa set ;
-
-: set-tmp-rsa-callback ( ctx rsa -- )
-    SSL_CTX_set_tmp_rsa_callback ;
-
-: free-rsa ( rsa -- )
-    RSA_free ;
-
-: bio-new-socket ( fd flag -- sbio )
-    BIO_new_socket ;
-
-: new-ssl ( ctx -- ssl )
-    SSL_new ;
-
-: set-ssl-bio ( ssl bio bio -- )
-    SSL_set_bio ;
-
-: set-ssl-fd ( ssl fd -- )
-    SSL_set_fd check-result ;
-
-: ssl-accept ( ssl -- result )
-    SSL_accept ;
-
-! =========================================================
-! Clean-up and termination routines
-! =========================================================
-
-: destroy-ctx ( ctx -- )
-    SSL_CTX_free ;
-
-! =========================================================
-! Public routines
-! =========================================================
-
-: get-bio ( -- bio )
-    bio get ;
-
-: get-ssl-bio ( -- bio )
-    ssl-bio get ;
-
-: get-ctx ( -- ctx )
-    ctx get ;
-
-: get-dh ( -- dh )
-    dh get ;
-
-: get-rsa ( -- rsa )
-    rsa get ;
-
-: >md5 ( str -- byte-array )
-    dup length 16 "uchar" <c-array> [ MD5 ] keep nip ;
-
-: >sha1 ( str -- byte-array )
-    dup length 20 "uchar" <c-array> [ SHA1 ] keep nip ;
-
diff --git a/extra/openssl/summary.txt b/extra/openssl/summary.txt
deleted file mode 100755 (executable)
index 42db29f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-OpenSSL binding
diff --git a/extra/openssl/tags.txt b/extra/openssl/tags.txt
deleted file mode 100644 (file)
index 93e252c..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-enterprise
-network
-bindings
diff --git a/extra/openssl/test/dh1024.pem b/extra/openssl/test/dh1024.pem
deleted file mode 100644 (file)
index aa68d98..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
------BEGIN DH PARAMETERS-----
-MIGHAoGBANmAnfkETuKHOCWaE+W+F3kM/e7z5A8hZb7OqwGMQrUOaBEAr4BWeZBn
-G/87hhwZgNP69/KUchm714qd/PpOspCaUJ20x6PcmKujpAgca/f19HGMBjRawQMk
-R9oaBwazuQT0l0rTTKmvpMEcrQQIcVWii3CZI56I56oqF8biGPD7AgEC
------END DH PARAMETERS-----
diff --git a/extra/openssl/test/errors.txt b/extra/openssl/test/errors.txt
deleted file mode 100644 (file)
index e965047..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Hello
diff --git a/extra/openssl/test/root.pem b/extra/openssl/test/root.pem
deleted file mode 100644 (file)
index db0c59f..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICIjCCAYugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJVUzET
-MBEGA1UEChMKUlRGTSwgSW5jLjEZMBcGA1UECxMQV2lkZ2V0cyBEaXZpc2lvbjEY
-MBYGA1UEAxMPVGVzdCBDQTIwMDEwNTE3MB4XDTAxMDUxNzE2MDExNFoXDTA2MTIy
-NTE2MDExNFowVzELMAkGA1UEBhMCVVMxEzARBgNVBAoTClJURk0sIEluYy4xGTAX
-BgNVBAsTEFdpZGdldHMgRGl2aXNpb24xGDAWBgNVBAMTD1Rlc3QgQ0EyMDAxMDUx
-NzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmkX40warmH0+lnwD9YjsJhRz
-ZX6qXadFry0y2trZ6gMs8Mv33IKPwOu8TE7V+3PESEtjI2wr8juV9OkbIPOm+td5
-M8+6vXyIW+JBo3ch99i0QMTf5/jTgsW+3IjV8yEdiGcZFp2NWKLRvZPq2VRbuF7R
-1pvgcaRuBJ0wGOohwnsCAwEAATANBgkqhkiG9w0BAQQFAAOBgQCUB8zMKIlX5io8
-TalbzH9Qke7BcvFAL+wp/5w1ToVsWkNrINSWKv6bl/jcqOD3aPhK7qhaeOU8ZWKL
-PoPPCnRl9Wo+1JtsOO3qIgJP79Bl9ooLGahixF2v/gea5qNISjQvwYllLSa//APP
-6kXHngO0RIRbiTBYHSkAzm6hDdsvVA==
------END CERTIFICATE-----
diff --git a/extra/openssl/test/server.pem b/extra/openssl/test/server.pem
deleted file mode 100644 (file)
index 87376db..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-Proc-Type: 4,ENCRYPTED
-DEK-Info: DES-EDE3-CBC,5772A2A7BE34B611
-
-1yJ+xAn4MudcIfXXy7ElYngJ9EohIh8yvcyVLmE4kVd0xeaL/Bqhvk25BjYCK5d9
-k1K8cjgnKEBjbC++0xtJxFSbUhwoKTLwn+sBoJDcFzMKkmJXXDbSTOaNr1sVwiAR
-SnB4lhUcHguYoV5zlRJn53ft7t1mjB6RwGH+d1Zx6t95OqM1lnKqwekwmotVAWHj
-ncu3N8qhmoPMppmzEv0fOo2/pK2WohcJykSeN5zBrZCUxoO0NBNEZkFUcVjR+KsA
-1ZeI1mU60szqg+AoU/XtFcow8RtG1QZKQbbXzyfbwaG+6LqkHaWYKHQEI1546yWK
-us1HJ734uUkZoyyyazG6PiGCYV2u/aY0i3qdmyDqTvmVIvve7E4glBrtDS9h7D40
-nPShIvOatoPzIK4Y0QSvrI3G1vTsIZT3IOZto4AWuOkLNfYS2ce7prOreF0KjhV0
-3tggw9pHdDmTjHTiIkXqheZxZ7TVu+pddZW+CuB62I8lCBGPW7os1f21e3eOD/oY
-YPCI44aJvgP+zUORuZBWqaSJ0AAIuVW9S83Yzkz/tlSFHViOebyd8Cug4TlxK1VI
-q6hbSafh4C8ma7YzlvqjMzqFifcIolcbx+1A6ot0UiayJTUra4d6Uc4Rbc9RIiG0
-jfDWC6aii9YkAgRl9WqSd31yASge/HDqVXFwR48qdlYQ57rcHviqxyrwRDnfw/lX
-Mf6LPiDKEco4MKej7SR2kK2c2AgxUzpGZeAY6ePyhxbdhA0eY21nDeFd/RbwSc5s
-eTiCCMr41OB4hfBFXKDKqsM3K7klhoz6D5WsgE6u3lDoTdz76xOSTg==
------END RSA PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIICGDCCAYECAgEBMA0GCSqGSIb3DQEBBAUAMFcxCzAJBgNVBAYTAlVTMRMwEQYD
-VQQKEwpSVEZNLCBJbmMuMRkwFwYDVQQLExBXaWRnZXRzIERpdmlzaW9uMRgwFgYD
-VQQDEw9UZXN0IENBMjAwMTA1MTcwHhcNMDEwNTE3MTYxMDU5WhcNMDQwMzA2MTYx
-MDU5WjBRMQswCQYDVQQGEwJVUzETMBEGA1UEChMKUlRGTSwgSW5jLjEZMBcGA1UE
-CxMQV2lkZ2V0cyBEaXZpc2lvbjESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqG
-SIb3DQEBAQUAA4GNADCBiQKBgQCiWhMjNOPlPLNW4DJFBiL2fFEIkHuRor0pKw25
-J0ZYHW93lHQ4yxA6afQr99ayRjMY0D26pH41f0qjDgO4OXskBsaYOFzapSZtQMbT
-97OCZ7aHtK8z0ZGNW/cslu+1oOLomgRxJomIFgW1RyUUkQP1n0hemtUdCLOLlO7Q
-CPqZLQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAIumUwl1OoWuyN2xfoBHYAs+lRLY
-KmFLoI5+iMcGxWIsksmA+b0FLRAN43wmhPnums8eXgYbDCrKLv2xWcvKDP3mps7m
-AMivwtu/eFpYz6J8Mo1fsV4Ys08A/uPXkT23jyKo2hMu8mywkqXCXYF2e+7pEeBr
-dsbmkWK5NgoMl8eM
------END CERTIFICATE-----
index 3ae0c94b126a9c3d02a6bd38a9c6aa5e4c14739b..fa35534439c0d3f67bd93c4d700cc87fe0645dfc 100755 (executable)
@@ -38,7 +38,7 @@ M: comment pprint*
         " --" %
         " " over node-out-d values%
         " r: " swap node-out-r values%
-    ] "" make 1 tail ;
+    ] "" make rest ;
 
 MACRO: match-choose ( alist -- )
     [ [ ] curry ] assoc-map [ match-cond ] curry ;
index feaace9808ee0147f7a38472e5825aa750d56cab..70756e81c24b894f5e1e929c14497baeec50edb0 100755 (executable)
@@ -1,14 +1,14 @@
-IN: optimizer.report\r
 USING: assocs words sequences arrays compiler tools.time\r
 io.styles io prettyprint vocabs kernel sorting generator\r
-optimizer math ;\r
+optimizer math math.order ;\r
+IN: optimizer.report\r
 \r
 : count-optimization-passes ( nodes n -- n )\r
     >r optimize-1\r
     [ r> 1+ count-optimization-passes ] [ drop r> ] if ;\r
 \r
 : results\r
-    [ [ second ] swap compose compare ] curry sort 20 tail*\r
+    [ [ second ] prepose compare ] curry sort 20 tail*\r
     print\r
     standard-table-style\r
     [\r
@@ -16,7 +16,7 @@ optimizer math ;
     ] tabular-output ;\r
 \r
 : optimizer-report\r
-    all-words [ compiled? ] subset\r
+    all-words [ compiled? ] filter\r
     [\r
         dup [\r
             word-dataflow nip 1 count-optimization-passes\r
index 510e44d34e5589110b1d0c630075077fcd0af1fb..d58ccbd0f263a1067555bc9a5c12606b368f4164 100755 (executable)
@@ -38,7 +38,7 @@ USING: io io.streams.string kernel namespaces pack strings tools.test ;
 
 [ 2 ] [
     [ 2 "int" b, ] B{ } make
-    <string-reader> [ "int" read-native ] with-stream
+    <string-reader> [ "int" read-native ] with-input-stream
 ] unit-test
 
 [ "FRAM" ] [ "FRAM\0" [ read-c-string ] with-string-reader ] unit-test
index 65912244dd190a45fccbd387b914142e28a33faf..5320583df0e11fa20955ce43a1640ada6c452e51 100755 (executable)
@@ -154,13 +154,12 @@ MACRO: (pack) ( seq str -- quot )
 
 MACRO: (unpack) ( str -- quot )
     [
-        \ <string-reader> ,
         [
             [ unpack-table at , \ , , ] each
         ] [ ] make
         1quotation [ { } make ] append
         1quotation %
-        \ with-stream ,
+        \ with-string-reader ,
     ] [ ] make ;
 
 : unpack-native ( seq str -- seq )
index 40620295c6d344b3c86d0108636ee880aef68794..9537a0c88c7d4cb5afb9e389de2c1dab83d025c9 100755 (executable)
@@ -177,7 +177,7 @@ M: or-parser parse ( input parser1 -- list )
     #! Return a new string without any leading whitespace
     #! from the original string.
     dup empty? [
-        dup first blank? [ 1 tail-slice left-trim-slice ] when
+        dup first blank? [ rest-slice left-trim-slice ] when
     ] unless ;
 
 TUPLE: sp-parser p1 ;
@@ -200,7 +200,7 @@ M: just-parser parse ( input parser -- result )
     #! from the results anything where the remaining
     #! input to be parsed is not empty. So ensures a
     #! fully parsed input string.
-    just-parser-p1 parse [ parse-result-unparsed empty? ] lsubset ;
+    just-parser-p1 parse [ parse-result-unparsed empty? ] lfilter ;
 
 TUPLE: apply-parser p1 quot ;
 
index 0292a88ad9e24d11614eeb7e5529364139139d45..faaa63f4bd9d1c4a0bac9bc7c9014f2f6867618d 100644 (file)
@@ -1,15 +1,16 @@
 ! Copyright (C) 2007 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
 !
-USING: kernel tools.test peg peg.ebnf words math math.parser sequences ;
+USING: kernel tools.test peg peg.ebnf words math math.parser 
+       sequences accessors ;
 IN: peg.ebnf.tests
 
 { T{ ebnf-non-terminal f "abc" } } [
-  "abc" 'non-terminal' parse parse-result-ast 
+  "abc" 'non-terminal' parse ast>> 
 ] unit-test
 
 { T{ ebnf-terminal f "55" } } [
-  "'55'" 'terminal' parse parse-result-ast 
+  "'55'" 'terminal' parse ast>> 
 ] unit-test
 
 {
@@ -20,7 +21,7 @@ IN: peg.ebnf.tests
      }
   } 
 } [
-  "digit = '1' | '2'" 'rule' parse parse-result-ast
+  "digit = '1' | '2'" 'rule' parse ast>>
 ] unit-test
 
 {
@@ -31,7 +32,7 @@ IN: peg.ebnf.tests
      }
   }   
 } [
-  "digit = '1' '2'" 'rule' parse parse-result-ast
+  "digit = '1' '2'" 'rule' parse ast>>
 ] unit-test
 
 {
@@ -44,20 +45,22 @@ IN: peg.ebnf.tests
      }
   } 
 } [
-  "one two | three" 'choice' parse parse-result-ast
+  "one two | three" 'choice' parse ast>>
 ] unit-test
 
 {
   T{ ebnf-sequence f
      V{ 
        T{ ebnf-non-terminal f "one" }
-       T{ ebnf-choice f
-          V{ T{ ebnf-non-terminal f "two" } T{ ebnf-non-terminal f "three" } }
+       T{ ebnf-whitespace f
+         T{ ebnf-choice f
+            V{ T{ ebnf-non-terminal f "two" } T{ ebnf-non-terminal f "three" } }
+         }
        }
      }
   } 
 } [
-  "one (two | three)" 'choice' parse parse-result-ast
+  "one {two | three}" 'choice' parse ast>>
 ] unit-test
 
 {
@@ -77,7 +80,7 @@ IN: peg.ebnf.tests
      }
   } 
 } [
-  "one ((two | three) four)*" 'choice' parse parse-result-ast
+  "one ((two | three) four)*" 'choice' parse ast>>
 ] unit-test
 
 {
@@ -89,43 +92,43 @@ IN: peg.ebnf.tests
      }
   } 
 } [
-  "one ( two )? three" 'choice' parse parse-result-ast
+  "one ( two )? three" 'choice' parse ast>>
 ] unit-test
 
 { "foo" } [
-  "\"foo\"" 'identifier' parse parse-result-ast
+  "\"foo\"" 'identifier' parse ast>>
 ] unit-test
 
 { "foo" } [
-  "'foo'" 'identifier' parse parse-result-ast
+  "'foo'" 'identifier' parse ast>>
 ] unit-test
 
 { "foo" } [
-  "foo" 'non-terminal' parse parse-result-ast ebnf-non-terminal-symbol
+  "foo" 'non-terminal' parse ast>> ebnf-non-terminal-symbol
 ] unit-test
 
 { "foo" } [
-  "foo]" 'non-terminal' parse parse-result-ast ebnf-non-terminal-symbol
+  "foo]" 'non-terminal' parse ast>> ebnf-non-terminal-symbol
 ] unit-test
 
 { V{ "a" "b" } } [
-  "ab" [EBNF foo='a' 'b' EBNF] call parse-result-ast 
+  "ab" [EBNF foo='a' 'b' EBNF] call ast>> 
 ] unit-test
 
 { V{ 1 "b" } } [
-  "ab" [EBNF foo=('a')[[ drop 1 ]] 'b' EBNF] call parse-result-ast 
+  "ab" [EBNF foo=('a')[[ drop 1 ]] 'b' EBNF] call ast>> 
 ] unit-test
 
 { V{ 1 2 } } [
-  "ab" [EBNF foo=('a') [[ drop 1 ]] ('b') [[ drop 2 ]] EBNF] call parse-result-ast 
+  "ab" [EBNF foo=('a') [[ drop 1 ]] ('b') [[ drop 2 ]] EBNF] call ast>> 
 ] unit-test
 
 { CHAR: A } [
-  "A" [EBNF foo=[A-Z] EBNF] call parse-result-ast 
+  "A" [EBNF foo=[A-Z] EBNF] call ast>> 
 ] unit-test
 
 { CHAR: Z } [
-  "Z" [EBNF foo=[A-Z] EBNF] call parse-result-ast 
+  "Z" [EBNF foo=[A-Z] EBNF] call ast>> 
 ] unit-test
 
 { f } [
@@ -133,7 +136,7 @@ IN: peg.ebnf.tests
 ] unit-test
 
 { CHAR: 0 } [
-  "0" [EBNF foo=[^A-Z] EBNF] call parse-result-ast 
+  "0" [EBNF foo=[^A-Z] EBNF] call ast>> 
 ] unit-test
 
 { f } [
@@ -145,31 +148,31 @@ IN: peg.ebnf.tests
 ] unit-test
 
 { V{ "1" "+" "foo" } } [
-  "1+1" [EBNF foo='1' '+' '1' [[ drop "foo" ]] EBNF] call parse-result-ast
+  "1+1" [EBNF foo='1' '+' '1' [[ drop "foo" ]] EBNF] call ast>>
 ] unit-test
 
 { "foo" } [
-  "1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] EBNF] call parse-result-ast
+  "1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] EBNF] call ast>>
 ] unit-test
 
 { "foo" } [
-  "1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF] call parse-result-ast
+  "1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF] call ast>>
 ] unit-test
 
 { "bar" } [
-  "1-1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF] call parse-result-ast
+  "1-1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF] call ast>>
 ] unit-test
 
 { 6 } [
-  "4+2" [EBNF num=[0-9] => [[ digit> ]] foo=num:x '+' num:y => [[ drop x y + ]] EBNF] call parse-result-ast
+  "4+2" [EBNF num=[0-9] => [[ digit> ]] foo=num:x '+' num:y => [[ drop x y + ]] EBNF] call ast>>
 ] unit-test
 
 { 6 } [
-  "4+2" [EBNF foo=[0-9]:x '+' [0-9]:y => [[ drop x digit> y digit> + ]] EBNF] call parse-result-ast
+  "4+2" [EBNF foo=[0-9]:x '+' [0-9]:y => [[ drop x digit> y digit> + ]] EBNF] call ast>>
 ] unit-test
 
 { 10 } [
-  { 1 2 3 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ drop x y + ]] | num EBNF] call parse-result-ast
+  { 1 2 3 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ drop x y + ]] | num EBNF] call ast>>
 ] unit-test
 
 { f } [
@@ -177,7 +180,7 @@ IN: peg.ebnf.tests
 ] unit-test
 
 { 3 } [
-  { 1 2 "a" 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ drop x y + ]] | num EBNF] call parse-result-ast
+  { 1 2 "a" 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ drop x y + ]] | num EBNF] call ast>>
 ] unit-test
 
 { f } [
@@ -185,44 +188,44 @@ IN: peg.ebnf.tests
 ] unit-test
 
 { V{ "a" " " "b" } } [
-  "a b" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call parse-result-ast
+  "a b" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call ast>>
 ] unit-test
 
 { V{ "a" "\t" "b" } } [
-  "a\tb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call parse-result-ast 
+  "a\tb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call ast>> 
 ] unit-test
 
 { V{ "a" "\n" "b" } } [
-  "a\nb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call parse-result-ast
+  "a\nb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call ast>>
 ] unit-test
 
 { V{ "a" f "b" } } [
-  "ab" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call parse-result-ast
+  "ab" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call ast>>
 ] unit-test
 
 { V{ "a" " " "b" } } [
-  "a b" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call parse-result-ast
+  "a b" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call ast>>
 ] unit-test
 
 
 { V{ "a" "\t" "b" } } [
-  "a\tb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call parse-result-ast
+  "a\tb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call ast>>
 ] unit-test
 
 { V{ "a" "\n" "b" } } [
-  "a\nb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call parse-result-ast
+  "a\nb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call ast>>
 ] unit-test
 
 { V{ "a" "b" } } [
-  "ab" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call parse-result-ast
+  "ab" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call ast>>
 ] unit-test
 
 { V{ "a" "b" } } [
-  "a\tb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call parse-result-ast
+  "a\tb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call ast>>
 ] unit-test
 
 { V{ "a" "b" } } [
-  "a\nb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call parse-result-ast
+  "a\nb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call ast>>
 ] unit-test
 
 { f } [
@@ -232,19 +235,19 @@ IN: peg.ebnf.tests
 { V{ V{ 49 } "+" V{ 49 } } } [ 
   #! Test direct left recursion. 
   #! Using packrat, so first part of expr fails, causing 2nd choice to be used  
-  "1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] call parse-result-ast
+  "1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] call ast>>
 ] unit-test
 
 { V{ V{ V{ 49 } "+" V{ 49 } } "+" V{ 49 } } } [ 
   #! Test direct left recursion. 
   #! Using packrat, so first part of expr fails, causing 2nd choice to be used  
-  "1+1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] call parse-result-ast
+  "1+1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] call ast>>
 ] unit-test
 
 { V{ V{ V{ 49 } "+" V{ 49 } } "+" V{ 49 } } } [ 
   #! Test indirect left recursion. 
   #! Using packrat, so first part of expr fails, causing 2nd choice to be used  
-  "1+1+1" [EBNF num=([0-9])+ x=expr expr=x "+" num | num EBNF] call parse-result-ast
+  "1+1+1" [EBNF num=([0-9])+ x=expr expr=x "+" num | num EBNF] call ast>>
 ] unit-test
 
 { t } [
@@ -277,23 +280,88 @@ main = Primary
 ;EBNF 
 
 { "this" } [
-  "this" primary parse-result-ast
+  "this" primary ast>>
 ] unit-test
 
 { V{ "this" "." "x" } } [
-  "this.x" primary parse-result-ast
+  "this.x" primary ast>>
 ] unit-test
 
 { V{ V{ "this" "." "x" } "." "y" } } [
-  "this.x.y" primary parse-result-ast
+  "this.x.y" primary ast>>
 ] unit-test
 
 { V{ V{ "this" "." "x" } "." "m" "(" ")" } } [
-  "this.x.m()" primary parse-result-ast
+  "this.x.m()" primary ast>>
 ] unit-test
 
 { V{ V{ V{ "x" "[" "i" "]" } "[" "j" "]" } "." "y" } } [
-  "x[i][j].y" primary parse-result-ast
+  "x[i][j].y" primary ast>>
 ] unit-test
 
 'ebnf' compile must-infer
+
+{ V{ V{ "a" "b" } "c" } } [
+  "abc" [EBNF a="a" "b" foo=(a "c") EBNF] call ast>>
+] unit-test
+
+{ V{ V{ "a" "b" } "c" } } [
+  "abc" [EBNF a="a" "b" foo={a "c"} EBNF] call ast>>
+] unit-test
+
+{ V{ V{ "a" "b" } "c" } } [
+  "abc" [EBNF a="a" "b" foo=a "c" EBNF] call ast>>
+] unit-test
+
+{ f } [
+  "a bc" [EBNF a="a" "b" foo=(a "c") EBNF] call 
+] unit-test
+
+{ f } [
+  "a bc" [EBNF a="a" "b" foo=a "c" EBNF] call 
+] unit-test
+
+{ f } [
+  "a bc" [EBNF a="a" "b" foo={a "c"} EBNF] call
+] unit-test
+
+{ f } [
+  "ab c" [EBNF a="a" "b" foo=a "c" EBNF] call 
+] unit-test
+
+{ V{ V{ "a" "b" } "c" } } [
+  "ab c" [EBNF a="a" "b" foo={a "c"} EBNF] call ast>>
+] unit-test
+
+{ f } [
+  "ab c" [EBNF a="a" "b" foo=(a "c") EBNF] call 
+] unit-test
+
+{ f } [
+  "a b c" [EBNF a="a" "b" foo=a "c" EBNF] call 
+] unit-test
+
+{ f } [
+  "a b c" [EBNF a="a" "b" foo=(a "c") EBNF] call 
+] unit-test
+
+{ f } [
+  "a b c" [EBNF a="a" "b" foo={a "c"} EBNF] call 
+] unit-test
+
+{ V{ V{ V{ "a" "b" } "c" } V{ V{ "a" "b" } "c" } } } [
+  "ab cab c" [EBNF a="a" "b" foo={a "c"}* EBNF] call ast>>
+] unit-test
+
+{ V{ } } [
+  "ab cab c" [EBNF a="a" "b" foo=(a "c")* EBNF] call ast>>
+] unit-test
+
+{ V{ V{ V{ "a" "b" } "c" } V{ V{ "a" "b" } "c" } } } [
+  "ab c ab c" [EBNF a="a" "b" foo={a "c"}* EBNF] call ast>>
+] unit-test
+
+{ V{ } } [
+  "ab c ab c" [EBNF a="a" "b" foo=(a "c")* EBNF] call ast>>
+] unit-test
+
index 8bf0475da54d4b3098040e0eed905fa4d6f6b388..c3252de5006bb2da5db90ab974236b32e7812c12 100644 (file)
@@ -17,6 +17,7 @@ TUPLE: ebnf-sequence elements ;
 TUPLE: ebnf-repeat0 group ;\r
 TUPLE: ebnf-repeat1 group ;\r
 TUPLE: ebnf-optional group ;\r
+TUPLE: ebnf-whitespace group ;\r
 TUPLE: ebnf-rule symbol elements ;\r
 TUPLE: ebnf-action parser code ;\r
 TUPLE: ebnf-var parser name ;\r
@@ -34,6 +35,7 @@ C: <ebnf-sequence> ebnf-sequence
 C: <ebnf-repeat0> ebnf-repeat0\r
 C: <ebnf-repeat1> ebnf-repeat1\r
 C: <ebnf-optional> ebnf-optional\r
+C: <ebnf-whitespace> ebnf-whitespace\r
 C: <ebnf-rule> ebnf-rule\r
 C: <ebnf-action> ebnf-action\r
 C: <ebnf-var> ebnf-var\r
@@ -84,6 +86,7 @@ C: <ebnf> ebnf
       [ dup CHAR: + = ]\r
       [ dup CHAR: ? = ]\r
       [ dup CHAR: : = ]\r
+      [ dup CHAR: ~ = ]\r
     } || not nip    \r
   ] satisfy repeat1 [ >string <ebnf-non-terminal> ] action ;\r
 \r
@@ -134,9 +137,15 @@ DEFER: 'choice'
   #! Parse a group of choices, with a suffix indicating\r
   #! the type of group (repeat0, repeat1, etc) and\r
   #! an quot that is the action that produces the AST.\r
-  "(" [ 'choice' sp ] delay ")" syntax-pack \r
-  swap 2seq  \r
-  [ first ] rot compose action ;\r
+  2dup\r
+  [\r
+    "(" [ 'choice' sp ] delay ")" syntax-pack \r
+    swap 2seq  \r
+    [ first ] rot compose action ,\r
+    "{" [ 'choice' sp ] delay "}" syntax-pack \r
+    swap 2seq  \r
+    [ first <ebnf-whitespace> ] rot compose action ,\r
+  ] choice* ;\r
   \r
 : 'group' ( -- parser )\r
   #! A grouping with no suffix. Used for precedence.\r
@@ -238,9 +247,15 @@ GENERIC: (transform) ( ast -- parser )
 \r
 SYMBOL: parser\r
 SYMBOL: main\r
+SYMBOL: ignore-ws\r
 \r
 : transform ( ast -- object )\r
-  H{ } clone dup dup [ parser set swap (transform) main set ] bind ;\r
+  H{ } clone dup dup [ \r
+    f ignore-ws set \r
+    parser set \r
+    swap (transform) \r
+    main set \r
+  ] bind ;\r
 \r
 M: ebnf (transform) ( ast -- parser )\r
   rules>> [ (transform) ] map peek ;\r
@@ -252,7 +267,13 @@ M: ebnf-rule (transform) ( ast -- parser )
   ] keep ;\r
 \r
 M: ebnf-sequence (transform) ( ast -- parser )\r
-  elements>> [ (transform) ] map seq [ dup length 1 = [ first ] when ] action ;\r
+  #! If ignore-ws is set then each element of the sequence\r
+  #! ignores leading whitespace. This is not inherited by\r
+  #! subelements of the sequence.\r
+  elements>> [ \r
+    f ignore-ws [ (transform) ] with-variable\r
+    ignore-ws get [ sp ] when\r
+  ] map seq [ dup length 1 = [ first ] when ] action ;\r
 \r
 M: ebnf-choice (transform) ( ast -- parser )\r
   options>> [ (transform) ] map choice ;\r
@@ -282,10 +303,13 @@ M: ebnf-repeat1 (transform) ( ast -- parser )
 M: ebnf-optional (transform) ( ast -- parser )\r
   transform-group optional ;\r
 \r
+M: ebnf-whitespace (transform) ( ast -- parser )\r
+  t ignore-ws [ transform-group ] with-variable ;\r
+\r
 GENERIC: build-locals ( code ast -- code )\r
 \r
 M: ebnf-sequence build-locals ( code ast -- code )\r
-  elements>> dup [ ebnf-var? ] subset empty? [\r
+  elements>> dup [ ebnf-var? ] filter empty? [\r
     drop \r
   ] [ \r
     [\r
@@ -300,7 +324,7 @@ M: ebnf-sequence build-locals ( code ast -- code )
         ] 2each\r
         " | " %\r
         %  \r
-        " ] with-locals" %     \r
+        " ]" %     \r
     ] "" make \r
   ] if ;\r
 \r
@@ -310,7 +334,7 @@ M: ebnf-var build-locals ( code ast -- )
     name>> % " [ dup ] " %\r
     " | " %\r
     %  \r
-    " ] with-locals" %     \r
+    " ]" %     \r
   ] "" make ;\r
 \r
 M: object build-locals ( code ast -- )\r
index e16d9db0a7827178071b77eb50c96c9f02d23069..e2df60ea9a9da7940eeb580c63aea2e84bae4000 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel arrays strings math.parser sequences
-peg peg.ebnf peg.parsers memoize math ;
+peg peg.ebnf peg.parsers memoize math accessors ;
 IN: peg.expr
 
 EBNF: expr 
@@ -20,5 +20,5 @@ exp      =   exp "+" fac    => [[ first3 nip + ]]
 ;EBNF
 
 : eval-expr ( string -- number )
-  expr parse-result-ast ;
+  expr ast>> ;
 
index da7f678f2d76e13f85731c23529597e0bd547556..784e6c064ce1861c02cf03c5839572c9c7653a4d 100755 (executable)
@@ -107,7 +107,7 @@ MEMO: pack ( begin body end -- parser )
   #! range of characters from the first to the second,
   #! inclusive.
   dup first CHAR: ^ = [
-    1 tail (range-pattern) [ member? not ] curry satisfy 
+    rest (range-pattern) [ member? not ] curry satisfy 
   ] [
     (range-pattern) [ member? ] curry satisfy
   ] if ;
index fcec33f7c238440b903ea27d681903b79161b0fd..1beeb51678e174aa79f4bc871a9694c9c1b04916 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2007 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
 !
-USING: kernel tools.test strings namespaces arrays sequences peg peg.private accessors words math ;
+USING: kernel tools.test strings namespaces arrays sequences 
+       peg peg.private accessors words math accessors ;
 IN: peg.tests
 
 { f } [
@@ -10,7 +11,7 @@ IN: peg.tests
 
 { "begin" "end" } [
   "beginend" "begin" token parse 
-  { parse-result-ast parse-result-remaining } get-slots
+  { ast>> remaining>> } get-slots
   >string
 ] unit-test
 
@@ -23,11 +24,11 @@ IN: peg.tests
 ] unit-test
 
 { CHAR: a } [
-  "abcd" CHAR: a CHAR: z range parse parse-result-ast
+  "abcd" CHAR: a CHAR: z range parse ast>>
 ] unit-test
 
 { CHAR: z } [
-  "zbcd" CHAR: a CHAR: z range parse parse-result-ast
+  "zbcd" CHAR: a CHAR: z range parse ast>>
 ] unit-test
 
 { f } [
@@ -35,15 +36,15 @@ IN: peg.tests
 ] unit-test
 
 { V{ "g" "o" } } [
-  "good" "g" token "o" token 2array seq parse parse-result-ast
+  "good" "g" token "o" token 2array seq parse ast>>
 ] unit-test
 
 { "a" } [
-  "abcd" "a" token "b" token 2array choice parse parse-result-ast
+  "abcd" "a" token "b" token 2array choice parse ast>>
 ] unit-test
 
 { "b" } [
-  "bbcd" "a" token "b" token 2array choice parse parse-result-ast
+  "bbcd" "a" token "b" token 2array choice parse ast>>
 ] unit-test
 
 { f } [
@@ -55,15 +56,15 @@ IN: peg.tests
 ] unit-test
 
 { 0 } [
-  "" "a" token repeat0 parse parse-result-ast length
+  "" "a" token repeat0 parse ast>> length
 ] unit-test
 
 { 0 } [
-  "b" "a" token repeat0 parse parse-result-ast length
+  "b" "a" token repeat0 parse ast>> length
 ] unit-test
 
 { V{ "a" "a" "a" } } [
-  "aaab" "a" token repeat0 parse parse-result-ast 
+  "aaab" "a" token repeat0 parse ast>> 
 ] unit-test
 
 { f } [
@@ -75,15 +76,15 @@ IN: peg.tests
 ] unit-test
 
 { V{ "a" "a" "a" } } [
-  "aaab" "a" token repeat1 parse parse-result-ast
+  "aaab" "a" token repeat1 parse ast>>
 ] unit-test
 
 { V{ "a" "b" } } [ 
-  "ab" "a" token optional "b" token 2array seq parse parse-result-ast 
+  "ab" "a" token optional "b" token 2array seq parse ast>> 
 ] unit-test
 
 { V{ f "b" } } [ 
-  "b" "a" token optional "b" token 2array seq parse parse-result-ast 
+  "b" "a" token optional "b" token 2array seq parse ast>> 
 ] unit-test
 
 { f } [ 
@@ -91,7 +92,7 @@ IN: peg.tests
 ] unit-test
 
 { V{ CHAR: a CHAR: b } } [
-  "ab" "a" token ensure CHAR: a CHAR: z range dup 3array seq parse parse-result-ast
+  "ab" "a" token ensure CHAR: a CHAR: z range dup 3array seq parse ast>>
 ] unit-test
 
 { f } [
@@ -123,11 +124,11 @@ IN: peg.tests
 ] unit-test
 
 { 1 } [
-  "a" "a" token [ drop 1 ] action parse parse-result-ast 
+  "a" "a" token [ drop 1 ] action parse ast>> 
 ] unit-test
 
 { V{ 1 1 } } [
-  "aa" "a" token [ drop 1 ] action dup 2array seq parse parse-result-ast 
+  "aa" "a" token [ drop 1 ] action dup 2array seq parse ast>> 
 ] unit-test
 
 { f } [
@@ -139,19 +140,19 @@ IN: peg.tests
 ] unit-test
 
 { CHAR: a } [ 
-  "a" [ CHAR: a = ] satisfy parse parse-result-ast
+  "a" [ CHAR: a = ] satisfy parse ast>>
 ] unit-test
 
 { "a" } [
-  "    a" "a" token sp parse parse-result-ast
+  "    a" "a" token sp parse ast>>
 ] unit-test
 
 { "a" } [
-  "a" "a" token sp parse parse-result-ast
+  "a" "a" token sp parse ast>>
 ] unit-test
 
 { V{ "a" } } [
-  "[a]" "[" token hide "a" token "]" token hide 3array seq parse parse-result-ast
+  "[a]" "[" token hide "a" token "]" token hide 3array seq parse ast>>
 ] unit-test
 
 { f } [
@@ -164,8 +165,8 @@ IN: peg.tests
     [ "1" token , "-" token , "1" token , ] seq* ,
     [ "1" token , "+" token , "1" token , ] seq* ,
   ] choice* 
-  "1-1" over parse parse-result-ast swap
-  "1+1" swap parse parse-result-ast
+  "1-1" over parse ast>> swap
+  "1+1" swap parse ast>>
 ] unit-test
 
 : expr ( -- parser ) 
@@ -174,7 +175,7 @@ IN: peg.tests
   [ expr ] delay "+" token "1" token 3seq "1" token 2choice ;
 
 { V{ V{ "1" "+" "1" } "+" "1" } } [
-  "1+1+1" expr parse parse-result-ast   
+  "1+1+1" expr parse ast>>   
 ] unit-test
 
 { t } [
@@ -189,6 +190,6 @@ IN: peg.tests
 ] unit-test
 
 { CHAR: B } [
-  "B" [ drop t ] satisfy [ 66 >= ] semantic parse parse-result-ast
+  "B" [ drop t ] satisfy [ 66 >= ] semantic parse ast>>
 ] unit-test
 
index 858d062c68380d02b1f8f4c48f82a3ddb19a52b3..b420574a3b4bba2db88ca268ea0df7707319d237 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007, 2008 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel sequences strings fry namespaces math assocs shuffle 
-       vectors arrays math.parser 
+       vectors arrays math.parser math.order
        unicode.categories compiler.units parser
        words quotations effects memoize accessors locals effects splitting ;
 IN: peg
@@ -448,7 +448,7 @@ M: action-parser (compile) ( parser -- quot )
   #! Return a new string without any leading whitespace
   #! from the original string.
   dup empty? [
-    dup first blank? [ 1 tail-slice left-trim-slice ] when
+    dup first blank? [ rest-slice left-trim-slice ] when
   ] unless ;
 
 TUPLE: sp-parser p1 ;
index 88993c354b85873f17e04cdf2ed7969f8f9d97af..e1d97bdef90afd1dcb68109b8fb4301f590350a0 100644 (file)
@@ -1,43 +1,44 @@
 ! Copyright (C) 2007 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
 !
-USING: kernel tools.test peg peg.ebnf peg.pl0 multiline sequences ;
+USING: kernel tools.test peg peg.ebnf peg.pl0 
+       multiline sequences accessors ;
 IN: peg.pl0.tests
 
 { t } [
-  "CONST foo = 1;" "block" \ pl0 rule parse parse-result-remaining empty? 
+  "CONST foo = 1;" "block" \ pl0 rule parse remaining>> empty? 
 ] unit-test
 
 { t } [
-  "VAR foo;" "block" \ pl0 rule parse parse-result-remaining empty?
+  "VAR foo;" "block" \ pl0 rule parse remaining>> empty?
 ] unit-test
 
 { t } [
-  "VAR foo,bar , baz;" "block" \ pl0 rule parse parse-result-remaining empty? 
+  "VAR foo,bar , baz;" "block" \ pl0 rule parse remaining>> empty? 
 ] unit-test
 
 { t } [
-  "foo := 5" "statement" \ pl0 rule parse parse-result-remaining empty? 
+  "foo := 5" "statement" \ pl0 rule parse remaining>> empty? 
 ] unit-test
 
 { t } [
-  "BEGIN foo := 5 END" "statement" \ pl0 rule parse parse-result-remaining empty? 
+  "BEGIN foo := 5 END" "statement" \ pl0 rule parse remaining>> empty? 
 ] unit-test
 
 { t } [
-  "IF 1=1 THEN foo := 5" "statement" \ pl0 rule parse parse-result-remaining empty? 
+  "IF 1=1 THEN foo := 5" "statement" \ pl0 rule parse remaining>> empty? 
 ] unit-test
 
 { t } [
-  "WHILE 1=1 DO foo := 5" "statement" \ pl0 rule parse parse-result-remaining empty? 
+  "WHILE 1=1 DO foo := 5" "statement" \ pl0 rule parse remaining>> empty? 
 ] unit-test
 
 { t } [
-  "WHILE ODD 1 DO foo := 5" "statement" \ pl0 rule parse parse-result-remaining empty? 
+  "WHILE ODD 1 DO foo := 5" "statement" \ pl0 rule parse remaining>> empty? 
 ] unit-test
 
 { t } [
-  "PROCEDURE square; BEGIN squ:=x*x END" "block" \ pl0 rule parse parse-result-remaining empty? 
+  "PROCEDURE square; BEGIN squ:=x*x END" "block" \ pl0 rule parse remaining>> empty? 
 ] unit-test
 
 { t } [
@@ -57,7 +58,7 @@ BEGIN
       x := x + 1;
    END
 END.
-"> pl0 parse-result-remaining empty?
+"> pl0 remaining>> empty?
 ] unit-test
 
 { f } [
@@ -123,5 +124,5 @@ BEGIN
   y := 36;
   CALL gcd;
 END.
-  "> pl0 parse-result-remaining empty?
+  "> pl0 remaining>> empty?
 ] unit-test
\ No newline at end of file
index 1b97814ca77e83f0b6fddeed80e95ac579f823a4..eff923dc011eba44d708613286efc92679c34e9d 100644 (file)
@@ -7,52 +7,22 @@ IN: peg.pl0
 #! Grammar for PL/0 based on http://en.wikipedia.org/wiki/PL/0
 
 EBNF: pl0 
-_ = (" " | "\t" | "\n")* => [[ drop ignore ]]
 
-BEGIN       = "BEGIN" _
-CALL        = "CALL" _
-CONST       = "CONST" _
-DO          = "DO" _
-END         = "END" _
-IF          = "IF" _
-THEN        = "THEN" _
-ODD         = "ODD" _
-PROCEDURE   = "PROCEDURE" _
-VAR         = "VAR" _
-WHILE       = "WHILE" _
-EQ          = "=" _
-LTEQ        = "<=" _
-LT          = "<" _
-GT          = ">" _
-GTEQ        = ">=" _
-NEQ         = "#" _
-COMMA       = "," _
-SEMICOLON   = ";" _
-ASSIGN      = ":=" _
-
-ADD         = "+" _
-SUBTRACT    = "-" _
-MULTIPLY    = "*" _
-DIVIDE      = "/" _
-
-LPAREN      = "(" _
-RPAREN      = ")" _
-
-block       =  ( CONST ident EQ number ( COMMA ident EQ number )* SEMICOLON )? 
-               ( VAR ident ( COMMA ident )* SEMICOLON )? 
-               ( PROCEDURE ident SEMICOLON ( block SEMICOLON )? )* statement 
-statement   =  (  ident ASSIGN expression 
-                | CALL ident 
-                | BEGIN statement ( SEMICOLON statement )* END 
-                | IF condition THEN statement 
-                | WHILE condition DO statement )?  
-condition   =  ODD expression 
-             | expression (EQ | NEQ | LTEQ | LT | GTEQ | GT) expression
-expression  = (ADD | SUBTRACT)? term ( (ADD | SUBTRACT) term )* _
-term        = factor ( (MULTIPLY | DIVIDE) factor )* 
-factor      = ident | number | LPAREN expression RPAREN
-ident       = (([a-zA-Z])+) _ => [[ >string ]]
+block       =  { "CONST" ident "=" number { "," ident "=" number }* ";" }? 
+               { "VAR" ident { "," ident }* ";" }? 
+               { "PROCEDURE" ident ";" { block ";" }? }* statement 
+statement   =  {  ident ":=" expression 
+                | "CALL" ident 
+                | "BEGIN" statement { ";" statement }* "END" 
+                | "IF" condition "THEN" statement 
+                | "WHILE" condition "DO" statement }?  
+condition   =  { "ODD" expression }
+             | { expression ("=" | "#" | "<=" | "<" | ">=" | ">") expression }
+expression  = {"+" | "-"}? term { {"+" | "-"} term }* 
+term        = factor { {"*" | "/"} factor }* 
+factor      = ident | number | "(" expression ")"
+ident       = (([a-zA-Z])+)   => [[ >string ]]
 digit       = ([0-9])         => [[ digit> ]]
-number      = ((digit)+) _    => [[ 10 digits>integer ]]
-program     = _ block "."
+number      = (digit)+        => [[ 10 digits>integer ]]
+program     = { block "." }
 ;EBNF
index 21a111f6f76d1c5d925c9f0eba240910bbb4bf28..3da676dcb2eb1757e260cfa2efd8404803ac2d4b 100755 (executable)
@@ -17,14 +17,14 @@ MEMO: any-char-parser ( -- parser )
 
 : search ( string parser -- seq )
   any-char-parser [ drop f ] action 2array choice repeat0 parse dup [
-    parse-result-ast [ ] subset
+    parse-result-ast [ ] filter
   ] [
     drop { }
   ] if ;
 
 
 : (replace) ( string parser -- seq )
-  any-char-parser 2array choice repeat0 parse parse-result-ast [ ] subset ;
+  any-char-parser 2array choice repeat0 parse parse-result-ast [ ] filter ;
 
 : replace ( string parser -- result )
  [  (replace) [ tree-write ] each ] with-string-writer ;
index da0658f94d2b8e18b9aaeab6f7844c2720c334f5..42c358646bde23172e313ed7a9d914d7dbecf3e3 100644 (file)
@@ -56,11 +56,9 @@ io.files io.encodings.utf8 ;
 [ "hell" ] [ "hell" step5 "" like ] unit-test
 [ "mate" ] [ "mate" step5 "" like ] unit-test
 
-: resource-lines resource-path utf8 file-lines ;
-
 [ { } ] [
-    "extra/porter-stemmer/test/voc.txt" resource-lines
+    "resource:extra/porter-stemmer/test/voc.txt" utf8 file-lines
     [ stem ] map
-    "extra/porter-stemmer/test/output.txt" resource-lines
-    [ 2array ] 2map [ first2 = not ] subset
+    "resource:extra/porter-stemmer/test/output.txt" utf8 file-lines
+    [ 2array ] 2map [ first2 = not ] filter
 ] unit-test
index 81820e0152801d685c89bbe8353f5468049c113e..9a2a08bcbeb45b4f7fea169f678f8a596ff5e192 100644 (file)
@@ -66,8 +66,6 @@ USING: kernel math parser sequences combinators splitting ;
 : r ( str oldsuffix newsuffix -- str )
     pick consonant-seq 0 > [ nip ] [ drop ] if append ;
 
-: butlast ( seq -- seq ) 1 head-slice* ;
-
 : step1a ( str -- newstr )
     dup peek CHAR: s = [
         {
@@ -95,7 +93,7 @@ USING: kernel math parser sequences combinators splitting ;
         { [ "iz" ?tail ] [ "ize" append ] }
         {
             [ dup length 1- over double-consonant? ]
-            [ dup "lsz" last-is? [ butlast ] unless ]
+            [ dup "lsz" last-is? [ but-last-slice ] unless ]
         }
         {
             [ t ]
@@ -122,7 +120,7 @@ USING: kernel math parser sequences combinators splitting ;
     } cond ;
 
 : step1c ( str -- newstr )
-    dup butlast stem-vowel? [
+    dup but-last-slice stem-vowel? [
         "y" ?tail [ "i" append ] when
     ] when ;
 
@@ -198,18 +196,18 @@ USING: kernel math parser sequences combinators splitting ;
 : remove-e? ( str -- ? )
     dup consonant-seq dup 1 >
     [ 2drop t ]
-    [ 1 = [ butlast cvc? not ] [ drop f ] if ] if ;
+    [ 1 = [ but-last-slice cvc? not ] [ drop f ] if ] if ;
 
 : remove-e ( str -- newstr )
     dup peek CHAR: e = [
-        dup remove-e? [ butlast ] when
+        dup remove-e? [ but-last-slice ] when
     ] when ;
 
 : ll->l ( str -- newstr )
     {
         { [ dup peek CHAR: l = not ] [ ] }
         { [ dup length 1- over double-consonant? not ] [ ] }
-        { [ dup consonant-seq 1 > ] [ butlast ] }
+        { [ dup consonant-seq 1 > ] [ but-last-slice ] }
         [ ]
     } cond ;
 
index dc191bc43938b3241a38da23cff22fcf21980b70..5abe23bb90fad6ed27be79140d29c8f14423007a 100644 (file)
@@ -1,5 +1,5 @@
 
-USING: kernel arrays sequences math qualified
+USING: kernel arrays sequences math math.order qualified
        sequences.lib circular processing ui newfx ;
 
 IN: processing.gallery.trails
@@ -44,4 +44,4 @@ IN: processing.gallery.trails
 
 : go ( -- ) [ go* ] with-ui ;
 
-MAIN: go
\ No newline at end of file
+MAIN: go
index 7d77e86fec7bf845ebac3d1b9721f6344b87d9d4..843f8b87ba0ebce67f6a06225f481005c322064b 100644 (file)
@@ -30,7 +30,7 @@ IN: project-euler.001
 ! -------------------
 
 : euler001a ( -- answer )
-    1000 [ dup 5 mod swap 3 mod [ zero? ] either? ] subset sum ;
+    1000 [ dup 5 mod swap 3 mod [ zero? ] either? ] filter sum ;
 
 ! [ euler001a ] 100 ave-time
 ! 0 ms run / 0 ms GC ave time - 100 trials
index b660ed0958686fa216cf71bb7509071a916a6f08..108f5c1e94a1072d418ca92204daccbd320a916d 100644 (file)
@@ -30,7 +30,7 @@ PRIVATE>
     V{ 0 } clone 1 rot (fib-upto) ;
 
 : euler002 ( -- answer )
-    1000000 fib-upto [ even? ] subset sum ;
+    1000000 fib-upto [ even? ] filter sum ;
 
 ! [ euler002 ] 100 ave-time
 ! 0 ms run / 0 ms GC ave time - 100 trials
@@ -41,10 +41,10 @@ PRIVATE>
 
 : fib-upto* ( n -- seq )
     0 1 [ pick over >= ] [ tuck + dup ] [ ] unfold 3nip
-    1 head-slice* { 0 1 } prepend ;
+    but-last-slice { 0 1 } prepend ;
 
 : euler002a ( -- answer )
-    1000000 fib-upto* [ even? ] subset sum ;
+    1000000 fib-upto* [ even? ] filter sum ;
 
 ! [ euler002a ] 100 ave-time
 ! 0 ms run / 0 ms GC ave time - 100 trials
index b2146b4aeab2af090e5972d7eef6a925d81410e5..1f268f15001743ed1488d018b69affa130b4707a 100644 (file)
@@ -21,7 +21,7 @@ IN: project-euler.004
 <PRIVATE
 
 : source-004 ( -- seq )
-    100 999 [a,b] [ 10 mod zero? not ] subset ;
+    100 999 [a,b] [ 10 mod zero? not ] filter ;
 
 : max-palindrome ( seq -- palindrome )
     natural-sort [ palindrome? ] find-last nip ;
index a2c3ebcd1f94207ce19079ed3936b047d71c7364..5006301c2b43bce05d0b39c12a33c2438d41c679 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (c) 2007 Samuel Tardieu, Aaron Schaefer.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: calendar combinators kernel math math.ranges namespaces sequences
-    sequences.lib ;
+    sequences.lib math.order ;
 IN: project-euler.019
 
 ! http://projecteuler.net/index.php?section=problems&id=19
index c0a48ec055fd396388bf167ad466e7eac4624e1a..82054ce014048b6b5cb790415259b359ed736371 100644 (file)
@@ -28,8 +28,8 @@ IN: project-euler.022
 <PRIVATE
 
 : source-022 ( -- seq )
-    "extra/project-euler/022/names.txt" resource-path
-    ascii file-contents [ quotable? ] subset "," split ;
+    "resource:extra/project-euler/022/names.txt"
+    ascii file-contents [ quotable? ] filter "," split ;
 
 : name-scores ( seq -- seq )
     [ 1+ swap alpha-value * ] map-index ;
index 1dd7878a3b84fac50f43b4ad68c2893258331cff..6b38a2b6ac8eb83374beb537a63ad1206e514f3d 100644 (file)
@@ -40,18 +40,19 @@ IN: project-euler.023
     46 [1,b] 47 20161 2 <range> append ;
 
 : abundants-upto ( n -- seq )
-    [1,b] [ abundant? ] subset ;
+    [1,b] [ abundant? ] filter ;
 
 : possible-sums ( seq -- seq )
     dup { } -rot [
         dupd [ + ] curry map
-        rot append prune swap 1 tail
+        rot append prune swap rest
     ] each drop natural-sort ;
 
 PRIVATE>
 
 : euler023 ( -- answer )
-    20161 abundants-upto possible-sums source-023 diff sum ;
+    source-023
+    20161 abundants-upto possible-sums diff sum ;
 
 ! TODO: solution is still too slow, although it takes under 1 minute
 
index f1f546ec1c6036945e771a7b9a4dbcfa5707fcd9..8cbf20d0bfd497632af1320e582e1fe72cfbb1f8 100644 (file)
@@ -34,7 +34,7 @@ IN: project-euler.026
 <PRIVATE
 
 : source-026 ( -- seq )
-    1 1000 (a,b) [ prime? ] subset [ 1 swap / ] map ;
+    1 1000 (a,b) [ prime? ] filter [ 1 swap / ] map ;
 
 : (mult-order) ( n a m -- k )
     3dup ^ swap mod 1 = [ 2nip ] [ 1+ (mult-order) ] if ;
index 2d99204bf383454d1831e01260d492c23632911b..7680112af79dba1fe97861560ab425712177574e 100644 (file)
@@ -46,8 +46,8 @@ IN: project-euler.027
 <PRIVATE
 
 : source-027 ( -- seq )
-    1000 [ prime? ] subset [ dup [ neg ] map append ] keep
-    cartesian-product [ first2 < ] subset ;
+    1000 [ prime? ] filter [ dup [ neg ] map append ] keep
+    cartesian-product [ first2 < ] filter ;
 
 : quadratic ( b a n -- m )
     dup sq -rot * + + ;
index 10fb4054f0eb0398798290179e4fe501c86a994f..53d6b199fbffd4ae71e3f114ff0307d7ce88b93d 100644 (file)
@@ -38,7 +38,7 @@ IN: project-euler.030
 PRIVATE>
 
 : euler030 ( -- answer )
-    325537 [ dup sum-fifth-powers = ] subset sum 1- ;
+    325537 [ dup sum-fifth-powers = ] filter sum 1- ;
 
 ! [ euler030 ] 100 ave-time
 ! 2537 ms run / 125 ms GC ave time - 100 trials
index 7b24004df66cdc942986b978e126b4dffa114b67..68b42ca4423a4e9db53bc8bba885133dffa41929 100755 (executable)
@@ -46,7 +46,7 @@ IN: project-euler.032
 PRIVATE>
 
 : euler032 ( -- answer )
-    source-032 [ valid? ] subset products prune sum ;
+    source-032 [ valid? ] filter products prune sum ;
 
 ! [ euler032 ] 10 ave-time
 ! 23922 ms run / 1505 ms GC ave time - 10 trials
@@ -70,7 +70,7 @@ PRIVATE>
 PRIVATE>
 
 : euler032a ( -- answer )
-    source-032a [ mmp ] map [ pandigital? ] subset products prune sum ;
+    source-032a [ mmp ] map [ pandigital? ] filter products prune sum ;
 
 ! [ euler032a ] 100 ave-time
 ! 5978 ms run / 327 ms GC ave time - 100 trials
index 35b1c87e7a26a933d3935833e25d3e983a08e5a0..8cb0dc45c3bfc44a1aaa301aea8d459e761a5d53 100644 (file)
@@ -30,7 +30,7 @@ IN: project-euler.033
 <PRIVATE
 
 : source-033 ( -- seq )
-    10 99 [a,b] dup cartesian-product [ first2 < ] subset ;
+    10 99 [a,b] dup cartesian-product [ first2 < ] filter ;
 
 : safe? ( ax xb -- ? )
     [ 10 /mod ] bi@ -roll = rot zero? not and nip ;
@@ -42,7 +42,7 @@ IN: project-euler.033
     2dup / [ ax/xb ] dip = ;
 
 : curious-fractions ( seq -- seq )
-    [ first2 curious? ] subset [ first2 / ] map ;
+    [ first2 curious? ] filter [ first2 / ] map ;
 
 PRIVATE>
 
index c15d722266486e0ef6adf56b1a9e0445253613ee..cf73ee828bfb6a453dc128d493e0cce889ec0597 100644 (file)
@@ -39,7 +39,7 @@ IN: project-euler.034
 PRIVATE>
 
 : euler034 ( -- answer )
-    3 2000000 [a,b] [ factorion? ] subset sum ;
+    3 2000000 [a,b] [ factorion? ] filter sum ;
 
 ! [ euler034 ] 10 ave-time
 ! 15089 ms run / 725 ms GC ave time - 10 trials
index c362e1e1a59cd393127b3fca9336e02b8aed6d27..cec9bc695770efa991aac902ac9d5cffc4689e0f 100755 (executable)
@@ -28,7 +28,7 @@ IN: project-euler.035
 
 : possible? ( seq -- ? )
     dup length 1 > [
-        dup { 0 2 4 5 6 8 } swap diff =
+        dup { 0 2 4 5 6 8 } diff =
     ] [
         drop t
     ] if ;
@@ -50,7 +50,7 @@ IN: project-euler.035
 PRIVATE>
 
 : euler035 ( -- answer )
-    source-035 [ possible? ] subset [ circular? ] count ;
+    source-035 [ possible? ] filter [ circular? ] count ;
 
 ! [ euler035 ] 100 ave-time
 ! 904 ms run / 86 ms GC ave time - 100 trials
index 3ca1c73f391d7c33fc1f67042fa3323ee24d5083..153901ce6d0151d591e8b6e289d6eb574c5439a0 100644 (file)
@@ -32,7 +32,7 @@ IN: project-euler.036
 PRIVATE>
 
 : euler036 ( -- answer )
-    1 1000000 2 <range> [ both-bases? ] subset sum ;
+    1 1000000 2 <range> [ both-bases? ] filter sum ;
 
 ! [ euler036 ] 100 ave-time
 ! 3891 ms run / 173 ms GC ave time - 100 trials
index 66b16650378da445dceb7ae5de81ddb59a7ef769..a5bc0581e6f38439c3686463c02215b44959eeba 100755 (executable)
@@ -44,7 +44,7 @@ IN: project-euler.037
 PRIVATE>
 
 : euler037 ( -- answer )
-    23 1000000 primes-between [ r-trunc? ] subset [ l-trunc? ] subset sum ;
+    23 1000000 primes-between [ r-trunc? ] filter [ l-trunc? ] filter sum ;
 
 ! [ euler037 ] 100 ave-time
 ! 768 ms run / 9 ms GC ave time - 100 trials
index 2369db25fb0d2fe422187ecfe4c7c158750799cf..78e3848a337a2723317a5f8a9a50973fb047b744 100755 (executable)
@@ -47,7 +47,7 @@ IN: project-euler.038
 PRIVATE>
 
 : euler038 ( -- answer )
-    9123 9876 [a,b] [ concat-product ] map [ pandigital? ] subset supremum ;
+    9123 9876 [a,b] [ concat-product ] map [ pandigital? ] filter supremum ;
 
 ! [ euler038 ] 100 ave-time
 ! 37 ms run / 1 ms GC ave time - 100 trials
index a87722debce0da6c82688f08a3cdeb6916285f76..4111fe80091555644b38941deaf45164624e83ed 100644 (file)
@@ -30,8 +30,8 @@ IN: project-euler.042
 <PRIVATE
 
 : source-042 ( -- seq )
-    "extra/project-euler/042/words.txt" resource-path
-    ascii file-contents [ quotable? ] subset "," split ;
+    "resource:extra/project-euler/042/words.txt"
+    ascii file-contents [ quotable? ] filter "," split ;
 
 : (triangle-upto) ( limit n -- )
     2dup nth-triangle > [
index 0d1eb00bfa38656d4a5357bb72ab2d82b90fe209..41e378e531086d41954b9ca6e3921f40d561ce06 100644 (file)
@@ -53,7 +53,7 @@ PRIVATE>
 
 : euler043 ( -- answer )
     1234567890 number>digits all-permutations
-    [ interesting? ] subset [ 10 digits>integer ] map sum ;
+    [ interesting? ] filter [ 10 digits>integer ] map sum ;
 
 ! [ euler043 ] time
 ! 125196 ms run / 19548 ms GC time
@@ -70,20 +70,20 @@ PRIVATE>
 <PRIVATE
 
 : candidates ( n -- seq )
-    1000 over <range> [ number>digits 3 0 pad-left ] map [ all-unique? ] subset ;
+    1000 over <range> [ number>digits 3 0 pad-left ] map [ all-unique? ] filter ;
 
 : overlap? ( seq -- ? )
     dup first 2 tail* swap second 2 head = ;
 
 : clean ( seq -- seq )
-    [ unclip 1 head prefix concat ] map [ all-unique? ] subset ;
+    [ unclip 1 head prefix concat ] map [ all-unique? ] filter ;
 
 : add-missing-digit ( seq -- seq )
-    dup natural-sort 10 diff first prefix ;
+    dup natural-sort 10 swap diff first prefix ;
 
 : interesting-pandigitals ( -- seq )
     17 candidates { 13 11 7 5 3 2 } [
-        candidates swap cartesian-product [ overlap? ] subset clean
+        candidates swap cartesian-product [ overlap? ] filter clean
     ] each [ add-missing-digit ] map ;
 
 PRIVATE>
index bc8aec8bded15a9c37ee02764df5f94c16cea2b3..eaa6bf96ef7b164065befbe6630236e53d231e70 100644 (file)
@@ -37,7 +37,7 @@ PRIVATE>
 
 : euler044 ( -- answer )
     2500 [1,b] [ nth-pentagonal ] map dup cartesian-product
-    [ first2 sum-and-diff? ] subset [ first2 - abs ] map infimum ;
+    [ first2 sum-and-diff? ] filter [ first2 - abs ] map infimum ;
 
 ! [ euler044 ] 10 ave-time
 ! 8924 ms run / 2872 ms GC ave time - 10 trials
index bb95ab9024d689010bb48a8068fa6a704d80c22a..dceb01bd16837ac2224dfa5cb774826c8c8d8b35 100644 (file)
@@ -52,7 +52,7 @@ IN: project-euler.059
 <PRIVATE
 
 : source-059 ( -- seq )
-    "extra/project-euler/059/cipher1.txt" resource-path
+    "resource:extra/project-euler/059/cipher1.txt"
     ascii file-contents [ blank? ] right-trim "," split
     [ string>number ] map ;
 
@@ -78,7 +78,7 @@ INSTANCE: rollover immutable-sequence
     frequency-analysis sort-values keys peek ;
 
 : crack-key ( seq key-length -- key )
-    [ " " decrypt ] dip group 1 head-slice*
+    [ " " decrypt ] dip group but-last-slice
     flip [ most-frequent ] map ;
 
 PRIVATE>
index 436ccde77609ba8fc9e50d85a3f2005c99c36a2e..3e16996e0424c4cea61404d9349996ce286e5ca2 100644 (file)
@@ -38,7 +38,7 @@ IN: project-euler.067
 <PRIVATE
 
 : source-067 ( -- seq )
-    "extra/project-euler/067/triangle.txt" resource-path
+    "resource:extra/project-euler/067/triangle.txt"
     ascii file-lines [ " " split [ string>number ] map ] map ;
 
 PRIVATE>
index b09a2742c3e8a2b244a854681b37e61034f1561d..782d6d04296fc6b71a9280f01e459d2ab181b959 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (c) 2008 Eric Mertens
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays assocs combinators kernel math sequences math.ranges locals ;
+USING: arrays assocs combinators kernel math sequences
+math.order math.ranges locals ;
 IN: project-euler.076
 
 ! http://projecteuler.net/index.php?section=problems&id=76
index 452a64af44af269d7b490cc951ec6ac4a717fbc5..cde4dc079b3401aa1912e6549ab2e78b2988f0e9 100644 (file)
@@ -27,7 +27,7 @@ IN: project-euler.079
 <PRIVATE
 
 : source-079 ( -- seq )
-    "extra/project-euler/079/keylog.txt" resource-path ascii file-lines ;
+    "resource:extra/project-euler/079/keylog.txt" ascii file-lines ;
 
 : >edges ( seq -- seq )
     [
@@ -35,11 +35,11 @@ IN: project-euler.079
     ] { } make ;
 
 : find-source ( seq -- elt )
-    dup values swap keys [ prune ] bi@ diff
+    [ keys ] [ values ] bi diff prune
     dup empty? [ "Topological sort failed" throw ] [ first ] if ;
 
 : remove-source ( seq elt -- seq )
-    [ swap member? not ] curry subset ;
+    [ swap member? not ] curry filter ;
 
 : (topological-sort) ( seq -- )
     dup length 1 > [
@@ -52,7 +52,7 @@ PRIVATE>
 
 : topological-sort ( seq -- seq )
     [ [ (topological-sort) ] { } make ] keep
-    concat prune dupd diff append ;
+    concat prune over diff append ;
 
 : euler079 ( -- answer )
     source-079 >edges topological-sort 10 digits>integer ;
diff --git a/extra/project-euler/100/100.factor b/extra/project-euler/100/100.factor
new file mode 100644 (file)
index 0000000..d2d396a
--- /dev/null
@@ -0,0 +1,7 @@
+USING: kernel sequences math.functions math ;
+IN: project-euler.100
+
+: euler100 ( -- n )
+    1 1
+    [ dup dup 1- * 2 * 10 24 ^ <= ]
+    [ tuck 6 * swap - 2 - ] [ ] while nip ;
index 5056560a852d65e0ed3499e2129f1b1b6b5d48e0..3a052617108ded99f246155a8d459f1f41837412 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (c) 2008 Eric Mertens
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math splitting sequences ;
+USING: kernel math math.order splitting sequences ;
 
 IN: project-euler.117
 
index fb7fdebd51a50a3f7f57c33174a8b810ecf382e6..11af1960ed9f09341f51b16cc6d4865eacc9351a 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (c) 2007 Samuel Tardieu.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays kernel lazy-lists math.algebra math math.functions math.primes
-    math.ranges project-euler.common sequences ;
+USING: arrays kernel lazy-lists math.algebra math math.functions
+    math.order math.primes math.ranges project-euler.common sequences ;
 IN: project-euler.134
 
 ! http://projecteuler.net/index.php?section=problems&id=134
index c96c1ebc73edd773e23801790e21f088748173e4..8c93d4f7e638d3e79670f9c2335aff6e975a2a76 100644 (file)
@@ -1,6 +1,7 @@
 ! Copyright (c) 2008 Eric Mertens
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel math sequences sequences.private locals hints ;
+USING: kernel math math.order sequences sequences.private
+locals hints ;
 IN: project-euler.150
 
 <PRIVATE
@@ -17,7 +18,7 @@ IN: project-euler.150
     0 0 rot [ (partial-sum-infimum) ] each drop ; inline
 
 : generate ( n quot -- seq )
-    [ drop ] swap compose map ; inline
+    [ drop ] prepose map ; inline
 
 : map-infimum ( seq quot -- min )
     [ min ] compose 0 swap reduce ; inline
diff --git a/extra/project-euler/151/151.factor b/extra/project-euler/151/151.factor
new file mode 100644 (file)
index 0000000..b2bbbcc
--- /dev/null
@@ -0,0 +1,41 @@
+! Copyright (c) 2008 Eric Mertens
+! See http://factorcode.org/license.txt for BSD license.
+USING: sequences combinators kernel sequences.lib math math.order
+assocs namespaces ;
+IN: project-euler.151
+
+SYMBOL: table
+
+: (pick-sheet) ( seq i -- newseq )
+    [
+        <=> sgn
+        {
+            { -1 [ ] }
+            {  0 [ 1- ] }
+            {  1 [ 1+ ] }
+        } case
+    ] curry map-index ;
+
+DEFER: (euler151)
+
+: pick-sheet ( seq i -- res )
+    2dup swap nth dup zero? [
+        3drop 0
+    ] [
+        [ (pick-sheet) (euler151) ] dip *
+    ] if ;
+
+: (euler151) ( x -- y )
+    table get [ {
+        { { 0 0 0 1 } [ 0 ] }
+        { { 0 0 1 0 } [ { 0 0 0 1 } (euler151) 1+ ] }
+        { { 0 1 0 0 } [ { 0 0 1 1 } (euler151) 1+ ] }
+        { { 1 0 0 0 } [ { 0 1 1 1 } (euler151) 1+ ] }
+        [ [ dup length [ pick-sheet ] with map sum ] [ sum ] bi / ]
+     } case ] cache ;
+
+: euler151 ( -- n )
+    [
+        H{ } clone table set
+        { 1 1 1 1 } (euler151)
+    ] with-scope ;
diff --git a/extra/project-euler/190/190.factor b/extra/project-euler/190/190.factor
new file mode 100644 (file)
index 0000000..6fc15c9
--- /dev/null
@@ -0,0 +1,48 @@
+! Copyright (c) 2008 Eric Mertens
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel sequences sequences.lib math math.functions math.ranges locals ;
+IN: project-euler.190
+
+! PROBLEM
+! -------
+
+! http://projecteuler.net/index.php?section=problems&id=190
+
+! Let Sm = (x1, x2, ... , xm) be the m-tuple of positive real numbers
+! with x1 + x2 + ... + xm = m for which Pm = x1 * x22 * ... * xmm is
+! maximised.
+
+! For example, it can be verified that [P10] = 4112 ([ ] is the integer
+! part function).
+
+! Find Î£[Pm] for 2 â‰¤ m â‰¤ 15.
+
+! SOLUTION
+! --------
+
+! Pm = x1 * x2^2 * x3^3 * ... * xm^m
+! fm = x1 + x2 + x3 + ... + xm - m = 0
+! Gm === Pm - L * fm
+! dG/dx_i = 0 = i * Pm / xi - L
+! xi = i * Pm / L
+
+! Sum(i=1 to m) xi = m
+! Sum(i=1 to m) i * Pm / L = m
+! Pm / L * Sum(i=1 to m) i = m
+! Pm / L * m*(m+1)/2 = m
+! Pm / L = 2 / (m+1)
+
+! xi = i * (2 / (m+1)) = 2*i/(m+1)
+
+<PRIVATE
+
+: PI ( seq quot -- n )
+    [ * ] compose 1 swap reduce ; inline
+
+PRIVATE>
+
+:: P_m ( m -- P_m )
+    m [1,b] [| i | 2 i * m 1+ / i ^ ] PI ;
+
+: euler190 ( -- n )
+    2 15 [a,b] [ P_m truncate ] sigma ;
index 5829f66c0164c379f1398f76e8a7a42fb9d335c2..fefb986fe04c0c8df2e5d282f7980b5a3aac15e9 100644 (file)
@@ -1,6 +1,6 @@
 USING: arrays kernel math math.functions math.miller-rabin math.matrices
-    math.parser math.primes.factors math.ranges namespaces sequences
-    sequences.lib sorting unicode.case ;
+    math.order math.parser math.primes.factors math.ranges namespaces
+    sequences sequences.lib sorting unicode.case ;
 IN: project-euler.common
 
 ! A collection of words used by more than one Project Euler solution
@@ -40,10 +40,10 @@ IN: project-euler.common
 
 ! Propagate one row into the upper one
 : propagate ( bottom top -- newtop )
-    [ over 1 tail rot first2 max rot + ] map nip ;
+    [ over rest rot first2 max rot + ] map nip ;
 
 : shift-3rd ( seq obj obj -- seq obj obj )
-    rot 1 tail -rot ;
+    rot rest -rot ;
 
 : (sum-divisors) ( n -- sum )
     dup sqrt >fixnum [1,b] [
@@ -95,7 +95,7 @@ PRIVATE>
 ! Not strictly needed, but it is nice to be able to dump the triangle after the
 ! propagation
 : propagate-all ( triangle -- newtriangle )
-    reverse [ first dup ] keep 1 tail [ propagate dup ] map nip reverse swap suffix ;
+    reverse [ first dup ] keep rest [ propagate dup ] map nip reverse swap suffix ;
 
 : sum-divisors ( n -- sum )
     dup 4 < [ { 0 1 3 4 } nth ] [ (sum-divisors) ] if ;
index ade3357f348758f2717678c09fa19be4ea1e2441..c482df0d1574f593e50ffc5221988d6a998fb20a 100755 (executable)
@@ -29,6 +29,6 @@ HELP: LAZY:
 { $values { "word" "a new word to define" } { "definition" "a word definition" } }
 { $description "Creates a lazy word in the current vocabulary. When executed the word will return a " { $link promise } " that when forced, executes the word definition. Any values on the stack that are required by the word definition are captured along with the promise." } 
 { $examples
-  { $example "USING: math prettyprint promises ;" "LAZY: my-add ( a b -- c ) + ;" "1 2 my-add force ." "3" }
+  { $example "USING: arrays sequences prettyprint promises ;" "IN: scratchpad" "LAZY: zeroes ( -- pair ) 0 zeroes 2array ;" "zeroes force second force first ." "0" }
 }
 { $see-also force promise-with promise-with2 } ;
index 730388ade0264867e7d843831c86d5693854af04..e48714bc44ea67a461d4c53b557f1066a97f2908 100644 (file)
@@ -23,7 +23,7 @@ IN: qualified
     ] curry map zip ;
 
 : partial-vocab-ignoring ( words name -- assoc )
-    [ vocab-words keys diff ] keep partial-vocab ;
+    [ vocab-words keys swap diff ] keep partial-vocab ;
 
 : EXCLUDE:
     #! Syntax: EXCLUDE: vocab => words ... ;
index 476fc083a757f96d57f14d834aa64ad1fcbd0aea..59cc15cba675ac7a95e3dff33f15548039c4d4f7 100644 (file)
@@ -7,7 +7,7 @@ IN: random-weighted
 : probabilities ( weights -- probabilities ) dup sum v/n ;
 
 : layers ( probabilities -- layers )
-dup length 1+ [ head ] with map 1 tail [ sum ] map ;
+dup length 1+ [ head ] with map rest [ sum ] map ;
 
 : random-weighted ( weights -- elt )
 probabilities layers [ 1000 * ] map 1000 random [ > ] curry find drop ;
index 703a0c16e4e1d5e6332b94e74f25e0afaf90f56f..d25ceacdb1f11f630aa17ddcb04c3b530cbed296 100755 (executable)
@@ -1,5 +1,5 @@
 USING: kernel math random namespaces random.mersenne-twister
-sequences tools.test ;
+sequences tools.test math.order ;
 IN: random.mersenne-twister.tests
 
 : check-random ( max -- ? )
index 6016a6e9cbecaa4066fd2e1aa2a5858098fce061..7fda7c5d1daa634883af018b2fd5e0e992393d5a 100644 (file)
@@ -9,7 +9,7 @@ C: <unix-random> unix-random
 
 : file-read-unbuffered ( n path -- bytes )
     over default-buffer-size [
-        binary <file-reader> [ read ] with-stream
+        binary [ read ] with-file-reader
     ] with-variable ;
 
 M: unix-random random-bytes* ( n tuple -- byte-array )
index d517db09fe245b17cd0325b5b7649e97d8c5c4a2..78ffaf5eeb9663ead1e016a56772849d81123b25 100755 (executable)
@@ -1,6 +1,6 @@
 USING: arrays combinators kernel lazy-lists math math.parser
 namespaces parser parser-combinators parser-combinators.simple
-promises quotations sequences combinators.lib strings
+promises quotations sequences combinators.lib strings math.order
 assocs prettyprint.backend memoize unicode.case unicode.categories ;
 USE: io
 IN: regexp
@@ -291,7 +291,7 @@ TUPLE: regexp source parser ignore-case? ;
 
 : parse-regexp ( accum end -- accum )
     lexer get dup skip-blank
-    [ [ index* dup 1+ swap ] 2keep swapd subseq swap ] change-lexer-column
+    [ [ index-from dup 1+ swap ] 2keep swapd subseq swap ] change-lexer-column
     lexer get dup still-parsing-line?
     [ (parse-token) parse-options ] [ drop f ] if
     <regexp> parsed ;
index 8c26d880f19c3f2adf62e5cbb0cab0e7f4eee78c..f7023c74bf6ee74de9ce13a97844e4e6b20404ba 100644 (file)
@@ -1,6 +1,6 @@
 USING: assocs combinators.lib kernel math math.parser
 namespaces peg unicode.case sequences unicode.categories
-memoize peg.parsers ;
+memoize peg.parsers math.order ;
 USE: io
 USE: tools.walker
 IN: regexp2
index c3b7311714eaa33079ff9d79543610d5e87b8c9c..3b37171da3e7f1a253c69b738174a4aaf1ca373b 100755 (executable)
@@ -1,7 +1,7 @@
 USING: assocs math kernel shuffle combinators.lib\r
 words quotations arrays combinators sequences math.vectors\r
 io.styles prettyprint vocabs sorting io generic locals.private\r
-math.statistics ;\r
+math.statistics math.order ;\r
 IN: reports.noise\r
 \r
 : badness ( word -- n )\r
index f38d1d808b6074345abefcdc9497ba25dc2475b4..06e76d0a99aa0f9c7894989fb6ccaf609abeed43 100755 (executable)
@@ -1,6 +1,6 @@
 USING: assocs words sequences arrays compiler tools.time\r
 io.styles io prettyprint vocabs kernel sorting generator\r
-optimizer math ;\r
+optimizer math math.order ;\r
 IN: report.optimizer\r
 \r
 : count-optimization-passes ( nodes n -- n )\r
@@ -8,7 +8,7 @@ IN: report.optimizer
     [ r> 1+ count-optimization-passes ] [ drop r> ] if ;\r
 \r
 : results\r
-    [ [ second ] swap compose compare ] curry sort 20 tail*\r
+    [ [ second ] prepose compare ] curry sort 20 tail*\r
     print\r
     standard-table-style\r
     [\r
@@ -16,7 +16,7 @@ IN: report.optimizer
     ] tabular-output ; inline\r
 \r
 : optimizer-measurements ( -- alist )\r
-    all-words [ compiled? ] subset\r
+    all-words [ compiled? ] filter\r
     [\r
         dup [\r
             word-dataflow nip 1 count-optimization-passes\r
index 07e43cea8effec3b56133ea88bcb45899877b08d..71b5d69693ce8e3a3d40dfdddffab440f75ce35b 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 
-USING: arrays assocs kernel math math.vectors namespaces
+USING: arrays assocs kernel math math.order math.vectors namespaces
 quotations sequences sequences.lib sequences.private strings unicode.case ;
 IN: roman
 
index 7523d0509f7898a10cc6ae3e76ec924c4b35c2fe..0e6bb0b9c15c91fe11289fcb605a3869c4ae3219 100755 (executable)
@@ -5,7 +5,7 @@ IN: rss.tests
 : load-news-file ( filename -- feed )
     #! Load an news syndication file and process it, returning
     #! it as an feed tuple.
-    utf8 <file-reader> read-feed ;
+    utf8 file-contents read-feed ;
 
 [ T{
     feed
@@ -22,7 +22,7 @@ IN: rss.tests
             f
         }
     }
-} ] [ "extra/rss/rss1.xml" resource-path load-news-file ] unit-test
+} ] [ "resource:extra/rss/rss1.xml" load-news-file ] unit-test
 [ T{
     feed
     f
@@ -36,7 +36,7 @@ IN: rss.tests
             "http://example.org/2005/04/02/atom"
             "\n         <div xmlns=\"http://www.w3.org/1999/xhtml\">\n           <p><i>[Update: The Atom draft is finished.]</i></p>\n         </div>\n       "
 
-            T{ timestamp f 2003 12 13 8 29 29 -4 }
+            T{ timestamp f 2003 12 13 8 29 29 T{ duration f 0 0 0 -4 0 0 } }
         }
     }
-} ] [ "extra/rss/atom.xml" resource-path load-news-file ] unit-test
+} ] [ "resource:extra/rss/atom.xml" load-news-file ] unit-test
index 2e735d2f06f39eb9da904eb30e4311f1f47d9035..6e616e51a94ac84ba0b5f9d18a32e45fe89ded4d 100644 (file)
@@ -1,11 +1,11 @@
 ! Copyright (C) 2006 Chris Double, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: rss
-USING: xml.utilities kernel assocs xml.generator
+USING: xml.utilities kernel assocs xml.generator math.order
     strings sequences xml.data xml.writer
     io.streams.string combinators xml xml.entities io.files io
     http.client namespaces xml.generator hashtables
     calendar.format accessors continuations ;
+IN: rss
 
 : any-tag-named ( tag names -- tag-inside )
     f -rot [ tag-named nip dup ] with find 2drop ;
@@ -23,7 +23,7 @@ C: <entry> entry
     [ "link" tag-named children>string ] keep
     [ "description" tag-named children>string ] keep
     f "date" "http://purl.org/dc/elements/1.1/" <name>
-    tag-named dup [ children>string rfc3339>timestamp ] when
+    tag-named dup [ children>string rfc822>timestamp ] when
     <entry> ;
 
 : rss1.0 ( xml -- feed )
@@ -39,7 +39,7 @@ C: <entry> entry
     [ "link" tag-named ] keep
     [ "guid" tag-named dupd ? children>string ] keep
     [ "description" tag-named children>string ] keep
-    "pubDate" tag-named children>string rfc3339>timestamp <entry> ;
+    "pubDate" tag-named children>string rfc822>timestamp <entry> ;
 
 : rss2.0 ( xml -- feed )
     "channel" tag-named 
@@ -71,16 +71,12 @@ C: <entry> entry
         { "feed" [ atom1.0 ] }
     } case ;
 
-: read-feed ( stream -- feed )
-    [ read-xml ] with-html-entities xml>feed ;
+: read-feed ( string -- feed )
+    [ string>xml xml>feed ] with-html-entities ;
 
 : download-feed ( url -- feed )
     #! Retrieve an news syndication file, return as a feed tuple.
-    http-get-stream swap code>> success? [
-        read-feed
-    ] [
-        dispose "Error retrieving newsfeed file" throw
-    ] if ;
+    http-get read-feed ;
 
 ! Atom generation
 : simple-tag, ( content name -- )
diff --git a/extra/semantic-db/authors.txt b/extra/semantic-db/authors.txt
new file mode 100644 (file)
index 0000000..e9c193b
--- /dev/null
@@ -0,0 +1 @@
+Alex Chapman
diff --git a/extra/semantic-db/context/context.factor b/extra/semantic-db/context/context.factor
deleted file mode 100644 (file)
index 777c481..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-! Copyright (C) 2008 Alex Chapman
-! See http://factorcode.org/license.txt for BSD license.
-USING: kernel namespaces semantic-db ;
-IN: semantic-db.context
-
-: create-context* ( context-name -- context-id ) create-node* ;
-: create-context ( context-name -- ) create-context* drop ;
-
-: context ( -- context-id )
-    \ context get ;
-
-: set-context ( context-id -- )
-    \ context set ;
-
-: with-context ( context-id quot -- )
-    >r \ context r> with-variable ;
diff --git a/extra/semantic-db/hierarchy/hierarchy.factor b/extra/semantic-db/hierarchy/hierarchy.factor
deleted file mode 100755 (executable)
index 0b2421c..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-! Copyright (C) 2008 Alex Chapman
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors db.tuples hashtables kernel sets
-semantic-db semantic-db.relations sequences sequences.deep ;
-IN: semantic-db.hierarchy
-
-TUPLE: tree id children ;
-C: <tree> tree
-
-: has-parent-relation ( -- relation-id )
-    "has parent" relation-id ;
-
-: parent-child* ( parent child -- arc-id )
-    has-parent-relation spin create-arc* ;
-
-: parent-child ( parent child -- )
-    parent-child* drop ;
-
-: un-parent-child ( parent child -- )
-    has-parent-relation spin <arc> select-tuples [ id>> delete-arc ] each ;
-
-: child-arcs ( node-id -- child-arcs )
-    has-parent-relation f rot <arc> select-tuples ;
-
-: children ( node-id -- children )
-    child-arcs [ subject>> ] map ;
-
-: parent-arcs ( node-id -- parent-arcs )
-    has-parent-relation swap f <arc> select-tuples ;
-
-: parents ( node-id -- parents )
-     parent-arcs [ object>> ] map ;
-
-: get-node-hierarchy ( node-id -- tree )
-    dup children [ get-node-hierarchy ] map <tree> ;
-
-: (get-root-nodes) ( node-id -- root-nodes/node-id )
-    dup parents dup empty? [
-        drop
-    ] [
-        nip [ (get-root-nodes) ] map
-    ] if ;
-
-: get-root-nodes ( node-id -- root-nodes )
-    (get-root-nodes) flatten prune ;
diff --git a/extra/semantic-db/relations/relations.factor b/extra/semantic-db/relations/relations.factor
deleted file mode 100644 (file)
index 17c335c..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-! Copyright (C) 2008 Alex Chapman
-! See http://factorcode.org/license.txt for BSD license.
-USING: db.types kernel namespaces semantic-db semantic-db.context
-sequences.lib ;
-IN: semantic-db.relations
-
-! relations:
-!  - have a context in context 'semantic-db'
-
-: create-relation* ( context-id relation-name -- relation-id )
-    create-node* tuck has-context-relation spin create-arc ;
-
-: create-relation ( context-id relation-name -- )
-    create-relation* drop ;
-
-: get-relation ( context-id relation-name -- relation-id/f )
-    [
-        ":name" TEXT param ,
-        ":context" INTEGER param ,
-        has-context-relation ":has_context" INTEGER param ,
-    ] { } make
-    "select n.id from node n, arc a where n.content = :name and n.id = a.subject and a.relation = :has_context and a.object = :context"
-    single-int-results ?first ;
-
-: relation-id ( relation-name -- relation-id )
-    context swap [ get-relation ] [ create-relation* ] ensure2 ;
index c523053740e19e1ff85481eb72a1dff32c62da96..484af741aad4593242c3430f63d4a78548badccd 100644 (file)
@@ -1,10 +1,10 @@
-USING: accessors arrays continuations db db.sqlite
-db.tuples io.files kernel math namespaces semantic-db
-semantic-db.context semantic-db.hierarchy
-semantic-db.relations sequences sorting tools.test
+USING: accessors arrays continuations db db.sqlite db.tuples io.files
+kernel math namespaces semantic-db sequences sorting tools.test
 tools.walker ;
 IN: semantic-db.tests
 
+SYMBOL: context
+
 : db-path "semantic-db-test.db" temp-file ;
 : test-db db-path sqlite-db ;
 : delete-db [ db-path delete-file ] ignore-errors ;
@@ -12,61 +12,56 @@ IN: semantic-db.tests
 delete-db
 
 test-db [
-    create-node-table create-arc-table
-    [ 1 ] [ "first node" create-node* ] unit-test
-    [ 2 ] [ "second node" create-node* ] unit-test
-    [ 3 ] [ "third node" create-node* ] unit-test
-    [ 4 ] [ f create-node* ] unit-test
-    [ 5 ] [ 1 2 3 create-arc* ] unit-test
-] with-db
-
-delete-db
-
-test-db [
-    init-semantic-db
-    "test content" create-context* [
-        [ 4 ] [ context ] unit-test
-        [ 5 ] [ context "is test content" create-relation* ] unit-test
-        [ 5 ] [ context "is test content" get-relation ] unit-test
-        [ 5 ] [ "is test content" relation-id ] unit-test
-        [ 7 ] [ "has parent" relation-id ] unit-test
-        [ 7 ] [ "has parent" relation-id ] unit-test
-        [ "has parent" ] [ "has parent" relation-id node-content ] unit-test
-        [ "test content" ] [ context node-content ] unit-test
-    ] with-context
-    ! type-type 1array [ "type" ensure-type ] unit-test
-    ! [ { 1 2 3 } ] [ type-type select-nodes-of-type ] unit-test
-    ! [ 1 ] [ type-type select-node-of-type ] unit-test
-    ! [ t ] [ "content" ensure-type integer? ] unit-test
-    ! [ t ] [ "content" ensure-type "content" ensure-type = ] unit-test
-    ! [ t ] [ "content" ensure-type "first content" create-node-of-type integer? ] unit-test
-    ! [ t ] [ "content" ensure-type select-node-of-type integer? ] unit-test
-    ! [ t ] [ "content" ensure-type "first content" select-node-of-type-with-content integer? ] unit-test
-    ! [ t ] [ "content" ensure-type "first content" ensure-node-of-type integer? ] unit-test
-    ! [ t ] [ "content" ensure-type "second content" ensure-node-of-type integer? ] unit-test
-    ! [ 2 ] [ "content" ensure-type select-nodes-of-type length ] unit-test
-] with-db
+    node create-table arc create-table
+    [ 1 ] [ "first node" create-node id>> ] unit-test
+    [ 2 ] [ "second node" create-node id>> ] unit-test
+    [ 3 ] [ "third node" create-node id>> ] unit-test
+    [ 4 ] [ f create-node id>> ] unit-test
+    [ ] [ 1 f <node> 2 f <node> 3 f <node> create-arc ] unit-test
+    [ { 1 2 3 4 } ] [ all-node-ids ] unit-test
+] with-db delete-db
 
-delete-db
-
-! test hierarchy
-test-db [
-    init-semantic-db
-    "family tree" create-context* [
-        "adam" create-node* "adam" set
-        "eve" create-node* "eve" set
-        "bob" create-node* "bob" set
-        "fran" create-node* "fran" set
-        "charlie" create-node* "charlie" set
-        "gertrude" create-node* "gertrude" set
-        [ t ] [ "adam" get "bob" get parent-child* integer? ] unit-test
-        { { "eve" "bob" } { "eve" "fran" } { "bob" "gertrude" } { "bob" "fran" } { "fran" "charlie" } } [ first2 [ get ] bi@ parent-child ] each
-        [ { "bob" "fran" } ] [ "eve" get children [ node-content ] map ] unit-test
-        [ { "adam" "eve" } ] [ "bob" get parents [ node-content ] map ] unit-test
-        [ "fran" { "charlie" } ] [ "fran" get get-node-hierarchy dup tree-id node-content swap tree-children [ tree-id node-content ] map ] unit-test
-        [ { "adam" "eve" } ] [ "charlie" get get-root-nodes [ node-content ] map natural-sort >array ] unit-test
-        [ { } ] [ "fran" get "charlie" get tuck un-parent-child parents [ node-content ] map ] unit-test
-    ] with-context
-] with-db
-
-delete-db
+ test-db [
+     init-semantic-db
+     "test content" create-context context set
+     [ T{ node f 3 "test content" } ] [ context get ] unit-test
+     [ T{ node f 4 "is test content" } ] [ "is test content" context get create-relation ] unit-test
+     [ T{ node f 4 "is test content" } ] [ "is test content" context get get-relation ] unit-test
+     [ T{ node f 4 "is test content" } ] [ "is test content" context get ensure-relation ] unit-test
+     [ T{ node f 5 "has parent" } ] [ "has parent" context get ensure-relation ] unit-test
+     [ T{ node f 5 "has parent" } ] [ "has parent" context get ensure-relation ] unit-test
+     [ "has parent" ] [ "has parent" context get ensure-relation node-content ] unit-test
+     [ "test content" ] [ context get node-content ] unit-test
+ ] with-db delete-db
+ ! "test1" "test1-relation-id-word" f f f f <relation-definition> define-relation
+ ! "test2" t t t t t <relation-definition> define-relation
+ RELATION: test3
+ test-db [
+     init-semantic-db
+     ! [ T{ node f 3 "test1" } ] [ test1-relation-id-word ] unit-test
+     ! [ T{ node f 4 "test2" } ] [ test2-relation ] unit-test
+     [ T{ node f 4 "test3" } ] [ test3-relation ] unit-test
+ ] with-db delete-db
+ ! test hierarchy
+ RELATION: has-parent
+ test-db [
+     init-semantic-db
+     "adam" create-node "adam" set
+     "eve" create-node "eve" set
+     "bob" create-node "bob" set
+     "fran" create-node "fran" set
+     "charlie" create-node "charlie" set
+     "gertrude" create-node "gertrude" set
+      [ ] [ "bob" get "adam" get has-parent ] unit-test
+     { { "bob" "eve" } { "fran" "eve" } { "gertrude" "bob" } { "fran" "bob" } { "charlie" "fran" } } [ first2 [ get ] bi@ has-parent ] each
+     [ { "bob" "fran" } ] [ "eve" get has-parent-relation children [ node-content ] map ] unit-test
+     [ { "adam" "eve" } ] [ "bob" get has-parent-relation parents [ node-content ] map ] unit-test
+     [ "fran" { "charlie" } ] [ "fran" get has-parent-relation get-node-tree-s dup node>> node-content swap children>> [ node>> node-content ] map ] unit-test
+     [ { "adam" "eve" } ] [ "charlie" get has-parent-relation get-root-nodes [ node-content ] map natural-sort >array ] unit-test
+     [ { } ] [ "charlie" get dup "fran" get !has-parent has-parent-relation parents [ node-content ] map ] unit-test
+     [ { "adam" "eve" } ] [ has-parent-relation ultimate-objects node-results [ node-content ] map ] unit-test
+     [ { "fran" "gertrude" } ] [ has-parent-relation ultimate-subjects node-results [ node-content ] map ] unit-test
+ ] with-db delete-db
index 2de0e1c67e4d3e66872edcc676f16638c1db8347..3044c8872f2ceeb3b955edce151b3955c1e4a442 100755 (executable)
 ! Copyright (C) 2008 Alex Chapman
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays continuations db db.tuples db.types db.sqlite kernel math math.parser sequences ;
+USING: accessors arrays combinators combinators.cleave combinators.lib
+continuations db db.tuples db.types db.sqlite kernel math
+math.parser namespaces parser sets sequences sequences.deep
+sequences.lib strings words ;
 IN: semantic-db
 
 TUPLE: node id content ;
-: <node> ( content -- node )
-    node new swap >>content ;
-
-: <id-node> ( id -- node )
-    node new swap >>id ;
+C: <node> node
 
 node "node"
 {
-    { "id" "id" +native-id+ +autoincrement+ }
+    { "id" "id" +db-assigned-id+ +autoincrement+ }
     { "content" "content" TEXT }
 } define-persistent
 
-: create-node-table ( -- )
-    node create-table ;
-
-: delete-node ( node-id -- )
-    <id-node> delete-tuple ;
+: delete-node ( node -- ) delete-tuples ;
+: create-node ( content -- node ) f swap <node> dup insert-tuple ;
+: load-node ( id -- node ) f <node> select-tuple ;
 
-: create-node* ( str -- node-id )
-    <node> dup insert-tuple id>> ;
+: node-content ( node -- content )
+    dup content>> [ nip ] [ select-tuple content>> ] if* ;
 
-: create-node ( str -- )
-    create-node* drop ;
+: node= ( node node -- ? ) [ id>> ] bi@ = ;
 
-: node-content ( id -- str )
-    f <node> swap >>id select-tuple content>> ;
+! TODO: get rid of arc id and write our own sql
+TUPLE: arc id subject object relation ;
 
-TUPLE: arc id relation subject object ;
-
-: <arc> ( relation subject object -- arc )
-    arc new swap >>object swap >>subject swap >>relation ;
+: <arc> ( subject object relation -- arc )
+    arc new swap >>relation swap >>object swap >>subject ;
 
 : <id-arc> ( id -- arc )
     arc new swap >>id ;
 
-: insert-arc ( arc -- )
-    f <node> dup insert-tuple id>> >>id insert-tuple ;
+: delete-arc ( arc -- ) delete-tuples ;
+
+: create-arc ( subject object relation -- )
+    [ id>> ] 3apply <arc> insert-tuple ;
+
+: nodes>arc ( subject object relation -- arc )
+    [ [ id>> ] [ f ] if* ] 3apply <arc> ;
+
+: select-arcs ( subject object relation -- arcs )
+    nodes>arc select-tuples ;
+
+: has-arc? ( subject object relation -- ? )
+    select-arcs length 0 > ;
 
-: delete-arc ( arc-id -- )
-    dup delete-node <id-arc> delete-tuple ;
+: select-arc-subjects ( subject object relation -- subjects )
+    select-arcs [ subject>> f <node> ] map ;
 
-: create-arc* ( relation subject object -- arc-id )
-    <arc> dup insert-arc id>> ;
+: select-arc-subject ( subject object relation -- subject )
+    select-arcs ?first [ subject>> f <node> ] [ f ] if* ;
 
-: create-arc ( relation subject object -- )
-    create-arc* drop ;
+: select-subjects ( object relation -- subjects )
+    f -rot select-arc-subjects ;
+
+: select-subject ( object relation -- subject )
+    f -rot select-arc-subject ;
+
+: select-arc-objects ( subject object relation -- objects )
+    select-arcs [ object>> f <node> ] map ;
+
+: select-arc-object ( subject object relation -- object )
+    select-arcs ?first [ object>> f <node> ] [ f ] if* ;
+
+: select-objects ( subject relation -- objects )
+    f swap select-arc-objects ;
+
+: select-object ( subject relation -- object )
+    f swap select-arc-object ;
+
+: delete-arcs ( subject object relation -- )
+    select-arcs [ delete-arc ] each ;
 
 arc "arc"
 {
-    { "id" "id" INTEGER +assigned-id+ } ! foreign key to node table?
+    { "id" "id" +db-assigned-id+ +autoincrement+ }
     { "relation" "relation" INTEGER +not-null+ }
     { "subject" "subject" INTEGER +not-null+ }
     { "object" "object" INTEGER +not-null+ }
 } define-persistent
 
-: create-arc-table ( -- )
-    arc create-table ;
-
 : create-bootstrap-nodes ( -- )
-    "semantic-db" create-node
-    "has context" create-node ;
+    "semantic-db" create-node drop
+    "has-context" create-node drop ;
 
-: semantic-db-context 1 ;
-: has-context-relation 2 ;
+: semantic-db-context  T{ node f 1 "semantic-db" } ;
+: has-context-relation T{ node f 2 "has-context" } ;
 
 : create-bootstrap-arcs ( -- )
-    has-context-relation has-context-relation semantic-db-context create-arc ;    
+    has-context-relation semantic-db-context has-context-relation create-arc ;
 
 : init-semantic-db ( -- )
-    create-node-table create-arc-table create-bootstrap-nodes create-bootstrap-arcs ;
+    node create-table arc create-table
+    create-bootstrap-nodes create-bootstrap-arcs ;
+
+! db utilities
+: results ( bindings sql -- array )
+    f f <simple-statement> [ do-bound-query ] with-disposal ;
+
+: node-result ( result -- node )
+    dup first string>number swap second <node> ;
+
+: ?1node-result ( results -- node )
+    ?first [ node-result ] [ f ] if* ;
+
+: node-results ( results -- nodes )
+    [ node-result ] map ;
 
 : param ( value key type -- param )
-    swapd 3array ;
+    swapd <sqlite-low-level-binding> ;
+
+: all-node-ids ( -- seq )
+    f "select n.id from node n" results [ first string>number ] map ;
+
+: subjects-with-cor ( content object relation -- sql-results )
+    [ id>> ] bi@
+    [
+        ":relation" INTEGER param ,
+        ":object" INTEGER param ,
+        ":content" TEXT param ,
+    ] { } make
+    "select n.id, n.content from node n, arc a where n.content = :content and n.id = a.subject and a.relation = :relation and a.object = :object" results ;
+
+: objects-with-csr ( content subject relation -- sql-results )
+    [ id>> ] bi@
+    [
+        ":relation" INTEGER param ,
+        ":subject" INTEGER param ,
+        ":content" TEXT param ,
+    ] { } make
+    "select n.id, n.content from node n, arc a where n.content = :content and n.id = a.object and a.relation = :relation and a.subject = :subject" results ;
+
+: (with-relation) ( content relation -- bindings sql )
+    id>> [ ":relation" INTEGER param , ":content" TEXT param , ] { } make
+    "select distinct n.id, n.content from node n, arc a where n.content = :content and a.relation = :relation" ;
+
+: subjects-with-relation ( content relation -- sql-results )
+    (with-relation) " and a.object = n.id" append results ;
+
+: objects-with-relation ( content relation -- sql-results )
+    (with-relation) " and a.subject = n.id" append results ;
+
+: (ultimate) ( relation b a -- sql-results )
+    [
+        "select distinct n.id, n.content from node n, arc a where a.relation = :relation and n.id = a." % % " and n.id not in (select b." % % " from arc b where b.relation = :relation)" %
+    ] "" make [ id>> ":relation" INTEGER param 1array ] dip results ;
+
+: ultimate-objects ( relation -- sql-results )
+    "subject" "object" (ultimate) ;
+
+: ultimate-subjects ( relation -- sql-results )
+    "object" "subject" (ultimate) ;
+
+! contexts:
+!  - a node n is a context iff there exists a relation r such that r has context n
+: create-context ( context-name -- context ) create-node ;
+
+: get-context ( context-name -- context/f )
+    has-context-relation subjects-with-relation ?1node-result ;
+
+: ensure-context ( context-name -- context )
+    dup get-context [
+        nip
+    ] [
+        create-context
+    ] if* ;
+
+! relations:
+!  - have a context in context 'semantic-db'
+
+: create-relation ( relation-name context -- relation )
+    [ create-node dup ] dip has-context-relation create-arc ;
+
+: get-relation ( relation-name context -- relation/f )
+    has-context-relation subjects-with-cor ?1node-result ;
+
+: ensure-relation ( relation-name context -- relation )
+    2dup get-relation [
+        2nip
+    ] [
+        create-relation
+    ] if* ;
+
+TUPLE: relation-definition relate id-word unrelate related? subjects objects ;
+C: <relation-definition> relation-definition
+
+<PRIVATE
+
+: default-word-name ( relate-word-name word-type -- word-name )
+    {
+        { "relate" [ ] }
+        { "id-word" [ "-relation" append ] }
+        { "unrelate" [ "!" swap append ] }
+        { "related?" [ "?" append ] }
+        { "subjects" [ "-subjects" append ] }
+        { "objects" [ "-objects" append ] }
+    } case ;
+
+: choose-word-name ( relation-definition given-word-name word-type -- word-name )
+    over string? [
+        drop nip
+    ] [
+        nip [ relate>> ] dip default-word-name
+    ] if ;
+
+: (define-relation-word) ( id-word word-name definition -- id-word )
+    >r create-in over [ execute ] curry r> compose define ;
+
+: define-relation-word ( relation-definition id-word given-word-name word-type definition -- relation-definition id-word )
+    >r >r [
+        pick swap r> choose-word-name r> (define-relation-word)
+    ] [
+        r> r> 2drop
+    ] if*  ;
+
+: define-relation-words ( relation-definition id-word -- )
+    over relate>> "relate" [ create-arc ] define-relation-word
+    over unrelate>> "unrelate" [ delete-arcs ] define-relation-word
+    over related?>> "related?" [ has-arc? ] define-relation-word
+    over subjects>> "subjects" [ select-subjects ] define-relation-word
+    over objects>> "objects" [ select-objects ] define-relation-word
+    2drop ;
+
+: define-id-word ( relation-definition id-word -- )
+    [ relate>> ] dip tuck word-vocabulary
+    [ ensure-context ensure-relation ] 2curry define ;
+
+: create-id-word ( relation-definition -- id-word )
+    dup id-word>> "id-word" choose-word-name create-in ;
+
+PRIVATE>
+
+: define-relation ( relation-definition -- )
+    dup create-id-word 2dup define-id-word define-relation-words ;
+
+: RELATION:
+    scan t t t t t <relation-definition> define-relation ; parsing
+
+! hierarchy
+TUPLE: node-tree node children ;
+C: <node-tree> node-tree
+
+: children ( node has-parent-relation -- children ) select-subjects ;
+: parents ( node has-parent-relation -- parents ) select-objects ;
+
+: get-node-tree ( node child-selector -- node-tree )
+    2dup call >r [ get-node-tree ] curry r> swap map <node-tree> ;
+
+! : get-node-tree ( node has-parent-relation -- node-tree )
+!     2dup children >r [ get-node-tree ] curry r> swap map <node-tree> ;
+: get-node-tree-s ( node has-parent-relation -- tree )
+    [ select-subjects ] curry get-node-tree ;
+
+: get-node-tree-o ( node has-child-relation -- tree )
+    [ select-objects ] curry get-node-tree ;
+
+: (get-node-chain) ( node next-selector seq -- seq )
+    pick [
+        over push >r [ call ] keep r> (get-node-chain)
+    ] [
+        2nip
+    ] if* ;
+
+: get-node-chain ( node next-selector -- seq )
+    V{ } clone (get-node-chain) ;
+
+: get-node-chain-o ( node relation -- seq )
+    [ select-object ] curry get-node-chain ;
+
+: get-node-chain-s ( node relation -- seq )
+    [ select-subject ] curry get-node-chain ;
 
-: single-int-results ( bindings sql -- array )
-    f f <simple-statement> [ do-bound-query ] with-disposal
-    [ first string>number ] map ;
+: (get-root-nodes) ( node has-parent-relation -- root-nodes/node )
+    2dup parents dup empty? [
+        2drop
+    ] [
+        >r nip [ (get-root-nodes) ] curry r> swap map
+    ] if ;
 
-: ensure2 ( x y quot1 quot2 -- z )
-    #! quot1 ( x y -- z/f ) finds an existing z
-    #! quot2 ( x y -- z ) creates a new z if quot1 returns f
-    >r >r 2dup r> call [ 2nip ] r> if* ;
+: get-root-nodes ( node has-parent-relation -- root-nodes )
+    (get-root-nodes) flatten prune ;
 
index b98dbfc50f75bf99159ed96b8092c1fee3ab73d9..3dc560f46d9201b7300a5b3c24636bae6dcf54bd 100644 (file)
@@ -9,7 +9,7 @@ HELP: deep-map
 { $values { "obj" "an object" } { "quot" "a quotation ( elt -- newelt )" } { "newobj" "the mapped object" } }
 { $description "Execute a quotation on each nested element of an object and its children, in preorder. That is, the result of the execution of the quotation on the outer is used to map the inner elements." } ;
 
-HELP: deep-subset
+HELP: deep-filter
 { $values { "obj" "an object" } { "quot" "a quotation ( elt -- ? )" } { "seq" "a sequence" } }
 { $description "Creates a sequence of sub-nodes in the object which satisfy the given quotation, in preorder. This includes the object itself, if it passes the quotation." } ;
 
index 9629d569cbdd1271c241089850ec41688514bd5c..395086e2025b48c45012bddf20023be3bc3236cd 100755 (executable)
@@ -4,11 +4,11 @@ IN: sequences.deep.tests
 
 [ [ "hello" 3 4 swap ] ] [ [ { "hello" V{ 3 4 } } swap ] flatten ] unit-test
 
-[ "foo" t ] [ { { "foo" } "bar" } [ string? ] deep-find* ] unit-test
+[ "foo" t ] [ { { "foo" } "bar" } [ string? ] deep-find-from ] unit-test
 
-[ f f ] [ { { "foo" } "bar" } [ number? ] deep-find* ] unit-test
+[ f f ] [ { { "foo" } "bar" } [ number? ] deep-find-from ] unit-test
 
-[ { { "foo" } "bar" } t ] [ { { "foo" } "bar" } [ array? ] deep-find* ] unit-test
+[ { { "foo" } "bar" } t ] [ { { "foo" } "bar" } [ array? ] deep-find-from ] unit-test
 
 : change-something ( seq -- newseq )
     dup array? [ "hi" suffix ] [ "hello" append ] if ;
index 27b875bd8faa472aa4fa38e978051ccdee4dcdfc..c0e516e47153632566a8680ea0a66d724c5df360 100644 (file)
@@ -18,21 +18,21 @@ IN: sequences.deep
     [ call ] keep over branch?
     [ [ deep-map ] curry map ] [ drop ] if ; inline
 
-: deep-subset ( obj quot -- seq )
+: deep-filter ( obj quot -- seq )
     over >r
     pusher >r deep-each r>
     r> dup branch? [ like ] [ drop ] if ; inline
 
-: deep-find* ( obj quot -- elt ? )
+: deep-find-from ( obj quot -- elt ? )
     [ call ] 2keep rot [ drop t ] [
         over branch? [
-            f -rot [ >r nip r> deep-find* ] curry find drop >boolean
+            f -rot [ >r nip r> deep-find-from ] curry find drop >boolean
         ] [ 2drop f f ] if  
     ] if ; inline
 
-: deep-find ( obj quot -- elt ) deep-find* drop ; inline
+: deep-find ( obj quot -- elt ) deep-find-from drop ; inline
 
-: deep-contains? ( obj quot -- ? ) deep-find* nip ; inline
+: deep-contains? ( obj quot -- ? ) deep-find-from nip ; inline
 
 : deep-all? ( obj quot -- ? )
     [ not ] compose deep-contains? not ; inline
@@ -43,4 +43,4 @@ IN: sequences.deep
     ] curry change-each ] [ 2drop ] if ; inline
 
 : flatten ( obj -- seq )
-    [ branch? not ] deep-subset ;
+    [ branch? not ] deep-filter ;
index 62cd0adce1ec8dba528ba556695b8915b639fa2f..0dc5601cd011279d7129d9285bce501a533147bb 100755 (executable)
@@ -4,7 +4,7 @@
 USING: combinators.lib kernel sequences math namespaces assocs 
 random sequences.private shuffle math.functions mirrors
 arrays math.parser math.private sorting strings ascii macros
-assocs.lib quotations hashtables ;
+assocs.lib quotations hashtables math.order ;
 IN: sequences.lib
 
 : each-withn ( seq quot n -- ) nwith each ; inline
@@ -45,14 +45,14 @@ MACRO: firstn ( n -- )
   >r
   dup length
   dup [ / ] curry
-  [ 1+ ] swap compose
+  [ 1+ ] prepose
   r> compose
   2each ;                       inline
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 : sigma ( seq quot -- n )
-    [ rot slip + ] curry 0 swap reduce ; inline
+    [ + ] compose 0 swap reduce ; inline
 
 : count ( seq quot -- n )
     [ 1 0 ? ] compose sigma ; inline
@@ -66,9 +66,9 @@ MACRO: firstn ( n -- )
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
-: higher ( a b quot -- c ) [ compare 0 > ] curry most ; inline
+: higher ( a b quot -- c ) [ compare +gt+ eq? ] curry most ; inline
 
-: lower  ( a b quot -- c ) [ compare 0 < ] curry most ; inline
+: lower  ( a b quot -- c ) [ compare +lt+ eq? ] curry most ; inline
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -117,7 +117,7 @@ MACRO: firstn ( n -- )
 
 : split-around ( seq quot -- before elem after )
     dupd find over [ "Element not found" throw ] unless
-    >r cut 1 tail r> swap ; inline
+    >r cut rest r> swap ; inline
 
 : (map-until) ( quot pred -- quot )
     [ dup ] swap 3compose
@@ -129,7 +129,11 @@ MACRO: firstn ( n -- )
 : take-while ( seq quot -- newseq )
     [ not ] compose
     [ find drop [ head-slice ] when* ] curry
-    [ dup ] swap compose keep like ;
+    [ dup ] prepose keep like ;
+
+: replicate ( seq quot -- newseq )
+    #! quot: ( -- obj )
+    [ drop ] prepose map ; inline
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -155,7 +159,7 @@ PRIVATE>
 
 : switches ( seq1 seq -- subseq )
     ! seq1 is a sequence of ones and zeroes
-    >r [ length ] keep [ nth 1 = ] curry subset r>
+    >r [ length ] keep [ nth 1 = ] curry filter r>
     [ nth ] curry { } map-as ;
 
 : power-set ( seq -- subsets )
@@ -212,7 +216,7 @@ USE: continuations
   >r dup length swap r>
   [ = [ ] [ drop f ] if ] curry
   2map
-  [ ] subset ;
+  [ ] filter ;
 
 <PRIVATE
 : (attempt-each-integer) ( i n quot -- result )
@@ -235,4 +239,7 @@ PRIVATE>
     zip >hashtable substitute ;
 
 : remove-nth ( seq n -- seq' )
-    cut-slice 1 tail-slice append ;
+    cut-slice rest-slice append ;
+
+: short ( seq n -- seq n' )
+    over length min ; inline
index bb69a8a41ccd9ba1264e77b3686199e9df4e83e2..fcf57714d679cea440aeaf22783f46bba186bb18 100755 (executable)
@@ -111,7 +111,7 @@ M: tuple (serialize) ( obj -- )
         CHAR: T write1
         [ class (serialize) ]
         [ add-object ]
-        [ tuple>array 1 tail (serialize) ]
+        [ tuple>array rest (serialize) ]
         tri
     ] serialize-shared ;
 
@@ -230,6 +230,7 @@ SYMBOL: deserialized
 : deserialize-word ( -- word )
     (deserialize) (deserialize) 2dup lookup
     dup [ 2nip ] [
+        drop
         "Unknown word: " -rot
         2array unparse append throw
     ] if ;
index 33587bb7fafa40f2a4833f2ddf0e9dbc2af6d852..89522d1f76b685fefe88f0c8f1baee3458a4ff80 100644 (file)
@@ -5,6 +5,8 @@ USING: kernel sequences namespaces math inference.transforms
 
 IN: shuffle
 
+: 2dip -rot 2slip ; inline
+
 MACRO: npick ( n -- ) 1- dup saver [ dup ] rot [ r> swap ] n*quot 3append ;
 
 MACRO: ndup ( n -- ) dup [ npick ] curry n*quot ;
diff --git a/extra/shufflers/authors.txt b/extra/shufflers/authors.txt
deleted file mode 100644 (file)
index f990dd0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Daniel Ehrenberg
diff --git a/extra/shufflers/shufflers-docs.factor b/extra/shufflers/shufflers-docs.factor
deleted file mode 100644 (file)
index ac37253..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-USING: help.syntax help.markup ;
-IN: shufflers
-
-HELP: SHUFFLE:
-{ $syntax "SHUFFLE: alphabet #" }
-{ $values { "alphabet" "an alphabet of unique letters" } { "#" "the maximum length" } }
-{ $description "Defines stack shufflers of the form abc-bcba where 'abc' describes the inputs and 'bcba' describes the outputs. Given a stack of 1 2 3, this returns 2 3 2 1. The stack shufflers defined are put in the current vocab with the suffix '.shuffle' appended." }
-{ $examples
-"SHUFFLE: abcd 6\n"
-": 4drop abcd- ;\n"
-": 2over abcd-abcdab ;\n"
-": 2swap abcd-cdab ;\n"
-": 3dup abc-abcabc ;\n" } ;
diff --git a/extra/shufflers/shufflers-tests.factor b/extra/shufflers/shufflers-tests.factor
deleted file mode 100644 (file)
index 5bcdab8..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-USING: shufflers tools.test ;
-
-SHUFFLE: abcd 4
-[ ] [ 1 2 3 4 abcd- ] unit-test
-[ 1 2 1 2 ] [ 1 2 3 abc-abab ] unit-test
-[ 4 3 2 1 ] [ 1 2 3 4 abcd-dcba ] unit-test
-[ 1 1 1 1 ] [ 1 a-aaaa ] unit-test
diff --git a/extra/shufflers/shufflers.factor b/extra/shufflers/shufflers.factor
deleted file mode 100644 (file)
index b11668a..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-USING: kernel sequences words math math.functions arrays 
-shuffle quotations parser math.parser strings namespaces 
-splitting effects sequences.lib ;
-IN: shufflers
-
-: shuffle>string ( names shuffle -- string )
-    swap [ [ nth ] curry map ] curry map
-    first2 "-" swap 3append >string ;
-
-: make-shuffles ( max-out max-in -- shuffles )
-    [ 1+ dup rot strings [ 2array ] with map ]
-    with map concat ;
-
-: shuffle>quot ( shuffle -- quot )
-    [
-        first2 2dup [ - ] with map
-        reverse [ , \ npick , \ >r , ] each
-        swap , \ ndrop , length [ \ r> , ] times
-    ] [ ] make ;
-
-: put-effect ( word -- )
-    dup word-name "-" split1
-    [ >array [ 1string ] map ] bi@
-    <effect> "declared-effect" set-word-prop ;
-
-: in-shuffle ( -- ) in get ".shuffle" append set-in ;
-: out-shuffle ( -- ) in get ".shuffle" ?tail drop set-in ;
-
-: define-shuffles ( names max-out -- )
-    in-shuffle over length make-shuffles [
-        [ shuffle>string create-in ] keep
-        shuffle>quot dupd define put-effect
-    ] with each out-shuffle ;
-
-: SHUFFLE:
-    scan scan string>number define-shuffles ; parsing
diff --git a/extra/shufflers/summary.txt b/extra/shufflers/summary.txt
deleted file mode 100644 (file)
index 37b87be..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Arbitrary stack shuffling operators of the form abc-cbab
diff --git a/extra/shufflers/tags.txt b/extra/shufflers/tags.txt
deleted file mode 100644 (file)
index f427429..0000000
+++ /dev/null
@@ -1 +0,0 @@
-extensions
index 5b6f26acea8d17646904669a91b0e8a5470d82e0..a2b47fc0aab9f72a6f75ce44f6ee541233ba28d2 100644 (file)
@@ -36,4 +36,4 @@ VAR: headers
   { "gcc" c-file "-o" exe } to-strings
   [ "Error compiling generated C program" print ] run-or-bail
 
-  exe ascii <process-stream> contents string>number ;
\ No newline at end of file
+  exe ascii <process-reader> contents string>number ;
\ No newline at end of file
index 737a887f9fa868d12adb66e8767cc4fc2dc84414..f23ee138d5be4dc5059cc8ed70063eced4784571 100755 (executable)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2007 Elie CHAFTARI
 ! See http://factorcode.org/license.txt for BSD license.
 USING: combinators kernel prettyprint io io.timeouts io.server
-sequences namespaces io.sockets continuations calendar io.encodings.ascii ;
+sequences namespaces io.sockets continuations calendar
+io.encodings.ascii io.streams.duplex ;
 IN: smtp.server
 
 ! Mock SMTP server for testing purposes.
@@ -65,7 +66,7 @@ SYMBOL: data-mode
     "Starting SMTP server on port " write dup . flush
     "127.0.0.1" swap <inet4> ascii <server> [
         accept drop [
-            1 minutes stdio get set-timeout
+            1 minutes timeouts
             "220 hello\r\n" write flush
             process
             global [ flush ] bind
index 1d22ed731a6108b20487479b32c26360e992594d..162512f9f3e3db84db708e096a965014e1c94605 100755 (executable)
@@ -63,7 +63,7 @@ IN: smtp.tests
     prepare
     dup headers>> >alist sort-keys [
         drop { "Date" "Message-Id" } member? not
-    ] assoc-subset
+    ] assoc-filter
     over to>>
     rot from>>
 ] unit-test
index d565117e5fdffe66b477a23b5ce4f15567a4e44e..8fdc0e07a4cf04cdf61a9a2429accc93c856276a 100755 (executable)
@@ -17,11 +17,11 @@ LOG: log-smtp-connection NOTICE ( addrspec -- )
 : with-smtp-connection ( quot -- )
     smtp-server get
     dup log-smtp-connection
-    ascii <client> [
+    ascii [
         smtp-domain [ host-name or ] change
-        read-timeout get stdio get set-timeout
+        read-timeout get timeouts
         call
-    ] with-stream ; inline
+    ] with-client ; inline
 
 : crlf "\r\n" write ;
 
@@ -131,7 +131,7 @@ M: email clone
         "-" %
         millis #
         "@" %
-        smtp-domain get %
+        smtp-domain get [ host-name ] unless* %
         ">" %
     ] "" make ;
 
index 200257b31c53ef442a1aa502be553ca3191288e4..f773d331b1266a7dd5532f3f6b103a8e5bd9493b 100755 (executable)
@@ -45,21 +45,21 @@ TUPLE: space-invaders port1 port2i port2o port3o port4lo port4hi port5o bitmap s
 
 : init-sound ( index cpu filename  -- )
   swapd >r space-invaders-sounds nth AL_BUFFER r> 
-  resource-path create-buffer-from-wav set-source-param ; 
+  create-buffer-from-wav set-source-param ; 
 
 : init-sounds ( cpu -- )
   init-openal
   [ 9 gen-sources swap set-space-invaders-sounds ] keep
-  [ SOUND-SHOT        "extra/space-invaders/resources/Shot.wav" init-sound ] keep 
-  [ SOUND-UFO         "extra/space-invaders/resources/Ufo.wav" init-sound ] keep 
+  [ SOUND-SHOT        "resource:extra/space-invaders/resources/Shot.wav" init-sound ] keep 
+  [ SOUND-UFO         "resource:extra/space-invaders/resources/Ufo.wav" init-sound ] keep 
   [ space-invaders-sounds SOUND-UFO swap nth AL_LOOPING AL_TRUE set-source-param ] keep
-  [ SOUND-BASE-HIT    "extra/space-invaders/resources/BaseHit.wav" init-sound ] keep 
-  [ SOUND-INVADER-HIT "extra/space-invaders/resources/InvHit.wav" init-sound ] keep 
-  [ SOUND-WALK1       "extra/space-invaders/resources/Walk1.wav" init-sound ] keep 
-  [ SOUND-WALK2       "extra/space-invaders/resources/Walk2.wav" init-sound ] keep 
-  [ SOUND-WALK3       "extra/space-invaders/resources/Walk3.wav" init-sound ] keep 
-  [ SOUND-WALK4       "extra/space-invaders/resources/Walk4.wav" init-sound ] keep 
-  [ SOUND-UFO-HIT    "extra/space-invaders/resources/UfoHit.wav" init-sound ] keep
+  [ SOUND-BASE-HIT    "resource:extra/space-invaders/resources/BaseHit.wav" init-sound ] keep 
+  [ SOUND-INVADER-HIT "resource:extra/space-invaders/resources/InvHit.wav" init-sound ] keep 
+  [ SOUND-WALK1       "resource:extra/space-invaders/resources/Walk1.wav" init-sound ] keep 
+  [ SOUND-WALK2       "resource:extra/space-invaders/resources/Walk2.wav" init-sound ] keep 
+  [ SOUND-WALK3       "resource:extra/space-invaders/resources/Walk3.wav" init-sound ] keep 
+  [ SOUND-WALK4       "resource:extra/space-invaders/resources/Walk4.wav" init-sound ] keep 
+  [ SOUND-UFO-HIT    "resource:extra/space-invaders/resources/UfoHit.wav" init-sound ] keep
   f swap set-space-invaders-looping? ;
 
 : <space-invaders> ( -- cpu )
diff --git a/extra/spheres/authors.txt b/extra/spheres/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/extra/spheres/spheres.factor b/extra/spheres/spheres.factor
new file mode 100644 (file)
index 0000000..9d06987
--- /dev/null
@@ -0,0 +1,284 @@
+USING: kernel opengl.demo-support opengl.gl opengl.shaders opengl.framebuffers
+opengl multiline ui.gadgets accessors sequences ui.render ui math 
+arrays arrays.lib combinators ;
+IN: spheres
+
+STRING: plane-vertex-shader
+varying vec3 object_position;
+void
+main()
+{
+    object_position = gl_Vertex.xyz;
+    gl_Position = ftransform();
+}
+;
+
+STRING: plane-fragment-shader
+varying vec3 object_position;
+void
+main()
+{
+    float distance_factor = (gl_FragCoord.z * 0.5 + 0.5);
+    distance_factor = pow(distance_factor, 500.0)*0.5;
+    
+    gl_FragColor = fract((floor(0.125*object_position.x)+floor(0.125*object_position.z)) * 0.5) == 0.0
+        ? vec4(1.0, 1.0 - distance_factor, 1.0 - distance_factor, 1.0)
+        : vec4(1.0, distance_factor, distance_factor, 1.0);
+}
+;
+
+STRING: sphere-vertex-shader
+attribute vec3 center;
+attribute float radius;
+attribute vec4 surface_color;
+varying float vradius;
+varying vec3 sphere_position;
+varying vec4 world_position, vcolor;
+
+void
+main()
+{
+    world_position = gl_ModelViewMatrix * vec4(center, 1);
+    sphere_position = gl_Vertex.xyz;
+    
+    gl_Position = gl_ProjectionMatrix * (world_position + vec4(sphere_position * radius, 0));
+    
+    vcolor = surface_color;
+    vradius = radius;
+}
+;
+
+STRING: sphere-solid-color-fragment-shader
+uniform vec3 light_position;
+varying vec4 vcolor;
+
+const vec4 ambient = vec4(0.25, 0.2, 0.25, 1.0);
+const vec4 diffuse = vec4(0.75, 0.8, 0.75, 1.0);
+
+vec4
+sphere_color(vec3 point, vec3 normal)
+{
+    vec3 transformed_light_position = (gl_ModelViewMatrix * vec4(light_position, 1)).xyz;
+    vec3 direction = normalize(transformed_light_position - point);
+    float d = max(0.0, dot(normal, direction));
+    
+    return ambient * vcolor + diffuse * vec4(d * vcolor.rgb, vcolor.a);
+}
+;
+
+STRING: sphere-texture-fragment-shader
+uniform samplerCube surface_texture;
+
+vec4
+sphere_color(vec3 point, vec3 normal)
+{
+    vec3 reflect = reflect(normalize(point), normal);
+    return textureCube(surface_texture, reflect * gl_NormalMatrix);
+}
+;
+
+STRING: sphere-main-fragment-shader
+varying float vradius;
+varying vec3 sphere_position;
+varying vec4 world_position;
+
+vec4 sphere_color(vec3 point, vec3 normal);
+
+void
+main()
+{
+       float radius = length(sphere_position);
+       if(radius > 1.0) discard;
+       
+       vec3 surface = sphere_position + vec3(0.0, 0.0, sqrt(1.0 - radius*radius));
+       vec4 world_surface = world_position + vec4(surface * vradius, 0);
+       vec4 transformed_surface = gl_ProjectionMatrix * world_surface;
+       
+    gl_FragDepth = (transformed_surface.z/transformed_surface.w + 1.0) * 0.5;
+       gl_FragColor = sphere_color(world_surface.xyz, surface);
+}
+;
+
+TUPLE: spheres-gadget
+    plane-program solid-sphere-program texture-sphere-program
+    reflection-framebuffer reflection-depthbuffer
+    reflection-texture ;
+
+: <spheres-gadget> ( -- gadget )
+    20.0 10.0 20.0 <demo-gadget>
+    { set-delegate } spheres-gadget construct ;
+
+M: spheres-gadget near-plane ( gadget -- z )
+    drop 1.0 ;
+M: spheres-gadget far-plane ( gadget -- z )
+    drop 512.0 ;
+M: spheres-gadget distance-step ( gadget -- dz )
+    drop 0.5 ;
+
+: (reflection-dim) ( -- w h )
+    512 512 ;
+
+: (make-reflection-texture) ( -- texture )
+    gen-texture [
+        GL_TEXTURE_CUBE_MAP swap glBindTexture
+        GL_TEXTURE_CUBE_MAP GL_TEXTURE_MAG_FILTER GL_LINEAR glTexParameteri
+        GL_TEXTURE_CUBE_MAP GL_TEXTURE_MIN_FILTER GL_LINEAR glTexParameteri
+        GL_TEXTURE_CUBE_MAP GL_TEXTURE_WRAP_S GL_CLAMP glTexParameteri
+        GL_TEXTURE_CUBE_MAP GL_TEXTURE_WRAP_T GL_CLAMP glTexParameteri
+        GL_TEXTURE_CUBE_MAP GL_TEXTURE_WRAP_R GL_CLAMP glTexParameteri
+        GL_TEXTURE_CUBE_MAP_POSITIVE_X
+        GL_TEXTURE_CUBE_MAP_POSITIVE_Y
+        GL_TEXTURE_CUBE_MAP_POSITIVE_Z
+        GL_TEXTURE_CUBE_MAP_NEGATIVE_X
+        GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
+        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 6 narray
+        [ 0 GL_RGBA8 (reflection-dim) 0 GL_RGBA GL_UNSIGNED_BYTE f glTexImage2D ]
+        each
+    ] keep ;
+
+: (make-reflection-depthbuffer) ( -- depthbuffer )
+    gen-renderbuffer [
+        GL_RENDERBUFFER_EXT swap glBindRenderbufferEXT
+        GL_RENDERBUFFER_EXT GL_DEPTH_COMPONENT32 (reflection-dim) glRenderbufferStorageEXT
+    ] keep ;
+
+: (make-reflection-framebuffer) ( depthbuffer -- framebuffer )
+    gen-framebuffer dup [
+        swap >r
+        GL_FRAMEBUFFER_EXT GL_DEPTH_ATTACHMENT_EXT GL_RENDERBUFFER_EXT r>
+        glFramebufferRenderbufferEXT
+    ] with-framebuffer ;
+
+: (plane-program) ( -- program )
+    plane-vertex-shader plane-fragment-shader <simple-gl-program> ;
+: (solid-sphere-program) ( -- program )
+    sphere-vertex-shader <vertex-shader> check-gl-shader
+    sphere-solid-color-fragment-shader <fragment-shader> check-gl-shader
+    sphere-main-fragment-shader <fragment-shader> check-gl-shader
+    3array <gl-program> check-gl-program ;
+: (texture-sphere-program) ( -- program )
+    sphere-vertex-shader <vertex-shader> check-gl-shader
+    sphere-texture-fragment-shader <fragment-shader> check-gl-shader
+    sphere-main-fragment-shader <fragment-shader> check-gl-shader
+    3array <gl-program> check-gl-program ;
+
+M: spheres-gadget graft* ( gadget -- )
+    (plane-program) >>plane-program
+    (solid-sphere-program) >>solid-sphere-program
+    (texture-sphere-program) >>texture-sphere-program
+    (make-reflection-texture) >>reflection-texture
+    (make-reflection-depthbuffer) [ >>reflection-depthbuffer ] keep
+    (make-reflection-framebuffer) >>reflection-framebuffer
+    drop ;
+
+M: spheres-gadget ungraft* ( gadget -- )
+    {
+        [ reflection-framebuffer>> [ delete-framebuffer ] when* ]
+        [ reflection-depthbuffer>> [ delete-renderbuffer ] when* ]
+        [ reflection-texture>> [ delete-texture ] when* ]
+        [ solid-sphere-program>> [ delete-gl-program ] when* ]
+        [ texture-sphere-program>> [ delete-gl-program ] when* ]
+        [ plane-program>> [ delete-gl-program ] when* ]
+    } cleave ;
+
+M: spheres-gadget pref-dim* ( gadget -- dim )
+    drop { 640 480 } ;
+    
+: (draw-sphere) ( program center radius surfacecolor -- )
+    roll
+    [ [ "center" glGetAttribLocation swap first3 glVertexAttrib3f ] curry ]
+    [ [ "radius" glGetAttribLocation swap glVertexAttrib1f ] curry ]
+    [ [ "surface_color" glGetAttribLocation swap first4 glVertexAttrib4f ] curry ]
+    tri tri*
+    { -1.0 -1.0 } { 1.0 1.0 } rect-vertices ;
+
+: sphere-scene ( gadget -- )
+    GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT bitor glClear
+    [
+        solid-sphere-program>> dup {
+            { "light_position" [ 0.0 0.0 100.0 glUniform3f ] }
+        } [
+            {
+                [ {  7.0  0.0  0.0 } 1.0 { 1.0 0.0 0.0 1.0 } (draw-sphere) ]
+                [ { -7.0  0.0  0.0 } 1.0 { 0.0 1.0 0.0 1.0 } (draw-sphere) ]
+                [ {  0.0  0.0  7.0 } 1.0 { 0.0 0.0 1.0 1.0 } (draw-sphere) ]
+                [ {  0.0  0.0 -7.0 } 1.0 { 1.0 1.0 0.0 1.0 } (draw-sphere) ]
+                [ {  0.0  7.0  0.0 } 1.0 { 1.0 0.0 1.0 1.0 } (draw-sphere) ]
+                [ {  0.0 -7.0  0.0 } 1.0 { 0.0 1.0 1.0 1.0 } (draw-sphere) ]
+            } cleave
+        ] with-gl-program
+    ] [
+        plane-program>> { } [
+            GL_QUADS [
+                -1000.0 -30.0  1000.0 glVertex3f
+                -1000.0 -30.0 -1000.0 glVertex3f
+                 1000.0 -30.0 -1000.0 glVertex3f
+                 1000.0 -30.0  1000.0 glVertex3f
+            ] do-state
+        ] with-gl-program
+    ] bi ;
+
+: reflection-frustum ( gadget -- -x x -y y near far )
+    [ near-plane ] [ far-plane ] bi [
+        drop dup [ -+ ] bi@
+    ] 2keep ;
+
+: (reflection-face) ( gadget face -- )
+    swap reflection-texture>> >r >r
+    GL_FRAMEBUFFER_EXT
+    GL_COLOR_ATTACHMENT0_EXT
+    r> r> 0 glFramebufferTexture2DEXT
+    check-framebuffer ;
+
+: (draw-reflection-texture) ( gadget -- )
+    dup reflection-framebuffer>> [ {
+        [ drop 0 0 (reflection-dim) glViewport ]
+        [
+            GL_PROJECTION glMatrixMode
+            glLoadIdentity
+            reflection-frustum glFrustum
+            GL_MODELVIEW glMatrixMode
+            glLoadIdentity
+            180.0 0.0 0.0 1.0 glRotatef
+        ]
+        [ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z (reflection-face) ]
+        [ sphere-scene ]
+        [ GL_TEXTURE_CUBE_MAP_POSITIVE_X (reflection-face)
+          90.0 0.0 1.0 0.0 glRotatef ]
+        [ sphere-scene ]
+        [ GL_TEXTURE_CUBE_MAP_POSITIVE_Z (reflection-face)
+          90.0 0.0 1.0 0.0 glRotatef glPushMatrix ]
+        [ sphere-scene ]
+        [ GL_TEXTURE_CUBE_MAP_NEGATIVE_X (reflection-face)
+          90.0 0.0 1.0 0.0 glRotatef ]
+        [ sphere-scene ]
+        [ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y (reflection-face)
+          glPopMatrix glPushMatrix -90.0 1.0 0.0 0.0 glRotatef ]
+        [ sphere-scene ]
+        [ GL_TEXTURE_CUBE_MAP_POSITIVE_Y (reflection-face)
+          glPopMatrix 90.0 1.0 0.0 0.0 glRotatef ]
+        [ sphere-scene ]
+        [ dim>> 0 0 rot first2 glViewport ]
+    } cleave ] with-framebuffer ;
+
+M: spheres-gadget draw-gadget* ( gadget -- )
+    GL_DEPTH_TEST glEnable
+    GL_SCISSOR_TEST glDisable
+    0.15 0.15 1.0 1.0 glClearColor {
+        [ (draw-reflection-texture) ]
+        [ demo-gadget-set-matrices ]
+        [ sphere-scene ]
+        [ reflection-texture>> GL_TEXTURE_CUBE_MAP GL_TEXTURE0 bind-texture-unit ]
+        [
+            texture-sphere-program>> dup {
+                { "surface_texture" [ 0 glUniform1i ] }
+            } [
+                { 0.0 0.0 0.0 } 4.0 { 1.0 0.0 0.0 1.0 } (draw-sphere)
+            ] with-gl-program
+        ]
+    } cleave ;
+
+: spheres-window ( -- )
+    [ <spheres-gadget> "Spheres" open-window ] with-ui ;
+
+MAIN: spheres-window
diff --git a/extra/spheres/summary.txt b/extra/spheres/summary.txt
new file mode 100644 (file)
index 0000000..fd97091
--- /dev/null
@@ -0,0 +1 @@
+Draw pixel-perfect spheres using GLSL shaders
\ No newline at end of file
diff --git a/extra/spheres/tags.txt b/extra/spheres/tags.txt
new file mode 100644 (file)
index 0000000..2e6040b
--- /dev/null
@@ -0,0 +1,2 @@
+opengl
+glsl
index 7ef28694521b39170d5f9093ed89b9955bb3be27..3027c01c19531544f5ca4665b9c2a3bb75b7ea4f 100644 (file)
@@ -13,7 +13,7 @@ ARTICLE: { "state-parser" "main" } "State-based parsing"
     { $subsection next }
     { $subsection state-parse }
     { $subsection get-char }
-    { $subsection rest }
+    { $subsection take-rest }
     { $subsection string-parse }
     { $subsection expect }
     { $subsection expect-string }
@@ -23,7 +23,7 @@ HELP: get-char
 { $values { "char" "the current character" } }
 { $description "Accesses the current character of the stream that is being parsed" } ;
 
-HELP: rest
+HELP: take-rest
 { $values { "string" "the rest of the parser input" } }
 { $description "Exausts the stream of the parser input and returns a string representing the rest of the input" } ;
 
@@ -69,4 +69,4 @@ HELP: next
 { $description "originally written as " { $code "spot inc" } ", code that would no longer run, this word moves the state of the XML parser to the next place in the source file, keeping track of appropriate debugging information." } ;
 
 HELP: parsing-error
-{ $class-description "class to which parsing errors delegate, containing information about which line and column the error occured on, and what the line was. Contains three slots, line, an integer, column, another integer, and line-str, a string" } ;
+{ $class-description "class from which parsing errors inherit, containing information about which line and column the error occured on, and what the line was. Contains three slots, line, an integer, column, another integer, and line-str, a string" } ;
index 4e1ecaddfc56b657df7c48d0e39016d552f7f789..e0b274b3e6e17a682cc0ed1ac3ebb5e56c2a45ee 100755 (executable)
@@ -1,8 +1,8 @@
 USING: tools.test state-parser kernel io strings ascii ;
 
-[ "hello" ] [ "hello" [ rest ] string-parse ] unit-test
-[ 2 4 ] [ "12\n123" [ rest drop get-line get-column ] string-parse ] unit-test
-[ "hi" " how are you?" ] [ "hi how are you?" [ [ get-char blank? ] take-until rest ] string-parse ] unit-test
-[ "foo" ";bar" ] [ "foo;bar" [ CHAR: ; take-char rest ] string-parse ] unit-test
-[ "foo " " bar" ] [ "foo and bar" [ "and" take-string rest ] string-parse ] unit-test
-[ "baz" ] [ " \n\t baz" [ pass-blank rest ] string-parse ] unit-test
+[ "hello" ] [ "hello" [ take-rest ] string-parse ] unit-test
+[ 2 4 ] [ "12\n123" [ take-rest drop get-line get-column ] string-parse ] unit-test
+[ "hi" " how are you?" ] [ "hi how are you?" [ [ get-char blank? ] take-until take-rest ] string-parse ] unit-test
+[ "foo" ";bar" ] [ "foo;bar" [ CHAR: ; take-char take-rest ] string-parse ] unit-test
+[ "foo " " bar" ] [ "foo and bar" [ "and" take-string take-rest ] string-parse ] unit-test
+[ "baz" ] [ " \n\t baz" [ pass-blank take-rest ] string-parse ] unit-test
index 6a3bf1d5528873cfdcfb2f5218e5c53497bce0be..b41d7f5023865356dca6406d6c0bafae6eb1bb87 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2005, 2006 Daniel Ehrenberg\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: io io.streams.string kernel math namespaces sequences\r
-strings circular prettyprint debugger ascii ;\r
+strings circular prettyprint debugger ascii sbufs fry inspector\r
+accessors sequences.lib ;\r
 IN: state-parser\r
 \r
 ! * Basic underlying words\r
@@ -11,50 +12,56 @@ TUPLE: spot char line column next ;
 \r
 C: <spot> spot\r
 \r
-: get-char ( -- char ) spot get spot-char ;\r
-: set-char ( char -- ) spot get set-spot-char ;\r
-: get-line ( -- line ) spot get spot-line ;\r
-: set-line ( line -- ) spot get set-spot-line ;\r
-: get-column ( -- column ) spot get spot-column ;\r
-: set-column ( column -- ) spot get set-spot-column ;\r
-: get-next ( -- char ) spot get spot-next ;\r
-: set-next ( char -- ) spot get set-spot-next ;\r
+: get-char ( -- char ) spot get char>> ;\r
+: set-char ( char -- ) spot get swap >>char drop ;\r
+: get-line ( -- line ) spot get line>> ;\r
+: set-line ( line -- ) spot get swap >>line drop ;\r
+: get-column ( -- column ) spot get column>> ;\r
+: set-column ( column -- ) spot get swap >>column drop ;\r
+: get-next ( -- char ) spot get next>> ;\r
+: set-next ( char -- ) spot get swap >>next drop ;\r
 \r
 ! * Errors\r
 TUPLE: parsing-error line column ;\r
-: <parsing-error> ( -- parsing-error )\r
-    get-line get-column parsing-error boa ;\r
-\r
-: construct-parsing-error ( ... slots class -- error )\r
-    construct <parsing-error> over set-delegate ; inline\r
-\r
-: parsing-error. ( parsing-error -- )\r
-    "Parsing error" print\r
-    "Line: " write dup parsing-error-line .\r
-    "Column: " write parsing-error-column . ;\r
-\r
-TUPLE: expected should-be was ;\r
-: <expected> ( should-be was -- error )\r
-    { set-expected-should-be set-expected-was }\r
-    expected construct-parsing-error ;\r
-M: expected error.\r
-    dup parsing-error.\r
-    "Token expected: " write dup expected-should-be print\r
-    "Token present: " write expected-was print ;\r
-\r
-TUPLE: unexpected-end ;\r
-: <unexpected-end> ( -- unexpected-end )\r
-    { } unexpected-end construct-parsing-error ;\r
-M: unexpected-end error.\r
-    parsing-error.\r
-    "File unexpectedly ended." print ;\r
-\r
-TUPLE: missing-close ;\r
-: <missing-close> ( -- missing-close )\r
-    { } missing-close construct-parsing-error ;\r
-M: missing-close error.\r
-    parsing-error.\r
-    "Missing closing token." print ;\r
+\r
+: parsing-error ( class -- obj )\r
+    new\r
+        get-line >>line\r
+        get-column >>column ;\r
+M: parsing-error summary ( obj -- str )\r
+    [\r
+        "Parsing error" print\r
+        "Line: " write dup line>> .\r
+        "Column: " write column>> .\r
+    ] with-string-writer ;\r
+\r
+TUPLE: expected < parsing-error should-be was ;\r
+: expected ( should-be was -- * )\r
+    \ expected parsing-error\r
+        swap >>was\r
+        swap >>should-be throw ;\r
+M: expected summary ( obj -- str )\r
+    [\r
+        dup call-next-method write\r
+        "Token expected: " write dup should-be>> print\r
+        "Token present: " write was>> print\r
+    ] with-string-writer ;\r
+\r
+TUPLE: unexpected-end < parsing-error ;\r
+: unexpected-end \ unexpected-end parsing-error throw ;\r
+M: unexpected-end summary ( obj -- str )\r
+    [\r
+        call-next-method write\r
+        "File unexpectedly ended." print\r
+    ] with-string-writer ;\r
+\r
+TUPLE: missing-close < parsing-error ;\r
+: missing-close \ missing-close parsing-error throw ;\r
+M: missing-close summary ( obj -- str )\r
+    [\r
+        call-next-method write\r
+        "Missing closing token." print\r
+    ] with-string-writer ;\r
 \r
 SYMBOL: prolog-data\r
 \r
@@ -65,7 +72,8 @@ SYMBOL: prolog-data
     [ 0 get-line 1+ set-line ] [ get-column 1+ ] if\r
     set-column ;\r
 \r
-: (next) ( -- char ) ! this normalizes \r\n and \r\r
+! (next) normalizes \r\n and \r\r
+: (next) ( -- char )\r
     get-next read1\r
     2dup swap CHAR: \r = [\r
         CHAR: \n =\r
@@ -75,10 +83,7 @@ SYMBOL: prolog-data
 \r
 : next ( -- )\r
     #! Increment spot.\r
-    get-char [\r
-        <unexpected-end> throw\r
-    ] unless\r
-    (next) record ;\r
+    get-char [ unexpected-end ] unless (next) record ;\r
 \r
 : next* ( -- )\r
     get-char [ (next) record ] when ;\r
@@ -95,16 +100,30 @@ SYMBOL: prolog-data
     #! Take the substring of a string starting at spot\r
     #! from code until the quotation given is true and\r
     #! advance spot to after the substring.\r
-    [ [\r
-        dup slip swap dup [ get-char , ] unless\r
-    ] skip-until ] "" make nip ; inline\r
+    10 <sbuf> [\r
+        '[ @ [ t ] [ get-char , push f ] if ] skip-until\r
+    ] keep >string ; inline\r
 \r
-: rest ( -- string )\r
+: take-rest ( -- string )\r
     [ f ] take-until ;\r
 \r
 : take-char ( ch -- string )\r
     [ dup get-char = ] take-until nip ;\r
 \r
+TUPLE: not-enough-characters < parsing-error ;\r
+: not-enough-characters\r
+    \ not-enough-characters parsing-error throw ;\r
+M: not-enough-characters summary ( obj -- str )\r
+    [\r
+        call-next-method write\r
+        "Not enough characters" print\r
+    ] with-string-writer ;\r
+\r
+: take ( n -- string )\r
+    [ 1- ] [ <sbuf> ] bi [\r
+        '[ drop get-char [ next , push f ] [ t ] if* ] attempt-each drop\r
+    ] keep get-char [ over push ] when* >string ;\r
+\r
 : pass-blank ( -- )\r
     #! Advance code past any whitespace, including newlines\r
     [ get-char blank? not ] skip-until ;\r
@@ -117,24 +136,24 @@ SYMBOL: prolog-data
     dup length <circular-string>\r
     [ 2dup string-matches? ] take-until nip\r
     dup length rot length 1- - head\r
-    get-char [ <missing-close> throw ] unless next ;\r
+    get-char [ missing-close ] unless next ;\r
 \r
 : expect ( ch -- )\r
     get-char 2dup = [ 2drop ] [\r
-        >r 1string r> 1string <expected> throw\r
+        >r 1string r> 1string expected\r
     ] if next ;\r
 \r
 : expect-string ( string -- )\r
     dup [ drop get-char next ] map 2dup =\r
-    [ 2drop ] [ <expected> throw ] if ;\r
+    [ 2drop ] [ expected ] if ;\r
 \r
 : init-parser ( -- )\r
     0 1 0 f <spot> spot set\r
     read1 set-next next ;\r
 \r
 : state-parse ( stream quot -- )\r
-    ! with-stream implicitly creates a new scope which we use\r
-    swap [ init-parser call ] with-stream ; inline\r
+    ! with-input-stream implicitly creates a new scope which we use\r
+    swap [ init-parser call ] with-input-stream ; inline\r
 \r
 : string-parse ( input quot -- )\r
     >r <string-reader> r> state-parse ; inline\r
index f542948970b2723ed6e6b8b64261f41805479174..9f79b71365bc0ecd3314aedec8925ca27d48c8e2 100644 (file)
@@ -5,5 +5,5 @@ HELP: SYMBOLS:
 { $syntax "SYMBOLS: words... ;" }
 { $values { "words" "a sequence of new words to define" } }
 { $description "Creates a new word for every token until the ';'." }
-{ $examples { $example "USING: prettyprint symbols ;" "SYMBOLS: foo bar baz ;\nfoo . bar . baz ." "foo\nbar\nbaz" } }
+{ $examples { $example "USING: prettyprint symbols ;" "IN: scratchpad" "SYMBOLS: foo bar baz ;\nfoo . bar . baz ." "foo\nbar\nbaz" } }
 { $see-also POSTPONE: SYMBOL: } ;
index f6254f19de79d5ce0375996c3210ffb527c64625..50733a620e031d0525c604ac5da1af7520cbdb75 100755 (executable)
@@ -1,9 +1,14 @@
 ! Copyright (C) 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: parser sequences words kernel ;
+USING: parser sequences words kernel classes.singleton ;
 IN: symbols
 
 : SYMBOLS:
     ";" parse-tokens
     [ create-in dup reset-generic define-symbol ] each ;
     parsing
+
+: SINGLETONS:
+    ";" parse-tokens
+    [ create-class-in dup save-location define-singleton-class ] each ;
+    parsing
diff --git a/extra/tangle/authors.txt b/extra/tangle/authors.txt
new file mode 100644 (file)
index 0000000..e9c193b
--- /dev/null
@@ -0,0 +1 @@
+Alex Chapman
diff --git a/extra/tangle/html/html-tests.factor b/extra/tangle/html/html-tests.factor
new file mode 100644 (file)
index 0000000..8e7d8c2
--- /dev/null
@@ -0,0 +1,7 @@
+USING: html kernel semantic-db tangle.html tools.test ;
+IN: tangle.html.tests
+
+[ "test" ] [ "test" >html ] unit-test
+[ "<ul><li>An Item</li></ul>" ] [ { "An Item" } <ulist> >html ] unit-test
+[ "<ul><li>One</li><li>Two</li><li>Three, ah ah ah</li></ul>" ] [ { "One" "Two" "Three, ah ah ah" } <ulist> >html ] unit-test
+[ "<a href='foo/bar'>some link</a>" ] [ "foo/bar" "some link" <link> >html ] unit-test
diff --git a/extra/tangle/html/html.factor b/extra/tangle/html/html.factor
new file mode 100644 (file)
index 0000000..fc604f4
--- /dev/null
@@ -0,0 +1,33 @@
+! Copyright (C) 2008 Alex Chapman
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors html html.elements io io.streams.string kernel namespaces semantic-db sequences strings tangle.path ;
+IN: tangle.html
+
+TUPLE: element attributes ;
+
+TUPLE: ulist < element items ;
+: <ulist> ( items -- element )
+    H{ } clone swap ulist boa ;
+
+TUPLE: link < element href text ;
+: <link> ( href text -- element )
+    H{ } clone -rot link boa ;
+
+GENERIC: >html ( element -- str )
+
+M: string >html ( str -- str ) ;
+
+M: link >html ( link -- str )
+    [ <a dup href>> =href a> text>> write </a> ] with-string-writer ;
+
+M: node >html ( node -- str )
+    dup node>path [
+        swap node-content <link> >html
+    ] [
+        node-content
+    ] if* ;
+
+M: ulist >html ( ulist -- str )
+    [
+        <ul> items>> [ <li> >html write </li> ] each </ul>
+    ] with-string-writer ;
diff --git a/extra/tangle/menu/menu.factor b/extra/tangle/menu/menu.factor
new file mode 100644 (file)
index 0000000..9740ace
--- /dev/null
@@ -0,0 +1,22 @@
+! Copyright (C) 2008 Alex Chapman
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors kernel semantic-db sequences tangle.html ;
+IN: tangle.menu
+
+RELATION: subitem-of
+RELATION: before
+
+: get-menus ( -- nodes )
+    subitem-of-relation ultimate-objects node-results ;
+
+: get-menu ( name -- node )
+    get-menus [ node-content = ] with find nip ;
+
+: ensure-menu ( name -- node )
+    dup get-menu [ nip ] [ create-node ] if* ;
+
+: load-menu ( name -- menu )
+    get-menu subitem-of-relation get-node-tree-s ;
+
+: menu>ulist ( menu -- str ) children>> <ulist> ;
+: menu>html ( menu -- str ) menu>ulist >html ;
diff --git a/extra/tangle/page/page.factor b/extra/tangle/page/page.factor
new file mode 100644 (file)
index 0000000..db3d58d
--- /dev/null
@@ -0,0 +1,23 @@
+! Copyright (C) 2008 Alex Chapman
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors kernel semantic-db sequences sequences.lib ;
+IN: tangle.page
+
+RELATION: has-abbreviation
+RELATION: has-content
+RELATION: has-subsection
+RELATION: before
+RELATION: authored-by
+RELATION: authored-on
+
+TUPLE: page name abbreviation author created content ;
+C: <page> page
+
+: load-page-content ( node -- content )
+    has-content-objects [ node-content ] map concat ;
+
+: load-page ( node -- page )
+    dup [ has-abbreviation-objects ?first ] keep
+    [ authored-by-objects ?first ] keep
+    [ authored-on-objects ?first ] keep
+    load-page-content <page> ;
diff --git a/extra/tangle/path/path.factor b/extra/tangle/path/path.factor
new file mode 100644 (file)
index 0000000..b4151ce
--- /dev/null
@@ -0,0 +1,56 @@
+! Copyright (C) 2008 Alex Chapman
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel semantic-db sequences sequences.lib splitting ;
+IN: tangle.path
+
+RELATION: has-filename
+RELATION: in-directory
+
+: create-root ( -- node ) "" create-node ;
+
+: get-root ( -- node )
+    in-directory-relation ultimate-objects ?1node-result ;
+
+: ensure-root ( -- node ) get-root [ create-root ] unless* ;
+
+: create-file ( parent name -- node )
+    create-node swap dupd in-directory ;
+
+: files-in-directory ( node -- nodes ) in-directory-subjects ;
+
+: file-in-directory ( name node -- node )
+    in-directory-relation subjects-with-cor ?1node-result ;
+
+: parent-directory ( file-node -- dir-node )
+    in-directory-objects ?first ;
+
+: (path>node) ( node name -- node )
+    swap [ file-in-directory ] [ drop f ] if* ;
+
+: path>node ( path -- node )
+    ensure-root swap [ (path>node) ] each ;
+
+: path>file ( path -- file )
+    path>node [ has-filename-subjects ?first ] [ f ] if* ;
+
+: (node>path) ( root seq node -- seq )
+    pick over node= [
+        drop nip
+    ] [
+        dup node-content pick push
+        parent-directory [
+            (node>path)
+        ] [
+            2drop f
+        ] if*
+    ] if ;
+
+: node>path* ( root node -- path )
+    V{ } clone swap (node>path) dup empty?
+    [ drop f ] [ <reversed> ] if ;
+
+: node>path ( node -- path )
+    ensure-root swap node>path* ;
+
+: file>path ( node -- path )
+    has-filename-objects ?first [ node>path ] [ f ] if* ;
diff --git a/extra/tangle/resources/jquery-1.2.3.min.js b/extra/tangle/resources/jquery-1.2.3.min.js
new file mode 100644 (file)
index 0000000..3747929
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.3 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $
+ * $Rev: 4663 $
+ */
+(function(){if(window.jQuery)var _jQuery=window.jQuery;var jQuery=window.jQuery=function(selector,context){return new jQuery.prototype.init(selector,context);};if(window.$)var _$=window.$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;var isSimple=/^.[^:#\[\.]*$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}else if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem)if(elem.id!=match[3])return jQuery().find(selector);else{this[0]=elem;this.length=1;return this;}else
+selector=[];}}else
+return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.3",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;this.each(function(i){if(this==elem)ret=i;});return ret;},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],name)||undefined;else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return!selector?this:this.pushStack(jQuery.merge(this.get(),selector.constructor==String?jQuery(selector).get():selector.length!=undefined&&(!selector.nodeName||jQuery.nodeName(selector,"form"))?selector:[selector]));},is:function(selector){return selector?jQuery.multiFilter(selector,this).length>0:false;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=value.constructor==Array?value:[value];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this.length?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value==null){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data==undefined&&this.length)data=jQuery.data(this[0],key);return data==null&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script")){scripts=scripts.add(elem);}else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.prototype.init.prototype=jQuery.prototype;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==1){target=this;i=0;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){if(target===options[name])continue;if(deep&&options[name]&&typeof options[name]=="object"&&target[name]&&!options[name].nodeType)target[name]=jQuery.extend(target[name],options[name]);else if(options[name]!=undefined)target[name]=options[name];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,windowData={};var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.appendChild(script);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!=undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){if(args){if(object.length==undefined){for(var name in object)if(callback.apply(object[name],args)===false)break;}else
+for(var i=0,length=object.length;i<length;i++)if(callback.apply(object[i],args)===false)break;}else{if(object.length==undefined){for(var name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var i=0,length=object.length,value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret;function color(elem){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=elem.style.outline;elem.style.outline="0 solid black";elem.style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&elem.style&&elem.style[name])ret=elem.style[name];else if(document.defaultView&&document.defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var getComputedStyle=document.defaultView.getComputedStyle(elem,null);if(getComputedStyle&&!color(elem))ret=getComputedStyle.getPropertyValue(name);else{var swap=[],stack=[];for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(var i=0;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(getComputedStyle&&getComputedStyle.getPropertyValue(name))||"";for(var i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left,runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem=elem.toString();if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,""+value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(typeof array!="array")for(var i=0,length=array.length;i<length;i++)ret.push(array[i]);else
+ret=array.slice(0);return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]==elem)return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
+for(var i=0;second[i];i++)first.push(second[i]);return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv&&callback(elems[i],i)||inv&&!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!==null&&value!=undefined){if(value.constructor!=Array)value=[value];ret=ret.concat(value);}}return ret;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength",selectedIndex:"selectedIndex",defaultValue:"defaultValue",tagName:"tagName",nodeName:"nodeName"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval!=undefined)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(arguments.callee.elem,arguments);return val;});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data||[]);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event)data.unshift(this.fix({type:type,target:elem}));data[0].type=type;if(exclusive)data[0].exclusive=true;if(jQuery.isFunction(jQuery.data(elem,"handle")))val=jQuery.data(elem,"handle").apply(elem,data);if(!fn&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var handlers=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in handlers){var handler=handlers[j];args[0].handler=handler;args[0].data=handler.data;if(!parts[1]&&!event.exclusive||handler.type==parts[1]){var ret=handler.apply(this,args);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;arguments[0].type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;arguments[0].type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);return undefined;},toggle:function(){var args=arguments;return this.click(function(event){this.lastToggle=0==this.lastToggle?1:0;event.preventDefault();return args[this.lastToggle].apply(this,arguments)||false;});},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){var jsonp,jsre=/=\?(&|$)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="get"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get"){var ts=(new Date()).getTime();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if((!s.url.indexOf("http")||!s.url.indexOf("//"))&&s.dataType=="script"&&s.type.toLowerCase()=="get"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async,s.username,s.password);try{if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");xml.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xml;},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||r.status==1223||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.apply(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(!elem)return undefined;type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=(new Date()).getTime();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done&&jQuery.isFunction(this.options.complete))this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),fixed=jQuery.css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&jQuery.css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||jQuery.css(offsetChild,"position")=="absolute"))||(mozilla&&jQuery.css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}return results;};})();
\ No newline at end of file
diff --git a/extra/tangle/resources/weave.html b/extra/tangle/resources/weave.html
new file mode 100644 (file)
index 0000000..6f9296e
--- /dev/null
@@ -0,0 +1,18 @@
+<html>
+    <head>
+        <script type="text/javascript" src="jquery-1.2.3.min.js"></script>
+        <script type="text/javascript" src="weave.js"></script>
+    </head>
+    <body>
+        <form id="node-form">
+            <select id="nodes">
+                <option value="new">New</option>
+            </select>
+            <div id="node-content" style="display: none;"></div>
+            <div id="edit-wrapper">
+                <textarea id="node-content-edit"></textarea>
+                <button id='node-submit'>Save Node</button>
+            </div>
+        </form>
+    </body>
+</html>
diff --git a/extra/tangle/resources/weave.js b/extra/tangle/resources/weave.js
new file mode 100644 (file)
index 0000000..2b36982
--- /dev/null
@@ -0,0 +1,27 @@
+$(function() { $.getJSON("/all", false, function(json) {
+    var nodes = $('#nodes');
+    for (node in json) {
+        nodes.append("<option value='" + json[node] + "'>" + json[node] + "</option>");
+    }
+    nodes.change(function(){
+        if (this.value == 'new') {
+            $('#node-content').hide();
+            $('#edit-wrapper').show();
+        } else {
+            $('#node-content').show();
+            $('#edit-wrapper').hide();
+            $.get('/node', { node_id: this.value }, function(data){
+                $('#node-content').text(data);
+            });
+        }
+    });
+    $('#node-submit').click(function(){
+        $.post('/node', { node_content: $('#node-content-edit').val() }, function(data){
+            nodes.append("<option value='" + data + "'>" + data + "</option>");
+            var option = nodes.get(0).options[data];
+            option.selected = true;
+            nodes.change();
+        });
+        return false;
+    });
+});})
diff --git a/extra/tangle/sandbox/sandbox.factor b/extra/tangle/sandbox/sandbox.factor
new file mode 100644 (file)
index 0000000..b6e110a
--- /dev/null
@@ -0,0 +1,18 @@
+USING: continuations db db.sqlite http.server io.files kernel namespaces semantic-db tangle tangle.path ;
+IN: tangle.sandbox
+
+: db-path "tangle-sandbox.db" temp-file ;
+: sandbox-db db-path sqlite-db ;
+: delete-db [ db-path delete-file ] ignore-errors ;
+
+: make-sandbox ( tangle -- )
+    [
+        init-semantic-db
+        ensure-root "foo" create-file "First Page" create-node swap has-filename
+    ] with-tangle ;
+
+: new-sandbox ( -- )
+    development-mode on
+    delete-db sandbox-db f <tangle>
+    [ make-sandbox ] [ <tangle-dispatcher> ] bi
+    main-responder set ;
diff --git a/extra/tangle/summary.txt b/extra/tangle/summary.txt
new file mode 100644 (file)
index 0000000..26f0a3e
--- /dev/null
@@ -0,0 +1 @@
+A web framework using semantic-db as a backend
diff --git a/extra/tangle/tangle-tests.factor b/extra/tangle/tangle-tests.factor
new file mode 100644 (file)
index 0000000..c7e9f2d
--- /dev/null
@@ -0,0 +1,26 @@
+USING: accessors arrays continuations db db.sqlite io.files kernel semantic-db sequences tangle tangle.html tangle.menu tangle.page tangle.path tools.test tools.walker tuple-syntax ;
+IN: tangle.tests
+
+: db-path "tangle-test.db" temp-file ;
+: test-db db-path sqlite-db ;
+: delete-db [ db-path delete-file ] ignore-errors ;
+
+: test-tangle ( -- )
+    ensure-root "foo" create-file "bar" create-file "pluck_eggs" create-file
+    "How to Pluck Eggs" create-node swap has-filename
+    "Main Menu" ensure-menu "home" create-node swap subitem-of ;
+
+test-db [
+    init-semantic-db test-tangle
+    [ "pluck_eggs" ] [ { "foo" "bar" "pluck_eggs" } path>node [ node-content ] when* ] unit-test
+    [ "How to Pluck Eggs" ] [ { "foo" "bar" "pluck_eggs" } path>node [ has-filename-subjects first node-content ] when* ] unit-test
+    [ { "foo" "bar" "pluck_eggs" } ] [ { "foo" "bar" "pluck_eggs" } path>node node>path >array ] unit-test
+    [ f ] [ TUPLE{ node id: 666 content: "some content" } parent-directory ] unit-test
+    [ f ] [ TUPLE{ node id: 666 content: "some content" } node>path ] unit-test
+    [ "Main Menu" ] [ "Main Menu" ensure-menu node-content ] unit-test
+    [ t ] [ "Main Menu" ensure-menu "Main Menu" ensure-menu node= ] unit-test
+    [ "Main Menu" { "home" } ] [ "Main Menu" load-menu dup node>> node-content swap children>> [ node>> node-content ] map >array ] unit-test
+    [ { "home" } ] [ "Main Menu" load-menu menu>ulist items>> [ node>> node-content ] map >array ] unit-test
+    [ f ] [ TUPLE{ node id: 666 content: "node text" } node>path ] unit-test
+    [ "node text" ] [ TUPLE{ node id: 666 content: "node text" } >html ] unit-test
+] with-db delete-db
diff --git a/extra/tangle/tangle.factor b/extra/tangle/tangle.factor
new file mode 100644 (file)
index 0000000..52c454f
--- /dev/null
@@ -0,0 +1,75 @@
+! Copyright (C) 2008 Alex Chapman
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs db db.sqlite db.postgresql http http.server http.server.actions http.server.static io io.files json.writer kernel math.parser namespaces semantic-db sequences strings tangle.path ;
+IN: tangle
+
+GENERIC: render* ( content templater -- output )
+GENERIC: render ( content templater -- )
+
+TUPLE: echo-template ;
+C: <echo-template> echo-template
+
+M: echo-template render* drop ;
+! METHOD: render* { string echo-template } drop ;
+M: object render render* write ;
+
+TUPLE: tangle db seq templater ;
+C: <tangle> tangle
+
+: with-tangle ( tangle quot -- )
+    [ [ db>> ] [ seq>> ] bi ] dip with-db ;
+
+: <text-response> ( text -- response )
+    "text/plain" <content> swap >>body ;
+
+: node-response ( id -- response )
+    load-node [ node-content <text-response> ] [ <404> ] if* ;
+
+: display-node ( params -- response )
+    [
+        "node_id" swap at* [
+            string>number node-response
+        ] [
+            drop <400>
+        ] if
+    ] [
+        <400>
+    ] if* ;
+
+: submit-node ( params -- response )
+    [
+        "node_content" swap at* [
+            create-node id>> number>string <text-response>
+        ] [
+            drop <400>
+        ] if
+    ] [
+        <400>
+    ] if* ;
+
+: <node-responder> ( -- responder )
+    <action> [ params get display-node ] >>display
+    [ params get submit-node ] >>submit ;
+
+TUPLE: path-responder ;
+C: <path-responder> path-responder
+
+M: path-responder call-responder* ( path responder -- response )
+    drop path>file [ node-content <text-response> ] [ <404> ] if* ;
+
+: <json-response> ( obj -- response )
+    "application/json" <content> swap >json >>body ;
+
+TUPLE: tangle-dispatcher < dispatcher tangle ;
+
+: <tangle-dispatcher> ( tangle -- dispatcher )
+    tangle-dispatcher new-dispatcher swap >>tangle
+    <path-responder> >>default
+    "resource:extra/tangle/resources" <static> "resources" add-responder
+    <node-responder> "node" add-responder
+    <action> [ all-node-ids <json-response> ] >>display "all" add-responder ;
+
+M: tangle-dispatcher call-responder* ( path dispatcher -- response )
+    dup tangle>> [
+        find-responder call-responder
+    ] with-tangle ;
index 9b3d2ae79f4cea7174848176588b6ca9374d8e98..b5d01b6ed2f00c0df839f335b9dd79b73ab6048a 100755 (executable)
@@ -1,7 +1,6 @@
-USING: combinators io io.files io.streams.duplex
-io.streams.string kernel math math.parser continuations
-namespaces pack prettyprint sequences strings system
-hexdump io.encodings.binary inspector accessors ;
+USING: combinators io io.files io.streams.string kernel math
+math.parser continuations namespaces pack prettyprint sequences
+strings system hexdump io.encodings.binary inspector accessors ;
 IN: tar
 
 : zero-checksum 256 ;
@@ -61,9 +60,7 @@ SYMBOL: filename
     ] if* ;
 
 : read-data-blocks ( tar-header out -- )
-    >r stdio get r> <duplex-stream> [
-        (read-data-blocks)
-    ] with-stream* ;
+    [ (read-data-blocks) ] with-output-stream* ;
 
 : parse-tar-header ( seq -- obj )
     [ header-checksum ] keep over zero-checksum = [
index 6aeb5aa0983fd3859a8c76478f03f864b2758dba..17d1998f67cbe861d0affd5e3108d405e727c440 100644 (file)
@@ -96,3 +96,21 @@ IN: taxes.tests
     1000000 2008 3 t <w4> <minnesota> net
     dollars/cents
 ] unit-test
+
+
+[ 30 97 ] [
+    24000 2008 2 f <w4> <minnesota> withholding biweekly dollars/cents
+] unit-test
+
+[ 173 66 ] [
+    78250 2008 2 f <w4> <minnesota> withholding biweekly dollars/cents
+] unit-test
+
+
+[ 138 69 ] [
+    24000 2008 2 f <w4> <federal> withholding biweekly dollars/cents
+] unit-test
+
+[ 754 72 ] [
+    78250 2008 2 f <w4> <federal> withholding biweekly dollars/cents
+] unit-test
index f1f3868ec8cb9025bad59016c6d1383f2b5aac89..8456d95673e15e2894e2c6884d74e6982c917ff8 100644 (file)
@@ -1,5 +1,5 @@
 USING: arrays assocs kernel math math.intervals namespaces
-sequences combinators.lib money ;
+sequences combinators.lib money math.order ;
 IN: taxes
 
 : monthly ( x -- y ) 12 / ;
index 532978e35964e349f6944412a5012cade0fa9376..3e4548078cf71d1d223ec6882a55511d3d5fa8c5 100644 (file)
@@ -47,7 +47,7 @@ TUPLE: board width height rows ;
     ] if ;
 
 : remove-full-rows ( board -- )
-    dup board-rows [ row-not-full? ] subset swap set-board-rows ;
+    dup board-rows [ row-not-full? ] filter swap set-board-rows ;
 
 : check-rows ( board -- n )
     #! remove full rows, then add blank ones at the top, returning the number
index ef710ea57db034d1a5ae215197d0ad49a18dcee1..d6016f280c0bba3783ce29c1b8a3923f7776e23d 100755 (executable)
@@ -61,7 +61,7 @@ M: word reset
         "--- Entering: " write swap .
         "--- Variable values:" print
         [ dup get ] H{ } map>assoc describe
-    ] 2curry swap compose ;
+    ] 2curry prepose ;
 
 : watch-vars ( word vars -- )
     dupd [ (watch-vars) ] 2curry annotate ;
index b9c37c065661ad65c10d4b360886809109078851..4bb6d6142f7637c543b1756a2982b72af0f8f3ec 100755 (executable)
@@ -1,12 +1,12 @@
 ! Copyright (C) 2005, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-IN: tools.completion
 USING: kernel arrays sequences math namespaces strings io
 vectors words assocs combinators sorting unicode.case
-unicode.categories ;
+unicode.categories math.order ;
+IN: tools.completion
 
 : (fuzzy) ( accum ch i full -- accum i ? )
-    index* 
+    index-from 
     [
         [ swap push ] 2keep 1+ t
     ] [
@@ -52,7 +52,7 @@ unicode.categories ;
 : rank-completions ( results -- newresults )
     sort-keys <reversed>
     [ 0 [ first max ] reduce 3 /f ] keep
-    [ first < ] with subset
+    [ first < ] with filter
     [ second ] map ;
 
 : complete ( full short -- score )
index d4fbf1de7872df6e5776ae19a95448b4fd37075c..6dff51123839c08e2d1cf7cc12094b2a2e3e3122 100755 (executable)
@@ -4,7 +4,7 @@ USING: namespaces continuations.private kernel.private init
 assocs kernel vocabs words sequences memory io system arrays
 continuations math definitions mirrors splitting parser classes
 inspector layouts vocabs.loader prettyprint.config prettyprint
-debugger io.streams.c io.streams.duplex io.files io.backend
+debugger io.streams.c io.files io.backend
 quotations io.launcher words.private tools.deploy.config
 bootstrap.image io.encodings.utf8 accessors ;
 IN: tools.deploy.backend
@@ -31,10 +31,9 @@ IN: tools.deploy.backend
         +stdout+ >>stderr
         +closed+ >>stdin
         +low-priority+ >>priority
-    utf8 <process-stream*>
-    >r copy-lines r> wait-for-process zero? [
-        "Deployment failed" throw
-    ] unless ;
+    utf8 <process-reader*>
+    copy-lines
+    wait-for-process zero? [ "Deployment failed" throw ] unless ;
 
 : make-boot-image ( -- )
     #! If stage1 image doesn't exist, create one.
@@ -64,11 +63,11 @@ DEFER: ?make-staging-image
         dup empty? [
             "-i=" my-boot-image-name append ,
         ] [
-            dup 1 head* ?make-staging-image
+            dup but-last ?make-staging-image
 
             "-resource-path=" "" resource-path append ,
 
-            "-i=" over 1 head* staging-image-name append ,
+            "-i=" over but-last staging-image-name append ,
 
             "-run=tools.deploy.restage" ,
         ] if
index 82e2652c0198b66a0ff87273278bf455a8e8b9c4..13742546125495ac083a3f3f6902dceb3536c645 100755 (executable)
@@ -73,7 +73,7 @@ IN: tools.deploy.shaker
     [
         [
             word-props swap
-            '[ , nip member? ] assoc-subset
+            '[ , nip member? ] assoc-filter
             f assoc-like
         ] keep set-word-props
     ] with each ;
@@ -104,7 +104,7 @@ IN: tools.deploy.shaker
     set-global ;
 
 : strip-vocab-globals ( except names -- words )
-    [ child-vocabs [ words ] map concat ] map concat diff ;
+    [ child-vocabs [ words ] map concat ] map concat swap diff ;
 
 : stripped-globals ( -- seq )
     [
@@ -114,14 +114,15 @@ IN: tools.deploy.shaker
             continuations:error-continuation
             continuations:error-thread
             continuations:restarts
-            error-hook
+            listener:error-hook
             init:init-hooks
             inspector:inspector-hook
             io.thread:io-thread
             libc.private:mallocs
             source-files:source-files
-            stderr
-            stdio
+            input-stream
+            output-stream
+            error-stream
         } %
 
         deploy-threads? [
@@ -144,7 +145,7 @@ IN: tools.deploy.shaker
                 classes:class-and-cache
                 classes:class-not-cache
                 classes:class-or-cache
-                classes:class<-cache
+                classes:class<=-cache
                 classes:classes-intersect-cache
                 classes:update-map
                 command-line:main-vocab-hook
@@ -201,8 +202,8 @@ IN: tools.deploy.shaker
     strip-globals? [
         "Stripping globals" show
         global swap
-        '[ drop , member? not ] assoc-subset
-        [ drop string? not ] assoc-subset ! strip CLI args
+        '[ drop , member? not ] assoc-filter
+        [ drop string? not ] assoc-filter ! strip CLI args
         dup keys unparse show
         21 setenv
     ] [ drop ] if ;
index 28c219ee4d5ebd040ad74ff241b3a76709b2f07e..821a6ca7f529d07016e51f0ad0900d783ff53cb0 100755 (executable)
@@ -9,7 +9,7 @@ ARTICLE: "tools.memory" "Object memory tools"
 "You can query memory status:"
 { $subsection data-room }
 { $subsection code-room }
-"There are a pair of combinators, analogous to " { $link each } " and " { $link subset } ", which operate on the entire collection of objects in the object heap:"
+"There are a pair of combinators, analogous to " { $link each } " and " { $link filter } ", which operate on the entire collection of objects in the object heap:"
 { $subsection each-object }
 { $subsection instances }
 "You can check an object's the heap memory usage:"
index 89e84bbc86c9f7cfff5688e06ea733b3f25fb535..50bbc527d1d760f86aa1feb38a1a1fbab6621c52 100755 (executable)
@@ -27,7 +27,7 @@ HELP: counters
 
 HELP: counters.
 { $values { "assoc" "an association list mapping words to integers" } }
-{ $description "Prints an association list of call counts to the " { $link stdio } " stream." } ;
+{ $description "Prints an association list of call counts to " { $link output-stream } "." } ;
 
 HELP: profile
 { $values { "quot" quotation } }
index 467fcc14f46ed3bf2fb22560d776c244c0d0c0a4..6a5fce6281e955ef0460a8342962a412a5d39b9e 100755 (executable)
@@ -39,7 +39,7 @@ M: method-body (profile.)
     ] with-row ;
 
 : counters. ( assoc -- )
-    [ second 0 > ] subset sort-values
+    [ second 0 > ] filter sort-values
     standard-table-style [
         [ counter. ] assoc-each
     ] tabular-output ;
@@ -58,13 +58,13 @@ M: method-body (profile.)
     "Call counts for words which call " write
     dup pprint
     ":" print
-    usage [ word? ] subset counters counters. ;
+    usage [ word? ] filter counters counters. ;
 
 : vocabs-profile. ( -- )
     "Call counts for all vocabularies:" print
     vocabs [
         dup words
-        [ "predicating" word-prop not ] subset
+        [ "predicating" word-prop not ] filter
         [ profile-counter ] map sum
     ] { } map>assoc counters. ;
 
index a605543bda96cfe722497a6f6e19b3b425bb1409..4b2521d19c4d401be2bb71b9313a2c85bcb8bc34 100755 (executable)
@@ -91,4 +91,4 @@ HELP: run-all-tests
 
 HELP: test-failures.
 { $values { "assoc" "an association list of unit test failures" } }
-{ $description "Prints unit test failures output by " { $link run-tests } " or " { $link run-all-tests } " to the " { $link stdio } " stream." } ;
+{ $description "Prints unit test failures output by " { $link run-tests } " or " { $link run-all-tests } " to " { $link output-stream } "." } ;
index 031b3c3af8892cfc13f27b77e19460ac8d9cd5f2..854ef7af0ea3a953d9ad553a3e843d62837f97a8 100755 (executable)
@@ -85,7 +85,7 @@ SYMBOL: this-test
 : run-tests ( prefix -- failures )
     child-vocabs dup empty? [ drop f ] [
         [ dup run-test ] { } map>assoc
-        [ second empty? not ] subset
+        [ second empty? not ] filter
     ] if ;
 
 : test ( prefix -- )
index 9b32bc9e10fa6ace95e1427eb7907fb4265ab46b..8825cffa4d2d2478b9844836d87890214ffea0e2 100755 (executable)
@@ -2,7 +2,7 @@ USING: dlists ui.gadgets kernel ui namespaces io.streams.string
 io ;
 IN: tools.test.ui
 
-! We can't print to stdio here because that might be a pane
+! We can't print to output-stream here because that might be a pane
 ! stream, and our graft-queue rebinding here would be captured
 ! by code adding children to the pane...
 : with-grafted-gadget ( gadget quot -- )
index 060377d1272a10ae3692c0420895cd074347c976..2bd38cf30437be0d0b14f2f3293c8218b86bae96 100755 (executable)
@@ -1,9 +1,9 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-IN: tools.threads\r
 USING: threads kernel prettyprint prettyprint.config\r
 io io.styles sequences assocs namespaces sorting boxes\r
-heaps.private system math math.parser ;\r
+heaps.private system math math.parser math.order ;\r
+IN: tools.threads\r
 \r
 : thread. ( thread -- )\r
     dup thread-id pprint-cell\r
index db1edbeb61bea21d4d706c7dc1eb02a56c1e9196..2b28e158df360697e4fa8da64eec5d8bb2a3aa00 100755 (executable)
@@ -105,8 +105,8 @@ C: <vocab-author> vocab-author
 
 : vocab-xref ( vocab quot -- vocabs )
     >r dup vocab-name swap words r> map
-    [ [ word? ] subset [ word-vocabulary ] map ] map>set
-    remove [ ] subset [ vocab ] map ; inline
+    [ [ word? ] filter [ word-vocabulary ] map ] map>set
+    remove [ ] filter [ vocab ] map ; inline
 
 : vocab-uses ( vocab -- vocabs ) [ uses ] vocab-xref ;
 
@@ -143,7 +143,7 @@ C: <vocab-author> vocab-author
 : keyed-vocabs ( str quot -- seq )
     all-vocabs [
         swap >r
-        [ >r 2dup r> swap call member? ] subset
+        [ >r 2dup r> swap call member? ] filter
         r> swap
     ] assoc-map 2nip ; inline
 
index ab5e8c66b7ed8752d7a7453700e839f594b502c8..ee5198a8f44f2e3eb4372f731291efb6ecdeae4e 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: threads io.files io.monitors init kernel\r
 vocabs vocabs.loader tools.vocabs namespaces continuations\r
-sequences splitting assocs command-line ;\r
+sequences splitting assocs command-line concurrency.messaging io.backend sets ;\r
 IN: tools.vocabs.monitor\r
 \r
 : vocab-dir>vocab-name ( path -- vocab )\r
@@ -13,30 +13,33 @@ IN: tools.vocabs.monitor
     dup ".factor" tail? [ parent-directory ] when ;\r
 \r
 : chop-vocab-root ( path -- path' )\r
-    "resource:" prepend-path (normalize-path)\r
+    "resource:" prepend-path normalize-path\r
     dup vocab-roots get\r
-    [ (normalize-path) ] map\r
+    [ normalize-path ] map\r
     [ head? ] with find nip\r
     ?head drop ;\r
 \r
 : path>vocab ( path -- vocab )\r
     chop-vocab-root path>vocab-name vocab-dir>vocab-name ;\r
 \r
-: monitor-loop ( monitor -- )\r
+: monitor-loop ( -- )\r
     #! On OS X, monitors give us the full path, so we chop it\r
     #! off if its there.\r
-    dup next-change drop path>vocab changed-vocab\r
+    receive first path>vocab changed-vocab\r
     reset-cache\r
     monitor-loop ;\r
 \r
+: add-monitor-for-path ( path -- )\r
+    dup exists? [ t my-mailbox (monitor) ] when drop ;\r
+\r
 : monitor-thread ( -- )\r
     [\r
         [\r
-            "" resource-path t <monitor>\r
-            \r
+            vocab-roots get prune [ add-monitor-for-path ] each\r
+\r
             H{ } clone changed-vocabs set-global\r
             vocabs [ changed-vocab ] each\r
-            \r
+\r
             monitor-loop\r
         ] with-monitors\r
     ] ignore-errors ;\r
index 40e79ee01473852a79ebb005da716c076260bdeb..effa17c179b207fe8741b1e383dcbd3620c74a08 100755 (executable)
@@ -3,8 +3,8 @@
 USING: io.files kernel io.encodings.utf8 vocabs.loader vocabs\r
 sequences namespaces math.parser arrays hashtables assocs\r
 memoize inspector sorting splitting combinators source-files\r
-io debugger continuations compiler.errors init io.crc32 \r
-sets ;\r
+io debugger continuations compiler.errors init\r
+checksums checksums.crc32 sets ;\r
 IN: tools.vocabs\r
 \r
 : vocab-tests-file ( vocab -- path )\r
@@ -15,7 +15,7 @@ IN: tools.vocabs
     dup vocab-dir "tests" append-path vocab-append-path dup [\r
         dup exists? [\r
             dup directory keys\r
-            [ ".factor" tail? ] subset\r
+            [ ".factor" tail? ] filter\r
             [ append-path ] with map\r
         ] [ drop f ] if\r
     ] [ drop f ] if ;\r
@@ -63,7 +63,7 @@ SYMBOL: failures
     dup source-files get at [\r
         dup source-file-path\r
         dup exists? [\r
-            utf8 file-lines lines-crc32\r
+            utf8 file-lines crc32 checksum-lines\r
             swap source-file-checksum = not\r
         ] [\r
             2drop f\r
@@ -90,7 +90,7 @@ SYMBOL: changed-vocabs
     changed-vocabs get dup [ key? ] [ 2drop t ] if ;\r
 \r
 : filter-changed ( vocabs -- vocabs' )\r
-    [ changed-vocab? ] subset ;\r
+    [ changed-vocab? ] filter ;\r
 \r
 SYMBOL: modified-sources\r
 SYMBOL: modified-docs\r
@@ -127,7 +127,7 @@ SYMBOL: modified-docs
             modified-sources get\r
             modified-docs get\r
         ]\r
-        [ modified-sources get modified-docs get append swap diff ] bi\r
+        [ modified-docs get modified-sources get append diff ] bi\r
     ] with-scope ;\r
 \r
 : do-refresh ( modified-sources modified-docs unchanged -- )\r
@@ -208,7 +208,7 @@ M: vocab-link summary vocab-summary ;
     dup vocab-authors-path set-vocab-file-contents ;\r
 \r
 : subdirs ( dir -- dirs )\r
-    directory [ second ] subset keys natural-sort ;\r
+    directory [ second ] filter keys natural-sort ;\r
 \r
 : (all-child-vocabs) ( root name -- vocabs )\r
     [ vocab-dir append-path subdirs ] keep\r
@@ -260,7 +260,7 @@ MEMO: all-vocabs-seq ( -- seq )
     } cond nip ;\r
 \r
 : filter-dangerous ( seq -- seq' )\r
-    [ vocab-name dangerous? not ] subset ;\r
+    [ vocab-name dangerous? not ] filter ;\r
 \r
 : try-everything ( -- failures )\r
     all-vocabs-seq\r
@@ -273,10 +273,10 @@ MEMO: all-vocabs-seq ( -- seq )
 : unrooted-child-vocabs ( prefix -- seq )\r
     dup empty? [ CHAR: . suffix ] unless\r
     vocabs\r
-    [ find-vocab-root not ] subset\r
+    [ find-vocab-root not ] filter\r
     [\r
         vocab-name swap ?head CHAR: . rot member? not and\r
-    ] with subset\r
+    ] with filter\r
     [ vocab ] map ;\r
 \r
 : all-child-vocabs ( prefix -- assoc )\r
@@ -288,7 +288,7 @@ MEMO: all-vocabs-seq ( -- seq )
 : all-child-vocabs-seq ( prefix -- assoc )\r
     vocab-roots get swap [\r
         dupd (all-child-vocabs)\r
-        [ vocab-dir? ] with subset\r
+        [ vocab-dir? ] with filter\r
     ] curry map concat ;\r
 \r
 : map>set ( seq quot -- )\r
index 6bf3c5376811df5a693caa612141d22b8c6533f4..ef6dac66f665e140cc243bd8e43f120622a045c2 100755 (executable)
@@ -259,3 +259,8 @@ SYMBOL: +stopped+
     ] 3curry
     "Walker on " self thread-name append spawn
     [ associate-thread ] keep ;
+
+! For convenience
+IN: syntax
+
+: B break ;
old mode 100644 (file)
new mode 100755 (executable)
index 570125c..5cb6606
@@ -2,85 +2,79 @@ USING: kernel tools.test trees trees.avl math random sequences assocs ;
 IN: trees.avl.tests
 
 [ "key1" 0 "key2" 0 ] [
-    T{ avl-node T{ node f "key1" f f T{ avl-node T{ node f "key2" } 1 } } 2 }
+    T{ avl-node f "key1" f f T{ avl-node f "key2" f f 1 } 2 }
     [ single-rotate ] go-left
     [ node-left dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance
 ] unit-test
 
 [ "key1" 0 "key2" 0 ] [
-    T{ avl-node T{ node f "key1" f f T{ avl-node T{ node f "key2" } 1 } } 2 }
+    T{ avl-node f "key1" f f T{ avl-node f "key2" f f f 1 } 2 }
     [ select-rotate ] go-left
     [ node-left dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance
 ] unit-test
 
 [ "key1" 0 "key2" 0 ] [
-    T{ avl-node T{ node f "key1" f T{ avl-node T{ node f "key2" } -1 } } -2 }
+    T{ avl-node f "key1" f T{ avl-node f "key2" f f f -1 } f -2 }
     [ single-rotate ] go-right
     [ node-right dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance
 ] unit-test
 
 [ "key1" 0 "key2" 0 ] [
-    T{ avl-node T{ node f "key1" f T{ avl-node T{ node f "key2" } -1 } } -2 }
+    T{ avl-node f "key1" f T{ avl-node f "key2" f f f -1 } f -2 }
     [ select-rotate ] go-right
     [ node-right dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance
 ] unit-test
 
 [ "key1" -1 "key2" 0 "key3" 0 ]
-[ T{ avl-node T{ node f "key1" f f
-        T{ avl-node T{ node f "key2" f
-            T{ avl-node T{ node f "key3" } 1 } }
-        -1 } }
-    2 } [ double-rotate ] go-left
+[ T{ avl-node f "key1" f f
+        T{ avl-node f "key2" f 
+            T{ avl-node f "key3" f f f 1 } f -1 } 2 }
+    [ double-rotate ] go-left
     [ node-left dup node-key swap avl-node-balance ] keep
     [ node-right dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance ] unit-test
 [ "key1" 0 "key2" 0 "key3" 0 ]
-[ T{ avl-node T{ node f "key1" f f
-        T{ avl-node T{ node f "key2" f
-            T{ avl-node T{ node f "key3" } 0 } }
-        -1 } }
-    2 } [ double-rotate ] go-left
+[ T{ avl-node f "key1" f f
+        T{ avl-node f "key2" f
+            T{ avl-node f "key3" f f f 0 } f -1 } 2 } 
+    [ double-rotate ] go-left
     [ node-left dup node-key swap avl-node-balance ] keep
     [ node-right dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance ] unit-test
 [ "key1" 0 "key2" 1 "key3" 0 ]
-[ T{ avl-node T{ node f "key1" f f
-        T{ avl-node T{ node f "key2" f
-            T{ avl-node T{ node f "key3" } -1 } }
-        -1 } }
-    2 } [ double-rotate ] go-left
+[ T{ avl-node f "key1" f f
+        T{ avl-node f "key2" f
+            T{ avl-node f "key3" f f f -1 } f -1 } 2 } 
+    [ double-rotate ] go-left
     [ node-left dup node-key swap avl-node-balance ] keep
     [ node-right dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance ] unit-test
 
 [ "key1" 1 "key2" 0 "key3" 0 ]
-[ T{ avl-node T{ node f "key1" f
-        T{ avl-node T{ node f "key2" f f
-            T{ avl-node T{ node f "key3" } -1 } }
-        1 } }
-    -2 } [ double-rotate ] go-right
+[ T{ avl-node f "key1" f
+        T{ avl-node f "key2" f f
+            T{ avl-node f "key3" f f f -1 } 1 } f -2 }
+    [ double-rotate ] go-right
     [ node-right dup node-key swap avl-node-balance ] keep
     [ node-left dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance ] unit-test
 [ "key1" 0 "key2" 0 "key3" 0 ]
-[ T{ avl-node T{ node f "key1" f
-        T{ avl-node T{ node f "key2" f f
-            T{ avl-node T{ node f "key3" } 0 } }
-        1 } }
-    -2 } [ double-rotate ] go-right
+[ T{ avl-node f "key1" f
+        T{ avl-node f "key2" f f
+            T{ avl-node f "key3" f f f 0 } 1 } f -2 }
+    [ double-rotate ] go-right
     [ node-right dup node-key swap avl-node-balance ] keep
     [ node-left dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance ] unit-test
 [ "key1" 0 "key2" -1 "key3" 0 ]
-[ T{ avl-node T{ node f "key1" f
-        T{ avl-node T{ node f "key2" f f
-            T{ avl-node T{ node f "key3" } 1 } }
-        1 } }
-    -2 } [ double-rotate ] go-right
+[ T{ avl-node f "key1" f
+        T{ avl-node f "key2" f f
+            T{ avl-node f "key3" f f f 1 } 1 } f -2 }
+    [ double-rotate ] go-right
     [ node-right dup node-key swap avl-node-balance ] keep
     [ node-left dup node-key swap avl-node-balance ] keep
     dup node-key swap avl-node-balance ] unit-test
index 5c88187c6c1d2cba2ea977eb4cc5e62e49631520..866e035a2134e294ba8ffbf3687cc5f748453254 100755 (executable)
@@ -1,32 +1,34 @@
 ! Copyright (C) 2007 Alex Chapman
 ! See http://factorcode.org/license.txt for BSD license.
-USING: combinators kernel generic math math.functions math.parser
-namespaces io prettyprint.backend sequences trees assocs parser ;
+USING: combinators kernel generic math math.functions
+math.parser namespaces io prettyprint.backend sequences trees
+assocs parser accessors math.order ;
 IN: trees.avl
 
-TUPLE: avl ;
-
-INSTANCE: avl tree-mixin
+TUPLE: avl < tree ;
 
 : <avl> ( -- tree )
-    avl construct-tree ;
+    avl new-tree ;
 
-TUPLE: avl-node balance ;
+TUPLE: avl-node < node balance ;
 
 : <avl-node> ( key value -- node )
-    swap <node> 0 avl-node boa tuck set-delegate ;
+    avl-node new-node
+        0 >>balance ;
 
-: change-balance ( node amount -- )
-    over avl-node-balance + swap set-avl-node-balance ;
+: increase-balance ( node amount -- )
+    swap [ + ] change-balance drop ;
 
 : rotate ( node -- node )
-    dup node+link dup node-link pick set-node+link tuck set-node-link ;    
+    dup node+link dup node-link pick set-node+link
+    tuck set-node-link ;    
 
 : single-rotate ( node -- node )
-    0 over set-avl-node-balance 0 over node+link set-avl-node-balance rotate ;
+    0 over (>>balance) 0 over node+link 
+    (>>balance) rotate ;
 
 : pick-balances ( a node -- balance balance )
-    avl-node-balance {
+    balance>> {
         { [ dup zero? ] [ 2drop 0 0 ] }
         { [ over = ] [ neg 0 ] }
         [ 0 swap ]
@@ -35,18 +37,22 @@ TUPLE: avl-node balance ;
 : double-rotate ( node -- node )
     [
         node+link [
-            node-link current-side get neg over pick-balances rot 0 swap set-avl-node-balance
-        ] keep set-avl-node-balance
-    ] keep tuck set-avl-node-balance
-    dup node+link [ rotate ] with-other-side over set-node+link rotate ;
+            node-link current-side get neg
+            over pick-balances rot 0 swap (>>balance)
+        ] keep (>>balance)
+    ] keep swap >>balance
+    dup node+link [ rotate ] with-other-side
+    over set-node+link rotate ;
 
 : select-rotate ( node -- node )
-    dup node+link avl-node-balance current-side get = [ double-rotate ] [ single-rotate ] if ;
+    dup node+link balance>> current-side get =
+    [ double-rotate ] [ single-rotate ] if ;
 
 : balance-insert ( node -- node taller? )
     dup avl-node-balance {
         { [ dup zero? ] [ drop f ] }
-        { [ dup abs 2 = ] [ sgn neg [ select-rotate ] with-side f ] }
+        { [ dup abs 2 = ]
+          [ sgn neg [ select-rotate ] with-side f ] }
         { [ drop t ] [ t ] } ! balance is -1 or 1, tree is taller
     } cond ;
 
@@ -56,7 +62,8 @@ DEFER: avl-set
     2dup node-key before? left right ? [
         [ node-link avl-set ] keep swap
         >r tuck set-node-link r>
-        [ dup current-side get change-balance balance-insert ] [ f ] if
+        [ dup current-side get increase-balance balance-insert ]
+        [ f ] if
     ] with-side ;
 
 : (avl-set) ( value key node -- node taller? )
@@ -65,10 +72,10 @@ DEFER: avl-set
     ] [ avl-insert ] if ;
 
 : avl-set ( value key node -- node taller? )
-    [ (avl-set) ] [ <avl-node> t ] if* ;
+    [ (avl-set) ] [ swap <avl-node> t ] if* ;
 
 M: avl set-at ( value key node -- node )
-    [ avl-set drop ] change-root ;
+    [ avl-set drop ] change-root drop ;
 
 : delete-select-rotate ( node -- node shorter? )
     dup node+link avl-node-balance zero? [
@@ -86,10 +93,10 @@ M: avl set-at ( value key node -- node )
     } cond ;
 
 : balance-delete ( node -- node shorter? )
-    current-side get over avl-node-balance {
+    current-side get over balance>> {
         { [ dup zero? ] [ drop neg over set-avl-node-balance f ] }
-        { [ dupd = ] [ drop 0 over set-avl-node-balance t ] }
-        [ dupd neg change-balance rebalance-delete ]
+        { [ dupd = ] [ drop 0 >>balance t ] }
+        [ dupd neg increase-balance rebalance-delete ]
     } cond ;
 
 : avl-replace-with-extremity ( to-replace node -- node shorter? )
@@ -134,12 +141,12 @@ M: avl-node avl-delete ( key node -- node shorter? deleted? )
     ] if ;
 
 M: avl delete-at ( key node -- )
-    [ avl-delete 2drop ] change-root ;
+    [ avl-delete 2drop ] change-root drop ;
 
 M: avl new-assoc 2drop <avl> ;
 
 : >avl ( assoc -- avl )
-    T{ avl T{ tree f f 0 } } assoc-clone-like ;
+    T{ avl f f 0 } assoc-clone-like ;
 
 M: avl assoc-like
     drop dup avl? [ >avl ] unless ;
old mode 100644 (file)
new mode 100755 (executable)
index 4b82f86..ef5fcf8
@@ -1,15 +1,13 @@
 ! Copyright (c) 2005 Mackenzie Straight.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays kernel math namespaces sequences assocs parser
-prettyprint.backend trees generic ;
+prettyprint.backend trees generic math.order ;
 IN: trees.splay
 
-TUPLE: splay ;
+TUPLE: splay < tree ;
 
 : <splay> ( -- tree )
-    \ splay construct-tree ;
-
-INSTANCE: splay tree-mixin
+    \ splay new-tree ;
 
 : rotate-right ( node -- node )
     dup node-left
@@ -30,13 +28,13 @@ INSTANCE: splay tree-mixin
     drop dup node-right swapd r> swap ;
 
 : cmp ( key node -- obj node -1/0/1 )
-    2dup node-key <=> ;
+    2dup node-key key-side ;
 
 : lcmp ( key node -- obj node -1/0/1 ) 
-    2dup node-left node-key <=> ;
+    2dup node-left node-key key-side ;
 
 : rcmp ( key node -- obj node -1/0/1 ) 
-    2dup node-right node-key <=> ;
+    2dup node-right node-key key-side ;
 
 DEFER: (splay)
 
@@ -131,7 +129,7 @@ M: splay new-assoc
     2drop <splay> ;
 
 : >splay ( assoc -- tree )
-    T{ splay T{ tree f f 0 } } assoc-clone-like ;
+    T{ splay f f 0 } assoc-clone-like ;
 
 : SPLAY{
     \ } [ >splay ] parse-literal ; parsing
index 07497b209870ddc41496733ad0f4ac3006b91c33..3b0ab016660f122d300a3105a2780c472c7f2a30 100755 (executable)
@@ -2,42 +2,49 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel generic math sequences arrays io namespaces
 prettyprint.private kernel.private assocs random combinators
-parser prettyprint.backend ;
+parser prettyprint.backend math.order accessors ;
 IN: trees
 
-MIXIN: tree-mixin
-
 TUPLE: tree root count ;
 
+: new-tree ( class -- tree )
+    new
+        f >>root
+        0 >>count ; inline
+
 : <tree> ( -- tree )
-    f 0 tree boa ;
+    tree new-tree ;
 
-: construct-tree ( class -- tree )
-    new <tree> over set-delegate ; inline
+INSTANCE: tree assoc
 
-INSTANCE: tree tree-mixin
+TUPLE: node key value left right ;
 
-INSTANCE: tree-mixin assoc
+: new-node ( key value class -- node )
+    new swap >>value swap >>key ;
 
-TUPLE: node key value left right ;
 : <node> ( key value -- node )
-    f f node boa ;
+    node new-node ;
 
 SYMBOL: current-side
 
-: left -1 ; inline
-: right 1 ; inline
+: left ( -- symbol ) -1 ; inline
+: right ( -- symbol ) 1 ; inline
+
+: key-side ( k1 k2 -- n )
+    <=> {
+        { +lt+ [ -1 ] }
+        { +eq+ [ 0 ] }
+        { +gt+ [ 1 ] }
+    } case ;
 
-: go-left? ( -- ? ) current-side get left = ;
+: go-left? ( -- ? ) current-side get left eq? ;
 
-: inc-count ( tree -- )
-    dup tree-count 1+ swap set-tree-count ;
+: inc-count ( tree -- ) [ 1+ ] change-count drop ;
 
-: dec-count ( tree -- )
-    dup tree-count 1- swap set-tree-count ;
+: dec-count ( tree -- ) [ 1- ] change-count drop ;
 
 : node-link@ ( node ? -- node )
-    go-left? xor [ node-left ] [ node-right ] if ;
+    go-left? xor [ left>> ] [ right>> ] if ;
 : set-node-link@ ( left parent ? -- ) 
     go-left? xor [ set-node-left ] [ set-node-right ] if ;
 
@@ -47,19 +54,13 @@ SYMBOL: current-side
 : set-node+link ( child node -- ) t set-node-link@ ;
 
 : with-side ( side quot -- ) [ swap current-side set call ] with-scope ; inline
-: with-other-side ( quot -- ) current-side get neg swap with-side ; inline
+: with-other-side ( quot -- )
+    current-side get neg swap with-side ; inline
 : go-left ( quot -- ) left swap with-side ; inline
 : go-right ( quot -- ) right swap with-side ; inline
 
-: change-root ( tree quot -- )
-    swap [ tree-root swap call ] keep set-tree-root ; inline
-
 : leaf? ( node -- ? )
-    dup node-left swap node-right or not ;
-
-: key-side ( k1 k2 -- side )
-    #! side is -1 if k1 < k2, 0 if they are equal, or 1 if k1 > k2
-    <=> sgn ;
+    [ left>> ] [ right>> ] bi or not ;
 
 : random-side ( -- side ) left right 2array random ;
 
@@ -76,11 +77,11 @@ SYMBOL: current-side
     ] [ drop f f ] if* ;
 
 M: tree at* ( key tree -- value ? )
-    tree-root node-at* ;
+    root>> node-at* ;
 
 : node-set ( value key node -- node )
-    2dup node-key key-side dup zero? [
-        drop nip [ set-node-value ] keep
+    2dup key>> key-side dup 0 eq? [
+        drop nip swap >>value
     ] [
         [
             [ node-link [ node-set ] [ swap <node> ] if* ] keep
@@ -89,16 +90,16 @@ M: tree at* ( key tree -- value ? )
     ] if ;
 
 M: tree set-at ( value key tree -- )
-    [ [ node-set ] [ swap <node> ] if* ] change-root ;
+    [ [ node-set ] [ swap <node> ] if* ] change-root drop ;
 
 : valid-node? ( node -- ? )
     [
-        dup dup node-left [ node-key swap node-key before? ] when* >r
-        dup dup node-right [ node-key swap node-key after? ] when* r> and swap
-        dup node-left valid-node? swap node-right valid-node? and and
+        dup dup left>> [ node-key swap node-key before? ] when* >r
+        dup dup right>> [ node-key swap node-key after? ] when* r> and swap
+        dup left>> valid-node? swap right>> valid-node? and and
     ] [ t ] if* ;
 
-: valid-tree? ( tree -- ? ) tree-root valid-node? ;
+: valid-tree? ( tree -- ? ) root>> valid-node? ;
 
 : tree-call ( node call -- )
     >r [ node-key ] keep node-value r> call ; inline
@@ -107,20 +108,20 @@ M: tree set-at ( value key tree -- )
     {
         { [ over not ] [ 2drop f f f ] }
         { [ [
-              >r node-left r> find-node
+              >r left>> r> find-node
             ] 2keep rot ]
           [ 2drop t ] }
         { [ >r 2nip r> [ tree-call ] 2keep rot ]
           [ drop [ node-key ] keep node-value t ] }
-        [ >r node-right r> find-node ]
+        [ >r right>> r> find-node ]
     } cond ; inline
 
-M: tree-mixin assoc-find ( tree quot -- key value ? )
-    >r tree-root r> find-node ;
+M: tree assoc-find ( tree quot -- key value ? )
+    >r root>> r> find-node ;
 
-M: tree-mixin clear-assoc
-    0 over set-tree-count
-    f swap set-tree-root ;
+M: tree clear-assoc
+    0 >>count
+    f >>root drop ;
 
 : copy-node-contents ( new old -- )
     dup node-key pick set-node-key node-value swap set-node-value ;
@@ -158,29 +159,29 @@ DEFER: delete-node
 
 : delete-node ( node -- node )
     #! delete this node, returning its replacement
-    dup node-left [
-        dup node-right [
+    dup left>> [
+        dup right>> [
             delete-node-with-two-children
         ] [
-            node-left ! left but no right
+            left>> ! left but no right
         ] if
     ] [
-        dup node-right [
-            node-right ! right but not left
+        dup right>> [
+            right>> ! right but not left
         ] [
             drop f ! no children
         ] if
     ] if ;
 
 : delete-bst-node ( key node -- node )
-    2dup node-key key-side dup zero? [
+    2dup node-key key-side dup 0 eq? [
         drop nip delete-node
     ] [
         [ tuck node-link delete-bst-node over set-node-link ] with-side
     ] if ;
 
 M: tree delete-at
-    [ delete-bst-node ] change-root ;
+    [ delete-bst-node ] change-root drop ;
 
 M: tree new-assoc
     2drop <tree> ;
@@ -190,14 +191,12 @@ M: tree clone dup assoc-clone-like ;
 : >tree ( assoc -- tree )
     T{ tree f f 0 } assoc-clone-like ;
 
-M: tree-mixin assoc-like drop dup tree? [ >tree ] unless ;
+M: tree assoc-like drop dup tree? [ >tree ] unless ;
 
 : TREE{
     \ } [ >tree ] parse-literal ; parsing
-
+                                                        
 M: tree pprint-delims drop \ TREE{ \ } ;
-
-M: tree-mixin assoc-size tree-count ;
-M: tree-mixin clone dup assoc-clone-like ;
-M: tree-mixin >pprint-sequence >alist ;
-M: tree-mixin pprint-narrow? drop t ;
+M: tree assoc-size count>> ;
+M: tree >pprint-sequence >alist ;
+M: tree pprint-narrow? drop t ;
index 219df5197cfda5fc181ed85d8fbdad5f2b1cc84b..cf439f6407ca8f704db51dcd90f6b918694e3330 100755 (executable)
@@ -7,7 +7,7 @@ IN: tuple-syntax
 
 : parse-slot-writer ( tuple -- slot# )
     scan dup "}" = [ 2drop f ] [
-        1 head* swap object-slots slot-named slot-spec-offset
+        but-last swap object-slots slot-named slot-spec-offset
     ] if ;
 
 : parse-slots ( accum tuple -- accum tuple )
index ab0c3015251ad5cc1ff602da257031e79efdbdb1..83890788e3675b4dfea8a6a3636252debf799640 100755 (executable)
@@ -126,6 +126,13 @@ CLASS: {
     { +name+ "FactorView" }
     { +protocols+ { "NSTextInput" } }
 }
+
+! Rendering
+! Rendering
+{ "drawRect:" "void" { "id" "SEL" "id" "NSRect" }
+    [ 3drop window relayout-1 ]
+}
+
 ! Events
 { "acceptsFirstMouse:" "bool" { "id" "SEL" "id" }
     [ 3drop 1 ]
index ed524148e370ab9170a32db6e10bbdea6508f79d..5ff0752c19ca6c91a27cdc1a7f5ab202d318c8a6 100644 (file)
@@ -47,6 +47,7 @@ HELP: command-name
 { $examples
     { $example
         "USING: io ui.commands ;"
+        "IN: scratchpad"
         ": com-my-command ;"
         "\\ com-my-command command-name write"
         "My Command"
@@ -105,6 +106,7 @@ HELP: command-string
 { $examples
     { $example
         "USING: io ui.commands ui.gestures ;"
+        "IN: scratchpad"
         ": com-my-command ;"
         "T{ key-down f { C+ } \"s\" } \\ com-my-command command-string write"
         "My Command (C+s)"
index c7db687dc3f53c061b4037c43e3b0e5ab16d7878..f341595969803838d32f242bbad3841f246ea802 100755 (executable)
@@ -37,7 +37,7 @@ GENERIC: command-word ( command -- word )
 : command-gestures ( class -- hash )
     commands values [
         [
-            [ first ] subset
+            [ first ] filter
             [ [ invoke-command ] curry swap set ] assoc-each
         ] each
     ] H{ } make-assoc ;
@@ -56,7 +56,7 @@ GENERIC: command-word ( command -- word )
 M: word command-name ( word -- str )
     word-name
     "com-" ?head drop
-    dup first Letter? [ 1 tail ] unless
+    dup first Letter? [ rest ] unless
     (command-name) ;
 
 M: word command-description ( word -- str )
index b3ecad6aedb22ad3b1c4c3dcb0454e23fb0378d3..c4a808bb2df3b99c8a6ce1d2995c90a955aaac92 100755 (executable)
@@ -4,7 +4,8 @@ USING: arrays documents ui.clipboards ui.commands ui.gadgets
 ui.gadgets.borders ui.gadgets.buttons ui.gadgets.labels
 ui.gadgets.scrollers ui.gadgets.theme ui.render ui.gestures io
 kernel math models namespaces opengl opengl.gl sequences strings
-io.styles math.vectors sorting colors combinators assocs ;
+io.styles math.vectors sorting colors combinators assocs
+math.order ;
 IN: ui.gadgets.editors
 
 TUPLE: editor
index dbe06ec8cdeba061241e404dfd876880e6f94b74..f88b2076038c3b50e11dad47957a7bd57718b8e6 100755 (executable)
@@ -124,7 +124,7 @@ M: mock-gadget ungraft*
     dup mock-gadget-ungraft-called 1+
     swap set-mock-gadget-ungraft-called ;
 
-! We can't print to stdio here because that might be a pane
+! We can't print to output-stream here because that might be a pane
 ! stream, and our graft-queue rebinding here would be captured
 ! by code adding children to the pane...
 [
index 15c174d52e8837083281e61eaf3cd53f69ed82d5..411552cc32080463177e9d1f1161b00729a84c93 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays hashtables kernel models math namespaces sequences
 quotations math.vectors combinators sorting vectors dlists
-models threads concurrency.flags ;
+models threads concurrency.flags math.order ;
 IN: ui.gadgets
 
 SYMBOL: ui-notify-flag
@@ -106,7 +106,7 @@ GENERIC: children-on ( rect/point gadget -- seq )
 M: gadget children-on nip gadget-children ;
 
 : (fast-children-on) ( dim axis gadgets -- i )
-    swapd [ rect-loc v- over v. ] binsearch nip ;
+    swapd [ rect-loc v- over v. 0 <=> ] binsearch nip ;
 
 : fast-children-on ( rect axis children -- from to )
     3dup
index 9213c3886ff060d49e288d43a8f093784e9bded8..fd5234ab0360645f69534bcfa58ec98c1cf2337f 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: ui.commands ui.gestures ui.render ui.gadgets
 ui.gadgets.labels ui.gadgets.scrollers
-kernel sequences models opengl math namespaces
+kernel sequences models opengl math math.order namespaces
 ui.gadgets.presentations ui.gadgets.viewports ui.gadgets.packs
 math.vectors classes.tuple ;
 IN: ui.gadgets.lists
index 09ef3218b477b783f40e037725640059f2be93de..c6f437583eef2d92a10cc40787764f8f43a77baa 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: sequences ui.gadgets kernel math math.functions
-math.vectors namespaces ;
+math.vectors namespaces math.order ;
 IN: ui.gadgets.packs
 
 TUPLE: pack align fill gap ;
index a684153b983cd14c63ddb6b23c0c88827f719bb1..99f8b2e82ac1cabcee12f082852d19e164c10177 100755 (executable)
@@ -23,7 +23,7 @@ HELP: print-gadget
 
 HELP: gadget.
 { $values { "gadget" gadget } }
-{ $description "Writes a gadget followed by a newline to the " { $link stdio } " stream." }
+{ $description "Writes a gadget followed by a newline to " { $link output-stream } "." }
 { $notes "Not all streams support this operation." } ;
 
 HELP: ?nl
@@ -32,11 +32,11 @@ HELP: ?nl
 
 HELP: with-pane
 { $values { "pane" pane } { "quot" quotation } }
-{ $description "Clears the pane and calls the quotation in a new scope where " { $link stdio } " is rebound to a " { $link pane-stream } " writing to the pane." } ;
+{ $description "Clears the pane and calls the quotation in a new scope where " { $link output-stream } " is rebound to a " { $link pane-stream } " writing to the pane." } ;
 
 HELP: make-pane
 { $values { "quot" quotation } { "gadget" "a new " { $link gadget } } }
-{ $description "Calls the quotation in a new scope where " { $link stdio } " is rebound to a " { $link pane-stream } " writing to a new pane. The output area of the new pane is output on the stack after the quotation returns. The pane itself is not output." } ;
+{ $description "Calls the quotation in a new scope where " { $link output-stream } " is rebound to a " { $link pane-stream } " writing to a new pane. The output area of the new pane is output on the stack after the quotation returns. The pane itself is not output." } ;
 
 HELP: <scrolling-pane>
 { $values { "pane" "a new " { $link pane } } }
index 0263b15d71c1a2d4f0f4a1ef1358e99917d13928..31bb4233bf6e68b40ebec30f2db1ecd6b183c36b 100755 (executable)
@@ -11,7 +11,7 @@ help.stylesheet splitting tools.test.ui models math inspector ;
 [ ] [ #children "num-children" set ] unit-test
 
 [ ] [
-    "pane" get <pane-stream> [ 10000 [ . ] each ] with-stream*
+    "pane" get <pane-stream> [ 10000 [ . ] each ] with-output-stream*
 ] unit-test
 
 [ t ] [ #children "num-children" get = ] unit-test
index bff0ca10adb6ef8a63fe4fa879338371f78021a2..533a6c42b7a436626e1d6a5501b16ba717fe5454 100755 (executable)
@@ -6,7 +6,7 @@ ui.gadgets.paragraphs ui.gadgets.incremental ui.gadgets.packs
 ui.gadgets.theme ui.clipboards ui.gestures ui.traverse ui.render
 hashtables io kernel namespaces sequences io.styles strings
 quotations math opengl combinators math.vectors
-io.streams.duplex sorting splitting io.streams.nested assocs
+sorting splitting io.streams.nested assocs
 ui.gadgets.presentations ui.gadgets.slots ui.gadgets.grids
 ui.gadgets.grid-lines classes.tuple models continuations ;
 IN: ui.gadgets.panes
@@ -113,14 +113,11 @@ GENERIC: write-gadget ( gadget stream -- )
 M: pane-stream write-gadget
     pane-stream-pane pane-current add-gadget ;
 
-M: duplex-stream write-gadget
-    duplex-stream-out write-gadget ;
-
 : print-gadget ( gadget stream -- )
     tuck write-gadget stream-nl ;
 
 : gadget. ( gadget -- )
-    stdio get print-gadget ;
+    output-stream get print-gadget ;
 
 : ?nl ( stream -- )
     dup pane-stream-pane pane-current gadget-children empty?
@@ -129,7 +126,7 @@ M: duplex-stream write-gadget
 : with-pane ( pane quot -- )
     over scroll>top
     over pane-clear >r <pane-stream> r>
-    over >r with-stream* r> ?nl ; inline
+    over >r with-output-stream* r> ?nl ; inline
 
 : make-pane ( quot -- gadget )
     <pane> [ swap with-pane ] keep smash-pane ; inline
index 7576bce568563387c90d5622f8596b6520318df2..9f375d01269cd95dafd148f47d619a64393cebad 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2007 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays ui.gadgets ui.gadgets.labels ui.render kernel math
-namespaces sequences ;
+namespaces sequences math.order ;
 IN: ui.gadgets.paragraphs
 
 ! A word break gadget
index a420f59047b33986d3c4e8790fdf9b83004b41c0..4d2c423445fa6843c444a9a10cebdc1f2e3924b0 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays ui.gestures ui.gadgets ui.gadgets.buttons
-ui.gadgets.frames ui.gadgets.grids
+ui.gadgets.frames ui.gadgets.grids math.order
 ui.gadgets.theme ui.render kernel math namespaces sequences
 vectors models math.vectors math.functions quotations colors ;
 IN: ui.gadgets.sliders
index d8caf54ad23f8477b32180bfd7a3236c47294214..56a0fbc3ee5cc148a42355db22ba22ffc8afe297 100644 (file)
@@ -8,7 +8,7 @@ TUPLE: track sizes ;
 
 : normalized-sizes ( track -- seq )
     track-sizes
-    [ [ ] subset sum ] keep [ dup [ over / ] when ] map nip ;
+    [ [ ] filter sum ] keep [ dup [ over / ] when ] map nip ;
 
 : <track> ( orientation -- track )
     <pack> V{ } clone
index ed0f38b7430b19d0e71c22b2a8e26f8ae0f2c48a..5bba0952536bcd85b487197ebd30a91a94032dc3 100755 (executable)
@@ -54,7 +54,7 @@ TUPLE: zoom-in-action ;  C: <zoom-in-action> zoom-in-action
 TUPLE: zoom-out-action ; C: <zoom-out-action> zoom-out-action
 
 : generalize-gesture ( gesture -- newgesture )
-    tuple>array 1 head* >tuple ;
+    tuple>array but-last >tuple ;
 
 ! Modifiers
 SYMBOLS: C+ A+ M+ S+ ;
@@ -111,7 +111,8 @@ SYMBOL: double-click-timeout
     ] if ;
 
 : drag-gesture ( -- )
-    hand-buttons get-global first <drag> button-gesture ;
+    hand-buttons get-global
+    dup empty? [ drop ] [ first <drag> button-gesture ] if ;
 
 SYMBOL: drag-timer
 
@@ -172,7 +173,7 @@ SYMBOL: drag-timer
     ] if ;
 
 : modifier ( mod modifiers -- seq )
-    [ second swap bitand 0 > ] with subset
+    [ second swap bitand 0 > ] with filter
     0 <column> prune dup empty? [ drop f ] [ >array ] if ;
 
 : drag-loc ( -- loc )
index 26200ea96fcd007b13f7a2a270d5a71ffd293c51..ac414b2cb94dd37141436ddfc50a671fa412c7b0 100755 (executable)
@@ -37,7 +37,7 @@ M: operation command-word operation-command command-word ;
 SYMBOL: operations
 
 : object-operations ( obj -- operations )
-    operations get [ operation-predicate call ] with subset ;
+    operations get [ operation-predicate call ] with filter ;
 
 : find-operation ( obj quot -- command )
     >r object-operations r> find-last nip ; inline
index cacd0a8d3ac89e6d086db3441a74d2a267faceba..d33a789fe7389ddf71662ab3468d41bf14bc5847 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien arrays hashtables io kernel math namespaces opengl
 opengl.gl opengl.glu sequences strings io.styles vectors
-combinators math.vectors ui.gadgets colors ;
+combinators math.vectors ui.gadgets colors math.order ;
 IN: ui.render
 
 SYMBOL: clip
index 99c005451db6f2614fd19e11cb864ddefa73a197..f8d5e33df98aa9925b3a5ec522f594e7c69d7132 100755 (executable)
@@ -1,18 +1,21 @@
 IN: ui.tools.interactor.tests
 USING: ui.tools.interactor ui.gadgets.panes namespaces
 ui.gadgets.editors concurrency.promises threads listener
-tools.test kernel calendar parser ;
+tools.test kernel calendar parser accessors ;
 
-[
-    \ <interactor> must-infer
+\ <interactor> must-infer
 
+[
     [ ] [ <pane> <pane-stream> <interactor> "interactor" set ] unit-test
 
+    [ ] [ "interactor" get register-self ] unit-test
+
     [ ] [ "[ 1 2 3" "interactor" get set-editor-string ] unit-test
 
     [ ] [ <promise> "promise" set ] unit-test
 
     [
+        self "interactor" get (>>thread)
         "interactor" get stream-read-quot "promise" get fulfill
     ] "Interactor test" spawn drop
 
@@ -27,3 +30,14 @@ tools.test kernel calendar parser ;
 
     [ [ [ 1 2 3 ] ] ] [ "promise" get 5 seconds ?promise-timeout ] unit-test
 ] with-interactive-vocabs
+
+! Hang
+[ ] [ <pane> <pane-stream> <interactor> "interactor" set ] unit-test
+
+[ ] [ [ "interactor" get stream-read-quot drop ] "A" spawn drop ] unit-test
+
+[ ] [ [ "interactor" get stream-read-quot drop ] "B" spawn drop ] unit-test
+
+[ ] [ 1000 sleep ] unit-test
+
+[ ] [ "interactor" get interactor-eof ] unit-test
index 3837ce2de164f73575c62f0da2f5cfbd0d7c769c..2e59363531f5b9ce42014fdb407660400097dd23 100755 (executable)
@@ -1,53 +1,55 @@
 ! Copyright (C) 2006, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays assocs combinators continuations documents
- hashtables io io.styles kernel math
-math.vectors models namespaces parser prettyprint quotations
-sequences strings threads listener
-classes.tuple ui.commands ui.gadgets ui.gadgets.editors
-ui.gadgets.presentations ui.gadgets.worlds ui.gestures
-definitions boxes calendar concurrency.flags ui.tools.workspace
-accessors ;
+hashtables io io.styles kernel math math.order math.vectors
+models namespaces parser prettyprint quotations sequences
+strings threads listener classes.tuple ui.commands ui.gadgets
+ui.gadgets.editors ui.gadgets.presentations ui.gadgets.worlds
+ui.gestures definitions calendar concurrency.flags
+concurrency.mailboxes ui.tools.workspace accessors ;
 IN: ui.tools.interactor
 
-TUPLE: interactor history output flag thread help ;
+! If waiting is t, we're waiting for user input, and invoking
+! evaluate-input resumes the thread.
+TUPLE: interactor output history flag mailbox thread waiting help ;
+
+: register-self ( interactor -- )
+    <mailbox> >>mailbox
+    self >>thread
+    drop ;
 
 : interactor-continuation ( interactor -- continuation )
-    interactor-thread box-value
-    thread-continuation box-value ;
+    thread>> continuation>> value>> ;
 
 : interactor-busy? ( interactor -- ? )
-    interactor-thread box-full? not ;
+    #! We're busy if there's no thread to resume.
+    [ waiting>> ]
+    [ thread>> dup [ thread-registered? ] when ]
+    bi and not ;
 
 : interactor-use ( interactor -- seq )
     dup interactor-busy? [ drop f ] [
         use swap
-        interactor-continuation continuation-name
+        interactor-continuation name>>
         assoc-stack
     ] if ;
 
-: init-caret-help ( interactor -- )
-    dup editor-caret 1/3 seconds <delay>
-    swap set-interactor-help ;
-
-: init-interactor-history ( interactor -- )
-    V{ } clone swap set-interactor-history ;
-
-: init-interactor-state ( interactor -- )
-    <flag> over set-interactor-flag
-    <box> swap set-interactor-thread ;
+: <help-model> ( interactor -- model )
+    editor-caret 1/3 seconds <delay> ;
 
 : <interactor> ( output -- gadget )
     <source-editor>
     interactor construct-editor
-    tuck set-interactor-output
-    dup init-interactor-history
-    dup init-interactor-state
-    dup init-caret-help ;
+        V{ } clone >>history
+        <flag> >>flag
+        dup <help-model> >>help
+        swap >>output ;
 
 M: interactor graft*
-    dup delegate graft*
-    dup interactor-help add-connection ;
+    [ delegate graft* ] [ dup help>> add-connection ] bi ;
+
+M: interactor ungraft*
+    [ dup help>> remove-connection ] [ delegate ungraft ] bi ;
 
 : word-at-loc ( loc interactor -- word )
     over [
@@ -58,7 +60,7 @@ M: interactor graft*
     ] if ;
 
 M: interactor model-changed
-    2dup interactor-help eq? [
+    2dup help>> eq? [
         swap model-value over word-at-loc swap show-summary
     ] [
         delegate model-changed
@@ -69,15 +71,15 @@ M: interactor model-changed
     [ H{ { font-style bold } } format ] with-nesting ;
 
 : interactor-input. ( string interactor -- )
-    interactor-output [
+    output>> [
         dup string? [ dup write-input nl ] [ short. ] if
-    ] with-stream* ;
+    ] with-output-stream* ;
 
 : add-interactor-history ( str interactor -- )
     over empty? [ 2drop ] [ interactor-history push-new ] if ;
 
 : interactor-continue ( obj interactor -- )
-    interactor-thread box> resume-with ;
+    mailbox>> mailbox-put ;
 
 : clear-input ( interactor -- ) gadget-model clear-doc ;
 
@@ -99,13 +101,17 @@ M: interactor model-changed
     ] unless drop ;
 
 : interactor-yield ( interactor -- obj )
-    [
-        [ interactor-thread >box ] keep
-        interactor-flag raise-flag
-    ] curry "input" suspend ;
+    dup thread>> self eq? [
+        {
+            [ t >>waiting drop ]
+            [ flag>> raise-flag ]
+            [ mailbox>> mailbox-get ]
+            [ f >>waiting drop ]
+        } cleave
+    ] [ drop f ] if ;
 
 M: interactor stream-readln
-    [ interactor-yield ] keep interactor-finish
+    [ interactor-yield ] [ interactor-finish ] bi
     dup [ first ] when ;
 
 : interactor-call ( quot interactor -- )
@@ -161,7 +167,8 @@ M: interactor stream-read-quot
     } cond ;
 
 M: interactor pref-dim*
-    0 over line-height 4 * 2array swap delegate pref-dim* vmax ;
+    [ line-height 4 * 0 swap 2array ] [ delegate pref-dim* ] bi
+    vmax ;
 
 interactor "interactor" f {
     { T{ key-down f f "RET" } evaluate-input }
index cc218533d818996eda0eb82f75749d0e152f24bd..2fae62a8fce98bada9179e1fe92879adce0d3f2a 100755 (executable)
@@ -2,7 +2,7 @@ USING: continuations documents ui.tools.interactor
 ui.tools.listener hashtables kernel namespaces parser sequences
 tools.test ui.commands ui.gadgets ui.gadgets.editors
 ui.gadgets.panes vocabs words tools.test.ui slots.private
-threads arrays generic ;
+threads arrays generic threads accessors listener ;
 IN: ui.tools.listener.tests
 
 [ f ] [ "word" source-editor command-map empty? ] unit-test
@@ -15,7 +15,7 @@ IN: ui.tools.listener.tests
     [ "dup" ] [
         \ dup word-completion-string
     ] unit-test
-
+  
     [ "equal?" ]
     [ \ array \ equal? method word-completion-string ] unit-test
 
@@ -28,9 +28,26 @@ IN: ui.tools.listener.tests
     [ ] [
         "i" get [ { "SYMBOL:" } parse-lines ] [ go-to-error ] recover
     ] unit-test
-
+    
     [ t ] [
         "i" get gadget-model doc-end
         "i" get editor-caret* =
     ] unit-test
+
+    ! Race condition discovered by SimonRC
+    [ ] [
+        [
+            "listener" get input>>
+            [ stream-read-quot drop ]
+            [ stream-read-quot drop ] bi
+        ] "OH, HAI" spawn drop
+    ] unit-test
+
+    [ ] [ "listener" get clear-output ] unit-test
+
+    [ ] [ "listener" get restart-listener ] unit-test
+
+    [ ] [ 1000 sleep ] unit-test
+
+    [ ] [ "listener" get com-end ] unit-test
 ] with-grafted-gadget
index d96270075f165c6f8be82f6bef1e37f3d85654f7..48800c0918c6dbce72974e9f9fffcbc254ec4dbb 100755 (executable)
@@ -1,13 +1,13 @@
 ! Copyright (C) 2005, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: inspector ui.tools.interactor ui.tools.inspector
-ui.tools.workspace help.markup io io.streams.duplex io.styles
+ui.tools.workspace help.markup io io.styles
 kernel models namespaces parser quotations sequences ui.commands
 ui.gadgets ui.gadgets.editors ui.gadgets.labelled
 ui.gadgets.panes ui.gadgets.buttons ui.gadgets.scrollers
 ui.gadgets.tracks ui.gestures ui.operations vocabs words
 prettyprint listener debugger threads boxes concurrency.flags
-math arrays generic accessors combinators ;
+math arrays generic accessors combinators assocs ;
 IN: ui.tools.listener
 
 TUPLE: listener-gadget input output stack ;
@@ -16,13 +16,11 @@ TUPLE: listener-gadget input output stack ;
     <scrolling-pane> g-> set-listener-gadget-output
     <scroller> "Output" <labelled-gadget> 1 track, ;
 
-: listener-stream ( listener -- stream )
-    dup listener-gadget-input
-    swap listener-gadget-output <pane-stream>
-    <duplex-stream> ;
+: listener-streams ( listener -- input output )
+    [ input>> ] [ output>> <pane-stream> ] bi ;
 
 : <listener-input> ( listener -- gadget )
-    listener-gadget-output <pane-stream> <interactor> ;
+    output>> <pane-stream> <interactor> ;
 
 : listener-input, ( -- )
     g <listener-input> g-> set-listener-gadget-input
@@ -34,31 +32,29 @@ TUPLE: listener-gadget input output stack ;
    "cookbook" ($link) "." print nl ;
 
 M: listener-gadget focusable-child*
-    listener-gadget-input ;
+    input>> ;
 
 M: listener-gadget call-tool* ( input listener -- )
-    >r input-string r> listener-gadget-input set-editor-string ;
+    >r string>> r> input>> set-editor-string ;
 
 M: listener-gadget tool-scroller
-    listener-gadget-output find-scroller ;
+    output>> find-scroller ;
 
 : wait-for-listener ( listener -- )
     #! Wait for the listener to start.
-    listener-gadget-input interactor-flag wait-for-flag ;
+    input>> flag>> wait-for-flag ;
 
 : workspace-busy? ( workspace -- ? )
-    workspace-listener listener-gadget-input interactor-busy? ;
+    listener>> input>> interactor-busy? ;
 
 : listener-input ( string -- )
-    get-workspace
-    workspace-listener
-    listener-gadget-input set-editor-string ;
+    get-workspace listener>> input>> set-editor-string ;
 
 : (call-listener) ( quot listener -- )
-    listener-gadget-input interactor-call ;
+    input>> interactor-call ;
 
 : call-listener ( quot -- )
-    [ workspace-busy? not ] get-workspace* workspace-listener
+    [ workspace-busy? not ] get-workspace* listener>>
     [ dup wait-for-listener (call-listener) ] 2curry
     "Listener call" spawn drop ;
 
@@ -70,8 +66,7 @@ M: listener-operation invoke-command ( target command -- )
 
 : eval-listener ( string -- )
     get-workspace
-    workspace-listener
-    listener-gadget-input [ set-editor-string ] keep
+    listener>> input>> [ set-editor-string ] keep
     evaluate-input ;
 
 : listener-run-files ( seq -- )
@@ -82,10 +77,10 @@ M: listener-operation invoke-command ( target command -- )
     ] if ;
 
 : com-end ( listener -- )
-    listener-gadget-input interactor-eof ;
+    input>> interactor-eof ;
 
 : clear-output ( listener -- )
-    listener-gadget-output pane-clear ;
+    output>> pane-clear ;
 
 \ clear-output H{ { +listener+ t } } define-command
 
@@ -106,12 +101,11 @@ M: engine-word word-completion-string
     "engine-generic" word-prop word-completion-string ;
 
 : use-if-necessary ( word seq -- )
-    >r word-vocabulary vocab-words r>
-    {
-        { [ dup not ] [ 2drop ] }
-        { [ 2dup memq? ] [ 2drop ] }
-        [ push ]
-    } cond ;
+    over word-vocabulary [
+        2dup assoc-stack pick = [ 2drop ] [
+            >r word-vocabulary vocab-words r> push
+        ] if
+    ] [ 2drop ] if ;
 
 : insert-word ( word -- )
     get-workspace workspace-listener input>>
@@ -130,7 +124,7 @@ TUPLE: stack-display ;
     stack-display new
     g workspace-listener swap [
         dup <toolbar> f track,
-        listener-gadget-stack [ stack. ]
+        stack>> [ [ stack. ] curry try ]
         t "Data stack" <labelled-pane> 1 track,
     ] { 0 1 } build-track ;
 
@@ -148,22 +142,27 @@ M: stack-display tool-scroller
     swap show-tool inspect-object ;
 
 : listener-thread ( listener -- )
-    dup listener-stream [
-        dup [ ui-listener-hook ] curry listener-hook set
-        dup [ ui-error-hook ] curry error-hook set
-        [ ui-inspector-hook ] curry inspector-hook set
+    dup listener-streams [
+        [ [ ui-listener-hook ] curry listener-hook set ]
+        [ [ ui-error-hook ] curry error-hook set ]
+        [ [ ui-inspector-hook ] curry inspector-hook set ] tri
         welcome.
         listener
-    ] with-stream* ;
+    ] with-streams* ;
 
 : start-listener-thread ( listener -- )
-    [ listener-thread ] curry "Listener" spawn drop ;
+    [
+        [ input>> register-self ] [ listener-thread ] bi
+    ] curry "Listener" spawn drop ;
 
 : restart-listener ( listener -- )
     #! Returns when listener is ready to receive input.
-    dup com-end dup clear-output
-    dup start-listener-thread
-    wait-for-listener ;
+    {
+        [ com-end ]
+        [ clear-output ]
+        [ start-listener-thread ]
+        [ wait-for-listener ]
+    } cleave ;
 
 : init-listener ( listener -- )
     f <model> swap set-listener-gadget-stack ;
@@ -189,10 +188,7 @@ M: listener-gadget handle-gesture* ( gadget gesture delegate -- ? )
     [ default-gesture-handler ] [ 3drop f ] if ;
 
 M: listener-gadget graft*
-    dup delegate graft*
-    dup listener-gadget-input interactor-thread ?box 2drop
-    restart-listener ;
+    [ delegate graft* ] [ restart-listener ] bi ;
 
 M: listener-gadget ungraft*
-    dup com-end
-    delegate ungraft* ;
+    [ com-end ] [ delegate ungraft* ] bi ;
index 279737466f5d80da3b626f73dd6abf2ebe4dee04..6d22083096d5e98fbd79840606f7ea0c0c0031f0 100755 (executable)
@@ -17,7 +17,7 @@ IN: ui.tools.tests
 [ ] [ "w" get com-scroll-down ] unit-test
 [ t ] [
     "w" get workspace-book gadget-children
-    [ tool-scroller ] map [ ] subset [ scroller? ] all?
+    [ tool-scroller ] map [ ] filter [ scroller? ] all?
 ] unit-test
 [ ] [ "w" get hide-popup ] unit-test
 [ ] [ <gadget> "w" get show-popup ] unit-test
index e3aff92109a87c967bd7e5a9ef404455d1003a2f..85b2266159c8db7b452472b240d07d0df7f90d61 100644 (file)
@@ -60,7 +60,7 @@ DEFER: (gadget-subtree)
 
 : traverse-child ( frompath topath gadget -- )
     dup -roll [
-        >r >r 1 tail-slice r> r> traverse-step (gadget-subtree)
+        >r >r rest-slice r> r> traverse-step (gadget-subtree)
     ] make-node ;
 
 : (gadget-subtree) ( frompath topath gadget -- )
index 946fe283aa6ef2cb244062842bcd9677ec459661..12565235ab50b48f68b2f08db79e492c9bde9daa 100755 (executable)
@@ -26,7 +26,7 @@ SYMBOL: windows
     [ [ length 1- dup 1- ] keep exchange ] [ drop ] if ;
 
 : unregister-window ( handle -- )
-    windows global [ [ first = not ] with subset ] change-at ;
+    windows global [ [ first = not ] with filter ] change-at ;
 
 : raised-window ( world -- )
     windows get-global [ second eq? ] with find drop
index ee3c8729c4bb1171f93ca7e0993ffef5359399b2..9635a62e49b45351b359b262693f5cd004700178 100644 (file)
@@ -1,6 +1,6 @@
 USING: unicode.categories kernel math combinators splitting
 sequences math.parser io.files io assocs arrays namespaces
-math.ranges unicode.normalize
+math.ranges unicode.normalize unicode.syntax.backend
 unicode.syntax unicode.data compiler.units alien.syntax io.encodings.ascii ;
 IN: unicode.breaks
 
@@ -25,12 +25,12 @@ CATEGORY: grapheme-control Zl Zp Cc Cf ;
 
 : process-other-extend ( lines -- set )
     [ "#" split1 drop ";" split1 drop trim-blank ] map
-    [ empty? not ] subset
+    [ empty? not ] filter
     [ ".." split1 [ dup ] unless* [ hex> ] bi@ [a,b] ] map
     concat [ dup ] H{ } map>assoc ;
 
 : other-extend-lines ( -- lines )
-    "extra/unicode/PropList.txt" resource-path ascii file-lines ;
+    "resource:extra/unicode/PropList.txt" ascii file-lines ;
 
 VALUE: other-extend
 
@@ -105,9 +105,6 @@ VALUE: grapheme-table
 : string-reverse ( str -- rts )
     >graphemes reverse concat ;
 
-: unclip-last-slice ( seq -- beginning last )
-    dup 1 head-slice* swap peek ;
-
 : last-grapheme ( str -- i )
     unclip-last-slice grapheme-class swap
     [ grapheme-class dup rot grapheme-break? ] find-last-index ?1+ nip ;
index 58d836464c6963666162067509c2d1c2916ba8f5..f33338137a89a34653e14772e0def70eaf1841c3 100755 (executable)
@@ -1,16 +1,9 @@
 USING: assocs math kernel sequences io.files hashtables
-quotations splitting arrays math.parser hash2
-byte-arrays words namespaces words compiler.units parser io.encodings.ascii  ;
+quotations splitting arrays math.parser hash2 math.order
+byte-arrays words namespaces words compiler.units parser
+io.encodings.ascii unicode.syntax.backend ;
 IN: unicode.data
 
-<<
-: VALUE:
-    CREATE-WORD { f } clone [ first ] curry define ; parsing
-
-: set-value ( value word -- )
-    word-def first set-first ;
->>
-
 ! Convenience functions
 : ?between? ( n/f from to -- ? )
     pick [ between? ] [ 3drop f ] if ;
@@ -21,11 +14,11 @@ IN: unicode.data
     ascii file-lines [ ";" split ] map ;
 
 : load-data ( -- data )
-    "extra/unicode/UnicodeData.txt" resource-path data ;
+    "resource:extra/unicode/UnicodeData.txt" data ;
 
 : (process-data) ( index data -- newdata )
     [ [ nth ] keep first swap 2array ] with map
-    [ second empty? not ] subset
+    [ second empty? not ] filter
     [ >r hex> r> ] assoc-map ;
 
 : process-data ( index data -- hash )
@@ -48,9 +41,9 @@ IN: unicode.data
     [ " " split [ hex> ] map ] assoc-map ;
 
 : process-canonical ( data -- hash2 hash )
-    (process-decomposed) [ first* ] subset
+    (process-decomposed) [ first* ] filter
     [
-        [ second length 2 = ] subset
+        [ second length 2 = ] filter
         ! using 1009 as the size, the maximum load is 4
         [ first2 first2 rot 3array ] map 1009 alist>hash2
     ] keep
@@ -58,13 +51,13 @@ IN: unicode.data
 
 : process-compat ( data -- hash )
     (process-decomposed)
-    [ dup first* [ first2 1 tail 2array ] unless ] map
+    [ dup first* [ first2 rest 2array ] unless ] map
     >hashtable chain-decomposed ;
 
 : process-combining ( data -- hash )
     3 swap (process-data)
     [ string>number ] assoc-map
-    [ nip zero? not ] assoc-subset
+    [ nip zero? not ] assoc-filter
     >hashtable ;
 
 : categories ( -- names )
@@ -96,7 +89,7 @@ IN: unicode.data
     ] assoc-map >hashtable ;
 
 : multihex ( hexstring -- string )
-    " " split [ hex> ] map [ ] subset ;
+    " " split [ hex> ] map [ ] filter ;
 
 TUPLE: code-point lower title upper ;
 
@@ -127,8 +120,8 @@ VALUE: special-casing
 
 ! Special casing data
 : load-special-casing ( -- special-casing )
-    "extra/unicode/SpecialCasing.txt" resource-path data
-    [ length 5 = ] subset
+    "resource:extra/unicode/SpecialCasing.txt" data
+    [ length 5 = ] filter
     [ [ set-code-point ] each ] H{ } make-assoc ;
 
 load-data
index 34c329b55cc9b24f1c05c305e16cdd4a92f24603..c463c0f72770dde89b10219792ec7228a5473750 100644 (file)
@@ -51,11 +51,11 @@ IN: unicode.normalize
     [ >r >r 2dup r> r> insert ] 2each 2drop ; inline
 
 : reorder-slice ( string start -- slice done? )
-    2dup swap [ non-starter? not ] find* drop
+    2dup swap [ non-starter? not ] find-from drop
     [ [ over length ] unless* rot <slice> ] keep not ;
 
 : reorder-next ( string i -- new-i done? )
-    over [ non-starter? ] find* drop [
+    over [ non-starter? ] find-from drop [
         reorder-slice
         >r dup [ combining-class ] insertion-sort slice-to r>
     ] [ length t ] if* ;
@@ -67,7 +67,7 @@ IN: unicode.normalize
     0 reorder-loop ;
 
 : reorder-back ( string i -- )
-    over [ non-starter? not ] find-last* drop ?1+ reorder-next 2drop ;
+    over [ non-starter? not ] find-last-from drop ?1+ reorder-next 2drop ;
 
 : decompose ( string quot -- decomposed )
     ! When there are 8 and 32-bit strings, this'll be
diff --git a/extra/unicode/script/Scripts.txt b/extra/unicode/script/Scripts.txt
new file mode 100755 (executable)
index 0000000..7065486
--- /dev/null
@@ -0,0 +1,1747 @@
+# Scripts-5.1.0.txt
+# Date: 2008-03-20, 17:55:33 GMT [MD]
+#
+# Unicode Character Database
+# Copyright (c) 1991-2008 Unicode, Inc.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see UCD.html
+
+# ================================================
+
+# Property:    Script
+
+#  All code points not explicitly listed for Script
+#  have the value Unknown (Zzzz).
+
+# @missing: 0000..10FFFF; Unknown
+
+# ================================================
+
+0000..001F    ; Common # Cc  [32] <control-0000>..<control-001F>
+0020          ; Common # Zs       SPACE
+0021..0023    ; Common # Po   [3] EXCLAMATION MARK..NUMBER SIGN
+0024          ; Common # Sc       DOLLAR SIGN
+0025..0027    ; Common # Po   [3] PERCENT SIGN..APOSTROPHE
+0028          ; Common # Ps       LEFT PARENTHESIS
+0029          ; Common # Pe       RIGHT PARENTHESIS
+002A          ; Common # Po       ASTERISK
+002B          ; Common # Sm       PLUS SIGN
+002C          ; Common # Po       COMMA
+002D          ; Common # Pd       HYPHEN-MINUS
+002E..002F    ; Common # Po   [2] FULL STOP..SOLIDUS
+0030..0039    ; Common # Nd  [10] DIGIT ZERO..DIGIT NINE
+003A..003B    ; Common # Po   [2] COLON..SEMICOLON
+003C..003E    ; Common # Sm   [3] LESS-THAN SIGN..GREATER-THAN SIGN
+003F..0040    ; Common # Po   [2] QUESTION MARK..COMMERCIAL AT
+005B          ; Common # Ps       LEFT SQUARE BRACKET
+005C          ; Common # Po       REVERSE SOLIDUS
+005D          ; Common # Pe       RIGHT SQUARE BRACKET
+005E          ; Common # Sk       CIRCUMFLEX ACCENT
+005F          ; Common # Pc       LOW LINE
+0060          ; Common # Sk       GRAVE ACCENT
+007B          ; Common # Ps       LEFT CURLY BRACKET
+007C          ; Common # Sm       VERTICAL LINE
+007D          ; Common # Pe       RIGHT CURLY BRACKET
+007E          ; Common # Sm       TILDE
+007F..009F    ; Common # Cc  [33] <control-007F>..<control-009F>
+00A0          ; Common # Zs       NO-BREAK SPACE
+00A1          ; Common # Po       INVERTED EXCLAMATION MARK
+00A2..00A5    ; Common # Sc   [4] CENT SIGN..YEN SIGN
+00A6..00A7    ; Common # So   [2] BROKEN BAR..SECTION SIGN
+00A8          ; Common # Sk       DIAERESIS
+00A9          ; Common # So       COPYRIGHT SIGN
+00AB          ; Common # Pi       LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+00AC          ; Common # Sm       NOT SIGN
+00AD          ; Common # Cf       SOFT HYPHEN
+00AE          ; Common # So       REGISTERED SIGN
+00AF          ; Common # Sk       MACRON
+00B0          ; Common # So       DEGREE SIGN
+00B1          ; Common # Sm       PLUS-MINUS SIGN
+00B2..00B3    ; Common # No   [2] SUPERSCRIPT TWO..SUPERSCRIPT THREE
+00B4          ; Common # Sk       ACUTE ACCENT
+00B5          ; Common # L&       MICRO SIGN
+00B6          ; Common # So       PILCROW SIGN
+00B7          ; Common # Po       MIDDLE DOT
+00B8          ; Common # Sk       CEDILLA
+00B9          ; Common # No       SUPERSCRIPT ONE
+00BB          ; Common # Pf       RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+00BC..00BE    ; Common # No   [3] VULGAR FRACTION ONE QUARTER..VULGAR FRACTION THREE QUARTERS
+00BF          ; Common # Po       INVERTED QUESTION MARK
+00D7          ; Common # Sm       MULTIPLICATION SIGN
+00F7          ; Common # Sm       DIVISION SIGN
+02B9..02C1    ; Common # Lm   [9] MODIFIER LETTER PRIME..MODIFIER LETTER REVERSED GLOTTAL STOP
+02C2..02C5    ; Common # Sk   [4] MODIFIER LETTER LEFT ARROWHEAD..MODIFIER LETTER DOWN ARROWHEAD
+02C6..02D1    ; Common # Lm  [12] MODIFIER LETTER CIRCUMFLEX ACCENT..MODIFIER LETTER HALF TRIANGULAR COLON
+02D2..02DF    ; Common # Sk  [14] MODIFIER LETTER CENTRED RIGHT HALF RING..MODIFIER LETTER CROSS ACCENT
+02E5..02EB    ; Common # Sk   [7] MODIFIER LETTER EXTRA-HIGH TONE BAR..MODIFIER LETTER YANG DEPARTING TONE MARK
+02EC          ; Common # Lm       MODIFIER LETTER VOICING
+02ED          ; Common # Sk       MODIFIER LETTER UNASPIRATED
+02EE          ; Common # Lm       MODIFIER LETTER DOUBLE APOSTROPHE
+02EF..02FF    ; Common # Sk  [17] MODIFIER LETTER LOW DOWN ARROWHEAD..MODIFIER LETTER LOW LEFT ARROW
+0374          ; Common # Lm       GREEK NUMERAL SIGN
+037E          ; Common # Po       GREEK QUESTION MARK
+0385          ; Common # Sk       GREEK DIALYTIKA TONOS
+0387          ; Common # Po       GREEK ANO TELEIA
+0589          ; Common # Po       ARMENIAN FULL STOP
+0600..0603    ; Common # Cf   [4] ARABIC NUMBER SIGN..ARABIC SIGN SAFHA
+060C          ; Common # Po       ARABIC COMMA
+061B          ; Common # Po       ARABIC SEMICOLON
+061F          ; Common # Po       ARABIC QUESTION MARK
+0640          ; Common # Lm       ARABIC TATWEEL
+0660..0669    ; Common # Nd  [10] ARABIC-INDIC DIGIT ZERO..ARABIC-INDIC DIGIT NINE
+06DD          ; Common # Cf       ARABIC END OF AYAH
+0964..0965    ; Common # Po   [2] DEVANAGARI DANDA..DEVANAGARI DOUBLE DANDA
+0970          ; Common # Po       DEVANAGARI ABBREVIATION SIGN
+0CF1..0CF2    ; Common # So   [2] KANNADA SIGN JIHVAMULIYA..KANNADA SIGN UPADHMANIYA
+0E3F          ; Common # Sc       THAI CURRENCY SYMBOL BAHT
+10FB          ; Common # Po       GEORGIAN PARAGRAPH SEPARATOR
+16EB..16ED    ; Common # Po   [3] RUNIC SINGLE PUNCTUATION..RUNIC CROSS PUNCTUATION
+1735..1736    ; Common # Po   [2] PHILIPPINE SINGLE PUNCTUATION..PHILIPPINE DOUBLE PUNCTUATION
+1802..1803    ; Common # Po   [2] MONGOLIAN COMMA..MONGOLIAN FULL STOP
+1805          ; Common # Po       MONGOLIAN FOUR DOTS
+2000..200A    ; Common # Zs  [11] EN QUAD..HAIR SPACE
+200B          ; Common # Cf       ZERO WIDTH SPACE
+200E..200F    ; Common # Cf   [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK
+2010..2015    ; Common # Pd   [6] HYPHEN..HORIZONTAL BAR
+2016..2017    ; Common # Po   [2] DOUBLE VERTICAL LINE..DOUBLE LOW LINE
+2018          ; Common # Pi       LEFT SINGLE QUOTATION MARK
+2019          ; Common # Pf       RIGHT SINGLE QUOTATION MARK
+201A          ; Common # Ps       SINGLE LOW-9 QUOTATION MARK
+201B..201C    ; Common # Pi   [2] SINGLE HIGH-REVERSED-9 QUOTATION MARK..LEFT DOUBLE QUOTATION MARK
+201D          ; Common # Pf       RIGHT DOUBLE QUOTATION MARK
+201E          ; Common # Ps       DOUBLE LOW-9 QUOTATION MARK
+201F          ; Common # Pi       DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+2020..2027    ; Common # Po   [8] DAGGER..HYPHENATION POINT
+2028          ; Common # Zl       LINE SEPARATOR
+2029          ; Common # Zp       PARAGRAPH SEPARATOR
+202A..202E    ; Common # Cf   [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE
+202F          ; Common # Zs       NARROW NO-BREAK SPACE
+2030..2038    ; Common # Po   [9] PER MILLE SIGN..CARET
+2039          ; Common # Pi       SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+203A          ; Common # Pf       SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+203B..203E    ; Common # Po   [4] REFERENCE MARK..OVERLINE
+203F..2040    ; Common # Pc   [2] UNDERTIE..CHARACTER TIE
+2041..2043    ; Common # Po   [3] CARET INSERTION POINT..HYPHEN BULLET
+2044          ; Common # Sm       FRACTION SLASH
+2045          ; Common # Ps       LEFT SQUARE BRACKET WITH QUILL
+2046          ; Common # Pe       RIGHT SQUARE BRACKET WITH QUILL
+2047..2051    ; Common # Po  [11] DOUBLE QUESTION MARK..TWO ASTERISKS ALIGNED VERTICALLY
+2052          ; Common # Sm       COMMERCIAL MINUS SIGN
+2053          ; Common # Po       SWUNG DASH
+2054          ; Common # Pc       INVERTED UNDERTIE
+2055..205E    ; Common # Po  [10] FLOWER PUNCTUATION MARK..VERTICAL FOUR DOTS
+205F          ; Common # Zs       MEDIUM MATHEMATICAL SPACE
+2060..2064    ; Common # Cf   [5] WORD JOINER..INVISIBLE PLUS
+206A..206F    ; Common # Cf   [6] INHIBIT SYMMETRIC SWAPPING..NOMINAL DIGIT SHAPES
+2070          ; Common # No       SUPERSCRIPT ZERO
+2074..2079    ; Common # No   [6] SUPERSCRIPT FOUR..SUPERSCRIPT NINE
+207A..207C    ; Common # Sm   [3] SUPERSCRIPT PLUS SIGN..SUPERSCRIPT EQUALS SIGN
+207D          ; Common # Ps       SUPERSCRIPT LEFT PARENTHESIS
+207E          ; Common # Pe       SUPERSCRIPT RIGHT PARENTHESIS
+2080..2089    ; Common # No  [10] SUBSCRIPT ZERO..SUBSCRIPT NINE
+208A..208C    ; Common # Sm   [3] SUBSCRIPT PLUS SIGN..SUBSCRIPT EQUALS SIGN
+208D          ; Common # Ps       SUBSCRIPT LEFT PARENTHESIS
+208E          ; Common # Pe       SUBSCRIPT RIGHT PARENTHESIS
+20A0..20B5    ; Common # Sc  [22] EURO-CURRENCY SIGN..CEDI SIGN
+2100..2101    ; Common # So   [2] ACCOUNT OF..ADDRESSED TO THE SUBJECT
+2102          ; Common # L&       DOUBLE-STRUCK CAPITAL C
+2103..2106    ; Common # So   [4] DEGREE CELSIUS..CADA UNA
+2107          ; Common # L&       EULER CONSTANT
+2108..2109    ; Common # So   [2] SCRUPLE..DEGREE FAHRENHEIT
+210A..2113    ; Common # L&  [10] SCRIPT SMALL G..SCRIPT SMALL L
+2114          ; Common # So       L B BAR SYMBOL
+2115          ; Common # L&       DOUBLE-STRUCK CAPITAL N
+2116..2118    ; Common # So   [3] NUMERO SIGN..SCRIPT CAPITAL P
+2119..211D    ; Common # L&   [5] DOUBLE-STRUCK CAPITAL P..DOUBLE-STRUCK CAPITAL R
+211E..2123    ; Common # So   [6] PRESCRIPTION TAKE..VERSICLE
+2124          ; Common # L&       DOUBLE-STRUCK CAPITAL Z
+2125          ; Common # So       OUNCE SIGN
+2127          ; Common # So       INVERTED OHM SIGN
+2128          ; Common # L&       BLACK-LETTER CAPITAL Z
+2129          ; Common # So       TURNED GREEK SMALL LETTER IOTA
+212C..212D    ; Common # L&   [2] SCRIPT CAPITAL B..BLACK-LETTER CAPITAL C
+212E          ; Common # So       ESTIMATED SYMBOL
+212F..2131    ; Common # L&   [3] SCRIPT SMALL E..SCRIPT CAPITAL F
+2133..2134    ; Common # L&   [2] SCRIPT CAPITAL M..SCRIPT SMALL O
+2135..2138    ; Common # Lo   [4] ALEF SYMBOL..DALET SYMBOL
+2139          ; Common # L&       INFORMATION SOURCE
+213A..213B    ; Common # So   [2] ROTATED CAPITAL Q..FACSIMILE SIGN
+213C..213F    ; Common # L&   [4] DOUBLE-STRUCK SMALL PI..DOUBLE-STRUCK CAPITAL PI
+2140..2144    ; Common # Sm   [5] DOUBLE-STRUCK N-ARY SUMMATION..TURNED SANS-SERIF CAPITAL Y
+2145..2149    ; Common # L&   [5] DOUBLE-STRUCK ITALIC CAPITAL D..DOUBLE-STRUCK ITALIC SMALL J
+214A          ; Common # So       PROPERTY LINE
+214B          ; Common # Sm       TURNED AMPERSAND
+214C..214D    ; Common # So   [2] PER SIGN..AKTIESELSKAB
+214F          ; Common # So       SYMBOL FOR SAMARITAN SOURCE
+2153..215F    ; Common # No  [13] VULGAR FRACTION ONE THIRD..FRACTION NUMERATOR ONE
+2190..2194    ; Common # Sm   [5] LEFTWARDS ARROW..LEFT RIGHT ARROW
+2195..2199    ; Common # So   [5] UP DOWN ARROW..SOUTH WEST ARROW
+219A..219B    ; Common # Sm   [2] LEFTWARDS ARROW WITH STROKE..RIGHTWARDS ARROW WITH STROKE
+219C..219F    ; Common # So   [4] LEFTWARDS WAVE ARROW..UPWARDS TWO HEADED ARROW
+21A0          ; Common # Sm       RIGHTWARDS TWO HEADED ARROW
+21A1..21A2    ; Common # So   [2] DOWNWARDS TWO HEADED ARROW..LEFTWARDS ARROW WITH TAIL
+21A3          ; Common # Sm       RIGHTWARDS ARROW WITH TAIL
+21A4..21A5    ; Common # So   [2] LEFTWARDS ARROW FROM BAR..UPWARDS ARROW FROM BAR
+21A6          ; Common # Sm       RIGHTWARDS ARROW FROM BAR
+21A7..21AD    ; Common # So   [7] DOWNWARDS ARROW FROM BAR..LEFT RIGHT WAVE ARROW
+21AE          ; Common # Sm       LEFT RIGHT ARROW WITH STROKE
+21AF..21CD    ; Common # So  [31] DOWNWARDS ZIGZAG ARROW..LEFTWARDS DOUBLE ARROW WITH STROKE
+21CE..21CF    ; Common # Sm   [2] LEFT RIGHT DOUBLE ARROW WITH STROKE..RIGHTWARDS DOUBLE ARROW WITH STROKE
+21D0..21D1    ; Common # So   [2] LEFTWARDS DOUBLE ARROW..UPWARDS DOUBLE ARROW
+21D2          ; Common # Sm       RIGHTWARDS DOUBLE ARROW
+21D3          ; Common # So       DOWNWARDS DOUBLE ARROW
+21D4          ; Common # Sm       LEFT RIGHT DOUBLE ARROW
+21D5..21F3    ; Common # So  [31] UP DOWN DOUBLE ARROW..UP DOWN WHITE ARROW
+21F4..22FF    ; Common # Sm [268] RIGHT ARROW WITH SMALL CIRCLE..Z NOTATION BAG MEMBERSHIP
+2300..2307    ; Common # So   [8] DIAMETER SIGN..WAVY LINE
+2308..230B    ; Common # Sm   [4] LEFT CEILING..RIGHT FLOOR
+230C..231F    ; Common # So  [20] BOTTOM RIGHT CROP..BOTTOM RIGHT CORNER
+2320..2321    ; Common # Sm   [2] TOP HALF INTEGRAL..BOTTOM HALF INTEGRAL
+2322..2328    ; Common # So   [7] FROWN..KEYBOARD
+2329          ; Common # Ps       LEFT-POINTING ANGLE BRACKET
+232A          ; Common # Pe       RIGHT-POINTING ANGLE BRACKET
+232B..237B    ; Common # So  [81] ERASE TO THE LEFT..NOT CHECK MARK
+237C          ; Common # Sm       RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW
+237D..239A    ; Common # So  [30] SHOULDERED OPEN BOX..CLEAR SCREEN SYMBOL
+239B..23B3    ; Common # Sm  [25] LEFT PARENTHESIS UPPER HOOK..SUMMATION BOTTOM
+23B4..23DB    ; Common # So  [40] TOP SQUARE BRACKET..FUSE
+23DC..23E1    ; Common # Sm   [6] TOP PARENTHESIS..BOTTOM TORTOISE SHELL BRACKET
+23E2..23E7    ; Common # So   [6] WHITE TRAPEZIUM..ELECTRICAL INTERSECTION
+2400..2426    ; Common # So  [39] SYMBOL FOR NULL..SYMBOL FOR SUBSTITUTE FORM TWO
+2440..244A    ; Common # So  [11] OCR HOOK..OCR DOUBLE BACKSLASH
+2460..249B    ; Common # No  [60] CIRCLED DIGIT ONE..NUMBER TWENTY FULL STOP
+249C..24E9    ; Common # So  [78] PARENTHESIZED LATIN SMALL LETTER A..CIRCLED LATIN SMALL LETTER Z
+24EA..24FF    ; Common # No  [22] CIRCLED DIGIT ZERO..NEGATIVE CIRCLED DIGIT ZERO
+2500..25B6    ; Common # So [183] BOX DRAWINGS LIGHT HORIZONTAL..BLACK RIGHT-POINTING TRIANGLE
+25B7          ; Common # Sm       WHITE RIGHT-POINTING TRIANGLE
+25B8..25C0    ; Common # So   [9] BLACK RIGHT-POINTING SMALL TRIANGLE..BLACK LEFT-POINTING TRIANGLE
+25C1          ; Common # Sm       WHITE LEFT-POINTING TRIANGLE
+25C2..25F7    ; Common # So  [54] BLACK LEFT-POINTING SMALL TRIANGLE..WHITE CIRCLE WITH UPPER RIGHT QUADRANT
+25F8..25FF    ; Common # Sm   [8] UPPER LEFT TRIANGLE..LOWER RIGHT TRIANGLE
+2600..266E    ; Common # So [111] BLACK SUN WITH RAYS..MUSIC NATURAL SIGN
+266F          ; Common # Sm       MUSIC SHARP SIGN
+2670..269D    ; Common # So  [46] WEST SYRIAC CROSS..OUTLINED WHITE STAR
+26A0..26BC    ; Common # So  [29] WARNING SIGN..SESQUIQUADRATE
+26C0..26C3    ; Common # So   [4] WHITE DRAUGHTS MAN..BLACK DRAUGHTS KING
+2701..2704    ; Common # So   [4] UPPER BLADE SCISSORS..WHITE SCISSORS
+2706..2709    ; Common # So   [4] TELEPHONE LOCATION SIGN..ENVELOPE
+270C..2727    ; Common # So  [28] VICTORY HAND..WHITE FOUR POINTED STAR
+2729..274B    ; Common # So  [35] STRESS OUTLINED WHITE STAR..HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK
+274D          ; Common # So       SHADOWED WHITE CIRCLE
+274F..2752    ; Common # So   [4] LOWER RIGHT DROP-SHADOWED WHITE SQUARE..UPPER RIGHT SHADOWED WHITE SQUARE
+2756          ; Common # So       BLACK DIAMOND MINUS WHITE X
+2758..275E    ; Common # So   [7] LIGHT VERTICAL BAR..HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT
+2761..2767    ; Common # So   [7] CURVED STEM PARAGRAPH SIGN ORNAMENT..ROTATED FLORAL HEART BULLET
+2768          ; Common # Ps       MEDIUM LEFT PARENTHESIS ORNAMENT
+2769          ; Common # Pe       MEDIUM RIGHT PARENTHESIS ORNAMENT
+276A          ; Common # Ps       MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
+276B          ; Common # Pe       MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
+276C          ; Common # Ps       MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
+276D          ; Common # Pe       MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
+276E          ; Common # Ps       HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
+276F          ; Common # Pe       HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
+2770          ; Common # Ps       HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
+2771          ; Common # Pe       HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
+2772          ; Common # Ps       LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
+2773          ; Common # Pe       LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
+2774          ; Common # Ps       MEDIUM LEFT CURLY BRACKET ORNAMENT
+2775          ; Common # Pe       MEDIUM RIGHT CURLY BRACKET ORNAMENT
+2776..2793    ; Common # No  [30] DINGBAT NEGATIVE CIRCLED DIGIT ONE..DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN
+2794          ; Common # So       HEAVY WIDE-HEADED RIGHTWARDS ARROW
+2798..27AF    ; Common # So  [24] HEAVY SOUTH EAST ARROW..NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW
+27B1..27BE    ; Common # So  [14] NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW..OPEN-OUTLINED RIGHTWARDS ARROW
+27C0..27C4    ; Common # Sm   [5] THREE DIMENSIONAL ANGLE..OPEN SUPERSET
+27C5          ; Common # Ps       LEFT S-SHAPED BAG DELIMITER
+27C6          ; Common # Pe       RIGHT S-SHAPED BAG DELIMITER
+27C7..27CA    ; Common # Sm   [4] OR WITH DOT INSIDE..VERTICAL BAR WITH HORIZONTAL STROKE
+27CC          ; Common # Sm       LONG DIVISION
+27D0..27E5    ; Common # Sm  [22] WHITE DIAMOND WITH CENTRED DOT..WHITE SQUARE WITH RIGHTWARDS TICK
+27E6          ; Common # Ps       MATHEMATICAL LEFT WHITE SQUARE BRACKET
+27E7          ; Common # Pe       MATHEMATICAL RIGHT WHITE SQUARE BRACKET
+27E8          ; Common # Ps       MATHEMATICAL LEFT ANGLE BRACKET
+27E9          ; Common # Pe       MATHEMATICAL RIGHT ANGLE BRACKET
+27EA          ; Common # Ps       MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
+27EB          ; Common # Pe       MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
+27EC          ; Common # Ps       MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
+27ED          ; Common # Pe       MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
+27EE          ; Common # Ps       MATHEMATICAL LEFT FLATTENED PARENTHESIS
+27EF          ; Common # Pe       MATHEMATICAL RIGHT FLATTENED PARENTHESIS
+27F0..27FF    ; Common # Sm  [16] UPWARDS QUADRUPLE ARROW..LONG RIGHTWARDS SQUIGGLE ARROW
+2900..2982    ; Common # Sm [131] RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE..Z NOTATION TYPE COLON
+2983          ; Common # Ps       LEFT WHITE CURLY BRACKET
+2984          ; Common # Pe       RIGHT WHITE CURLY BRACKET
+2985          ; Common # Ps       LEFT WHITE PARENTHESIS
+2986          ; Common # Pe       RIGHT WHITE PARENTHESIS
+2987          ; Common # Ps       Z NOTATION LEFT IMAGE BRACKET
+2988          ; Common # Pe       Z NOTATION RIGHT IMAGE BRACKET
+2989          ; Common # Ps       Z NOTATION LEFT BINDING BRACKET
+298A          ; Common # Pe       Z NOTATION RIGHT BINDING BRACKET
+298B          ; Common # Ps       LEFT SQUARE BRACKET WITH UNDERBAR
+298C          ; Common # Pe       RIGHT SQUARE BRACKET WITH UNDERBAR
+298D          ; Common # Ps       LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
+298E          ; Common # Pe       RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+298F          ; Common # Ps       LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
+2990          ; Common # Pe       RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
+2991          ; Common # Ps       LEFT ANGLE BRACKET WITH DOT
+2992          ; Common # Pe       RIGHT ANGLE BRACKET WITH DOT
+2993          ; Common # Ps       LEFT ARC LESS-THAN BRACKET
+2994          ; Common # Pe       RIGHT ARC GREATER-THAN BRACKET
+2995          ; Common # Ps       DOUBLE LEFT ARC GREATER-THAN BRACKET
+2996          ; Common # Pe       DOUBLE RIGHT ARC LESS-THAN BRACKET
+2997          ; Common # Ps       LEFT BLACK TORTOISE SHELL BRACKET
+2998          ; Common # Pe       RIGHT BLACK TORTOISE SHELL BRACKET
+2999..29D7    ; Common # Sm  [63] DOTTED FENCE..BLACK HOURGLASS
+29D8          ; Common # Ps       LEFT WIGGLY FENCE
+29D9          ; Common # Pe       RIGHT WIGGLY FENCE
+29DA          ; Common # Ps       LEFT DOUBLE WIGGLY FENCE
+29DB          ; Common # Pe       RIGHT DOUBLE WIGGLY FENCE
+29DC..29FB    ; Common # Sm  [32] INCOMPLETE INFINITY..TRIPLE PLUS
+29FC          ; Common # Ps       LEFT-POINTING CURVED ANGLE BRACKET
+29FD          ; Common # Pe       RIGHT-POINTING CURVED ANGLE BRACKET
+29FE..2AFF    ; Common # Sm [258] TINY..N-ARY WHITE VERTICAL BAR
+2B00..2B2F    ; Common # So  [48] NORTH EAST WHITE ARROW..WHITE VERTICAL ELLIPSE
+2B30..2B44    ; Common # Sm  [21] LEFT ARROW WITH SMALL CIRCLE..RIGHTWARDS ARROW THROUGH SUPERSET
+2B45..2B46    ; Common # So   [2] LEFTWARDS QUADRUPLE ARROW..RIGHTWARDS QUADRUPLE ARROW
+2B47..2B4C    ; Common # Sm   [6] REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW..RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR
+2B50..2B54    ; Common # So   [5] WHITE MEDIUM STAR..WHITE RIGHT-POINTING PENTAGON
+2E00..2E01    ; Common # Po   [2] RIGHT ANGLE SUBSTITUTION MARKER..RIGHT ANGLE DOTTED SUBSTITUTION MARKER
+2E02          ; Common # Pi       LEFT SUBSTITUTION BRACKET
+2E03          ; Common # Pf       RIGHT SUBSTITUTION BRACKET
+2E04          ; Common # Pi       LEFT DOTTED SUBSTITUTION BRACKET
+2E05          ; Common # Pf       RIGHT DOTTED SUBSTITUTION BRACKET
+2E06..2E08    ; Common # Po   [3] RAISED INTERPOLATION MARKER..DOTTED TRANSPOSITION MARKER
+2E09          ; Common # Pi       LEFT TRANSPOSITION BRACKET
+2E0A          ; Common # Pf       RIGHT TRANSPOSITION BRACKET
+2E0B          ; Common # Po       RAISED SQUARE
+2E0C          ; Common # Pi       LEFT RAISED OMISSION BRACKET
+2E0D          ; Common # Pf       RIGHT RAISED OMISSION BRACKET
+2E0E..2E16    ; Common # Po   [9] EDITORIAL CORONIS..DOTTED RIGHT-POINTING ANGLE
+2E17          ; Common # Pd       DOUBLE OBLIQUE HYPHEN
+2E18..2E19    ; Common # Po   [2] INVERTED INTERROBANG..PALM BRANCH
+2E1A          ; Common # Pd       HYPHEN WITH DIAERESIS
+2E1B          ; Common # Po       TILDE WITH RING ABOVE
+2E1C          ; Common # Pi       LEFT LOW PARAPHRASE BRACKET
+2E1D          ; Common # Pf       RIGHT LOW PARAPHRASE BRACKET
+2E1E..2E1F    ; Common # Po   [2] TILDE WITH DOT ABOVE..TILDE WITH DOT BELOW
+2E20          ; Common # Pi       LEFT VERTICAL BAR WITH QUILL
+2E21          ; Common # Pf       RIGHT VERTICAL BAR WITH QUILL
+2E22          ; Common # Ps       TOP LEFT HALF BRACKET
+2E23          ; Common # Pe       TOP RIGHT HALF BRACKET
+2E24          ; Common # Ps       BOTTOM LEFT HALF BRACKET
+2E25          ; Common # Pe       BOTTOM RIGHT HALF BRACKET
+2E26          ; Common # Ps       LEFT SIDEWAYS U BRACKET
+2E27          ; Common # Pe       RIGHT SIDEWAYS U BRACKET
+2E28          ; Common # Ps       LEFT DOUBLE PARENTHESIS
+2E29          ; Common # Pe       RIGHT DOUBLE PARENTHESIS
+2E2A..2E2E    ; Common # Po   [5] TWO DOTS OVER ONE DOT PUNCTUATION..REVERSED QUESTION MARK
+2E2F          ; Common # Lm       VERTICAL TILDE
+2E30          ; Common # Po       RING POINT
+2FF0..2FFB    ; Common # So  [12] IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT..IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID
+3000          ; Common # Zs       IDEOGRAPHIC SPACE
+3001..3003    ; Common # Po   [3] IDEOGRAPHIC COMMA..DITTO MARK
+3004          ; Common # So       JAPANESE INDUSTRIAL STANDARD SYMBOL
+3006          ; Common # Lo       IDEOGRAPHIC CLOSING MARK
+3008          ; Common # Ps       LEFT ANGLE BRACKET
+3009          ; Common # Pe       RIGHT ANGLE BRACKET
+300A          ; Common # Ps       LEFT DOUBLE ANGLE BRACKET
+300B          ; Common # Pe       RIGHT DOUBLE ANGLE BRACKET
+300C          ; Common # Ps       LEFT CORNER BRACKET
+300D          ; Common # Pe       RIGHT CORNER BRACKET
+300E          ; Common # Ps       LEFT WHITE CORNER BRACKET
+300F          ; Common # Pe       RIGHT WHITE CORNER BRACKET
+3010          ; Common # Ps       LEFT BLACK LENTICULAR BRACKET
+3011          ; Common # Pe       RIGHT BLACK LENTICULAR BRACKET
+3012..3013    ; Common # So   [2] POSTAL MARK..GETA MARK
+3014          ; Common # Ps       LEFT TORTOISE SHELL BRACKET
+3015          ; Common # Pe       RIGHT TORTOISE SHELL BRACKET
+3016          ; Common # Ps       LEFT WHITE LENTICULAR BRACKET
+3017          ; Common # Pe       RIGHT WHITE LENTICULAR BRACKET
+3018          ; Common # Ps       LEFT WHITE TORTOISE SHELL BRACKET
+3019          ; Common # Pe       RIGHT WHITE TORTOISE SHELL BRACKET
+301A          ; Common # Ps       LEFT WHITE SQUARE BRACKET
+301B          ; Common # Pe       RIGHT WHITE SQUARE BRACKET
+301C          ; Common # Pd       WAVE DASH
+301D          ; Common # Ps       REVERSED DOUBLE PRIME QUOTATION MARK
+301E..301F    ; Common # Pe   [2] DOUBLE PRIME QUOTATION MARK..LOW DOUBLE PRIME QUOTATION MARK
+3020          ; Common # So       POSTAL MARK FACE
+3030          ; Common # Pd       WAVY DASH
+3031..3035    ; Common # Lm   [5] VERTICAL KANA REPEAT MARK..VERTICAL KANA REPEAT MARK LOWER HALF
+3036..3037    ; Common # So   [2] CIRCLED POSTAL MARK..IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL
+303C          ; Common # Lo       MASU MARK
+303D          ; Common # Po       PART ALTERNATION MARK
+303E..303F    ; Common # So   [2] IDEOGRAPHIC VARIATION INDICATOR..IDEOGRAPHIC HALF FILL SPACE
+309B..309C    ; Common # Sk   [2] KATAKANA-HIRAGANA VOICED SOUND MARK..KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+30A0          ; Common # Pd       KATAKANA-HIRAGANA DOUBLE HYPHEN
+30FB          ; Common # Po       KATAKANA MIDDLE DOT
+30FC          ; Common # Lm       KATAKANA-HIRAGANA PROLONGED SOUND MARK
+3190..3191    ; Common # So   [2] IDEOGRAPHIC ANNOTATION LINKING MARK..IDEOGRAPHIC ANNOTATION REVERSE MARK
+3192..3195    ; Common # No   [4] IDEOGRAPHIC ANNOTATION ONE MARK..IDEOGRAPHIC ANNOTATION FOUR MARK
+3196..319F    ; Common # So  [10] IDEOGRAPHIC ANNOTATION TOP MARK..IDEOGRAPHIC ANNOTATION MAN MARK
+31C0..31E3    ; Common # So  [36] CJK STROKE T..CJK STROKE Q
+3220..3229    ; Common # No  [10] PARENTHESIZED IDEOGRAPH ONE..PARENTHESIZED IDEOGRAPH TEN
+322A..3243    ; Common # So  [26] PARENTHESIZED IDEOGRAPH MOON..PARENTHESIZED IDEOGRAPH REACH
+3250          ; Common # So       PARTNERSHIP SIGN
+3251..325F    ; Common # No  [15] CIRCLED NUMBER TWENTY ONE..CIRCLED NUMBER THIRTY FIVE
+327F          ; Common # So       KOREAN STANDARD SYMBOL
+3280..3289    ; Common # No  [10] CIRCLED IDEOGRAPH ONE..CIRCLED IDEOGRAPH TEN
+328A..32B0    ; Common # So  [39] CIRCLED IDEOGRAPH MOON..CIRCLED IDEOGRAPH NIGHT
+32B1..32BF    ; Common # No  [15] CIRCLED NUMBER THIRTY SIX..CIRCLED NUMBER FIFTY
+32C0..32CF    ; Common # So  [16] IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY..LIMITED LIABILITY SIGN
+3358..33FF    ; Common # So [168] IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO..SQUARE GAL
+4DC0..4DFF    ; Common # So  [64] HEXAGRAM FOR THE CREATIVE HEAVEN..HEXAGRAM FOR BEFORE COMPLETION
+A700..A716    ; Common # Sk  [23] MODIFIER LETTER CHINESE TONE YIN PING..MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR
+A717..A71F    ; Common # Lm   [9] MODIFIER LETTER DOT VERTICAL BAR..MODIFIER LETTER LOW INVERTED EXCLAMATION MARK
+A720..A721    ; Common # Sk   [2] MODIFIER LETTER STRESS AND HIGH TONE..MODIFIER LETTER STRESS AND LOW TONE
+A788          ; Common # Lm       MODIFIER LETTER LOW CIRCUMFLEX ACCENT
+A789..A78A    ; Common # Sk   [2] MODIFIER LETTER COLON..MODIFIER LETTER SHORT EQUALS SIGN
+FD3E          ; Common # Ps       ORNATE LEFT PARENTHESIS
+FD3F          ; Common # Pe       ORNATE RIGHT PARENTHESIS
+FDFD          ; Common # So       ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM
+FE10..FE16    ; Common # Po   [7] PRESENTATION FORM FOR VERTICAL COMMA..PRESENTATION FORM FOR VERTICAL QUESTION MARK
+FE17          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
+FE18          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
+FE19          ; Common # Po       PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
+FE30          ; Common # Po       PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
+FE31..FE32    ; Common # Pd   [2] PRESENTATION FORM FOR VERTICAL EM DASH..PRESENTATION FORM FOR VERTICAL EN DASH
+FE33..FE34    ; Common # Pc   [2] PRESENTATION FORM FOR VERTICAL LOW LINE..PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
+FE35          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
+FE36          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
+FE37          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
+FE38          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
+FE39          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
+FE3A          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
+FE3B          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
+FE3C          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
+FE3D          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
+FE3E          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
+FE3F          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
+FE40          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
+FE41          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
+FE42          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
+FE43          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
+FE44          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
+FE45..FE46    ; Common # Po   [2] SESAME DOT..WHITE SESAME DOT
+FE47          ; Common # Ps       PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
+FE48          ; Common # Pe       PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
+FE49..FE4C    ; Common # Po   [4] DASHED OVERLINE..DOUBLE WAVY OVERLINE
+FE4D..FE4F    ; Common # Pc   [3] DASHED LOW LINE..WAVY LOW LINE
+FE50..FE52    ; Common # Po   [3] SMALL COMMA..SMALL FULL STOP
+FE54..FE57    ; Common # Po   [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK
+FE58          ; Common # Pd       SMALL EM DASH
+FE59          ; Common # Ps       SMALL LEFT PARENTHESIS
+FE5A          ; Common # Pe       SMALL RIGHT PARENTHESIS
+FE5B          ; Common # Ps       SMALL LEFT CURLY BRACKET
+FE5C          ; Common # Pe       SMALL RIGHT CURLY BRACKET
+FE5D          ; Common # Ps       SMALL LEFT TORTOISE SHELL BRACKET
+FE5E          ; Common # Pe       SMALL RIGHT TORTOISE SHELL BRACKET
+FE5F..FE61    ; Common # Po   [3] SMALL NUMBER SIGN..SMALL ASTERISK
+FE62          ; Common # Sm       SMALL PLUS SIGN
+FE63          ; Common # Pd       SMALL HYPHEN-MINUS
+FE64..FE66    ; Common # Sm   [3] SMALL LESS-THAN SIGN..SMALL EQUALS SIGN
+FE68          ; Common # Po       SMALL REVERSE SOLIDUS
+FE69          ; Common # Sc       SMALL DOLLAR SIGN
+FE6A..FE6B    ; Common # Po   [2] SMALL PERCENT SIGN..SMALL COMMERCIAL AT
+FEFF          ; Common # Cf       ZERO WIDTH NO-BREAK SPACE
+FF01..FF03    ; Common # Po   [3] FULLWIDTH EXCLAMATION MARK..FULLWIDTH NUMBER SIGN
+FF04          ; Common # Sc       FULLWIDTH DOLLAR SIGN
+FF05..FF07    ; Common # Po   [3] FULLWIDTH PERCENT SIGN..FULLWIDTH APOSTROPHE
+FF08          ; Common # Ps       FULLWIDTH LEFT PARENTHESIS
+FF09          ; Common # Pe       FULLWIDTH RIGHT PARENTHESIS
+FF0A          ; Common # Po       FULLWIDTH ASTERISK
+FF0B          ; Common # Sm       FULLWIDTH PLUS SIGN
+FF0C          ; Common # Po       FULLWIDTH COMMA
+FF0D          ; Common # Pd       FULLWIDTH HYPHEN-MINUS
+FF0E..FF0F    ; Common # Po   [2] FULLWIDTH FULL STOP..FULLWIDTH SOLIDUS
+FF10..FF19    ; Common # Nd  [10] FULLWIDTH DIGIT ZERO..FULLWIDTH DIGIT NINE
+FF1A..FF1B    ; Common # Po   [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON
+FF1C..FF1E    ; Common # Sm   [3] FULLWIDTH LESS-THAN SIGN..FULLWIDTH GREATER-THAN SIGN
+FF1F..FF20    ; Common # Po   [2] FULLWIDTH QUESTION MARK..FULLWIDTH COMMERCIAL AT
+FF3B          ; Common # Ps       FULLWIDTH LEFT SQUARE BRACKET
+FF3C          ; Common # Po       FULLWIDTH REVERSE SOLIDUS
+FF3D          ; Common # Pe       FULLWIDTH RIGHT SQUARE BRACKET
+FF3E          ; Common # Sk       FULLWIDTH CIRCUMFLEX ACCENT
+FF3F          ; Common # Pc       FULLWIDTH LOW LINE
+FF40          ; Common # Sk       FULLWIDTH GRAVE ACCENT
+FF5B          ; Common # Ps       FULLWIDTH LEFT CURLY BRACKET
+FF5C          ; Common # Sm       FULLWIDTH VERTICAL LINE
+FF5D          ; Common # Pe       FULLWIDTH RIGHT CURLY BRACKET
+FF5E          ; Common # Sm       FULLWIDTH TILDE
+FF5F          ; Common # Ps       FULLWIDTH LEFT WHITE PARENTHESIS
+FF60          ; Common # Pe       FULLWIDTH RIGHT WHITE PARENTHESIS
+FF61          ; Common # Po       HALFWIDTH IDEOGRAPHIC FULL STOP
+FF62          ; Common # Ps       HALFWIDTH LEFT CORNER BRACKET
+FF63          ; Common # Pe       HALFWIDTH RIGHT CORNER BRACKET
+FF64..FF65    ; Common # Po   [2] HALFWIDTH IDEOGRAPHIC COMMA..HALFWIDTH KATAKANA MIDDLE DOT
+FF70          ; Common # Lm       HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK
+FF9E..FF9F    ; Common # Lm   [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK
+FFE0..FFE1    ; Common # Sc   [2] FULLWIDTH CENT SIGN..FULLWIDTH POUND SIGN
+FFE2          ; Common # Sm       FULLWIDTH NOT SIGN
+FFE3          ; Common # Sk       FULLWIDTH MACRON
+FFE4          ; Common # So       FULLWIDTH BROKEN BAR
+FFE5..FFE6    ; Common # Sc   [2] FULLWIDTH YEN SIGN..FULLWIDTH WON SIGN
+FFE8          ; Common # So       HALFWIDTH FORMS LIGHT VERTICAL
+FFE9..FFEC    ; Common # Sm   [4] HALFWIDTH LEFTWARDS ARROW..HALFWIDTH DOWNWARDS ARROW
+FFED..FFEE    ; Common # So   [2] HALFWIDTH BLACK SQUARE..HALFWIDTH WHITE CIRCLE
+FFF9..FFFB    ; Common # Cf   [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR
+FFFC..FFFD    ; Common # So   [2] OBJECT REPLACEMENT CHARACTER..REPLACEMENT CHARACTER
+10100..10101  ; Common # Po   [2] AEGEAN WORD SEPARATOR LINE..AEGEAN WORD SEPARATOR DOT
+10102         ; Common # So       AEGEAN CHECK MARK
+10107..10133  ; Common # No  [45] AEGEAN NUMBER ONE..AEGEAN NUMBER NINETY THOUSAND
+10137..1013F  ; Common # So   [9] AEGEAN WEIGHT BASE UNIT..AEGEAN MEASURE THIRD SUBUNIT
+10190..1019B  ; Common # So  [12] ROMAN SEXTANS SIGN..ROMAN CENTURIAL SIGN
+101D0..101FC  ; Common # So  [45] PHAISTOS DISC SIGN PEDESTRIAN..PHAISTOS DISC SIGN WAVY BAND
+1D000..1D0F5  ; Common # So [246] BYZANTINE MUSICAL SYMBOL PSILI..BYZANTINE MUSICAL SYMBOL GORGON NEO KATO
+1D100..1D126  ; Common # So  [39] MUSICAL SYMBOL SINGLE BARLINE..MUSICAL SYMBOL DRUM CLEF-2
+1D129..1D164  ; Common # So  [60] MUSICAL SYMBOL MULTIPLE MEASURE REST..MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE
+1D165..1D166  ; Common # Mc   [2] MUSICAL SYMBOL COMBINING STEM..MUSICAL SYMBOL COMBINING SPRECHGESANG STEM
+1D16A..1D16C  ; Common # So   [3] MUSICAL SYMBOL FINGERED TREMOLO-1..MUSICAL SYMBOL FINGERED TREMOLO-3
+1D16D..1D172  ; Common # Mc   [6] MUSICAL SYMBOL COMBINING AUGMENTATION DOT..MUSICAL SYMBOL COMBINING FLAG-5
+1D173..1D17A  ; Common # Cf   [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE
+1D183..1D184  ; Common # So   [2] MUSICAL SYMBOL ARPEGGIATO UP..MUSICAL SYMBOL ARPEGGIATO DOWN
+1D18C..1D1A9  ; Common # So  [30] MUSICAL SYMBOL RINFORZANDO..MUSICAL SYMBOL DEGREE SLASH
+1D1AE..1D1DD  ; Common # So  [48] MUSICAL SYMBOL PEDAL MARK..MUSICAL SYMBOL PES SUBPUNCTIS
+1D300..1D356  ; Common # So  [87] MONOGRAM FOR EARTH..TETRAGRAM FOR FOSTERING
+1D360..1D371  ; Common # No  [18] COUNTING ROD UNIT DIGIT ONE..COUNTING ROD TENS DIGIT NINE
+1D400..1D454  ; Common # L&  [85] MATHEMATICAL BOLD CAPITAL A..MATHEMATICAL ITALIC SMALL G
+1D456..1D49C  ; Common # L&  [71] MATHEMATICAL ITALIC SMALL I..MATHEMATICAL SCRIPT CAPITAL A
+1D49E..1D49F  ; Common # L&   [2] MATHEMATICAL SCRIPT CAPITAL C..MATHEMATICAL SCRIPT CAPITAL D
+1D4A2         ; Common # L&       MATHEMATICAL SCRIPT CAPITAL G
+1D4A5..1D4A6  ; Common # L&   [2] MATHEMATICAL SCRIPT CAPITAL J..MATHEMATICAL SCRIPT CAPITAL K
+1D4A9..1D4AC  ; Common # L&   [4] MATHEMATICAL SCRIPT CAPITAL N..MATHEMATICAL SCRIPT CAPITAL Q
+1D4AE..1D4B9  ; Common # L&  [12] MATHEMATICAL SCRIPT CAPITAL S..MATHEMATICAL SCRIPT SMALL D
+1D4BB         ; Common # L&       MATHEMATICAL SCRIPT SMALL F
+1D4BD..1D4C3  ; Common # L&   [7] MATHEMATICAL SCRIPT SMALL H..MATHEMATICAL SCRIPT SMALL N
+1D4C5..1D505  ; Common # L&  [65] MATHEMATICAL SCRIPT SMALL P..MATHEMATICAL FRAKTUR CAPITAL B
+1D507..1D50A  ; Common # L&   [4] MATHEMATICAL FRAKTUR CAPITAL D..MATHEMATICAL FRAKTUR CAPITAL G
+1D50D..1D514  ; Common # L&   [8] MATHEMATICAL FRAKTUR CAPITAL J..MATHEMATICAL FRAKTUR CAPITAL Q
+1D516..1D51C  ; Common # L&   [7] MATHEMATICAL FRAKTUR CAPITAL S..MATHEMATICAL FRAKTUR CAPITAL Y
+1D51E..1D539  ; Common # L&  [28] MATHEMATICAL FRAKTUR SMALL A..MATHEMATICAL DOUBLE-STRUCK CAPITAL B
+1D53B..1D53E  ; Common # L&   [4] MATHEMATICAL DOUBLE-STRUCK CAPITAL D..MATHEMATICAL DOUBLE-STRUCK CAPITAL G
+1D540..1D544  ; Common # L&   [5] MATHEMATICAL DOUBLE-STRUCK CAPITAL I..MATHEMATICAL DOUBLE-STRUCK CAPITAL M
+1D546         ; Common # L&       MATHEMATICAL DOUBLE-STRUCK CAPITAL O
+1D54A..1D550  ; Common # L&   [7] MATHEMATICAL DOUBLE-STRUCK CAPITAL S..MATHEMATICAL DOUBLE-STRUCK CAPITAL Y
+1D552..1D6A5  ; Common # L& [340] MATHEMATICAL DOUBLE-STRUCK SMALL A..MATHEMATICAL ITALIC SMALL DOTLESS J
+1D6A8..1D6C0  ; Common # L&  [25] MATHEMATICAL BOLD CAPITAL ALPHA..MATHEMATICAL BOLD CAPITAL OMEGA
+1D6C1         ; Common # Sm       MATHEMATICAL BOLD NABLA
+1D6C2..1D6DA  ; Common # L&  [25] MATHEMATICAL BOLD SMALL ALPHA..MATHEMATICAL BOLD SMALL OMEGA
+1D6DB         ; Common # Sm       MATHEMATICAL BOLD PARTIAL DIFFERENTIAL
+1D6DC..1D6FA  ; Common # L&  [31] MATHEMATICAL BOLD EPSILON SYMBOL..MATHEMATICAL ITALIC CAPITAL OMEGA
+1D6FB         ; Common # Sm       MATHEMATICAL ITALIC NABLA
+1D6FC..1D714  ; Common # L&  [25] MATHEMATICAL ITALIC SMALL ALPHA..MATHEMATICAL ITALIC SMALL OMEGA
+1D715         ; Common # Sm       MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL
+1D716..1D734  ; Common # L&  [31] MATHEMATICAL ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD ITALIC CAPITAL OMEGA
+1D735         ; Common # Sm       MATHEMATICAL BOLD ITALIC NABLA
+1D736..1D74E  ; Common # L&  [25] MATHEMATICAL BOLD ITALIC SMALL ALPHA..MATHEMATICAL BOLD ITALIC SMALL OMEGA
+1D74F         ; Common # Sm       MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL
+1D750..1D76E  ; Common # L&  [31] MATHEMATICAL BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA
+1D76F         ; Common # Sm       MATHEMATICAL SANS-SERIF BOLD NABLA
+1D770..1D788  ; Common # L&  [25] MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA
+1D789         ; Common # Sm       MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL
+1D78A..1D7A8  ; Common # L&  [31] MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL..MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA
+1D7A9         ; Common # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA
+1D7AA..1D7C2  ; Common # L&  [25] MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA..MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA
+1D7C3         ; Common # Sm       MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL
+1D7C4..1D7CB  ; Common # L&   [8] MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL..MATHEMATICAL BOLD SMALL DIGAMMA
+1D7CE..1D7FF  ; Common # Nd  [50] MATHEMATICAL BOLD DIGIT ZERO..MATHEMATICAL MONOSPACE DIGIT NINE
+1F000..1F02B  ; Common # So  [44] MAHJONG TILE EAST WIND..MAHJONG TILE BACK
+1F030..1F093  ; Common # So [100] DOMINO TILE HORIZONTAL BACK..DOMINO TILE VERTICAL-06-06
+E0001         ; Common # Cf       LANGUAGE TAG
+E0020..E007F  ; Common # Cf  [96] TAG SPACE..CANCEL TAG
+
+# Total code points: 5178
+
+# ================================================
+
+0041..005A    ; Latin # L&  [26] LATIN CAPITAL LETTER A..LATIN CAPITAL LETTER Z
+0061..007A    ; Latin # L&  [26] LATIN SMALL LETTER A..LATIN SMALL LETTER Z
+00AA          ; Latin # L&       FEMININE ORDINAL INDICATOR
+00BA          ; Latin # L&       MASCULINE ORDINAL INDICATOR
+00C0..00D6    ; Latin # L&  [23] LATIN CAPITAL LETTER A WITH GRAVE..LATIN CAPITAL LETTER O WITH DIAERESIS
+00D8..00F6    ; Latin # L&  [31] LATIN CAPITAL LETTER O WITH STROKE..LATIN SMALL LETTER O WITH DIAERESIS
+00F8..01BA    ; Latin # L& [195] LATIN SMALL LETTER O WITH STROKE..LATIN SMALL LETTER EZH WITH TAIL
+01BB          ; Latin # Lo       LATIN LETTER TWO WITH STROKE
+01BC..01BF    ; Latin # L&   [4] LATIN CAPITAL LETTER TONE FIVE..LATIN LETTER WYNN
+01C0..01C3    ; Latin # Lo   [4] LATIN LETTER DENTAL CLICK..LATIN LETTER RETROFLEX CLICK
+01C4..0293    ; Latin # L& [208] LATIN CAPITAL LETTER DZ WITH CARON..LATIN SMALL LETTER EZH WITH CURL
+0294          ; Latin # Lo       LATIN LETTER GLOTTAL STOP
+0295..02AF    ; Latin # L&  [27] LATIN LETTER PHARYNGEAL VOICED FRICATIVE..LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL
+02B0..02B8    ; Latin # Lm   [9] MODIFIER LETTER SMALL H..MODIFIER LETTER SMALL Y
+02E0..02E4    ; Latin # Lm   [5] MODIFIER LETTER SMALL GAMMA..MODIFIER LETTER SMALL REVERSED GLOTTAL STOP
+1D00..1D25    ; Latin # L&  [38] LATIN LETTER SMALL CAPITAL A..LATIN LETTER AIN
+1D2C..1D5C    ; Latin # Lm  [49] MODIFIER LETTER CAPITAL A..MODIFIER LETTER SMALL AIN
+1D62..1D65    ; Latin # L&   [4] LATIN SUBSCRIPT SMALL LETTER I..LATIN SUBSCRIPT SMALL LETTER V
+1D6B..1D77    ; Latin # L&  [13] LATIN SMALL LETTER UE..LATIN SMALL LETTER TURNED G
+1D79..1D9A    ; Latin # L&  [34] LATIN SMALL LETTER INSULAR G..LATIN SMALL LETTER EZH WITH RETROFLEX HOOK
+1D9B..1DBE    ; Latin # Lm  [36] MODIFIER LETTER SMALL TURNED ALPHA..MODIFIER LETTER SMALL EZH
+1E00..1EFF    ; Latin # L& [256] LATIN CAPITAL LETTER A WITH RING BELOW..LATIN SMALL LETTER Y WITH LOOP
+2071          ; Latin # L&       SUPERSCRIPT LATIN SMALL LETTER I
+207F          ; Latin # L&       SUPERSCRIPT LATIN SMALL LETTER N
+2090..2094    ; Latin # Lm   [5] LATIN SUBSCRIPT SMALL LETTER A..LATIN SUBSCRIPT SMALL LETTER SCHWA
+212A..212B    ; Latin # L&   [2] KELVIN SIGN..ANGSTROM SIGN
+2132          ; Latin # L&       TURNED CAPITAL F
+214E          ; Latin # L&       TURNED SMALL F
+2160..2182    ; Latin # Nl  [35] ROMAN NUMERAL ONE..ROMAN NUMERAL TEN THOUSAND
+2183..2184    ; Latin # L&   [2] ROMAN NUMERAL REVERSED ONE HUNDRED..LATIN SMALL LETTER REVERSED C
+2185..2188    ; Latin # Nl   [4] ROMAN NUMERAL SIX LATE FORM..ROMAN NUMERAL ONE HUNDRED THOUSAND
+2C60..2C6F    ; Latin # L&  [16] LATIN CAPITAL LETTER L WITH DOUBLE BAR..LATIN CAPITAL LETTER TURNED A
+2C71..2C7C    ; Latin # L&  [12] LATIN SMALL LETTER V WITH RIGHT HOOK..LATIN SUBSCRIPT SMALL LETTER J
+2C7D          ; Latin # Lm       MODIFIER LETTER CAPITAL V
+A722..A76F    ; Latin # L&  [78] LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF..LATIN SMALL LETTER CON
+A770          ; Latin # Lm       MODIFIER LETTER US
+A771..A787    ; Latin # L&  [23] LATIN SMALL LETTER DUM..LATIN SMALL LETTER INSULAR T
+A78B..A78C    ; Latin # L&   [2] LATIN CAPITAL LETTER SALTILLO..LATIN SMALL LETTER SALTILLO
+A7FB..A7FF    ; Latin # Lo   [5] LATIN EPIGRAPHIC LETTER REVERSED F..LATIN EPIGRAPHIC LETTER ARCHAIC M
+FB00..FB06    ; Latin # L&   [7] LATIN SMALL LIGATURE FF..LATIN SMALL LIGATURE ST
+FF21..FF3A    ; Latin # L&  [26] FULLWIDTH LATIN CAPITAL LETTER A..FULLWIDTH LATIN CAPITAL LETTER Z
+FF41..FF5A    ; Latin # L&  [26] FULLWIDTH LATIN SMALL LETTER A..FULLWIDTH LATIN SMALL LETTER Z
+
+# Total code points: 1241
+
+# ================================================
+
+0370..0373    ; Greek # L&   [4] GREEK CAPITAL LETTER HETA..GREEK SMALL LETTER ARCHAIC SAMPI
+0375          ; Greek # Sk       GREEK LOWER NUMERAL SIGN
+0376..0377    ; Greek # L&   [2] GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA..GREEK SMALL LETTER PAMPHYLIAN DIGAMMA
+037A          ; Greek # Lm       GREEK YPOGEGRAMMENI
+037B..037D    ; Greek # L&   [3] GREEK SMALL REVERSED LUNATE SIGMA SYMBOL..GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL
+0384          ; Greek # Sk       GREEK TONOS
+0386          ; Greek # L&       GREEK CAPITAL LETTER ALPHA WITH TONOS
+0388..038A    ; Greek # L&   [3] GREEK CAPITAL LETTER EPSILON WITH TONOS..GREEK CAPITAL LETTER IOTA WITH TONOS
+038C          ; Greek # L&       GREEK CAPITAL LETTER OMICRON WITH TONOS
+038E..03A1    ; Greek # L&  [20] GREEK CAPITAL LETTER UPSILON WITH TONOS..GREEK CAPITAL LETTER RHO
+03A3..03E1    ; Greek # L&  [63] GREEK CAPITAL LETTER SIGMA..GREEK SMALL LETTER SAMPI
+03F0..03F5    ; Greek # L&   [6] GREEK KAPPA SYMBOL..GREEK LUNATE EPSILON SYMBOL
+03F6          ; Greek # Sm       GREEK REVERSED LUNATE EPSILON SYMBOL
+03F7..03FF    ; Greek # L&   [9] GREEK CAPITAL LETTER SHO..GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
+1D26..1D2A    ; Greek # L&   [5] GREEK LETTER SMALL CAPITAL GAMMA..GREEK LETTER SMALL CAPITAL PSI
+1D5D..1D61    ; Greek # Lm   [5] MODIFIER LETTER SMALL BETA..MODIFIER LETTER SMALL CHI
+1D66..1D6A    ; Greek # L&   [5] GREEK SUBSCRIPT SMALL LETTER BETA..GREEK SUBSCRIPT SMALL LETTER CHI
+1DBF          ; Greek # Lm       MODIFIER LETTER SMALL THETA
+1F00..1F15    ; Greek # L&  [22] GREEK SMALL LETTER ALPHA WITH PSILI..GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA
+1F18..1F1D    ; Greek # L&   [6] GREEK CAPITAL LETTER EPSILON WITH PSILI..GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
+1F20..1F45    ; Greek # L&  [38] GREEK SMALL LETTER ETA WITH PSILI..GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA
+1F48..1F4D    ; Greek # L&   [6] GREEK CAPITAL LETTER OMICRON WITH PSILI..GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
+1F50..1F57    ; Greek # L&   [8] GREEK SMALL LETTER UPSILON WITH PSILI..GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI
+1F59          ; Greek # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA
+1F5B          ; Greek # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
+1F5D          ; Greek # L&       GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
+1F5F..1F7D    ; Greek # L&  [31] GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI..GREEK SMALL LETTER OMEGA WITH OXIA
+1F80..1FB4    ; Greek # L&  [53] GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI..GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
+1FB6..1FBC    ; Greek # L&   [7] GREEK SMALL LETTER ALPHA WITH PERISPOMENI..GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
+1FBD          ; Greek # Sk       GREEK KORONIS
+1FBE          ; Greek # L&       GREEK PROSGEGRAMMENI
+1FBF..1FC1    ; Greek # Sk   [3] GREEK PSILI..GREEK DIALYTIKA AND PERISPOMENI
+1FC2..1FC4    ; Greek # L&   [3] GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
+1FC6..1FCC    ; Greek # L&   [7] GREEK SMALL LETTER ETA WITH PERISPOMENI..GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
+1FCD..1FCF    ; Greek # Sk   [3] GREEK PSILI AND VARIA..GREEK PSILI AND PERISPOMENI
+1FD0..1FD3    ; Greek # L&   [4] GREEK SMALL LETTER IOTA WITH VRACHY..GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
+1FD6..1FDB    ; Greek # L&   [6] GREEK SMALL LETTER IOTA WITH PERISPOMENI..GREEK CAPITAL LETTER IOTA WITH OXIA
+1FDD..1FDF    ; Greek # Sk   [3] GREEK DASIA AND VARIA..GREEK DASIA AND PERISPOMENI
+1FE0..1FEC    ; Greek # L&  [13] GREEK SMALL LETTER UPSILON WITH VRACHY..GREEK CAPITAL LETTER RHO WITH DASIA
+1FED..1FEF    ; Greek # Sk   [3] GREEK DIALYTIKA AND VARIA..GREEK VARIA
+1FF2..1FF4    ; Greek # L&   [3] GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI..GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
+1FF6..1FFC    ; Greek # L&   [7] GREEK SMALL LETTER OMEGA WITH PERISPOMENI..GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
+1FFD..1FFE    ; Greek # Sk   [2] GREEK OXIA..GREEK DASIA
+2126          ; Greek # L&       OHM SIGN
+10140..10174  ; Greek # Nl  [53] GREEK ACROPHONIC ATTIC ONE QUARTER..GREEK ACROPHONIC STRATIAN FIFTY MNAS
+10175..10178  ; Greek # No   [4] GREEK ONE HALF SIGN..GREEK THREE QUARTERS SIGN
+10179..10189  ; Greek # So  [17] GREEK YEAR SIGN..GREEK TRYBLION BASE SIGN
+1018A         ; Greek # No       GREEK ZERO SIGN
+1D200..1D241  ; Greek # So  [66] GREEK VOCAL NOTATION SYMBOL-1..GREEK INSTRUMENTAL NOTATION SYMBOL-54
+1D242..1D244  ; Greek # Mn   [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME
+1D245         ; Greek # So       GREEK MUSICAL LEIMMA
+
+# Total code points: 511
+
+# ================================================
+
+0400..0481    ; Cyrillic # L& [130] CYRILLIC CAPITAL LETTER IE WITH GRAVE..CYRILLIC SMALL LETTER KOPPA
+0482          ; Cyrillic # So       CYRILLIC THOUSANDS SIGN
+0483..0487    ; Cyrillic # Mn   [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE
+0488..0489    ; Cyrillic # Me   [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN
+048A..0523    ; Cyrillic # L& [154] CYRILLIC CAPITAL LETTER SHORT I WITH TAIL..CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK
+1D2B          ; Cyrillic # L&       CYRILLIC LETTER SMALL CAPITAL EL
+1D78          ; Cyrillic # Lm       MODIFIER LETTER CYRILLIC EN
+2DE0..2DFF    ; Cyrillic # Mn  [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS
+A640..A65F    ; Cyrillic # L&  [32] CYRILLIC CAPITAL LETTER ZEMLYA..CYRILLIC SMALL LETTER YN
+A662..A66D    ; Cyrillic # L&  [12] CYRILLIC CAPITAL LETTER SOFT DE..CYRILLIC SMALL LETTER DOUBLE MONOCULAR O
+A66E          ; Cyrillic # Lo       CYRILLIC LETTER MULTIOCULAR O
+A66F          ; Cyrillic # Mn       COMBINING CYRILLIC VZMET
+A670..A672    ; Cyrillic # Me   [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN
+A673          ; Cyrillic # Po       SLAVONIC ASTERISK
+A67C..A67D    ; Cyrillic # Mn   [2] COMBINING CYRILLIC KAVYKA..COMBINING CYRILLIC PAYEROK
+A67E          ; Cyrillic # Po       CYRILLIC KAVYKA
+A67F          ; Cyrillic # Lm       CYRILLIC PAYEROK
+A680..A697    ; Cyrillic # L&  [24] CYRILLIC CAPITAL LETTER DWE..CYRILLIC SMALL LETTER SHWE
+
+# Total code points: 404
+
+# ================================================
+
+0531..0556    ; Armenian # L&  [38] ARMENIAN CAPITAL LETTER AYB..ARMENIAN CAPITAL LETTER FEH
+0559          ; Armenian # Lm       ARMENIAN MODIFIER LETTER LEFT HALF RING
+055A..055F    ; Armenian # Po   [6] ARMENIAN APOSTROPHE..ARMENIAN ABBREVIATION MARK
+0561..0587    ; Armenian # L&  [39] ARMENIAN SMALL LETTER AYB..ARMENIAN SMALL LIGATURE ECH YIWN
+058A          ; Armenian # Pd       ARMENIAN HYPHEN
+FB13..FB17    ; Armenian # L&   [5] ARMENIAN SMALL LIGATURE MEN NOW..ARMENIAN SMALL LIGATURE MEN XEH
+
+# Total code points: 90
+
+# ================================================
+
+0591..05BD    ; Hebrew # Mn  [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG
+05BE          ; Hebrew # Pd       HEBREW PUNCTUATION MAQAF
+05BF          ; Hebrew # Mn       HEBREW POINT RAFE
+05C0          ; Hebrew # Po       HEBREW PUNCTUATION PASEQ
+05C1..05C2    ; Hebrew # Mn   [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT
+05C3          ; Hebrew # Po       HEBREW PUNCTUATION SOF PASUQ
+05C4..05C5    ; Hebrew # Mn   [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT
+05C6          ; Hebrew # Po       HEBREW PUNCTUATION NUN HAFUKHA
+05C7          ; Hebrew # Mn       HEBREW POINT QAMATS QATAN
+05D0..05EA    ; Hebrew # Lo  [27] HEBREW LETTER ALEF..HEBREW LETTER TAV
+05F0..05F2    ; Hebrew # Lo   [3] HEBREW LIGATURE YIDDISH DOUBLE VAV..HEBREW LIGATURE YIDDISH DOUBLE YOD
+05F3..05F4    ; Hebrew # Po   [2] HEBREW PUNCTUATION GERESH..HEBREW PUNCTUATION GERSHAYIM
+FB1D          ; Hebrew # Lo       HEBREW LETTER YOD WITH HIRIQ
+FB1E          ; Hebrew # Mn       HEBREW POINT JUDEO-SPANISH VARIKA
+FB1F..FB28    ; Hebrew # Lo  [10] HEBREW LIGATURE YIDDISH YOD YOD PATAH..HEBREW LETTER WIDE TAV
+FB29          ; Hebrew # Sm       HEBREW LETTER ALTERNATIVE PLUS SIGN
+FB2A..FB36    ; Hebrew # Lo  [13] HEBREW LETTER SHIN WITH SHIN DOT..HEBREW LETTER ZAYIN WITH DAGESH
+FB38..FB3C    ; Hebrew # Lo   [5] HEBREW LETTER TET WITH DAGESH..HEBREW LETTER LAMED WITH DAGESH
+FB3E          ; Hebrew # Lo       HEBREW LETTER MEM WITH DAGESH
+FB40..FB41    ; Hebrew # Lo   [2] HEBREW LETTER NUN WITH DAGESH..HEBREW LETTER SAMEKH WITH DAGESH
+FB43..FB44    ; Hebrew # Lo   [2] HEBREW LETTER FINAL PE WITH DAGESH..HEBREW LETTER PE WITH DAGESH
+FB46..FB4F    ; Hebrew # Lo  [10] HEBREW LETTER TSADI WITH DAGESH..HEBREW LIGATURE ALEF LAMED
+
+# Total code points: 133
+
+# ================================================
+
+0606..0608    ; Arabic # Sm   [3] ARABIC-INDIC CUBE ROOT..ARABIC RAY
+0609..060A    ; Arabic # Po   [2] ARABIC-INDIC PER MILLE SIGN..ARABIC-INDIC PER TEN THOUSAND SIGN
+060B          ; Arabic # Sc       AFGHANI SIGN
+060D          ; Arabic # Po       ARABIC DATE SEPARATOR
+060E..060F    ; Arabic # So   [2] ARABIC POETIC VERSE SIGN..ARABIC SIGN MISRA
+0610..061A    ; Arabic # Mn  [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA
+061E          ; Arabic # Po       ARABIC TRIPLE DOT PUNCTUATION MARK
+0621..063F    ; Arabic # Lo  [31] ARABIC LETTER HAMZA..ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE
+0641..064A    ; Arabic # Lo  [10] ARABIC LETTER FEH..ARABIC LETTER YEH
+0656..065E    ; Arabic # Mn   [9] ARABIC SUBSCRIPT ALEF..ARABIC FATHA WITH TWO DOTS
+066A..066D    ; Arabic # Po   [4] ARABIC PERCENT SIGN..ARABIC FIVE POINTED STAR
+066E..066F    ; Arabic # Lo   [2] ARABIC LETTER DOTLESS BEH..ARABIC LETTER DOTLESS QAF
+0671..06D3    ; Arabic # Lo  [99] ARABIC LETTER ALEF WASLA..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE
+06D4          ; Arabic # Po       ARABIC FULL STOP
+06D5          ; Arabic # Lo       ARABIC LETTER AE
+06D6..06DC    ; Arabic # Mn   [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN
+06DE          ; Arabic # Me       ARABIC START OF RUB EL HIZB
+06DF..06E4    ; Arabic # Mn   [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA
+06E5..06E6    ; Arabic # Lm   [2] ARABIC SMALL WAW..ARABIC SMALL YEH
+06E7..06E8    ; Arabic # Mn   [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON
+06E9          ; Arabic # So       ARABIC PLACE OF SAJDAH
+06EA..06ED    ; Arabic # Mn   [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM
+06EE..06EF    ; Arabic # Lo   [2] ARABIC LETTER DAL WITH INVERTED V..ARABIC LETTER REH WITH INVERTED V
+06F0..06F9    ; Arabic # Nd  [10] EXTENDED ARABIC-INDIC DIGIT ZERO..EXTENDED ARABIC-INDIC DIGIT NINE
+06FA..06FC    ; Arabic # Lo   [3] ARABIC LETTER SHEEN WITH DOT BELOW..ARABIC LETTER GHAIN WITH DOT BELOW
+06FD..06FE    ; Arabic # So   [2] ARABIC SIGN SINDHI AMPERSAND..ARABIC SIGN SINDHI POSTPOSITION MEN
+06FF          ; Arabic # Lo       ARABIC LETTER HEH WITH INVERTED V
+0750..077F    ; Arabic # Lo  [48] ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW..ARABIC LETTER KAF WITH TWO DOTS ABOVE
+FB50..FBB1    ; Arabic # Lo  [98] ARABIC LETTER ALEF WASLA ISOLATED FORM..ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM
+FBD3..FD3D    ; Arabic # Lo [363] ARABIC LETTER NG ISOLATED FORM..ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM
+FD50..FD8F    ; Arabic # Lo  [64] ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM..ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM
+FD92..FDC7    ; Arabic # Lo  [54] ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM..ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM
+FDF0..FDFB    ; Arabic # Lo  [12] ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM..ARABIC LIGATURE JALLAJALALOUHOU
+FDFC          ; Arabic # Sc       RIAL SIGN
+FE70..FE74    ; Arabic # Lo   [5] ARABIC FATHATAN ISOLATED FORM..ARABIC KASRATAN ISOLATED FORM
+FE76..FEFC    ; Arabic # Lo [135] ARABIC FATHA ISOLATED FORM..ARABIC LIGATURE LAM WITH ALEF FINAL FORM
+
+# Total code points: 999
+
+# ================================================
+
+0700..070D    ; Syriac # Po  [14] SYRIAC END OF PARAGRAPH..SYRIAC HARKLEAN ASTERISCUS
+070F          ; Syriac # Cf       SYRIAC ABBREVIATION MARK
+0710          ; Syriac # Lo       SYRIAC LETTER ALAPH
+0711          ; Syriac # Mn       SYRIAC LETTER SUPERSCRIPT ALAPH
+0712..072F    ; Syriac # Lo  [30] SYRIAC LETTER BETH..SYRIAC LETTER PERSIAN DHALATH
+0730..074A    ; Syriac # Mn  [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH
+074D..074F    ; Syriac # Lo   [3] SYRIAC LETTER SOGDIAN ZHAIN..SYRIAC LETTER SOGDIAN FE
+
+# Total code points: 77
+
+# ================================================
+
+0780..07A5    ; Thaana # Lo  [38] THAANA LETTER HAA..THAANA LETTER WAAVU
+07A6..07B0    ; Thaana # Mn  [11] THAANA ABAFILI..THAANA SUKUN
+07B1          ; Thaana # Lo       THAANA LETTER NAA
+
+# Total code points: 50
+
+# ================================================
+
+0901..0902    ; Devanagari # Mn   [2] DEVANAGARI SIGN CANDRABINDU..DEVANAGARI SIGN ANUSVARA
+0903          ; Devanagari # Mc       DEVANAGARI SIGN VISARGA
+0904..0939    ; Devanagari # Lo  [54] DEVANAGARI LETTER SHORT A..DEVANAGARI LETTER HA
+093C          ; Devanagari # Mn       DEVANAGARI SIGN NUKTA
+093D          ; Devanagari # Lo       DEVANAGARI SIGN AVAGRAHA
+093E..0940    ; Devanagari # Mc   [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II
+0941..0948    ; Devanagari # Mn   [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI
+0949..094C    ; Devanagari # Mc   [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU
+094D          ; Devanagari # Mn       DEVANAGARI SIGN VIRAMA
+0950          ; Devanagari # Lo       DEVANAGARI OM
+0953..0954    ; Devanagari # Mn   [2] DEVANAGARI GRAVE ACCENT..DEVANAGARI ACUTE ACCENT
+0958..0961    ; Devanagari # Lo  [10] DEVANAGARI LETTER QA..DEVANAGARI LETTER VOCALIC LL
+0962..0963    ; Devanagari # Mn   [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL
+0966..096F    ; Devanagari # Nd  [10] DEVANAGARI DIGIT ZERO..DEVANAGARI DIGIT NINE
+0971          ; Devanagari # Lm       DEVANAGARI SIGN HIGH SPACING DOT
+0972          ; Devanagari # Lo       DEVANAGARI LETTER CANDRA A
+097B..097F    ; Devanagari # Lo   [5] DEVANAGARI LETTER GGA..DEVANAGARI LETTER BBA
+
+# Total code points: 107
+
+# ================================================
+
+0981          ; Bengali # Mn       BENGALI SIGN CANDRABINDU
+0982..0983    ; Bengali # Mc   [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA
+0985..098C    ; Bengali # Lo   [8] BENGALI LETTER A..BENGALI LETTER VOCALIC L
+098F..0990    ; Bengali # Lo   [2] BENGALI LETTER E..BENGALI LETTER AI
+0993..09A8    ; Bengali # Lo  [22] BENGALI LETTER O..BENGALI LETTER NA
+09AA..09B0    ; Bengali # Lo   [7] BENGALI LETTER PA..BENGALI LETTER RA
+09B2          ; Bengali # Lo       BENGALI LETTER LA
+09B6..09B9    ; Bengali # Lo   [4] BENGALI LETTER SHA..BENGALI LETTER HA
+09BC          ; Bengali # Mn       BENGALI SIGN NUKTA
+09BD          ; Bengali # Lo       BENGALI SIGN AVAGRAHA
+09BE..09C0    ; Bengali # Mc   [3] BENGALI VOWEL SIGN AA..BENGALI VOWEL SIGN II
+09C1..09C4    ; Bengali # Mn   [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR
+09C7..09C8    ; Bengali # Mc   [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI
+09CB..09CC    ; Bengali # Mc   [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU
+09CD          ; Bengali # Mn       BENGALI SIGN VIRAMA
+09CE          ; Bengali # Lo       BENGALI LETTER KHANDA TA
+09D7          ; Bengali # Mc       BENGALI AU LENGTH MARK
+09DC..09DD    ; Bengali # Lo   [2] BENGALI LETTER RRA..BENGALI LETTER RHA
+09DF..09E1    ; Bengali # Lo   [3] BENGALI LETTER YYA..BENGALI LETTER VOCALIC LL
+09E2..09E3    ; Bengali # Mn   [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL
+09E6..09EF    ; Bengali # Nd  [10] BENGALI DIGIT ZERO..BENGALI DIGIT NINE
+09F0..09F1    ; Bengali # Lo   [2] BENGALI LETTER RA WITH MIDDLE DIAGONAL..BENGALI LETTER RA WITH LOWER DIAGONAL
+09F2..09F3    ; Bengali # Sc   [2] BENGALI RUPEE MARK..BENGALI RUPEE SIGN
+09F4..09F9    ; Bengali # No   [6] BENGALI CURRENCY NUMERATOR ONE..BENGALI CURRENCY DENOMINATOR SIXTEEN
+09FA          ; Bengali # So       BENGALI ISSHAR
+
+# Total code points: 91
+
+# ================================================
+
+0A01..0A02    ; Gurmukhi # Mn   [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI
+0A03          ; Gurmukhi # Mc       GURMUKHI SIGN VISARGA
+0A05..0A0A    ; Gurmukhi # Lo   [6] GURMUKHI LETTER A..GURMUKHI LETTER UU
+0A0F..0A10    ; Gurmukhi # Lo   [2] GURMUKHI LETTER EE..GURMUKHI LETTER AI
+0A13..0A28    ; Gurmukhi # Lo  [22] GURMUKHI LETTER OO..GURMUKHI LETTER NA
+0A2A..0A30    ; Gurmukhi # Lo   [7] GURMUKHI LETTER PA..GURMUKHI LETTER RA
+0A32..0A33    ; Gurmukhi # Lo   [2] GURMUKHI LETTER LA..GURMUKHI LETTER LLA
+0A35..0A36    ; Gurmukhi # Lo   [2] GURMUKHI LETTER VA..GURMUKHI LETTER SHA
+0A38..0A39    ; Gurmukhi # Lo   [2] GURMUKHI LETTER SA..GURMUKHI LETTER HA
+0A3C          ; Gurmukhi # Mn       GURMUKHI SIGN NUKTA
+0A3E..0A40    ; Gurmukhi # Mc   [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II
+0A41..0A42    ; Gurmukhi # Mn   [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU
+0A47..0A48    ; Gurmukhi # Mn   [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI
+0A4B..0A4D    ; Gurmukhi # Mn   [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA
+0A51          ; Gurmukhi # Mn       GURMUKHI SIGN UDAAT
+0A59..0A5C    ; Gurmukhi # Lo   [4] GURMUKHI LETTER KHHA..GURMUKHI LETTER RRA
+0A5E          ; Gurmukhi # Lo       GURMUKHI LETTER FA
+0A66..0A6F    ; Gurmukhi # Nd  [10] GURMUKHI DIGIT ZERO..GURMUKHI DIGIT NINE
+0A70..0A71    ; Gurmukhi # Mn   [2] GURMUKHI TIPPI..GURMUKHI ADDAK
+0A72..0A74    ; Gurmukhi # Lo   [3] GURMUKHI IRI..GURMUKHI EK ONKAR
+0A75          ; Gurmukhi # Mn       GURMUKHI SIGN YAKASH
+
+# Total code points: 79
+
+# ================================================
+
+0A81..0A82    ; Gujarati # Mn   [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA
+0A83          ; Gujarati # Mc       GUJARATI SIGN VISARGA
+0A85..0A8D    ; Gujarati # Lo   [9] GUJARATI LETTER A..GUJARATI VOWEL CANDRA E
+0A8F..0A91    ; Gujarati # Lo   [3] GUJARATI LETTER E..GUJARATI VOWEL CANDRA O
+0A93..0AA8    ; Gujarati # Lo  [22] GUJARATI LETTER O..GUJARATI LETTER NA
+0AAA..0AB0    ; Gujarati # Lo   [7] GUJARATI LETTER PA..GUJARATI LETTER RA
+0AB2..0AB3    ; Gujarati # Lo   [2] GUJARATI LETTER LA..GUJARATI LETTER LLA
+0AB5..0AB9    ; Gujarati # Lo   [5] GUJARATI LETTER VA..GUJARATI LETTER HA
+0ABC          ; Gujarati # Mn       GUJARATI SIGN NUKTA
+0ABD          ; Gujarati # Lo       GUJARATI SIGN AVAGRAHA
+0ABE..0AC0    ; Gujarati # Mc   [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II
+0AC1..0AC5    ; Gujarati # Mn   [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E
+0AC7..0AC8    ; Gujarati # Mn   [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI
+0AC9          ; Gujarati # Mc       GUJARATI VOWEL SIGN CANDRA O
+0ACB..0ACC    ; Gujarati # Mc   [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU
+0ACD          ; Gujarati # Mn       GUJARATI SIGN VIRAMA
+0AD0          ; Gujarati # Lo       GUJARATI OM
+0AE0..0AE1    ; Gujarati # Lo   [2] GUJARATI LETTER VOCALIC RR..GUJARATI LETTER VOCALIC LL
+0AE2..0AE3    ; Gujarati # Mn   [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL
+0AE6..0AEF    ; Gujarati # Nd  [10] GUJARATI DIGIT ZERO..GUJARATI DIGIT NINE
+0AF1          ; Gujarati # Sc       GUJARATI RUPEE SIGN
+
+# Total code points: 83
+
+# ================================================
+
+0B01          ; Oriya # Mn       ORIYA SIGN CANDRABINDU
+0B02..0B03    ; Oriya # Mc   [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA
+0B05..0B0C    ; Oriya # Lo   [8] ORIYA LETTER A..ORIYA LETTER VOCALIC L
+0B0F..0B10    ; Oriya # Lo   [2] ORIYA LETTER E..ORIYA LETTER AI
+0B13..0B28    ; Oriya # Lo  [22] ORIYA LETTER O..ORIYA LETTER NA
+0B2A..0B30    ; Oriya # Lo   [7] ORIYA LETTER PA..ORIYA LETTER RA
+0B32..0B33    ; Oriya # Lo   [2] ORIYA LETTER LA..ORIYA LETTER LLA
+0B35..0B39    ; Oriya # Lo   [5] ORIYA LETTER VA..ORIYA LETTER HA
+0B3C          ; Oriya # Mn       ORIYA SIGN NUKTA
+0B3D          ; Oriya # Lo       ORIYA SIGN AVAGRAHA
+0B3E          ; Oriya # Mc       ORIYA VOWEL SIGN AA
+0B3F          ; Oriya # Mn       ORIYA VOWEL SIGN I
+0B40          ; Oriya # Mc       ORIYA VOWEL SIGN II
+0B41..0B44    ; Oriya # Mn   [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR
+0B47..0B48    ; Oriya # Mc   [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI
+0B4B..0B4C    ; Oriya # Mc   [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU
+0B4D          ; Oriya # Mn       ORIYA SIGN VIRAMA
+0B56          ; Oriya # Mn       ORIYA AI LENGTH MARK
+0B57          ; Oriya # Mc       ORIYA AU LENGTH MARK
+0B5C..0B5D    ; Oriya # Lo   [2] ORIYA LETTER RRA..ORIYA LETTER RHA
+0B5F..0B61    ; Oriya # Lo   [3] ORIYA LETTER YYA..ORIYA LETTER VOCALIC LL
+0B62..0B63    ; Oriya # Mn   [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL
+0B66..0B6F    ; Oriya # Nd  [10] ORIYA DIGIT ZERO..ORIYA DIGIT NINE
+0B70          ; Oriya # So       ORIYA ISSHAR
+0B71          ; Oriya # Lo       ORIYA LETTER WA
+
+# Total code points: 84
+
+# ================================================
+
+0B82          ; Tamil # Mn       TAMIL SIGN ANUSVARA
+0B83          ; Tamil # Lo       TAMIL SIGN VISARGA
+0B85..0B8A    ; Tamil # Lo   [6] TAMIL LETTER A..TAMIL LETTER UU
+0B8E..0B90    ; Tamil # Lo   [3] TAMIL LETTER E..TAMIL LETTER AI
+0B92..0B95    ; Tamil # Lo   [4] TAMIL LETTER O..TAMIL LETTER KA
+0B99..0B9A    ; Tamil # Lo   [2] TAMIL LETTER NGA..TAMIL LETTER CA
+0B9C          ; Tamil # Lo       TAMIL LETTER JA
+0B9E..0B9F    ; Tamil # Lo   [2] TAMIL LETTER NYA..TAMIL LETTER TTA
+0BA3..0BA4    ; Tamil # Lo   [2] TAMIL LETTER NNA..TAMIL LETTER TA
+0BA8..0BAA    ; Tamil # Lo   [3] TAMIL LETTER NA..TAMIL LETTER PA
+0BAE..0BB9    ; Tamil # Lo  [12] TAMIL LETTER MA..TAMIL LETTER HA
+0BBE..0BBF    ; Tamil # Mc   [2] TAMIL VOWEL SIGN AA..TAMIL VOWEL SIGN I
+0BC0          ; Tamil # Mn       TAMIL VOWEL SIGN II
+0BC1..0BC2    ; Tamil # Mc   [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU
+0BC6..0BC8    ; Tamil # Mc   [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI
+0BCA..0BCC    ; Tamil # Mc   [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU
+0BCD          ; Tamil # Mn       TAMIL SIGN VIRAMA
+0BD0          ; Tamil # Lo       TAMIL OM
+0BD7          ; Tamil # Mc       TAMIL AU LENGTH MARK
+0BE6..0BEF    ; Tamil # Nd  [10] TAMIL DIGIT ZERO..TAMIL DIGIT NINE
+0BF0..0BF2    ; Tamil # No   [3] TAMIL NUMBER TEN..TAMIL NUMBER ONE THOUSAND
+0BF3..0BF8    ; Tamil # So   [6] TAMIL DAY SIGN..TAMIL AS ABOVE SIGN
+0BF9          ; Tamil # Sc       TAMIL RUPEE SIGN
+0BFA          ; Tamil # So       TAMIL NUMBER SIGN
+
+# Total code points: 72
+
+# ================================================
+
+0C01..0C03    ; Telugu # Mc   [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA
+0C05..0C0C    ; Telugu # Lo   [8] TELUGU LETTER A..TELUGU LETTER VOCALIC L
+0C0E..0C10    ; Telugu # Lo   [3] TELUGU LETTER E..TELUGU LETTER AI
+0C12..0C28    ; Telugu # Lo  [23] TELUGU LETTER O..TELUGU LETTER NA
+0C2A..0C33    ; Telugu # Lo  [10] TELUGU LETTER PA..TELUGU LETTER LLA
+0C35..0C39    ; Telugu # Lo   [5] TELUGU LETTER VA..TELUGU LETTER HA
+0C3D          ; Telugu # Lo       TELUGU SIGN AVAGRAHA
+0C3E..0C40    ; Telugu # Mn   [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II
+0C41..0C44    ; Telugu # Mc   [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR
+0C46..0C48    ; Telugu # Mn   [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI
+0C4A..0C4D    ; Telugu # Mn   [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA
+0C55..0C56    ; Telugu # Mn   [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK
+0C58..0C59    ; Telugu # Lo   [2] TELUGU LETTER TSA..TELUGU LETTER DZA
+0C60..0C61    ; Telugu # Lo   [2] TELUGU LETTER VOCALIC RR..TELUGU LETTER VOCALIC LL
+0C62..0C63    ; Telugu # Mn   [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL
+0C66..0C6F    ; Telugu # Nd  [10] TELUGU DIGIT ZERO..TELUGU DIGIT NINE
+0C78..0C7E    ; Telugu # No   [7] TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR..TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR
+0C7F          ; Telugu # So       TELUGU SIGN TUUMU
+
+# Total code points: 93
+
+# ================================================
+
+0C82..0C83    ; Kannada # Mc   [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA
+0C85..0C8C    ; Kannada # Lo   [8] KANNADA LETTER A..KANNADA LETTER VOCALIC L
+0C8E..0C90    ; Kannada # Lo   [3] KANNADA LETTER E..KANNADA LETTER AI
+0C92..0CA8    ; Kannada # Lo  [23] KANNADA LETTER O..KANNADA LETTER NA
+0CAA..0CB3    ; Kannada # Lo  [10] KANNADA LETTER PA..KANNADA LETTER LLA
+0CB5..0CB9    ; Kannada # Lo   [5] KANNADA LETTER VA..KANNADA LETTER HA
+0CBC          ; Kannada # Mn       KANNADA SIGN NUKTA
+0CBD          ; Kannada # Lo       KANNADA SIGN AVAGRAHA
+0CBE          ; Kannada # Mc       KANNADA VOWEL SIGN AA
+0CBF          ; Kannada # Mn       KANNADA VOWEL SIGN I
+0CC0..0CC4    ; Kannada # Mc   [5] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN VOCALIC RR
+0CC6          ; Kannada # Mn       KANNADA VOWEL SIGN E
+0CC7..0CC8    ; Kannada # Mc   [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI
+0CCA..0CCB    ; Kannada # Mc   [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO
+0CCC..0CCD    ; Kannada # Mn   [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA
+0CD5..0CD6    ; Kannada # Mc   [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK
+0CDE          ; Kannada # Lo       KANNADA LETTER FA
+0CE0..0CE1    ; Kannada # Lo   [2] KANNADA LETTER VOCALIC RR..KANNADA LETTER VOCALIC LL
+0CE2..0CE3    ; Kannada # Mn   [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL
+0CE6..0CEF    ; Kannada # Nd  [10] KANNADA DIGIT ZERO..KANNADA DIGIT NINE
+
+# Total code points: 84
+
+# ================================================
+
+0D02..0D03    ; Malayalam # Mc   [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA
+0D05..0D0C    ; Malayalam # Lo   [8] MALAYALAM LETTER A..MALAYALAM LETTER VOCALIC L
+0D0E..0D10    ; Malayalam # Lo   [3] MALAYALAM LETTER E..MALAYALAM LETTER AI
+0D12..0D28    ; Malayalam # Lo  [23] MALAYALAM LETTER O..MALAYALAM LETTER NA
+0D2A..0D39    ; Malayalam # Lo  [16] MALAYALAM LETTER PA..MALAYALAM LETTER HA
+0D3D          ; Malayalam # Lo       MALAYALAM SIGN AVAGRAHA
+0D3E..0D40    ; Malayalam # Mc   [3] MALAYALAM VOWEL SIGN AA..MALAYALAM VOWEL SIGN II
+0D41..0D44    ; Malayalam # Mn   [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR
+0D46..0D48    ; Malayalam # Mc   [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI
+0D4A..0D4C    ; Malayalam # Mc   [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU
+0D4D          ; Malayalam # Mn       MALAYALAM SIGN VIRAMA
+0D57          ; Malayalam # Mc       MALAYALAM AU LENGTH MARK
+0D60..0D61    ; Malayalam # Lo   [2] MALAYALAM LETTER VOCALIC RR..MALAYALAM LETTER VOCALIC LL
+0D62..0D63    ; Malayalam # Mn   [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL
+0D66..0D6F    ; Malayalam # Nd  [10] MALAYALAM DIGIT ZERO..MALAYALAM DIGIT NINE
+0D70..0D75    ; Malayalam # No   [6] MALAYALAM NUMBER TEN..MALAYALAM FRACTION THREE QUARTERS
+0D79          ; Malayalam # So       MALAYALAM DATE MARK
+0D7A..0D7F    ; Malayalam # Lo   [6] MALAYALAM LETTER CHILLU NN..MALAYALAM LETTER CHILLU K
+
+# Total code points: 95
+
+# ================================================
+
+0D82..0D83    ; Sinhala # Mc   [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA
+0D85..0D96    ; Sinhala # Lo  [18] SINHALA LETTER AYANNA..SINHALA LETTER AUYANNA
+0D9A..0DB1    ; Sinhala # Lo  [24] SINHALA LETTER ALPAPRAANA KAYANNA..SINHALA LETTER DANTAJA NAYANNA
+0DB3..0DBB    ; Sinhala # Lo   [9] SINHALA LETTER SANYAKA DAYANNA..SINHALA LETTER RAYANNA
+0DBD          ; Sinhala # Lo       SINHALA LETTER DANTAJA LAYANNA
+0DC0..0DC6    ; Sinhala # Lo   [7] SINHALA LETTER VAYANNA..SINHALA LETTER FAYANNA
+0DCA          ; Sinhala # Mn       SINHALA SIGN AL-LAKUNA
+0DCF..0DD1    ; Sinhala # Mc   [3] SINHALA VOWEL SIGN AELA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA
+0DD2..0DD4    ; Sinhala # Mn   [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA
+0DD6          ; Sinhala # Mn       SINHALA VOWEL SIGN DIGA PAA-PILLA
+0DD8..0DDF    ; Sinhala # Mc   [8] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN GAYANUKITTA
+0DF2..0DF3    ; Sinhala # Mc   [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA
+0DF4          ; Sinhala # Po       SINHALA PUNCTUATION KUNDDALIYA
+
+# Total code points: 80
+
+# ================================================
+
+0E01..0E30    ; Thai # Lo  [48] THAI CHARACTER KO KAI..THAI CHARACTER SARA A
+0E31          ; Thai # Mn       THAI CHARACTER MAI HAN-AKAT
+0E32..0E33    ; Thai # Lo   [2] THAI CHARACTER SARA AA..THAI CHARACTER SARA AM
+0E34..0E3A    ; Thai # Mn   [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU
+0E40..0E45    ; Thai # Lo   [6] THAI CHARACTER SARA E..THAI CHARACTER LAKKHANGYAO
+0E46          ; Thai # Lm       THAI CHARACTER MAIYAMOK
+0E47..0E4E    ; Thai # Mn   [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN
+0E4F          ; Thai # Po       THAI CHARACTER FONGMAN
+0E50..0E59    ; Thai # Nd  [10] THAI DIGIT ZERO..THAI DIGIT NINE
+0E5A..0E5B    ; Thai # Po   [2] THAI CHARACTER ANGKHANKHU..THAI CHARACTER KHOMUT
+
+# Total code points: 86
+
+# ================================================
+
+0E81..0E82    ; Lao # Lo   [2] LAO LETTER KO..LAO LETTER KHO SUNG
+0E84          ; Lao # Lo       LAO LETTER KHO TAM
+0E87..0E88    ; Lao # Lo   [2] LAO LETTER NGO..LAO LETTER CO
+0E8A          ; Lao # Lo       LAO LETTER SO TAM
+0E8D          ; Lao # Lo       LAO LETTER NYO
+0E94..0E97    ; Lao # Lo   [4] LAO LETTER DO..LAO LETTER THO TAM
+0E99..0E9F    ; Lao # Lo   [7] LAO LETTER NO..LAO LETTER FO SUNG
+0EA1..0EA3    ; Lao # Lo   [3] LAO LETTER MO..LAO LETTER LO LING
+0EA5          ; Lao # Lo       LAO LETTER LO LOOT
+0EA7          ; Lao # Lo       LAO LETTER WO
+0EAA..0EAB    ; Lao # Lo   [2] LAO LETTER SO SUNG..LAO LETTER HO SUNG
+0EAD..0EB0    ; Lao # Lo   [4] LAO LETTER O..LAO VOWEL SIGN A
+0EB1          ; Lao # Mn       LAO VOWEL SIGN MAI KAN
+0EB2..0EB3    ; Lao # Lo   [2] LAO VOWEL SIGN AA..LAO VOWEL SIGN AM
+0EB4..0EB9    ; Lao # Mn   [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU
+0EBB..0EBC    ; Lao # Mn   [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO
+0EBD          ; Lao # Lo       LAO SEMIVOWEL SIGN NYO
+0EC0..0EC4    ; Lao # Lo   [5] LAO VOWEL SIGN E..LAO VOWEL SIGN AI
+0EC6          ; Lao # Lm       LAO KO LA
+0EC8..0ECD    ; Lao # Mn   [6] LAO TONE MAI EK..LAO NIGGAHITA
+0ED0..0ED9    ; Lao # Nd  [10] LAO DIGIT ZERO..LAO DIGIT NINE
+0EDC..0EDD    ; Lao # Lo   [2] LAO HO NO..LAO HO MO
+
+# Total code points: 65
+
+# ================================================
+
+0F00          ; Tibetan # Lo       TIBETAN SYLLABLE OM
+0F01..0F03    ; Tibetan # So   [3] TIBETAN MARK GTER YIG MGO TRUNCATED A..TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA
+0F04..0F12    ; Tibetan # Po  [15] TIBETAN MARK INITIAL YIG MGO MDUN MA..TIBETAN MARK RGYA GRAM SHAD
+0F13..0F17    ; Tibetan # So   [5] TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN..TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS
+0F18..0F19    ; Tibetan # Mn   [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS
+0F1A..0F1F    ; Tibetan # So   [6] TIBETAN SIGN RDEL DKAR GCIG..TIBETAN SIGN RDEL DKAR RDEL NAG
+0F20..0F29    ; Tibetan # Nd  [10] TIBETAN DIGIT ZERO..TIBETAN DIGIT NINE
+0F2A..0F33    ; Tibetan # No  [10] TIBETAN DIGIT HALF ONE..TIBETAN DIGIT HALF ZERO
+0F34          ; Tibetan # So       TIBETAN MARK BSDUS RTAGS
+0F35          ; Tibetan # Mn       TIBETAN MARK NGAS BZUNG NYI ZLA
+0F36          ; Tibetan # So       TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN
+0F37          ; Tibetan # Mn       TIBETAN MARK NGAS BZUNG SGOR RTAGS
+0F38          ; Tibetan # So       TIBETAN MARK CHE MGO
+0F39          ; Tibetan # Mn       TIBETAN MARK TSA -PHRU
+0F3A          ; Tibetan # Ps       TIBETAN MARK GUG RTAGS GYON
+0F3B          ; Tibetan # Pe       TIBETAN MARK GUG RTAGS GYAS
+0F3C          ; Tibetan # Ps       TIBETAN MARK ANG KHANG GYON
+0F3D          ; Tibetan # Pe       TIBETAN MARK ANG KHANG GYAS
+0F3E..0F3F    ; Tibetan # Mc   [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES
+0F40..0F47    ; Tibetan # Lo   [8] TIBETAN LETTER KA..TIBETAN LETTER JA
+0F49..0F6C    ; Tibetan # Lo  [36] TIBETAN LETTER NYA..TIBETAN LETTER RRA
+0F71..0F7E    ; Tibetan # Mn  [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO
+0F7F          ; Tibetan # Mc       TIBETAN SIGN RNAM BCAD
+0F80..0F84    ; Tibetan # Mn   [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA
+0F85          ; Tibetan # Po       TIBETAN MARK PALUTA
+0F86..0F87    ; Tibetan # Mn   [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS
+0F88..0F8B    ; Tibetan # Lo   [4] TIBETAN SIGN LCE TSA CAN..TIBETAN SIGN GRU MED RGYINGS
+0F90..0F97    ; Tibetan # Mn   [8] TIBETAN SUBJOINED LETTER KA..TIBETAN SUBJOINED LETTER JA
+0F99..0FBC    ; Tibetan # Mn  [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA
+0FBE..0FC5    ; Tibetan # So   [8] TIBETAN KU RU KHA..TIBETAN SYMBOL RDO RJE
+0FC6          ; Tibetan # Mn       TIBETAN SYMBOL PADMA GDAN
+0FC7..0FCC    ; Tibetan # So   [6] TIBETAN SYMBOL RDO RJE RGYA GRAM..TIBETAN SYMBOL NOR BU BZHI -KHYIL
+0FCE..0FCF    ; Tibetan # So   [2] TIBETAN SIGN RDEL NAG RDEL DKAR..TIBETAN SIGN RDEL NAG GSUM
+0FD0..0FD4    ; Tibetan # Po   [5] TIBETAN MARK BSKA- SHOG GI MGO RGYAN..TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
+
+# Total code points: 201
+
+# ================================================
+
+1000..102A    ; Myanmar # Lo  [43] MYANMAR LETTER KA..MYANMAR LETTER AU
+102B..102C    ; Myanmar # Mc   [2] MYANMAR VOWEL SIGN TALL AA..MYANMAR VOWEL SIGN AA
+102D..1030    ; Myanmar # Mn   [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU
+1031          ; Myanmar # Mc       MYANMAR VOWEL SIGN E
+1032..1037    ; Myanmar # Mn   [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW
+1038          ; Myanmar # Mc       MYANMAR SIGN VISARGA
+1039..103A    ; Myanmar # Mn   [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT
+103B..103C    ; Myanmar # Mc   [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA
+103D..103E    ; Myanmar # Mn   [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA
+103F          ; Myanmar # Lo       MYANMAR LETTER GREAT SA
+1040..1049    ; Myanmar # Nd  [10] MYANMAR DIGIT ZERO..MYANMAR DIGIT NINE
+104A..104F    ; Myanmar # Po   [6] MYANMAR SIGN LITTLE SECTION..MYANMAR SYMBOL GENITIVE
+1050..1055    ; Myanmar # Lo   [6] MYANMAR LETTER SHA..MYANMAR LETTER VOCALIC LL
+1056..1057    ; Myanmar # Mc   [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR
+1058..1059    ; Myanmar # Mn   [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL
+105A..105D    ; Myanmar # Lo   [4] MYANMAR LETTER MON NGA..MYANMAR LETTER MON BBE
+105E..1060    ; Myanmar # Mn   [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA
+1061          ; Myanmar # Lo       MYANMAR LETTER SGAW KAREN SHA
+1062..1064    ; Myanmar # Mc   [3] MYANMAR VOWEL SIGN SGAW KAREN EU..MYANMAR TONE MARK SGAW KAREN KE PHO
+1065..1066    ; Myanmar # Lo   [2] MYANMAR LETTER WESTERN PWO KAREN THA..MYANMAR LETTER WESTERN PWO KAREN PWA
+1067..106D    ; Myanmar # Mc   [7] MYANMAR VOWEL SIGN WESTERN PWO KAREN EU..MYANMAR SIGN WESTERN PWO KAREN TONE-5
+106E..1070    ; Myanmar # Lo   [3] MYANMAR LETTER EASTERN PWO KAREN NNA..MYANMAR LETTER EASTERN PWO KAREN GHWA
+1071..1074    ; Myanmar # Mn   [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE
+1075..1081    ; Myanmar # Lo  [13] MYANMAR LETTER SHAN KA..MYANMAR LETTER SHAN HA
+1082          ; Myanmar # Mn       MYANMAR CONSONANT SIGN SHAN MEDIAL WA
+1083..1084    ; Myanmar # Mc   [2] MYANMAR VOWEL SIGN SHAN AA..MYANMAR VOWEL SIGN SHAN E
+1085..1086    ; Myanmar # Mn   [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y
+1087..108C    ; Myanmar # Mc   [6] MYANMAR SIGN SHAN TONE-2..MYANMAR SIGN SHAN COUNCIL TONE-3
+108D          ; Myanmar # Mn       MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE
+108E          ; Myanmar # Lo       MYANMAR LETTER RUMAI PALAUNG FA
+108F          ; Myanmar # Mc       MYANMAR SIGN RUMAI PALAUNG TONE-5
+1090..1099    ; Myanmar # Nd  [10] MYANMAR SHAN DIGIT ZERO..MYANMAR SHAN DIGIT NINE
+109E..109F    ; Myanmar # So   [2] MYANMAR SYMBOL SHAN ONE..MYANMAR SYMBOL SHAN EXCLAMATION
+
+# Total code points: 156
+
+# ================================================
+
+10A0..10C5    ; Georgian # L&  [38] GEORGIAN CAPITAL LETTER AN..GEORGIAN CAPITAL LETTER HOE
+10D0..10FA    ; Georgian # Lo  [43] GEORGIAN LETTER AN..GEORGIAN LETTER AIN
+10FC          ; Georgian # Lm       MODIFIER LETTER GEORGIAN NAR
+2D00..2D25    ; Georgian # L&  [38] GEORGIAN SMALL LETTER AN..GEORGIAN SMALL LETTER HOE
+
+# Total code points: 120
+
+# ================================================
+
+1100..1159    ; Hangul # Lo  [90] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG YEORINHIEUH
+115F..11A2    ; Hangul # Lo  [68] HANGUL CHOSEONG FILLER..HANGUL JUNGSEONG SSANGARAEA
+11A8..11F9    ; Hangul # Lo  [82] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG YEORINHIEUH
+3131..318E    ; Hangul # Lo  [94] HANGUL LETTER KIYEOK..HANGUL LETTER ARAEAE
+3200..321E    ; Hangul # So  [31] PARENTHESIZED HANGUL KIYEOK..PARENTHESIZED KOREAN CHARACTER O HU
+3260..327E    ; Hangul # So  [31] CIRCLED HANGUL KIYEOK..CIRCLED HANGUL IEUNG U
+AC00..D7A3    ; Hangul # Lo [11172] HANGUL SYLLABLE GA..HANGUL SYLLABLE HIH
+FFA0..FFBE    ; Hangul # Lo  [31] HALFWIDTH HANGUL FILLER..HALFWIDTH HANGUL LETTER HIEUH
+FFC2..FFC7    ; Hangul # Lo   [6] HALFWIDTH HANGUL LETTER A..HALFWIDTH HANGUL LETTER E
+FFCA..FFCF    ; Hangul # Lo   [6] HALFWIDTH HANGUL LETTER YEO..HALFWIDTH HANGUL LETTER OE
+FFD2..FFD7    ; Hangul # Lo   [6] HALFWIDTH HANGUL LETTER YO..HALFWIDTH HANGUL LETTER YU
+FFDA..FFDC    ; Hangul # Lo   [3] HALFWIDTH HANGUL LETTER EU..HALFWIDTH HANGUL LETTER I
+
+# Total code points: 11620
+
+# ================================================
+
+1200..1248    ; Ethiopic # Lo  [73] ETHIOPIC SYLLABLE HA..ETHIOPIC SYLLABLE QWA
+124A..124D    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE QWI..ETHIOPIC SYLLABLE QWE
+1250..1256    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE QHA..ETHIOPIC SYLLABLE QHO
+1258          ; Ethiopic # Lo       ETHIOPIC SYLLABLE QHWA
+125A..125D    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE QHWI..ETHIOPIC SYLLABLE QHWE
+1260..1288    ; Ethiopic # Lo  [41] ETHIOPIC SYLLABLE BA..ETHIOPIC SYLLABLE XWA
+128A..128D    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE XWI..ETHIOPIC SYLLABLE XWE
+1290..12B0    ; Ethiopic # Lo  [33] ETHIOPIC SYLLABLE NA..ETHIOPIC SYLLABLE KWA
+12B2..12B5    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE KWI..ETHIOPIC SYLLABLE KWE
+12B8..12BE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE KXA..ETHIOPIC SYLLABLE KXO
+12C0          ; Ethiopic # Lo       ETHIOPIC SYLLABLE KXWA
+12C2..12C5    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE KXWI..ETHIOPIC SYLLABLE KXWE
+12C8..12D6    ; Ethiopic # Lo  [15] ETHIOPIC SYLLABLE WA..ETHIOPIC SYLLABLE PHARYNGEAL O
+12D8..1310    ; Ethiopic # Lo  [57] ETHIOPIC SYLLABLE ZA..ETHIOPIC SYLLABLE GWA
+1312..1315    ; Ethiopic # Lo   [4] ETHIOPIC SYLLABLE GWI..ETHIOPIC SYLLABLE GWE
+1318..135A    ; Ethiopic # Lo  [67] ETHIOPIC SYLLABLE GGA..ETHIOPIC SYLLABLE FYA
+135F          ; Ethiopic # Mn       ETHIOPIC COMBINING GEMINATION MARK
+1360          ; Ethiopic # So       ETHIOPIC SECTION MARK
+1361..1368    ; Ethiopic # Po   [8] ETHIOPIC WORDSPACE..ETHIOPIC PARAGRAPH SEPARATOR
+1369..137C    ; Ethiopic # No  [20] ETHIOPIC DIGIT ONE..ETHIOPIC NUMBER TEN THOUSAND
+1380..138F    ; Ethiopic # Lo  [16] ETHIOPIC SYLLABLE SEBATBEIT MWA..ETHIOPIC SYLLABLE PWE
+1390..1399    ; Ethiopic # So  [10] ETHIOPIC TONAL MARK YIZET..ETHIOPIC TONAL MARK KURT
+2D80..2D96    ; Ethiopic # Lo  [23] ETHIOPIC SYLLABLE LOA..ETHIOPIC SYLLABLE GGWE
+2DA0..2DA6    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE SSA..ETHIOPIC SYLLABLE SSO
+2DA8..2DAE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE CCA..ETHIOPIC SYLLABLE CCO
+2DB0..2DB6    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE ZZA..ETHIOPIC SYLLABLE ZZO
+2DB8..2DBE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE CCHA..ETHIOPIC SYLLABLE CCHO
+2DC0..2DC6    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE QYA..ETHIOPIC SYLLABLE QYO
+2DC8..2DCE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE KYA..ETHIOPIC SYLLABLE KYO
+2DD0..2DD6    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE XYA..ETHIOPIC SYLLABLE XYO
+2DD8..2DDE    ; Ethiopic # Lo   [7] ETHIOPIC SYLLABLE GYA..ETHIOPIC SYLLABLE GYO
+
+# Total code points: 461
+
+# ================================================
+
+13A0..13F4    ; Cherokee # Lo  [85] CHEROKEE LETTER A..CHEROKEE LETTER YV
+
+# Total code points: 85
+
+# ================================================
+
+1401..166C    ; Canadian_Aboriginal # Lo [620] CANADIAN SYLLABICS E..CANADIAN SYLLABICS CARRIER TTSA
+166D..166E    ; Canadian_Aboriginal # Po   [2] CANADIAN SYLLABICS CHI SIGN..CANADIAN SYLLABICS FULL STOP
+166F..1676    ; Canadian_Aboriginal # Lo   [8] CANADIAN SYLLABICS QAI..CANADIAN SYLLABICS NNGAA
+
+# Total code points: 630
+
+# ================================================
+
+1680          ; Ogham # Zs       OGHAM SPACE MARK
+1681..169A    ; Ogham # Lo  [26] OGHAM LETTER BEITH..OGHAM LETTER PEITH
+169B          ; Ogham # Ps       OGHAM FEATHER MARK
+169C          ; Ogham # Pe       OGHAM REVERSED FEATHER MARK
+
+# Total code points: 29
+
+# ================================================
+
+16A0..16EA    ; Runic # Lo  [75] RUNIC LETTER FEHU FEOH FE F..RUNIC LETTER X
+16EE..16F0    ; Runic # Nl   [3] RUNIC ARLAUG SYMBOL..RUNIC BELGTHOR SYMBOL
+
+# Total code points: 78
+
+# ================================================
+
+1780..17B3    ; Khmer # Lo  [52] KHMER LETTER KA..KHMER INDEPENDENT VOWEL QAU
+17B4..17B5    ; Khmer # Cf   [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA
+17B6          ; Khmer # Mc       KHMER VOWEL SIGN AA
+17B7..17BD    ; Khmer # Mn   [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA
+17BE..17C5    ; Khmer # Mc   [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU
+17C6          ; Khmer # Mn       KHMER SIGN NIKAHIT
+17C7..17C8    ; Khmer # Mc   [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU
+17C9..17D3    ; Khmer # Mn  [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT
+17D4..17D6    ; Khmer # Po   [3] KHMER SIGN KHAN..KHMER SIGN CAMNUC PII KUUH
+17D7          ; Khmer # Lm       KHMER SIGN LEK TOO
+17D8..17DA    ; Khmer # Po   [3] KHMER SIGN BEYYAL..KHMER SIGN KOOMUUT
+17DB          ; Khmer # Sc       KHMER CURRENCY SYMBOL RIEL
+17DC          ; Khmer # Lo       KHMER SIGN AVAKRAHASANYA
+17DD          ; Khmer # Mn       KHMER SIGN ATTHACAN
+17E0..17E9    ; Khmer # Nd  [10] KHMER DIGIT ZERO..KHMER DIGIT NINE
+17F0..17F9    ; Khmer # No  [10] KHMER SYMBOL LEK ATTAK SON..KHMER SYMBOL LEK ATTAK PRAM-BUON
+19E0..19FF    ; Khmer # So  [32] KHMER SYMBOL PATHAMASAT..KHMER SYMBOL DAP-PRAM ROC
+
+# Total code points: 146
+
+# ================================================
+
+1800..1801    ; Mongolian # Po   [2] MONGOLIAN BIRGA..MONGOLIAN ELLIPSIS
+1804          ; Mongolian # Po       MONGOLIAN COLON
+1806          ; Mongolian # Pd       MONGOLIAN TODO SOFT HYPHEN
+1807..180A    ; Mongolian # Po   [4] MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER..MONGOLIAN NIRUGU
+180B..180D    ; Mongolian # Mn   [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE
+180E          ; Mongolian # Zs       MONGOLIAN VOWEL SEPARATOR
+1810..1819    ; Mongolian # Nd  [10] MONGOLIAN DIGIT ZERO..MONGOLIAN DIGIT NINE
+1820..1842    ; Mongolian # Lo  [35] MONGOLIAN LETTER A..MONGOLIAN LETTER CHI
+1843          ; Mongolian # Lm       MONGOLIAN LETTER TODO LONG VOWEL SIGN
+1844..1877    ; Mongolian # Lo  [52] MONGOLIAN LETTER TODO E..MONGOLIAN LETTER MANCHU ZHA
+1880..18A8    ; Mongolian # Lo  [41] MONGOLIAN LETTER ALI GALI ANUSVARA ONE..MONGOLIAN LETTER MANCHU ALI GALI BHA
+18A9          ; Mongolian # Mn       MONGOLIAN LETTER ALI GALI DAGALGA
+18AA          ; Mongolian # Lo       MONGOLIAN LETTER MANCHU ALI GALI LHA
+
+# Total code points: 153
+
+# ================================================
+
+3041..3096    ; Hiragana # Lo  [86] HIRAGANA LETTER SMALL A..HIRAGANA LETTER SMALL KE
+309D..309E    ; Hiragana # Lm   [2] HIRAGANA ITERATION MARK..HIRAGANA VOICED ITERATION MARK
+309F          ; Hiragana # Lo       HIRAGANA DIGRAPH YORI
+
+# Total code points: 89
+
+# ================================================
+
+30A1..30FA    ; Katakana # Lo  [90] KATAKANA LETTER SMALL A..KATAKANA LETTER VO
+30FD..30FE    ; Katakana # Lm   [2] KATAKANA ITERATION MARK..KATAKANA VOICED ITERATION MARK
+30FF          ; Katakana # Lo       KATAKANA DIGRAPH KOTO
+31F0..31FF    ; Katakana # Lo  [16] KATAKANA LETTER SMALL KU..KATAKANA LETTER SMALL RO
+32D0..32FE    ; Katakana # So  [47] CIRCLED KATAKANA A..CIRCLED KATAKANA WO
+3300..3357    ; Katakana # So  [88] SQUARE APAATO..SQUARE WATTO
+FF66..FF6F    ; Katakana # Lo  [10] HALFWIDTH KATAKANA LETTER WO..HALFWIDTH KATAKANA LETTER SMALL TU
+FF71..FF9D    ; Katakana # Lo  [45] HALFWIDTH KATAKANA LETTER A..HALFWIDTH KATAKANA LETTER N
+
+# Total code points: 299
+
+# ================================================
+
+3105..312D    ; Bopomofo # Lo  [41] BOPOMOFO LETTER B..BOPOMOFO LETTER IH
+31A0..31B7    ; Bopomofo # Lo  [24] BOPOMOFO LETTER BU..BOPOMOFO FINAL LETTER H
+
+# Total code points: 65
+
+# ================================================
+
+2E80..2E99    ; Han # So  [26] CJK RADICAL REPEAT..CJK RADICAL RAP
+2E9B..2EF3    ; Han # So  [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
+2F00..2FD5    ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
+3005          ; Han # Lm       IDEOGRAPHIC ITERATION MARK
+3007          ; Han # Nl       IDEOGRAPHIC NUMBER ZERO
+3021..3029    ; Han # Nl   [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
+3038..303A    ; Han # Nl   [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
+303B          ; Han # Lm       VERTICAL IDEOGRAPHIC ITERATION MARK
+3400..4DB5    ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
+4E00..9FC3    ; Han # Lo [20932] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FC3
+F900..FA2D    ; Han # Lo [302] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA2D
+FA30..FA6A    ; Han # Lo  [59] CJK COMPATIBILITY IDEOGRAPH-FA30..CJK COMPATIBILITY IDEOGRAPH-FA6A
+FA70..FAD9    ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
+20000..2A6D6  ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
+2F800..2FA1D  ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
+
+# Total code points: 71578
+
+# ================================================
+
+A000..A014    ; Yi # Lo  [21] YI SYLLABLE IT..YI SYLLABLE E
+A015          ; Yi # Lm       YI SYLLABLE WU
+A016..A48C    ; Yi # Lo [1143] YI SYLLABLE BIT..YI SYLLABLE YYR
+A490..A4C6    ; Yi # So  [55] YI RADICAL QOT..YI RADICAL KE
+
+# Total code points: 1220
+
+# ================================================
+
+10300..1031E  ; Old_Italic # Lo  [31] OLD ITALIC LETTER A..OLD ITALIC LETTER UU
+10320..10323  ; Old_Italic # No   [4] OLD ITALIC NUMERAL ONE..OLD ITALIC NUMERAL FIFTY
+
+# Total code points: 35
+
+# ================================================
+
+10330..10340  ; Gothic # Lo  [17] GOTHIC LETTER AHSA..GOTHIC LETTER PAIRTHRA
+10341         ; Gothic # Nl       GOTHIC LETTER NINETY
+10342..10349  ; Gothic # Lo   [8] GOTHIC LETTER RAIDA..GOTHIC LETTER OTHAL
+1034A         ; Gothic # Nl       GOTHIC LETTER NINE HUNDRED
+
+# Total code points: 27
+
+# ================================================
+
+10400..1044F  ; Deseret # L&  [80] DESERET CAPITAL LETTER LONG I..DESERET SMALL LETTER EW
+
+# Total code points: 80
+
+# ================================================
+
+0300..036F    ; Inherited # Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X
+064B..0655    ; Inherited # Mn  [11] ARABIC FATHATAN..ARABIC HAMZA BELOW
+0670          ; Inherited # Mn       ARABIC LETTER SUPERSCRIPT ALEF
+0951..0952    ; Inherited # Mn   [2] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI STRESS SIGN ANUDATTA
+1DC0..1DE6    ; Inherited # Mn  [39] COMBINING DOTTED GRAVE ACCENT..COMBINING LATIN SMALL LETTER Z
+1DFE..1DFF    ; Inherited # Mn   [2] COMBINING LEFT ARROWHEAD ABOVE..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW
+200C..200D    ; Inherited # Cf   [2] ZERO WIDTH NON-JOINER..ZERO WIDTH JOINER
+20D0..20DC    ; Inherited # Mn  [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE
+20DD..20E0    ; Inherited # Me   [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH
+20E1          ; Inherited # Mn       COMBINING LEFT RIGHT ARROW ABOVE
+20E2..20E4    ; Inherited # Me   [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE
+20E5..20F0    ; Inherited # Mn  [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE
+302A..302F    ; Inherited # Mn   [6] IDEOGRAPHIC LEVEL TONE MARK..HANGUL DOUBLE DOT TONE MARK
+3099..309A    ; Inherited # Mn   [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
+FE00..FE0F    ; Inherited # Mn  [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16
+FE20..FE26    ; Inherited # Mn   [7] COMBINING LIGATURE LEFT HALF..COMBINING CONJOINING MACRON
+101FD         ; Inherited # Mn       PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE
+1D167..1D169  ; Inherited # Mn   [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3
+1D17B..1D182  ; Inherited # Mn   [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE
+1D185..1D18B  ; Inherited # Mn   [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE
+1D1AA..1D1AD  ; Inherited # Mn   [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO
+E0100..E01EF  ; Inherited # Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256
+
+# Total code points: 496
+
+# ================================================
+
+1700..170C    ; Tagalog # Lo  [13] TAGALOG LETTER A..TAGALOG LETTER YA
+170E..1711    ; Tagalog # Lo   [4] TAGALOG LETTER LA..TAGALOG LETTER HA
+1712..1714    ; Tagalog # Mn   [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA
+
+# Total code points: 20
+
+# ================================================
+
+1720..1731    ; Hanunoo # Lo  [18] HANUNOO LETTER A..HANUNOO LETTER HA
+1732..1734    ; Hanunoo # Mn   [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD
+
+# Total code points: 21
+
+# ================================================
+
+1740..1751    ; Buhid # Lo  [18] BUHID LETTER A..BUHID LETTER HA
+1752..1753    ; Buhid # Mn   [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U
+
+# Total code points: 20
+
+# ================================================
+
+1760..176C    ; Tagbanwa # Lo  [13] TAGBANWA LETTER A..TAGBANWA LETTER YA
+176E..1770    ; Tagbanwa # Lo   [3] TAGBANWA LETTER LA..TAGBANWA LETTER SA
+1772..1773    ; Tagbanwa # Mn   [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U
+
+# Total code points: 18
+
+# ================================================
+
+1900..191C    ; Limbu # Lo  [29] LIMBU VOWEL-CARRIER LETTER..LIMBU LETTER HA
+1920..1922    ; Limbu # Mn   [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U
+1923..1926    ; Limbu # Mc   [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU
+1927..1928    ; Limbu # Mn   [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O
+1929..192B    ; Limbu # Mc   [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA
+1930..1931    ; Limbu # Mc   [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA
+1932          ; Limbu # Mn       LIMBU SMALL LETTER ANUSVARA
+1933..1938    ; Limbu # Mc   [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA
+1939..193B    ; Limbu # Mn   [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I
+1940          ; Limbu # So       LIMBU SIGN LOO
+1944..1945    ; Limbu # Po   [2] LIMBU EXCLAMATION MARK..LIMBU QUESTION MARK
+1946..194F    ; Limbu # Nd  [10] LIMBU DIGIT ZERO..LIMBU DIGIT NINE
+
+# Total code points: 66
+
+# ================================================
+
+1950..196D    ; Tai_Le # Lo  [30] TAI LE LETTER KA..TAI LE LETTER AI
+1970..1974    ; Tai_Le # Lo   [5] TAI LE LETTER TONE-2..TAI LE LETTER TONE-6
+
+# Total code points: 35
+
+# ================================================
+
+10000..1000B  ; Linear_B # Lo  [12] LINEAR B SYLLABLE B008 A..LINEAR B SYLLABLE B046 JE
+1000D..10026  ; Linear_B # Lo  [26] LINEAR B SYLLABLE B036 JO..LINEAR B SYLLABLE B032 QO
+10028..1003A  ; Linear_B # Lo  [19] LINEAR B SYLLABLE B060 RA..LINEAR B SYLLABLE B042 WO
+1003C..1003D  ; Linear_B # Lo   [2] LINEAR B SYLLABLE B017 ZA..LINEAR B SYLLABLE B074 ZE
+1003F..1004D  ; Linear_B # Lo  [15] LINEAR B SYLLABLE B020 ZO..LINEAR B SYLLABLE B091 TWO
+10050..1005D  ; Linear_B # Lo  [14] LINEAR B SYMBOL B018..LINEAR B SYMBOL B089
+10080..100FA  ; Linear_B # Lo [123] LINEAR B IDEOGRAM B100 MAN..LINEAR B IDEOGRAM VESSEL B305
+
+# Total code points: 211
+
+# ================================================
+
+10380..1039D  ; Ugaritic # Lo  [30] UGARITIC LETTER ALPA..UGARITIC LETTER SSU
+1039F         ; Ugaritic # Po       UGARITIC WORD DIVIDER
+
+# Total code points: 31
+
+# ================================================
+
+10450..1047F  ; Shavian # Lo  [48] SHAVIAN LETTER PEEP..SHAVIAN LETTER YEW
+
+# Total code points: 48
+
+# ================================================
+
+10480..1049D  ; Osmanya # Lo  [30] OSMANYA LETTER ALEF..OSMANYA LETTER OO
+104A0..104A9  ; Osmanya # Nd  [10] OSMANYA DIGIT ZERO..OSMANYA DIGIT NINE
+
+# Total code points: 40
+
+# ================================================
+
+10800..10805  ; Cypriot # Lo   [6] CYPRIOT SYLLABLE A..CYPRIOT SYLLABLE JA
+10808         ; Cypriot # Lo       CYPRIOT SYLLABLE JO
+1080A..10835  ; Cypriot # Lo  [44] CYPRIOT SYLLABLE KA..CYPRIOT SYLLABLE WO
+10837..10838  ; Cypriot # Lo   [2] CYPRIOT SYLLABLE XA..CYPRIOT SYLLABLE XE
+1083C         ; Cypriot # Lo       CYPRIOT SYLLABLE ZA
+1083F         ; Cypriot # Lo       CYPRIOT SYLLABLE ZO
+
+# Total code points: 55
+
+# ================================================
+
+2800..28FF    ; Braille # So [256] BRAILLE PATTERN BLANK..BRAILLE PATTERN DOTS-12345678
+
+# Total code points: 256
+
+# ================================================
+
+1A00..1A16    ; Buginese # Lo  [23] BUGINESE LETTER KA..BUGINESE LETTER HA
+1A17..1A18    ; Buginese # Mn   [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U
+1A19..1A1B    ; Buginese # Mc   [3] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN AE
+1A1E..1A1F    ; Buginese # Po   [2] BUGINESE PALLAWA..BUGINESE END OF SECTION
+
+# Total code points: 30
+
+# ================================================
+
+03E2..03EF    ; Coptic # L&  [14] COPTIC CAPITAL LETTER SHEI..COPTIC SMALL LETTER DEI
+2C80..2CE4    ; Coptic # L& [101] COPTIC CAPITAL LETTER ALFA..COPTIC SYMBOL KAI
+2CE5..2CEA    ; Coptic # So   [6] COPTIC SYMBOL MI RO..COPTIC SYMBOL SHIMA SIMA
+2CF9..2CFC    ; Coptic # Po   [4] COPTIC OLD NUBIAN FULL STOP..COPTIC OLD NUBIAN VERSE DIVIDER
+2CFD          ; Coptic # No       COPTIC FRACTION ONE HALF
+2CFE..2CFF    ; Coptic # Po   [2] COPTIC FULL STOP..COPTIC MORPHOLOGICAL DIVIDER
+
+# Total code points: 128
+
+# ================================================
+
+1980..19A9    ; New_Tai_Lue # Lo  [42] NEW TAI LUE LETTER HIGH QA..NEW TAI LUE LETTER LOW XVA
+19B0..19C0    ; New_Tai_Lue # Mc  [17] NEW TAI LUE VOWEL SIGN VOWEL SHORTENER..NEW TAI LUE VOWEL SIGN IY
+19C1..19C7    ; New_Tai_Lue # Lo   [7] NEW TAI LUE LETTER FINAL V..NEW TAI LUE LETTER FINAL B
+19C8..19C9    ; New_Tai_Lue # Mc   [2] NEW TAI LUE TONE MARK-1..NEW TAI LUE TONE MARK-2
+19D0..19D9    ; New_Tai_Lue # Nd  [10] NEW TAI LUE DIGIT ZERO..NEW TAI LUE DIGIT NINE
+19DE..19DF    ; New_Tai_Lue # Po   [2] NEW TAI LUE SIGN LAE..NEW TAI LUE SIGN LAEV
+
+# Total code points: 80
+
+# ================================================
+
+2C00..2C2E    ; Glagolitic # L&  [47] GLAGOLITIC CAPITAL LETTER AZU..GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE
+2C30..2C5E    ; Glagolitic # L&  [47] GLAGOLITIC SMALL LETTER AZU..GLAGOLITIC SMALL LETTER LATINATE MYSLITE
+
+# Total code points: 94
+
+# ================================================
+
+2D30..2D65    ; Tifinagh # Lo  [54] TIFINAGH LETTER YA..TIFINAGH LETTER YAZZ
+2D6F          ; Tifinagh # Lm       TIFINAGH MODIFIER LETTER LABIALIZATION MARK
+
+# Total code points: 55
+
+# ================================================
+
+A800..A801    ; Syloti_Nagri # Lo   [2] SYLOTI NAGRI LETTER A..SYLOTI NAGRI LETTER I
+A802          ; Syloti_Nagri # Mn       SYLOTI NAGRI SIGN DVISVARA
+A803..A805    ; Syloti_Nagri # Lo   [3] SYLOTI NAGRI LETTER U..SYLOTI NAGRI LETTER O
+A806          ; Syloti_Nagri # Mn       SYLOTI NAGRI SIGN HASANTA
+A807..A80A    ; Syloti_Nagri # Lo   [4] SYLOTI NAGRI LETTER KO..SYLOTI NAGRI LETTER GHO
+A80B          ; Syloti_Nagri # Mn       SYLOTI NAGRI SIGN ANUSVARA
+A80C..A822    ; Syloti_Nagri # Lo  [23] SYLOTI NAGRI LETTER CO..SYLOTI NAGRI LETTER HO
+A823..A824    ; Syloti_Nagri # Mc   [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I
+A825..A826    ; Syloti_Nagri # Mn   [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E
+A827          ; Syloti_Nagri # Mc       SYLOTI NAGRI VOWEL SIGN OO
+A828..A82B    ; Syloti_Nagri # So   [4] SYLOTI NAGRI POETRY MARK-1..SYLOTI NAGRI POETRY MARK-4
+
+# Total code points: 44
+
+# ================================================
+
+103A0..103C3  ; Old_Persian # Lo  [36] OLD PERSIAN SIGN A..OLD PERSIAN SIGN HA
+103C8..103CF  ; Old_Persian # Lo   [8] OLD PERSIAN SIGN AURAMAZDAA..OLD PERSIAN SIGN BUUMISH
+103D0         ; Old_Persian # Po       OLD PERSIAN WORD DIVIDER
+103D1..103D5  ; Old_Persian # Nl   [5] OLD PERSIAN NUMBER ONE..OLD PERSIAN NUMBER HUNDRED
+
+# Total code points: 50
+
+# ================================================
+
+10A00         ; Kharoshthi # Lo       KHAROSHTHI LETTER A
+10A01..10A03  ; Kharoshthi # Mn   [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R
+10A05..10A06  ; Kharoshthi # Mn   [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O
+10A0C..10A0F  ; Kharoshthi # Mn   [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA
+10A10..10A13  ; Kharoshthi # Lo   [4] KHAROSHTHI LETTER KA..KHAROSHTHI LETTER GHA
+10A15..10A17  ; Kharoshthi # Lo   [3] KHAROSHTHI LETTER CA..KHAROSHTHI LETTER JA
+10A19..10A33  ; Kharoshthi # Lo  [27] KHAROSHTHI LETTER NYA..KHAROSHTHI LETTER TTTHA
+10A38..10A3A  ; Kharoshthi # Mn   [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW
+10A3F         ; Kharoshthi # Mn       KHAROSHTHI VIRAMA
+10A40..10A47  ; Kharoshthi # No   [8] KHAROSHTHI DIGIT ONE..KHAROSHTHI NUMBER ONE THOUSAND
+10A50..10A58  ; Kharoshthi # Po   [9] KHAROSHTHI PUNCTUATION DOT..KHAROSHTHI PUNCTUATION LINES
+
+# Total code points: 65
+
+# ================================================
+
+1B00..1B03    ; Balinese # Mn   [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG
+1B04          ; Balinese # Mc       BALINESE SIGN BISAH
+1B05..1B33    ; Balinese # Lo  [47] BALINESE LETTER AKARA..BALINESE LETTER HA
+1B34          ; Balinese # Mn       BALINESE SIGN REREKAN
+1B35          ; Balinese # Mc       BALINESE VOWEL SIGN TEDUNG
+1B36..1B3A    ; Balinese # Mn   [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA
+1B3B          ; Balinese # Mc       BALINESE VOWEL SIGN RA REPA TEDUNG
+1B3C          ; Balinese # Mn       BALINESE VOWEL SIGN LA LENGA
+1B3D..1B41    ; Balinese # Mc   [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG
+1B42          ; Balinese # Mn       BALINESE VOWEL SIGN PEPET
+1B43..1B44    ; Balinese # Mc   [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG
+1B45..1B4B    ; Balinese # Lo   [7] BALINESE LETTER KAF SASAK..BALINESE LETTER ASYURA SASAK
+1B50..1B59    ; Balinese # Nd  [10] BALINESE DIGIT ZERO..BALINESE DIGIT NINE
+1B5A..1B60    ; Balinese # Po   [7] BALINESE PANTI..BALINESE PAMENENG
+1B61..1B6A    ; Balinese # So  [10] BALINESE MUSICAL SYMBOL DONG..BALINESE MUSICAL SYMBOL DANG GEDE
+1B6B..1B73    ; Balinese # Mn   [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG
+1B74..1B7C    ; Balinese # So   [9] BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG..BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING
+
+# Total code points: 121
+
+# ================================================
+
+12000..1236E  ; Cuneiform # Lo [879] CUNEIFORM SIGN A..CUNEIFORM SIGN ZUM
+12400..12462  ; Cuneiform # Nl  [99] CUNEIFORM NUMERIC SIGN TWO ASH..CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER
+12470..12473  ; Cuneiform # Po   [4] CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER..CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
+
+# Total code points: 982
+
+# ================================================
+
+10900..10915  ; Phoenician # Lo  [22] PHOENICIAN LETTER ALF..PHOENICIAN LETTER TAU
+10916..10919  ; Phoenician # No   [4] PHOENICIAN NUMBER ONE..PHOENICIAN NUMBER ONE HUNDRED
+1091F         ; Phoenician # Po       PHOENICIAN WORD SEPARATOR
+
+# Total code points: 27
+
+# ================================================
+
+A840..A873    ; Phags_Pa # Lo  [52] PHAGS-PA LETTER KA..PHAGS-PA LETTER CANDRABINDU
+A874..A877    ; Phags_Pa # Po   [4] PHAGS-PA SINGLE HEAD MARK..PHAGS-PA MARK DOUBLE SHAD
+
+# Total code points: 56
+
+# ================================================
+
+07C0..07C9    ; Nko # Nd  [10] NKO DIGIT ZERO..NKO DIGIT NINE
+07CA..07EA    ; Nko # Lo  [33] NKO LETTER A..NKO LETTER JONA RA
+07EB..07F3    ; Nko # Mn   [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE
+07F4..07F5    ; Nko # Lm   [2] NKO HIGH TONE APOSTROPHE..NKO LOW TONE APOSTROPHE
+07F6          ; Nko # So       NKO SYMBOL OO DENNEN
+07F7..07F9    ; Nko # Po   [3] NKO SYMBOL GBAKURUNEN..NKO EXCLAMATION MARK
+07FA          ; Nko # Lm       NKO LAJANYALAN
+
+# Total code points: 59
+
+# ================================================
+
+1B80..1B81    ; Sundanese # Mn   [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR
+1B82          ; Sundanese # Mc       SUNDANESE SIGN PANGWISAD
+1B83..1BA0    ; Sundanese # Lo  [30] SUNDANESE LETTER A..SUNDANESE LETTER HA
+1BA1          ; Sundanese # Mc       SUNDANESE CONSONANT SIGN PAMINGKAL
+1BA2..1BA5    ; Sundanese # Mn   [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU
+1BA6..1BA7    ; Sundanese # Mc   [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG
+1BA8..1BA9    ; Sundanese # Mn   [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG
+1BAA          ; Sundanese # Mc       SUNDANESE SIGN PAMAAEH
+1BAE..1BAF    ; Sundanese # Lo   [2] SUNDANESE LETTER KHA..SUNDANESE LETTER SYA
+1BB0..1BB9    ; Sundanese # Nd  [10] SUNDANESE DIGIT ZERO..SUNDANESE DIGIT NINE
+
+# Total code points: 55
+
+# ================================================
+
+1C00..1C23    ; Lepcha # Lo  [36] LEPCHA LETTER KA..LEPCHA LETTER A
+1C24..1C2B    ; Lepcha # Mc   [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU
+1C2C..1C33    ; Lepcha # Mn   [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T
+1C34..1C35    ; Lepcha # Mc   [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG
+1C36..1C37    ; Lepcha # Mn   [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA
+1C3B..1C3F    ; Lepcha # Po   [5] LEPCHA PUNCTUATION TA-ROL..LEPCHA PUNCTUATION TSHOOK
+1C40..1C49    ; Lepcha # Nd  [10] LEPCHA DIGIT ZERO..LEPCHA DIGIT NINE
+1C4D..1C4F    ; Lepcha # Lo   [3] LEPCHA LETTER TTA..LEPCHA LETTER DDA
+
+# Total code points: 74
+
+# ================================================
+
+1C50..1C59    ; Ol_Chiki # Nd  [10] OL CHIKI DIGIT ZERO..OL CHIKI DIGIT NINE
+1C5A..1C77    ; Ol_Chiki # Lo  [30] OL CHIKI LETTER LA..OL CHIKI LETTER OH
+1C78..1C7D    ; Ol_Chiki # Lm   [6] OL CHIKI MU TTUDDAG..OL CHIKI AHAD
+1C7E..1C7F    ; Ol_Chiki # Po   [2] OL CHIKI PUNCTUATION MUCAAD..OL CHIKI PUNCTUATION DOUBLE MUCAAD
+
+# Total code points: 48
+
+# ================================================
+
+A500..A60B    ; Vai # Lo [268] VAI SYLLABLE EE..VAI SYLLABLE NG
+A60C          ; Vai # Lm       VAI SYLLABLE LENGTHENER
+A60D..A60F    ; Vai # Po   [3] VAI COMMA..VAI QUESTION MARK
+A610..A61F    ; Vai # Lo  [16] VAI SYLLABLE NDOLE FA..VAI SYMBOL JONG
+A620..A629    ; Vai # Nd  [10] VAI DIGIT ZERO..VAI DIGIT NINE
+A62A..A62B    ; Vai # Lo   [2] VAI SYLLABLE NDOLE MA..VAI SYLLABLE NDOLE DO
+
+# Total code points: 300
+
+# ================================================
+
+A880..A881    ; Saurashtra # Mc   [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA
+A882..A8B3    ; Saurashtra # Lo  [50] SAURASHTRA LETTER A..SAURASHTRA LETTER LLA
+A8B4..A8C3    ; Saurashtra # Mc  [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU
+A8C4          ; Saurashtra # Mn       SAURASHTRA SIGN VIRAMA
+A8CE..A8CF    ; Saurashtra # Po   [2] SAURASHTRA DANDA..SAURASHTRA DOUBLE DANDA
+A8D0..A8D9    ; Saurashtra # Nd  [10] SAURASHTRA DIGIT ZERO..SAURASHTRA DIGIT NINE
+
+# Total code points: 81
+
+# ================================================
+
+A900..A909    ; Kayah_Li # Nd  [10] KAYAH LI DIGIT ZERO..KAYAH LI DIGIT NINE
+A90A..A925    ; Kayah_Li # Lo  [28] KAYAH LI LETTER KA..KAYAH LI LETTER OO
+A926..A92D    ; Kayah_Li # Mn   [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU
+A92E..A92F    ; Kayah_Li # Po   [2] KAYAH LI SIGN CWI..KAYAH LI SIGN SHYA
+
+# Total code points: 48
+
+# ================================================
+
+A930..A946    ; Rejang # Lo  [23] REJANG LETTER KA..REJANG LETTER A
+A947..A951    ; Rejang # Mn  [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R
+A952..A953    ; Rejang # Mc   [2] REJANG CONSONANT SIGN H..REJANG VIRAMA
+A95F          ; Rejang # Po       REJANG SECTION MARK
+
+# Total code points: 37
+
+# ================================================
+
+10280..1029C  ; Lycian # Lo  [29] LYCIAN LETTER A..LYCIAN LETTER X
+
+# Total code points: 29
+
+# ================================================
+
+102A0..102D0  ; Carian # Lo  [49] CARIAN LETTER A..CARIAN LETTER UUU3
+
+# Total code points: 49
+
+# ================================================
+
+10920..10939  ; Lydian # Lo  [26] LYDIAN LETTER A..LYDIAN LETTER C
+1093F         ; Lydian # Po       LYDIAN TRIANGULAR MARK
+
+# Total code points: 27
+
+# ================================================
+
+AA00..AA28    ; Cham # Lo  [41] CHAM LETTER A..CHAM LETTER HA
+AA29..AA2E    ; Cham # Mn   [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE
+AA2F..AA30    ; Cham # Mc   [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI
+AA31..AA32    ; Cham # Mn   [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE
+AA33..AA34    ; Cham # Mc   [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA
+AA35..AA36    ; Cham # Mn   [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA
+AA40..AA42    ; Cham # Lo   [3] CHAM LETTER FINAL K..CHAM LETTER FINAL NG
+AA43          ; Cham # Mn       CHAM CONSONANT SIGN FINAL NG
+AA44..AA4B    ; Cham # Lo   [8] CHAM LETTER FINAL CH..CHAM LETTER FINAL SS
+AA4C          ; Cham # Mn       CHAM CONSONANT SIGN FINAL M
+AA4D          ; Cham # Mc       CHAM CONSONANT SIGN FINAL H
+AA50..AA59    ; Cham # Nd  [10] CHAM DIGIT ZERO..CHAM DIGIT NINE
+AA5C..AA5F    ; Cham # Po   [4] CHAM PUNCTUATION SPIRAL..CHAM PUNCTUATION TRIPLE DANDA
+
+# Total code points: 83
+
+# EOF
diff --git a/extra/unicode/script/authors.txt b/extra/unicode/script/authors.txt
new file mode 100755 (executable)
index 0000000..504363d
--- /dev/null
@@ -0,0 +1 @@
+Daniel Ehrenberg\r
diff --git a/extra/unicode/script/script-docs.factor b/extra/unicode/script/script-docs.factor
new file mode 100755 (executable)
index 0000000..05828b7
--- /dev/null
@@ -0,0 +1,8 @@
+USING: help.syntax help.markup ;\r
+IN: unicode.script\r
+\r
+HELP: script-of\r
+{ $values { "char" "a code point" } { "script" "a symbol" } }\r
+{ $description "Gets a symbol representing the code point of a given character. The word name of the symbol is the same as the one " } ;\r
+\r
+ABOUT: script-of\r
diff --git a/extra/unicode/script/script-tests.factor b/extra/unicode/script/script-tests.factor
new file mode 100755 (executable)
index 0000000..9058371
--- /dev/null
@@ -0,0 +1,4 @@
+USING: unicode.script tools.test ;\r
+\r
+[ Latin ] [ CHAR: a script-of ] unit-test\r
+[ Common ] [ 0 script-of ] unit-test\r
diff --git a/extra/unicode/script/script.factor b/extra/unicode/script/script.factor
new file mode 100755 (executable)
index 0000000..d0bb4ac
--- /dev/null
@@ -0,0 +1,50 @@
+USING: unicode.syntax.backend kernel sequences assocs io.files
+io.encodings ascii math.ranges io splitting math.parser 
+namespaces byte-arrays locals math sets io.encodings.ascii
+words compiler.units arrays interval-maps ;
+IN: unicode.script
+
+<PRIVATE
+VALUE: script-table
+SYMBOL: interned
+
+: parse-script ( stream -- assoc )
+    ! assoc is code point/range => name
+    lines [ "#" split1 drop ] map [ empty? not ] filter [
+        ";" split1 [ [ blank? ] trim ] bi@
+    ] H{ } map>assoc ;
+
+: range, ( value key -- )
+    swap interned get
+    [ word-name = ] with find nip 2array , ;
+
+: expand-ranges ( assoc -- interval-map )
+    [
+        [
+            CHAR: . pick member? [
+                swap ".." split1 [ hex> ] bi@ 2array
+            ] [ swap hex> ] if range,
+        ] assoc-each
+    ] { } make <interval-map> ;
+
+: >symbols ( strings -- symbols )
+    [
+        [ "unicode.script" create dup define-symbol ] map
+    ] with-compilation-unit ;
+
+: process-script ( ranges -- )
+    dup values prune >symbols interned [
+        expand-ranges \ script-table set-value
+    ] with-variable ;
+
+: load-script ( -- )
+    "resource:extra/unicode/script/Scripts.txt"
+    ascii <file-reader> parse-script process-script ;
+
+load-script
+PRIVATE>
+
+SYMBOL: Unknown
+
+: script-of ( char -- script )
+    script-table interval-at [ Unknown ] unless* ;
diff --git a/extra/unicode/script/summary.txt b/extra/unicode/script/summary.txt
new file mode 100755 (executable)
index 0000000..a2de844
--- /dev/null
@@ -0,0 +1 @@
+Reads the UCD to get the script of a code point\r
diff --git a/extra/unicode/syntax/backend/backend.factor b/extra/unicode/syntax/backend/backend.factor
new file mode 100644 (file)
index 0000000..5c463e8
--- /dev/null
@@ -0,0 +1,8 @@
+USING: kernel parser sequences words ;
+IN: unicode.syntax.backend
+
+: VALUE:
+    CREATE-WORD { f } clone [ first ] curry define ; parsing
+
+: set-value ( value word -- )
+    word-def first set-first ;
index 4dc91a73c2327c5d48313223d860e6932bae3518..b5ba25db4e27214264d67b1b1787330349f1ab6c 100755 (executable)
@@ -1,5 +1,6 @@
-USING: unicode.data kernel math sequences parser bit-arrays namespaces 
-sequences.private arrays quotations classes.predicate assocs ;
+USING: unicode.data kernel math sequences parser bit-arrays
+namespaces sequences.private arrays quotations assocs
+classes.predicate math.order ;
 IN: unicode.syntax
 
 ! Character classes (categories)
@@ -27,8 +28,8 @@ IN: unicode.syntax
 
 : [category] ( categories -- quot )
     [
-        [ [ categories member? not ] subset as-string ] keep 
-        [ categories member? ] subset >category-array
+        [ [ categories member? not ] filter as-string ] keep 
+        [ categories member? ] filter >category-array
         [ dup category# ] % , [ nth-unsafe [ drop t ] ] %
         \ member? 2array >quotation ,
         \ if ,
@@ -41,7 +42,7 @@ IN: unicode.syntax
     CREATE ";" parse-tokens define-category ; parsing
 
 : seq-minus ( seq1 seq2 -- diff )
-    [ member? not ] curry subset ;
+    [ member? not ] curry filter ;
 
 : CATEGORY-NOT:
     CREATE ";" parse-tokens
index d80db44348f7f4133e191696c625d04a5ad94164..158dbeaddb7c3cd483bc7032e7121bc04982bfca 100755 (executable)
@@ -21,7 +21,9 @@ IN: unix
 : SO_SNDTIMEO HEX: 1005 ; inline
 : SO_RCVTIMEO HEX: 1006 ; inline
 
+: F_SETFD 2 ; inline
 : F_SETFL 4 ; inline
+: FD_CLOEXEC 1 ; inline
 : O_NONBLOCK 4 ; inline
 
 C-STRUCT: sockaddr-in
diff --git a/extra/unix/ffi/ffi.factor b/extra/unix/ffi/ffi.factor
new file mode 100644 (file)
index 0000000..11a8405
--- /dev/null
@@ -0,0 +1,6 @@
+
+USING: alien.syntax ;
+
+IN: unix.ffi
+
+FUNCTION: int open ( char* path, int flags, int prot ) ;
\ No newline at end of file
index a6cb90ba063dc4058909a5ebdd22237e77862d98..d688153bd05df886cbe53db1069d07959135fb63 100755 (executable)
@@ -55,7 +55,7 @@ IN: unix.linux.ifreq
 
 : set-if-metric ( name metric -- )
   "struct-ifreq" <c-object>
-  rot string>char-alien over set-struct-ifreq-ifr-ifrn
+  rot ascii string>alien over set-struct-ifreq-ifr-ifrn
   swap <int>           over set-struct-ifreq-ifr-ifru
 
   AF_INET SOCK_DGRAM 0 socket SIOCSIFMETRIC rot ioctl drop ;
\ No newline at end of file
index 11db6cc862104dab9dbe59efdc45694fc96f20ad..74195fae36d14491eae17574a75584dc70696f09 100755 (executable)
@@ -24,6 +24,9 @@ USING: alien.syntax ;
 : SO_SNDTIMEO HEX: 15 ; inline
 : SO_RCVTIMEO HEX: 14 ; inline
 
+: F_SETFD 2 ; inline
+: FD_CLOEXEC 1 ; inline
+
 : F_SETFL 4 ; inline
 : O_NONBLOCK HEX: 800 ; inline
 
index 9005cd2b2acecc7b2aa74e81317a326cd0b130b1..38af4b86953b94d246414164efa194db94acbb67 100755 (executable)
@@ -2,7 +2,10 @@
 ! See http://factorcode.org/license.txt for BSD license.
 
 USING: alien alien.c-types alien.syntax kernel libc structs
-math namespaces system combinators vocabs.loader unix.types ;
+       math namespaces system combinators vocabs.loader unix.ffi unix.types
+       qualified ;
+
+QUALIFIED: unix.ffi
 
 IN: unix
 
@@ -75,7 +78,17 @@ FUNCTION: void* mmap ( void* addr, size_t len, int prot, int flags, int fd, off_
 FUNCTION: int munmap ( void* addr, size_t len ) ;
 FUNCTION: uint ntohl ( uint n ) ;
 FUNCTION: ushort ntohs ( ushort n ) ;
-FUNCTION: int open ( char* path, int flags, int prot ) ;
+FUNCTION: char* strerror ( int errno ) ;
+
+TUPLE: open-error path flags prot message ;
+
+: open ( path flags prot -- int )
+  [ ] [ unix.ffi:open ] 3bi
+  dup 0 >=
+    [ nip nip nip ]
+    [ drop err_no strerror open-error boa throw ]
+  if ;
+
 FUNCTION: int pclose ( void* file ) ;
 FUNCTION: int pipe ( int* filedes ) ;
 FUNCTION: void* popen ( char* command, char* type ) ;
@@ -96,7 +109,6 @@ FUNCTION: int setreuid ( uid_t ruid, uid_t euid ) ;
 FUNCTION: int setsockopt ( int s, int level, int optname, void* optval, socklen_t optlen ) ;
 FUNCTION: int setuid ( uid_t uid ) ;
 FUNCTION: int socket ( int domain, int type, int protocol ) ;
-FUNCTION: char* strerror ( int errno ) ;
 FUNCTION: int symlink ( char* path1, char* path2 ) ;
 FUNCTION: int system ( char* command ) ;
 FUNCTION: int unlink ( char* path ) ;
diff --git a/extra/update/backup/backup.factor b/extra/update/backup/backup.factor
new file mode 100644 (file)
index 0000000..bb6d17f
--- /dev/null
@@ -0,0 +1,25 @@
+
+USING: namespaces io.files bootstrap.image builder.util ;
+
+IN: update.backup
+
+: backup-boot-image ( -- )
+  my-boot-image-name
+  { "boot." my-arch "-" [ "datestamp" get ] ".image" } to-string  
+  move-file ;
+
+: backup-image ( -- )
+  "factor.image"
+  { "factor" "-" [ "datestamp" get ] ".image" } to-string
+  move-file ;
+
+: backup-vm ( -- )
+  "factor"
+  { "factor" "-" [ "datestamp" get ] } to-string
+  move-file ;
+
+: backup ( -- )
+  datestamp "datestamp" set
+  backup-boot-image
+  backup-image
+  backup-vm ;
diff --git a/extra/update/latest/latest.factor b/extra/update/latest/latest.factor
new file mode 100644 (file)
index 0000000..df05742
--- /dev/null
@@ -0,0 +1,53 @@
+
+USING: kernel namespaces system io.files bootstrap.image http.client
+       builder.util update update.backup ;
+
+IN: update.latest
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: git-pull-master ( -- )
+  image parent-directory
+    [
+      { "git" "pull" "git://factorcode.org/git/factor.git" "master" }
+      run-command
+    ]
+  with-directory ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: remote-latest-image ( -- url )
+  { "http://factorcode.org/images/latest/" my-boot-image-name } to-string ;
+
+: download-latest-image ( -- ) remote-latest-image download ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: rebuild-latest ( -- )
+  image parent-directory
+    [
+      backup
+      download-latest-image
+      make-clean
+      make
+      boot
+    ]
+  with-directory ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+: update-latest ( -- )
+  image parent-directory
+    [
+      git-id
+      git-pull-master
+      git-id
+      = not
+        [ rebuild-latest ]
+      when
+    ]
+  with-directory ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+MAIN: update-latest
\ No newline at end of file
index 9b10ea746f41cf81079bd23e3a84bfe9277af30f..1d25a9792ef1d52f0571487450d65b9fb73c36a2 100644 (file)
@@ -22,7 +22,8 @@ IN: update
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 : remote-clean-image ( -- url )
-  "http://factorcode.org/images/clean/" my-boot-image-name append ;
+  { "http://factorcode.org/images/clean/" platform "/" my-boot-image-name }
+  to-string ;
 
 : download-clean-image ( -- ) remote-clean-image download ;
 
diff --git a/extra/usa-cities/usa-cities.factor b/extra/usa-cities/usa-cities.factor
new file mode 100644 (file)
index 0000000..0149c68
--- /dev/null
@@ -0,0 +1,53 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: io.files io.encodings.ascii sequences sequences.lib
+math.parser combinators kernel memoize csv symbols inspector
+words accessors math.order sorting ;
+IN: usa-cities
+
+SINGLETONS: AK AL AR AS AZ CA CO CT DC DE FL GA HI IA ID IL IN
+KS KY LA MA MD ME MI MN MO MS MT NC ND NE NH NJ NM NV NY OH OK
+OR PA PR RI SC SD TN TX UT VA VI VT WA WI WV WY ;
+
+: states ( -- seq )
+    {
+        AK AL AR AS AZ CA CO CT DC DE FL GA HI IA ID IL IN KS KY
+        LA MA MD ME MI MN MO MS MT NC ND NE NH NJ NM NV NY OH OK
+        OR PA PR RI SC SD TN TX UT VA VI VT WA WI WV WY
+    } ; inline
+
+ERROR: no-such-state name ;
+
+M: no-such-state summary drop "No such state" ;
+
+MEMO: string>state ( string -- state )
+    dup states [ word-name = ] with find nip
+    [ ] [ no-such-state ] ?if ;
+
+TUPLE: city
+first-zip name state latitude longitude gmt-offset dst-offset ;
+
+MEMO: cities ( -- seq )
+    "resource:extra/usa-cities/zipcode.csv" ascii <file-reader>
+    csv rest-slice [
+        7 firstn {
+            [ string>number ]
+            [ ]
+            [ string>state ]
+            [ string>number ]
+            [ string>number ]
+            [ string>number ]
+            [ string>number ]
+        } spread city boa
+    ] map ;
+
+MEMO: cities-named ( name -- cities )
+    cities [ name>> = ] with filter ;
+
+MEMO: cities-named-in ( name state -- cities )
+    cities [
+        tuck [ name>> = ] [ state>> = ] 2bi* and
+    ] with with filter ;
+
+: find-zip-code ( code -- city )
+    cities [ first-zip>> <=> ] binsearch* ;
diff --git a/extra/usa-cities/zipcode.csv b/extra/usa-cities/zipcode.csv
new file mode 100644 (file)
index 0000000..e6a1645
--- /dev/null
@@ -0,0 +1,43205 @@
+"zip","city","state","latitude","longitude","timezone","dst"
+"00210","Portsmouth","NH","43.005895","-71.013202","-5","1"
+"00211","Portsmouth","NH","43.005895","-71.013202","-5","1"
+"00212","Portsmouth","NH","43.005895","-71.013202","-5","1"
+"00213","Portsmouth","NH","43.005895","-71.013202","-5","1"
+"00214","Portsmouth","NH","43.005895","-71.013202","-5","1"
+"00215","Portsmouth","NH","43.005895","-71.013202","-5","1"
+"00501","Holtsville","NY","40.922326","-72.637078","-5","1"
+"00544","Holtsville","NY","40.922326","-72.637078","-5","1"
+"00601","Adjuntas","PR","18.180103","-66.74947","-4","0"
+"00602","Aguada","PR","18.363285","-67.18024","-4","0"
+"00603","Aguadilla","PR","18.448619","-67.13422","-4","0"
+"00604","Aguadilla","PR","18.498987","-67.13699","-4","0"
+"00605","Aguadilla","PR","18.465162","-67.141486","-4","0"
+"00606","Maricao","PR","18.182151","-66.9588","-4","0"
+"00607","Aguas Buenas","PR","18.256995","-66.104657","-4","0"
+
+"00609","Aibonito","PR","18.142002","-66.273278","-4","0"
+"00610","Anasco","PR","18.288319","-67.13604","-4","0"
+"00611","Angeles","PR","18.279531","-66.80217","-4","0"
+"00612","Arecibo","PR","18.449732","-66.69879","-4","0"
+"00613","Arecibo","PR","18.458093","-66.732732","-4","0"
+"00614","Arecibo","PR","18.429675","-66.674506","-4","0"
+"00615","Arroyo","PR","17.96977","-66.061459","-4","0"
+"00616","Bajadero","PR","18.426748","-66.67669","-4","0"
+"00617","Barceloneta","PR","18.455499","-66.55575","-4","0"
+"00618","Barranquitas","PR","18.185463","-66.305827","-4","0"
+"00622","Boqueron","PR","18.003125","-67.16745","-4","0"
+"00623","Cabo Rojo","PR","18.08643","-67.15222","-4","0"
+"00624","Penuelas","PR","18.055399","-66.72602","-4","0"
+"00625","Caguas","PR","18.232109","-66.039087","-4","0"
+"00626","Caguas","PR","18.235003","-66.037318","-4","0"
+"00627","Camuy","PR","18.435246","-66.85644","-4","0"
+
+"00631","Castaner","PR","18.186739","-66.85174","-4","0"
+"00633","Cayey","PR","18.194527","-66.183467","-4","0"
+"00634","Cayey","PR","18.111528","-66.177083","-4","0"
+"00635","Ceiba","PR","18.262902","-65.646529","-4","0"
+"00636","Rosario","PR","18.113284","-67.039706","-4","0"
+"00637","Sabana Grande","PR","18.073078","-66.94864","-4","0"
+"00638","Ciales","PR","18.308139","-66.49835","-4","0"
+"00639","Cidra","PR","18.176094","-66.158728","-4","0"
+"00640","Coamo","PR","18.077197","-66.359104","-4","0"
+"00641","Utuado","PR","18.268896","-66.70519","-4","0"
+
+"00643","Corozal","PR","18.341254","-66.315194","-4","0"
+"00644","Coto Laurel","PR","18.049577","-66.55218","-4","0"
+"00645","Culebra","PR","18.308508","-65.304732","-4","0"
+"00646","Dorado","PR","18.442798","-66.27689","-4","0"
+"00647","Ensenada","PR","17.964529","-66.93993","-4","0"
+"00648","Fajardo","PR","18.333038","-65.656182","-4","0"
+"00650","Florida","PR","18.363331","-66.56773","-4","0"
+"00652","Garrochales","PR","18.457453","-66.61217","-4","0"
+"00653","Guanica","PR","17.992112","-66.90097","-4","0"
+"00654","Jobos","PR","17.979518","-66.117219","-4","0"
+"00655","Olimpo","PR","17.976371","-66.116795","-4","0"
+"00656","Guayanilla","PR","18.038866","-66.79168","-4","0"
+"00658","Gurabo","PR","18.254137","-65.973605","-4","0"
+"00659","Hatillo","PR","18.432956","-66.80039","-4","0"
+"00660","Hormigueros","PR","18.139108","-67.12085","-4","0"
+"00661","Humacao","PR","18.150829","-65.826595","-4","0"
+"00662","Isabela","PR","18.478855","-67.01973","-4","0"
+"00664","Jayuya","PR","18.212565","-66.59243","-4","0"
+"00665","Ponce","PR","18.044224","-66.502103","-4","0"
+"00666","Juncos","PR","18.228952","-65.921356","-4","0"
+"00667","Lajas","PR","18.017819","-67.04226","-4","0"
+"00669","Lares","PR","18.288418","-66.87503","-4","0"
+"00670","Las Marias","PR","18.241343","-66.97604","-4","0"
+"00671","Las Piedras","PR","18.1789","-65.869939","-4","0"
+
+
+"00674","Manati","PR","18.426137","-66.48697","-4","0"
+"00676","Moca","PR","18.37956","-67.08424","-4","0"
+"00677","Rincon","PR","18.336121","-67.23675","-4","0"
+"00678","Quebradillas","PR","18.442334","-66.93275","-4","0"
+"00680","Mayaguez","PR","18.205232","-67.12655","-4","0"
+"00681","Mayaguez","PR","18.219023","-67.508068","-4","0"
+"00682","Mayaguez","PR","18.208402","-67.15428","-4","0"
+"00683","San German","PR","18.092807","-67.04524","-4","0"
+"00685","San Sebastian","PR","18.332595","-66.98104","-4","0"
+"00687","Morovis","PR","18.31708","-66.41528","-4","0"
+"00688","Sabana Hoyos","PR","18.40415","-66.61348","-4","0"
+"00690","San Antonio","PR","18.495369","-67.09867","-4","0"
+"00692","Vega Alta","PR","18.419666","-66.33186","-4","0"
+"00693","Vega Baja","PR","18.440667","-66.3921","-4","0"
+"00694","Vega Baja","PR","18.443109","-66.398302","-4","0"
+"00698","Yauco","PR","18.06547","-66.85587","-4","0"
+
+"00703","Aguas Buenas","PR","18.246205","-66.12827","-4","0"
+"00704","Aguirre","PR","17.970112","-66.22291","-4","0"
+"00705","Aibonito","PR","18.12942","-66.26541","-4","0"
+"00707","Maunabo","PR","18.014505","-65.91018","-4","0"
+
+
+"00714","Arroyo","PR","17.987288","-66.05552","-4","0"
+"00715","Mercedita","PR","18.003492","-66.55868","-4","0"
+"00716","Ponce","PR","17.999066","-66.59965","-4","0"
+"00717","Ponce","PR","18.004303","-66.61374","-4","0"
+"00718","Naguabo","PR","18.22048","-65.74293","-4","0"
+"00719","Naranjito","PR","18.294571","-66.25098","-4","0"
+"00720","Orocovis","PR","18.217827","-66.42265","-4","0"
+"00721","Palmer","PR","18.364161","-65.778288","-4","0"
+"00723","Patillas","PR","18.023196","-66.0131","-4","0"
+
+"00725","Caguas","PR","18.233927","-66.04502","-4","0"
+"00726","Caguas","PR","18.212965","-66.058033","-4","0"
+"00728","Ponce","PR","18.013353","-66.65218","-4","0"
+"00729","Canovanas","PR","18.35615","-65.89089","-4","0"
+"00730","Ponce","PR","18.022626","-66.61727","-4","0"
+"00731","Ponce","PR","18.077329","-66.61192","-4","0"
+"00732","Ponce","PR","18.021781","-66.613742","-4","0"
+"00733","Ponce","PR","18.019331","-66.619165","-4","0"
+"00734","Ponce","PR","17.999499","-66.643934","-4","0"
+"00735","Ceiba","PR","18.258444","-65.65987","-4","0"
+"00736","Cayey","PR","18.112895","-66.15377","-4","0"
+"00737","Cayey","PR","18.102967","-66.139274","-4","0"
+"00738","Fajardo","PR","18.32265","-65.66116","-4","0"
+"00739","Cidra","PR","18.16984","-66.16271","-4","0"
+"00740","Puerto Real","PR","18.331711","-65.62761","-4","0"
+"00741","Punta Santiago","PR","18.160755","-65.75765","-4","0"
+"00742","Roosevelt Roads","PR","18.264872","-65.594769","-4","0"
+
+"00744","Rio Blanco","PR","18.206329","-65.743058","-4","0"
+"00745","Rio Grande","PR","18.366213","-65.82277","-4","0"
+"00747","Lluveras","PR","18.069474","-66.952589","-4","0"
+"00748","Fajardo","PR","18.326732","-65.652484","-4","0"
+"00751","Salinas","PR","17.993803","-66.26534","-4","0"
+"00752","San Antonio","PR","18.493745","-67.097726","-4","0"
+
+"00754","San Lorenzo","PR","18.15633","-65.96831","-4","0"
+
+"00757","Santa Isabel","PR","17.98631","-66.39457","-4","0"
+
+"00761","Utuado","PR","18.265445","-66.702364","-4","0"
+"00762","Vega Alta","PR","18.420218","-66.324284","-4","0"
+"00763","Monserrate","PR","18.452175","-66.399836","-4","0"
+"00764","Vega Baja","PR","18.452084","-66.397138","-4","0"
+"00765","Vieques","PR","18.125664","-65.45603","-4","0"
+"00766","Villalba","PR","18.126023","-66.48208","-4","0"
+"00767","Yabucoa","PR","18.072752","-65.89703","-4","0"
+"00768","Yauco","PR","18.030715","-66.856181","-4","0"
+"00769","Coamo","PR","18.092813","-66.3611","-4","0"
+"00771","Las Piedras","PR","18.18744","-65.87088","-4","0"
+"00772","Loiza","PR","18.427674","-65.87605","-4","0"
+"00773","Luquillo","PR","18.361344","-65.72133","-4","0"
+"00775","Culebra","PR","18.311149","-65.29257","-4","0"
+"00777","Juncos","PR","18.224088","-65.91316","-4","0"
+"00778","Gurabo","PR","18.258628","-65.97791","-4","0"
+"00780","Coto Laurel","PR","18.068538","-66.55939","-4","0"
+"00782","Comerio","PR","18.223348","-66.2267","-4","0"
+"00783","Corozal","PR","18.304874","-66.32305","-4","0"
+"00784","Guayama","PR","17.984137","-66.12779","-4","0"
+"00785","Guayama","PR","18.018822","-66.795603","-4","0"
+"00786","La Plata","PR","18.128092","-66.268717","-4","0"
+"00791","Humacao","PR","18.147257","-65.82269","-4","0"
+"00792","Humacao","PR","18.138029","-65.788499","-4","0"
+"00794","Barranquitas","PR","18.204294","-66.31058","-4","0"
+"00795","Juana Diaz","PR","18.036253","-66.50289","-4","0"
+"00801","St Thomas","VI","18.322285","-64.963715","-4","0"
+"00802","St Thomas","VI","18.322285","-64.963715","-4","0"
+"00803","St Thomas","VI","18.322285","-64.963715","-4","0"
+"00804","St Thomas","VI","18.322285","-64.963715","-4","0"
+"00805","St Thomas","VI","18.322285","-64.963715","-4","0"
+"00820","Christiansted","VI","17.734211","-64.734694","-4","0"
+"00821","Christiansted","VI","17.734211","-64.734694","-4","0"
+"00822","Christiansted","VI","17.734211","-64.734694","-4","0"
+"00823","Christiansted","VI","17.734211","-64.734694","-4","0"
+"00824","Christiansted","VI","17.734211","-64.734694","-4","0"
+"00830","St John","VI","18.32816","-64.740737","-4","0"
+"00831","St John","VI","18.32816","-64.740737","-4","0"
+"00840","Frederiksted","VI","17.734211","-64.734694","-4","0"
+"00841","Frederiksted","VI","17.734211","-64.734694","-4","0"
+"00850","Kingshill","VI","17.734211","-64.734694","-4","0"
+"00851","Kingshill","VI","17.734211","-64.734694","-4","0"
+"00901","San Juan","PR","18.465426","-66.10786","-4","0"
+"00902","San Juan","PR","18.410462","-66.060533","-4","0"
+"00906","San Juan","PR","18.46454","-66.10079","-4","0"
+"00907","San Juan","PR","18.451131","-66.07798","-4","0"
+"00908","San Juan","PR","18.410462","-66.060533","-4","0"
+"00909","San Juan","PR","18.442282","-66.06764","-4","0"
+"00910","San Juan","PR","18.410462","-66.060533","-4","0"
+"00911","San Juan","PR","18.45009","-66.0577","-4","0"
+"00912","San Juan","PR","18.445946","-66.05928","-4","0"
+"00913","San Juan","PR","18.450907","-66.04256","-4","0"
+"00914","San Juan","PR","18.410462","-66.060533","-4","0"
+"00915","San Juan","PR","18.436995","-66.04888","-4","0"
+"00916","San Juan","PR","18.410462","-66.060533","-4","0"
+"00917","San Juan","PR","18.422263","-66.0513","-4","0"
+"00918","San Juan","PR","18.417668","-66.06494","-4","0"
+"00919","San Juan","PR","18.410462","-66.060533","-4","0"
+"00920","San Juan","PR","18.41242","-66.09069","-4","0"
+"00921","San Juan","PR","18.394019","-66.08633","-4","0"
+"00922","San Juan","PR","18.410462","-66.060533","-4","0"
+"00923","San Juan","PR","18.410681","-66.03806","-4","0"
+"00924","San Juan","PR","18.401917","-66.01194","-4","0"
+"00925","San Juan","PR","18.400006","-66.05028","-4","0"
+"00926","San Juan","PR","18.361363","-66.0562","-4","0"
+"00927","San Juan","PR","18.39184","-66.06867","-4","0"
+"00928","San Juan","PR","18.410462","-66.060533","-4","0"
+"00929","San Juan","PR","18.410462","-66.060533","-4","0"
+"00930","San Juan","PR","18.410462","-66.060533","-4","0"
+"00931","San Juan","PR","18.410462","-66.060533","-4","0"
+"00933","San Juan","PR","18.410462","-66.060533","-4","0"
+"00934","Fort Buchanan","PR","18.413511","-66.12198","-4","0"
+"00935","San Juan","PR","18.410462","-66.060533","-4","0"
+"00936","San Juan","PR","18.410462","-66.060533","-4","0"
+"00937","San Juan","PR","18.410462","-66.060533","-4","0"
+"00938","San Juan","PR","18.410462","-66.060533","-4","0"
+"00939","San Juan","PR","18.410462","-66.060533","-4","0"
+"00940","San Juan","PR","18.410462","-66.060533","-4","0"
+"00949","Toa Baja","PR","18.433173","-66.2042","-4","0"
+"00950","Toa Baja","PR","18.457761","-66.196503","-4","0"
+"00951","Toa Baja","PR","18.457761","-66.196503","-4","0"
+"00952","Sabana Seca","PR","18.429218","-66.18014","-4","0"
+"00953","Toa Alta","PR","18.36802","-66.23414","-4","0"
+"00954","Toa Alta","PR","18.358939","-66.258108","-4","0"
+"00955","San Juan","PR","18.410462","-66.060533","-4","0"
+"00956","Bayamon","PR","18.34216","-66.16643","-4","0"
+"00957","Bayamon","PR","18.369674","-66.18669","-4","0"
+"00958","Bayamon","PR","18.34487","-66.166014","-4","0"
+"00959","Bayamon","PR","18.387063","-66.15943","-4","0"
+"00960","Bayamon","PR","18.34487","-66.166014","-4","0"
+"00961","Bayamon","PR","18.412462","-66.16033","-4","0"
+"00962","Catano","PR","18.437683","-66.13847","-4","0"
+"00963","Catano","PR","18.443217","-66.139293","-4","0"
+"00965","Guaynabo","PR","18.431453","-66.11703","-4","0"
+"00966","Guaynabo","PR","18.398507","-66.11522","-4","0"
+"00968","Guaynabo","PR","18.408479","-66.1025","-4","0"
+"00969","Guaynabo","PR","18.366981","-66.10889","-4","0"
+"00970","Guaynabo","PR","18.359143","-66.112295","-4","0"
+"00971","Guaynabo","PR","18.329688","-66.11876","-4","0"
+"00975","San Juan","PR","18.410462","-66.060533","-4","0"
+"00976","Trujillo Alto","PR","18.346767","-66.00561","-4","0"
+"00977","Trujillo Alto","PR","18.337004","-65.990099","-4","0"
+"00978","St Just","PR","18.337004","-65.990099","-4","0"
+"00979","Carolina","PR","18.431885","-66.0127","-4","0"
+"00981","Carolina","PR","18.410462","-66.060533","-4","0"
+"00982","Carolina","PR","18.409345","-65.99313","-4","0"
+"00983","Carolina","PR","18.414408","-65.97582","-4","0"
+"00984","Carolina","PR","18.393355","-65.972495","-4","0"
+"00985","Carolina","PR","18.374896","-65.94691","-4","0"
+"00986","Carolina","PR","18.393355","-65.972495","-4","0"
+"00987","Carolina","PR","18.372228","-65.96275","-4","0"
+"00988","Carolina","PR","18.393355","-65.972495","-4","0"
+"01001","Agawam","MA","42.07061","-72.62029","-5","1"
+"01002","Amherst","MA","42.377651","-72.50323","-5","1"
+"01003","Amherst","MA","42.369562","-72.63599","-5","1"
+"01004","Amherst","MA","42.384494","-72.513183","-5","1"
+"01005","Barre","MA","42.412094","-72.10443","-5","1"
+"01007","Belchertown","MA","42.278424","-72.411","-5","1"
+"01008","Blandford","MA","42.174313","-72.94828","-5","1"
+"01009","Bondsville","MA","42.206092","-72.340486","-5","1"
+"01010","Brimfield","MA","42.126038","-72.20552","-5","1"
+"01011","Chester","MA","42.271442","-73.01958","-5","1"
+"01012","Chesterfield","MA","42.390836","-72.84356","-5","1"
+"01013","Chicopee","MA","42.161492","-72.60316","-5","1"
+"01014","Chicopee","MA","42.170731","-72.604842","-5","1"
+"01020","Chicopee","MA","42.175992","-72.57265","-5","1"
+"01021","Chicopee","MA","42.170731","-72.604842","-5","1"
+"01022","Chicopee","MA","42.196666","-72.55606","-5","1"
+"01026","Cummington","MA","42.465041","-72.91813","-5","1"
+"01027","Easthampton","MA","42.27279","-72.68677","-5","1"
+"01028","East Longmeadow","MA","42.066795","-72.5102","-5","1"
+"01029","East Otis","MA","42.175896","-73.04204","-5","1"
+"01030","Feeding Hills","MA","42.070774","-72.67248","-5","1"
+"01031","Gilbertville","MA","42.33071","-72.18833","-5","1"
+"01032","Goshen","MA","42.45792","-72.81551","-5","1"
+"01033","Granby","MA","42.254563","-72.51831","-5","1"
+"01034","Granville","MA","42.086224","-72.94464","-5","1"
+"01035","Hadley","MA","42.35549","-72.5733","-5","1"
+"01036","Hampden","MA","42.064703","-72.41735","-5","1"
+"01037","Hardwick","MA","42.374202","-72.19524","-5","1"
+"01038","Hatfield","MA","42.375155","-72.60832","-5","1"
+"01039","Haydenville","MA","42.381475","-72.69259","-5","1"
+"01040","Holyoke","MA","42.201891","-72.6242","-5","1"
+"01041","Holyoke","MA","42.170731","-72.604842","-5","1"
+"01050","Huntington","MA","42.290209","-72.87942","-5","1"
+"01053","Leeds","MA","42.353105","-72.70206","-5","1"
+"01054","Leverett","MA","42.479839","-72.49879","-5","1"
+"01056","Ludlow","MA","42.174893","-72.47068","-5","1"
+"01057","Monson","MA","42.089269","-72.317","-5","1"
+"01059","North Amherst","MA","42.369562","-72.63599","-5","1"
+"01060","Northampton","MA","42.324539","-72.63561","-5","1"
+"01061","Northampton","MA","42.369562","-72.63599","-5","1"
+"01062","Florence","MA","42.324232","-72.67915","-5","1"
+"01063","Northampton","MA","42.317939","-72.640234","-5","1"
+"01066","North Hatfield","MA","42.406697","-72.633901","-5","1"
+"01068","Oakham","MA","42.349769","-72.04413","-5","1"
+"01069","Palmer","MA","42.176401","-72.32646","-5","1"
+"01070","Plainfield","MA","42.515853","-72.91661","-5","1"
+"01071","Russell","MA","42.165931","-72.85153","-5","1"
+"01072","Shutesbury","MA","42.486027","-72.42208","-5","1"
+"01073","Southampton","MA","42.223885","-72.72777","-5","1"
+"01074","South Barre","MA","42.375998","-72.149388","-5","1"
+"01075","South Hadley","MA","42.234891","-72.58243","-5","1"
+"01077","Southwick","MA","42.05283","-72.76966","-5","1"
+"01079","Thorndike","MA","42.192892","-72.329574","-5","1"
+"01080","Three Rivers","MA","42.180563","-72.36518","-5","1"
+"01081","Wales","MA","42.058024","-72.22517","-5","1"
+"01082","Ware","MA","42.270611","-72.26067","-5","1"
+"01083","Warren","MA","42.20468","-72.20259","-5","1"
+"01084","West Chesterfield","MA","42.379807","-72.89043","-5","1"
+"01085","Westfield","MA","42.133642","-72.75029","-5","1"
+"01086","Westfield","MA","42.173428","-72.847964","-5","1"
+"01088","West Hatfield","MA","42.388831","-72.6321","-5","1"
+"01089","West Springfield","MA","42.112793","-72.64066","-5","1"
+"01090","West Springfield","MA","42.170731","-72.604842","-5","1"
+"01092","West Warren","MA","42.210777","-72.23904","-5","1"
+"01093","Whately","MA","42.442673","-72.652511","-5","1"
+"01094","Wheelwright","MA","42.358201","-72.140846","-5","1"
+"01095","Wilbraham","MA","42.12531","-72.44057","-5","1"
+"01096","Williamsburg","MA","42.415236","-72.78271","-5","1"
+"01097","Woronoco","MA","42.161743","-72.845912","-5","1"
+"01098","Worthington","MA","42.399054","-72.93871","-5","1"
+"01101","Springfield","MA","42.170731","-72.604842","-5","1"
+"01102","Springfield","MA","42.170731","-72.604842","-5","1"
+"01103","Springfield","MA","42.103294","-72.59112","-5","1"
+"01104","Springfield","MA","42.130343","-72.57338","-5","1"
+"01105","Springfield","MA","42.096644","-72.5798","-5","1"
+"01106","Longmeadow","MA","42.050395","-72.5712","-5","1"
+"01107","Springfield","MA","42.120193","-72.6061","-5","1"
+"01108","Springfield","MA","42.084094","-72.55523","-5","1"
+"01109","Springfield","MA","42.116277","-72.55031","-5","1"
+"01111","Springfield","MA","42.170731","-72.604842","-5","1"
+"01114","Springfield","MA","42.170731","-72.604842","-5","1"
+"01115","Springfield","MA","42.102894","-72.591633","-5","1"
+"01116","Longmeadow","MA","42.170731","-72.604842","-5","1"
+"01118","Springfield","MA","42.093144","-72.5291","-5","1"
+"01119","Springfield","MA","42.128442","-72.50932","-5","1"
+"01128","Springfield","MA","42.095344","-72.48857","-5","1"
+"01129","Springfield","MA","42.121031","-72.4896","-5","1"
+"01133","Springfield","MA","42.170731","-72.604842","-5","1"
+"01138","Springfield","MA","42.170731","-72.604842","-5","1"
+"01139","Springfield","MA","42.170731","-72.604842","-5","1"
+"01144","Springfield","MA","42.101796","-72.59151","-5","1"
+"01151","Indian Orchard","MA","42.153926","-72.50531","-5","1"
+"01152","Springfield","MA","42.170731","-72.604842","-5","1"
+"01199","Springfield","MA","42.119943","-72.604983","-5","1"
+"01201","Pittsfield","MA","42.45384","-73.254","-5","1"
+"01202","Pittsfield","MA","42.3929","-73.228483","-5","1"
+"01203","Pittsfield","MA","42.3929","-73.228483","-5","1"
+"01220","Adams","MA","42.619727","-73.11842","-5","1"
+"01222","Ashley Falls","MA","42.057496","-73.32177","-5","1"
+"01223","Becket","MA","42.314449","-73.09335","-5","1"
+"01224","Berkshire","MA","42.3929","-73.228483","-5","1"
+"01225","Cheshire","MA","42.551731","-73.1653","-5","1"
+"01226","Dalton","MA","42.476575","-73.11547","-5","1"
+"01227","Dalton","MA","42.516145","-73.092852","-5","1"
+"01229","Glendale","MA","42.279292","-73.343545","-5","1"
+"01230","Great Barrington","MA","42.189715","-73.35249","-5","1"
+"01231","Sheffield","MA","42.153001","-73.298131","-5","1"
+"01235","Hinsdale","MA","42.433661","-73.09278","-5","1"
+"01236","Housatonic","MA","42.266874","-73.36236","-5","1"
+"01237","Lanesboro","MA","42.557346","-73.24364","-5","1"
+"01238","Lee","MA","42.299263","-73.2327","-5","1"
+"01240","Lenox","MA","42.36237","-73.27683","-5","1"
+"01242","Lenox Dale","MA","42.336557","-73.24599","-5","1"
+"01243","Middlefield","MA","42.356088","-73.010448","-5","1"
+"01244","Mill River","MA","42.139104","-73.20312","-5","1"
+"01245","Monterey","MA","42.180659","-73.20849","-5","1"
+"01247","North Adams","MA","42.696064","-73.10145","-5","1"
+"01252","North Egremont","MA","42.198648","-73.446234","-5","1"
+"01253","Otis","MA","42.198403","-73.10205","-5","1"
+"01254","Richmond","MA","42.374711","-73.36336","-5","1"
+"01255","Sandisfield","MA","42.088973","-73.12444","-5","1"
+"01256","Savoy","MA","42.592506","-73.01123","-5","1"
+"01257","Sheffield","MA","42.102694","-73.36591","-5","1"
+"01258","South Egremont","MA","42.103122","-73.45734","-5","1"
+"01259","Southfield","MA","42.0645","-73.24674","-5","1"
+"01260","South Lee","MA","42.286586","-73.313274","-5","1"
+"01262","Stockbridge","MA","42.283216","-73.31423","-5","1"
+"01263","Stockbridge","MA","42.3929","-73.228483","-5","1"
+"01264","Tyringham","MA","42.224905","-73.20394","-5","1"
+"01266","West Stockbridge","MA","42.328535","-73.36407","-5","1"
+"01267","Williamstown","MA","42.689962","-73.22355","-5","1"
+"01270","Windsor","MA","42.443726","-73.116127","-5","1"
+"01301","Greenfield","MA","42.605524","-72.60098","-5","1"
+"01302","Greenfield","MA","42.522178","-72.624164","-5","1"
+"01330","Ashfield","MA","42.521131","-72.81116","-5","1"
+"01331","Athol","MA","42.579931","-72.20836","-5","1"
+"01337","Bernardston","MA","42.678023","-72.55569","-5","1"
+"01338","Buckland","MA","42.569498","-72.802","-5","1"
+"01339","Charlemont","MA","42.626858","-72.87939","-5","1"
+"01340","Colrain","MA","42.673371","-72.73104","-5","1"
+"01341","Conway","MA","42.508313","-72.70403","-5","1"
+"01342","Deerfield","MA","42.542322","-72.6091","-5","1"
+"01343","Drury","MA","42.642666","-72.986231","-5","1"
+"01344","Erving","MA","42.607051","-72.41396","-5","1"
+"01346","Heath","MA","42.669255","-72.80494","-5","1"
+"01347","Lake Pleasant","MA","42.556558","-72.518104","-5","1"
+"01349","Turners Falls","MA","42.5737","-72.50525","-5","1"
+"01350","Monroe Bridge","MA","42.712257","-72.97629","-5","1"
+"01351","Montague","MA","42.534976","-72.52522","-5","1"
+"01354","Northfield","MA","42.522178","-72.624164","-5","1"
+"01355","New Salem","MA","42.485899","-72.33345","-5","1"
+"01360","Northfield","MA","42.682285","-72.45649","-5","1"
+"01364","Orange","MA","42.599614","-72.29263","-5","1"
+"01366","Petersham","MA","42.474718","-72.21226","-5","1"
+"01367","Rowe","MA","42.694883","-72.90962","-5","1"
+"01368","Royalston","MA","42.671012","-72.16999","-5","1"
+"01369","Shattuckville","MA","42.522178","-72.624164","-5","1"
+"01370","Shelburne Falls","MA","42.603447","-72.72754","-5","1"
+"01373","South Deerfield","MA","42.472734","-72.62452","-5","1"
+"01374","Charlemont","MA","42.636459","-72.798742","-5","1"
+"01375","Sunderland","MA","42.449978","-72.56302","-5","1"
+"01376","Turners Falls","MA","42.609425","-72.54438","-5","1"
+"01378","Warwick","MA","42.667152","-72.32729","-5","1"
+"01379","Wendell","MA","42.547274","-72.41724","-5","1"
+"01380","Wendell Depot","MA","42.594455","-72.36314","-5","1"
+"01393","Whately","MA","42.459814","-72.593626","-5","1"
+"01420","Fitchburg","MA","42.578689","-71.80338","-5","1"
+"01427","Westborough","MA","42.286575","-71.585753","-5","1"
+"01430","Ashburnham","MA","42.658768","-71.93287","-5","1"
+"01431","Ashby","MA","42.672005","-71.8137","-5","1"
+"01432","Ayer","MA","42.549821","-71.59136","-5","1"
+"01436","Baldwinville","MA","42.608903","-72.08021","-5","1"
+"01438","East Templeton","MA","42.563367","-72.03498","-5","1"
+"01440","Gardner","MA","42.575355","-71.99183","-5","1"
+"01441","Gardner","MA","42.364807","-71.896868","-5","1"
+"01450","Groton","MA","42.609887","-71.55722","-5","1"
+"01451","Harvard","MA","42.505928","-71.5888","-5","1"
+"01452","Hubbardston","MA","42.477515","-71.99654","-5","1"
+"01453","Leominster","MA","42.526523","-71.75358","-5","1"
+"01460","Littleton","MA","42.540052","-71.49085","-5","1"
+"01462","Lunenburg","MA","42.582839","-71.72051","-5","1"
+"01463","Pepperell","MA","42.665686","-71.5929","-5","1"
+"01464","Shirley","MA","42.559289","-71.64555","-5","1"
+"01467","Still River","MA","42.488666","-71.62412","-5","1"
+"01468","Templeton","MA","42.557796","-72.06824","-5","1"
+"01469","Townsend","MA","42.658738","-71.69204","-5","1"
+"01470","Groton","MA","42.446396","-71.459405","-5","1"
+"01471","Groton","MA","42.446396","-71.459405","-5","1"
+"01472","West Groton","MA","42.446396","-71.459405","-5","1"
+"01473","Westminster","MA","42.544622","-71.9021","-5","1"
+"01474","West Townsend","MA","42.669408","-71.74578","-5","1"
+"01475","Winchendon","MA","42.675441","-72.0467","-5","1"
+"01477","Winchendon Springs","MA","42.364807","-71.896868","-5","1"
+"01501","Auburn","MA","42.20361","-71.83843","-5","1"
+"01503","Berlin","MA","42.380562","-71.62665","-5","1"
+"01504","Blackstone","MA","42.028147","-71.52999","-5","1"
+"01505","Boylston","MA","42.338392","-71.73026","-5","1"
+"01506","Brookfield","MA","42.200374","-72.09787","-5","1"
+"01507","Charlton","MA","42.135142","-71.96961","-5","1"
+"01508","Charlton City","MA","42.109748","-72.079455","-5","1"
+"01509","Charlton Depot","MA","42.364807","-71.896868","-5","1"
+"01510","Clinton","MA","42.418836","-71.68482","-5","1"
+"01515","East Brookfield","MA","42.212777","-72.05311","-5","1"
+"01516","Douglas","MA","42.061437","-71.72887","-5","1"
+"01517","East Princeton","MA","42.364807","-71.896868","-5","1"
+"01518","Fiskdale","MA","42.12515","-72.12393","-5","1"
+"01519","Grafton","MA","42.201674","-71.68771","-5","1"
+"01520","Holden","MA","42.338962","-71.84434","-5","1"
+"01521","Holland","MA","42.054676","-72.16137","-5","1"
+"01522","Jefferson","MA","42.369658","-71.87418","-5","1"
+"01523","Lancaster","MA","42.473131","-71.67946","-5","1"
+"01524","Leicester","MA","42.238942","-71.91908","-5","1"
+"01525","Linwood","MA","42.364807","-71.896868","-5","1"
+"01526","Manchaug","MA","42.364807","-71.896868","-5","1"
+"01527","Millbury","MA","42.196144","-71.76272","-5","1"
+"01529","Millville","MA","42.036396","-71.57798","-5","1"
+"01531","New Braintree","MA","42.317121","-72.12248","-5","1"
+"01532","Northborough","MA","42.321917","-71.64692","-5","1"
+"01534","Northbridge","MA","42.140741","-71.64376","-5","1"
+"01535","North Brookfield","MA","42.267274","-72.07823","-5","1"
+"01536","North Grafton","MA","42.231444","-71.70523","-5","1"
+"01537","North Oxford","MA","42.170846","-71.88989","-5","1"
+"01538","North Uxbridge","MA","42.364807","-71.896868","-5","1"
+"01540","Oxford","MA","42.117527","-71.8657","-5","1"
+"01541","Princeton","MA","42.451569","-71.882","-5","1"
+"01542","Rochdale","MA","42.194793","-71.90651","-5","1"
+"01543","Rutland","MA","42.380877","-71.96427","-5","1"
+"01545","Shrewsbury","MA","42.286643","-71.72502","-5","1"
+"01546","Shrewsbury","MA","42.364807","-71.896868","-5","1"
+"01550","Southbridge","MA","42.070827","-72.03533","-5","1"
+"01560","South Grafton","MA","42.177462","-71.69382","-5","1"
+"01561","South Lancaster","MA","42.443539","-71.686137","-5","1"
+"01562","Spencer","MA","42.247212","-71.99227","-5","1"
+"01564","Sterling","MA","42.436875","-71.77333","-5","1"
+"01566","Sturbridge","MA","42.104581","-72.08584","-5","1"
+"01568","Upton","MA","42.17382","-71.60971","-5","1"
+"01569","Uxbridge","MA","42.064978","-71.62992","-5","1"
+"01570","Webster","MA","42.047728","-71.86108","-5","1"
+"01571","Dudley","MA","42.049864","-71.9173","-5","1"
+"01580","Westborough","MA","42.364807","-71.896868","-5","1"
+"01581","Westborough","MA","42.269845","-71.61408","-5","1"
+"01582","Westborough","MA","42.364807","-71.896868","-5","1"
+"01583","West Boylston","MA","42.359842","-71.787","-5","1"
+"01585","West Brookfield","MA","42.242965","-72.16734","-5","1"
+"01586","West Millbury","MA","42.364807","-71.896868","-5","1"
+"01588","Whitinsville","MA","42.114195","-71.67225","-5","1"
+"01590","Sutton","MA","42.131028","-71.75121","-5","1"
+"01601","Worcester","MA","42.265275","-71.879415","-5","1"
+"01602","Worcester","MA","42.272359","-71.84482","-5","1"
+"01603","Worcester","MA","42.240526","-71.83776","-5","1"
+"01604","Worcester","MA","42.255393","-71.77459","-5","1"
+"01605","Worcester","MA","42.286543","-71.78846","-5","1"
+"01606","Worcester","MA","42.311342","-71.79531","-5","1"
+"01607","Worcester","MA","42.229543","-71.79501","-5","1"
+"01608","Worcester","MA","42.261343","-71.80173","-5","1"
+"01609","Worcester","MA","42.271743","-71.81348","-5","1"
+"01610","Worcester","MA","42.248493","-71.80793","-5","1"
+"01611","Cherry Valley","MA","42.238449","-71.87139","-5","1"
+"01612","Paxton","MA","42.307591","-71.91929","-5","1"
+"01613","Worcester","MA","42.293316","-71.801971","-5","1"
+"01614","Worcester","MA","42.364807","-71.896868","-5","1"
+"01615","Worcester","MA","42.364807","-71.896868","-5","1"
+"01634","Tolland","MA","42.069484","-72.999433","-5","1"
+"01653","Worcester","MA","42.364807","-71.896868","-5","1"
+"01654","Worcester","MA","42.364807","-71.896868","-5","1"
+"01655","Worcester","MA","42.364807","-71.896868","-5","1"
+"01701","Framingham","MA","42.318695","-71.42344","-5","1"
+"01702","Framingham","MA","42.283995","-71.42161","-5","1"
+"01703","Framingham","MA","42.446396","-71.459405","-5","1"
+"01704","Framingham","MA","42.446396","-71.459405","-5","1"
+"01705","Framingham","MA","42.446396","-71.459405","-5","1"
+"01718","Village Of Nagog Woods","MA","42.519739","-71.42721","-5","1"
+"01719","Boxborough","MA","42.486259","-71.51244","-5","1"
+"01720","Acton","MA","42.477142","-71.4422","-5","1"
+"01721","Ashland","MA","42.257956","-71.45886","-5","1"
+"01730","Bedford","MA","42.496679","-71.27504","-5","1"
+"01731","Hanscom AFB","MA","42.459085","-71.27556","-5","1"
+"01740","Bolton","MA","42.437086","-71.61266","-5","1"
+"01741","Carlisle","MA","42.5286","-71.35084","-5","1"
+"01742","Concord","MA","42.457201","-71.37478","-5","1"
+"01745","Fayville","MA","42.295544","-71.50468","-5","1"
+"01746","Holliston","MA","42.196065","-71.43797","-5","1"
+"01747","Hopedale","MA","42.125536","-71.53662","-5","1"
+"01748","Hopkinton","MA","42.220447","-71.53418","-5","1"
+"01749","Hudson","MA","42.389813","-71.55791","-5","1"
+"01750","Natick","MA","42.273817","-71.378157","-5","1"
+"01752","Marlborough","MA","42.350909","-71.54753","-5","1"
+"01754","Maynard","MA","42.430781","-71.45594","-5","1"
+"01756","Mendon","MA","42.092006","-71.54474","-5","1"
+"01757","Milford","MA","42.149176","-71.52149","-5","1"
+"01760","Natick","MA","42.290763","-71.35368","-5","1"
+"01770","Sherborn","MA","42.231025","-71.37202","-5","1"
+"01772","Southborough","MA","42.297643","-71.53369","-5","1"
+"01773","Lincoln","MA","42.425537","-71.30316","-5","1"
+"01775","Stow","MA","42.423882","-71.51086","-5","1"
+"01776","Sudbury","MA","42.38532","-71.42989","-5","1"
+"01778","Wayland","MA","42.345583","-71.35643","-5","1"
+"01784","Woodville","MA","42.446396","-71.459405","-5","1"
+"01801","Woburn","MA","42.484545","-71.15206","-5","1"
+"01803","Burlington","MA","42.506362","-71.20008","-5","1"
+"01805","Burlington","MA","42.446396","-71.459405","-5","1"
+"01806","Woburn","MA","42.446396","-71.459405","-5","1"
+"01807","Woburn","MA","42.446396","-71.459405","-5","1"
+"01808","Woburn","MA","42.446396","-71.459405","-5","1"
+"01810","Andover","MA","42.646942","-71.1513","-5","1"
+"01812","Andover","MA","42.647191","-71.184202","-5","1"
+"01813","Woburn","MA","42.446396","-71.459405","-5","1"
+"01815","Woburn","MA","42.446396","-71.459405","-5","1"
+"01820","Pinehurst","MA","42.540779","-71.238175","-5","1"
+"01821","Billerica","MA","42.54805","-71.25054","-5","1"
+"01822","Billerica","MA","42.446396","-71.459405","-5","1"
+"01823","Haverhill","MA","42.800429","-71.11087","-5","1"
+"01824","Chelmsford","MA","42.595491","-71.3544","-5","1"
+"01826","Dracut","MA","42.677772","-71.316","-5","1"
+"01827","Dunstable","MA","42.671356","-71.50292","-5","1"
+"01830","Haverhill","MA","42.78519","-71.07011","-5","1"
+"01831","Haverhill","MA","42.771095","-71.122054","-5","1"
+"01832","Haverhill","MA","42.781357","-71.11023","-5","1"
+"01833","Georgetown","MA","42.729437","-70.98291","-5","1"
+"01834","Groveland","MA","42.750691","-71.02487","-5","1"
+"01835","Haverhill","MA","42.757767","-71.08518","-5","1"
+"01840","Lawrence","MA","42.706941","-71.16181","-5","1"
+"01841","Lawrence","MA","42.71159","-71.16667","-5","1"
+"01842","Lawrence","MA","42.635443","-70.879123","-5","1"
+"01843","Lawrence","MA","42.691091","-71.16078","-5","1"
+"01844","Methuen","MA","42.73004","-71.17935","-5","1"
+"01845","North Andover","MA","42.683841","-71.11171","-5","1"
+"01850","Lowell","MA","42.655791","-71.30504","-5","1"
+"01851","Lowell","MA","42.630915","-71.33238","-5","1"
+"01852","Lowell","MA","42.634112","-71.29849","-5","1"
+"01853","Lowell","MA","42.446396","-71.459405","-5","1"
+"01854","Lowell","MA","42.649758","-71.33348","-5","1"
+"01856","Lowell","MA","42.641779","-71.303488","-5","1"
+"01860","Merrimac","MA","42.834246","-71.00207","-5","1"
+"01862","North Billerica","MA","42.573592","-71.2911","-5","1"
+"01863","North Chelmsford","MA","42.634199","-71.39322","-5","1"
+"01864","North Reading","MA","42.583436","-71.0982","-5","1"
+"01865","Nutting Lake","MA","42.446396","-71.459405","-5","1"
+"01866","Pinehurst","MA","42.446396","-71.459405","-5","1"
+"01867","Reading","MA","42.52585","-71.10993","-5","1"
+"01876","Tewksbury","MA","42.601684","-71.22071","-5","1"
+"01879","Tyngsboro","MA","42.671589","-71.41694","-5","1"
+"01880","Wakefield","MA","42.501345","-71.07132","-5","1"
+"01885","West Boxford","MA","42.635443","-70.879123","-5","1"
+"01886","Westford","MA","42.592086","-71.43754","-5","1"
+"01887","Wilmington","MA","42.558576","-71.17031","-5","1"
+"01888","Woburn","MA","42.446396","-71.459405","-5","1"
+"01889","North Reading","MA","42.571633","-71.109646","-5","1"
+"01890","Winchester","MA","42.451945","-71.14276","-5","1"
+"01899","Andover","MA","42.635443","-70.879123","-5","1"
+"01901","Lynn","MA","42.461246","-70.946743","-5","1"
+"01902","Lynn","MA","42.469946","-70.94113","-5","1"
+"01903","Lynn","MA","42.635443","-70.879123","-5","1"
+"01904","Lynn","MA","42.490421","-70.96579","-5","1"
+"01905","Lynn","MA","42.464879","-70.97411","-5","1"
+"01906","Saugus","MA","42.462796","-71.0098","-5","1"
+"01907","Swampscott","MA","42.474409","-70.90588","-5","1"
+"01908","Nahant","MA","42.427096","-70.92809","-5","1"
+"01910","Lynn","MA","42.454796","-70.974694","-5","1"
+"01913","Amesbury","MA","42.854423","-70.93547","-5","1"
+"01915","Beverly","MA","42.560995","-70.8757","-5","1"
+"01921","Boxford","MA","42.677869","-71.00844","-5","1"
+"01922","Byfield","MA","42.76087","-70.92648","-5","1"
+"01923","Danvers","MA","42.569756","-70.94322","-5","1"
+"01929","Essex","MA","42.631753","-70.77925","-5","1"
+"01930","Gloucester","MA","42.624015","-70.67552","-5","1"
+"01931","Gloucester","MA","42.635443","-70.879123","-5","1"
+"01936","Hamilton","MA","42.635443","-70.879123","-5","1"
+"01937","Hathorne","MA","42.635443","-70.879123","-5","1"
+"01938","Ipswich","MA","42.682965","-70.84007","-5","1"
+"01940","Lynnfield","MA","42.527895","-71.02834","-5","1"
+"01944","Manchester","MA","42.580033","-70.76462","-5","1"
+"01945","Marblehead","MA","42.497146","-70.86323","-5","1"
+"01947","Salem","MA","42.642845","-70.873647","-5","1"
+"01949","Middleton","MA","42.602278","-71.01356","-5","1"
+"01950","Newburyport","MA","42.809891","-70.86363","-5","1"
+"01951","Newbury","MA","42.780141","-70.86866","-5","1"
+"01952","Salisbury","MA","42.85048","-70.86153","-5","1"
+"01960","Peabody","MA","42.534045","-70.96146","-5","1"
+"01961","Peabody","MA","42.635443","-70.879123","-5","1"
+"01965","Prides Crossing","MA","42.558113","-70.825743","-5","1"
+"01966","Rockport","MA","42.659936","-70.61727","-5","1"
+"01969","Rowley","MA","42.716708","-70.90899","-5","1"
+"01970","Salem","MA","42.516845","-70.8985","-5","1"
+"01971","Salem","MA","42.635443","-70.879123","-5","1"
+"01982","South Hamilton","MA","42.616643","-70.86513","-5","1"
+"01983","Topsfield","MA","42.642471","-70.94424","-5","1"
+"01984","Wenham","MA","42.600518","-70.87618","-5","1"
+"01985","West Newbury","MA","42.790736","-70.97286","-5","1"
+"02018","Accord","MA","41.970474","-70.701357","-5","1"
+"02019","Bellingham","MA","42.075122","-71.47953","-5","1"
+"02020","Brant Rock","MA","42.081825","-70.643868","-5","1"
+"02021","Canton","MA","42.166776","-71.1343","-5","1"
+"02025","Cohasset","MA","42.241908","-70.81223","-5","1"
+"02026","Dedham","MA","42.244609","-71.16553","-5","1"
+"02027","Dedham","MA","42.180048","-71.08923","-5","1"
+"02029","Providence","RI","41.817398","-71.453674","-5","1"
+"02030","Dover","MA","42.23888","-71.28241","-5","1"
+"02031","East Mansfield","MA","41.998799","-71.200894","-5","1"
+"02032","East Walpole","MA","42.153912","-71.21362","-5","1"
+"02035","Foxboro","MA","42.061427","-71.24232","-5","1"
+"02038","Franklin","MA","42.089104","-71.4069","-5","1"
+"02040","Greenbush","MA","41.970474","-70.701357","-5","1"
+"02041","Green Harbor","MA","42.069642","-70.649075","-5","1"
+"02043","Hingham","MA","42.225708","-70.88764","-5","1"
+"02044","Hingham","MA","41.970474","-70.701357","-5","1"
+"02045","Hull","MA","42.286347","-70.87663","-5","1"
+"02047","Humarock","MA","42.142836","-70.69353","-5","1"
+"02048","Mansfield","MA","42.019982","-71.2191","-5","1"
+"02050","Marshfield","MA","42.109763","-70.69172","-5","1"
+"02051","Marshfield Hills","MA","42.151202","-70.734146","-5","1"
+"02052","Medfield","MA","42.185571","-71.30476","-5","1"
+"02053","Medway","MA","42.151526","-71.42315","-5","1"
+"02054","Millis","MA","42.166398","-71.36178","-5","1"
+"02055","Minot","MA","41.970474","-70.701357","-5","1"
+"02056","Norfolk","MA","42.111836","-71.32855","-5","1"
+"02059","North Marshfield","MA","41.970474","-70.701357","-5","1"
+"02060","North Scituate","MA","41.970474","-70.701357","-5","1"
+"02061","Norwell","MA","42.15243","-70.8205","-5","1"
+"02062","Norwood","MA","42.185974","-71.20166","-5","1"
+"02065","Ocean Bluff","MA","42.097219","-70.651567","-5","1"
+"02066","Scituate","MA","42.205038","-70.7513","-5","1"
+"02067","Sharon","MA","42.113749","-71.17923","-5","1"
+"02070","Sheldonville","MA","42.180048","-71.08923","-5","1"
+"02071","South Walpole","MA","42.101406","-71.27239","-5","1"
+"02072","Stoughton","MA","42.125432","-71.10627","-5","1"
+"02081","Walpole","MA","42.145237","-71.25375","-5","1"
+"02085","Foxborough","MA","42.075995","-71.286055","-5","1"
+"02090","Westwood","MA","42.212949","-71.20735","-5","1"
+"02093","Wrentham","MA","42.0597","-71.34617","-5","1"
+"02101","Boston","MA","42.370567","-71.026964","-5","1"
+"02102","Boston","MA","42.338947","-70.919635","-5","1"
+"02103","Boston","MA","42.338947","-70.919635","-5","1"
+"02104","Boston","MA","42.338947","-70.919635","-5","1"
+"02105","Boston","MA","42.338947","-70.919635","-5","1"
+"02106","Boston","MA","42.354318","-71.073449","-5","1"
+"02107","Boston","MA","42.338947","-70.919635","-5","1"
+"02108","Boston","MA","42.357903","-71.06408","-5","1"
+"02109","Boston","MA","42.361477","-71.05417","-5","1"
+"02110","Boston","MA","42.356532","-71.05365","-5","1"
+"02111","Boston","MA","42.349838","-71.06101","-5","1"
+"02112","Boston","MA","42.338947","-70.919635","-5","1"
+"02113","Boston","MA","42.365028","-71.05636","-5","1"
+"02114","Boston","MA","42.361792","-71.06774","-5","1"
+"02115","Boston","MA","42.34308","-71.09268","-5","1"
+"02116","Boston","MA","42.349622","-71.07372","-5","1"
+"02117","Boston","MA","42.338947","-70.919635","-5","1"
+"02118","Boston","MA","42.338724","-71.07276","-5","1"
+"02119","Boston","MA","42.324511","-71.08455","-5","1"
+"02120","Boston","MA","42.332099","-71.09651","-5","1"
+"02121","Boston","MA","42.307448","-71.08127","-5","1"
+"02122","Boston","MA","42.296298","-71.05454","-5","1"
+"02123","Boston","MA","42.338947","-70.919635","-5","1"
+"02124","Boston","MA","42.28713","-71.07156","-5","1"
+"02125","Boston","MA","42.316852","-71.05811","-5","1"
+"02126","Mattapan","MA","42.272098","-71.09426","-5","1"
+"02127","Boston","MA","42.33499","-71.04562","-5","1"
+"02128","Boston","MA","42.378297","-71.0255","-5","1"
+"02129","Charlestown","MA","42.378619","-71.06495","-5","1"
+"02130","Jamaica Plain","MA","42.309998","-71.11171","-5","1"
+"02131","Roslindale","MA","42.284678","-71.13052","-5","1"
+"02132","West Roxbury","MA","42.279432","-71.1598","-5","1"
+"02133","Boston","MA","42.338947","-70.919635","-5","1"
+"02134","Allston","MA","42.355147","-71.13164","-5","1"
+"02135","Brighton","MA","42.348418","-71.15349","-5","1"
+"02136","Hyde Park","MA","42.252198","-71.12593","-5","1"
+"02137","Readville","MA","42.338947","-70.919635","-5","1"
+"02138","Cambridge","MA","42.379146","-71.12803","-5","1"
+"02139","Cambridge","MA","42.364347","-71.10431","-5","1"
+"02140","Cambridge","MA","42.393327","-71.12837","-5","1"
+"02141","Cambridge","MA","42.370519","-71.08443","-5","1"
+"02142","Cambridge","MA","42.362297","-71.08412","-5","1"
+"02143","Somerville","MA","42.381929","-71.09908","-5","1"
+"02144","Somerville","MA","42.399546","-71.12165","-5","1"
+"02145","Somerville","MA","42.390846","-71.09225","-5","1"
+"02146","Brookline","MA","42.308198","-71.088745","-5","1"
+"02147","Brookline Village","MA","42.180048","-71.08923","-5","1"
+"02148","Malden","MA","42.428549","-71.06059","-5","1"
+"02149","Everett","MA","42.409916","-71.0522","-5","1"
+"02150","Chelsea","MA","42.396382","-71.03352","-5","1"
+"02151","Revere","MA","42.416247","-71.00525","-5","1"
+"02152","Winthrop","MA","42.373047","-70.97803","-5","1"
+"02153","Medford","MA","42.446396","-71.459405","-5","1"
+"02154","Waltham","MA","42.388938","-71.2398","-5","1"
+"02155","Medford","MA","42.419846","-71.10942","-5","1"
+"02156","West Medford","MA","42.446396","-71.459405","-5","1"
+"02157","Babson Park","MA","42.173933","-71.185494","-5","1"
+"02158","Newton","MA","42.353696","-71.188149","-5","1"
+"02159","Newton","MA","42.316097","-71.191248","-5","1"
+"02160","Newton","MA","42.446396","-71.459405","-5","1"
+"02161","Newton","MA","42.446396","-71.459405","-5","1"
+"02162","Newton","MA","42.331896","-71.25405","-5","1"
+"02163","Boston","MA","42.367946","-71.12056","-5","1"
+"02164","Newton","MA","42.446396","-71.459405","-5","1"
+"02165","Newton","MA","42.446396","-71.459405","-5","1"
+"02166","Auburndale","MA","42.346146","-71.243057","-5","1"
+"02167","Chestnut Hill","MA","42.320797","-71.169847","-5","1"
+"02168","Waban","MA","42.446396","-71.459405","-5","1"
+"02169","Quincy","MA","42.250739","-70.99593","-5","1"
+"02170","Quincy","MA","42.267049","-71.01834","-5","1"
+"02171","Quincy","MA","42.284498","-71.02316","-5","1"
+"02172","Watertown","MA","42.372596","-71.177998","-5","1"
+"02173","Lexington","MA","42.446396","-71.459405","-5","1"
+"02174","Arlington","MA","42.417695","-71.167083","-5","1"
+"02175","Arlington Heights","MA","42.446396","-71.459405","-5","1"
+"02176","Melrose","MA","42.459045","-71.06233","-5","1"
+"02177","Melrose","MA","42.446396","-71.459405","-5","1"
+"02178","Belmont","MA","42.446396","-71.459405","-5","1"
+"02179","Waverley","MA","42.446396","-71.459405","-5","1"
+"02180","Stoneham","MA","42.480145","-71.09835","-5","1"
+"02181","Wellesley","MA","42.300596","-71.27875","-5","1"
+"02184","Braintree","MA","42.209555","-70.99968","-5","1"
+"02185","Braintree","MA","42.180048","-71.08923","-5","1"
+"02186","Milton","MA","42.253074","-71.07496","-5","1"
+"02187","Milton Village","MA","42.180048","-71.08923","-5","1"
+"02188","Weymouth","MA","42.212866","-70.95872","-5","1"
+"02189","Weymouth","MA","42.2112","-70.93111","-5","1"
+"02190","Weymouth","MA","42.1711","-70.94597","-5","1"
+"02191","Weymouth","MA","42.242749","-70.94434","-5","1"
+"02192","Needham","MA","42.180048","-71.08923","-5","1"
+"02193","Weston","MA","42.446396","-71.459405","-5","1"
+"02194","Needham","MA","42.292547","-71.225799","-5","1"
+"02195","Newton","MA","42.446396","-71.459405","-5","1"
+"02196","Boston","MA","42.338947","-70.919635","-5","1"
+"02199","Boston","MA","42.34713","-71.08234","-5","1"
+"02201","Boston","MA","42.338947","-70.919635","-5","1"
+"02202","Boston","MA","42.361094","-71.061814","-5","1"
+"02203","Boston","MA","42.361485","-71.060364","-5","1"
+"02204","Boston","MA","42.338947","-70.919635","-5","1"
+"02205","Boston","MA","42.350334","-71.053877","-5","1"
+"02206","Boston","MA","42.338947","-70.919635","-5","1"
+"02207","Boston","MA","42.338947","-70.919635","-5","1"
+"02208","Boston","MA","42.338947","-70.919635","-5","1"
+"02209","Boston","MA","42.338947","-70.919635","-5","1"
+"02210","Boston","MA","42.347974","-71.04463","-5","1"
+"02211","Boston","MA","42.338947","-70.919635","-5","1"
+"02212","Boston","MA","42.446396","-71.459405","-5","1"
+"02215","Boston","MA","42.346997","-71.10215","-5","1"
+"02216","Boston","MA","42.338947","-70.919635","-5","1"
+"02217","Boston","MA","42.338947","-70.919635","-5","1"
+"02222","Boston","MA","42.367797","-71.06282","-5","1"
+"02238","Cambridge","MA","42.446396","-71.459405","-5","1"
+"02239","Cambridge","MA","42.446396","-71.459405","-5","1"
+"02241","Boston","MA","42.338947","-70.919635","-5","1"
+"02254","Waltham","MA","42.446396","-71.459405","-5","1"
+"02258","Newton","MA","42.446396","-71.459405","-5","1"
+"02266","Boston","MA","42.338947","-70.919635","-5","1"
+"02269","Quincy","MA","42.180048","-71.08923","-5","1"
+"02272","Watertown","MA","42.446396","-71.459405","-5","1"
+"02277","Watertown","MA","42.446396","-71.459405","-5","1"
+"02283","Boston","MA","42.338947","-70.919635","-5","1"
+"02284","Boston","MA","42.338947","-70.919635","-5","1"
+"02293","Boston","MA","42.338947","-70.919635","-5","1"
+"02295","Boston","MA","42.338947","-70.919635","-5","1"
+"02297","Boston","MA","42.338947","-70.919635","-5","1"
+"02301","Brockton","MA","42.0794","-71.03441","-5","1"
+"02302","Brockton","MA","42.08715","-71.00222","-5","1"
+"02303","Brockton","MA","41.970474","-70.701357","-5","1"
+"02304","Brockton","MA","41.970474","-70.701357","-5","1"
+"02305","Brockton","MA","41.970474","-70.701357","-5","1"
+"02322","Avon","MA","42.121932","-71.04522","-5","1"
+"02324","Bridgewater","MA","41.979501","-70.97215","-5","1"
+"02325","Bridgewater","MA","41.98725","-70.972786","-5","1"
+"02327","Bryantville","MA","42.040708","-70.827245","-5","1"
+"02330","Carver","MA","41.873697","-70.7656","-5","1"
+"02331","Duxbury","MA","41.970474","-70.701357","-5","1"
+"02332","Duxbury","MA","42.031371","-70.70105","-5","1"
+"02333","East Bridgewater","MA","42.029083","-70.95227","-5","1"
+"02334","Easton","MA","42.023528","-71.132397","-5","1"
+"02337","Elmwood","MA","42.022225","-70.931588","-5","1"
+"02338","Halifax","MA","41.999851","-70.85395","-5","1"
+"02339","Hanover","MA","42.12867","-70.85913","-5","1"
+"02341","Hanson","MA","42.059434","-70.86205","-5","1"
+"02343","Holbrook","MA","42.148351","-71.01037","-5","1"
+"02344","Middleboro","MA","41.970474","-70.701357","-5","1"
+"02345","Manomet","MA","41.888198","-70.581029","-5","1"
+"02346","Middleboro","MA","41.889582","-70.89406","-5","1"
+"02347","Lakeville","MA","41.835094","-70.95973","-5","1"
+"02348","Middleboro","MA","41.970474","-70.701357","-5","1"
+"02349","Middleboro","MA","41.970474","-70.701357","-5","1"
+"02350","Monponsett","MA","42.018525","-70.847486","-5","1"
+"02351","Abington","MA","42.119534","-70.94787","-5","1"
+"02355","North Carver","MA","41.916918","-70.801331","-5","1"
+"02356","North Easton","MA","42.058507","-71.11309","-5","1"
+"02357","North Easton","MA","42.064499","-71.087091","-5","1"
+"02358","North Pembroke","MA","41.805219","-70.62642","-5","1"
+"02359","Pembroke","MA","42.065554","-70.80426","-5","1"
+"02360","Plymouth","MA","41.894676","-70.61999","-5","1"
+"02361","Plymouth","MA","41.970474","-70.701357","-5","1"
+"02362","Plymouth","MA","41.970474","-70.701357","-5","1"
+"02363","Plymouth","MA","41.959094","-70.706774","-5","1"
+"02364","Kingston","MA","41.993102","-70.73827","-5","1"
+"02366","South Carver","MA","41.854063","-70.66088","-5","1"
+"02367","Plympton","MA","41.968987","-70.80452","-5","1"
+"02368","Randolph","MA","42.173417","-71.04912","-5","1"
+"02369","Dennis Port","MA","41.662531","-70.14021","-5","1"
+"02370","Rockland","MA","42.129513","-70.91189","-5","1"
+"02375","South Easton","MA","42.029749","-71.10191","-5","1"
+"02379","West Bridgewater","MA","42.02195","-71.01878","-5","1"
+"02381","White Horse Beach","MA","41.931602","-70.561051","-5","1"
+"02382","Whitman","MA","42.08235","-70.93734","-5","1"
+"02401","Brockton","MA","42.079399","-71.03459","-5","1"
+"02402","Brockton","MA","42.0863","-70.999339","-5","1"
+"02403","Brockton","MA","41.970474","-70.701357","-5","1"
+"02404","Brockton","MA","41.970474","-70.701357","-5","1"
+"02405","Brockton","MA","41.970474","-70.701357","-5","1"
+"02407","Scituate","MA","42.136086","-70.688251","-5","1"
+"02420","Lexington","MA","42.452895","-71.21619","-5","1"
+"02421","Lexington","MA","42.439295","-71.23553","-5","1"
+"02445","Brookline","MA","42.324397","-71.13933","-5","1"
+"02446","Brookline","MA","42.344747","-71.12141","-5","1"
+"02447","Brookline Village","MA","42.180048","-71.08923","-5","1"
+"02451","Waltham","MA","42.393029","-71.24771","-5","1"
+"02452","Waltham","MA","42.392496","-71.22153","-5","1"
+"02453","Waltham","MA","42.370446","-71.23563","-5","1"
+"02454","Waltham","MA","42.356719","-71.250479","-5","1"
+"02456","New Town","MA","42.446396","-71.459405","-5","1"
+"02457","Babson Park","MA","42.180048","-71.08923","-5","1"
+"02458","Newton","MA","42.354727","-71.18809","-5","1"
+"02459","Newton Center","MA","42.321197","-71.193","-5","1"
+"02460","Newtonville","MA","42.352996","-71.20907","-5","1"
+"02461","Newton Highlands","MA","42.31883","-71.20822","-5","1"
+"02462","Newton Lower Falls","MA","42.331646","-71.25761","-5","1"
+"02464","Newton Upper Falls","MA","42.311997","-71.22046","-5","1"
+"02465","West Newton","MA","42.351046","-71.22677","-5","1"
+"02466","Auburndale","MA","42.345833","-71.24735","-5","1"
+"02467","Chestnut Hill","MA","42.321997","-71.17314","-5","1"
+"02468","Waban","MA","42.325247","-71.2319","-5","1"
+"02471","Watertown","MA","42.446396","-71.459405","-5","1"
+"02472","Watertown","MA","42.371296","-71.18196","-5","1"
+"02474","Arlington","MA","42.419496","-71.15635","-5","1"
+"02475","Arlington Heights","MA","42.446396","-71.459405","-5","1"
+"02476","Arlington","MA","42.416745","-71.17761","-5","1"
+"02477","Watertown","MA","42.446396","-71.459405","-5","1"
+"02478","Belmont","MA","42.391546","-71.17471","-5","1"
+"02479","Waverley","MA","42.446396","-71.459405","-5","1"
+"02481","Wellesley Hills","MA","42.313329","-71.27649","-5","1"
+"02482","Wellesley","MA","42.300096","-71.30336","-5","1"
+"02492","Needham","MA","42.278247","-71.23388","-5","1"
+"02493","Weston","MA","42.358663","-71.28831","-5","1"
+"02494","Needham","MA","42.29813","-71.23154","-5","1"
+"02495","Nonantum","MA","42.446396","-71.459405","-5","1"
+"02532","Buzzards Bay","MA","41.751841","-70.59764","-5","1"
+"02534","Cataumet","MA","41.66566","-70.616","-5","1"
+"02535","Chilmark","MA","41.345578","-70.75145","-5","1"
+"02536","East Falmouth","MA","41.578992","-70.5614","-5","1"
+"02537","East Sandwich","MA","41.733837","-70.43754","-5","1"
+"02538","East Wareham","MA","41.782915","-70.64881","-5","1"
+"02539","Edgartown","MA","41.380479","-70.52453","-5","1"
+"02540","Falmouth","MA","41.56105","-70.61968","-5","1"
+"02541","Falmouth","MA","41.799312","-70.308662","-5","1"
+"02542","Buzzards Bay","MA","41.665605","-70.52456","-5","1"
+"02543","Woods Hole","MA","41.526791","-70.66505","-5","1"
+"02549","Mashpee","MA","41.621779","-70.504349","-5","1"
+"02551","Oak Bluffs","MA","41.453321","-70.558023","-5","1"
+"02552","Menemsha","MA","41.379836","-70.643092","-5","1"
+"02553","Monument Beach","MA","41.67336","-70.608047","-5","1"
+"02554","Nantucket","MA","41.276758","-70.09089","-5","1"
+"02556","North Falmouth","MA","41.6403","-70.63036","-5","1"
+"02557","Oak Bluffs","MA","41.417376","-70.560032","-5","1"
+"02558","Onset","MA","41.746424","-70.65956","-5","1"
+"02559","Pocasset","MA","41.694132","-70.61706","-5","1"
+"02561","Sagamore","MA","41.770254","-70.533664","-5","1"
+"02562","Sagamore Beach","MA","41.793263","-70.519584","-5","1"
+"02563","Sandwich","MA","41.735645","-70.48866","-5","1"
+"02564","Siasconset","MA","41.273949","-70.015545","-5","1"
+"02565","Silver Beach","MA","41.799312","-70.308662","-5","1"
+"02567","Sagamore","MA","41.79197","-70.530852","-5","1"
+"02568","Vineyard Haven","MA","41.451263","-70.60872","-5","1"
+"02571","Wareham","MA","41.751554","-70.71059","-5","1"
+"02573","Vineyard Haven","MA","41.379836","-70.643092","-5","1"
+"02574","West Falmouth","MA","41.603946","-70.638189","-5","1"
+"02575","West Tisbury","MA","41.378807","-70.66376","-5","1"
+"02576","West Wareham","MA","41.776042","-70.75783","-5","1"
+"02584","Nantucket","MA","41.277794","-70.046019","-5","1"
+"02595","West Tisbury","MA","41.381585","-70.66351","-5","1"
+"02601","Hyannis","MA","41.654741","-70.2895","-5","1"
+"02625","Barnstable Town","MA","41.640528","-70.433279","-5","1"
+"02630","Barnstable","MA","41.700327","-70.29568","-5","1"
+"02631","Brewster","MA","41.746647","-70.07773","-5","1"
+"02632","Centerville","MA","41.658718","-70.34658","-5","1"
+"02633","Chatham","MA","41.686534","-69.97746","-5","1"
+"02634","Centerville","MA","41.799312","-70.308662","-5","1"
+"02635","Cotuit","MA","41.625037","-70.44317","-5","1"
+"02636","Centerville","MA","41.799312","-70.308662","-5","1"
+"02637","Cummaquid","MA","41.701438","-70.277212","-5","1"
+"02638","Dennis","MA","41.736684","-70.19183","-5","1"
+"02639","Dennis Port","MA","41.661115","-70.13348","-5","1"
+"02641","East Dennis","MA","41.734713","-70.20467","-5","1"
+"02642","Eastham","MA","41.844087","-69.98921","-5","1"
+"02643","East Orleans","MA","41.784308","-69.962034","-5","1"
+"02644","Forestdale","MA","41.683462","-70.51211","-5","1"
+"02645","Harwich","MA","41.707332","-70.05679","-5","1"
+"02646","Harwich Port","MA","41.669219","-70.07419","-5","1"
+"02647","Hyannis Port","MA","41.63275","-70.30435","-5","1"
+"02648","Marstons Mills","MA","41.667689","-70.4168","-5","1"
+"02649","Mashpee","MA","41.613743","-70.48754","-5","1"
+"02650","North Chatham","MA","41.702265","-69.96958","-5","1"
+"02651","North Eastham","MA","41.824264","-69.98176","-5","1"
+"02652","North Truro","MA","42.02889","-70.07938","-5","1"
+"02653","Orleans","MA","41.777647","-69.97312","-5","1"
+"02654","Nantucket","MA","41.543967","-69.987203","-5","1"
+"02655","Osterville","MA","41.632935","-70.38693","-5","1"
+"02657","Provincetown","MA","42.053355","-70.18947","-5","1"
+"02659","South Chatham","MA","41.678628","-70.02495","-5","1"
+"02660","South Dennis","MA","41.712338","-70.16165","-5","1"
+"02661","South Harwich","MA","41.675799","-70.0396","-5","1"
+"02662","South Orleans","MA","41.756694","-69.984123","-5","1"
+"02663","South Wellfleet","MA","41.800531","-70.076776","-5","1"
+"02664","South Yarmouth","MA","41.670981","-70.19797","-5","1"
+"02666","Truro","MA","41.992804","-70.05427","-5","1"
+"02667","Wellfleet","MA","41.922412","-70.01484","-5","1"
+"02668","West Barnstable","MA","41.70631","-70.37048","-5","1"
+"02669","West Chatham","MA","41.673635","-69.99494","-5","1"
+"02670","West Dennis","MA","41.659749","-70.17089","-5","1"
+"02671","West Harwich","MA","41.665589","-70.11152","-5","1"
+"02672","West Hyannisport","MA","41.636077","-70.31962","-5","1"
+"02673","West Yarmouth","MA","41.656883","-70.23726","-5","1"
+"02675","Yarmouth Port","MA","41.703205","-70.22395","-5","1"
+"02702","Assonet","MA","41.792192","-71.06446","-5","1"
+"02703","Attleboro","MA","41.928099","-71.31456","-5","1"
+"02712","Chartley","MA","41.756214","-71.067062","-5","1"
+"02713","Cuttyhunk","MA","41.429673","-70.8954","-5","1"
+"02714","Dartmouth","MA","41.756214","-71.067062","-5","1"
+"02715","Dighton","MA","41.811514","-71.13633","-5","1"
+"02717","East Freetown","MA","41.765934","-70.95332","-5","1"
+"02718","East Taunton","MA","41.876249","-71.01827","-5","1"
+"02719","Fairhaven","MA","41.634152","-70.8814","-5","1"
+"02720","Fall River","MA","41.716952","-71.13986","-5","1"
+"02721","Fall River","MA","41.685452","-71.15425","-5","1"
+"02722","Fall River","MA","41.756214","-71.067062","-5","1"
+"02723","Fall River","MA","41.691369","-71.13234","-5","1"
+"02724","Fall River","MA","41.684152","-71.17436","-5","1"
+"02725","Somerset","MA","41.721652","-71.17482","-5","1"
+"02726","Somerset","MA","41.754828","-71.14894","-5","1"
+"02735","Easton","MA","41.999346","-71.113582","-5","1"
+"02738","Marion","MA","41.706599","-70.75086","-5","1"
+"02739","Mattapoisett","MA","41.654776","-70.80087","-5","1"
+"02740","New Bedford","MA","41.634754","-70.93752","-5","1"
+"02741","New Bedford","MA","41.756214","-71.067062","-5","1"
+"02742","New Bedford","MA","41.619557","-70.956346","-5","1"
+"02743","Acushnet","MA","41.697015","-70.91019","-5","1"
+"02744","New Bedford","MA","41.610754","-70.91453","-5","1"
+"02745","New Bedford","MA","41.692806","-70.93264","-5","1"
+"02746","New Bedford","MA","41.659336","-70.93347","-5","1"
+"02747","North Dartmouth","MA","41.637916","-70.99076","-5","1"
+"02748","South Dartmouth","MA","41.59156","-70.9494","-5","1"
+"02760","North Attleboro","MA","41.975495","-71.33086","-5","1"
+"02761","North Attleboro","MA","41.756214","-71.067062","-5","1"
+"02762","Plainville","MA","42.011848","-71.32392","-5","1"
+"02763","Attleboro Falls","MA","41.967949","-71.31024","-5","1"
+"02764","North Dighton","MA","41.851557","-71.15125","-5","1"
+"02766","Norton","MA","41.969185","-71.1854","-5","1"
+"02767","Raynham","MA","41.934586","-71.04905","-5","1"
+"02768","Raynham Center","MA","41.756214","-71.067062","-5","1"
+"02769","Rehoboth","MA","41.835067","-71.26115","-5","1"
+"02770","Rochester","MA","41.760783","-70.83848","-5","1"
+"02771","Seekonk","MA","41.84345","-71.32343","-5","1"
+"02777","Swansea","MA","41.741551","-71.21433","-5","1"
+"02779","Berkley","MA","41.825252","-71.07799","-5","1"
+"02780","Taunton","MA","41.904888","-71.10288","-5","1"
+"02781","Westport","MA","41.522877","-71.069344","-5","1"
+"02783","Taunton","MA","41.756214","-71.067062","-5","1"
+"02789","South Kingstown","RI","41.487831","-71.457592","-5","1"
+"02790","Westport","MA","41.602517","-71.08904","-5","1"
+"02791","Westport Point","MA","41.519104","-71.085137","-5","1"
+"02801","Adamsville","RI","41.530131","-71.284066","-5","1"
+"02802","Albion","RI","41.954098","-71.462053","-5","1"
+"02804","Ashaway","RI","41.430068","-71.78101","-5","1"
+"02805","Foster","RI","41.830469","-71.711713","-5","1"
+"02806","Barrington","RI","41.746834","-71.32031","-5","1"
+"02807","Block Island","RI","41.171389","-71.58358","-5","1"
+"02808","Bradford","RI","41.402009","-71.74785","-5","1"
+"02809","Bristol","RI","41.6842","-71.26866","-5","1"
+"02812","Carolina","RI","41.46603","-71.66408","-5","1"
+"02813","Charlestown","RI","41.385256","-71.66813","-5","1"
+"02814","Chepachet","RI","41.896002","-71.70335","-5","1"
+"02815","Clayville","RI","41.777861","-71.67009","-5","1"
+"02816","Coventry","RI","41.69105","-71.57462","-5","1"
+"02817","West Greenwich","RI","41.625874","-71.67023","-5","1"
+"02818","East Greenwich","RI","41.649733","-71.46815","-5","1"
+"02822","Exeter","RI","41.563937","-71.60547","-5","1"
+"02823","Fiskeville","RI","41.7312","-71.546756","-5","1"
+"02824","Forestdale","RI","42.000248","-71.563057","-5","1"
+"02825","Foster","RI","41.785151","-71.72021","-5","1"
+"02826","Glendale","RI","41.982417","-71.600848","-5","1"
+"02827","Greene","RI","41.695419","-71.74472","-5","1"
+"02828","Greenville","RI","41.870799","-71.5539","-5","1"
+"02829","Harmony","RI","41.879298","-71.589357","-5","1"
+"02830","Harrisville","RI","41.976659","-71.64969","-5","1"
+"02831","Hope","RI","41.73865","-71.57482","-5","1"
+"02832","Hope Valley","RI","41.511414","-71.72737","-5","1"
+"02833","Hopkinton","RI","41.470822","-71.77722","-5","1"
+"02835","Jamestown","RI","41.520312","-71.3718","-5","1"
+"02836","Kenyon","RI","41.448844","-71.62145","-5","1"
+"02837","Little Compton","RI","41.518038","-71.16548","-5","1"
+"02838","Manville","RI","41.968698","-71.47503","-5","1"
+"02839","Mapleville","RI","41.948108","-71.64003","-5","1"
+"02840","Newport","RI","41.488002","-71.31262","-5","1"
+"02841","Newport","RI","41.498977","-71.299004","-5","1"
+"02842","Middletown","RI","41.511739","-71.28658","-5","1"
+"02852","North Kingstown","RI","41.589701","-71.454","-5","1"
+"02854","North Kingstown","RI","41.375317","-71.64393","-5","1"
+"02857","North Scituate","RI","41.83902","-71.6257","-5","1"
+"02858","Oakland","RI","41.96186","-71.64661","-5","1"
+"02859","Pascoag","RI","41.964896","-71.72311","-5","1"
+"02860","Pawtucket","RI","41.872099","-71.39007","-5","1"
+"02861","Pawtucket","RI","41.881632","-71.35583","-5","1"
+"02862","Pawtucket","RI","41.86125","-71.369099","-5","1"
+"02863","Central Falls","RI","41.889863","-71.3926","-5","1"
+"02864","Cumberland","RI","41.949099","-71.41181","-5","1"
+"02865","Lincoln","RI","41.905666","-71.43023","-5","1"
+"02871","Portsmouth","RI","41.603929","-71.26099","-5","1"
+"02872","Prudence Island","RI","41.707119","-71.286834","-5","1"
+"02873","Rockville","RI","41.519922","-71.774023","-5","1"
+"02874","Saunderstown","RI","41.515135","-71.45692","-5","1"
+"02875","Shannock","RI","41.447642","-71.63877","-5","1"
+"02876","Slatersville","RI","41.998398","-71.576307","-5","1"
+"02877","Slocum","RI","41.5289","-71.529854","-5","1"
+"02878","Tiverton","RI","41.629413","-71.18724","-5","1"
+"02879","Wakefield","RI","41.423601","-71.52322","-5","1"
+"02880","Wakefield","RI","41.375317","-71.64393","-5","1"
+"02881","Kingston","RI","41.481001","-71.52689","-5","1"
+"02882","Narragansett","RI","41.432452","-71.46352","-5","1"
+"02883","Peace Dale","RI","41.375317","-71.64393","-5","1"
+"02885","Warren","RI","41.726184","-71.27049","-5","1"
+"02886","Warwick","RI","41.705478","-71.45119","-5","1"
+"02887","Warwick","RI","41.682455","-71.557732","-5","1"
+"02888","Warwick","RI","41.74805","-71.40982","-5","1"
+"02889","Warwick","RI","41.706814","-71.3911","-5","1"
+"02891","Westerly","RI","41.354881","-71.80387","-5","1"
+"02892","West Kingston","RI","41.50155","-71.58465","-5","1"
+"02893","West Warwick","RI","41.70375","-71.51857","-5","1"
+"02894","Wood River Junction","RI","41.444078","-71.69556","-5","1"
+"02895","Woonsocket","RI","42.001731","-71.50722","-5","1"
+"02896","North Smithfield","RI","41.988166","-71.55188","-5","1"
+"02898","Wyoming","RI","41.51495","-71.68484","-5","1"
+"02901","Providence","RI","41.82275","-71.414451","-5","1"
+"02902","Providence","RI","41.81835","-71.424851","-5","1"
+"02903","Providence","RI","41.8208","-71.41306","-5","1"
+"02904","Providence","RI","41.859199","-71.43142","-5","1"
+"02905","Providence","RI","41.7883","-71.40431","-5","1"
+"02906","Providence","RI","41.83635","-71.39427","-5","1"
+"02907","Providence","RI","41.79855","-71.42449","-5","1"
+"02908","Providence","RI","41.839296","-71.43802","-5","1"
+"02909","Providence","RI","41.8191","-71.44775","-5","1"
+"02910","Cranston","RI","41.776867","-71.43672","-5","1"
+"02911","North Providence","RI","41.853699","-71.47354","-5","1"
+"02912","Providence","RI","41.826737","-71.397699","-5","1"
+"02914","East Providence","RI","41.8124","-71.36834","-5","1"
+"02915","Riverside","RI","41.7695","-71.35564","-5","1"
+"02916","Rumford","RI","41.84325","-71.35391","-5","1"
+"02917","Smithfield","RI","41.894499","-71.51646","-5","1"
+"02918","Providence","RI","41.841499","-71.440352","-5","1"
+"02919","Johnston","RI","41.825132","-71.49468","-5","1"
+"02920","Cranston","RI","41.7715","-71.46485","-5","1"
+"02921","Cranston","RI","41.76435","-71.50972","-5","1"
+"02940","Providence","RI","41.871766","-71.558518","-5","1"
+"03004","Fremont","NH","43.001762","-71.154866","-5","1"
+"03030","Nashua","NH","42.749988","-71.46431","-5","1"
+"03031","Amherst","NH","42.854886","-71.6082","-5","1"
+"03032","Auburn","NH","43.000345","-71.35141","-5","1"
+"03033","Brookline","NH","42.742587","-71.66605","-5","1"
+"03034","Candia","NH","43.048372","-71.3078","-5","1"
+"03036","Chester","NH","42.967823","-71.23453","-5","1"
+"03037","Deerfield","NH","43.141746","-71.2488","-5","1"
+"03038","Derry","NH","42.886486","-71.30019","-5","1"
+"03040","East Candia","NH","43.005895","-71.013202","-5","1"
+"03041","East Derry","NH","43.005895","-71.013202","-5","1"
+"03042","Epping","NH","43.045076","-71.07095","-5","1"
+"03043","Francestown","NH","42.976901","-71.81007","-5","1"
+"03044","Fremont","NH","42.986119","-71.12524","-5","1"
+"03045","Goffstown","NH","43.037495","-71.57023","-5","1"
+"03046","Dunbarton","NH","43.102146","-71.602132","-5","1"
+"03047","Greenfield","NH","42.935709","-71.86645","-5","1"
+"03048","Greenville","NH","42.747024","-71.77591","-5","1"
+"03049","Hollis","NH","42.739909","-71.58044","-5","1"
+"03051","Hudson","NH","42.759821","-71.42079","-5","1"
+"03052","Litchfield","NH","42.85059","-71.45379","-5","1"
+"03053","Londonderry","NH","42.880481","-71.38205","-5","1"
+"03054","Merrimack","NH","42.858053","-71.51216","-5","1"
+"03055","Milford","NH","42.831686","-71.66743","-5","1"
+"03057","Mont Vernon","NH","42.899434","-71.68057","-5","1"
+"03058","Sharon","NH","42.798995","-71.950759","-5","1"
+"03060","Nashua","NH","42.748888","-71.46492","-5","1"
+"03061","Nashua","NH","42.952124","-71.653939","-5","1"
+"03062","Nashua","NH","42.724822","-71.49238","-5","1"
+"03063","Nashua","NH","42.770738","-71.51047","-5","1"
+"03064","Nashua","NH","42.774171","-71.47306","-5","1"
+"03070","New Boston","NH","42.978267","-71.69414","-5","1"
+"03071","New Ipswich","NH","42.753726","-71.86706","-5","1"
+"03073","North Salem","NH","43.005895","-71.013202","-5","1"
+"03076","Pelham","NH","42.734182","-71.32359","-5","1"
+"03077","Raymond","NH","43.031491","-71.19598","-5","1"
+"03079","Salem","NH","42.792456","-71.21316","-5","1"
+"03082","Lyndeborough","NH","42.902259","-71.78452","-5","1"
+"03084","Temple","NH","42.81949","-71.85063","-5","1"
+"03086","Wilton","NH","42.830184","-71.78177","-5","1"
+"03087","Windham","NH","42.805194","-71.29878","-5","1"
+"03091","Berwick","ME","43.319125","-70.818318","-5","1"
+"03097","Ogunquit","ME","43.269137","-70.598303","-5","1"
+"03101","Manchester","NH","42.989984","-71.46376","-5","1"
+"03102","Manchester","NH","42.990684","-71.4868","-5","1"
+"03103","Manchester","NH","42.967684","-71.44828","-5","1"
+"03104","Manchester","NH","43.006033","-71.44716","-5","1"
+"03105","Manchester","NH","42.952124","-71.653939","-5","1"
+"03106","Hooksett","NH","43.058785","-71.44412","-5","1"
+"03107","Manchester","NH","42.952124","-71.653939","-5","1"
+"03108","Manchester","NH","42.952124","-71.653939","-5","1"
+"03109","Manchester","NH","42.972584","-71.41349","-5","1"
+"03110","Bedford","NH","42.942551","-71.51993","-5","1"
+"03111","Manchester","NH","42.952124","-71.653939","-5","1"
+"03215","Waterville Valley","NH","43.951304","-71.50336","-5","1"
+"03216","Andover","NH","43.444702","-71.78401","-5","1"
+"03217","Ashland","NH","43.705061","-71.62778","-5","1"
+"03218","Barnstead","NH","43.338347","-71.29305","-5","1"
+"03220","Belmont","NH","43.459555","-71.47352","-5","1"
+"03221","Bradford","NH","43.256053","-71.95405","-5","1"
+"03222","Bristol","NH","43.615799","-71.75006","-5","1"
+"03223","Campton","NH","43.887682","-71.65161","-5","1"
+"03224","Canterbury","NH","43.346137","-71.54434","-5","1"
+"03225","Center Barnstead","NH","43.354005","-71.22819","-5","1"
+"03226","Center Harbor","NH","43.721094","-71.49652","-5","1"
+"03227","Center Sandwich","NH","43.802936","-71.45126","-5","1"
+"03229","Contoocook","NH","43.204192","-71.70711","-5","1"
+"03230","Danbury","NH","43.506405","-71.87281","-5","1"
+"03231","East Andover","NH","43.466172","-71.736518","-5","1"
+"03232","East Hebron","NH","43.967542","-71.840883","-5","1"
+"03233","Elkins","NH","43.423484","-71.93648","-5","1"
+"03234","Epsom","NH","43.228594","-71.3611","-5","1"
+"03235","Franklin","NH","43.444456","-71.66034","-5","1"
+"03237","Gilmanton","NH","43.42975","-71.37517","-5","1"
+"03238","Glencliff","NH","43.967542","-71.840883","-5","1"
+"03240","Grafton","NH","43.568328","-71.96422","-5","1"
+"03241","Hebron","NH","43.713794","-71.80642","-5","1"
+"03242","Henniker","NH","43.173469","-71.81722","-5","1"
+"03243","Hill","NH","43.521669","-71.73815","-5","1"
+"03244","Hillsboro","NH","43.119417","-71.92108","-5","1"
+"03245","Holderness","NH","43.737831","-71.604406","-5","1"
+"03246","Laconia","NH","43.557153","-71.43842","-5","1"
+"03247","Laconia","NH","43.588972","-71.445452","-5","1"
+"03249","Laconia","NH","43.555878","-71.398521","-5","1"
+"03251","Lincoln","NH","44.051981","-71.6606","-5","1"
+"03252","Lochmere","NH","43.468562","-71.537145","-5","1"
+"03253","Meredith","NH","43.644559","-71.50488","-5","1"
+"03254","Moultonborough","NH","43.712184","-71.39299","-5","1"
+"03255","Newbury","NH","43.32582","-72.02654","-5","1"
+"03256","New Hampton","NH","43.60768","-71.64372","-5","1"
+"03257","New London","NH","43.418863","-72.00004","-5","1"
+"03258","Chichester","NH","43.255881","-71.397599","-5","1"
+"03259","North Sandwich","NH","43.880005","-71.39475","-5","1"
+"03260","North Sutton","NH","43.356838","-71.9255","-5","1"
+"03261","Northwood","NH","43.216633","-71.2079","-5","1"
+"03262","North Woodstock","NH","44.0285","-71.68701","-5","1"
+"03263","Pittsfield","NH","43.30368","-71.3215","-5","1"
+"03264","Plymouth","NH","43.753837","-71.64503","-5","1"
+"03266","Rumney","NH","43.806365","-71.87952","-5","1"
+"03268","Salisbury","NH","43.388571","-71.74199","-5","1"
+"03269","Sanbornton","NH","43.523175","-71.5876","-5","1"
+"03270","New Boston","NH","43.203614","-71.550864","-5","1"
+"03272","South Newbury","NH","43.310279","-71.662928","-5","1"
+"03273","South Sutton","NH","43.317257","-71.92709","-5","1"
+"03274","Stinson Lake","NH","43.967542","-71.840883","-5","1"
+"03275","Suncook","NH","43.152469","-71.43654","-5","1"
+"03276","Tilton","NH","43.446729","-71.5785","-5","1"
+"03278","Warner","NH","43.283838","-71.82537","-5","1"
+"03279","Warren","NH","43.938224","-71.88853","-5","1"
+"03280","Washington","NH","43.173046","-72.09755","-5","1"
+"03281","Weare","NH","43.080986","-71.72329","-5","1"
+"03282","Wentworth","NH","43.874357","-71.91765","-5","1"
+"03284","Springfield","NH","43.501755","-72.01296","-5","1"
+"03287","Wilmot","NH","43.430018","-71.90457","-5","1"
+"03289","Winnisquam","NH","43.496372","-71.519728","-5","1"
+"03290","Nottingham","NH","43.115874","-71.11081","-5","1"
+"03291","West Nottingham","NH","43.179984","-71.1392","-5","1"
+"03293","Woodstock","NH","43.967542","-71.840883","-5","1"
+"03298","Tilton","NH","43.524872","-71.445841","-5","1"
+"03299","Tilton","NH","43.524872","-71.445841","-5","1"
+"03301","Concord","NH","43.213705","-71.53774","-5","1"
+"03302","Concord","NH","43.310279","-71.662928","-5","1"
+"03303","Concord","NH","43.283796","-71.63832","-5","1"
+"03304","Bow","NH","43.144614","-71.53576","-5","1"
+"03305","Concord","NH","43.2134","-71.517151","-5","1"
+"03307","Loudon","NH","43.31773","-71.4534","-5","1"
+"03342","Bennington","NH","43.01428","-71.881017","-5","1"
+"03386","Tamworth","NH","43.89715","-71.30915","-5","1"
+"03431","Keene","NH","42.946418","-72.28616","-5","1"
+"03435","Keene","NH","42.947098","-72.243029","-5","1"
+"03438","Harrisville","NH","42.921791","-72.00547","-5","1"
+"03440","Antrim","NH","43.060424","-71.95068","-5","1"
+"03441","Ashuelot","NH","42.791069","-72.4352","-5","1"
+"03442","Bennington","NH","43.005429","-71.91635","-5","1"
+"03443","Chesterfield","NH","42.871815","-72.47163","-5","1"
+"03444","Dublin","NH","42.899874","-72.06334","-5","1"
+"03445","Sullivan","NH","43.009728","-72.19383","-5","1"
+"03446","Swanzey","NH","42.870578","-72.29978","-5","1"
+"03447","Fitzwilliam","NH","42.754744","-72.14838","-5","1"
+"03448","Gilsum","NH","43.055293","-72.26149","-5","1"
+"03449","Hancock","NH","42.975105","-71.98913","-5","1"
+"03450","Harrisville","NH","42.941175","-72.06043","-5","1"
+"03451","Hinsdale","NH","42.797633","-72.49518","-5","1"
+"03452","Jaffrey","NH","42.827096","-72.03418","-5","1"
+"03455","Marlborough","NH","42.932177","-72.16219","-5","1"
+"03456","Marlow","NH","43.125523","-72.21382","-5","1"
+"03457","Munsonville","NH","43.025227","-72.14365","-5","1"
+"03458","Peterborough","NH","42.884919","-71.95133","-5","1"
+"03461","Rindge","NH","42.749835","-72.01034","-5","1"
+"03462","Spofford","NH","42.913966","-72.41522","-5","1"
+"03464","Stoddard","NH","43.078658","-72.0959","-5","1"
+"03465","Troy","NH","42.822155","-72.17618","-5","1"
+"03466","West Chesterfield","NH","42.899338","-72.51629","-5","1"
+"03467","Westmoreland","NH","42.971069","-72.42512","-5","1"
+"03468","West Peterborough","NH","42.890804","-71.933396","-5","1"
+"03469","West Swanzey","NH","42.87341","-72.31509","-5","1"
+"03470","Winchester","NH","42.775629","-72.33893","-5","1"
+"03477","Fitzwilliam","NH","42.74513","-72.150882","-5","1"
+"03552","Pittsburg","NH","45.085717","-71.345714","-5","1"
+"03561","Littleton","NH","44.313606","-71.79751","-5","1"
+"03570","Berlin","NH","44.463337","-71.19092","-5","1"
+"03572","Goshen","NH","43.28616","-72.148784","-5","1"
+"03574","Bethlehem","NH","44.28177","-71.69225","-5","1"
+"03575","Bretton Woods","NH","44.695648","-71.387387","-5","1"
+"03576","Colebrook","NH","44.893888","-71.44766","-5","1"
+"03578","Landaff","NH","44.101208","-71.854211","-5","1"
+"03579","Errol","NH","44.789296","-71.15394","-5","1"
+"03580","Franconia","NH","44.200124","-71.69959","-5","1"
+"03581","Gorham","NH","44.386557","-71.16273","-5","1"
+"03582","Groveton","NH","44.610605","-71.48147","-5","1"
+"03583","Jefferson","NH","44.376866","-71.46436","-5","1"
+"03584","Lancaster","NH","44.483756","-71.54999","-5","1"
+"03585","Lisbon","NH","44.225864","-71.87371","-5","1"
+"03587","Meadows","NH","44.695648","-71.387387","-5","1"
+"03588","Milan","NH","44.608332","-71.24335","-5","1"
+"03589","Mount Washington","NH","44.695648","-71.387387","-5","1"
+"03590","North Stratford","NH","44.719769","-71.59395","-5","1"
+"03592","Pittsburg","NH","45.085547","-71.30724","-5","1"
+"03595","Twin Mountain","NH","44.271516","-71.51746","-5","1"
+"03597","West Stewartstown","NH","44.695648","-71.387387","-5","1"
+"03598","Whitefield","NH","44.378771","-71.62248","-5","1"
+"03601","Acworth","NH","43.242719","-72.30269","-5","1"
+"03602","Alstead","NH","43.142384","-72.32575","-5","1"
+"03603","Charlestown","NH","43.249468","-72.39026","-5","1"
+"03604","Drewsville","NH","42.947098","-72.243029","-5","1"
+"03605","Lempster","NH","43.231807","-72.17556","-5","1"
+"03607","South Acworth","NH","43.195329","-72.26894","-5","1"
+"03608","Walpole","NH","43.075411","-72.41902","-5","1"
+"03609","North Walpole","NH","43.142254","-72.4483","-5","1"
+"03638","Freedom","NH","43.822389","-71.092797","-5","1"
+"03648","Enfield","NH","43.630276","-72.135352","-5","1"
+"03678","Lyme","NH","43.827375","-72.139036","-5","1"
+"03688","Lebanon","ME","43.341381","-70.955693","-5","1"
+"03733","Newport","NH","43.38807","-72.243666","-5","1"
+"03740","Bath","NH","44.114163","-71.948852","-5","1"
+"03741","Canaan","NH","43.659172","-72.01333","-5","1"
+"03743","Claremont","NH","43.374562","-72.34152","-5","1"
+"03745","Cornish","NH","43.476337","-72.33337","-5","1"
+"03746","Cornish Flat","NH","43.364504","-72.193966","-5","1"
+"03747","Enfield","NH","43.581769","-72.097366","-5","1"
+"03748","Enfield","NH","43.614847","-72.12058","-5","1"
+"03749","Enfield Center","NH","43.579573","-72.08541","-5","1"
+"03750","Etna","NH","43.701003","-72.20056","-5","1"
+"03751","Georges Mills","NH","43.437503","-72.07185","-5","1"
+"03752","Goshen","NH","43.304058","-72.13525","-5","1"
+"03753","Grantham","NH","43.516383","-72.12954","-5","1"
+"03754","Guild","NH","43.365618","-72.125562","-5","1"
+"03755","Hanover","NH","43.719756","-72.2507","-5","1"
+"03756","Lebanon","NH","43.967542","-71.840883","-5","1"
+"03757","Sunapee","NH","43.444147","-72.088709","-5","1"
+"03765","Haverhill","NH","44.037125","-72.05658","-5","1"
+"03766","Lebanon","NH","43.642945","-72.24403","-5","1"
+"03768","Lyme","NH","43.823864","-72.13297","-5","1"
+"03769","Lyme Center","NH","43.786267","-72.120468","-5","1"
+"03770","Meriden","NH","43.525462","-72.28072","-5","1"
+"03771","Monroe","NH","44.281722","-72.02789","-5","1"
+"03773","Newport","NH","43.358339","-72.18321","-5","1"
+"03774","North Haverhill","NH","44.08541","-71.9943","-5","1"
+"03777","Orford","NH","43.908925","-72.07831","-5","1"
+"03779","Piermont","NH","43.976427","-72.04409","-5","1"
+"03780","Pike","NH","44.029684","-71.98612","-5","1"
+"03781","Plainfield","NH","43.53357","-72.30353","-5","1"
+"03782","Sunapee","NH","43.381133","-72.09028","-5","1"
+"03784","West Lebanon","NH","43.649781","-72.30594","-5","1"
+"03785","Woodsville","NH","44.133215","-71.96306","-5","1"
+"03801","Portsmouth","NH","43.070188","-70.77684","-5","1"
+"03802","Portsmouth","NH","43.005895","-71.013202","-5","1"
+"03803","Portsmouth","NH","42.92703","-71.444752","-5","1"
+"03804","Portsmouth","NH","43.005895","-71.013202","-5","1"
+"03805","Rollinsford","NH","43.285282","-70.930684","-5","1"
+"03809","Alton","NH","43.478364","-71.22377","-5","1"
+"03810","Alton Bay","NH","43.478917","-71.28776","-5","1"
+"03811","Atkinson","NH","42.836245","-71.16246","-5","1"
+"03812","Bartlett","NH","44.081906","-71.29729","-5","1"
+"03813","Center Conway","NH","44.041089","-71.0627","-5","1"
+"03814","Center Ossipee","NH","43.767878","-71.12926","-5","1"
+"03815","Center Strafford","NH","43.256254","-71.10317","-5","1"
+"03816","Center Tuftonboro","NH","43.685171","-71.28404","-5","1"
+"03817","Chocorua","NH","43.878112","-71.22069","-5","1"
+"03818","Conway","NH","43.966958","-71.15892","-5","1"
+"03819","Danville","NH","42.927682","-71.12034","-5","1"
+"03820","Dover","NH","43.190984","-70.88787","-5","1"
+"03821","Dover","NH","43.326734","-71.028427","-5","1"
+"03822","Dover","NH","43.326734","-71.028427","-5","1"
+"03824","Durham","NH","43.128085","-70.96035","-5","1"
+"03825","Barrington","NH","43.208136","-71.04356","-5","1"
+"03826","East Hampstead","NH","42.890357","-71.12296","-5","1"
+"03827","East Kingston","NH","42.91574","-70.98459","-5","1"
+"03830","East Wakefield","NH","43.640621","-70.98935","-5","1"
+"03832","Eaton Center","NH","43.907045","-71.04716","-5","1"
+"03833","Exeter","NH","42.973783","-70.97665","-5","1"
+"03835","Farmington","NH","43.395688","-71.06217","-5","1"
+"03836","Freedom","NH","43.814201","-71.0803","-5","1"
+"03837","Gilmanton Iron Works","NH","43.435913","-71.32971","-5","1"
+"03838","Glen","NH","44.116958","-71.20354","-5","1"
+"03839","Rochester","NH","43.267581","-70.98552","-5","1"
+"03840","Greenland","NH","43.038279","-70.84714","-5","1"
+"03841","Hampstead","NH","42.880837","-71.18252","-5","1"
+"03842","Hampton","NH","42.93569","-70.82514","-5","1"
+"03843","Hampton","NH","43.005895","-71.013202","-5","1"
+"03844","Hampton Falls","NH","42.923946","-70.88666","-5","1"
+"03845","Intervale","NH","44.086488","-71.13865","-5","1"
+"03846","Jackson","NH","44.166268","-71.18089","-5","1"
+"03847","Kearsarge","NH","43.883871","-71.257726","-5","1"
+"03848","Kingston","NH","42.923643","-71.06236","-5","1"
+"03849","Madison","NH","43.930805","-71.14311","-5","1"
+"03850","Melvin Village","NH","43.707657","-71.301681","-5","1"
+"03851","Milton","NH","43.422942","-71.011369","-5","1"
+"03852","Milton Mills","NH","43.500126","-70.96931","-5","1"
+"03853","Mirror Lake","NH","43.642398","-71.28614","-5","1"
+"03854","New Castle","NH","43.068338","-70.72353","-5","1"
+"03855","New Durham","NH","43.443682","-71.14628","-5","1"
+"03856","Newfields","NH","43.03833","-70.95076","-5","1"
+"03857","Newmarket","NH","43.072738","-70.94336","-5","1"
+"03858","Newton","NH","42.871322","-71.04807","-5","1"
+"03859","Newton Junction","NH","42.861915","-71.04002","-5","1"
+"03860","North Conway","NH","44.035684","-71.13084","-5","1"
+"03862","North Hampton","NH","42.97778","-70.83055","-5","1"
+"03864","Ossipee","NH","43.672636","-71.10266","-5","1"
+"03865","Plaistow","NH","42.837189","-71.09445","-5","1"
+"03866","Rochester","NH","43.41176","-71.027303","-5","1"
+"03867","Rochester","NH","43.304163","-70.99816","-5","1"
+"03868","Rochester","NH","43.340581","-70.96311","-5","1"
+"03869","Rollinsford","NH","43.221234","-70.83207","-5","1"
+"03870","Rye","NH","43.000003","-70.76517","-5","1"
+"03871","Rye Beach","NH","42.980639","-70.771896","-5","1"
+"03872","Sanbornville","NH","43.564008","-71.03405","-5","1"
+"03873","Sandown","NH","42.929588","-71.18444","-5","1"
+"03874","Seabrook","NH","42.88439","-70.85466","-5","1"
+"03875","Silver Lake","NH","43.868287","-71.18267","-5","1"
+"03878","Somersworth","NH","43.253783","-70.87549","-5","1"
+"03882","South Effingham","NH","43.721239","-71.00006","-5","1"
+"03883","South Tamworth","NH","43.828696","-71.32104","-5","1"
+"03884","Strafford","NH","43.257919","-71.17701","-5","1"
+"03885","Stratham","NH","43.015756","-70.90192","-5","1"
+"03886","Tamworth","NH","43.857079","-71.25988","-5","1"
+"03887","Union","NH","43.448064","-71.02823","-5","1"
+"03890","West Ossipee","NH","43.811782","-71.194586","-5","1"
+"03891","Danville","NH","42.906495","-71.140537","-5","1"
+"03894","Wolfeboro","NH","43.596233","-71.19552","-5","1"
+"03896","Wolfeboro Falls","NH","43.589157","-71.218894","-5","1"
+"03897","Wonalancet","NH","43.908738","-71.34507","-5","1"
+"03901","Berwick","ME","43.29016","-70.84559","-5","1"
+"03902","Cape Neddick","ME","43.216251","-70.62856","-5","1"
+"03903","Eliot","ME","43.135435","-70.79348","-5","1"
+"03904","Kittery","ME","43.101538","-70.73611","-5","1"
+"03905","Kittery Point","ME","43.08512","-70.69607","-5","1"
+"03906","North Berwick","ME","43.327517","-70.7646","-5","1"
+"03907","Ogunquit","ME","43.247931","-70.59952","-5","1"
+"03908","South Berwick","ME","43.234782","-70.77876","-5","1"
+"03909","York","ME","43.159537","-70.65239","-5","1"
+"03910","York Beach","ME","43.211674","-70.73201","-5","1"
+"03911","York Harbor","ME","43.155465","-70.635702","-5","1"
+"04001","Acton","ME","43.548123","-70.93189","-5","1"
+"04002","Alfred","ME","43.490939","-70.6884","-5","1"
+"04003","Bailey Island","ME","43.730791","-69.99448","-5","1"
+"04004","Bar Mills","ME","43.365658","-70.604379","-5","1"
+"04005","Biddeford","ME","43.480704","-70.45871","-5","1"
+"04006","Biddeford Pool","ME","43.436049","-70.3598","-5","1"
+"04007","Biddeford","ME","43.45813","-70.505301","-5","1"
+"04008","Bowdoinham","ME","44.023057","-69.88369","-5","1"
+"04009","Bridgton","ME","44.059192","-70.72552","-5","1"
+"04010","Brownfield","ME","43.938741","-70.90049","-5","1"
+"04011","Brunswick","ME","43.8992","-69.95894","-5","1"
+"04013","Bustins Island","ME","44.408078","-70.470703","-5","1"
+"04014","Cape Porpoise","ME","43.365658","-70.604379","-5","1"
+"04015","Casco","ME","43.952597","-70.51377","-5","1"
+"04016","Center Lovell","ME","44.180965","-70.891727","-5","1"
+"04017","Chebeague Island","ME","43.736628","-70.11522","-5","1"
+"04019","Cliff Island","ME","43.696875","-70.09448","-5","1"
+"04020","Cornish","ME","43.773606","-70.80878","-5","1"
+"04021","Cumberland Center","ME","43.798251","-70.26554","-5","1"
+"04022","Denmark","ME","43.969","-70.78804","-5","1"
+"04024","East Baldwin","ME","43.823849","-70.68482","-5","1"
+"04027","Lebanon","ME","43.403349","-70.91719","-5","1"
+"04028","East Parsonfield","ME","43.732391","-70.845114","-5","1"
+"04029","Sebago","ME","43.887356","-70.67755","-5","1"
+"04030","East Waterboro","ME","43.585861","-70.6793","-5","1"
+"04031","Raymond","ME","43.916912","-70.43911","-5","1"
+"04032","Freeport","ME","43.843778","-70.10172","-5","1"
+"04033","Freeport","ME","44.408078","-70.470703","-5","1"
+"04034","Freeport","ME","44.408078","-70.470703","-5","1"
+"04037","Fryeburg","ME","44.050856","-70.95648","-5","1"
+"04038","Gorham","ME","43.697118","-70.46301","-5","1"
+"04039","Gray","ME","43.879576","-70.3533","-5","1"
+"04040","Harrison","ME","44.103892","-70.65327","-5","1"
+"04041","Hiram","ME","43.871738","-70.83391","-5","1"
+"04042","Hollis Center","ME","43.611238","-70.63265","-5","1"
+"04043","Kennebunk","ME","43.38551","-70.54707","-5","1"
+"04046","Kennebunkport","ME","43.399494","-70.4769","-5","1"
+"04047","Parsonsfield","ME","43.755002","-70.8983","-5","1"
+"04048","Limerick","ME","43.682791","-70.77178","-5","1"
+"04049","Limington","ME","43.733814","-70.70263","-5","1"
+"04050","Long Island","ME","43.692683","-70.15475","-5","1"
+"04051","Lovell","ME","44.172276","-70.87231","-5","1"
+"04053","Merepoint","ME","44.408078","-70.470703","-5","1"
+"04054","Moody","ME","43.276341","-70.597752","-5","1"
+"04055","Naples","ME","43.959974","-70.60312","-5","1"
+"04056","Newfield","ME","43.658378","-70.868871","-5","1"
+"04057","North Bridgton","ME","44.408078","-70.470703","-5","1"
+"04061","North Waterboro","ME","43.643195","-70.73033","-5","1"
+"04062","Windham","ME","43.810673","-70.41697","-5","1"
+"04063","Ocean Park","ME","43.504889","-70.385703","-5","1"
+"04064","Old Orchard Beach","ME","43.514864","-70.3856","-5","1"
+"04065","Ellsworth","ME","44.540983","-68.423297","-5","1"
+"04066","Orrs Island","ME","43.763403","-69.97038","-5","1"
+"04068","Porter","ME","43.833831","-70.93094","-5","1"
+"04069","Pownal","ME","43.912616","-70.17893","-5","1"
+"04070","Scarborough","ME","43.576983","-70.273642","-5","1"
+"04071","Raymond","ME","43.917206","-70.47233","-5","1"
+"04072","Saco","ME","43.527322","-70.45171","-5","1"
+"04073","Sanford","ME","43.426792","-70.75245","-5","1"
+"04074","Scarborough","ME","43.583224","-70.35268","-5","1"
+"04075","Sebago Lake","ME","43.796053","-70.552183","-5","1"
+"04076","Shapleigh","ME","43.553076","-70.84515","-5","1"
+"04077","South Casco","ME","43.910029","-70.524524","-5","1"
+"04078","South Freeport","ME","43.820774","-70.120781","-5","1"
+"04079","Harpswell","ME","43.797398","-69.95217","-5","1"
+"04081","South Waterford","ME","44.566156","-70.661557","-5","1"
+"04082","South Windham","ME","44.408078","-70.470703","-5","1"
+"04083","Springvale","ME","43.467037","-70.80275","-5","1"
+"04084","Standish","ME","43.761599","-70.56433","-5","1"
+"04085","Steep Falls","ME","43.770432","-70.63812","-5","1"
+"04086","Topsham","ME","43.94674","-69.96163","-5","1"
+"04087","Waterboro","ME","43.56066","-70.75497","-5","1"
+"04088","Waterford","ME","44.190761","-70.70757","-5","1"
+"04090","Wells","ME","43.320211","-70.61178","-5","1"
+"04091","West Baldwin","ME","43.824885","-70.75038","-5","1"
+"04092","Westbrook","ME","43.682148","-70.35823","-5","1"
+"04093","West Buxton","ME","43.660386","-70.57492","-5","1"
+"04094","West Kennebunk","ME","43.406101","-70.573255","-5","1"
+"04095","West Newfield","ME","43.642631","-70.91218","-5","1"
+"04096","Yarmouth","ME","43.801773","-70.17932","-5","1"
+"04097","North Yarmouth","ME","43.842797","-70.22985","-5","1"
+"04098","Westbrook","ME","44.408078","-70.470703","-5","1"
+"04101","Portland","ME","43.660525","-70.25862","-5","1"
+"04102","Portland","ME","43.658632","-70.2911","-5","1"
+"04103","Portland","ME","43.685882","-70.2903","-5","1"
+"04104","Portland","ME","43.84649","-70.464839","-5","1"
+"04105","Falmouth","ME","43.736732","-70.26027","-5","1"
+"04106","South Portland","ME","43.631549","-70.27272","-5","1"
+"04107","Cape Elizabeth","ME","43.604739","-70.22617","-5","1"
+"04108","Peaks Island","ME","43.665177","-70.19475","-5","1"
+"04109","Portland","ME","43.678339","-70.198742","-5","1"
+"04110","Cumberland Foreside","ME","43.760369","-70.19681","-5","1"
+"04112","Portland","ME","44.408078","-70.470703","-5","1"
+"04116","South Portland","ME","44.408078","-70.470703","-5","1"
+"04122","Portland","ME","44.408078","-70.470703","-5","1"
+"04123","Portland","ME","44.408078","-70.470703","-5","1"
+"04124","Portland","ME","44.408078","-70.470703","-5","1"
+"04210","Auburn","ME","44.089173","-70.24143","-5","1"
+"04211","Auburn","ME","44.197009","-70.239485","-5","1"
+"04212","Auburn","ME","44.197009","-70.239485","-5","1"
+"04216","Andover","ME","44.661894","-70.79952","-5","1"
+"04217","Bethel","ME","44.372129","-70.8175","-5","1"
+"04219","Bryant Pond","ME","44.386951","-70.63082","-5","1"
+"04220","Buckfield","ME","44.295264","-70.3671","-5","1"
+"04221","Canton","ME","44.423658","-70.31378","-5","1"
+"04222","Durham","ME","43.972505","-70.12291","-5","1"
+"04223","Danville","ME","44.023873","-70.285748","-5","1"
+"04224","Dixfield","ME","44.555583","-70.41383","-5","1"
+"04225","Dryden","ME","44.602705","-70.22651","-5","1"
+"04226","East Andover","ME","44.614134","-70.69882","-5","1"
+"04227","East Dixfield","ME","44.579135","-70.326337","-5","1"
+"04228","East Livermore","ME","44.400997","-70.13383","-5","1"
+"04230","East Poland","ME","44.062672","-70.327049","-5","1"
+"04231","Stoneham","ME","44.261562","-70.87044","-5","1"
+"04234","East Wilton","ME","44.617509","-70.182012","-5","1"
+"04236","Greene","ME","44.194404","-70.14181","-5","1"
+"04237","Hanover","ME","44.49281","-70.7356","-5","1"
+"04238","Hebron","ME","44.197418","-70.36975","-5","1"
+"04239","Jay","ME","44.516475","-70.21933","-5","1"
+"04240","Lewiston","ME","44.094773","-70.19141","-5","1"
+"04241","Lewiston","ME","44.197009","-70.239485","-5","1"
+"04243","Lewiston","ME","44.197009","-70.239485","-5","1"
+"04250","Lisbon","ME","44.027509","-70.1097","-5","1"
+"04252","Lisbon Falls","ME","44.009827","-70.05631","-5","1"
+"04253","Livermore","ME","44.408579","-70.22452","-5","1"
+"04254","Livermore Falls","ME","44.470961","-70.17486","-5","1"
+"04255","Locke Mills","ME","44.35976","-70.67231","-5","1"
+"04256","Mechanic Falls","ME","44.10472","-70.39197","-5","1"
+"04257","Mexico","ME","44.556984","-70.53351","-5","1"
+"04258","Minot","ME","44.154921","-70.33319","-5","1"
+"04259","Monmouth","ME","44.231811","-69.99897","-5","1"
+"04260","New Gloucester","ME","43.957375","-70.29488","-5","1"
+"04261","Newry","ME","44.570532","-70.87599","-5","1"
+"04262","North Jay","ME","45.063384","-70.381639","-5","1"
+"04263","Leeds","ME","44.283844","-70.11254","-5","1"
+"04265","North Monmouth","ME","44.281993","-70.04027","-5","1"
+"04266","North Turner","ME","44.357987","-70.255783","-5","1"
+"04267","North Waterford","ME","44.566156","-70.661557","-5","1"
+"04268","Norway","ME","44.223589","-70.58366","-5","1"
+"04270","Oxford","ME","44.114612","-70.50506","-5","1"
+"04271","Paris","ME","44.264111","-70.498513","-5","1"
+"04273","Hanover","ME","44.498193","-70.697022","-5","1"
+"04274","Poland","ME","44.049157","-70.39077","-5","1"
+"04275","Roxbury","ME","44.727073","-70.6478","-5","1"
+"04276","Rumford","ME","44.53599","-70.56609","-5","1"
+"04278","Rumford Center","ME","44.377031","-70.568041","-5","1"
+"04279","Rumford","ME","44.56421","-70.715864","-5","1"
+"04280","Sabattus","ME","44.119007","-70.07568","-5","1"
+"04281","South Paris","ME","44.235141","-70.50508","-5","1"
+"04282","Turner","ME","44.266842","-70.24563","-5","1"
+"04283","Turner Center","ME","44.197009","-70.239485","-5","1"
+"04284","Wayne","ME","44.349542","-70.05698","-5","1"
+"04285","Weld","ME","44.697077","-70.43275","-5","1"
+"04286","West Bethel","ME","44.40205","-70.860094","-5","1"
+"04287","Bowdoin","ME","44.048154","-69.96847","-5","1"
+"04288","West Minot","ME","44.197009","-70.239485","-5","1"
+"04289","West Paris","ME","44.325285","-70.52451","-5","1"
+"04290","Peru","ME","44.494624","-70.43726","-5","1"
+"04291","West Poland","ME","44.040857","-70.453006","-5","1"
+"04292","Sumner","ME","44.38382","-70.43533","-5","1"
+"04294","Wilton","ME","44.602261","-70.22906","-5","1"
+"04321","Stoneham","ME","44.209214","-70.818045","-5","1"
+"04327","Richmond","ME","44.09156","-69.804077","-5","1"
+"04330","Augusta","ME","44.344406","-69.76345","-5","1"
+"04332","Augusta","ME","44.414056","-69.751913","-5","1"
+"04333","Augusta","ME","44.414056","-69.751913","-5","1"
+"04336","Augusta","ME","44.315693","-69.818009","-5","1"
+"04338","Augusta","ME","44.414056","-69.751913","-5","1"
+"04341","Coopers Mills","ME","44.258771","-69.551024","-5","1"
+"04342","Dresden","ME","44.07685","-69.75012","-5","1"
+"04343","East Winthrop","ME","44.414056","-69.751913","-5","1"
+"04344","Farmingdale","ME","44.26043","-69.80122","-5","1"
+"04345","Gardiner","ME","44.211491","-69.80866","-5","1"
+"04346","Randolph","ME","44.234914","-69.75722","-5","1"
+"04347","Hallowell","ME","44.286802","-69.79788","-5","1"
+"04348","Jefferson","ME","44.212785","-69.4971","-5","1"
+"04349","Kents Hill","ME","44.42977","-70.06456","-5","1"
+"04350","Litchfield","ME","44.174052","-69.93363","-5","1"
+"04351","Manchester","ME","44.306955","-69.87518","-5","1"
+"04352","Mount Vernon","ME","44.46599","-69.96073","-5","1"
+"04353","Whitefield","ME","44.209878","-69.60427","-5","1"
+"04354","Palermo","ME","44.384901","-69.4136","-5","1"
+"04355","Readfield","ME","44.376802","-69.96353","-5","1"
+"04357","Richmond","ME","44.117232","-69.82947","-5","1"
+"04358","South China","ME","44.428911","-69.52679","-5","1"
+"04359","South Gardiner","ME","44.183266","-69.777196","-5","1"
+"04360","Vienna","ME","44.548458","-69.985","-5","1"
+"04363","Windsor","ME","44.300247","-69.5744","-5","1"
+"04364","Winthrop","ME","44.31842","-69.95997","-5","1"
+"04401","Bangor","ME","44.81777","-68.78952","-5","1"
+"04402","Bangor","ME","45.519867","-68.647416","-5","1"
+"04406","Abbot","ME","45.221933","-69.49039","-5","1"
+"04408","Aurora","ME","44.87332","-68.23311","-5","1"
+"04410","Bradford","ME","45.088295","-68.90997","-5","1"
+"04411","Bradley","ME","44.911733","-68.621","-5","1"
+"04412","Brewer","ME","44.78696","-68.7547","-5","1"
+"04413","Brookton","ME","45.53866","-67.75295","-5","1"
+"04414","Brownville","ME","45.369216","-69.03431","-5","1"
+"04415","Brownville Junction","ME","45.351184","-69.058062","-5","1"
+"04416","Bucksport","ME","44.609813","-68.78303","-5","1"
+"04417","Burlington","ME","45.264114","-68.42087","-5","1"
+"04418","Cardville","ME","45.110336","-68.62103","-5","1"
+"04419","Carmel","ME","44.7896","-69.00587","-5","1"
+"04420","Castine","ME","44.412968","-68.798047","-5","1"
+"04421","Castine","ME","44.405928","-68.79341","-5","1"
+"04422","Charleston","ME","45.060941","-69.03527","-5","1"
+"04423","Costigan","ME","45.01895","-68.48987","-5","1"
+"04424","Danforth","ME","45.679453","-67.86208","-5","1"
+"04426","Dover Foxcroft","ME","45.195052","-69.18861","-5","1"
+"04427","Corinth","ME","44.979986","-69.00746","-5","1"
+"04428","Eddington","ME","44.798289","-68.5694","-5","1"
+"04429","Holden","ME","44.700606","-68.59682","-5","1"
+"04430","East Millinocket","ME","45.631824","-68.58178","-5","1"
+"04431","East Orland","ME","44.56801","-68.68116","-5","1"
+"04434","Etna","ME","44.802184","-69.14212","-5","1"
+"04435","Exeter","ME","44.961913","-69.12214","-5","1"
+"04438","Frankfort","ME","44.61165","-68.91965","-5","1"
+"04441","Greenville","ME","45.517693","-69.5223","-5","1"
+"04442","Greenville Junction","ME","45.479835","-69.62773","-5","1"
+"04443","Guilford","ME","45.245781","-69.37191","-5","1"
+"04444","Hampden","ME","44.735745","-68.92518","-5","1"
+"04448","Howland","ME","45.241091","-68.67025","-5","1"
+"04449","Hudson","ME","44.999621","-68.88431","-5","1"
+"04450","Kenduskeag","ME","44.921758","-68.93125","-5","1"
+"04451","Kingman","ME","45.548818","-68.20841","-5","1"
+"04453","Lagrange","ME","45.184949","-68.78881","-5","1"
+"04454","Lambert Lake","ME","45.002969","-67.495548","-5","1"
+"04455","Lee","ME","45.333971","-68.29313","-5","1"
+"04456","Levant","ME","44.876282","-68.98712","-5","1"
+"04457","Lincoln","ME","45.368934","-68.48354","-5","1"
+"04459","Mattawamkeag","ME","45.518535","-68.33623","-5","1"
+"04460","Medway","ME","45.638612","-68.52012","-5","1"
+"04461","Milford","ME","44.956776","-68.62199","-5","1"
+"04462","Millinocket","ME","45.646916","-68.74801","-5","1"
+"04463","Milo","ME","45.241618","-68.95101","-5","1"
+"04464","Monson","ME","45.303916","-69.51368","-5","1"
+"04465","Cary","ME","45.961338","-67.824005","-5","1"
+"04467","Olamon","ME","45.519867","-68.647416","-5","1"
+"04468","Old Town","ME","44.951551","-68.67889","-5","1"
+"04469","Orono","ME","45.002798","-68.63343","-5","1"
+"04471","Orient","ME","45.909516","-67.85856","-5","1"
+"04472","Orland","ME","44.560479","-68.69084","-5","1"
+"04473","Orono","ME","44.889249","-68.68177","-5","1"
+"04474","Orrington","ME","44.721393","-68.78905","-5","1"
+"04475","Passadumkeag","ME","45.191812","-68.58953","-5","1"
+"04476","Penobscot","ME","44.444707","-68.73576","-5","1"
+"04478","Rockwood","ME","45.704599","-69.80879","-5","1"
+"04479","Sangerville","ME","45.129817","-69.32571","-5","1"
+"04481","Sebec","ME","45.792364","-69.30463","-5","1"
+"04485","Shirley Mills","ME","45.792364","-69.30463","-5","1"
+"04487","Springfield","ME","45.386188","-68.08163","-5","1"
+"04488","Stetson","ME","44.891869","-69.1108","-5","1"
+"04489","Stillwater","ME","44.922368","-68.686796","-5","1"
+"04490","Topsfield","ME","45.426462","-67.76009","-5","1"
+"04491","Vanceboro","ME","45.002969","-67.495548","-5","1"
+"04492","Waite","ME","45.002969","-67.495548","-5","1"
+"04493","West Enfield","ME","45.247401","-68.51819","-5","1"
+"04495","Winn","ME","45.484389","-68.37662","-5","1"
+"04496","Winterport","ME","44.657697","-68.8957","-5","1"
+"04497","Wytopitlock","ME","45.733543","-68.05875","-5","1"
+"04530","Bath","ME","43.900651","-69.83405","-5","1"
+"04535","Alna","ME","44.084989","-69.62535","-5","1"
+"04536","Bayville","ME","44.021333","-69.523263","-5","1"
+"04537","Boothbay","ME","43.907812","-69.64608","-5","1"
+"04538","Boothbay Harbor","ME","43.85424","-69.63217","-5","1"
+"04539","Bristol","ME","43.965125","-69.50529","-5","1"
+"04541","Chamberlain","ME","43.885681","-69.4795","-5","1"
+"04543","Damariscotta","ME","44.036533","-69.48841","-5","1"
+"04544","East Boothbay","ME","43.832642","-69.58903","-5","1"
+"04546","Georgetown","ME","43.767018","-69.749812","-5","1"
+"04547","Friendship","ME","43.983665","-69.33885","-5","1"
+"04548","Georgetown","ME","43.810548","-69.74325","-5","1"
+"04549","Isle Of Springs","ME","44.021333","-69.523263","-5","1"
+"04551","Bremen","ME","43.999618","-69.43738","-5","1"
+"04552","Newagen","ME","44.021333","-69.523263","-5","1"
+"04553","Newcastle","ME","44.048714","-69.54335","-5","1"
+"04554","New Harbor","ME","43.863028","-69.51314","-5","1"
+"04555","Nobleboro","ME","44.096194","-69.47857","-5","1"
+"04556","Edgecomb","ME","43.973476","-69.63516","-5","1"
+"04557","Richmond","ME","44.090471","-69.803936","-5","1"
+"04558","Pemaquid","ME","43.893848","-69.52041","-5","1"
+"04562","Phippsburg","ME","43.793136","-69.81778","-5","1"
+"04563","Cushing","ME","43.993356","-69.26819","-5","1"
+"04564","Round Pond","ME","43.937468","-69.45721","-5","1"
+"04565","Sebasco Estates","ME","43.773312","-69.863461","-5","1"
+"04567","Small Point","ME","43.900856","-69.859541","-5","1"
+"04568","South Bristol","ME","43.863902","-69.55874","-5","1"
+"04570","Squirrel Island","ME","44.021333","-69.523263","-5","1"
+"04571","Trevett","ME","43.88261","-69.680144","-5","1"
+"04572","Waldoboro","ME","44.10637","-69.37177","-5","1"
+"04573","Walpole","ME","43.949672","-69.55133","-5","1"
+"04574","Washington","ME","44.274007","-69.38896","-5","1"
+"04575","West Boothbay Harbor","ME","43.854534","-69.660795","-5","1"
+"04576","Southport","ME","43.823008","-69.66661","-5","1"
+"04578","Wiscasset","ME","43.974367","-69.68366","-5","1"
+"04579","Woolwich","ME","43.949901","-69.78298","-5","1"
+"04600","Winter Harbor","ME","44.396951","-68.081184","-5","1"
+"04605","Ellsworth","ME","44.614885","-68.43626","-5","1"
+"04606","Addison","ME","44.556073","-67.70122","-5","1"
+"04607","Gouldsboro","ME","44.49569","-68.09467","-5","1"
+"04609","Bar Harbor","ME","44.402596","-68.26204","-5","1"
+"04611","Beals","ME","44.507801","-67.6025","-5","1"
+"04612","Bernard","ME","44.247391","-68.37104","-5","1"
+"04613","Birch Harbor","ME","44.378868","-68.02915","-5","1"
+"04614","Blue Hill","ME","44.413056","-68.58156","-5","1"
+"04615","Blue Hill Falls","ME","44.354477","-68.54781","-5","1"
+"04616","Brooklin","ME","44.275325","-68.55956","-5","1"
+"04617","Brooksville","ME","44.363587","-68.74399","-5","1"
+"04619","Calais","ME","45.166045","-67.24243","-5","1"
+"04621","Eastport","ME","44.904789","-66.990529","-5","1"
+"04622","Cherryfield","ME","44.686731","-67.99166","-5","1"
+"04623","Columbia Falls","ME","44.695493","-67.7395","-5","1"
+"04624","Corea","ME","44.428044","-67.98828","-5","1"
+"04625","Cranberry Isles","ME","44.248715","-68.25991","-5","1"
+"04626","Cutler","ME","44.673285","-67.23946","-5","1"
+"04627","Deer Isle","ME","44.221142","-68.66894","-5","1"
+"04628","Dennysville","ME","44.894562","-67.2324","-5","1"
+"04629","East Blue Hill","ME","44.414095","-68.51313","-5","1"
+"04630","East Machias","ME","44.753992","-67.3786","-5","1"
+"04631","Eastport","ME","44.913741","-67.00391","-5","1"
+"04634","Franklin","ME","44.617844","-68.23546","-5","1"
+"04635","Frenchboro","ME","44.124476","-68.34995","-5","1"
+"04637","Grand Lake Stream","ME","45.185635","-67.601026","-5","1"
+"04640","Hancock","ME","44.524526","-68.28298","-5","1"
+"04642","Harborside","ME","44.322421","-68.80933","-5","1"
+"04643","Harrington","ME","44.599134","-67.82533","-5","1"
+"04644","Hulls Cove","ME","44.641873","-68.391481","-5","1"
+"04645","Isle Au Haut","ME","44.058801","-68.61685","-5","1"
+"04646","Islesford","ME","44.258201","-68.2277","-5","1"
+"04648","Jonesboro","ME","44.663206","-67.59538","-5","1"
+"04649","Jonesport","ME","44.554662","-67.57808","-5","1"
+"04650","Little Deer Isle","ME","44.286462","-68.71098","-5","1"
+"04652","Lubec","ME","44.818733","-67.04996","-5","1"
+"04653","Bass Harbor","ME","44.248615","-68.3521","-5","1"
+"04654","Machias","ME","44.802637","-67.54727","-5","1"
+"04655","Machiasport","ME","44.632707","-67.39416","-5","1"
+"04656","Manset","ME","44.641873","-68.391481","-5","1"
+"04657","Meddybemps","ME","44.971091","-67.38549","-5","1"
+"04658","Milbridge","ME","44.512003","-67.87827","-5","1"
+"04660","Mount Desert","ME","44.34629","-68.34317","-5","1"
+"04662","Northeast Harbor","ME","44.291076","-68.28143","-5","1"
+"04664","Sullivan","ME","44.528094","-68.22333","-5","1"
+"04665","Otter Creek","ME","44.641873","-68.391481","-5","1"
+"04666","Pembroke","ME","44.975116","-67.1946","-5","1"
+"04667","Perry","ME","44.972969","-67.08697","-5","1"
+"04668","Princeton","ME","45.188555","-67.59063","-5","1"
+"04669","Prospect Harbor","ME","44.408699","-68.01142","-5","1"
+"04671","Robbinston","ME","45.076626","-67.14057","-5","1"
+"04672","Salsbury Cove","ME","44.430435","-68.2849","-5","1"
+"04673","Sargentville","ME","44.305681","-68.67842","-5","1"
+"04674","Seal Cove","ME","44.295719","-68.40092","-5","1"
+"04675","Seal Harbor","ME","44.298106","-68.24075","-5","1"
+"04676","Sedgwick","ME","44.333099","-68.65693","-5","1"
+"04677","Sorrento","ME","44.482607","-68.18185","-5","1"
+"04679","Southwest Harbor","ME","44.278453","-68.32186","-5","1"
+"04680","Steuben","ME","44.510306","-67.94879","-5","1"
+"04681","Stonington","ME","44.168214","-68.66405","-5","1"
+"04683","Sunset","ME","44.214927","-68.7769","-5","1"
+"04684","Surry","ME","44.490635","-68.50085","-5","1"
+"04685","Swans Island","ME","44.161589","-68.44607","-5","1"
+"04686","Wesley","ME","45.002969","-67.495548","-5","1"
+"04690","West Tremont","ME","44.641873","-68.391481","-5","1"
+"04691","Whiting","ME","44.790082","-67.24789","-5","1"
+"04693","Winter Harbor","ME","44.384841","-68.09458","-5","1"
+"04694","Baileyville","ME","45.116525","-67.42484","-5","1"
+"04724","Poland","ME","43.995965","-70.41037","-5","1"
+"04730","Houlton","ME","46.12672","-67.87798","-5","1"
+"04732","Ashland","ME","46.64005","-68.42804","-5","1"
+"04733","Benedicta","ME","45.810781","-68.39974","-5","1"
+"04734","Blaine","ME","46.516166","-68.886826","-5","1"
+"04735","Bridgewater","ME","46.421799","-67.89417","-5","1"
+"04736","Caribou","ME","46.878869","-68.01128","-5","1"
+"04737","Clayton Lake","ME","46.516166","-68.886826","-5","1"
+"04738","Crouseville","ME","46.516166","-68.886826","-5","1"
+"04739","Eagle Lake","ME","47.042226","-68.61588","-5","1"
+"04740","Easton","ME","46.657001","-67.86338","-5","1"
+"04741","Estcourt Station","ME","46.516166","-68.886826","-5","1"
+"04742","Fort Fairfield","ME","46.774757","-67.85012","-5","1"
+"04743","Fort Kent","ME","47.209541","-68.57238","-5","1"
+"04744","Fort Kent Mills","ME","46.516166","-68.886826","-5","1"
+"04745","Frenchville","ME","47.285196","-68.38716","-5","1"
+"04746","Grand Isle","ME","47.281126","-68.14277","-5","1"
+"04747","Island Falls","ME","46.004523","-68.27004","-5","1"
+"04750","Limestone","ME","46.936616","-67.86471","-5","1"
+"04751","Limestone","ME","46.892918","-67.9643","-5","1"
+"04752","Ashland","ME","46.602477","-68.410131","-5","1"
+"04756","Madawaska","ME","47.345936","-68.32256","-5","1"
+"04757","Mapleton","ME","46.68619","-68.147","-5","1"
+"04758","Mars Hill","ME","46.512409","-67.86655","-5","1"
+"04759","Masardis","ME","46.497891","-68.37251","-5","1"
+"04760","Monticello","ME","46.311845","-67.85518","-5","1"
+"04761","New Limerick","ME","46.100442","-68.003376","-5","1"
+"04762","New Sweden","ME","46.953804","-68.1204","-5","1"
+"04763","Oakfield","ME","46.104734","-68.11398","-5","1"
+"04764","Oxbow","ME","46.416656","-68.47646","-5","1"
+"04765","Patten","ME","46.024219","-68.49241","-5","1"
+"04766","Perham","ME","46.869762","-68.2929","-5","1"
+"04768","Portage","ME","46.778192","-68.4992","-5","1"
+"04769","Presque Isle","ME","46.679321","-68.00216","-5","1"
+"04770","Quimby","ME","46.516166","-68.886826","-5","1"
+"04772","Saint Agatha","ME","47.241717","-68.33931","-5","1"
+"04773","Saint David","ME","47.281953","-68.23959","-5","1"
+"04774","Saint Francis","ME","47.119796","-69.00258","-5","1"
+"04775","Sheridan","ME","46.516166","-68.886826","-5","1"
+"04776","Sherman Mills","ME","45.864106","-68.33986","-5","1"
+"04777","Sherman Station","ME","45.880436","-68.45173","-5","1"
+"04779","Sinclair","ME","47.165256","-68.27288","-5","1"
+"04780","Smyrna Mills","ME","46.164163","-68.23232","-5","1"
+"04781","Soldier Pond","ME","47.163149","-68.58915","-5","1"
+"04782","Stacyville","ME","45.519867","-68.647416","-5","1"
+"04783","Stockholm","ME","47.049301","-68.20823","-5","1"
+"04785","Van Buren","ME","47.14685","-67.94718","-5","1"
+"04786","Washburn","ME","46.78551","-68.16871","-5","1"
+"04787","Westfield","ME","46.574691","-67.96531","-5","1"
+"04788","Winterville","ME","46.516166","-68.886826","-5","1"
+"04840","Camden","ME","44.210119","-69.113626","-5","1"
+"04841","Rockland","ME","44.108735","-69.11366","-5","1"
+"04842","Owls Head","ME","44.086989","-69.104234","-5","1"
+"04843","Camden","ME","44.218159","-69.08184","-5","1"
+"04846","Glen Cove","ME","44.131005","-69.091111","-5","1"
+"04847","Hope","ME","44.232721","-69.19254","-5","1"
+"04848","Islesboro","ME","44.305981","-68.90883","-5","1"
+"04849","Lincolnville","ME","44.325944","-69.03065","-5","1"
+"04850","Lincolnville Center","ME","44.478694","-69.149559","-5","1"
+"04851","Matinicus","ME","43.856129","-68.88847","-5","1"
+"04852","Monhegan","ME","43.764862","-69.32016","-5","1"
+"04853","North Haven","ME","44.154189","-68.8781","-5","1"
+"04854","Owls Head","ME","44.065748","-69.07536","-5","1"
+"04855","Port Clyde","ME","44.032196","-69.148017","-5","1"
+"04856","Rockport","ME","44.180867","-69.09812","-5","1"
+"04857","Saint George","ME","44.008875","-69.20629","-5","1"
+"04858","South Thomaston","ME","44.024605","-69.12781","-5","1"
+"04859","Spruce Head","ME","43.999827","-69.15608","-5","1"
+"04860","Tenants Harbor","ME","43.9464","-69.23524","-5","1"
+"04861","Thomaston","ME","44.082602","-69.17598","-5","1"
+"04862","Union","ME","44.240765","-69.27048","-5","1"
+"04863","Vinalhaven","ME","44.061051","-68.83819","-5","1"
+"04864","Warren","ME","44.135936","-69.24907","-5","1"
+"04865","West Rockport","ME","44.192369","-69.121139","-5","1"
+"04901","Waterville","ME","44.554965","-69.61297","-5","1"
+"04903","Waterville","ME","44.549225","-69.713178","-5","1"
+"04910","Albion","ME","44.513491","-69.43496","-5","1"
+"04911","Anson","ME","44.78029","-69.93424","-5","1"
+"04912","Athens","ME","44.949136","-69.64968","-5","1"
+"04915","Belfast","ME","44.445295","-69.02257","-5","1"
+"04917","Belgrade","ME","44.493133","-69.83348","-5","1"
+"04918","Belgrade Lakes","ME","44.414056","-69.751913","-5","1"
+"04920","Bingham","ME","45.07952","-69.84723","-5","1"
+"04921","Brooks","ME","44.554501","-69.12604","-5","1"
+"04922","Burnham","ME","44.667844","-69.37398","-5","1"
+"04923","Cambridge","ME","45.031691","-69.44672","-5","1"
+"04924","Canaan","ME","44.765617","-69.55694","-5","1"
+"04925","Caratunk","ME","45.249363","-69.9433","-5","1"
+"04926","China","ME","44.391167","-69.538257","-5","1"
+"04927","Clinton","ME","44.659486","-69.53064","-5","1"
+"04928","Corinna","ME","44.949001","-69.27327","-5","1"
+"04929","Detroit","ME","44.785927","-69.30376","-5","1"
+"04930","Dexter","ME","45.023476","-69.29725","-5","1"
+"04932","Dixmont","ME","44.689677","-69.1248","-5","1"
+"04933","East Newport","ME","45.519867","-68.647416","-5","1"
+"04935","East Vassalboro","ME","44.414056","-69.751913","-5","1"
+"04936","Eustis","ME","45.325768","-70.54062","-5","1"
+"04937","Fairfield","ME","44.603329","-69.63627","-5","1"
+"04938","Farmington","ME","44.66776","-70.12362","-5","1"
+"04939","Garland","ME","45.046491","-69.14747","-5","1"
+"04940","Farmington Falls","ME","44.622563","-70.075178","-5","1"
+"04941","Freedom","ME","44.466012","-69.31337","-5","1"
+"04942","Harmony","ME","44.985047","-69.56523","-5","1"
+"04943","Hartland","ME","44.861365","-69.49934","-5","1"
+"04944","Hinckley","ME","44.684737","-69.6425","-5","1"
+"04945","Jackman","ME","45.587713","-70.27257","-5","1"
+"04947","Kingfield","ME","45.018122","-70.2669","-5","1"
+"04949","Liberty","ME","44.371109","-69.32744","-5","1"
+"04950","Madison","ME","44.819206","-69.82782","-5","1"
+"04951","Monroe","ME","44.599607","-69.04542","-5","1"
+"04952","Morrill","ME","44.417725","-69.15196","-5","1"
+"04953","Newport","ME","44.85549","-69.26397","-5","1"
+"04954","New Portland","ME","44.904101","-70.10453","-5","1"
+"04955","New Sharon","ME","44.638255","-70.01525","-5","1"
+"04956","New Vineyard","ME","44.79781","-70.12443","-5","1"
+"04957","Norridgewock","ME","44.700173","-69.82554","-5","1"
+"04958","North Anson","ME","44.926344","-69.93521","-5","1"
+"04961","North New Portland","ME","45.056328","-70.08652","-5","1"
+"04962","North Vassalboro","ME","44.464439","-69.61699","-5","1"
+"04963","Oakland","ME","44.560495","-69.76938","-5","1"
+"04964","Oquossoc","ME","44.924121","-70.76786","-5","1"
+"04965","Palmyra","ME","44.845899","-69.36775","-5","1"
+"04966","Phillips","ME","44.840352","-70.37235","-5","1"
+"04967","Pittsfield","ME","44.774328","-69.40616","-5","1"
+"04969","Plymouth","ME","44.767975","-69.21191","-5","1"
+"04970","Rangeley","ME","44.966701","-70.6576","-5","1"
+"04971","Saint Albans","ME","44.927382","-69.38752","-5","1"
+"04972","Sandy Point","ME","44.478694","-69.149559","-5","1"
+"04973","Searsmont","ME","44.369557","-69.1882","-5","1"
+"04974","Searsport","ME","44.500622","-68.92829","-5","1"
+"04975","Shawmut","ME","44.624515","-69.586852","-5","1"
+"04976","Skowhegan","ME","44.782568","-69.69212","-5","1"
+"04978","Smithfield","ME","44.624821","-69.81117","-5","1"
+"04979","Solon","ME","44.940536","-69.80759","-5","1"
+"04981","Stockton Springs","ME","44.499082","-68.85667","-5","1"
+"04982","Stratton","ME","45.137607","-70.44606","-5","1"
+"04983","Strong","ME","44.822625","-70.21778","-5","1"
+"04984","Temple","ME","44.688292","-70.23773","-5","1"
+"04985","West Forks","ME","45.380034","-69.90892","-5","1"
+"04986","Thorndike","ME","44.555643","-69.23241","-5","1"
+"04987","Troy","ME","44.678838","-69.26918","-5","1"
+"04988","Unity","ME","44.60509","-69.33022","-5","1"
+"04989","Vassalboro","ME","44.398851","-69.65181","-5","1"
+"04992","West Farmington","ME","44.662822","-70.153049","-5","1"
+"05001","White River Junction","VT","43.662892","-72.36825","-5","1"
+"05009","White River Junction","VT","43.592039","-72.588407","-5","1"
+"05030","Ascutney","VT","43.410672","-72.429777","-5","1"
+"05031","Barnard","VT","43.735816","-72.6026","-5","1"
+"05032","Bethel","VT","43.811958","-72.64493","-5","1"
+"05033","Bradford","VT","43.994064","-72.15534","-5","1"
+"05034","Bridgewater","VT","43.577762","-72.61789","-5","1"
+"05035","Bridgewater Corners","VT","43.608849","-72.6799","-5","1"
+"05036","Brookfield","VT","44.02591","-72.58502","-5","1"
+"05037","Brownsville","VT","43.461468","-72.48743","-5","1"
+"05038","Chelsea","VT","43.989583","-72.46276","-5","1"
+"05039","Corinth","VT","44.026521","-72.29347","-5","1"
+"05040","East Corinth","VT","44.070771","-72.21275","-5","1"
+"05041","East Randolph","VT","43.966821","-72.54784","-5","1"
+"05042","East Ryegate","VT","44.213499","-72.08037","-5","1"
+"05043","East Thetford","VT","43.795686","-72.21325","-5","1"
+"05045","Fairlee","VT","43.919887","-72.20655","-5","1"
+"05046","Groton","VT","44.254302","-72.22669","-5","1"
+"05047","Hartford","VT","43.672103","-72.355539","-5","1"
+"05048","Hartland","VT","43.566105","-72.39941","-5","1"
+"05049","Hartland Four Corners","VT","43.592039","-72.588407","-5","1"
+"05050","McIndoe Falls","VT","44.46239","-72.135804","-5","1"
+"05051","Newbury","VT","44.075132","-72.07174","-5","1"
+"05052","North Hartland","VT","43.598261","-72.351","-5","1"
+"05053","North Pomfret","VT","43.714887","-72.49886","-5","1"
+"05054","North Thetford","VT","43.852619","-72.18798","-5","1"
+"05055","Norwich","VT","43.735335","-72.29086","-5","1"
+"05056","Plymouth","VT","43.531612","-72.72179","-5","1"
+"05058","Post Mills","VT","43.884626","-72.26075","-5","1"
+"05059","Quechee","VT","43.649153","-72.42943","-5","1"
+"05060","Randolph","VT","43.954353","-72.66916","-5","1"
+"05061","Randolph Center","VT","43.928369","-72.5731","-5","1"
+"05062","Reading","VT","43.485715","-72.5536","-5","1"
+"05065","Sharon","VT","43.775807","-72.42387","-5","1"
+"05067","South Pomfret","VT","43.687515","-72.54272","-5","1"
+"05068","South Royalton","VT","43.808623","-72.53208","-5","1"
+"05069","South Ryegate","VT","44.168111","-72.14245","-5","1"
+"05070","South Strafford","VT","43.830375","-72.36228","-5","1"
+"05071","South Woodstock","VT","43.568095","-72.55327","-5","1"
+"05072","Strafford","VT","43.890244","-72.39364","-5","1"
+"05073","Taftsville","VT","43.625216","-72.47756","-5","1"
+"05074","Thetford","VT","43.815621","-72.22275","-5","1"
+"05075","Thetford Center","VT","43.83178","-72.27125","-5","1"
+"05076","East Corinth","VT","44.128666","-72.2345","-5","1"
+"05077","Tunbridge","VT","43.897183","-72.4848","-5","1"
+"05079","Vershire","VT","43.948258","-72.32092","-5","1"
+"05080","Hartford","VT","43.716375","-72.403244","-5","1"
+"05081","Wells River","VT","44.135828","-72.09061","-5","1"
+"05083","West Fairlee","VT","43.910089","-72.26637","-5","1"
+"05084","West Hartford","VT","43.720826","-72.43372","-5","1"
+"05085","West Newbury","VT","44.062646","-72.13946","-5","1"
+"05086","West Topsham","VT","44.116731","-72.31915","-5","1"
+"05088","Wilder","VT","43.676947","-72.3082","-5","1"
+"05089","Windsor","VT","43.486791","-72.42611","-5","1"
+"05091","Woodstock","VT","43.631076","-72.53739","-5","1"
+"05101","Bellows Falls","VT","43.156451","-72.4729","-5","1"
+"05124","Cavendish","VT","43.441399","-72.533124","-5","1"
+"05141","Cambridgeport","VT","42.99467","-72.720362","-5","1"
+"05142","Cavendish","VT","43.40422","-72.59048","-5","1"
+"05143","Chester","VT","43.26449","-72.61831","-5","1"
+"05144","Chester Depot","VT","43.592039","-72.588407","-5","1"
+"05146","Grafton","VT","43.186044","-72.61661","-5","1"
+"05148","Londonderry","VT","43.238921","-72.80106","-5","1"
+"05149","Ludlow","VT","43.416827","-72.70416","-5","1"
+"05150","North Springfield","VT","43.334787","-72.53053","-5","1"
+"05151","Perkinsville","VT","43.380411","-72.49397","-5","1"
+"05152","Peru","VT","43.24283","-72.88309","-5","1"
+"05153","Proctorsville","VT","43.439302","-72.63738","-5","1"
+"05154","Saxtons River","VT","43.139961","-72.50844","-5","1"
+"05155","South Londonderry","VT","43.158484","-72.84497","-5","1"
+"05156","Springfield","VT","43.300126","-72.47767","-5","1"
+"05158","Westminster","VT","43.093695","-72.45054","-5","1"
+"05159","Westminster Station","VT","43.093972","-72.456492","-5","1"
+"05161","Weston","VT","43.303613","-72.79134","-5","1"
+"05201","Bennington","VT","42.882231","-73.17873","-5","1"
+"05210","Woodford","VT","42.886696","-73.012715","-5","1"
+"05219","Barnet","VT","44.352579","-72.031815","-5","1"
+"05233","Sudbury","VT","43.761499","-73.187699","-5","1"
+"05250","Arlington","VT","43.106492","-73.17405","-5","1"
+"05251","Dorset","VT","43.266886","-73.11308","-5","1"
+"05252","East Arlington","VT","43.065891","-73.07824","-5","1"
+"05253","East Dorset","VT","43.243449","-73.00758","-5","1"
+"05254","Manchester","VT","43.162074","-73.07155","-5","1"
+"05255","Manchester Center","VT","43.172699","-73.05261","-5","1"
+"05257","North Bennington","VT","42.936801","-73.24838","-5","1"
+"05260","North Pownal","VT","42.797636","-73.25716","-5","1"
+"05261","Pownal","VT","42.776384","-73.21395","-5","1"
+"05262","Shaftsbury","VT","42.977018","-73.16602","-5","1"
+"05267","Sutton","VT","44.6877","-72.011815","-5","1"
+"05286","Craftsbury","VT","44.627698","-72.434398","-5","1"
+"05301","Brattleboro","VT","42.849957","-72.62328","-5","1"
+"05302","Brattleboro","VT","42.99467","-72.720362","-5","1"
+"05303","Brattleboro","VT","42.99467","-72.720362","-5","1"
+"05304","Brattleboro","VT","42.99467","-72.720362","-5","1"
+"05340","Bondville","VT","43.15601","-72.91347","-5","1"
+"05341","East Dover","VT","42.952754","-72.79694","-5","1"
+"05342","Jacksonville","VT","42.781648","-72.80609","-5","1"
+"05343","Jamaica","VT","43.103191","-72.7925","-5","1"
+"05344","Marlboro","VT","42.851149","-72.74073","-5","1"
+"05345","Newfane","VT","43.003271","-72.65777","-5","1"
+"05346","Putney","VT","43.02419","-72.51725","-5","1"
+"05350","Readsboro","VT","42.779542","-72.96146","-5","1"
+"05351","South Newfane","VT","42.934798","-72.75062","-5","1"
+"05352","Readsboro","VT","42.765401","-73.06025","-5","1"
+"05353","Townshend","VT","43.04943","-72.66643","-5","1"
+"05354","Vernon","VT","42.768143","-72.51835","-5","1"
+"05355","Wardsboro","VT","43.034152","-72.80748","-5","1"
+"05356","West Dover","VT","42.952974","-72.87237","-5","1"
+"05357","West Dummerston","VT","42.957233","-72.62408","-5","1"
+"05358","West Halifax","VT","42.77448","-72.71702","-5","1"
+"05359","West Townshend","VT","43.149377","-72.72492","-5","1"
+"05360","West Wardsboro","VT","43.028157","-72.87914","-5","1"
+"05361","Whitingham","VT","42.782281","-72.86962","-5","1"
+"05362","Williamsville","VT","42.9445","-72.69222","-5","1"
+"05363","Wilmington","VT","42.886921","-72.86457","-5","1"
+"05364","Westminster","VT","43.061436","-72.51888","-5","1"
+"05401","Burlington","VT","44.484038","-73.22126","-5","1"
+"05402","Burlington","VT","44.442117","-73.082525","-5","1"
+"05403","South Burlington","VT","44.451941","-73.17941","-5","1"
+"05404","Winooski","VT","44.494999","-73.18259","-5","1"
+"05405","Burlington","VT","44.442117","-73.082525","-5","1"
+"05406","Burlington","VT","44.442117","-73.082525","-5","1"
+"05407","South Burlington","VT","44.442117","-73.082525","-5","1"
+"05418","Fletcher","VT","44.738007","-72.87814","-5","1"
+"05433","Lincoln","VT","44.039878","-73.015358","-5","1"
+"05439","Colchester","VT","44.49518","-73.165092","-5","1"
+"05440","Alburg","VT","44.966836","-73.27028","-5","1"
+"05441","Bakersfield","VT","44.772886","-72.78854","-5","1"
+"05442","Belvidere Center","VT","44.755398","-72.68029","-5","1"
+"05443","Bristol","VT","44.129002","-73.05258","-5","1"
+"05444","Cambridge","VT","44.645649","-72.90151","-5","1"
+"05445","Charlotte","VT","44.309241","-73.23504","-5","1"
+"05446","Colchester","VT","44.541902","-73.19659","-5","1"
+"05447","East Berkshire","VT","44.824855","-72.895849","-5","1"
+"05448","East Fairfield","VT","44.751801","-72.88247","-5","1"
+"05449","Colchester","VT","44.442117","-73.082525","-5","1"
+"05450","Enosburg Falls","VT","44.885689","-72.78992","-5","1"
+"05451","Essex","VT","44.50835","-73.050271","-5","1"
+"05452","Essex Junction","VT","44.501991","-73.09376","-5","1"
+"05453","Essex Junction","VT","44.442117","-73.082525","-5","1"
+"05454","Fairfax","VT","44.693805","-73.04099","-5","1"
+"05455","Fairfield","VT","44.801734","-72.96213","-5","1"
+"05456","Ferrisburg","VT","44.204926","-73.25143","-5","1"
+"05457","Franklin","VT","44.961552","-72.89351","-5","1"
+"05458","Grand Isle","VT","44.712593","-73.30526","-5","1"
+"05459","Highgate Center","VT","44.941617","-73.03056","-5","1"
+"05460","Highgate Springs","VT","44.974765","-73.105205","-5","1"
+"05461","Hinesburg","VT","44.332217","-73.09254","-5","1"
+"05462","Huntington","VT","44.304004","-72.97999","-5","1"
+"05463","Isle La Motte","VT","44.866344","-73.33081","-5","1"
+"05464","Jeffersonville","VT","44.636283","-72.82257","-5","1"
+"05465","Jericho","VT","44.486113","-72.96317","-5","1"
+"05466","Jonesville","VT","44.362504","-73.019801","-5","1"
+"05468","Milton","VT","44.641974","-73.13469","-5","1"
+"05469","Monkton","VT","44.240375","-73.134702","-5","1"
+"05470","Montgomery","VT","44.824855","-72.895849","-5","1"
+"05471","Montgomery Center","VT","44.874895","-72.58798","-5","1"
+"05472","New Haven","VT","44.121825","-73.166","-5","1"
+"05473","North Ferrisburg","VT","44.255574","-73.22253","-5","1"
+"05474","North Hero","VT","44.831101","-73.27354","-5","1"
+"05476","Richford","VT","44.970417","-72.66316","-5","1"
+"05477","Richmond","VT","44.392443","-72.95936","-5","1"
+"05478","Saint Albans","VT","44.807555","-73.09077","-5","1"
+"05479","Saint Albans","VT","44.824855","-72.895849","-5","1"
+"05481","Saint Albans Bay","VT","44.824855","-72.895849","-5","1"
+"05482","Shelburne","VT","44.388556","-73.22318","-5","1"
+"05483","Sheldon","VT","44.884125","-72.9751","-5","1"
+"05485","Sheldon Springs","VT","44.905573","-72.963154","-5","1"
+"05486","South Hero","VT","44.645192","-73.31452","-5","1"
+"05487","Starksboro","VT","44.224103","-73.03164","-5","1"
+"05488","Swanton","VT","44.930163","-73.12099","-5","1"
+"05489","Underhill","VT","44.546538","-72.92649","-5","1"
+"05490","Underhill Center","VT","44.504656","-72.885253","-5","1"
+"05491","Vergennes","VT","44.12753","-73.28437","-5","1"
+"05492","Waterville","VT","44.708468","-72.7585","-5","1"
+"05494","Westford","VT","44.608283","-73.00979","-5","1"
+"05495","Williston","VT","44.44524","-73.09917","-5","1"
+"05501","Andover","MA","42.647191","-71.184202","-5","1"
+"05544","Andover","MA","42.647191","-71.184202","-5","1"
+"05601","Montpelier","VT","44.19906","-72.559638","-5","1"
+"05602","Montpelier","VT","44.265633","-72.59686","-5","1"
+"05603","Montpelier","VT","44.156554","-72.655892","-5","1"
+"05604","Montpelier","VT","44.259518","-72.585018","-5","1"
+"05609","Montpelier","VT","44.259518","-72.585018","-5","1"
+"05620","Montpelier","VT","44.259518","-72.585018","-5","1"
+"05626","Waterbury","VT","44.352339","-72.779614","-5","1"
+"05633","Montpelier","VT","44.259518","-72.585018","-5","1"
+"05640","Adamant","VT","44.354296","-72.49053","-5","1"
+"05641","Barre","VT","44.194307","-72.49443","-5","1"
+"05647","Cabot","VT","44.414576","-72.28652","-5","1"
+"05648","Calais","VT","44.375726","-72.49509","-5","1"
+"05649","East Barre","VT","44.152477","-72.43328","-5","1"
+"05650","East Calais","VT","44.403899","-72.44328","-5","1"
+"05651","East Montpelier","VT","44.282269","-72.48983","-5","1"
+"05652","Eden","VT","44.715079","-72.5717","-5","1"
+"05653","Eden Mills","VT","44.711083","-72.50846","-5","1"
+"05654","Graniteville","VT","44.140716","-72.47675","-5","1"
+"05655","Hyde Park","VT","44.610931","-72.59971","-5","1"
+"05656","Johnson","VT","44.645219","-72.67941","-5","1"
+"05657","Lake Elmore","VT","44.541415","-72.52693","-5","1"
+"05658","Marshfield","VT","44.353823","-72.34925","-5","1"
+"05660","Moretown","VT","44.248198","-72.78525","-5","1"
+"05661","Morrisville","VT","44.549391","-72.60332","-5","1"
+"05662","Moscow","VT","44.442001","-72.718759","-5","1"
+"05663","Northfield","VT","44.141056","-72.66443","-5","1"
+"05664","Northfield Falls","VT","44.171238","-72.64976","-5","1"
+"05665","North Hyde Park","VT","44.67307","-72.597057","-5","1"
+"05666","North Montpelier","VT","44.33865","-72.44382","-5","1"
+"05667","Plainfield","VT","44.295577","-72.42365","-5","1"
+"05669","Roxbury","VT","44.062311","-72.74364","-5","1"
+"05670","South Barre","VT","44.175744","-72.50247","-5","1"
+"05671","Waterbury","VT","44.259518","-72.585018","-5","1"
+"05672","Stowe","VT","44.475387","-72.70225","-5","1"
+"05673","Waitsfield","VT","44.184704","-72.8367","-5","1"
+"05674","Warren","VT","44.106922","-72.85816","-5","1"
+"05675","Washington","VT","44.083457","-72.422","-5","1"
+"05676","Waterbury","VT","44.348486","-72.77081","-5","1"
+"05677","Waterbury Center","VT","44.375144","-72.71362","-5","1"
+"05678","Websterville","VT","44.158979","-72.46942","-5","1"
+"05679","Williamstown","VT","44.109793","-72.54155","-5","1"
+"05680","Wolcott","VT","44.551056","-72.4739","-5","1"
+"05681","Woodbury","VT","44.457481","-72.40659","-5","1"
+"05682","Worcester","VT","44.383559","-72.55088","-5","1"
+"05701","Rutland","VT","43.617302","-72.96325","-5","1"
+"05702","Rutland","VT","43.412792","-72.990632","-5","1"
+"05730","Belmont","VT","43.416666","-72.83445","-5","1"
+"05731","Benson","VT","43.687677","-73.291868","-5","1"
+"05732","Bomoseen","VT","43.644208","-73.20284","-5","1"
+"05733","Brandon","VT","43.810371","-73.09998","-5","1"
+"05734","Bridport","VT","43.987529","-73.35144","-5","1"
+"05735","Castleton","VT","43.640503","-73.16118","-5","1"
+"05736","Center Rutland","VT","43.602211","-73.01298","-5","1"
+"05737","Chittenden","VT","43.735819","-72.93145","-5","1"
+"05738","Cuttingsville","VT","43.507854","-72.8642","-5","1"
+"05739","Danby","VT","43.341177","-73.01602","-5","1"
+"05740","East Middlebury","VT","43.97153","-73.091416","-5","1"
+"05741","East Poultney","VT","43.592039","-72.818121","-5","1"
+"05742","East Wallingford","VT","43.441404","-72.88507","-5","1"
+"05743","Fair Haven","VT","43.666758","-73.2857","-5","1"
+"05744","Florence","VT","43.68805","-73.06783","-5","1"
+"05745","Forest Dale","VT","43.592039","-72.818121","-5","1"
+"05746","Gaysville","VT","43.785433","-72.71366","-5","1"
+"05747","Granville","VT","43.999811","-72.83927","-5","1"
+"05748","Hancock","VT","43.926595","-72.87143","-5","1"
+"05750","Hydeville","VT","43.619787","-73.23273","-5","1"
+"05751","Killington","VT","43.659839","-72.79419","-5","1"
+"05752","Poultney","VT","43.225264","-73.141318","-5","1"
+"05753","Middlebury","VT","44.006024","-73.172","-5","1"
+"05757","Middletown Springs","VT","43.477827","-73.12311","-5","1"
+"05758","Mount Holly","VT","43.452914","-72.79647","-5","1"
+"05759","North Clarendon","VT","43.553904","-72.96168","-5","1"
+"05760","Orwell","VT","43.801501","-73.2869","-5","1"
+"05761","Pawlet","VT","43.357161","-73.13467","-5","1"
+"05762","Pittsfield","VT","43.768578","-72.83138","-5","1"
+"05763","Pittsford","VT","43.719898","-73.00087","-5","1"
+"05764","Poultney","VT","43.521021","-73.21603","-5","1"
+"05765","Proctor","VT","43.657716","-73.0328","-5","1"
+"05766","Ripton","VT","43.981681","-73.0155","-5","1"
+"05767","Rochester","VT","43.876046","-72.81212","-5","1"
+"05768","Rupert","VT","43.026984","-73.055156","-5","1"
+"05769","Salisbury","VT","43.914026","-73.10703","-5","1"
+"05770","Shoreham","VT","43.892373","-73.31583","-5","1"
+"05772","Stockbridge","VT","43.761779","-72.73703","-5","1"
+"05773","Wallingford","VT","43.444268","-72.98732","-5","1"
+"05774","Wells","VT","43.43357","-73.19578","-5","1"
+"05775","West Pawlet","VT","43.365073","-73.23612","-5","1"
+"05776","West Rupert","VT","43.235771","-73.2489","-5","1"
+"05777","West Rutland","VT","43.574326","-73.04215","-5","1"
+"05778","Whiting","VT","43.864419","-73.21148","-5","1"
+"05801","White River Junction","VT","43.898246","-72.183633","-5","1"
+"05819","Saint Johnsbury","VT","44.412413","-72.00996","-5","1"
+"05820","Albany","VT","44.733624","-72.38308","-5","1"
+"05821","Barnet","VT","44.311706","-72.10346","-5","1"
+"05822","Barton","VT","44.750509","-72.16376","-5","1"
+"05823","Beebe Plain","VT","45.005783","-72.138347","-5","1"
+"05824","Concord","VT","44.428537","-71.87212","-5","1"
+"05825","Coventry","VT","44.863351","-72.26649","-5","1"
+"05826","Craftsbury","VT","44.647068","-72.3887","-5","1"
+"05827","Craftsbury Common","VT","44.678879","-72.35975","-5","1"
+"05828","Danville","VT","44.424043","-72.12808","-5","1"
+"05829","Derby","VT","44.945925","-72.09864","-5","1"
+"05830","Derby Line","VT","44.985004","-72.05857","-5","1"
+"05832","East Burke","VT","44.588911","-71.92705","-5","1"
+"05833","East Charleston","VT","44.82446","-71.969","-5","1"
+"05836","East Hardwick","VT","44.529915","-72.26819","-5","1"
+"05837","East Haven","VT","44.643171","-71.86394","-5","1"
+"05838","East Saint Johnsbury","VT","44.468494","-71.930077","-5","1"
+"05839","Glover","VT","44.684488","-72.20936","-5","1"
+"05840","Granby","VT","44.612521","-71.71536","-5","1"
+"05841","Greensboro","VT","44.599177","-72.31179","-5","1"
+"05842","Greensboro Bend","VT","44.574196","-72.24333","-5","1"
+"05843","Hardwick","VT","44.504593","-72.35822","-5","1"
+"05845","Irasburg","VT","44.800462","-72.28964","-5","1"
+"05846","Island Pond","VT","44.803005","-71.84683","-5","1"
+"05847","Lowell","VT","44.799008","-72.45025","-5","1"
+"05848","Lower Waterford","VT","44.382103","-71.919518","-5","1"
+"05849","Lyndon","VT","44.497557","-71.950519","-5","1"
+"05850","Lyndon Center","VT","44.481915","-71.988258","-5","1"
+"05851","Lyndonville","VT","44.541352","-72.02686","-5","1"
+"05852","Newport","VT","44.951093","-72.303696","-5","1"
+"05853","Morgan","VT","44.881758","-71.96653","-5","1"
+"05855","Newport","VT","44.936237","-72.19921","-5","1"
+"05857","Newport Center","VT","44.944231","-72.30054","-5","1"
+"05858","North Concord","VT","44.498374","-71.83773","-5","1"
+"05859","North Troy","VT","44.963802","-72.41782","-5","1"
+"05860","Orleans","VT","44.815511","-72.15478","-5","1"
+"05861","Passumpsic","VT","44.46239","-72.135804","-5","1"
+"05862","Peacham","VT","44.46239","-72.135804","-5","1"
+"05863","Saint Johnsbury Center","VT","44.503403","-71.972088","-5","1"
+"05864","Stannard","VT","44.562138","-72.244107","-5","1"
+"05866","Sheffield","VT","44.632918","-72.13245","-5","1"
+"05867","Sutton","VT","44.653046","-72.04372","-5","1"
+"05868","Troy","VT","44.902837","-72.408","-5","1"
+"05871","West Burke","VT","44.673586","-71.95414","-5","1"
+"05872","West Charleston","VT","44.865723","-72.04647","-5","1"
+"05873","West Danville","VT","44.411321","-72.2123","-5","1"
+"05874","Westfield","VT","44.876447","-72.42902","-5","1"
+"05875","West Glover","VT","44.722453","-72.25602","-5","1"
+"05892","Derby","VT","44.91454","-72.112619","-5","1"
+"05901","Averill","VT","44.680771","-71.719436","-5","1"
+"05902","Beecher Falls","VT","45.008398","-71.50628","-5","1"
+"05903","Canaan","VT","44.972508","-71.59275","-5","1"
+"05904","Gilman","VT","44.413715","-71.70906","-5","1"
+"05905","Guildhall","VT","44.682269","-71.66238","-5","1"
+"05906","Lunenburg","VT","44.458803","-71.7162","-5","1"
+"05907","Norton","VT","44.959647","-71.81134","-5","1"
+"05928","Derby Center","VT","44.95282","-72.135369","-5","1"
+"05958","Mount Holly","VT","43.476669","-72.821555","-5","1"
+"06001","Avon","CT","41.789698","-72.86431","-5","1"
+"06002","Bloomfield","CT","41.832798","-72.72642","-5","1"
+"06006","Windsor","CT","41.879637","-72.734271","-5","1"
+"06010","Bristol","CT","41.682249","-72.93365","-5","1"
+"06011","Bristol","CT","41.791776","-72.718832","-5","1"
+"06013","Burlington","CT","41.758415","-72.94642","-5","1"
+"06016","Broad Brook","CT","41.909097","-72.54393","-5","1"
+"06018","Canaan","CT","42.02351","-73.31103","-5","1"
+"06019","Canton","CT","41.834247","-72.89174","-5","1"
+"06020","Canton Center","CT","41.864597","-72.91003","-5","1"
+"06021","Colebrook","CT","42.027797","-73.11835","-5","1"
+"06022","Collinsville","CT","41.832842","-72.92526","-5","1"
+"06023","East Berlin","CT","41.612748","-72.72017","-5","1"
+"06024","East Canaan","CT","42.010733","-73.26877","-5","1"
+"06025","East Glastonbury","CT","41.688896","-72.534482","-5","1"
+"06026","East Granby","CT","41.935501","-72.72718","-5","1"
+"06027","East Hartland","CT","42.002345","-72.90922","-5","1"
+"06028","East Windsor Hill","CT","41.859248","-72.603033","-5","1"
+"06029","Ellington","CT","41.909147","-72.45026","-5","1"
+"06030","Farmington","CT","41.791776","-72.718832","-5","1"
+"06031","Falls Village","CT","41.948694","-73.3296","-5","1"
+"06032","Farmington","CT","41.725195","-72.83032","-5","1"
+"06033","Glastonbury","CT","41.707932","-72.57085","-5","1"
+"06034","Farmington","CT","41.791776","-72.718832","-5","1"
+"06035","Granby","CT","41.959713","-72.79826","-5","1"
+"06037","Kensington","CT","41.619048","-72.76734","-5","1"
+"06039","Lakeville","CT","41.951783","-73.43722","-5","1"
+"06040","Manchester","CT","41.778888","-72.52384","-5","1"
+"06041","Manchester","CT","41.794681","-72.564832","-5","1"
+"06043","Bolton","CT","41.771265","-72.43669","-5","1"
+"06045","Manchester","CT","41.791776","-72.718832","-5","1"
+"06049","Melrose","CT","41.791776","-72.718832","-5","1"
+"06050","New Britain","CT","41.666049","-72.778391","-5","1"
+"06051","New Britain","CT","41.666249","-72.76996","-5","1"
+"06052","New Britain","CT","41.659099","-72.80129","-5","1"
+"06053","New Britain","CT","41.686949","-72.7908","-5","1"
+"06057","New Hartford","CT","41.852712","-73.00492","-5","1"
+"06058","Norfolk","CT","41.986861","-73.19437","-5","1"
+"06059","North Canton","CT","41.937513","-72.92017","-5","1"
+"06060","North Granby","CT","42.012195","-72.8445","-5","1"
+"06061","Pine Meadow","CT","41.874382","-72.967958","-5","1"
+"06062","Plainville","CT","41.671548","-72.86294","-5","1"
+"06063","Pleasant Valley","CT","41.926696","-72.96783","-5","1"
+"06064","Poquonock","CT","41.791776","-72.718832","-5","1"
+"06065","Riverton","CT","41.961127","-73.01859","-5","1"
+"06066","Vernon Rockville","CT","41.841615","-72.46708","-5","1"
+"06067","Rocky Hill","CT","41.660949","-72.66098","-5","1"
+"06068","Salisbury","CT","42.014673","-73.42408","-5","1"
+"06069","Sharon","CT","41.866222","-73.46331","-5","1"
+"06070","Simsbury","CT","41.874064","-72.81644","-5","1"
+"06071","Somers","CT","41.995851","-72.45336","-5","1"
+"06072","Somersville","CT","41.976466","-72.490593","-5","1"
+"06073","South Glastonbury","CT","41.660899","-72.56887","-5","1"
+"06074","South Windsor","CT","41.836665","-72.56076","-5","1"
+"06075","Stafford","CT","41.81152","-72.308779","-5","1"
+"06076","Stafford Springs","CT","41.979871","-72.27863","-5","1"
+"06077","Staffordville","CT","41.991645","-72.257735","-5","1"
+"06078","Suffield","CT","41.985946","-72.63897","-5","1"
+"06079","Taconic","CT","42.032012","-73.403763","-5","1"
+"06080","Suffield","CT","41.948597","-72.628802","-5","1"
+"06081","Tariffville","CT","41.907114","-72.76831","-5","1"
+"06082","Enfield","CT","41.987238","-72.56365","-5","1"
+"06083","Enfield","CT","41.791776","-72.718832","-5","1"
+"06084","Tolland","CT","41.87688","-72.36806","-5","1"
+"06085","Unionville","CT","41.749832","-72.8898","-5","1"
+"06087","Unionville","CT","41.757616","-72.884953","-5","1"
+"06088","East Windsor","CT","41.908464","-72.60547","-5","1"
+"06089","Weatogue","CT","41.839731","-72.81974","-5","1"
+"06090","West Granby","CT","41.953596","-72.85242","-5","1"
+"06091","West Hartland","CT","42.002748","-72.98906","-5","1"
+"06092","West Simsbury","CT","41.861297","-72.86055","-5","1"
+"06093","West Suffield","CT","42.019907","-72.73357","-5","1"
+"06094","Winchester Center","CT","41.896321","-73.146312","-5","1"
+"06095","Windsor","CT","41.857303","-72.66654","-5","1"
+"06096","Windsor Locks","CT","41.926997","-72.64688","-5","1"
+"06098","Winsted","CT","41.925967","-73.06944","-5","1"
+"06101","Hartford","CT","41.78007","-72.677099","-5","1"
+"06102","Hartford","CT","41.791776","-72.718832","-5","1"
+"06103","Hartford","CT","41.767049","-72.67433","-5","1"
+"06104","Hartford","CT","41.791776","-72.718832","-5","1"
+"06105","Hartford","CT","41.771166","-72.70255","-5","1"
+"06106","Hartford","CT","41.7469","-72.69593","-5","1"
+"06107","W Hartford","CT","41.75275","-72.7546","-5","1"
+"06108","East Hartford","CT","41.778316","-72.62313","-5","1"
+"06109","Wethersfield","CT","41.702049","-72.6747","-5","1"
+"06110","W Hartford","CT","41.7313","-72.73374","-5","1"
+"06111","Newington","CT","41.688899","-72.73101","-5","1"
+"06112","Hartford","CT","41.793299","-72.6954","-5","1"
+"06114","Hartford","CT","41.7387","-72.67889","-5","1"
+"06115","Hartford","CT","41.758849","-72.679387","-5","1"
+"06117","W Hartford","CT","41.791399","-72.74853","-5","1"
+"06118","East Hartford","CT","41.745349","-72.60807","-5","1"
+"06119","W Hartford","CT","41.76255","-72.72839","-5","1"
+"06120","Hartford","CT","41.784794","-72.67378","-5","1"
+"06123","Hartford","CT","41.791776","-72.718832","-5","1"
+"06126","Hartford","CT","41.791776","-72.718832","-5","1"
+"06127","W Hartford","CT","41.791776","-72.718832","-5","1"
+"06128","East Hartford","CT","41.791776","-72.718832","-5","1"
+"06129","Wethersfield","CT","41.791776","-72.718832","-5","1"
+"06131","Newington","CT","41.791776","-72.718832","-5","1"
+"06132","Hartford","CT","41.791776","-72.718832","-5","1"
+"06133","W Hartford","CT","41.791776","-72.718832","-5","1"
+"06134","Hartford","CT","41.791776","-72.718832","-5","1"
+"06137","W Hartford","CT","41.791776","-72.718832","-5","1"
+"06138","East Hartford","CT","41.791776","-72.718832","-5","1"
+"06140","Hartford","CT","41.791776","-72.718832","-5","1"
+"06141","Hartford","CT","41.791776","-72.718832","-5","1"
+"06142","Hartford","CT","41.791776","-72.718832","-5","1"
+"06143","Hartford","CT","41.791776","-72.718832","-5","1"
+"06144","Hartford","CT","41.791776","-72.718832","-5","1"
+"06145","Hartford","CT","41.791776","-72.718832","-5","1"
+"06146","Hartford","CT","41.791776","-72.718832","-5","1"
+"06147","Hartford","CT","41.791776","-72.718832","-5","1"
+"06150","Hartford","CT","41.791776","-72.718832","-5","1"
+"06151","Hartford","CT","41.791776","-72.718832","-5","1"
+"06152","Hartford","CT","41.791776","-72.718832","-5","1"
+"06153","Hartford","CT","41.791776","-72.718832","-5","1"
+"06154","Hartford","CT","41.771499","-72.686687","-5","1"
+"06155","Hartford","CT","41.76928","-72.686465","-5","1"
+"06156","Hartford","CT","41.767949","-72.690687","-5","1"
+"06160","Hartford","CT","41.766499","-72.693337","-5","1"
+"06161","Hartford","CT","41.766049","-72.671837","-5","1"
+"06167","Hartford","CT","41.791776","-72.718832","-5","1"
+"06176","Hartford","CT","41.791776","-72.718832","-5","1"
+"06180","Hartford","CT","41.791776","-72.718832","-5","1"
+"06183","Hartford","CT","41.763849","-72.673037","-5","1"
+"06199","Hartford","CT","41.927447","-72.680386","-5","1"
+"06226","Willimantic","CT","41.714867","-72.20934","-5","1"
+"06230","Abington","CT","41.847302","-72.02528","-5","1"
+"06231","Amston","CT","41.629818","-72.36419","-5","1"
+"06232","Andover","CT","41.737015","-72.37151","-5","1"
+"06233","Ballouville","CT","41.831565","-72.020137","-5","1"
+"06234","Brooklyn","CT","41.782474","-71.95989","-5","1"
+"06235","Chaplin","CT","41.809166","-72.11274","-5","1"
+"06237","Columbia","CT","41.702777","-72.29349","-5","1"
+"06238","Coventry","CT","41.778651","-72.33137","-5","1"
+"06239","Danielson","CT","41.799111","-71.87594","-5","1"
+"06241","Dayville","CT","41.850225","-71.85749","-5","1"
+"06242","Eastford","CT","41.90913","-72.09527","-5","1"
+"06243","East Killingly","CT","41.844885","-71.818941","-5","1"
+"06244","East Woodstock","CT","41.984327","-71.981045","-5","1"
+"06245","Fabyan","CT","42.019776","-71.941669","-5","1"
+"06246","Grosvenor Dale","CT","41.971116","-71.891732","-5","1"
+"06247","Hampton","CT","41.767929","-72.06127","-5","1"
+"06248","Hebron","CT","41.683399","-72.40144","-5","1"
+"06249","Lebanon","CT","41.618403","-72.24215","-5","1"
+"06250","Mansfield Center","CT","41.768455","-72.20007","-5","1"
+"06251","Mansfield Depot","CT","41.799326","-72.306526","-5","1"
+"06254","North Franklin","CT","41.609066","-72.14439","-5","1"
+"06255","North Grosvenordale","CT","41.989579","-71.89659","-5","1"
+"06256","North Windham","CT","41.758713","-72.13964","-5","1"
+"06258","Pomfret","CT","41.889048","-71.968232","-5","1"
+"06259","Pomfret Center","CT","41.876565","-71.98252","-5","1"
+"06260","Putnam","CT","41.913816","-71.88434","-5","1"
+"06262","Quinebaug","CT","42.022904","-71.94671","-5","1"
+"06263","Rogers","CT","41.839051","-71.90634","-5","1"
+"06264","Scotland","CT","41.693435","-72.09891","-5","1"
+"06265","South Willington","CT","41.81152","-72.308779","-5","1"
+"06266","South Windham","CT","41.670349","-72.16028","-5","1"
+"06267","South Woodstock","CT","41.943902","-71.945253","-5","1"
+"06268","Storrs Mansfield","CT","41.806041","-72.26127","-5","1"
+"06269","Storrs Mansfield","CT","41.80743","-72.25025","-5","1"
+"06277","Thompson","CT","41.972782","-71.83969","-5","1"
+"06278","Ashford","CT","41.895108","-72.17674","-5","1"
+"06279","Willington","CT","41.896875","-72.27456","-5","1"
+"06280","Windham","CT","41.697765","-72.14671","-5","1"
+"06281","Woodstock","CT","41.971403","-71.99872","-5","1"
+"06282","Woodstock Valley","CT","41.943199","-72.0728","-5","1"
+"06320","New London","CT","41.352498","-72.10338","-5","1"
+"06330","Baltic","CT","41.634556","-72.06549","-5","1"
+"06331","Canterbury","CT","41.697123","-72.0029","-5","1"
+"06332","Central Village","CT","41.725694","-71.909019","-5","1"
+"06333","East Lyme","CT","41.371913","-72.2269","-5","1"
+"06334","Bozrah","CT","41.543559","-72.17684","-5","1"
+"06335","Gales Ferry","CT","41.426775","-72.07227","-5","1"
+"06336","Gilman","CT","41.577198","-72.20036","-5","1"
+"06337","Glasgo","CT","41.559873","-71.889199","-5","1"
+"06339","Ledyard","CT","41.449482","-71.98233","-5","1"
+"06340","Groton","CT","41.345331","-72.04524","-5","1"
+"06349","Groton","CT","41.39973","-72.090357","-5","1"
+"06350","Hanover","CT","41.644546","-72.06769","-5","1"
+"06351","Jewett City","CT","41.604341","-71.97599","-5","1"
+"06353","Montville","CT","41.452548","-72.137471","-5","1"
+"06354","Moosup","CT","41.71836","-71.87098","-5","1"
+"06355","Mystic","CT","41.360798","-71.97281","-5","1"
+"06357","Niantic","CT","41.319649","-72.21064","-5","1"
+"06359","North Stonington","CT","41.456189","-71.86813","-5","1"
+"06360","Norwich","CT","41.533848","-72.06232","-5","1"
+"06365","Preston","CT","41.509586","-71.96621","-5","1"
+"06370","Oakdale","CT","41.464274","-72.19551","-5","1"
+"06371","Old Lyme","CT","41.339421","-72.31008","-5","1"
+"06372","Old Mystic","CT","41.388216","-71.949548","-5","1"
+"06373","Oneco","CT","41.678897","-71.79952","-5","1"
+"06374","Plainfield","CT","41.684777","-71.91911","-5","1"
+"06375","Quaker Hill","CT","41.401398","-72.11444","-5","1"
+"06376","South Lyme","CT","41.294797","-72.25602","-5","1"
+"06377","Sterling","CT","41.730575","-71.81845","-5","1"
+"06378","Stonington","CT","41.351307","-71.91317","-5","1"
+"06379","Pawcatuck","CT","41.375701","-71.84876","-5","1"
+"06380","Taftville","CT","41.566298","-72.05148","-5","1"
+"06382","Uncasville","CT","41.457198","-72.11459","-5","1"
+"06383","Versailles","CT","41.601648","-72.04037","-5","1"
+"06384","Voluntown","CT","41.5787","-71.85668","-5","1"
+"06385","Waterford","CT","41.347948","-72.14762","-5","1"
+"06386","Waterford","CT","41.464758","-72.127301","-5","1"
+"06387","Wauregan","CT","41.744527","-71.913339","-5","1"
+"06388","West Mystic","CT","41.344098","-71.976467","-5","1"
+"06389","Yantic","CT","41.559648","-72.122672","-5","1"
+"06390","Fishers Island","NY","41.261936","-72.00708","-5","1"
+"06401","Ansonia","CT","41.34269","-73.07446","-5","1"
+"06403","Beacon Falls","CT","41.432936","-73.06453","-5","1"
+"06404","Botsford","CT","41.165097","-73.129186","-5","1"
+"06405","Branford","CT","41.277763","-72.80542","-5","1"
+"06408","Cheshire","CT","41.365709","-72.927507","-5","1"
+"06409","Centerbrook","CT","41.353453","-72.41604","-5","1"
+"06410","Cheshire","CT","41.507049","-72.90489","-5","1"
+"06411","Cheshire","CT","41.550097","-72.922235","-5","1"
+"06412","Chester","CT","41.408775","-72.47213","-5","1"
+"06413","Clinton","CT","41.288599","-72.52728","-5","1"
+"06414","Cobalt","CT","41.566668","-72.558055","-5","1"
+"06415","Colchester","CT","41.56033","-72.33795","-5","1"
+"06416","Cromwell","CT","41.612046","-72.66998","-5","1"
+"06417","Deep River","CT","41.37934","-72.44578","-5","1"
+"06418","Derby","CT","41.323005","-73.08433","-5","1"
+"06419","Killingworth","CT","41.380594","-72.57637","-5","1"
+"06420","Salem","CT","41.485469","-72.25445","-5","1"
+"06422","Durham","CT","41.461639","-72.68733","-5","1"
+"06423","East Haddam","CT","41.468451","-72.40615","-5","1"
+"06424","East Hampton","CT","41.573008","-72.5078","-5","1"
+"06426","Essex","CT","41.351598","-72.39787","-5","1"
+"06430","Fairfield","CT","41.163445","-73.2629","-5","1"
+"06431","Fairfield","CT","41.219093","-73.252696","-5","1"
+"06432","Fairfield","CT","41.189646","-73.23576","-5","1"
+"06436","Greens Farms","CT","41.308873","-73.363661","-5","1"
+"06437","Guilford","CT","41.31353","-72.69791","-5","1"
+"06438","Haddam","CT","41.45307","-72.50345","-5","1"
+"06439","Hadlyme","CT","41.421198","-72.414095","-5","1"
+"06440","Hawleyville","CT","41.308873","-73.363661","-5","1"
+"06441","Higganum","CT","41.468654","-72.57956","-5","1"
+"06442","Ivoryton","CT","41.345099","-72.44392","-5","1"
+"06443","Madison","CT","41.298648","-72.60938","-5","1"
+"06444","Marion","CT","41.791776","-72.718832","-5","1"
+"06447","Marlborough","CT","41.637066","-72.46252","-5","1"
+"06450","Meriden","CT","41.532048","-72.78145","-5","1"
+"06451","Meriden","CT","41.536048","-72.81973","-5","1"
+"06454","Meriden","CT","41.365709","-72.927507","-5","1"
+"06455","Middlefield","CT","41.514383","-72.7183","-5","1"
+"06456","Middle Haddam","CT","41.538017","-72.525208","-5","1"
+"06457","Middletown","CT","41.553672","-72.6632","-5","1"
+"06459","Middletown","CT","41.556463","-72.658179","-5","1"
+"06460","Milford","CT","41.21953","-73.0554","-5","1"
+"06467","Milldale","CT","41.565697","-72.903746","-5","1"
+"06468","Monroe","CT","41.336046","-73.22241","-5","1"
+"06469","Moodus","CT","41.506499","-72.44479","-5","1"
+"06470","Newtown","CT","41.398462","-73.31474","-5","1"
+"06471","North Branford","CT","41.332197","-72.77214","-5","1"
+"06472","Northford","CT","41.399873","-72.77975","-5","1"
+"06473","North Haven","CT","41.378447","-72.85897","-5","1"
+"06474","North Westchester","CT","41.464758","-72.127301","-5","1"
+"06475","Old Saybrook","CT","41.289348","-72.38285","-5","1"
+"06477","Orange","CT","41.279547","-73.02541","-5","1"
+"06478","Oxford","CT","41.428163","-73.12729","-5","1"
+"06479","Plantsville","CT","41.575847","-72.89696","-5","1"
+"06480","Portland","CT","41.588297","-72.60384","-5","1"
+"06481","Rockfall","CT","41.536643","-72.69782","-5","1"
+"06482","Sandy Hook","CT","41.411536","-73.24888","-5","1"
+"06483","Seymour","CT","41.386584","-73.0792","-5","1"
+"06484","Shelton","CT","41.306396","-73.1292","-5","1"
+"06487","South Britain","CT","41.365709","-72.927507","-5","1"
+"06488","Southbury","CT","41.475263","-73.22184","-5","1"
+"06489","Southington","CT","41.612298","-72.87103","-5","1"
+"06490","Southport","CT","41.140646","-73.28791","-5","1"
+"06491","Stevenson","CT","41.386646","-73.187207","-5","1"
+"06492","Wallingford","CT","41.457711","-72.81704","-5","1"
+"06493","Wallingford","CT","41.365709","-72.927507","-5","1"
+"06494","Wallingford","CT","41.365709","-72.927507","-5","1"
+"06497","Stratford","CT","41.207146","-73.130503","-5","1"
+"06498","Westbrook","CT","41.289499","-72.46087","-5","1"
+"06501","New Haven","CT","41.365709","-72.927507","-5","1"
+"06502","New Haven","CT","41.365709","-72.927507","-5","1"
+"06503","New Haven","CT","41.365709","-72.927507","-5","1"
+"06504","New Haven","CT","41.304697","-72.93561","-5","1"
+"06505","New Haven","CT","41.305721","-72.779901","-5","1"
+"06506","New Haven","CT","41.365709","-72.927507","-5","1"
+"06507","New Haven","CT","41.365709","-72.927507","-5","1"
+"06508","New Haven","CT","41.365709","-72.927507","-5","1"
+"06509","New Haven","CT","41.365709","-72.927507","-5","1"
+"06510","New Haven","CT","41.306197","-72.92479","-5","1"
+"06511","New Haven","CT","41.317197","-72.92798","-5","1"
+"06512","East Haven","CT","41.276497","-72.87412","-5","1"
+"06513","New Haven","CT","41.315797","-72.8803","-5","1"
+"06514","Hamden","CT","41.357947","-72.93765","-5","1"
+"06515","New Haven","CT","41.327997","-72.96902","-5","1"
+"06516","West Haven","CT","41.272147","-72.96496","-5","1"
+"06517","Hamden","CT","41.348297","-72.90712","-5","1"
+"06518","Hamden","CT","41.413114","-72.90409","-5","1"
+"06519","New Haven","CT","41.295197","-72.93673","-5","1"
+"06520","New Haven","CT","41.365709","-72.927507","-5","1"
+"06521","New Haven","CT","41.365709","-72.927507","-5","1"
+"06524","Bethany","CT","41.417896","-73.00356","-5","1"
+"06525","Woodbridge","CT","41.352964","-73.01212","-5","1"
+"06530","New Haven","CT","41.365709","-72.927507","-5","1"
+"06531","New Haven","CT","41.365709","-72.927507","-5","1"
+"06532","New Haven","CT","41.365709","-72.927507","-5","1"
+"06533","New Haven","CT","41.365709","-72.927507","-5","1"
+"06534","New Haven","CT","41.365709","-72.927507","-5","1"
+"06535","New Haven","CT","41.365709","-72.927507","-5","1"
+"06536","New Haven","CT","41.365709","-72.927507","-5","1"
+"06537","New Haven","CT","41.365709","-72.927507","-5","1"
+"06538","New Haven","CT","41.365709","-72.927507","-5","1"
+"06540","New Haven","CT","41.299647","-72.918846","-5","1"
+"06601","Bridgeport","CT","41.308873","-73.363661","-5","1"
+"06602","Bridgeport","CT","41.179846","-73.189006","-5","1"
+"06604","Bridgeport","CT","41.178696","-73.20004","-5","1"
+"06605","Bridgeport","CT","41.163596","-73.21633","-5","1"
+"06606","Bridgeport","CT","41.209496","-73.20771","-5","1"
+"06607","Bridgeport","CT","41.177646","-73.16649","-5","1"
+"06608","Bridgeport","CT","41.188746","-73.1813","-5","1"
+"06610","Bridgeport","CT","41.202091","-73.1708","-5","1"
+"06611","Trumbull","CT","41.256129","-73.21227","-5","1"
+"06612","Easton","CT","41.253946","-73.28842","-5","1"
+"06614","Stratford","CT","41.219246","-73.13221","-5","1"
+"06615","Stratford","CT","41.175947","-73.13515","-5","1"
+"06650","Bridgeport","CT","41.308873","-73.363661","-5","1"
+"06673","Bridgeport","CT","41.308873","-73.363661","-5","1"
+"06699","Bridgeport","CT","41.308873","-73.363661","-5","1"
+"06701","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06702","Waterbury","CT","41.555846","-73.0431","-5","1"
+"06703","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06704","Waterbury","CT","41.57693","-73.03488","-5","1"
+"06705","Waterbury","CT","41.54903","-72.99861","-5","1"
+"06706","Waterbury","CT","41.537896","-73.02827","-5","1"
+"06708","Waterbury","CT","41.551601","-73.06262","-5","1"
+"06710","Waterbury","CT","41.569496","-73.04484","-5","1"
+"06712","Prospect","CT","41.501856","-72.97799","-5","1"
+"06716","Wolcott","CT","41.594785","-72.97889","-5","1"
+"06720","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06721","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06722","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06723","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06724","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06725","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06726","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06731","Salisbury","CT","41.933257","-73.363028","-5","1"
+"06748","Oxford","CT","41.586368","-73.43657","-5","1"
+"06749","Waterbury","CT","41.365709","-72.927507","-5","1"
+"06750","Bantam","CT","41.721024","-73.24774","-5","1"
+"06751","Bethlehem","CT","41.639235","-73.20864","-5","1"
+"06752","Bridgewater","CT","41.52599","-73.36092","-5","1"
+"06753","Cornwall","CT","41.828067","-73.332345","-5","1"
+"06754","Cornwall Bridge","CT","41.786035","-73.35774","-5","1"
+"06755","Gaylordsville","CT","41.655998","-73.47692","-5","1"
+"06756","Goshen","CT","41.836049","-73.24506","-5","1"
+"06757","Kent","CT","41.729239","-73.45553","-5","1"
+"06758","Lakeside","CT","41.739889","-73.222981","-5","1"
+"06759","Litchfield","CT","41.754255","-73.21268","-5","1"
+"06762","Middlebury","CT","41.532992","-73.11555","-5","1"
+"06763","Morris","CT","41.693856","-73.21056","-5","1"
+"06770","Naugatuck","CT","41.493763","-73.05173","-5","1"
+"06776","New Milford","CT","41.581494","-73.41313","-5","1"
+"06777","New Preston Marble Dale","CT","41.697487","-73.3435","-5","1"
+"06778","Northfield","CT","41.694945","-73.10942","-5","1"
+"06779","Oakville","CT","41.592046","-73.08543","-5","1"
+"06781","Pequabuck","CT","41.669898","-72.99145","-5","1"
+"06782","Plymouth","CT","41.662281","-73.0482","-5","1"
+"06783","Roxbury","CT","41.557711","-73.30816","-5","1"
+"06784","Sherman","CT","41.566534","-73.4915","-5","1"
+"06785","South Kent","CT","41.69971","-73.44024","-5","1"
+"06786","Terryville","CT","41.676415","-73.00836","-5","1"
+"06787","Thomaston","CT","41.677982","-73.08979","-5","1"
+"06790","Torrington","CT","41.820274","-73.11787","-5","1"
+"06791","Harwinton","CT","41.754872","-73.06927","-5","1"
+"06793","Washington","CT","41.633422","-73.28946","-5","1"
+"06794","Washington Depot","CT","41.644096","-73.32437","-5","1"
+"06795","Watertown","CT","41.608196","-73.12099","-5","1"
+"06796","West Cornwall","CT","41.875075","-73.33673","-5","1"
+"06798","Woodbury","CT","41.554112","-73.20539","-5","1"
+"06801","Bethel","CT","41.379978","-73.40105","-5","1"
+"06804","Brookfield","CT","41.465811","-73.39982","-5","1"
+"06807","Cos Cob","CT","41.047627","-73.59508","-5","1"
+"06810","Danbury","CT","41.390194","-73.45441","-5","1"
+"06811","Danbury","CT","41.425594","-73.47006","-5","1"
+"06812","New Fairfield","CT","41.472227","-73.49673","-5","1"
+"06813","Danbury","CT","41.308873","-73.363661","-5","1"
+"06814","Danbury","CT","41.308873","-73.363661","-5","1"
+"06815","Hamden","CT","41.390625","-72.900757","-5","1"
+"06816","Danbury","CT","41.308873","-73.363661","-5","1"
+"06817","Danbury","CT","41.308873","-73.363661","-5","1"
+"06819","Danbury","CT","41.391956","-73.475844","-5","1"
+"06820","Darien","CT","41.075663","-73.48294","-5","1"
+"06824","Fairfield","CT","41.163879","-73.265744","-5","1"
+"06825","Bridgeport","CT","41.191685","-73.238012","-5","1"
+"06829","Georgetown","CT","41.25553","-73.427915","-5","1"
+"06830","Greenwich","CT","41.03073","-73.62985","-5","1"
+"06831","Greenwich","CT","41.061296","-73.65866","-5","1"
+"06832","Greenwich","CT","41.308873","-73.363661","-5","1"
+"06836","Greenwich","CT","41.308873","-73.363661","-5","1"
+"06840","New Canaan","CT","41.150146","-73.49178","-5","1"
+"06842","New Canaan","CT","41.147096","-73.495366","-5","1"
+"06850","Norwalk","CT","41.124546","-73.43658","-5","1"
+"06851","Norwalk","CT","41.134896","-73.4053","-5","1"
+"06852","Norwalk","CT","41.308873","-73.363661","-5","1"
+"06853","Norwalk","CT","41.066196","-73.43819","-5","1"
+"06854","Norwalk","CT","41.092196","-73.42869","-5","1"
+"06855","Norwalk","CT","41.100496","-73.39918","-5","1"
+"06856","Norwalk","CT","41.111196","-73.420363","-5","1"
+"06857","Norwalk","CT","41.308873","-73.363661","-5","1"
+"06858","Norwalk","CT","41.110496","-73.416213","-5","1"
+"06859","Norwalk","CT","41.308873","-73.363661","-5","1"
+"06860","Norwalk","CT","41.308873","-73.363661","-5","1"
+"06870","Old Greenwich","CT","41.033347","-73.56804","-5","1"
+"06875","Redding Center","CT","41.308873","-73.363661","-5","1"
+"06876","Redding Ridge","CT","41.032647","-73.583569","-5","1"
+"06877","Ridgefield","CT","41.297911","-73.49178","-5","1"
+"06878","Riverside","CT","41.034264","-73.5842","-5","1"
+"06879","Ridgefield","CT","41.308873","-73.363661","-5","1"
+"06880","Westport","CT","41.140896","-73.35178","-5","1"
+"06881","Westport","CT","41.308873","-73.363661","-5","1"
+"06883","Weston","CT","41.216454","-73.37308","-5","1"
+"06888","Westport","CT","41.308873","-73.363661","-5","1"
+"06889","Westport","CT","41.141005","-73.34689","-5","1"
+"06890","Fairfield","CT","41.142754","-73.288247","-5","1"
+"06896","Redding","CT","41.301007","-73.39857","-5","1"
+"06897","Wilton","CT","41.201446","-73.43758","-5","1"
+"06901","Stamford","CT","41.051996","-73.53903","-5","1"
+"06902","Stamford","CT","41.047996","-73.53688","-5","1"
+"06903","Stamford","CT","41.132096","-73.56423","-5","1"
+"06904","Stamford","CT","41.308873","-73.363661","-5","1"
+"06905","Stamford","CT","41.081396","-73.54506","-5","1"
+"06906","Stamford","CT","41.069298","-73.52182","-5","1"
+"06907","Stamford","CT","41.096846","-73.52128","-5","1"
+"06910","Stamford","CT","41.039147","-73.559118","-5","1"
+"06911","Stamford","CT","41.308873","-73.363661","-5","1"
+"06912","Stamford","CT","41.308873","-73.363661","-5","1"
+"06913","Stamford","CT","41.308873","-73.363661","-5","1"
+"06914","Stamford","CT","41.308873","-73.363661","-5","1"
+"06920","Stamford","CT","41.308873","-73.363661","-5","1"
+"06921","Stamford","CT","41.049866","-73.53796","-5","1"
+"06922","Stamford","CT","41.051551","-73.514344","-5","1"
+"06925","Stamford","CT","41.308873","-73.363661","-5","1"
+"06926","Stamford","CT","41.041197","-73.538567","-5","1"
+"06927","Stamford","CT","41.308873","-73.363661","-5","1"
+"06928","Stamford","CT","41.308873","-73.363661","-5","1"
+"06993","Weston","CT","41.234395","-73.402714","-5","1"
+"07001","Avenel","NJ","40.578996","-74.27987","-5","1"
+"07002","Bayonne","NJ","40.666552","-74.11768","-5","1"
+"07003","Bloomfield","NJ","40.803","-74.18895","-5","1"
+"07004","Fairfield","NJ","40.879049","-74.29378","-5","1"
+"07005","Boonton","NJ","40.912798","-74.41516","-5","1"
+"07006","Caldwell","NJ","40.848999","-74.27917","-5","1"
+"07007","Caldwell","NJ","40.79185","-74.245241","-5","1"
+"07008","Carteret","NJ","40.582504","-74.22997","-5","1"
+"07009","Cedar Grove","NJ","40.855854","-74.22898","-5","1"
+"07010","Cliffside Park","NJ","40.82154","-73.98949","-5","1"
+"07011","Clifton","NJ","40.879699","-74.14263","-5","1"
+"07012","Clifton","NJ","40.847922","-74.1579","-5","1"
+"07013","Clifton","NJ","40.868699","-74.17102","-5","1"
+"07014","Clifton","NJ","40.834049","-74.13669","-5","1"
+"07015","Clifton","NJ","41.011428","-74.304793","-5","1"
+"07016","Cranford","NJ","40.656302","-74.30371","-5","1"
+"07017","East Orange","NJ","40.770933","-74.20589","-5","1"
+"07018","East Orange","NJ","40.75555","-74.21897","-5","1"
+"07019","East Orange","NJ","40.79185","-74.245241","-5","1"
+"07020","Edgewater","NJ","40.830733","-73.97334","-5","1"
+"07021","Essex Fells","NJ","40.827499","-74.28091","-5","1"
+"07022","Fairview","NJ","40.816737","-74.00082","-5","1"
+"07023","Fanwood","NJ","40.641852","-74.38533","-5","1"
+"07024","Fort Lee","NJ","40.849879","-73.97501","-5","1"
+"07026","Garfield","NJ","40.879858","-74.10807","-5","1"
+"07027","Garwood","NJ","40.650802","-74.32351","-5","1"
+"07028","Glen Ridge","NJ","40.80495","-74.2047","-5","1"
+"07029","Harrison","NJ","40.745951","-74.15509","-5","1"
+"07030","Hoboken","NJ","40.744851","-74.03294","-5","1"
+"07031","North Arlington","NJ","40.791895","-74.13254","-5","1"
+"07032","Kearny","NJ","40.763051","-74.13718","-5","1"
+"07033","Kenilworth","NJ","40.674652","-74.2908","-5","1"
+"07034","Lake Hiawatha","NJ","40.881149","-74.38112","-5","1"
+"07035","Lincoln Park","NJ","40.923233","-74.29376","-5","1"
+"07036","Linden","NJ","40.633953","-74.25339","-5","1"
+"07039","Livingston","NJ","40.788733","-74.32134","-5","1"
+"07040","Maplewood","NJ","40.728901","-74.26821","-5","1"
+"07041","Millburn","NJ","40.724168","-74.29913","-5","1"
+"07042","Montclair","NJ","40.81315","-74.21576","-5","1"
+"07043","Montclair","NJ","40.844199","-74.20218","-5","1"
+"07044","Verona","NJ","40.832449","-74.24227","-5","1"
+"07045","Montville","NJ","40.906152","-74.36742","-5","1"
+"07046","Mountain Lakes","NJ","40.892021","-74.44022","-5","1"
+"07047","North Bergen","NJ","40.7946","-74.01963","-5","1"
+"07050","Orange","NJ","40.7683","-74.23603","-5","1"
+"07051","Orange","NJ","40.79185","-74.245241","-5","1"
+"07052","West Orange","NJ","40.78865","-74.25541","-5","1"
+"07054","Parsippany","NJ","40.860149","-74.4171","-5","1"
+"07055","Passaic","NJ","40.857384","-74.12899","-5","1"
+"07057","Wallington","NJ","40.852931","-74.10925","-5","1"
+"07058","Pine Brook","NJ","40.871299","-74.34331","-5","1"
+"07059","Warren","NJ","40.633652","-74.5008","-5","1"
+"07060","Plainfield","NJ","40.620102","-74.42481","-5","1"
+"07061","Plainfield","NJ","40.665651","-74.299692","-5","1"
+"07062","Plainfield","NJ","40.631252","-74.40383","-5","1"
+"07063","Plainfield","NJ","40.604252","-74.44612","-5","1"
+"07064","Port Reading","NJ","40.569504","-74.24774","-5","1"
+"07065","Rahway","NJ","40.607103","-74.28099","-5","1"
+"07066","Clark","NJ","40.620336","-74.30934","-5","1"
+"07067","Colonia","NJ","40.591653","-74.31341","-5","1"
+"07068","Roseland","NJ","40.821799","-74.30477","-5","1"
+"07069","Watchung","NJ","40.641207","-74.443695","-5","1"
+"07070","Rutherford","NJ","40.828922","-74.11064","-5","1"
+"07071","Lyndhurst","NJ","40.808416","-74.12111","-5","1"
+"07072","Carlstadt","NJ","40.836555","-74.08466","-5","1"
+"07073","East Rutherford","NJ","40.830158","-74.09707","-5","1"
+"07074","Moonachie","NJ","40.841668","-74.059","-5","1"
+"07075","Wood Ridge","NJ","40.847638","-74.08754","-5","1"
+"07076","Scotch Plains","NJ","40.637152","-74.37493","-5","1"
+"07077","Sewaren","NJ","40.553971","-74.25938","-5","1"
+"07078","Short Hills","NJ","40.73915","-74.32749","-5","1"
+"07079","South Orange","NJ","40.74765","-74.25881","-5","1"
+"07080","South Plainfield","NJ","40.580703","-74.41401","-5","1"
+"07081","Springfield","NJ","40.701801","-74.32216","-5","1"
+"07082","Towaco","NJ","40.92241","-74.34625","-5","1"
+"07083","Union","NJ","40.695401","-74.26933","-5","1"
+"07086","Union City","NJ","40.769796","-74.022351","-5","1"
+"07087","Union City","NJ","40.767751","-74.0302","-5","1"
+"07088","Vauxhall","NJ","40.718401","-74.28416","-5","1"
+"07090","Westfield","NJ","40.649202","-74.34567","-5","1"
+"07091","Westfield","NJ","40.665651","-74.299692","-5","1"
+"07092","Mountainside","NJ","40.680301","-74.35601","-5","1"
+"07093","West New York","NJ","40.7895","-74.01223","-5","1"
+"07094","Secaucus","NJ","40.7885","-74.06","-5","1"
+"07095","Woodbridge","NJ","40.557104","-74.28316","-5","1"
+"07096","Secaucus","NJ","40.73276","-74.075485","-5","1"
+"07097","Jersey City","NJ","40.73276","-74.075485","-5","1"
+"07099","Kearny","NJ","40.73276","-74.075485","-5","1"
+"07101","Newark","NJ","40.736101","-74.22509","-5","1"
+"07102","Newark","NJ","40.735257","-74.17326","-5","1"
+"07103","Newark","NJ","40.738501","-74.19507","-5","1"
+"07104","Newark","NJ","40.767702","-74.16831","-5","1"
+"07105","Newark","NJ","40.725801","-74.15206","-5","1"
+"07106","Newark","NJ","40.742251","-74.23006","-5","1"
+"07107","Newark","NJ","40.760667","-74.1879","-5","1"
+"07108","Newark","NJ","40.722751","-74.2014","-5","1"
+"07109","Belleville","NJ","40.7935","-74.16144","-5","1"
+"07110","Nutley","NJ","40.8196","-74.15877","-5","1"
+"07111","Irvington","NJ","40.725651","-74.23207","-5","1"
+"07112","Newark","NJ","40.711651","-74.21303","-5","1"
+"07114","Newark","NJ","40.707553","-74.17883","-5","1"
+"07115","Newark","NJ","40.718772","-74.170091","-5","1"
+"07175","Newark","NJ","40.79185","-74.245241","-5","1"
+"07182","Newark","NJ","40.79185","-74.245241","-5","1"
+"07184","Newark","NJ","40.79185","-74.245241","-5","1"
+"07188","Newark","NJ","40.79185","-74.245241","-5","1"
+"07189","Newark","NJ","40.79185","-74.245241","-5","1"
+"07191","Newark","NJ","40.79185","-74.245241","-5","1"
+"07192","Newark","NJ","40.79185","-74.245241","-5","1"
+"07193","Newark","NJ","40.79185","-74.245241","-5","1"
+"07194","Newark","NJ","40.79185","-74.245241","-5","1"
+"07195","Newark","NJ","40.79185","-74.245241","-5","1"
+"07197","Newark","NJ","40.79185","-74.245241","-5","1"
+"07198","Newark","NJ","40.79185","-74.245241","-5","1"
+"07199","Newark","NJ","40.79185","-74.245241","-5","1"
+"07201","Elizabeth","NJ","40.669502","-74.19889","-5","1"
+"07202","Elizabeth","NJ","40.652302","-74.21692","-5","1"
+"07203","Roselle","NJ","40.653502","-74.26058","-5","1"
+"07204","Roselle Park","NJ","40.665552","-74.26768","-5","1"
+"07205","Hillside","NJ","40.695552","-74.22856","-5","1"
+"07206","Elizabeth","NJ","40.653189","-74.19158","-5","1"
+"07207","Elizabeth","NJ","40.665651","-74.299692","-5","1"
+"07208","Elizabeth","NJ","40.673102","-74.22834","-5","1"
+"07290","Bernards","NJ","40.664351","-74.573051","-5","1"
+"07301","Jersey City","NJ","40.729234","-74.032506","-5","1"
+"07302","Jersey City","NJ","40.721602","-74.04703","-5","1"
+"07303","Jersey City","NJ","40.73276","-74.075485","-5","1"
+"07304","Jersey City","NJ","40.716452","-74.07253","-5","1"
+"07305","Jersey City","NJ","40.701302","-74.08843","-5","1"
+"07306","Jersey City","NJ","40.733751","-74.06582","-5","1"
+"07307","Jersey City","NJ","40.748001","-74.04943","-5","1"
+"07308","Jersey City","NJ","40.73276","-74.075485","-5","1"
+"07309","Jersey City","NJ","40.73276","-74.075485","-5","1"
+"07310","Jersey City","NJ","40.731901","-74.0402","-5","1"
+"07311","Jersey City","NJ","40.73235","-74.075391","-5","1"
+"07399","Jersey City","NJ","40.73235","-74.075391","-5","1"
+"07401","Allendale","NJ","41.031505","-74.13409","-5","1"
+"07403","Bloomingdale","NJ","41.014497","-74.33021","-5","1"
+"07405","Butler","NJ","40.99313","-74.35893","-5","1"
+"07407","Elmwood Park","NJ","40.905639","-74.1199","-5","1"
+"07410","Fair Lawn","NJ","40.933943","-74.11671","-5","1"
+"07416","Franklin","NJ","41.11736","-74.58784","-5","1"
+"07417","Franklin Lakes","NJ","41.010433","-74.20847","-5","1"
+"07418","Glenwood","NJ","41.232344","-74.48688","-5","1"
+"07419","Hamburg","NJ","41.156187","-74.57094","-5","1"
+"07420","Haskell","NJ","41.026747","-74.29742","-5","1"
+"07421","Hewitt","NJ","41.173445","-74.37404","-5","1"
+"07422","Highland Lakes","NJ","41.180137","-74.45489","-5","1"
+"07423","Ho Ho Kus","NJ","41.001695","-74.10239","-5","1"
+"07424","Little Falls","NJ","40.886628","-74.21405","-5","1"
+"07427","West Paterson","NJ","40.875949","-74.201489","-5","1"
+"07428","McAfee","NJ","41.181052","-74.51796","-5","1"
+"07430","Mahwah","NJ","41.077102","-74.16147","-5","1"
+"07432","Midland Park","NJ","40.99312","-74.14286","-5","1"
+"07435","Newfoundland","NJ","41.045897","-74.43677","-5","1"
+"07436","Oakland","NJ","41.028884","-74.23727","-5","1"
+"07438","Oak Ridge","NJ","41.029555","-74.5071","-5","1"
+"07439","Ogdensburg","NJ","41.080066","-74.5972","-5","1"
+"07440","Pequannock","NJ","40.946748","-74.29575","-5","1"
+"07442","Pompton Lakes","NJ","40.99948","-74.28807","-5","1"
+"07444","Pompton Plains","NJ","40.964548","-74.29813","-5","1"
+"07446","Ramsey","NJ","41.058819","-74.14238","-5","1"
+"07450","Ridgewood","NJ","40.983997","-74.11438","-5","1"
+"07451","Ridgewood","NJ","40.948054","-74.083231","-5","1"
+"07452","Glen Rock","NJ","40.961109","-74.12576","-5","1"
+"07456","Ringwood","NJ","41.096095","-74.26012","-5","1"
+"07457","Riverdale","NJ","40.990032","-74.31023","-5","1"
+"07458","Saddle River","NJ","41.054568","-74.09616","-5","1"
+"07460","Stockholm","NJ","41.091254","-74.52081","-5","1"
+"07461","Sussex","NJ","41.229754","-74.60203","-5","1"
+"07462","Vernon","NJ","41.193708","-74.5089","-5","1"
+"07463","Waldwick","NJ","41.013109","-74.12231","-5","1"
+"07465","Wanaque","NJ","41.052958","-74.28236","-5","1"
+"07470","Wayne","NJ","40.943608","-74.25004","-5","1"
+"07474","Wayne","NJ","41.011428","-74.304793","-5","1"
+"07477","Wayne","NJ","41.011428","-74.304793","-5","1"
+"07480","West Milford","NJ","41.102569","-74.37047","-5","1"
+"07481","Wyckoff","NJ","40.998583","-74.1671","-5","1"
+"07495","Mahwah","NJ","40.948054","-74.083231","-5","1"
+"07498","Mahwah","NJ","40.948054","-74.083231","-5","1"
+"07501","Paterson","NJ","40.912198","-74.16863","-5","1"
+"07502","Paterson","NJ","40.918948","-74.1939","-5","1"
+"07503","Paterson","NJ","40.896798","-74.15731","-5","1"
+"07504","Paterson","NJ","40.912148","-74.14271","-5","1"
+"07505","Paterson","NJ","40.916165","-74.17129","-5","1"
+"07506","Hawthorne","NJ","40.957498","-74.15627","-5","1"
+"07507","Hawthorne","NJ","41.011428","-74.304793","-5","1"
+"07508","Haledon","NJ","40.945198","-74.18286","-5","1"
+"07509","Paterson","NJ","41.011428","-74.304793","-5","1"
+"07510","Paterson","NJ","41.011428","-74.304793","-5","1"
+"07511","Totowa","NJ","41.011428","-74.304793","-5","1"
+"07512","Totowa","NJ","40.903348","-74.21763","-5","1"
+"07513","Paterson","NJ","40.906598","-74.14944","-5","1"
+"07514","Paterson","NJ","40.923648","-74.14321","-5","1"
+"07522","Paterson","NJ","40.925778","-74.17784","-5","1"
+"07524","Paterson","NJ","40.930398","-74.15829","-5","1"
+"07530","Paterson","NJ","41.011428","-74.304793","-5","1"
+"07533","Paterson","NJ","41.011428","-74.304793","-5","1"
+"07538","Haledon","NJ","41.011428","-74.304793","-5","1"
+"07543","Paterson","NJ","41.011428","-74.304793","-5","1"
+"07544","Paterson","NJ","41.011428","-74.304793","-5","1"
+"07571","Totowa","NJ","40.899873","-74.23019","-5","1"
+"07601","Hackensack","NJ","40.888678","-74.0488","-5","1"
+"07602","Hackensack","NJ","40.948054","-74.083231","-5","1"
+"07603","Bogota","NJ","40.873876","-74.02769","-5","1"
+"07604","Hasbrouck Heights","NJ","40.86289","-74.07506","-5","1"
+"07605","Leonia","NJ","40.862685","-73.98551","-5","1"
+"07606","South Hackensack","NJ","40.863699","-74.04643","-5","1"
+"07607","Maywood","NJ","40.90503","-74.06279","-5","1"
+"07608","Teterboro","NJ","40.853723","-74.05987","-5","1"
+"07610","Oradell","NJ","40.951348","-74.041234","-5","1"
+"07620","Alpine","NJ","40.952814","-73.93064","-5","1"
+"07621","Bergenfield","NJ","40.923748","-73.99879","-5","1"
+"07624","Closter","NJ","40.971956","-73.96166","-5","1"
+"07626","Cresskill","NJ","40.942074","-73.96504","-5","1"
+"07627","Demarest","NJ","40.955603","-73.96044","-5","1"
+"07628","Dumont","NJ","40.945173","-73.99342","-5","1"
+"07630","Emerson","NJ","40.97514","-74.02725","-5","1"
+"07631","Englewood","NJ","40.893343","-73.9758","-5","1"
+"07632","Englewood Cliffs","NJ","40.883749","-73.95173","-5","1"
+"07640","Harrington Park","NJ","40.989357","-73.97958","-5","1"
+"07641","Haworth","NJ","40.958573","-73.98659","-5","1"
+"07642","Hillsdale","NJ","41.007389","-74.04247","-5","1"
+"07643","Little Ferry","NJ","40.850621","-74.04112","-5","1"
+"07644","Lodi","NJ","40.877999","-74.08265","-5","1"
+"07645","Montvale","NJ","41.048997","-74.04052","-5","1"
+"07646","New Milford","NJ","40.936211","-74.0188","-5","1"
+"07647","Northvale","NJ","41.009414","-73.94849","-5","1"
+"07648","Norwood","NJ","40.994442","-73.95586","-5","1"
+"07649","Oradell","NJ","40.953126","-74.03379","-5","1"
+"07650","Palisades Park","NJ","40.845742","-73.99479","-5","1"
+"07652","Paramus","NJ","40.947107","-74.07047","-5","1"
+"07653","Paramus","NJ","40.948054","-74.083231","-5","1"
+"07656","Park Ridge","NJ","41.034672","-74.04065","-5","1"
+"07657","Ridgefield","NJ","40.832421","-74.00399","-5","1"
+"07660","Ridgefield Park","NJ","40.856749","-74.02278","-5","1"
+"07661","River Edge","NJ","40.927579","-74.03739","-5","1"
+"07662","Rochelle Park","NJ","40.906553","-74.07797","-5","1"
+"07663","Saddle Brook","NJ","40.904131","-74.09474","-5","1"
+"07666","Teaneck","NJ","40.890964","-74.01115","-5","1"
+"07670","Tenafly","NJ","40.92169","-73.96482","-5","1"
+"07675","Westwood","NJ","40.99904","-74.03291","-5","1"
+"07676","Ho-Ho-Kus","NJ","40.989508","-74.061302","-5","1"
+"07677","Woodcliff Lake","NJ","41.025101","-74.059762","-5","1"
+"07688","Teaneck","NJ","40.948054","-74.083231","-5","1"
+"07701","Red Bank","NJ","40.352953","-74.07703","-5","1"
+"07702","Shrewsbury","NJ","40.329128","-74.06315","-5","1"
+"07703","Fort Monmouth","NJ","40.309121","-74.0486","-5","1"
+"07704","Fair Haven","NJ","40.360581","-74.03738","-5","1"
+"07709","Allenhurst","NJ","40.302718","-74.24928","-5","1"
+"07710","Adelphia","NJ","40.302718","-74.24928","-5","1"
+"07711","Allenhurst","NJ","40.236916","-74.0069","-5","1"
+"07712","Asbury Park","NJ","40.232713","-74.03143","-5","1"
+"07715","Belmar","NJ","40.302718","-74.24928","-5","1"
+"07716","Atlantic Highlands","NJ","40.407958","-74.03483","-5","1"
+"07717","Avon By The Sea","NJ","40.191809","-74.01688","-5","1"
+"07718","Belford","NJ","40.415902","-74.08689","-5","1"
+"07719","Belmar","NJ","40.175357","-74.04694","-5","1"
+"07720","Bradley Beach","NJ","40.202113","-74.01353","-5","1"
+"07721","Cliffwood","NJ","40.435961","-74.23734","-5","1"
+"07722","Colts Neck","NJ","40.300226","-74.18306","-5","1"
+"07723","Deal","NJ","40.250104","-74.00153","-5","1"
+"07724","Eatontown","NJ","40.301979","-74.06889","-5","1"
+"07726","Englishtown","NJ","40.294244","-74.34213","-5","1"
+"07727","Farmingdale","NJ","40.205367","-74.15767","-5","1"
+"07728","Freehold","NJ","40.241036","-74.27629","-5","1"
+"07730","Hazlet","NJ","40.423298","-74.179","-5","1"
+"07731","Howell","NJ","40.146597","-74.20815","-5","1"
+"07732","Highlands","NJ","40.404474","-73.9904","-5","1"
+"07733","Holmdel","NJ","40.384832","-74.17194","-5","1"
+"07734","Keansburg","NJ","40.444407","-74.13298","-5","1"
+"07735","Keyport","NJ","40.439714","-74.19374","-5","1"
+"07737","Leonardo","NJ","40.416772","-74.06058","-5","1"
+"07738","Lincroft","NJ","40.337374","-74.12059","-5","1"
+"07739","Little Silver","NJ","40.33517","-74.04059","-5","1"
+"07740","Long Branch","NJ","40.297932","-73.99097","-5","1"
+"07746","Marlboro","NJ","40.316876","-74.26112","-5","1"
+"07747","Matawan","NJ","40.411102","-74.23767","-5","1"
+"07748","Middletown","NJ","40.410213","-74.11718","-5","1"
+"07750","Monmouth Beach","NJ","40.332877","-73.97986","-5","1"
+"07751","Morganville","NJ","40.361014","-74.26595","-5","1"
+"07752","Navesink","NJ","40.402277","-74.027285","-5","1"
+"07753","Neptune","NJ","40.208945","-74.05261","-5","1"
+"07754","Neptune","NJ","40.302718","-74.24928","-5","1"
+"07755","Oakhurst","NJ","40.263575","-74.02176","-5","1"
+"07756","Ocean Grove","NJ","40.211982","-74.00916","-5","1"
+"07757","Oceanport","NJ","40.318115","-74.01239","-5","1"
+"07758","Port Monmouth","NJ","40.427561","-74.1069","-5","1"
+"07760","Rumson","NJ","40.369145","-73.99576","-5","1"
+"07762","Spring Lake","NJ","40.153024","-74.03372","-5","1"
+"07763","Tennent","NJ","40.302718","-74.24928","-5","1"
+"07764","West Long Branch","NJ","40.289985","-74.01671","-5","1"
+"07765","Wickatunk","NJ","40.302718","-74.24928","-5","1"
+"07777","Holmdel","NJ","40.302718","-74.24928","-5","1"
+"07799","Eatontown","NJ","40.302718","-74.24928","-5","1"
+"07801","Dover","NJ","40.889166","-74.55462","-5","1"
+"07802","Dover","NJ","40.867331","-74.578269","-5","1"
+"07803","Mine Hill","NJ","40.878785","-74.60098","-5","1"
+"07806","Picatinny Arsenal","NJ","40.867331","-74.578269","-5","1"
+"07819","Hardyston","NJ","41.162053","-74.580886","-5","1"
+"07820","Allamuchy","NJ","40.869648","-74.849661","-5","1"
+"07821","Andover","NJ","40.966308","-74.74298","-5","1"
+"07822","Augusta","NJ","41.139545","-74.6993","-5","1"
+"07823","Belvidere","NJ","40.82383","-75.04585","-5","1"
+"07825","Blairstown","NJ","40.96035","-74.96243","-5","1"
+"07826","Branchville","NJ","41.177457","-74.75904","-5","1"
+"07827","Montague","NJ","41.300062","-74.76058","-5","1"
+"07828","Budd Lake","NJ","40.878198","-74.73875","-5","1"
+"07829","Buttzville","NJ","40.84335","-74.985914","-5","1"
+"07830","Califon","NJ","40.723778","-74.81866","-5","1"
+"07831","Changewater","NJ","40.739382","-74.944756","-5","1"
+"07832","Columbia","NJ","40.92976","-75.06193","-5","1"
+"07833","Delaware","NJ","40.895451","-75.06752","-5","1"
+"07834","Denville","NJ","40.886149","-74.48704","-5","1"
+"07836","Flanders","NJ","40.84405","-74.70134","-5","1"
+"07837","Glasser","NJ","41.12831","-74.678956","-5","1"
+"07838","Great Meadows","NJ","40.886474","-74.90089","-5","1"
+"07839","Greendell","NJ","41.12831","-74.678956","-5","1"
+"07840","Hackettstown","NJ","40.861748","-74.83054","-5","1"
+"07841","Great Meadows-Vienna","NJ","40.863567","-74.869538","-5","1"
+"07842","Hibernia","NJ","40.940301","-74.49617","-5","1"
+"07843","Hopatcong","NJ","40.937206","-74.66147","-5","1"
+"07844","Hope","NJ","40.919658","-74.984628","-5","1"
+"07845","Ironia","NJ","40.867331","-74.578269","-5","1"
+"07846","Johnsonburg","NJ","40.966266","-74.87979","-5","1"
+"07847","Kenvil","NJ","40.88038","-74.62009","-5","1"
+"07848","Lafayette","NJ","41.094159","-74.69036","-5","1"
+"07849","Lake Hopatcong","NJ","40.963959","-74.61414","-5","1"
+"07850","Landing","NJ","40.908198","-74.65749","-5","1"
+"07851","Layton","NJ","41.172968","-74.88301","-5","1"
+"07852","Ledgewood","NJ","40.876349","-74.65769","-5","1"
+"07853","Long Valley","NJ","40.788599","-74.78295","-5","1"
+"07855","Middleville","NJ","41.12831","-74.678956","-5","1"
+"07856","Mount Arlington","NJ","40.919498","-74.63559","-5","1"
+"07857","Netcong","NJ","40.897398","-74.70301","-5","1"
+"07860","Newton","NJ","41.0714","-74.80199","-5","1"
+"07863","Oxford","NJ","40.815107","-74.96802","-5","1"
+"07865","Port Murray","NJ","40.783175","-74.90934","-5","1"
+"07866","Rockaway","NJ","40.926798","-74.50624","-5","1"
+"07869","Randolph","NJ","40.847649","-74.5748","-5","1"
+"07870","Schooleys Mountain","NJ","40.810362","-74.819318","-5","1"
+"07871","Sparta","NJ","41.035384","-74.63557","-5","1"
+"07874","Stanhope","NJ","40.917054","-74.71053","-5","1"
+"07875","Stillwater","NJ","41.043858","-74.871981","-5","1"
+"07876","Succasunna","NJ","40.855549","-74.65251","-5","1"
+"07877","Swartswood","NJ","41.10289","-74.850759","-5","1"
+"07878","Mount Tabor","NJ","40.872866","-74.47843","-5","1"
+"07879","Tranquility","NJ","40.955934","-74.788108","-5","1"
+"07880","Vienna","NJ","40.864844","-74.897002","-5","1"
+"07881","Wallpack Center","NJ","41.125646","-74.917711","-5","1"
+"07882","Washington","NJ","40.753753","-74.99617","-5","1"
+"07885","Wharton","NJ","40.913298","-74.58246","-5","1"
+"07890","Branchville","NJ","41.12831","-74.678956","-5","1"
+"07901","Summit","NJ","40.714501","-74.3633","-5","1"
+"07902","Summit","NJ","40.665651","-74.299692","-5","1"
+"07919","Hardyston","NJ","41.152239","-74.581948","-5","1"
+"07920","Basking Ridge","NJ","40.6789","-74.57039","-5","1"
+"07921","Bedminster","NJ","40.652301","-74.653","-5","1"
+"07922","Berkeley Heights","NJ","40.675112","-74.43459","-5","1"
+"07924","Bernardsville","NJ","40.72344","-74.57753","-5","1"
+"07926","Brookside","NJ","40.800353","-74.571785","-5","1"
+"07927","Cedar Knolls","NJ","40.821149","-74.45121","-5","1"
+"07928","Chatham","NJ","40.7332","-74.39736","-5","1"
+"07930","Chester","NJ","40.786549","-74.68799","-5","1"
+"07931","Far Hills","NJ","40.696601","-74.63781","-5","1"
+"07932","Florham Park","NJ","40.77835","-74.39009","-5","1"
+"07933","Gillette","NJ","40.683934","-74.47079","-5","1"
+"07934","Gladstone","NJ","40.72265","-74.67432","-5","1"
+"07935","Green Village","NJ","40.739333","-74.45631","-5","1"
+"07936","East Hanover","NJ","40.820012","-74.36474","-5","1"
+"07938","Liberty Corner","NJ","40.655399","-74.586151","-5","1"
+"07939","Lyons","NJ","40.566553","-74.599801","-5","1"
+"07940","Madison","NJ","40.75875","-74.41609","-5","1"
+"07945","Mendham","NJ","40.782767","-74.59529","-5","1"
+"07946","Millington","NJ","40.672823","-74.52011","-5","1"
+"07950","Morris Plains","NJ","40.842399","-74.48223","-5","1"
+"07952","Bernardsville","NJ","40.733863","-74.585653","-5","1"
+"07960","Morristown","NJ","40.79215","-74.48559","-5","1"
+"07961","Morristown","NJ","40.77975","-74.442797","-5","1"
+"07962","Morristown","NJ","40.867331","-74.578269","-5","1"
+"07963","Morristown","NJ","40.867331","-74.578269","-5","1"
+"07969","Watchung","NJ","40.631652","-74.454547","-5","1"
+"07970","Mount Freedom","NJ","40.813281","-74.57267","-5","1"
+"07974","New Providence","NJ","40.698268","-74.40225","-5","1"
+"07976","New Vernon","NJ","40.733739","-74.48851","-5","1"
+"07977","Peapack","NJ","40.707505","-74.65657","-5","1"
+"07978","Pluckemin","NJ","40.642491","-74.639597","-5","1"
+"07979","Pottersville","NJ","40.713675","-74.72465","-5","1"
+"07980","Stirling","NJ","40.672968","-74.49171","-5","1"
+"07981","Whippany","NJ","40.821482","-74.42648","-5","1"
+"07983","Whippany","NJ","40.867331","-74.578269","-5","1"
+"07997","Peapack and Gladstone","NJ","40.728195","-74.665549","-5","1"
+"07999","Whippany","NJ","40.867331","-74.578269","-5","1"
+"08001","Alloway","NJ","39.559426","-75.3631","-5","1"
+"08002","Cherry Hill","NJ","39.932279","-75.02266","-5","1"
+"08003","Cherry Hill","NJ","39.879713","-74.9719","-5","1"
+"08004","Atco","NJ","39.769357","-74.87264","-5","1"
+"08005","Barnegat","NJ","39.759581","-74.27398","-5","1"
+"08006","Barnegat Light","NJ","39.75196","-74.11074","-5","1"
+"08007","Barrington","NJ","39.868013","-75.05424","-5","1"
+"08008","Beach Haven","NJ","39.614596","-74.2005","-5","1"
+"08009","Berlin","NJ","39.779582","-74.9365","-5","1"
+"08010","Beverly","NJ","40.058211","-74.91404","-5","1"
+"08011","Birmingham","NJ","39.978635","-74.71323","-5","1"
+"08012","Blackwood","NJ","39.784614","-75.05678","-5","1"
+"08014","Bridgeport","NJ","39.803646","-75.34421","-5","1"
+"08015","Browns Mills","NJ","39.960596","-74.5606","-5","1"
+"08016","Burlington","NJ","40.06834","-74.84463","-5","1"
+"08017","Elwood-Magnolia","NJ","39.574175","-74.719502","-5","1"
+"08018","Cedar Brook","NJ","39.80237","-74.938259","-5","1"
+"08019","Chatsworth","NJ","39.777314","-74.5354","-5","1"
+"08020","Clarksboro","NJ","39.800958","-75.2211","-5","1"
+"08021","Clementon","NJ","39.810485","-74.99574","-5","1"
+"08022","Columbus","NJ","40.079952","-74.70684","-5","1"
+"08023","Deepwater","NJ","39.683577","-75.48932","-5","1"
+"08025","Ewan","NJ","39.701526","-75.162903","-5","1"
+"08026","Gibbsboro","NJ","39.833847","-74.96899","-5","1"
+"08027","Gibbstown","NJ","39.824159","-75.28187","-5","1"
+"08028","Glassboro","NJ","39.700008","-75.11951","-5","1"
+"08029","Glendora","NJ","39.840463","-75.0687","-5","1"
+"08030","Gloucester City","NJ","39.891113","-75.11836","-5","1"
+"08031","Bellmawr","NJ","39.867013","-75.09162","-5","1"
+"08032","Grenloch","NJ","39.781264","-75.0609","-5","1"
+"08033","Haddonfield","NJ","39.895213","-75.04019","-5","1"
+"08034","Cherry Hill","NJ","39.908613","-74.99951","-5","1"
+"08035","Haddon Heights","NJ","39.87913","-75.06599","-5","1"
+"08036","Hainesport","NJ","39.985662","-74.83044","-5","1"
+"08037","Hammonton","NJ","39.625291","-74.77705","-5","1"
+"08038","Hancocks Bridge","NJ","39.481009","-75.50618","-5","1"
+"08039","Harrisonville","NJ","39.685445","-75.2669","-5","1"
+"08041","Jobstown","NJ","40.038339","-74.6806","-5","1"
+"08042","Juliustown","NJ","40.018503","-74.66656","-5","1"
+"08043","Voorhees","NJ","39.851969","-74.96128","-5","1"
+"08045","Lawnside","NJ","39.866513","-75.03197","-5","1"
+"08046","Willingboro","NJ","40.029011","-74.88257","-5","1"
+"08048","Lumberton","NJ","39.967013","-74.80666","-5","1"
+"08049","Magnolia","NJ","39.85478","-75.03671","-5","1"
+"08050","Manahawkin","NJ","39.707575","-74.25933","-5","1"
+"08051","Mantua","NJ","39.785785","-75.17761","-5","1"
+"08052","Maple Shade","NJ","39.952212","-74.99464","-5","1"
+"08053","Marlton","NJ","39.88488","-74.90416","-5","1"
+"08054","Mount Laurel","NJ","39.949446","-74.90342","-5","1"
+"08055","Medford","NJ","39.865272","-74.8185","-5","1"
+"08056","Mickleton","NJ","39.785219","-75.25304","-5","1"
+"08057","Moorestown","NJ","39.968962","-74.9489","-5","1"
+"08059","Mount Ephraim","NJ","39.884263","-75.0923","-5","1"
+"08060","Mount Holly","NJ","39.991562","-74.79747","-5","1"
+"08061","Mount Royal","NJ","39.807684","-75.20496","-5","1"
+"08062","Mullica Hill","NJ","39.716939","-75.21987","-5","1"
+"08063","National Park","NJ","39.867158","-75.1802","-5","1"
+"08064","New Lisbon","NJ","39.961921","-74.63687","-5","1"
+"08065","Palmyra","NJ","40.00278","-75.02626","-5","1"
+"08066","Paulsboro","NJ","39.833156","-75.23773","-5","1"
+"08067","Pedricktown","NJ","39.740353","-75.41262","-5","1"
+"08068","Pemberton","NJ","39.961183","-74.66266","-5","1"
+"08069","Penns Grove","NJ","39.712593","-75.46906","-5","1"
+"08070","Pennsville","NJ","39.645377","-75.51923","-5","1"
+"08071","Pitman","NJ","39.730964","-75.13009","-5","1"
+"08072","Quinton","NJ","39.546172","-75.41367","-5","1"
+"08073","Rancocas","NJ","40.010461","-74.86762","-5","1"
+"08074","Richwood","NJ","39.716194","-75.17326","-5","1"
+"08075","Riverside","NJ","40.029361","-74.9541","-5","1"
+"08076","Riverton","NJ","39.862433","-74.725079","-5","1"
+"08077","Riverton","NJ","39.997379","-74.99805","-5","1"
+"08078","Runnemede","NJ","39.850013","-75.0767","-5","1"
+"08079","Salem","NJ","39.549912","-75.43943","-5","1"
+"08080","Sewell","NJ","39.74953","-75.10637","-5","1"
+"08081","Sicklerville","NJ","39.741385","-74.99035","-5","1"
+"08083","Somerdale","NJ","39.842613","-75.02496","-5","1"
+"08084","Stratford","NJ","39.829014","-75.01371","-5","1"
+"08085","Swedesboro","NJ","39.753088","-75.32687","-5","1"
+"08086","Thorofare","NJ","39.849156","-75.18159","-5","1"
+"08087","Tuckerton","NJ","39.59899","-74.36573","-5","1"
+"08088","Vincentown","NJ","39.871699","-74.70528","-5","1"
+"08089","Waterford Works","NJ","39.722622","-74.8503","-5","1"
+"08090","Wenonah","NJ","39.799347","-75.15202","-5","1"
+"08091","West Berlin","NJ","39.807695","-74.93392","-5","1"
+"08092","West Creek","NJ","39.658781","-74.28673","-5","1"
+"08093","Westville","NJ","39.861413","-75.13284","-5","1"
+"08094","Williamstown","NJ","39.647598","-74.95927","-5","1"
+"08095","Winslow","NJ","39.656976","-74.86043","-5","1"
+"08096","Woodbury","NJ","39.830313","-75.13221","-5","1"
+"08097","Woodbury Heights","NJ","39.816063","-75.15321","-5","1"
+"08098","Woodstown","NJ","39.637838","-75.32396","-5","1"
+"08099","Bellmawr","NJ","39.779179","-74.962071","-5","1"
+"08101","Camden","NJ","39.80237","-74.938259","-5","1"
+"08102","Camden","NJ","39.949579","-75.118","-5","1"
+"08103","Camden","NJ","39.936179","-75.11513","-5","1"
+"08104","Camden","NJ","39.918663","-75.10976","-5","1"
+"08105","Camden","NJ","39.949812","-75.08616","-5","1"
+"08106","Audubon","NJ","39.892213","-75.07212","-5","1"
+"08107","Oaklyn","NJ","39.908163","-75.08618","-5","1"
+"08108","Collingswood","NJ","39.915263","-75.06401","-5","1"
+"08109","Merchantville","NJ","39.949979","-75.05024","-5","1"
+"08110","Pennsauken","NJ","39.966812","-75.05681","-5","1"
+"08201","Absecon","NJ","39.457517","-74.50914","-5","1"
+"08202","Avalon","NJ","39.092928","-74.72688","-5","1"
+"08203","Brigantine","NJ","39.401801","-74.38017","-5","1"
+"08204","Cape May","NJ","38.963652","-74.92319","-5","1"
+"08205","Absecon","NJ","39.471263","-74.502457","-5","1"
+"08210","Cape May Court House","NJ","39.081754","-74.83658","-5","1"
+"08212","Cape May Point","NJ","38.936896","-74.96526","-5","1"
+"08213","Cologne","NJ","39.509208","-74.608557","-5","1"
+"08214","Dennisville","NJ","39.056521","-74.816619","-5","1"
+"08215","Egg Harbor City","NJ","39.548049","-74.62171","-5","1"
+"08217","Elwood","NJ","39.575273","-74.72103","-5","1"
+"08218","Goshen","NJ","39.056521","-74.816619","-5","1"
+"08219","Green Creek","NJ","39.056521","-74.816619","-5","1"
+"08220","Leeds Point","NJ","39.509208","-74.608557","-5","1"
+"08221","Linwood","NJ","39.348616","-74.57387","-5","1"
+"08223","Marmora","NJ","39.264412","-74.64986","-5","1"
+"08224","New Gretna","NJ","39.595957","-74.45628","-5","1"
+"08225","Northfield","NJ","39.370083","-74.55211","-5","1"
+"08226","Ocean City","NJ","39.265371","-74.59381","-5","1"
+"08227","Bass River","NJ","39.588665","-74.466214","-5","1"
+"08230","Ocean View","NJ","39.20877","-74.70438","-5","1"
+"08231","Oceanville","NJ","39.509208","-74.608557","-5","1"
+"08232","Pleasantville","NJ","39.394616","-74.52212","-5","1"
+"08234","Egg Harbor Township","NJ","39.398172","-74.59667","-5","1"
+"08237","Maurice River","NJ","39.258089","-74.974344","-5","1"
+"08240","Pomona","NJ","39.487717","-74.554334","-5","1"
+"08241","Port Republic","NJ","39.527903","-74.4917","-5","1"
+"08242","Rio Grande","NJ","39.017837","-74.87515","-5","1"
+"08243","Sea Isle City","NJ","39.145755","-74.69865","-5","1"
+"08244","Somers Point","NJ","39.319901","-74.5999","-5","1"
+"08245","South Dennis","NJ","39.176208","-74.81723","-5","1"
+"08246","South Seaville","NJ","39.056521","-74.816619","-5","1"
+"08247","Stone Harbor","NJ","39.051289","-74.76204","-5","1"
+"08248","Strathmere","NJ","39.197394","-74.65699","-5","1"
+"08250","Tuckahoe","NJ","39.056521","-74.816619","-5","1"
+"08251","Villas","NJ","39.022256","-74.93616","-5","1"
+"08252","Whitesboro","NJ","39.037404","-74.85749","-5","1"
+"08253","Shiloh","NJ","39.458714","-75.298235","-5","1"
+"08260","Wildwood","NJ","38.987556","-74.822","-5","1"
+"08270","Woodbine","NJ","39.275059","-74.80041","-5","1"
+"08283","Sea Isle City","NJ","39.16076","-74.696498","-5","1"
+"08302","Bridgeton","NJ","39.445164","-75.24215","-5","1"
+"08310","Buena","NJ","39.522686","-74.89684","-5","1"
+"08311","Cedarville","NJ","39.337205","-75.18577","-5","1"
+"08312","Clayton","NJ","39.655964","-75.08736","-5","1"
+"08313","Deerfield Street","NJ","39.530314","-75.22901","-5","1"
+"08314","Delmont","NJ","39.219301","-74.94016","-5","1"
+"08315","Dividing Creek","NJ","39.273214","-75.095025","-5","1"
+"08316","Dorchester","NJ","39.274714","-74.97546","-5","1"
+"08317","Dorothy","NJ","39.406518","-74.82706","-5","1"
+"08318","Elmer","NJ","39.553504","-75.16843","-5","1"
+"08319","Estell Manor","NJ","39.376099","-74.81456","-5","1"
+"08320","Fairton","NJ","39.379906","-75.221681","-5","1"
+"08321","Fortescue","NJ","39.239649","-75.17225","-5","1"
+"08322","Franklinville","NJ","39.618222","-75.0618","-5","1"
+"08323","Greenwich","NJ","39.402763","-75.3574","-5","1"
+"08324","Heislerville","NJ","39.218484","-74.99001","-5","1"
+"08326","Landisville","NJ","39.524179","-74.9385","-5","1"
+"08327","Leesburg","NJ","39.254836","-74.97767","-5","1"
+"08328","Malaga","NJ","39.572449","-75.0543","-5","1"
+"08329","Mauricetown","NJ","39.285464","-74.99687","-5","1"
+"08330","Mays Landing","NJ","39.478771","-74.7581","-5","1"
+"08332","Millville","NJ","39.379382","-75.03923","-5","1"
+"08334","Downe","NJ","39.241686","-75.17465","-5","1"
+"08340","Milmay","NJ","39.437265","-74.87926","-5","1"
+"08341","Minotola","NJ","39.517539","-74.94972","-5","1"
+"08342","Mizpah","NJ","39.50208","-74.833469","-5","1"
+"08343","Monroeville","NJ","39.633964","-75.15643","-5","1"
+"08344","Newfield","NJ","39.562763","-75.00955","-5","1"
+"08345","Newport","NJ","39.28341","-75.15464","-5","1"
+"08346","Newtonville","NJ","39.562719","-74.85853","-5","1"
+"08347","Norma","NJ","39.499765","-75.082022","-5","1"
+"08348","Port Elizabeth","NJ","39.314084","-74.97889","-5","1"
+"08349","Port Norris","NJ","39.25682","-75.06683","-5","1"
+"08350","Richland","NJ","39.490774","-74.87045","-5","1"
+"08352","Rosenhayn","NJ","39.475565","-75.12933","-5","1"
+"08353","Shiloh","NJ","39.458114","-75.29761","-5","1"
+"08360","Vineland","NJ","39.492265","-75.01887","-5","1"
+"08361","Vineland","NJ","39.464582","-74.96994","-5","1"
+"08362","Vineland","NJ","39.271264","-75.027671","-5","1"
+"08370","Riverside","NJ","39.862433","-74.725079","-5","1"
+"08401","Atlantic City","NJ","39.364966","-74.43903","-5","1"
+"08402","Margate City","NJ","39.329416","-74.50661","-5","1"
+"08403","Longport","NJ","39.314766","-74.52675","-5","1"
+"08404","Atlantic City","NJ","39.509208","-74.608557","-5","1"
+"08405","Atlantic City","NJ","39.509208","-74.608557","-5","1"
+"08406","Ventnor City","NJ","39.342299","-74.48192","-5","1"
+"08501","Allentown","NJ","40.164556","-74.57785","-5","1"
+"08502","Belle Mead","NJ","40.460137","-74.63592","-5","1"
+"08504","Blawenburg","NJ","40.425369","-74.668753","-5","1"
+"08505","Bordentown","NJ","40.132784","-74.71778","-5","1"
+"08510","Clarksburg","NJ","40.18238","-74.42134","-5","1"
+"08511","Cookstown","NJ","40.050128","-74.55611","-5","1"
+"08512","Cranbury","NJ","40.306286","-74.52627","-5","1"
+"08514","Cream Ridge","NJ","40.134892","-74.48688","-5","1"
+"08515","Crosswicks","NJ","40.14821","-74.65125","-5","1"
+"08518","Florence","NJ","40.11791","-74.8047","-5","1"
+"08520","Hightstown","NJ","40.262809","-74.53246","-5","1"
+"08525","Hopewell","NJ","40.386902","-74.78112","-5","1"
+"08526","Imlaystown","NJ","40.162275","-74.475936","-5","1"
+"08527","Jackson","NJ","40.11597","-74.32251","-5","1"
+"08528","Kingston","NJ","40.377173","-74.61538","-5","1"
+"08530","Lambertville","NJ","40.375039","-74.93184","-5","1"
+"08533","New Egypt","NJ","40.075185","-74.48433","-5","1"
+"08534","Pennington","NJ","40.32315","-74.78364","-5","1"
+"08535","Perrineville","NJ","40.228497","-74.45064","-5","1"
+"08536","Plainsboro","NJ","40.33371","-74.58512","-5","1"
+"08540","Princeton","NJ","40.357439","-74.64922","-5","1"
+"08541","Princeton","NJ","40.280531","-74.712018","-5","1"
+"08542","Princeton","NJ","40.354424","-74.65943","-5","1"
+"08543","Princeton","NJ","40.280531","-74.712018","-5","1"
+"08544","Princeton","NJ","40.349206","-74.652811","-5","1"
+"08550","Princeton Junction","NJ","40.292358","-74.60902","-5","1"
+"08551","Ringoes","NJ","40.449171","-74.84979","-5","1"
+"08553","Rocky Hill","NJ","40.400406","-74.63895","-5","1"
+"08554","Roebling","NJ","40.113883","-74.77977","-5","1"
+"08555","Roosevelt","NJ","40.22142","-74.47378","-5","1"
+"08556","Rosemont","NJ","40.419965","-74.988619","-5","1"
+"08557","Sergeantsville","NJ","40.563654","-74.949409","-5","1"
+"08558","Skillman","NJ","40.410155","-74.70726","-5","1"
+"08559","Stockton","NJ","40.435878","-74.96511","-5","1"
+"08560","Titusville","NJ","40.31049","-74.85947","-5","1"
+"08561","Windsor","NJ","40.242009","-74.58006","-5","1"
+"08562","Wrightstown","NJ","40.062215","-74.58893","-5","1"
+"08570","Cranbury","NJ","40.430006","-74.417344","-5","1"
+"08601","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08602","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08603","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08604","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08605","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08606","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08607","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08608","Trenton","NJ","40.219158","-74.76481","-5","1"
+"08609","Trenton","NJ","40.224441","-74.7421","-5","1"
+"08610","Trenton","NJ","40.199859","-74.72005","-5","1"
+"08611","Trenton","NJ","40.206959","-74.75136","-5","1"
+"08618","Trenton","NJ","40.238258","-74.7805","-5","1"
+"08619","Trenton","NJ","40.240558","-74.69588","-5","1"
+"08620","Trenton","NJ","40.17296","-74.66915","-5","1"
+"08625","Trenton","NJ","40.206709","-74.75643","-5","1"
+"08628","Trenton","NJ","40.264708","-74.82295","-5","1"
+"08629","Trenton","NJ","40.219358","-74.73334","-5","1"
+"08638","Trenton","NJ","40.249908","-74.75953","-5","1"
+"08640","Trenton","NJ","40.003861","-74.61775","-5","1"
+"08641","Trenton","NJ","40.04492","-74.58916","-5","1"
+"08645","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08646","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08647","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08648","Trenton","NJ","40.276782","-74.72951","-5","1"
+"08650","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08666","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08677","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08690","Trenton","NJ","40.225409","-74.65918","-5","1"
+"08691","Trenton","NJ","40.207034","-74.59364","-5","1"
+"08695","Trenton","NJ","40.280531","-74.712018","-5","1"
+"08701","Lakewood","NJ","40.082782","-74.2094","-5","1"
+"08720","Allenwood","NJ","40.14386","-74.10286","-5","1"
+"08721","Bayville","NJ","39.902851","-74.16037","-5","1"
+"08722","Beachwood","NJ","39.931068","-74.19618","-5","1"
+"08723","Brick","NJ","40.042479","-74.123","-5","1"
+"08724","Brick","NJ","40.087794","-74.10981","-5","1"
+"08730","Brielle","NJ","40.108433","-74.06226","-5","1"
+"08731","Forked River","NJ","39.848035","-74.21297","-5","1"
+"08732","Island Heights","NJ","39.942616","-74.14689","-5","1"
+"08733","Lakehurst","NJ","40.017117","-74.30491","-5","1"
+"08734","Lanoka Harbor","NJ","39.862864","-74.16624","-5","1"
+"08735","Lavallette","NJ","39.982101","-74.06768","-5","1"
+"08736","Manasquan","NJ","40.120261","-74.05765","-5","1"
+"08738","Mantoloking","NJ","40.025258","-74.05579","-5","1"
+"08739","Normandy Beach","NJ","40.000759","-74.24928","-5","1"
+"08740","Ocean Gate","NJ","39.925301","-74.13488","-5","1"
+"08741","Pine Beach","NJ","39.934318","-74.16773","-5","1"
+"08742","Point Pleasant Beach","NJ","40.081165","-74.06003","-5","1"
+"08750","Sea Girt","NJ","40.133754","-74.04123","-5","1"
+"08751","Seaside Heights","NJ","39.948518","-74.0759","-5","1"
+"08752","Seaside Park","NJ","39.920268","-74.07967","-5","1"
+"08753","Toms River","NJ","39.974584","-74.15141","-5","1"
+"08754","Toms River","NJ","40.000759","-74.24928","-5","1"
+"08755","Toms River","NJ","40.010092","-74.23032","-5","1"
+"08756","Toms River","NJ","39.787966","-74.191058","-5","1"
+"08757","Toms River","NJ","39.975967","-74.25296","-5","1"
+"08758","Waretown","NJ","39.784513","-74.22376","-5","1"
+"08759","Whiting","NJ","39.943541","-74.36949","-5","1"
+"08792","Berkeley","NJ","39.907488","-74.081074","-5","1"
+"08801","Annandale","NJ","40.624538","-74.89118","-5","1"
+"08802","Asbury","NJ","40.661172","-75.0321","-5","1"
+"08803","Baptistown","NJ","40.563654","-74.949409","-5","1"
+"08804","Bloomsbury","NJ","40.652484","-75.08959","-5","1"
+"08805","Bound Brook","NJ","40.567953","-74.54034","-5","1"
+"08807","Bridgewater","NJ","40.588097","-74.62253","-5","1"
+"08808","Broadway","NJ","40.737213","-75.046926","-5","1"
+"08809","Clinton","NJ","40.639546","-74.91292","-5","1"
+"08810","Dayton","NJ","40.372881","-74.51363","-5","1"
+"08812","Dunellen","NJ","40.594502","-74.47166","-5","1"
+"08816","East Brunswick","NJ","40.434239","-74.40504","-5","1"
+"08817","Edison","NJ","40.516104","-74.39754","-5","1"
+"08818","Edison","NJ","40.430006","-74.417344","-5","1"
+"08820","Edison","NJ","40.575503","-74.35781","-5","1"
+"08821","Flagtown","NJ","40.518578","-74.68545","-5","1"
+"08822","Flemington","NJ","40.515645","-74.85319","-5","1"
+"08823","Franklin Park","NJ","40.439412","-74.55565","-5","1"
+"08824","Kendall Park","NJ","40.423055","-74.55352","-5","1"
+"08825","Frenchtown","NJ","40.509998","-75.03239","-5","1"
+"08826","Glen Gardner","NJ","40.716332","-74.91405","-5","1"
+"08827","Hampton","NJ","40.677404","-74.96875","-5","1"
+"08828","Helmetta","NJ","40.37594","-74.41955","-5","1"
+"08829","High Bridge","NJ","40.668594","-74.89241","-5","1"
+"08830","Iselin","NJ","40.571504","-74.3183","-5","1"
+"08831","Jamesburg","NJ","40.336508","-74.43302","-5","1"
+"08832","Keasbey","NJ","40.517855","-74.30325","-5","1"
+"08833","Lebanon","NJ","40.643314","-74.82345","-5","1"
+"08834","Little York","NJ","40.563654","-74.949409","-5","1"
+"08835","Manville","NJ","40.538903","-74.59222","-5","1"
+"08836","Martinsville","NJ","40.595552","-74.55174","-5","1"
+"08837","Edison","NJ","40.529355","-74.33844","-5","1"
+"08840","Metuchen","NJ","40.543354","-74.3587","-5","1"
+"08844","Millstone","NJ","40.502477","-74.650023","-5","1"
+"08846","Middlesex","NJ","40.574552","-74.50187","-5","1"
+"08848","Milford","NJ","40.587606","-75.10402","-5","1"
+"08850","Milltown","NJ","40.451105","-74.43938","-5","1"
+"08851","East Amwell","NJ","40.436394","-74.884741","-5","1"
+"08852","Monmouth Junction","NJ","40.389428","-74.54329","-5","1"
+"08853","Neshanic Station","NJ","40.51057","-74.72472","-5","1"
+"08854","Piscataway","NJ","40.555355","-74.46094","-5","1"
+"08855","Piscataway","NJ","40.430006","-74.417344","-5","1"
+"08857","Old Bridge","NJ","40.397507","-74.3298","-5","1"
+"08858","Oldwick","NJ","40.681694","-74.73624","-5","1"
+"08859","Parlin","NJ","40.461851","-74.30343","-5","1"
+"08861","Perth Amboy","NJ","40.520105","-74.27708","-5","1"
+"08862","Perth Amboy","NJ","40.430006","-74.417344","-5","1"
+"08863","Fords","NJ","40.535304","-74.31104","-5","1"
+"08865","Phillipsburg","NJ","40.689123","-75.17243","-5","1"
+"08867","Pittstown","NJ","40.583035","-74.96224","-5","1"
+"08868","Quakertown","NJ","40.565493","-74.938931","-5","1"
+"08869","Raritan","NJ","40.571302","-74.6374","-5","1"
+"08870","Readington","NJ","40.563654","-74.949409","-5","1"
+"08871","Sayreville","NJ","40.430006","-74.417344","-5","1"
+"08872","Sayreville","NJ","40.461605","-74.3474","-5","1"
+"08873","Somerset","NJ","40.505253","-74.50723","-5","1"
+"08875","Somerset","NJ","40.580918","-74.711731","-5","1"
+"08876","Somerville","NJ","40.545853","-74.63592","-5","1"
+"08877","South River","NJ","40.430006","-74.417344","-5","1"
+"08878","South Amboy","NJ","40.436865","-74.250942","-5","1"
+"08879","South Amboy","NJ","40.469606","-74.27669","-5","1"
+"08880","South Bound Brook","NJ","40.553803","-74.52976","-5","1"
+"08882","South River","NJ","40.445006","-74.38179","-5","1"
+"08884","Spotswood","NJ","40.39159","-74.39329","-5","1"
+"08885","Stanton","NJ","40.576372","-74.831105","-5","1"
+"08886","Stewartsville","NJ","40.694938","-75.11181","-5","1"
+"08887","Three Bridges","NJ","40.525361","-74.79632","-5","1"
+"08888","Whitehouse","NJ","40.619412","-74.740597","-5","1"
+"08889","Whitehouse Station","NJ","40.612851","-74.76682","-5","1"
+"08890","Zarephath","NJ","40.536069","-74.578872","-5","1"
+"08896","Raritan","NJ","40.566553","-74.599801","-5","1"
+"08899","Edison","NJ","40.520254","-74.420545","-5","1"
+"08901","New Brunswick","NJ","40.488304","-74.44775","-5","1"
+"08902","North Brunswick","NJ","40.453131","-74.48287","-5","1"
+"08903","New Brunswick","NJ","40.513854","-74.445098","-5","1"
+"08904","Highland Park","NJ","40.500254","-74.4257","-5","1"
+"08905","New Brunswick","NJ","40.430006","-74.417344","-5","1"
+"08906","New Brunswick","NJ","40.430006","-74.417344","-5","1"
+"08907","New Brunswick","NJ","40.482029","-74.479547","-5","1"
+"08922","New Brunswick","NJ","40.430006","-74.417344","-5","1"
+"08933","New Brunswick","NJ","40.430006","-74.417344","-5","1"
+"08988","New Brunswick","NJ","40.430006","-74.417344","-5","1"
+"08989","New Brunswick","NJ","40.430006","-74.417344","-5","1"
+"10001","New York","NY","40.750742","-73.99653","-5","1"
+"10002","New York","NY","40.71704","-73.987","-5","1"
+"10003","New York","NY","40.732509","-73.98935","-5","1"
+"10004","New York","NJ","40.699226","-74.04118","-5","1"
+"10005","New York","NY","40.706019","-74.00858","-5","1"
+"10006","New York","NY","40.707904","-74.01342","-5","1"
+"10007","New York","NY","40.714754","-74.00721","-5","1"
+"10008","New York","NY","40.780751","-73.977182","-5","1"
+"10009","New York","NY","40.727093","-73.97864","-5","1"
+"10010","New York","NY","40.739022","-73.98205","-5","1"
+"10011","New York","NY","40.741012","-74.00012","-5","1"
+"10012","New York","NY","40.72596","-73.99834","-5","1"
+"10013","New York","NY","40.720666","-74.00526","-5","1"
+"10014","New York","NY","40.734718","-74.00532","-5","1"
+"10015","New York","NY","40.780751","-73.977182","-5","1"
+"10016","New York","NY","40.74618","-73.97759","-5","1"
+"10017","New York","NY","40.752159","-73.97231","-5","1"
+"10018","New York","NY","40.755101","-73.99337","-5","1"
+"10019","New York","NY","40.765714","-73.9856","-5","1"
+"10020","New York","NY","40.758667","-73.98024","-5","1"
+"10021","New York","NY","40.76842","-73.96045","-5","1"
+"10022","New York","NY","40.759015","-73.96732","-5","1"
+"10023","New York","NY","40.776099","-73.98285","-5","1"
+"10024","New York","NY","40.786387","-73.97709","-5","1"
+"10025","New York","NY","40.798502","-73.96811","-5","1"
+"10026","New York","NY","40.802853","-73.95471","-5","1"
+"10027","New York","NY","40.812665","-73.95499","-5","1"
+"10028","New York","NY","40.776777","-73.9541","-5","1"
+"10029","New York","NY","40.791586","-73.94575","-5","1"
+"10030","New York","NY","40.818151","-73.94351","-5","1"
+"10031","New York","NY","40.826201","-73.94879","-5","1"
+"10032","New York","NY","40.840686","-73.94154","-5","1"
+"10033","New York","NY","40.848764","-73.93496","-5","1"
+"10034","New York","NY","40.867653","-73.92","-5","1"
+"10035","New York","NY","40.802395","-73.93359","-5","1"
+"10036","New York","NY","40.759511","-73.99019","-5","1"
+"10037","New York","NY","40.813385","-73.93616","-5","1"
+"10038","New York","NY","40.709677","-74.00365","-5","1"
+"10039","New York","NY","40.826181","-73.9371","-5","1"
+"10040","New York","NY","40.858704","-73.92853","-5","1"
+"10041","New York","NY","40.703042","-74.01009","-5","1"
+"10043","New York","NY","40.780751","-73.977182","-5","1"
+"10044","New York","NY","40.762174","-73.94917","-5","1"
+"10045","New York","NY","40.70859","-74.008687","-5","1"
+"10046","New York","NY","40.780751","-73.977182","-5","1"
+"10047","New York","NY","40.780751","-73.977182","-5","1"
+"10048","New York","NY","40.712086","-74.01227","-5","1"
+"10055","New York","NY","40.780751","-73.977182","-5","1"
+"10060","New York","NY","40.780751","-73.977182","-5","1"
+"10069","New York","NY","40.775477","-73.9905","-5","1"
+"10072","New York","NY","40.780751","-73.977182","-5","1"
+"10079","New York","NY","40.780751","-73.977182","-5","1"
+"10080","New York","NY","40.780751","-73.977182","-5","1"
+"10081","New York","NY","40.780751","-73.977182","-5","1"
+"10082","New York","NY","40.780751","-73.977182","-5","1"
+"10087","New York","NY","40.780751","-73.977182","-5","1"
+"10090","New York","NY","40.780751","-73.977182","-5","1"
+"10094","New York","NY","40.780751","-73.977182","-5","1"
+"10095","New York","NY","40.748181","-73.988421","-5","1"
+"10096","New York","NY","40.780751","-73.977182","-5","1"
+"10098","New York","NY","40.748181","-73.988421","-5","1"
+"10099","New York","NY","40.780751","-73.977182","-5","1"
+"10101","New York","NY","40.780751","-73.977182","-5","1"
+"10102","New York","NY","40.780751","-73.977182","-5","1"
+"10103","New York","NY","40.760915","-73.97785","-5","1"
+"10104","New York","NY","40.760943","-73.979908","-5","1"
+"10105","New York","NY","40.762808","-73.978534","-5","1"
+"10106","New York","NY","40.765243","-73.980438","-5","1"
+"10107","New York","NY","40.766429","-73.982728","-5","1"
+"10108","New York","NY","40.780751","-73.977182","-5","1"
+"10109","New York","NY","40.780751","-73.977182","-5","1"
+"10110","New York","NY","40.753987","-73.980811","-5","1"
+"10111","New York","NY","40.759235","-73.97775","-5","1"
+"10112","New York","NY","40.759291","-73.97979","-5","1"
+"10113","New York","NY","40.780751","-73.977182","-5","1"
+"10114","New York","NY","40.780751","-73.977182","-5","1"
+"10115","New York","NY","40.810906","-73.96375","-5","1"
+"10116","New York","NY","40.780751","-73.977182","-5","1"
+"10117","New York","NY","40.780751","-73.977182","-5","1"
+"10118","New York","NY","40.748998","-73.986467","-5","1"
+"10119","New York","NY","40.750824","-73.99289","-5","1"
+"10120","New York","NY","40.750629","-73.989426","-5","1"
+"10121","New York","NY","40.74964","-73.991889","-5","1"
+"10122","New York","NY","40.751757","-73.992171","-5","1"
+"10123","New York","NY","40.751489","-73.990537","-5","1"
+"10124","New York","NY","40.780751","-73.977182","-5","1"
+"10125","New York","NY","40.780751","-73.977182","-5","1"
+"10126","New York","NY","40.780751","-73.977182","-5","1"
+"10128","New York","NY","40.781894","-73.95039","-5","1"
+"10129","New York","NY","40.780751","-73.977182","-5","1"
+"10130","New York","NY","40.780751","-73.977182","-5","1"
+"10131","New York","NY","40.780751","-73.977182","-5","1"
+"10132","New York","NY","40.780751","-73.977182","-5","1"
+"10133","New York","NY","40.780751","-73.977182","-5","1"
+"10138","New York","NY","40.780751","-73.977182","-5","1"
+"10149","New York","NY","40.780751","-73.977182","-5","1"
+"10150","New York","NY","40.780751","-73.977182","-5","1"
+"10151","New York","NY","40.763419","-73.973971","-5","1"
+"10152","New York","NY","40.758611","-73.97223","-5","1"
+"10153","New York","NY","40.763742","-73.97268","-5","1"
+"10154","New York","NY","40.757986","-73.97267","-5","1"
+"10155","New York","NY","40.761104","-73.968036","-5","1"
+"10156","New York","NY","40.780751","-73.977182","-5","1"
+"10157","New York","NY","40.780751","-73.977182","-5","1"
+"10158","New York","NY","40.749435","-73.9758","-5","1"
+"10159","New York","NY","40.780751","-73.977182","-5","1"
+"10160","New York","NY","40.780751","-73.977182","-5","1"
+"10161","New York","NY","40.780751","-73.977182","-5","1"
+"10162","New York","NY","40.769334","-73.94893","-5","1"
+"10163","New York","NY","40.780751","-73.977182","-5","1"
+"10164","New York","NY","40.780751","-73.977182","-5","1"
+"10165","New York","NY","40.752354","-73.9789","-5","1"
+"10166","New York","NY","40.754591","-73.976238","-5","1"
+"10167","New York","NY","40.754862","-73.97495","-5","1"
+"10168","New York","NY","40.751933","-73.976794","-5","1"
+"10169","New York","NY","40.754463","-73.97606","-5","1"
+"10170","New York","NY","40.752859","-73.97608","-5","1"
+"10171","New York","NY","40.756099","-73.97401","-5","1"
+"10172","New York","NY","40.755494","-73.97447","-5","1"
+"10173","New York","NY","40.754302","-73.97955","-5","1"
+"10174","New York","NY","40.751656","-73.97516","-5","1"
+"10175","New York","NY","40.754305","-73.979782","-5","1"
+"10176","New York","NY","40.75557","-73.978877","-5","1"
+"10177","New York","NY","40.755345","-73.97609","-5","1"
+"10178","New York","NY","40.751378","-73.978507","-5","1"
+"10179","New York","NY","40.780751","-73.977182","-5","1"
+"10184","New York","NY","40.780751","-73.977182","-5","1"
+"10185","New York","NY","40.780751","-73.977182","-5","1"
+"10196","New York","NY","40.780751","-73.977182","-5","1"
+"10197","New York","NY","40.780751","-73.977182","-5","1"
+"10199","New York","NY","40.750308","-74.00058","-5","1"
+"10203","New York","NY","40.780751","-73.977182","-5","1"
+"10211","New York","NY","40.780751","-73.977182","-5","1"
+"10212","New York","NY","40.780751","-73.977182","-5","1"
+"10213","New York","NY","40.780751","-73.977182","-5","1"
+"10242","New York","NY","40.780751","-73.977182","-5","1"
+"10249","New York","NY","40.780751","-73.977182","-5","1"
+"10250","New York","NY","40.709387","-74.016529","-5","1"
+"10256","New York","NY","40.780751","-73.977182","-5","1"
+"10257","New York","NY","40.780751","-73.977182","-5","1"
+"10258","New York","NY","40.780751","-73.977182","-5","1"
+"10259","New York","NY","40.780751","-73.977182","-5","1"
+"10260","New York","NY","40.780751","-73.977182","-5","1"
+"10261","New York","NY","40.780751","-73.977182","-5","1"
+"10265","New York","NY","40.780751","-73.977182","-5","1"
+"10268","New York","NY","40.780751","-73.977182","-5","1"
+"10269","New York","NY","40.780751","-73.977182","-5","1"
+"10270","New York","NY","40.706925","-74.008154","-5","1"
+"10271","New York","NY","40.708669","-74.01043","-5","1"
+"10272","New York","NY","40.780751","-73.977182","-5","1"
+"10273","New York","NY","40.780751","-73.977182","-5","1"
+"10274","New York","NY","40.780751","-73.977182","-5","1"
+"10275","New York","NY","40.780751","-73.977182","-5","1"
+"10276","New York","NY","40.780751","-73.977182","-5","1"
+"10277","New York","NY","40.780751","-73.977182","-5","1"
+"10278","New York","NY","40.715721","-74.00395","-5","1"
+"10279","New York","NY","40.713062","-74.00857","-5","1"
+"10280","New York","NY","40.707467","-74.0178","-5","1"
+"10281","New York","NY","40.714643","-74.014958","-5","1"
+"10282","New York","NY","40.717179","-74.01433","-5","1"
+"10285","New York","NY","40.71533","-74.016306","-5","1"
+"10286","New York","NY","40.714231","-74.011895","-5","1"
+"10292","New York","NY","40.780751","-73.977182","-5","1"
+"10301","Staten Island","NY","40.631775","-74.09432","-5","1"
+"10302","Staten Island","NY","40.631127","-74.13715","-5","1"
+"10303","Staten Island","NY","40.629448","-74.16239","-5","1"
+"10304","Staten Island","NY","40.60787","-74.08991","-5","1"
+"10305","Staten Island","NY","40.599021","-74.07503","-5","1"
+"10306","Staten Island","NY","40.569394","-74.11785","-5","1"
+"10307","Staten Island","NY","40.508274","-74.24387","-5","1"
+"10308","Staten Island","NY","40.551353","-74.15098","-5","1"
+"10309","Staten Island","NY","40.529749","-74.21304","-5","1"
+"10310","Staten Island","NY","40.63212","-74.11551","-5","1"
+"10311","Staten Island","NY","40.605245","-74.179485","-5","1"
+"10312","Staten Island","NY","40.543117","-74.17628","-5","1"
+"10313","Staten Island","NY","40.564393","-74.146836","-5","1"
+"10314","Staten Island","NY","40.606337","-74.14513","-5","1"
+"10422","New York","NY","40.828279","-73.869454","-5","1"
+"10451","Bronx","NY","40.819729","-73.9223","-5","1"
+"10452","Bronx","NY","40.838745","-73.92234","-5","1"
+"10453","Bronx","NY","40.853017","-73.91214","-5","1"
+"10454","Bronx","NY","40.805968","-73.91628","-5","1"
+"10455","Bronx","NY","40.815559","-73.90771","-5","1"
+"10456","Bronx","NY","40.829676","-73.90856","-5","1"
+"10457","Bronx","NY","40.846745","-73.89861","-5","1"
+"10458","Bronx","NY","40.864166","-73.88881","-5","1"
+"10459","Bronx","NY","40.825432","-73.89327","-5","1"
+"10460","Bronx","NY","40.84095","-73.88036","-5","1"
+"10461","Bronx","NY","40.842917","-73.83819","-5","1"
+"10462","Bronx","NY","40.842173","-73.85862","-5","1"
+"10463","Bronx","NY","40.881086","-73.90749","-5","1"
+"10464","Bronx","NY","40.857017","-73.78903","-5","1"
+"10465","Bronx","NY","40.825727","-73.81752","-5","1"
+"10466","Bronx","NY","40.89095","-73.84702","-5","1"
+"10467","Bronx","NY","40.872265","-73.86937","-5","1"
+"10468","Bronx","NY","40.867107","-73.89916","-5","1"
+"10469","Bronx","NY","40.868643","-73.84735","-5","1"
+"10470","Bronx","NY","40.900629","-73.86072","-5","1"
+"10471","Bronx","NY","40.900819","-73.90347","-5","1"
+"10472","Bronx","NY","40.830409","-73.86845","-5","1"
+"10473","Bronx","NY","40.818514","-73.85893","-5","1"
+"10474","Bronx","NY","40.81321","-73.88755","-5","1"
+"10475","Bronx","NY","40.878522","-73.82541","-5","1"
+"10499","Bronx","NY","40.851549","-73.840908","-5","1"
+"10501","Amawalk","NY","41.289939","-73.76493","-5","1"
+"10502","Ardsley","NY","41.011324","-73.84152","-5","1"
+"10503","Ardsley On Hudson","NY","41.024855","-73.87513","-5","1"
+"10504","Armonk","NY","41.129908","-73.70352","-5","1"
+"10505","Baldwin Place","NY","41.33431","-73.749244","-5","1"
+"10506","Bedford","NY","41.195778","-73.62777","-5","1"
+"10507","Bedford Hills","NY","41.236931","-73.69018","-5","1"
+"10509","Brewster","NY","41.41362","-73.59556","-5","1"
+"10510","Briarcliff Manor","NY","41.146297","-73.83311","-5","1"
+"10511","Buchanan","NY","41.260283","-73.94033","-5","1"
+"10512","Carmel","NY","41.444833","-73.6845","-5","1"
+"10514","Chappaqua","NY","41.167455","-73.77597","-5","1"
+"10516","Cold Spring","NY","41.440695","-73.9314","-5","1"
+"10517","Crompond","NY","41.300561","-73.861217","-5","1"
+"10518","Cross River","NY","41.269072","-73.60493","-5","1"
+"10519","Croton Falls","NY","41.34598","-73.66199","-5","1"
+"10520","Croton On Hudson","NY","41.215541","-73.88543","-5","1"
+"10521","Croton On Hudson","NY","41.234256","-73.926165","-5","1"
+"10522","Dobbs Ferry","NY","41.012729","-73.86602","-5","1"
+"10523","Elmsford","NY","41.057089","-73.81658","-5","1"
+"10524","Garrison","NY","41.363063","-73.92154","-5","1"
+"10526","Goldens Bridge","NY","41.294561","-73.66701","-5","1"
+"10527","Granite Springs","NY","41.319026","-73.7576","-5","1"
+"10528","Harrison","NY","40.972667","-73.71886","-5","1"
+"10530","Hartsdale","NY","41.025114","-73.80635","-5","1"
+"10532","Hawthorne","NY","41.103664","-73.7958","-5","1"
+"10533","Irvington","NY","41.039005","-73.8635","-5","1"
+"10535","Jefferson Valley","NY","41.331173","-73.80208","-5","1"
+"10536","Katonah","NY","41.265478","-73.68512","-5","1"
+"10537","Lake Peekskill","NY","41.337335","-73.88689","-5","1"
+"10538","Larchmont","NY","40.933089","-73.75615","-5","1"
+"10540","Lincolndale","NY","41.333398","-73.724257","-5","1"
+"10541","Mahopac","NY","41.372419","-73.75367","-5","1"
+"10542","Mahopac Falls","NY","41.372581","-73.760132","-5","1"
+"10543","Mamaroneck","NY","40.952892","-73.7346","-5","1"
+"10545","Maryknoll","NY","41.119008","-73.732996","-5","1"
+"10546","Millwood","NY","41.199502","-73.79269","-5","1"
+"10547","Mohegan Lake","NY","41.314676","-73.85118","-5","1"
+"10548","Montrose","NY","41.248359","-73.94147","-5","1"
+"10549","Mount Kisco","NY","41.204027","-73.73045","-5","1"
+"10550","Mount Vernon","NY","40.907607","-73.83709","-5","1"
+"10551","Mount Vernon","NY","41.119008","-73.732996","-5","1"
+"10552","Mount Vernon","NY","40.924195","-73.82614","-5","1"
+"10553","Mount Vernon","NY","40.909288","-73.8215","-5","1"
+"10557","Mount Vernon","NY","41.119008","-73.732996","-5","1"
+"10558","Mount Vernon","NY","41.119008","-73.732996","-5","1"
+"10559","Mount Vernon","NY","41.119008","-73.732996","-5","1"
+"10560","North Salem","NY","41.32797","-73.61306","-5","1"
+"10562","Ossining","NY","41.176837","-73.84741","-5","1"
+"10566","Peekskill","NY","41.288258","-73.91928","-5","1"
+"10567","Cortlandt Manor","NY","41.300813","-73.8908","-5","1"
+"10570","Pleasantville","NY","41.132367","-73.78922","-5","1"
+"10571","Pleasantville","NY","41.119008","-73.732996","-5","1"
+"10572","Pleasantville","NY","41.119008","-73.732996","-5","1"
+"10573","Port Chester","NY","41.010376","-73.67326","-5","1"
+"10576","Pound Ridge","NY","41.212954","-73.58409","-5","1"
+"10577","Purchase","NY","41.037203","-73.71588","-5","1"
+"10578","Purdys","NY","41.3252","-73.66906","-5","1"
+"10579","Putnam Valley","NY","41.390356","-73.8377","-5","1"
+"10580","Rye","NY","40.976579","-73.69002","-5","1"
+"10581","Rye","NY","41.119008","-73.732996","-5","1"
+"10583","Scarsdale","NY","40.98845","-73.79716","-5","1"
+"10586","Greenville","NY","40.997751","-73.820321","-5","1"
+"10587","Shenorock","NY","41.328737","-73.742268","-5","1"
+"10588","Shrub Oak","NY","41.330178","-73.82973","-5","1"
+"10589","Somers","NY","41.331587","-73.69234","-5","1"
+"10590","South Salem","NY","41.256639","-73.54076","-5","1"
+"10591","Tarrytown","NY","41.080196","-73.85721","-5","1"
+"10592","Tarrytown","NY","41.119008","-73.732996","-5","1"
+"10594","Thornwood","NY","41.120025","-73.77687","-5","1"
+"10595","Valhalla","NY","41.083848","-73.77785","-5","1"
+"10596","Verplanck","NY","41.254823","-73.958727","-5","1"
+"10597","Waccabuc","NY","41.289162","-73.58834","-5","1"
+"10598","Yorktown Heights","NY","41.296874","-73.78934","-5","1"
+"10601","White Plains","NY","41.032489","-73.76454","-5","1"
+"10602","White Plains","NY","41.119008","-73.732996","-5","1"
+"10603","White Plains","NY","41.053182","-73.77672","-5","1"
+"10604","West Harrison","NY","41.045387","-73.74451","-5","1"
+"10605","White Plains","NY","41.01002","-73.75158","-5","1"
+"10606","White Plains","NY","41.024107","-73.77808","-5","1"
+"10607","White Plains","NY","41.041191","-73.80953","-5","1"
+"10610","White Plains","NY","41.119008","-73.732996","-5","1"
+"10625","White Plains","NY","41.119008","-73.732996","-5","1"
+"10629","White Plains","NY","41.119008","-73.732996","-5","1"
+"10633","White Plains","NY","41.119008","-73.732996","-5","1"
+"10650","White Plains","NY","41.013696","-73.705975","-5","1"
+"10701","Yonkers","NY","40.943525","-73.88176","-5","1"
+"10702","Yonkers","NY","41.119008","-73.732996","-5","1"
+"10703","Yonkers","NY","40.956546","-73.8799","-5","1"
+"10704","Yonkers","NY","40.920273","-73.8612","-5","1"
+"10705","Yonkers","NY","40.917281","-73.89142","-5","1"
+"10706","Hastings On Hudson","NY","40.992084","-73.8729","-5","1"
+"10707","Tuckahoe","NY","40.958689","-73.82363","-5","1"
+"10708","Bronxville","NY","40.939049","-73.83099","-5","1"
+"10709","Eastchester","NY","40.953849","-73.81143","-5","1"
+"10710","Yonkers","NY","40.96555","-73.84506","-5","1"
+"10730","Woodbury","NY","41.358899","-74.122951","-5","1"
+"10801","New Rochelle","NY","40.915845","-73.78643","-5","1"
+"10802","New Rochelle","NY","40.948274","-73.795361","-5","1"
+"10803","Pelham","NY","40.902221","-73.80717","-5","1"
+"10804","Wykagyl","NY","40.946805","-73.78797","-5","1"
+"10805","New Rochelle","NY","40.897783","-73.77933","-5","1"
+"10901","Suffern","NY","41.125695","-74.12682","-5","1"
+"10910","Arden","NY","41.386195","-74.125718","-5","1"
+"10911","Bear Mountain","NY","41.160945","-74.060826","-5","1"
+"10912","Bellvale","NY","41.387822","-74.354699","-5","1"
+"10913","Blauvelt","NY","41.062779","-73.96016","-5","1"
+"10914","Blooming Grove","NY","41.464867","-74.255646","-5","1"
+"10915","Bullville","NY","41.555634","-74.328805","-5","1"
+"10916","Campbell Hall","NY","41.451074","-74.24346","-5","1"
+"10917","Central Valley","NY","41.322344","-74.12354","-5","1"
+"10918","Chester","NY","41.35648","-74.26072","-5","1"
+"10919","Circleville","NY","41.525781","-74.37907","-5","1"
+"10920","Congers","NY","41.149245","-73.94287","-5","1"
+"10921","Florida","NY","41.332519","-74.35931","-5","1"
+"10922","Fort Montgomery","NY","41.334557","-73.99175","-5","1"
+"10923","Garnerville","NY","41.204544","-74.00161","-5","1"
+"10924","Goshen","NY","41.38928","-74.3337","-5","1"
+"10925","Greenwood Lake","NY","41.211794","-74.29778","-5","1"
+"10926","Harriman","NY","41.299334","-74.14049","-5","1"
+"10927","Haverstraw","NY","41.196044","-73.96836","-5","1"
+"10928","Highland Falls","NY","41.360336","-73.97293","-5","1"
+"10930","Highland Mills","NY","41.35805","-74.12096","-5","1"
+"10931","Hillburn","NY","41.126395","-74.16718","-5","1"
+"10932","Howells","NY","41.485227","-74.484249","-5","1"
+"10933","Johnson","NY","41.365286","-74.510918","-5","1"
+"10940","Middletown","NY","41.449364","-74.43951","-5","1"
+"10941","Middletown","NY","41.478028","-74.35844","-5","1"
+"10943","Middletown","NY","41.387822","-74.354699","-5","1"
+"10946","Wallkill","NY","41.507236","-74.412119","-5","1"
+"10950","Monroe","NY","41.323547","-74.19531","-5","1"
+"10952","Monsey","NY","41.116162","-74.07556","-5","1"
+"10953","Mountainville","NY","41.409284","-74.083045","-5","1"
+"10954","Nanuet","NY","41.100182","-74.0133","-5","1"
+"10956","New City","NY","41.145495","-73.9949","-5","1"
+"10957","Lewisboro","NY","41.308218","-73.613803","-5","1"
+"10958","New Hampton","NY","41.384738","-74.41571","-5","1"
+"10959","New Milford","NY","41.387822","-74.354699","-5","1"
+"10960","Nyack","NY","41.089746","-73.9258","-5","1"
+"10962","Orangeburg","NY","41.047996","-73.96215","-5","1"
+"10963","Otisville","NY","41.475197","-74.53847","-5","1"
+"10964","Palisades","NY","41.011464","-73.92585","-5","1"
+"10965","Pearl River","NY","41.063329","-74.01734","-5","1"
+"10968","Piermont","NY","41.040623","-73.91878","-5","1"
+"10969","Pine Island","NY","41.295568","-74.48935","-5","1"
+"10970","Pomona","NY","41.192394","-74.04523","-5","1"
+"10973","Slate Hill","NY","41.391172","-74.47758","-5","1"
+"10974","Sloatsburg","NY","41.156095","-74.19214","-5","1"
+"10975","Southfields","NY","41.246428","-74.17141","-5","1"
+"10976","Sparkill","NY","41.028647","-73.92817","-5","1"
+"10977","Spring Valley","NY","41.116795","-74.04504","-5","1"
+"10979","Sterling Forest","NY","41.182344","-74.318354","-5","1"
+"10980","Stony Point","NY","41.231408","-74.01157","-5","1"
+"10981","Sugar Loaf","NY","41.323172","-74.288565","-5","1"
+"10982","Tallman","NY","41.160945","-74.060826","-5","1"
+"10983","Tappan","NY","41.025897","-73.95118","-5","1"
+"10984","Thiells","NY","41.208327","-74.02105","-5","1"
+"10985","Thompson Ridge","NY","41.580793","-74.37451","-5","1"
+"10986","Tomkins Cove","NY","41.271543","-73.98676","-5","1"
+"10987","Tuxedo Park","NY","41.197123","-74.21069","-5","1"
+"10988","Unionville","NY","41.314931","-74.550346","-5","1"
+"10989","Valley Cottage","NY","41.119788","-73.94455","-5","1"
+"10990","Warwick","NY","41.259896","-74.35837","-5","1"
+"10992","Washingtonville","NY","41.428269","-74.16178","-5","1"
+"10993","West Haverstraw","NY","41.207594","-73.97772","-5","1"
+"10994","West Nyack","NY","41.097529","-73.96996","-5","1"
+"10995","West Nyack","NY","41.160945","-74.060826","-5","1"
+"10996","West Point","NY","41.376109","-73.9788","-5","1"
+"10997","West Point","NY","41.387822","-74.354699","-5","1"
+"10998","Westtown","NY","41.334034","-74.54593","-5","1"
+"11001","Floral Park","NY","40.7232","-73.70475","-5","1"
+"11002","Floral Park","NY","40.754757","-73.601772","-5","1"
+"11003","Elmont","NY","40.700529","-73.70223","-5","1"
+"11004","Glen Oaks","NY","40.742944","-73.70956","-5","1"
+"11005","Floral Park","NY","40.756983","-73.7148","-5","1"
+"11010","Franklin Square","NY","40.701702","-73.67562","-5","1"
+"11020","Great Neck","NY","40.771082","-73.71819","-5","1"
+"11021","Great Neck","NY","40.787068","-73.72577","-5","1"
+"11022","Great Neck","NY","40.754757","-73.601772","-5","1"
+"11023","Great Neck","NY","40.798839","-73.73352","-5","1"
+"11024","Great Neck","NY","40.812887","-73.74094","-5","1"
+"11025","Great Neck","NY","40.754757","-73.601772","-5","1"
+"11026","Great Neck","NY","40.754757","-73.601772","-5","1"
+"11027","Great Neck","NY","40.754757","-73.601772","-5","1"
+"11030","Manhasset","NY","40.796752","-73.68935","-5","1"
+"11040","New Hyde Park","NY","40.742901","-73.67895","-5","1"
+"11041","New Hyde Park","NY","40.754757","-73.601772","-5","1"
+"11042","New Hyde Park","NY","40.760128","-73.69379","-5","1"
+"11043","New Hyde Park","NY","40.754757","-73.601772","-5","1"
+"11044","New Hyde Park","NY","40.754757","-73.601772","-5","1"
+"11050","Port Washington","NY","40.833246","-73.69309","-5","1"
+"11051","Port Washington","NY","40.754757","-73.601772","-5","1"
+"11052","Port Washington","NY","40.754757","-73.601772","-5","1"
+"11053","Port Washington","NY","40.754757","-73.601772","-5","1"
+"11054","Port Washington","NY","40.754757","-73.601772","-5","1"
+"11055","Port Washington","NY","40.754757","-73.601772","-5","1"
+"11096","Inwood","NY","40.618206","-73.74762","-5","1"
+"11099","New Hyde Park","NY","40.754757","-73.601772","-5","1"
+"11101","Long Island City","NY","40.745341","-73.93907","-5","1"
+"11102","Astoria","NY","40.771286","-73.92462","-5","1"
+"11103","Astoria","NY","40.762968","-73.91091","-5","1"
+"11104","Sunnyside","NY","40.743796","-73.91949","-5","1"
+"11105","Astoria","NY","40.774686","-73.90816","-5","1"
+"11106","Astoria","NY","40.762012","-73.93147","-5","1"
+"11109","Long Island City","NY","40.651378","-73.870779","-5","1"
+"11120","Long Island City","NY","40.651378","-73.870779","-5","1"
+"11201","Brooklyn","NY","40.695286","-73.98907","-5","1"
+"11202","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11203","Brooklyn","NY","40.649059","-73.93304","-5","1"
+"11204","Brooklyn","NY","40.618944","-73.98473","-5","1"
+"11205","Brooklyn","NY","40.694214","-73.96529","-5","1"
+"11206","Brooklyn","NY","40.702348","-73.94288","-5","1"
+"11207","Brooklyn","NY","40.670874","-73.89424","-5","1"
+"11208","Brooklyn","NY","40.672666","-73.87248","-5","1"
+"11209","Brooklyn","NY","40.62327","-74.0295","-5","1"
+"11210","Brooklyn","NY","40.627946","-73.94552","-5","1"
+"11211","Brooklyn","NY","40.71209","-73.95427","-5","1"
+"11212","Brooklyn","NY","40.662191","-73.91328","-5","1"
+"11213","Brooklyn","NY","40.670937","-73.93459","-5","1"
+"11214","Brooklyn","NY","40.598994","-73.99611","-5","1"
+"11215","Brooklyn","NY","40.667508","-73.9856","-5","1"
+"11216","Brooklyn","NY","40.680398","-73.94824","-5","1"
+"11217","Brooklyn","NY","40.68209","-73.97783","-5","1"
+"11218","Brooklyn","NY","40.644552","-73.97595","-5","1"
+"11219","Brooklyn","NY","40.632449","-73.99629","-5","1"
+"11220","Brooklyn","NY","40.641436","-74.01574","-5","1"
+"11221","Brooklyn","NY","40.691234","-73.92637","-5","1"
+"11222","Brooklyn","NY","40.726302","-73.94559","-5","1"
+"11223","Brooklyn","NY","40.598142","-73.97229","-5","1"
+"11224","Brooklyn","NY","40.576589","-73.99172","-5","1"
+"11225","Brooklyn","NY","40.662892","-73.95509","-5","1"
+"11226","Brooklyn","NY","40.645256","-73.95553","-5","1"
+"11228","Brooklyn","NY","40.617563","-74.01168","-5","1"
+"11229","Brooklyn","NY","40.599256","-73.94118","-5","1"
+"11230","Brooklyn","NY","40.622994","-73.96427","-5","1"
+"11231","Brooklyn","NY","40.6788","-74.00254","-5","1"
+"11232","Brooklyn","NY","40.655481","-74.00424","-5","1"
+"11233","Brooklyn","NY","40.676938","-73.91858","-5","1"
+"11234","Brooklyn","NY","40.618561","-73.9216","-5","1"
+"11235","Brooklyn","NY","40.583803","-73.95019","-5","1"
+"11236","Brooklyn","NY","40.640527","-73.90362","-5","1"
+"11237","Brooklyn","NY","40.703355","-73.91993","-5","1"
+"11238","Brooklyn","NY","40.680145","-73.96257","-5","1"
+"11239","Brooklyn","NY","40.645848","-73.87919","-5","1"
+"11240","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11241","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11242","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11243","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11244","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11245","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11247","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11248","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11249","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11251","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11252","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11254","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11255","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11256","Brooklyn","NY","40.645099","-73.945032","-5","1"
+"11286","New York","NY","40.658825","-74.004495","-5","1"
+"11302","New York","NY","40.75945","-73.715016","-5","1"
+"11351","Flushing","NY","40.781703","-73.831698","-5","1"
+"11352","Flushing","NY","40.651378","-73.870779","-5","1"
+"11353","Flushing","NY","40.651378","-73.870779","-5","1"
+"11354","Flushing","NY","40.767969","-73.82496","-5","1"
+"11355","Flushing","NY","40.749463","-73.81941","-5","1"
+"11356","College Point","NY","40.785462","-73.84366","-5","1"
+"11357","Whitestone","NY","40.784453","-73.80922","-5","1"
+"11358","Flushing","NY","40.760522","-73.79612","-5","1"
+"11359","Bayside","NY","40.79278","-73.776701","-5","1"
+"11360","Bayside","NY","40.780386","-73.78005","-5","1"
+"11361","Bayside","NY","40.763177","-73.77392","-5","1"
+"11362","Little Neck","NY","40.759686","-73.73322","-5","1"
+"11363","Little Neck","NY","40.772636","-73.74644","-5","1"
+"11364","Oakland Gardens","NY","40.746718","-73.75994","-5","1"
+"11365","Fresh Meadows","NY","40.738983","-73.79209","-5","1"
+"11366","Fresh Meadows","NY","40.726137","-73.79502","-5","1"
+"11367","Flushing","NY","40.728614","-73.82145","-5","1"
+"11368","Corona","NY","40.747106","-73.85838","-5","1"
+"11369","East Elmhurst","NY","40.762854","-73.87051","-5","1"
+"11370","East Elmhurst","NY","40.763015","-73.89052","-5","1"
+"11371","Flushing","NY","40.772072","-73.87509","-5","1"
+"11372","Jackson Heights","NY","40.750146","-73.88433","-5","1"
+"11373","Elmhurst","NY","40.736076","-73.87804","-5","1"
+"11374","Rego Park","NY","40.724945","-73.8609","-5","1"
+"11375","Forest Hills","NY","40.720535","-73.84582","-5","1"
+"11377","Woodside","NY","40.742869","-73.90377","-5","1"
+"11378","Maspeth","NY","40.724096","-73.90271","-5","1"
+"11379","Middle Village","NY","40.716028","-73.87925","-5","1"
+"11380","Elmhurst","NY","40.651378","-73.870779","-5","1"
+"11381","Flushing","NY","40.651378","-73.870779","-5","1"
+"11385","Ridgewood","NY","40.703069","-73.89285","-5","1"
+"11386","Ridgewood","NY","40.651378","-73.870779","-5","1"
+"11388","Flushing","NY","40.651378","-73.870779","-5","1"
+"11390","Flushing","NY","40.651378","-73.870779","-5","1"
+"11405","Jamaica","NY","40.651378","-73.870779","-5","1"
+"11411","Cambria Heights","NY","40.693538","-73.73574","-5","1"
+"11412","Saint Albans","NY","40.697188","-73.75948","-5","1"
+"11413","Springfield Gardens","NY","40.670138","-73.75141","-5","1"
+"11414","Howard Beach","NY","40.658188","-73.84321","-5","1"
+"11415","Kew Gardens","NY","40.706903","-73.82973","-5","1"
+"11416","Ozone Park","NY","40.683301","-73.8503","-5","1"
+"11417","Ozone Park","NY","40.675534","-73.84476","-5","1"
+"11418","Richmond Hill","NY","40.698485","-73.83365","-5","1"
+"11419","South Richmond Hill","NY","40.688688","-73.82216","-5","1"
+"11420","South Ozone Park","NY","40.673138","-73.81443","-5","1"
+"11421","Woodhaven","NY","40.69087","-73.85828","-5","1"
+"11422","Rosedale","NY","40.662538","-73.73514","-5","1"
+"11423","Hollis","NY","40.714261","-73.76824","-5","1"
+"11424","Jamaica","NY","40.651378","-73.870779","-5","1"
+"11425","Jamaica","NY","40.651378","-73.870779","-5","1"
+"11426","Bellerose","NY","40.732239","-73.72108","-5","1"
+"11427","Queens Village","NY","40.728235","-73.74782","-5","1"
+"11428","Queens Village","NY","40.719981","-73.74127","-5","1"
+"11429","Queens Village","NY","40.708833","-73.73903","-5","1"
+"11430","Jamaica","NY","40.650519","-73.79567","-5","1"
+"11431","Jamaica","NY","40.686903","-73.850143","-5","1"
+"11432","Jamaica","NY","40.714144","-73.79324","-5","1"
+"11433","Jamaica","NY","40.696538","-73.78734","-5","1"
+"11434","Jamaica","NY","40.674888","-73.7727","-5","1"
+"11435","Jamaica","NY","40.700068","-73.80986","-5","1"
+"11436","Jamaica","NY","40.674146","-73.79687","-5","1"
+"11439","Jamaica","NY","40.722008","-73.790822","-5","1"
+"11451","Jamaica","NY","40.651378","-73.870779","-5","1"
+"11484","Jamaica","NY","40.651378","-73.870779","-5","1"
+"11499","Jamaica","NY","40.651378","-73.870779","-5","1"
+"11501","Mineola","NY","40.747188","-73.63808","-5","1"
+"11507","Albertson","NY","40.769942","-73.65004","-5","1"
+"11509","Atlantic Beach","NY","40.589538","-73.72915","-5","1"
+"11510","Baldwin","NY","40.654112","-73.6095","-5","1"
+"11514","Carle Place","NY","40.750132","-73.61328","-5","1"
+"11516","Cedarhurst","NY","40.627386","-73.72852","-5","1"
+"11517","New York","NY","40.679845","-73.986415","-5","1"
+"11518","East Rockaway","NY","40.639575","-73.66703","-5","1"
+"11520","Freeport","NY","40.653935","-73.587","-5","1"
+"11530","Garden City","NY","40.725257","-73.64056","-5","1"
+"11531","Garden City","NY","40.754757","-73.601772","-5","1"
+"11535","Garden City","NY","40.754757","-73.601772","-5","1"
+"11536","Garden City","NY","40.754757","-73.601772","-5","1"
+"11542","Glen Cove","NY","40.864757","-73.62609","-5","1"
+"11545","Glen Head","NY","40.823957","-73.60415","-5","1"
+"11547","Glenwood Landing","NY","40.828143","-73.64401","-5","1"
+"11548","Greenvale","NY","40.813187","-73.62561","-5","1"
+"11549","Hempstead","NY","40.754757","-73.601772","-5","1"
+"11550","Hempstead","NY","40.702271","-73.61741","-5","1"
+"11551","Hempstead","NY","40.754757","-73.601772","-5","1"
+"11552","West Hempstead","NY","40.6949","-73.65394","-5","1"
+"11553","Uniondale","NY","40.703502","-73.59306","-5","1"
+"11554","East Meadow","NY","40.7143","-73.55527","-5","1"
+"11555","Uniondale","NY","40.754757","-73.601772","-5","1"
+"11556","Uniondale","NY","40.754757","-73.601772","-5","1"
+"11557","Hewlett","NY","40.639534","-73.69253","-5","1"
+"11558","Island Park","NY","40.603159","-73.65515","-5","1"
+"11559","Lawrence","NY","40.61579","-73.73126","-5","1"
+"11560","Locust Valley","NY","40.881957","-73.59417","-5","1"
+"11561","Long Beach","NY","40.588154","-73.66517","-5","1"
+"11562","Lynbrook","NY","40.665202","-73.668274","-5","1"
+"11563","Lynbrook","NY","40.656974","-73.67306","-5","1"
+"11564","Lynbrook","NY","40.754757","-73.601772","-5","1"
+"11565","Malverne","NY","40.675249","-73.67298","-5","1"
+"11566","Merrick","NY","40.666575","-73.55475","-5","1"
+"11568","Old Westbury","NY","40.787368","-73.60119","-5","1"
+"11569","Point Lookout","NY","40.593996","-73.58039","-5","1"
+"11570","Rockville Centre","NY","40.663935","-73.63792","-5","1"
+"11571","Rockville Centre","NY","40.754757","-73.601772","-5","1"
+"11572","Oceanside","NY","40.636286","-73.6374","-5","1"
+"11575","Roosevelt","NY","40.679413","-73.58694","-5","1"
+"11576","Roslyn","NY","40.793839","-73.65156","-5","1"
+"11577","Roslyn Heights","NY","40.785642","-73.64006","-5","1"
+"11579","Sea Cliff","NY","40.846388","-73.64452","-5","1"
+"11580","Valley Stream","NY","40.673","-73.70346","-5","1"
+"11581","Valley Stream","NY","40.651733","-73.71079","-5","1"
+"11582","Valley Stream","NY","40.754757","-73.601772","-5","1"
+"11583","Valley Stream","NY","40.754757","-73.601772","-5","1"
+"11588","Uniondale","NY","40.754757","-73.601772","-5","1"
+"11590","Westbury","NY","40.756287","-73.57536","-5","1"
+"11592","Rockville Centre","NY","40.621753","-73.632673","-5","1"
+"11593","Westbury","NY","40.754757","-73.601772","-5","1"
+"11594","Westbury","NY","40.754757","-73.601772","-5","1"
+"11595","Westbury","NY","40.754757","-73.601772","-5","1"
+"11596","Williston Park","NY","40.758283","-73.64259","-5","1"
+"11597","Westbury","NY","40.754757","-73.601772","-5","1"
+"11598","Woodmere","NY","40.633103","-73.71404","-5","1"
+"11599","Garden City","NY","40.607574","-73.742691","-5","1"
+"11690","Far Rockaway","NY","40.651378","-73.870779","-5","1"
+"11691","Far Rockaway","NY","40.60002","-73.75962","-5","1"
+"11692","Arverne","NY","40.592939","-73.79568","-5","1"
+"11693","Far Rockaway","NY","40.596959","-73.81978","-5","1"
+"11694","Rockaway Park","NY","40.57649","-73.84721","-5","1"
+"11695","Far Rockaway","NY","40.651378","-73.870779","-5","1"
+"11696","Inwood","NY","40.651378","-73.870779","-5","1"
+"11697","Breezy Point","NY","40.560167","-73.90891","-5","1"
+"11701","Amityville","NY","40.6851","-73.41317","-5","1"
+"11702","Babylon","NY","40.687649","-73.32549","-5","1"
+"11703","North Babylon","NY","40.733398","-73.32257","-5","1"
+"11704","West Babylon","NY","40.719249","-73.35829","-5","1"
+"11705","Bayport","NY","40.74485","-73.055","-5","1"
+"11706","Bay Shore","NY","40.729098","-73.25607","-5","1"
+"11707","West Babylon","NY","40.922326","-72.637078","-5","1"
+"11708","Amityville","NY","40.922326","-72.637078","-5","1"
+"11709","Bayville","NY","40.907277","-73.55713","-5","1"
+"11710","Bellmore","NY","40.673438","-73.53382","-5","1"
+"11713","Bellport","NY","40.771447","-72.94663","-5","1"
+"11714","Bethpage","NY","40.740662","-73.48631","-5","1"
+"11715","Blue Point","NY","40.74897","-73.03436","-5","1"
+"11716","Bohemia","NY","40.770042","-73.11376","-5","1"
+"11717","Brentwood","NY","40.783954","-73.24517","-5","1"
+"11718","Brightwaters","NY","40.720746","-73.26614","-5","1"
+"11719","Brookhaven","NY","40.780058","-72.91566","-5","1"
+"11720","Centereach","NY","40.868946","-73.08009","-5","1"
+"11721","Centerport","NY","40.890598","-73.37536","-5","1"
+"11722","Central Islip","NY","40.784874","-73.19924","-5","1"
+"11724","Cold Spring Harbor","NY","40.865731","-73.44645","-5","1"
+"11725","Commack","NY","40.841522","-73.28001","-5","1"
+"11726","Copiague","NY","40.680892","-73.39609","-5","1"
+"11727","Coram","NY","40.884895","-73.00501","-5","1"
+"11729","Deer Park","NY","40.760698","-73.33007","-5","1"
+"11730","East Islip","NY","40.72921","-73.18073","-5","1"
+"11731","East Northport","NY","40.865998","-73.31796","-5","1"
+"11732","East Norwich","NY","40.848766","-73.53478","-5","1"
+"11733","East Setauket","NY","40.932053","-73.10666","-5","1"
+"11735","Farmingdale","NY","40.725968","-73.44151","-5","1"
+"11736","Farmingdale","NY","40.754757","-73.601772","-5","1"
+"11737","Farmingdale","NY","40.754757","-73.601772","-5","1"
+"11738","Farmingville","NY","40.83469","-73.0386","-5","1"
+"11739","Great River","NY","40.922326","-72.637078","-5","1"
+"11740","Greenlawn","NY","40.862565","-73.36221","-5","1"
+"11741","Holbrook","NY","40.799706","-73.07485","-5","1"
+"11742","Holtsville","NY","40.810606","-73.04036","-5","1"
+"11743","Huntington","NY","40.867498","-73.41146","-5","1"
+"11745","Smithtown","NY","40.922326","-72.637078","-5","1"
+"11746","Huntington Station","NY","40.821698","-73.37553","-5","1"
+"11747","Melville","NY","40.791593","-73.40543","-5","1"
+"11749","Islandia","NY","40.922326","-72.637078","-5","1"
+"11750","Huntington Station","NY","40.922326","-72.637078","-5","1"
+"11751","Islip","NY","40.734212","-73.21416","-5","1"
+"11752","Islip Terrace","NY","40.754386","-73.18326","-5","1"
+"11753","Jericho","NY","40.786544","-73.53675","-5","1"
+"11754","Kings Park","NY","40.888497","-73.24258","-5","1"
+"11755","Lake Grove","NY","40.855402","-73.11839","-5","1"
+"11756","Levittown","NY","40.724883","-73.51739","-5","1"
+"11757","Lindenhurst","NY","40.690049","-73.37442","-5","1"
+"11758","Massapequa","NY","40.68085","-73.46289","-5","1"
+"11760","Hauppauge","NY","40.810246","-73.191789","-5","1"
+"11762","Massapequa Park","NY","40.68505","-73.44681","-5","1"
+"11763","Medford","NY","40.820786","-72.98375","-5","1"
+"11764","Miller Place","NY","40.946506","-72.98837","-5","1"
+"11765","Mill Neck","NY","40.88889","-73.55608","-5","1"
+"11766","Mount Sinai","NY","40.929242","-73.01317","-5","1"
+"11767","Nesconset","NY","40.842962","-73.14303","-5","1"
+"11768","Northport","NY","40.905647","-73.33114","-5","1"
+"11769","Oakdale","NY","40.736011","-73.1296","-5","1"
+"11770","Ocean Beach","NY","40.643951","-73.16115","-5","1"
+"11771","Oyster Bay","NY","40.868882","-73.52292","-5","1"
+"11772","Patchogue","NY","40.770898","-73.00213","-5","1"
+"11773","Syosset","NY","40.754757","-73.601772","-5","1"
+"11774","Farmingdale","NY","40.754757","-73.601772","-5","1"
+"11775","Melville","NY","40.922326","-72.637078","-5","1"
+"11776","Port Jefferson Station","NY","40.911082","-73.04966","-5","1"
+"11777","Port Jefferson","NY","40.946103","-73.06222","-5","1"
+"11778","Rocky Point","NY","40.954093","-72.92884","-5","1"
+"11779","Ronkonkoma","NY","40.818826","-73.1187","-5","1"
+"11780","Saint James","NY","40.884394","-73.15868","-5","1"
+"11782","Sayville","NY","40.739869","-73.07198","-5","1"
+"11783","Seaford","NY","40.679752","-73.48959","-5","1"
+"11784","Selden","NY","40.869274","-73.04254","-5","1"
+"11786","Shoreham","NY","40.94993","-72.89533","-5","1"
+"11787","Smithtown","NY","40.853343","-73.20777","-5","1"
+"11788","Hauppauge","NY","40.819266","-73.20967","-5","1"
+"11789","Sound Beach","NY","40.955586","-72.9733","-5","1"
+"11790","Stony Brook","NY","40.906174","-73.12748","-5","1"
+"11791","Syosset","NY","40.815215","-73.50057","-5","1"
+"11792","Wading River","NY","40.953261","-72.8368","-5","1"
+"11793","Wantagh","NY","40.676649","-73.51122","-5","1"
+"11794","Stony Brook","NY","40.922326","-72.637078","-5","1"
+"11795","West Islip","NY","40.713459","-73.3001","-5","1"
+"11796","West Sayville","NY","40.731954","-73.10081","-5","1"
+"11797","Woodbury","NY","40.813801","-73.46912","-5","1"
+"11798","Wyandanch","NY","40.752098","-73.36516","-5","1"
+"11801","Hicksville","NY","40.763355","-73.52323","-5","1"
+"11802","Hicksville","NY","40.754757","-73.601772","-5","1"
+"11803","Plainview","NY","40.779911","-73.47948","-5","1"
+"11804","Old Bethpage","NY","40.765378","-73.45781","-5","1"
+"11805","Mid Island","NY","40.922326","-72.637078","-5","1"
+"11815","Hicksville","NY","40.754757","-73.601772","-5","1"
+"11819","Hicksville","NY","40.754757","-73.601772","-5","1"
+"11853","Jericho","NY","40.754757","-73.601772","-5","1"
+"11854","Hicksville","NY","40.754757","-73.601772","-5","1"
+"11855","Hicksville","NY","40.754757","-73.601772","-5","1"
+"11901","Riverhead","NY","40.926595","-72.65327","-5","1"
+"11930","Amagansett","NY","40.985301","-72.10411","-5","1"
+"11931","Aquebogue","NY","40.922326","-72.637078","-5","1"
+"11932","Bridgehampton","NY","40.939075","-72.30514","-5","1"
+"11933","Calverton","NY","40.933429","-72.74646","-5","1"
+"11934","Center Moriches","NY","40.797772","-72.79719","-5","1"
+"11935","Cutchogue","NY","41.012868","-72.4723","-5","1"
+"11937","East Hampton","NY","40.995384","-72.18564","-5","1"
+"11939","East Marion","NY","41.128923","-72.34189","-5","1"
+"11940","East Moriches","NY","40.806287","-72.75673","-5","1"
+"11941","Eastport","NY","40.824658","-72.72356","-5","1"
+"11942","East Quogue","NY","40.84867","-72.57794","-5","1"
+"11944","Greenport","NY","41.103838","-72.36729","-5","1"
+"11946","Hampton Bays","NY","40.875897","-72.52063","-5","1"
+"11947","Jamesport","NY","40.943323","-72.57996","-5","1"
+"11948","Laurel","NY","40.961916","-72.55024","-5","1"
+"11949","Manorville","NY","40.855861","-72.79736","-5","1"
+"11950","Mastic","NY","40.80481","-72.84664","-5","1"
+"11951","Mastic Beach","NY","40.763634","-72.84554","-5","1"
+"11952","Mattituck","NY","40.994649","-72.53731","-5","1"
+"11953","Middle Island","NY","40.886267","-72.9552","-5","1"
+"11954","Montauk","NY","41.03831","-71.9506","-5","1"
+"11955","Moriches","NY","40.805789","-72.82092","-5","1"
+"11956","New Suffolk","NY","40.991836","-72.47505","-5","1"
+"11957","Orient","NY","41.151826","-72.27511","-5","1"
+"11958","Peconic","NY","41.03687","-72.45341","-5","1"
+"11959","Quogue","NY","40.825411","-72.60506","-5","1"
+"11960","Remsenburg","NY","40.803923","-72.70421","-5","1"
+"11961","Ridge","NY","40.89609","-72.87824","-5","1"
+"11962","Sagaponack","NY","40.937683","-72.26831","-5","1"
+"11963","Sag Harbor","NY","40.99628","-72.31074","-5","1"
+"11964","Shelter Island","NY","41.060843","-72.33159","-5","1"
+"11965","Shelter Island Heights","NY","41.07815","-72.35093","-5","1"
+"11967","Shirley","NY","40.794317","-72.87181","-5","1"
+"11968","Southampton","NY","40.904348","-72.40714","-5","1"
+"11969","Southampton","NY","40.922326","-72.637078","-5","1"
+"11970","South Jamesport","NY","40.941363","-72.57502","-5","1"
+"11971","Southold","NY","41.059209","-72.42041","-5","1"
+"11972","Speonk","NY","40.8204","-72.70113","-5","1"
+"11973","Upton","NY","40.922326","-72.637078","-5","1"
+"11975","Wainscott","NY","40.947419","-72.24505","-5","1"
+"11976","Water Mill","NY","40.919693","-72.34407","-5","1"
+"11977","Westhampton","NY","40.81819","-72.67835","-5","1"
+"11978","Westhampton Beach","NY","40.816142","-72.63449","-5","1"
+"11980","Yaphank","NY","40.832858","-72.91611","-5","1"
+"12007","Alcove","NY","42.482455","-73.936671","-5","1"
+"12008","Alplaus","NY","42.853043","-73.9029","-5","1"
+"12009","Altamont","NY","42.698692","-74.03148","-5","1"
+"12010","Amsterdam","NY","42.940644","-74.17899","-5","1"
+"12015","Athens","NY","42.279649","-73.81701","-5","1"
+"12016","Auriesville","NY","42.910206","-74.423606","-5","1"
+"12017","Austerlitz","NY","42.323565","-73.45257","-5","1"
+"12018","Averill Park","NY","42.62742","-73.53494","-5","1"
+"12019","Ballston Lake","NY","42.916343","-73.86657","-5","1"
+"12020","Ballston Spa","NY","43.006309","-73.8604","-5","1"
+"12022","Berlin","NY","42.681107","-73.3489","-5","1"
+"12023","Berne","NY","42.610306","-74.15692","-5","1"
+"12024","Brainard","NY","42.494981","-73.510676","-5","1"
+"12025","Broadalbin","NY","43.07681","-74.15332","-5","1"
+"12027","Burnt Hills","NY","42.912175","-73.90355","-5","1"
+"12028","Buskirk","NY","42.932315","-73.44521","-5","1"
+"12029","Canaan","NY","42.399159","-73.42757","-5","1"
+"12031","Carlisle","NY","42.770985","-74.44694","-5","1"
+"12032","Caroga Lake","NY","43.158567","-74.49646","-5","1"
+"12033","Castleton On Hudson","NY","42.534631","-73.71327","-5","1"
+"12035","Central Bridge","NY","42.722477","-74.35064","-5","1"
+"12036","Charlotteville","NY","42.546034","-74.67315","-5","1"
+"12037","Chatham","NY","42.346758","-73.57852","-5","1"
+"12040","Cherry Plain","NY","42.646742","-73.371611","-5","1"
+"12041","Clarksville","NY","42.543326","-73.97403","-5","1"
+"12042","Climax","NY","42.403719","-73.90875","-5","1"
+"12043","Cobleskill","NY","42.696926","-74.52436","-5","1"
+"12045","Coeymans","NY","42.474135","-73.79335","-5","1"
+"12046","Coeymans Hollow","NY","42.475609","-73.92656","-5","1"
+"12047","Cohoes","NY","42.773777","-73.70793","-5","1"
+"12050","Columbiaville","NY","42.317154","-73.748555","-5","1"
+"12051","Coxsackie","NY","42.353773","-73.82774","-5","1"
+"12052","Cropseyville","NY","42.74891","-73.49405","-5","1"
+"12053","Delanson","NY","42.749499","-74.18601","-5","1"
+"12054","Delmar","NY","42.614979","-73.84086","-5","1"
+"12055","Dormansville","NY","42.614852","-73.970812","-5","1"
+"12056","Duanesburg","NY","42.767853","-74.09083","-5","1"
+"12057","Eagle Bridge","NY","42.959229","-73.35236","-5","1"
+"12058","Earlton","NY","42.350557","-73.91978","-5","1"
+"12059","East Berne","NY","42.621933","-74.05574","-5","1"
+"12060","East Chatham","NY","42.41956","-73.50412","-5","1"
+"12061","East Greenbush","NY","42.593047","-73.67343","-5","1"
+"12062","East Nassau","NY","42.525531","-73.50207","-5","1"
+"12063","East Schodack","NY","42.559697","-73.63335","-5","1"
+"12064","East Worcester","NY","42.615422","-74.6595","-5","1"
+"12065","Clifton Park","NY","42.853676","-73.78445","-5","1"
+"12066","Esperance","NY","42.784091","-74.3116","-5","1"
+"12067","Feura Bush","NY","42.561226","-73.92528","-5","1"
+"12068","Fonda","NY","42.953913","-74.37883","-5","1"
+"12069","Fort Hunter","NY","42.945701","-74.263312","-5","1"
+"12070","Fort Johnson","NY","42.970827","-74.24778","-5","1"
+"12071","Fultonham","NY","42.565907","-74.41457","-5","1"
+"12072","Fultonville","NY","42.896974","-74.37495","-5","1"
+"12073","Gallupville","NY","42.592287","-74.438129","-5","1"
+"12074","Galway","NY","43.068203","-74.05526","-5","1"
+"12075","Ghent","NY","42.305793","-73.6514","-5","1"
+"12076","Gilboa","NY","42.425405","-74.40616","-5","1"
+"12077","Glenmont","NY","42.600551","-73.79621","-5","1"
+"12078","Gloversville","NY","43.069562","-74.3436","-5","1"
+"12081","Nassau","NY","42.59362","-73.566328","-5","1"
+"12082","Grafton","NY","42.772624","-73.446834","-5","1"
+"12083","Greenville","NY","42.430684","-74.03728","-5","1"
+"12084","Guilderland","NY","42.698231","-73.89906","-5","1"
+"12085","Guilderland Center","NY","42.694777","-73.905271","-5","1"
+"12086","Hagaman","NY","42.981745","-74.14257","-5","1"
+"12087","Hannacroix","NY","42.434883","-73.89271","-5","1"
+"12089","Hoosick","NY","42.866666","-73.318113","-5","1"
+"12090","Hoosick Falls","NY","42.888816","-73.3555","-5","1"
+"12092","Howes Cave","NY","42.691779","-74.37513","-5","1"
+"12093","Jefferson","NY","42.496939","-74.62813","-5","1"
+"12094","Johnsonville","NY","42.899334","-73.49006","-5","1"
+"12095","Johnstown","NY","43.014523","-74.38473","-5","1"
+"12103","Knox","NY","42.6464","-74.130201","-5","1"
+"12106","Kinderhook","NY","42.388394","-73.70726","-5","1"
+"12107","Knox","NY","42.660046","-74.116812","-5","1"
+"12108","Lake Pleasant","NY","43.525388","-74.40875","-5","1"
+"12110","Latham","NY","42.74964","-73.76802","-5","1"
+"12111","Latham","NY","42.614852","-73.970812","-5","1"
+"12115","Malden Bridge","NY","42.469991","-73.58587","-5","1"
+"12116","Maryland","NY","42.538589","-74.92185","-5","1"
+"12117","Mayfield","NY","43.146907","-74.23466","-5","1"
+"12118","Mechanicville","NY","42.915904","-73.70539","-5","1"
+"12120","Medusa","NY","42.456127","-74.14059","-5","1"
+"12121","Melrose","NY","42.851106","-73.61867","-5","1"
+"12122","Middleburgh","NY","42.558318","-74.31458","-5","1"
+"12123","Nassau","NY","42.522197","-73.60613","-5","1"
+"12124","New Baltimore","NY","42.444198","-73.788241","-5","1"
+"12125","New Lebanon","NY","42.474028","-73.4075","-5","1"
+"12128","Newtonville","NY","42.724978","-73.764296","-5","1"
+"12130","Niverville","NY","42.442592","-73.65778","-5","1"
+"12131","North Blenheim","NY","42.482123","-74.45715","-5","1"
+"12132","North Chatham","NY","42.466061","-73.629296","-5","1"
+"12133","North Hoosick","NY","42.926121","-73.346409","-5","1"
+"12134","Northville","NY","43.21892","-74.14822","-5","1"
+"12136","Old Chatham","NY","42.437594","-73.55599","-5","1"
+"12137","Pattersonville","NY","42.862695","-74.11759","-5","1"
+"12138","Petersburg","NY","42.760049","-73.36801","-5","1"
+"12139","Piseco","NY","43.40276","-74.56972","-5","1"
+"12140","Poestenkill","NY","42.693228","-73.56922","-5","1"
+"12141","Quaker Street","NY","42.731771","-74.185395","-5","1"
+"12143","Ravena","NY","42.46915","-73.82956","-5","1"
+"12144","Rensselaer","NY","42.63738","-73.72587","-5","1"
+"12147","Rensselaerville","NY","42.518386","-74.15997","-5","1"
+"12148","Rexford","NY","42.842133","-73.86828","-5","1"
+"12149","Richmondville","NY","42.63119","-74.572","-5","1"
+"12150","Rotterdam Junction","NY","42.876756","-74.05452","-5","1"
+"12151","Round Lake","NY","42.932326","-73.79363","-5","1"
+"12153","Sand Lake","NY","42.638579","-73.48051","-5","1"
+"12154","Schaghticoke","NY","42.925765","-73.60664","-5","1"
+"12155","Schenevus","NY","42.587708","-74.83536","-5","1"
+"12156","Schodack Landing","NY","42.479967","-73.73647","-5","1"
+"12157","Schoharie","NY","42.668825","-74.30134","-5","1"
+"12158","Selkirk","NY","42.539822","-73.81545","-5","1"
+"12159","Slingerlands","NY","42.646978","-73.87151","-5","1"
+"12160","Sloansville","NY","42.757815","-74.34369","-5","1"
+"12161","South Bethlehem","NY","42.521038","-73.851898","-5","1"
+"12162","South Schodack","NY","42.513906","-73.702443","-5","1"
+"12164","Speculator","NY","43.515611","-74.37431","-5","1"
+"12165","Spencertown","NY","42.317959","-73.51802","-5","1"
+"12166","Sprakers","NY","42.831683","-74.45667","-5","1"
+"12167","Stamford","NY","42.414519","-74.59577","-5","1"
+"12168","Stephentown","NY","42.552127","-73.39593","-5","1"
+"12169","Stephentown","NY","42.57612","-73.44559","-5","1"
+"12170","Stillwater","NY","42.975154","-73.66576","-5","1"
+"12172","Stottville","NY","42.285749","-73.733532","-5","1"
+"12173","Stuyvesant","NY","42.377829","-73.75943","-5","1"
+"12174","Stuyvesant Falls","NY","42.343986","-73.73477","-5","1"
+"12175","Summit","NY","42.559096","-74.55282","-5","1"
+"12176","Surprise","NY","42.393192","-73.96763","-5","1"
+"12177","Tribes Hill","NY","42.95002","-74.296985","-5","1"
+"12179","Troy","NY","42.71144","-73.525561","-5","1"
+"12180","Troy","NY","42.731628","-73.66465","-5","1"
+"12181","Troy","NY","42.738678","-73.673862","-5","1"
+"12182","Troy","NY","42.785887","-73.66221","-5","1"
+"12183","Troy","NY","42.743289","-73.69482","-5","1"
+"12184","Valatie","NY","42.426901","-73.66405","-5","1"
+"12185","Valley Falls","NY","42.884779","-73.53703","-5","1"
+"12186","Voorheesville","NY","42.638481","-73.95946","-5","1"
+"12187","Warnerville","NY","42.624507","-74.46772","-5","1"
+"12188","Waterford","NY","42.80535","-73.68976","-5","1"
+"12189","Watervliet","NY","42.729278","-73.70913","-5","1"
+"12190","Wells","NY","43.43305","-74.2901","-5","1"
+"12192","West Coxsackie","NY","42.413742","-73.81773","-5","1"
+"12193","Westerlo","NY","42.515818","-74.04978","-5","1"
+"12194","West Fulton","NY","42.529042","-74.44937","-5","1"
+"12195","West Lebanon","NY","42.479384","-73.474809","-5","1"
+"12196","West Sand Lake","NY","42.631625","-73.61619","-5","1"
+"12197","Worcester","NY","42.610314","-74.72401","-5","1"
+"12198","Wynantskill","NY","42.685311","-73.63801","-5","1"
+"12201","Albany","NY","42.614852","-73.970812","-5","1"
+"12202","Albany","NY","42.640129","-73.76061","-5","1"
+"12203","Albany","NY","42.678112","-73.82983","-5","1"
+"12204","Albany","NY","42.683727","-73.73329","-5","1"
+"12205","Albany","NY","42.713328","-73.8179","-5","1"
+"12206","Albany","NY","42.669645","-73.77719","-5","1"
+"12207","Albany","NY","42.653979","-73.74833","-5","1"
+"12208","Albany","NY","42.654978","-73.80053","-5","1"
+"12209","Albany","NY","42.640813","-73.7856","-5","1"
+"12210","Albany","NY","42.656679","-73.75894","-5","1"
+"12211","Albany","NY","42.705345","-73.76924","-5","1"
+"12212","Albany","NY","42.716774","-73.810373","-5","1"
+"12214","Albany","NY","42.614852","-73.970812","-5","1"
+"12220","Albany","NY","42.614852","-73.970812","-5","1"
+"12222","Albany","NY","42.692909","-73.838035","-5","1"
+"12223","Albany","NY","42.614852","-73.970812","-5","1"
+"12224","Albany","NY","42.614852","-73.970812","-5","1"
+"12225","Albany","NY","42.614852","-73.970812","-5","1"
+"12226","Albany","NY","42.614852","-73.970812","-5","1"
+"12227","Albany","NY","42.614852","-73.970812","-5","1"
+"12228","Albany","NY","42.614852","-73.970812","-5","1"
+"12229","Albany","NY","42.614852","-73.970812","-5","1"
+"12230","Albany","NY","42.614852","-73.970812","-5","1"
+"12231","Albany","NY","42.614852","-73.970812","-5","1"
+"12232","Albany","NY","42.614852","-73.970812","-5","1"
+"12233","Albany","NY","42.614852","-73.970812","-5","1"
+"12234","Albany","NY","42.614852","-73.970812","-5","1"
+"12235","Albany","NY","42.614852","-73.970812","-5","1"
+"12236","Albany","NY","42.614852","-73.970812","-5","1"
+"12237","Albany","NY","42.614852","-73.970812","-5","1"
+"12238","Albany","NY","42.614852","-73.970812","-5","1"
+"12239","Albany","NY","42.614852","-73.970812","-5","1"
+"12240","Albany","NY","42.614852","-73.970812","-5","1"
+"12241","Albany","NY","42.614852","-73.970812","-5","1"
+"12242","Albany","NY","42.614852","-73.970812","-5","1"
+"12243","Albany","NY","42.614852","-73.970812","-5","1"
+"12244","Albany","NY","42.614852","-73.970812","-5","1"
+"12245","Albany","NY","42.614852","-73.970812","-5","1"
+"12246","Albany","NY","42.647079","-73.750314","-5","1"
+"12247","Albany","NY","42.614852","-73.970812","-5","1"
+"12248","Albany","NY","42.614852","-73.970812","-5","1"
+"12249","Albany","NY","42.614852","-73.970812","-5","1"
+"12250","Albany","NY","42.614852","-73.970812","-5","1"
+"12252","Albany","NY","42.614852","-73.970812","-5","1"
+"12255","Albany","NY","42.614852","-73.970812","-5","1"
+"12256","Albany","NY","42.614852","-73.970812","-5","1"
+"12257","Albany","NY","42.614852","-73.970812","-5","1"
+"12260","Albany","NY","42.614852","-73.970812","-5","1"
+"12261","Albany","NY","42.614852","-73.970812","-5","1"
+"12262","Albany","NY","42.614852","-73.970812","-5","1"
+"12288","Albany","NY","42.614852","-73.970812","-5","1"
+"12301","Schenectady","NY","42.833261","-74.058015","-5","1"
+"12302","Schenectady","NY","42.862193","-73.96317","-5","1"
+"12303","Schenectady","NY","42.769009","-73.93619","-5","1"
+"12304","Schenectady","NY","42.779026","-73.90507","-5","1"
+"12305","Schenectady","NY","42.814476","-73.94337","-5","1"
+"12306","Schenectady","NY","42.793326","-73.98942","-5","1"
+"12307","Schenectady","NY","42.804076","-73.93571","-5","1"
+"12308","Schenectady","NY","42.820909","-73.92002","-5","1"
+"12309","Schenectady","NY","42.800276","-73.88096","-5","1"
+"12325","Schenectady","NY","42.833261","-74.058015","-5","1"
+"12345","Schenectady","NY","42.833261","-74.058015","-5","1"
+"12401","Kingston","NY","41.932315","-74.02259","-5","1"
+"12402","Kingston","NY","41.878801","-74.345684","-5","1"
+"12404","Accord","NY","41.811322","-74.23471","-5","1"
+"12405","Acra","NY","42.320081","-74.07288","-5","1"
+"12406","Arkville","NY","42.130111","-74.57574","-5","1"
+"12407","Ashland","NY","42.321453","-74.33926","-5","1"
+"12409","Bearsville","NY","42.061841","-74.16063","-5","1"
+"12410","Big Indian","NY","42.114646","-74.4557","-5","1"
+"12411","Bloomington","NY","41.87916","-74.03995","-5","1"
+"12412","Boiceville","NY","42.001351","-74.2619","-5","1"
+"12413","Cairo","NY","42.307982","-74.008","-5","1"
+"12414","Catskill","NY","42.223002","-73.90452","-5","1"
+"12416","Chichester","NY","42.105611","-74.29143","-5","1"
+"12417","Connelly","NY","41.907604","-73.989254","-5","1"
+"12418","Cornwallville","NY","42.357579","-74.15136","-5","1"
+"12419","Cottekill","NY","41.852449","-74.10605","-5","1"
+"12420","Cragsmoor","NY","41.674288","-74.37833","-5","1"
+"12421","Denver","NY","42.249541","-74.54558","-5","1"
+"12422","Durham","NY","42.390291","-74.20164","-5","1"
+"12423","East Durham","NY","42.378679","-74.10443","-5","1"
+"12424","East Jewett","NY","42.240343","-74.15932","-5","1"
+"12427","Elka Park","NY","42.167622","-74.15306","-5","1"
+"12428","Ellenville","NY","41.727588","-74.42061","-5","1"
+"12429","Esopus","NY","41.816628","-73.97824","-5","1"
+"12430","Fleischmanns","NY","42.183262","-74.52154","-5","1"
+"12431","Freehold","NY","42.361838","-74.02471","-5","1"
+"12432","Glasco","NY","41.949795","-74.003246","-5","1"
+"12433","Glenford","NY","42.000093","-74.15946","-5","1"
+"12434","Grand Gorge","NY","42.368009","-74.50137","-5","1"
+"12435","Greenfield Park","NY","41.725808","-74.52106","-5","1"
+"12436","Haines Falls","NY","42.19551","-74.102319","-5","1"
+"12438","Halcottsville","NY","42.183045","-74.925617","-5","1"
+"12439","Hensonville","NY","42.302596","-74.22711","-5","1"
+"12440","High Falls","NY","41.801696","-74.14187","-5","1"
+"12441","Highmount","NY","41.878801","-74.345684","-5","1"
+"12442","Hunter","NY","42.222061","-74.23418","-5","1"
+"12443","Hurley","NY","41.92674","-74.06797","-5","1"
+"12444","Jewett","NY","42.260634","-74.27527","-5","1"
+"12446","Kerhonkson","NY","41.790385","-74.30413","-5","1"
+"12447","Saugerties","NY","42.039355","-74.067014","-5","1"
+"12448","Lake Hill","NY","42.073259","-74.1893","-5","1"
+"12449","Lake Katrine","NY","41.993639","-73.99843","-5","1"
+"12450","Lanesville","NY","42.157937","-74.23034","-5","1"
+"12451","Leeds","NY","42.281117","-73.94006","-5","1"
+"12452","Lexington","NY","42.223407","-74.386635","-5","1"
+"12453","Malden On Hudson","NY","42.098698","-73.935418","-5","1"
+"12454","Maplecrest","NY","42.280261","-74.18349","-5","1"
+"12455","Margaretville","NY","42.151449","-74.64261","-5","1"
+"12456","Mount Marion","NY","42.034256","-73.99876","-5","1"
+"12457","Mount Tremper","NY","42.038539","-74.23905","-5","1"
+"12458","Napanoch","NY","41.802898","-74.40025","-5","1"
+"12459","New Kingston","NY","42.227987","-74.68912","-5","1"
+"12460","Oak Hill","NY","42.406464","-74.15692","-5","1"
+"12461","Olivebridge","NY","41.912356","-74.24724","-5","1"
+"12463","Palenville","NY","42.174411","-74.01599","-5","1"
+"12464","Phoenicia","NY","42.081269","-74.32629","-5","1"
+"12465","Pine Hill","NY","42.136293","-74.473639","-5","1"
+"12466","Port Ewen","NY","41.905004","-73.97957","-5","1"
+"12468","Prattsville","NY","42.297725","-74.40063","-5","1"
+"12469","Preston Hollow","NY","42.442592","-74.24159","-5","1"
+"12470","Purling","NY","42.284773","-74.02388","-5","1"
+"12471","Rifton","NY","41.83962","-74.04033","-5","1"
+"12472","Rosendale","NY","41.846938","-74.07602","-5","1"
+"12473","Round Top","NY","42.260709","-74.03078","-5","1"
+"12474","Roxbury","NY","42.285644","-74.59011","-5","1"
+"12475","Ruby","NY","42.017632","-74.007868","-5","1"
+"12477","Saugerties","NY","42.085634","-73.97685","-5","1"
+"12480","Shandaken","NY","42.142121","-74.4065","-5","1"
+"12481","Shokan","NY","41.974857","-74.20686","-5","1"
+"12482","South Cairo","NY","42.270559","-73.95729","-5","1"
+"12483","Spring Glen","NY","41.663895","-74.424533","-5","1"
+"12484","Stone Ridge","NY","41.850294","-74.16619","-5","1"
+"12485","Tannersville","NY","42.199479","-74.12514","-5","1"
+"12486","Tillson","NY","41.831082","-74.07207","-5","1"
+"12487","Ulster Park","NY","41.855761","-73.99207","-5","1"
+"12489","Wawarsing","NY","41.757766","-74.35392","-5","1"
+"12490","West Camp","NY","42.108689","-73.934577","-5","1"
+"12491","West Hurley","NY","41.998199","-74.10967","-5","1"
+"12492","West Kill","NY","42.209414","-74.34767","-5","1"
+"12493","West Park","NY","41.805576","-73.96845","-5","1"
+"12494","West Shokan","NY","41.961316","-74.27687","-5","1"
+"12495","Willow","NY","42.080232","-74.24801","-5","1"
+"12496","Windham","NY","42.326918","-74.24657","-5","1"
+"12498","Woodstock","NY","42.037356","-74.11016","-5","1"
+"12501","Amenia","NY","41.852959","-73.55727","-5","1"
+"12502","Ancram","NY","42.086628","-73.6642","-5","1"
+"12503","Ancramdale","NY","42.045941","-73.57792","-5","1"
+"12504","Annandale On Hudson","NY","42.035434","-73.909234","-5","1"
+"12506","Bangall","NY","41.759905","-73.743714","-5","1"
+"12507","Barrytown","NY","42.005984","-73.92132","-5","1"
+"12508","Beacon","NY","41.505993","-73.96198","-5","1"
+"12509","La Grange","NY","41.643599","-73.847176","-5","1"
+"12510","Billings","NY","41.759905","-73.743714","-5","1"
+"12511","Castle Point","NY","41.759905","-73.743714","-5","1"
+"12512","Chelsea","NY","41.552793","-73.968183","-5","1"
+"12513","Claverack","NY","42.220962","-73.71182","-5","1"
+"12514","Clinton Corners","NY","41.874183","-73.76727","-5","1"
+"12515","Clintondale","NY","41.681096","-74.06421","-5","1"
+"12516","Copake","NY","42.112895","-73.56201","-5","1"
+"12517","Copake Falls","NY","42.144585","-73.51463","-5","1"
+"12518","Cornwall","NY","41.434476","-74.03584","-5","1"
+"12520","Cornwall On Hudson","NY","41.442589","-74.01389","-5","1"
+"12521","Craryville","NY","42.176216","-73.65036","-5","1"
+"12522","Dover Plains","NY","41.738853","-73.58921","-5","1"
+"12523","Elizaville","NY","42.080964","-73.77856","-5","1"
+"12524","Fishkill","NY","41.537232","-73.8972","-5","1"
+"12525","Gardiner","NY","41.691524","-74.18764","-5","1"
+"12526","Germantown","NY","42.123977","-73.86199","-5","1"
+"12527","Glenham","NY","41.520249","-73.933259","-5","1"
+"12528","Highland","NY","41.713682","-73.9965","-5","1"
+"12529","Hillsdale","NY","42.204681","-73.54775","-5","1"
+"12530","Hollowville","NY","42.210991","-73.687001","-5","1"
+"12531","Holmes","NY","41.519085","-73.67241","-5","1"
+"12533","Hopewell Junction","NY","41.573253","-73.79347","-5","1"
+"12534","Hudson","NY","42.22948","-73.75846","-5","1"
+"12537","Hughsonville","NY","41.582437","-73.936281","-5","1"
+"12538","Hyde Park","NY","41.779541","-73.90155","-5","1"
+"12540","Lagrangeville","NY","41.656933","-73.74539","-5","1"
+"12541","Livingston","NY","42.142068","-73.757399","-5","1"
+"12542","Marlboro","NY","41.603333","-73.98415","-5","1"
+"12543","Maybrook","NY","41.484988","-74.2161","-5","1"
+"12544","Mellenville","NY","42.259623","-73.667962","-5","1"
+"12545","Millbrook","NY","41.785109","-73.68075","-5","1"
+"12546","Millerton","NY","41.961002","-73.52011","-5","1"
+"12547","Milton","NY","41.656805","-73.96831","-5","1"
+"12548","Modena","NY","41.664239","-74.1106","-5","1"
+"12549","Montgomery","NY","41.520396","-74.24712","-5","1"
+"12550","Newburgh","NY","41.521593","-74.04072","-5","1"
+"12551","Newburgh","NY","41.387822","-74.354699","-5","1"
+"12552","Newburgh","NY","41.387822","-74.354699","-5","1"
+"12553","New Windsor","NY","41.46359","-74.05975","-5","1"
+"12555","Mid Hudson","NY","41.387822","-74.354699","-5","1"
+"12557","Newburgh","NY","41.507368","-74.061301","-5","1"
+"12561","New Paltz","NY","41.751566","-74.09475","-5","1"
+"12563","Patterson","NY","41.483689","-73.57293","-5","1"
+"12564","Pawling","NY","41.570328","-73.59825","-5","1"
+"12565","Philmont","NY","42.24862","-73.6476","-5","1"
+"12566","Pine Bush","NY","41.61134","-74.32764","-5","1"
+"12567","Pine Plains","NY","41.997807","-73.66663","-5","1"
+"12568","Plattekill","NY","41.641207","-74.07805","-5","1"
+"12569","Pleasant Valley","NY","41.746469","-73.80414","-5","1"
+"12570","Poughquag","NY","41.614667","-73.67709","-5","1"
+"12571","Red Hook","NY","42.002691","-73.8442","-5","1"
+"12572","Rhinebeck","NY","41.930983","-73.88271","-5","1"
+"12574","Rhinecliff","NY","41.915068","-73.95173","-5","1"
+"12575","Rock Tavern","NY","41.478722","-74.15626","-5","1"
+"12577","Salisbury Mills","NY","41.433856","-74.11963","-5","1"
+"12578","Salt Point","NY","41.803384","-73.78147","-5","1"
+"12580","Staatsburg","NY","41.854465","-73.89922","-5","1"
+"12581","Stanfordville","NY","41.89187","-73.69888","-5","1"
+"12582","Stormville","NY","41.549525","-73.72745","-5","1"
+"12583","Tivoli","NY","42.060034","-73.88393","-5","1"
+"12584","Vails Gate","NY","41.464073","-74.059104","-5","1"
+"12585","Verbank","NY","41.721384","-73.7162","-5","1"
+"12586","Walden","NY","41.563701","-74.1755","-5","1"
+"12588","Walker Valley","NY","41.878801","-74.345684","-5","1"
+"12589","Wallkill","NY","41.615036","-74.15461","-5","1"
+"12590","Wappingers Falls","NY","41.59466","-73.89579","-5","1"
+"12592","Wassaic","NY","41.782781","-73.55792","-5","1"
+"12593","West Copake","NY","42.243991","-73.641076","-5","1"
+"12594","Wingdale","NY","41.646584","-73.56209","-5","1"
+"12601","Poughkeepsie","NY","41.701443","-73.91922","-5","1"
+"12602","Poughkeepsie","NY","41.759905","-73.743714","-5","1"
+"12603","Poughkeepsie","NY","41.67086","-73.88107","-5","1"
+"12604","Poughkeepsie","NY","41.759905","-73.743714","-5","1"
+"12697","Moira","NY","44.776061","-74.596249","-5","1"
+"12701","Monticello","NY","41.653071","-74.69748","-5","1"
+"12710","Neversink","NY","41.818926","-74.521638","-5","1"
+"12719","Barryville","NY","41.480326","-74.92694","-5","1"
+"12720","Bethel","NY","41.66023","-74.90438","-5","1"
+"12721","Bloomingburg","NY","41.564426","-74.4265","-5","1"
+"12722","Burlingham","NY","41.719016","-74.755373","-5","1"
+"12723","Callicoon","NY","41.769427","-75.02808","-5","1"
+"12724","Callicoon Center","NY","41.858278","-74.95034","-5","1"
+"12725","Claryville","NY","41.926119","-74.55675","-5","1"
+"12726","Cochecton","NY","41.694153","-74.97593","-5","1"
+"12727","Cochecton Center","NY","41.657225","-74.98161","-5","1"
+"12729","Cuddebackville","NY","41.475235","-74.60276","-5","1"
+"12732","Eldred","NY","41.545318","-74.87533","-5","1"
+"12733","Fallsburg","NY","41.732505","-74.60896","-5","1"
+"12734","Ferndale","NY","41.734913","-74.75013","-5","1"
+"12736","Fremont Center","NY","41.848244","-75.03878","-5","1"
+"12737","Glen Spey","NY","41.48397","-74.81186","-5","1"
+"12738","Glen Wild","NY","41.648888","-74.57064","-5","1"
+"12739","Godeffroy","NY","41.437427","-74.60322","-5","1"
+"12740","Grahamsville","NY","41.85304","-74.52915","-5","1"
+"12741","Hankins","NY","41.838672","-75.08718","-5","1"
+"12742","Harris","NY","41.720235","-74.72901","-5","1"
+"12743","Highland Lake","NY","41.53481","-74.84656","-5","1"
+"12745","Hortonville","NY","41.762944","-75.030592","-5","1"
+"12746","Huguenot","NY","41.436732","-74.64558","-5","1"
+"12747","Hurleyville","NY","41.752458","-74.66996","-5","1"
+"12748","Jeffersonville","NY","41.774223","-74.92211","-5","1"
+"12749","Kauneonga Lake","NY","41.6896","-74.8272","-5","1"
+"12750","Kenoza Lake","NY","41.729581","-74.961146","-5","1"
+"12751","Kiamesha Lake","NY","41.679152","-74.657","-5","1"
+"12752","Lake Huntington","NY","41.677243","-74.99109","-5","1"
+"12754","Liberty","NY","41.798476","-74.7361","-5","1"
+"12755","Ellenburg","NY","44.842975","-73.973533","-5","1"
+"12756","Livingston Manor","NY","41.900542","-74.827587","-5","1"
+"12758","Livingston Manor","NY","41.920201","-74.7857","-5","1"
+"12759","Loch Sheldrake","NY","41.780299","-74.65618","-5","1"
+"12760","Long Eddy","NY","41.901849","-75.10493","-5","1"
+"12762","Mongaup Valley","NY","41.676676","-74.80674","-5","1"
+"12763","Mountain Dale","NY","41.690795","-74.52273","-5","1"
+"12764","Narrowsburg","NY","41.588604","-74.99385","-5","1"
+"12765","Neversink","NY","41.845381","-74.61427","-5","1"
+"12766","North Branch","NY","41.815316","-74.97995","-5","1"
+"12767","Obernburg","NY","41.719016","-74.755373","-5","1"
+"12768","Parksville","NY","41.864326","-74.72961","-5","1"
+"12769","Phillipsport","NY","41.651453","-74.436159","-5","1"
+"12770","Pond Eddy","NY","41.44515","-74.84003","-5","1"
+"12771","Port Jervis","NY","41.374734","-74.66315","-5","1"
+"12775","Rock Hill","NY","41.614218","-74.58836","-5","1"
+"12776","Roscoe","NY","41.94836","-74.94475","-5","1"
+"12777","Forestburgh","NY","41.562141","-74.71252","-5","1"
+"12778","Smallwood","NY","41.65974","-74.812","-5","1"
+"12779","South Fallsburg","NY","41.705649","-74.62985","-5","1"
+"12780","Sparrow Bush","NY","41.429425","-74.72244","-5","1"
+"12781","Summitville","NY","41.719016","-74.755373","-5","1"
+"12782","Sundown","NY","41.881485","-74.430063","-5","1"
+"12783","Swan Lake","NY","41.736523","-74.82634","-5","1"
+"12784","Thompsonville","NY","41.676139","-74.6217","-5","1"
+"12785","Westbrookville","NY","41.518125","-74.57566","-5","1"
+"12786","White Lake","NY","41.649008","-74.85751","-5","1"
+"12787","White Sulphur Springs","NY","41.80854","-74.84599","-5","1"
+"12788","Woodbourne","NY","41.784477","-74.59109","-5","1"
+"12789","Woodridge","NY","41.708062","-74.5698","-5","1"
+"12790","Wurtsboro","NY","41.592087","-74.50677","-5","1"
+"12791","Youngsville","NY","41.807694","-74.87957","-5","1"
+"12792","Yulan","NY","41.522825","-74.93164","-5","1"
+"12793","Bethel","NY","41.736963","-74.797524","-5","1"
+"12801","Glens Falls","NY","43.312104","-73.64825","-5","1"
+"12803","South Glens Falls","NY","43.288818","-73.63643","-5","1"
+"12804","Queensbury","NY","43.330471","-73.67816","-5","1"
+"12805","Argyle","NY","43.246117","-73.455519","-5","1"
+"12807","New Baltimore","NY","42.425733","-73.899871","-5","1"
+"12808","Adirondack","NY","43.758733","-73.76206","-5","1"
+"12809","Argyle","NY","43.229054","-73.4674","-5","1"
+"12810","Athol","NY","43.484741","-73.89151","-5","1"
+"12811","Bakers Mills","NY","43.62422","-74.061201","-5","1"
+"12812","Blue Mountain Lake","NY","43.865351","-74.43366","-5","1"
+"12814","Bolton Landing","NY","43.582318","-73.65515","-5","1"
+"12815","Brant Lake","NY","43.703484","-73.71123","-5","1"
+"12816","Cambridge","NY","43.039226","-73.38557","-5","1"
+"12817","Chestertown","NY","43.638919","-73.81782","-5","1"
+"12819","Clemons","NY","43.583211","-73.47852","-5","1"
+"12820","Cleverdale","NY","43.47181","-73.639291","-5","1"
+"12821","Comstock","NY","43.461692","-73.40197","-5","1"
+"12822","Corinth","NY","43.248892","-73.85172","-5","1"
+"12823","Cossayuna","NY","43.178983","-73.40767","-5","1"
+"12824","Diamond Point","NY","43.50964","-73.69776","-5","1"
+"12825","Queensbury","NY","42.973468","-74.406393","-5","1"
+"12827","Fort Ann","NY","43.414017","-73.50464","-5","1"
+"12828","Fort Edward","NY","43.253125","-73.58549","-5","1"
+"12830","Wilton","NY","43.12943","-73.712415","-5","1"
+"12831","Gansevoort","NY","43.174566","-73.68848","-5","1"
+"12832","Granville","NY","43.376197","-73.31153","-5","1"
+"12833","Greenfield Center","NY","43.128878","-73.8555","-5","1"
+"12834","Greenwich","NY","43.095447","-73.50177","-5","1"
+"12835","Hadley","NY","43.292593","-73.978","-5","1"
+"12836","Hague","NY","43.750773","-73.51881","-5","1"
+"12837","Hampton","NY","43.500423","-73.26044","-5","1"
+"12838","Hartford","NY","43.345875","-73.40651","-5","1"
+"12839","Hudson Falls","NY","43.316622","-73.5735","-5","1"
+"12841","Huletts Landing","NY","43.642332","-73.50948","-5","1"
+"12842","Indian Lake","NY","43.761451","-74.26631","-5","1"
+"12843","Johnsburg","NY","43.569961","-73.98345","-5","1"
+"12844","Kattskill Bay","NY","43.495335","-73.62987","-5","1"
+"12845","Lake George","NY","43.41928","-73.70766","-5","1"
+"12846","Lake Luzerne","NY","43.329851","-73.82911","-5","1"
+"12847","Long Lake","NY","43.97643","-74.56669","-5","1"
+"12848","Middle Falls","NY","43.100123","-73.524554","-5","1"
+"12849","Middle Granville","NY","43.433107","-73.29152","-5","1"
+"12850","Middle Grove","NY","43.092312","-73.97033","-5","1"
+"12851","Minerva","NY","43.841369","-74.03747","-5","1"
+"12852","Newcomb","NY","43.972307","-74.15321","-5","1"
+"12853","North Creek","NY","43.683067","-73.97457","-5","1"
+"12854","North Granville","NY","43.452517","-73.34095","-5","1"
+"12855","North Hudson","NY","43.996303","-73.72147","-5","1"
+"12856","North River","NY","43.722082","-74.10546","-5","1"
+"12857","Olmstedville","NY","43.795443","-73.93994","-5","1"
+"12858","Paradox","NY","43.888754","-73.65812","-5","1"
+"12859","Porter Corners","NY","43.182144","-73.88689","-5","1"
+"12860","Pottersville","NY","43.719612","-73.81116","-5","1"
+"12861","Putnam Station","NY","43.74531","-73.41569","-5","1"
+"12862","Riparius","NY","43.675377","-73.932509","-5","1"
+"12863","Rock City Falls","NY","43.067531","-73.93002","-5","1"
+"12864","Sabael","NY","43.667618","-74.456913","-5","1"
+"12865","Salem","NY","43.200351","-73.3526","-5","1"
+"12866","Saratoga Springs","NY","43.080399","-73.77038","-5","1"
+"12870","Schroon Lake","NY","43.835376","-73.75802","-5","1"
+"12871","Schuylerville","NY","43.088919","-73.59633","-5","1"
+"12872","Severance","NY","44.145678","-73.815204","-5","1"
+"12873","Shushan","NY","43.11595","-73.31852","-5","1"
+"12874","Silver Bay","NY","43.685475","-73.50767","-5","1"
+"12877","Whitehall","NY","43.618466","-73.354596","-5","1"
+"12878","Stony Creek","NY","43.426652","-73.96174","-5","1"
+"12879","Newcomb","NY","44.145678","-73.815204","-5","1"
+"12883","Ticonderoga","NY","43.858226","-73.45414","-5","1"
+"12884","Victory Mills","NY","43.088397","-73.591652","-5","1"
+"12885","Warrensburg","NY","43.538744","-73.80527","-5","1"
+"12886","Wevertown","NY","43.638462","-73.91693","-5","1"
+"12887","Whitehall","NY","43.547822","-73.38318","-5","1"
+"12901","Plattsburgh","NY","44.693271","-73.46617","-5","1"
+"12903","Plattsburgh","NY","44.683468","-73.44639","-5","1"
+"12910","Altona","NY","44.879986","-73.65694","-5","1"
+"12911","Keeseville","NY","44.530527","-73.46734","-5","1"
+"12912","Au Sable Forks","NY","44.466008","-73.73441","-5","1"
+"12913","Bloomingdale","NY","44.421547","-73.99256","-5","1"
+"12914","Bombay","NY","44.927856","-74.60211","-5","1"
+"12915","Brainardsville","NY","44.552725","-74.317958","-5","1"
+"12916","Brushton","NY","44.830736","-74.51434","-5","1"
+"12917","Burke","NY","44.915973","-74.16565","-5","1"
+"12918","Cadyville","NY","44.692862","-73.66667","-5","1"
+"12919","Champlain","NY","44.965887","-73.43636","-5","1"
+"12920","Chateaugay","NY","44.901543","-74.06054","-5","1"
+"12921","Chazy","NY","44.88821","-73.43225","-5","1"
+"12922","Childwold","NY","44.224185","-74.76539","-5","1"
+"12923","Churubusco","NY","44.948894","-73.96545","-5","1"
+"12924","Keeseville","NY","44.706561","-73.744555","-5","1"
+"12926","Constable","NY","44.953782","-74.32809","-5","1"
+"12927","Cranberry Lake","NY","44.220971","-74.85053","-5","1"
+"12928","Crown Point","NY","43.95037","-73.48357","-5","1"
+"12929","Dannemora","NY","44.847709","-73.582317","-5","1"
+"12930","Dickinson Center","NY","44.731571","-74.53485","-5","1"
+"12932","Elizabethtown","NY","44.212623","-73.59542","-5","1"
+"12933","Ellenburg","NY","44.881962","-73.963279","-5","1"
+"12934","Ellenburg Center","NY","44.865972","-73.89584","-5","1"
+"12935","Ellenburg Depot","NY","44.83218","-73.80001","-5","1"
+"12936","Essex","NY","44.259479","-73.40591","-5","1"
+"12937","Fort Covington","NY","44.972087","-74.48703","-5","1"
+"12938","Pleasant Valley","NY","41.773053","-73.856116","-5","1"
+"12939","Gabriels","NY","44.552725","-74.317958","-5","1"
+"12941","Jay","NY","44.3919","-73.73028","-5","1"
+"12942","Keene","NY","44.25462","-73.78934","-5","1"
+"12943","Keene Valley","NY","44.171625","-73.78131","-5","1"
+"12944","Keeseville","NY","44.483465","-73.4801","-5","1"
+"12945","Lake Clear","NY","44.360566","-74.25801","-5","1"
+"12946","Lake Placid","NY","44.292147","-73.95985","-5","1"
+"12949","Lawrenceville","NY","44.746861","-74.660413","-5","1"
+"12950","Lewis","NY","44.322102","-73.5404","-5","1"
+"12952","Lyon Mountain","NY","44.715159","-73.91824","-5","1"
+"12953","Malone","NY","44.813419","-74.2772","-5","1"
+"12955","Lyon Mountain","NY","44.787489","-73.98702","-5","1"
+"12956","Mineville","NY","44.088275","-73.51745","-5","1"
+"12957","Moira","NY","44.833996","-74.5716","-5","1"
+"12958","Mooers","NY","44.958106","-73.58022","-5","1"
+"12959","Mooers Forks","NY","44.951443","-73.68023","-5","1"
+"12960","Moriah","NY","44.025573","-73.51287","-5","1"
+"12961","Moriah Center","NY","44.061849","-73.58384","-5","1"
+"12962","Morrisonville","NY","44.711769","-73.58219","-5","1"
+"12964","New Russia","NY","44.129094","-73.64792","-5","1"
+"12965","Nicholville","NY","44.698253","-74.68843","-5","1"
+"12966","North Bangor","NY","44.812315","-74.40784","-5","1"
+"12967","North Lawrence","NY","44.784144","-74.66213","-5","1"
+"12969","Owls Head","NY","44.711622","-74.09679","-5","1"
+"12970","Paul Smiths","NY","44.454639","-74.28753","-5","1"
+"12972","Peru","NY","44.563323","-73.52307","-5","1"
+"12973","Piercefield","NY","44.234289","-74.555957","-5","1"
+"12974","Port Henry","NY","44.041901","-73.46132","-5","1"
+"12975","Port Kent","NY","44.526437","-73.409243","-5","1"
+"12976","Rainbow Lake","NY","44.552725","-74.317958","-5","1"
+"12977","Ray Brook","NY","44.145678","-73.815204","-5","1"
+"12978","Redford","NY","44.664956","-73.761204","-5","1"
+"12979","Rouses Point","NY","44.990606","-73.37017","-5","1"
+"12980","Saint Regis Falls","NY","44.63091","-74.53721","-5","1"
+"12981","Saranac","NY","44.617642","-73.81196","-5","1"
+"12983","Saranac Lake","NY","44.324736","-74.16843","-5","1"
+"12985","Schuyler Falls","NY","44.589583","-73.71355","-5","1"
+"12986","Tupper Lake","NY","44.220344","-74.46299","-5","1"
+"12987","Upper Jay","NY","44.329473","-73.79282","-5","1"
+"12989","Vermontville","NY","44.519178","-74.06053","-5","1"
+"12992","West Chazy","NY","44.819829","-73.51156","-5","1"
+"12993","Westport","NY","44.195201","-73.47194","-5","1"
+"12995","Whippleville","NY","44.805681","-74.252254","-5","1"
+"12996","Willsboro","NY","44.373007","-73.40668","-5","1"
+"12997","Wilmington","NY","44.145678","-73.815204","-5","1"
+"12998","Witherbee","NY","44.08267","-73.530601","-5","1"
+"13020","Apulia Station","NY","42.823968","-76.062425","-5","1"
+"13021","Auburn","NY","42.922273","-76.55882","-5","1"
+"13022","Auburn","NY","43.163364","-76.509567","-5","1"
+"13024","Auburn","NY","43.163364","-76.509567","-5","1"
+"13026","Aurora","NY","42.758088","-76.66998","-5","1"
+"13027","Baldwinsville","NY","43.165134","-76.33901","-5","1"
+"13028","Bernhards Bay","NY","43.279405","-75.93107","-5","1"
+"13029","Brewerton","NY","43.225081","-76.13966","-5","1"
+"13030","Bridgeport","NY","43.164297","-75.96057","-5","1"
+"13031","Camillus","NY","43.039916","-76.28757","-5","1"
+"13032","Canastota","NY","43.086439","-75.76484","-5","1"
+"13033","Cato","NY","43.182054","-76.57176","-5","1"
+"13034","Cayuga","NY","42.912846","-76.70818","-5","1"
+"13035","Cazenovia","NY","42.938816","-75.83037","-5","1"
+"13036","Central Square","NY","43.299689","-76.15144","-5","1"
+"13037","Chittenango","NY","43.059992","-75.87116","-5","1"
+"13039","Cicero","NY","43.171707","-76.09505","-5","1"
+"13040","Cincinnatus","NY","42.560795","-75.93241","-5","1"
+"13041","Clay","NY","43.1835","-76.18002","-5","1"
+"13042","Cleveland","NY","43.252084","-75.84853","-5","1"
+"13043","Clockville","NY","43.042044","-75.740848","-5","1"
+"13044","Constantia","NY","43.28547","-76.00138","-5","1"
+"13045","Cortland","NY","42.591109","-76.19217","-5","1"
+"13051","Delphi Falls","NY","42.870698","-75.91128","-5","1"
+"13052","De Ruyter","NY","42.728977","-75.86633","-5","1"
+"13053","Dryden","NY","42.483348","-76.27901","-5","1"
+"13054","Durhamville","NY","43.165514","-75.68091","-5","1"
+"13056","East Homer","NY","42.677155","-76.105201","-5","1"
+"13057","East Syracuse","NY","43.074266","-76.05538","-5","1"
+"13060","Elbridge","NY","43.025843","-76.42589","-5","1"
+"13061","Erieville","NY","42.859332","-75.74261","-5","1"
+"13062","Etna","NY","42.484414","-76.38271","-5","1"
+"13063","Fabius","NY","42.847248","-75.97818","-5","1"
+"13064","Fair Haven","NY","43.431311","-76.200448","-5","1"
+"13065","Fayette","NY","42.822662","-76.80197","-5","1"
+"13066","Fayetteville","NY","43.028516","-76.00876","-5","1"
+"13068","Freeville","NY","42.505075","-76.35283","-5","1"
+"13069","Fulton","NY","43.32347","-76.40029","-5","1"
+"13071","Genoa","NY","42.677418","-76.54154","-5","1"
+"13072","Georgetown","NY","42.763823","-75.75188","-5","1"
+"13073","Groton","NY","42.591961","-76.39345","-5","1"
+"13074","Hannibal","NY","43.317683","-76.56767","-5","1"
+"13076","Hastings","NY","43.354706","-76.14871","-5","1"
+"13077","Homer","NY","42.680693","-76.18566","-5","1"
+"13078","Jamesville","NY","42.973991","-76.07493","-5","1"
+"13080","Jordan","NY","43.07446","-76.47874","-5","1"
+"13081","King Ferry","NY","42.667102","-76.62939","-5","1"
+"13082","Kirkville","NY","43.099547","-75.9619","-5","1"
+"13083","Lacona","NY","43.647881","-76.0167","-5","1"
+"13084","La Fayette","NY","42.883503","-76.10983","-5","1"
+"13087","Little York","NY","42.706981","-76.156103","-5","1"
+"13088","Liverpool","NY","43.105917","-76.19365","-5","1"
+"13089","Liverpool","NY","43.02143","-76.197701","-5","1"
+"13090","Liverpool","NY","43.152017","-76.22068","-5","1"
+"13092","Locke","NY","42.643214","-76.42578","-5","1"
+"13093","Lycoming","NY","43.431311","-76.200448","-5","1"
+"13101","McGraw","NY","42.593363","-76.07789","-5","1"
+"13102","McLean","NY","42.554215","-76.292723","-5","1"
+"13103","Mallory","NY","43.339851","-76.096357","-5","1"
+"13104","Manlius","NY","42.987329","-75.96763","-5","1"
+"13107","Maple View","NY","43.457798","-76.153442","-5","1"
+"13108","Marcellus","NY","42.979467","-76.33811","-5","1"
+"13110","Marietta","NY","42.891595","-76.28318","-5","1"
+"13111","Martville","NY","43.258952","-76.61441","-5","1"
+"13112","Memphis","NY","43.105771","-76.41482","-5","1"
+"13113","Meridian","NY","43.089111","-76.621747","-5","1"
+"13114","Mexico","NY","43.468092","-76.2382","-5","1"
+"13115","Minetto","NY","43.397671","-76.482365","-5","1"
+"13116","Minoa","NY","43.077067","-76.00695","-5","1"
+"13117","Montezuma","NY","43.002267","-76.704722","-5","1"
+"13118","Moravia","NY","42.755698","-76.41226","-5","1"
+"13119","Mottville","NY","42.97446","-76.440833","-5","1"
+"13120","Nedrow","NY","42.950501","-76.15797","-5","1"
+"13121","New Haven","NY","43.483379","-76.315044","-5","1"
+"13122","New Woodstock","NY","42.837642","-75.84778","-5","1"
+"13123","North Bay","NY","43.236407","-75.776918","-5","1"
+"13124","North Pitcher","NY","42.639288","-75.82012","-5","1"
+"13126","Oswego","NY","43.449201","-76.47992","-5","1"
+"13129","Georgetown","NY","42.712735","-75.731391","-5","1"
+"13131","Parish","NY","43.415157","-76.11416","-5","1"
+"13132","Pennellville","NY","43.262012","-76.22912","-5","1"
+"13133","Colesville","NY","42.216968","-75.724015","-5","1"
+"13134","Peterboro","NY","42.968619","-75.679351","-5","1"
+"13135","Phoenix","NY","43.235916","-76.31339","-5","1"
+"13136","Pitcher","NY","42.607076","-75.85216","-5","1"
+"13137","Plainville","NY","43.157653","-76.44698","-5","1"
+"13138","Pompey","NY","42.89274","-76.026459","-5","1"
+"13139","Poplar Ridge","NY","42.742057","-76.628454","-5","1"
+"13140","Port Byron","NY","43.049797","-76.66055","-5","1"
+"13141","Preble","NY","42.7707","-76.18642","-5","1"
+"13142","Pulaski","NY","43.559926","-76.13619","-5","1"
+"13143","Red Creek","NY","43.235909","-76.71545","-5","1"
+"13144","Richland","NY","43.560754","-75.99069","-5","1"
+"13145","Sandy Creek","NY","43.653475","-76.13214","-5","1"
+"13146","Savannah","NY","43.09986","-76.75716","-5","1"
+"13147","Scipio Center","NY","42.774714","-76.57045","-5","1"
+"13148","Seneca Falls","NY","42.924166","-76.78366","-5","1"
+"13149","Preble","NY","42.718259","-76.149045","-5","1"
+"13152","Skaneateles","NY","42.897167","-76.38963","-5","1"
+"13153","Skaneateles Falls","NY","42.991112","-76.451147","-5","1"
+"13154","South Butler","NY","43.134425","-76.765591","-5","1"
+"13155","South Otselic","NY","42.662648","-75.76265","-5","1"
+"13156","Sterling","NY","43.337718","-76.6729","-5","1"
+"13157","Sylvan Beach","NY","43.209147","-75.72307","-5","1"
+"13158","Truxton","NY","42.717801","-75.97209","-5","1"
+"13159","Tully","NY","42.802031","-76.12717","-5","1"
+"13160","Union Springs","NY","42.832007","-76.66641","-5","1"
+"13162","Verona Beach","NY","43.18852","-75.712551","-5","1"
+"13163","Wampsville","NY","43.078461","-75.701639","-5","1"
+"13164","Warners","NY","43.088699","-76.31946","-5","1"
+"13165","Waterloo","NY","42.911377","-76.87027","-5","1"
+"13166","Weedsport","NY","43.056292","-76.5563","-5","1"
+"13167","West Monroe","NY","43.309645","-76.0552","-5","1"
+"13201","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13202","Syracuse","NY","43.045066","-76.14994","-5","1"
+"13203","Syracuse","NY","43.061116","-76.13733","-5","1"
+"13204","Syracuse","NY","43.048966","-76.17536","-5","1"
+"13205","Syracuse","NY","43.010916","-76.14501","-5","1"
+"13206","Syracuse","NY","43.069866","-76.10724","-5","1"
+"13207","Syracuse","NY","43.020116","-76.16406","-5","1"
+"13208","Syracuse","NY","43.074566","-76.14747","-5","1"
+"13209","Syracuse","NY","43.081324","-76.23488","-5","1"
+"13210","Syracuse","NY","43.037166","-76.12653","-5","1"
+"13211","Syracuse","NY","43.098917","-76.13688","-5","1"
+"13212","Syracuse","NY","43.128534","-76.13931","-5","1"
+"13214","Syracuse","NY","43.038099","-76.07635","-5","1"
+"13215","Syracuse","NY","42.996804","-76.2177","-5","1"
+"13217","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13218","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13219","Syracuse","NY","43.041566","-76.22072","-5","1"
+"13220","Syracuse","NY","43.123415","-76.12823","-5","1"
+"13221","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13224","Syracuse","NY","43.041866","-76.1032","-5","1"
+"13225","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13244","Syracuse","NY","43.037716","-76.139646","-5","1"
+"13250","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13251","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13252","Syracuse","NY","43.050966","-76.156696","-5","1"
+"13260","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13261","Syracuse","NY","43.02143","-76.197701","-5","1"
+"13290","Syracuse","NY","43.075066","-76.17411","-5","1"
+"13301","Alder Creek","NY","43.419132","-75.21942","-5","1"
+"13302","Altmar","NY","43.499843","-75.97716","-5","1"
+"13303","Ava","NY","43.368235","-75.4688","-5","1"
+"13304","Barneveld","NY","43.242724","-75.1659","-5","1"
+"13305","Beaver Falls","NY","43.818705","-75.480342","-5","1"
+"13308","Blossvale","NY","43.236303","-75.68087","-5","1"
+"13309","Boonville","NY","43.484783","-75.33559","-5","1"
+"13310","Bouckville","NY","42.88821","-75.5688","-5","1"
+"13312","Brantingham","NY","43.689564","-75.27252","-5","1"
+"13313","Bridgewater","NY","42.87896","-75.25569","-5","1"
+"13314","Brookfield","NY","42.832184","-75.32106","-5","1"
+"13315","Burlington Flats","NY","42.728271","-75.14144","-5","1"
+"13316","Camden","NY","43.377083","-75.74261","-5","1"
+"13317","Canajoharie","NY","42.86749","-74.57435","-5","1"
+"13318","Cassville","NY","42.937739","-75.24946","-5","1"
+"13319","Chadwicks","NY","43.029669","-75.27211","-5","1"
+"13320","Cherry Valley","NY","42.772775","-74.7359","-5","1"
+"13321","Clark Mills","NY","43.090027","-75.387088","-5","1"
+"13322","Clayville","NY","42.969624","-75.22603","-5","1"
+"13323","Clinton","NY","43.049536","-75.37656","-5","1"
+"13324","Cold Brook","NY","43.317064","-74.97449","-5","1"
+"13325","Constableville","NY","43.570028","-75.49047","-5","1"
+"13326","Cooperstown","NY","42.703091","-74.91413","-5","1"
+"13327","Croghan","NY","43.932489","-75.29084","-5","1"
+"13328","Deansboro","NY","42.9843","-75.4224","-5","1"
+"13329","Dolgeville","NY","43.11545","-74.74379","-5","1"
+"13331","Eagle Bay","NY","43.822824","-74.87283","-5","1"
+"13332","Earlville","NY","42.752447","-75.56997","-5","1"
+"13333","East Springfield","NY","42.843048","-74.80882","-5","1"
+"13334","Eaton","NY","42.83917","-75.65482","-5","1"
+"13335","Edmeston","NY","42.694896","-75.24214","-5","1"
+"13337","Fly Creek","NY","42.743186","-74.98164","-5","1"
+"13338","Forestport","NY","43.506153","-75.07355","-5","1"
+"13339","Fort Plain","NY","42.943602","-74.64717","-5","1"
+"13340","Frankfort","NY","43.046471","-75.10019","-5","1"
+"13341","Franklin Springs","NY","43.036802","-75.39115","-5","1"
+"13342","Garrattsville","NY","42.64743","-75.17793","-5","1"
+"13343","Glenfield","NY","43.743932","-75.34971","-5","1"
+"13345","Greig","NY","43.818705","-75.480342","-5","1"
+"13346","Hamilton","NY","42.820826","-75.54012","-5","1"
+"13348","Hartwick","NY","42.708284","-75.0588","-5","1"
+"13350","Herkimer","NY","43.038149","-74.9846","-5","1"
+"13352","Hinckley","NY","43.328187","-75.117319","-5","1"
+"13353","Hoffmeister","NY","43.392434","-74.72675","-5","1"
+"13354","Holland Patent","NY","43.261526","-75.25705","-5","1"
+"13355","Hubbardsville","NY","42.81488","-75.43424","-5","1"
+"13357","Ilion","NY","42.992323","-75.0615","-5","1"
+"13360","Inlet","NY","43.744906","-74.77476","-5","1"
+"13361","Jordanville","NY","42.902922","-74.89149","-5","1"
+"13362","Knoxboro","NY","42.980334","-75.518569","-5","1"
+"13363","Lee Center","NY","43.311975","-75.50677","-5","1"
+"13364","Leonardsville","NY","42.954541","-75.616793","-5","1"
+"13365","Little Falls","NY","43.053176","-74.84685","-5","1"
+"13367","Lowville","NY","43.794492","-75.46905","-5","1"
+"13368","Lyons Falls","NY","43.637104","-75.3483","-5","1"
+"13388","Webb","NY","43.606444","-75.103186","-5","1"
+"13396","Madison","NY","42.839697","-75.544322","-5","1"
+"13401","McConnellsville","NY","43.267243","-75.688223","-5","1"
+"13402","Madison","NY","42.90777","-75.4988","-5","1"
+"13403","Marcy","NY","43.162119","-75.28435","-5","1"
+"13404","Martinsburg","NY","43.818705","-75.480342","-5","1"
+"13406","Middleville","NY","43.137624","-74.947","-5","1"
+"13407","Mohawk","NY","42.970099","-74.96051","-5","1"
+"13408","Morrisville","NY","42.923334","-75.66314","-5","1"
+"13409","Munnsville","NY","42.967906","-75.59457","-5","1"
+"13410","Nelliston","NY","42.937863","-74.611711","-5","1"
+"13411","New Berlin","NY","42.626177","-75.31502","-5","1"
+"13413","New Hartford","NY","43.067169","-75.28767","-5","1"
+"13415","New Lisbon","NY","42.590419","-75.195695","-5","1"
+"13416","Newport","NY","43.178528","-74.98117","-5","1"
+"13417","New York Mills","NY","43.102469","-75.29566","-5","1"
+"13418","North Brookfield","NY","42.852808","-75.39938","-5","1"
+"13420","Old Forge","NY","43.707331","-74.94498","-5","1"
+"13421","Oneida","NY","43.079635","-75.64678","-5","1"
+"13424","Oriskany","NY","43.158258","-75.34281","-5","1"
+"13425","Oriskany Falls","NY","42.964774","-75.47889","-5","1"
+"13426","Orwell","NY","43.562757","-75.996773","-5","1"
+"13428","Palatine Bridge","NY","42.923583","-74.55536","-5","1"
+"13431","Poland","NY","43.21574","-75.08534","-5","1"
+"13433","Port Leyden","NY","43.580184","-75.31757","-5","1"
+"13435","Prospect","NY","43.305156","-75.150183","-5","1"
+"13436","Raquette Lake","NY","43.807314","-74.66771","-5","1"
+"13437","Redfield","NY","43.572876","-75.81709","-5","1"
+"13438","Remsen","NY","43.349682","-75.15821","-5","1"
+"13439","Richfield Springs","NY","42.852372","-74.99121","-5","1"
+"13440","Rome","NY","43.217069","-75.45531","-5","1"
+"13441","Rome","NY","43.164312","-75.511301","-5","1"
+"13442","Rome","NY","43.239274","-75.47796","-5","1"
+"13444","Plymouth","NY","42.637549","-75.672508","-5","1"
+"13449","Rome","NY","43.239274","-75.47796","-5","1"
+"13450","Roseboom","NY","42.69983","-74.81731","-5","1"
+"13452","Saint Johnsville","NY","43.021223","-74.64537","-5","1"
+"13453","Williamstown","NY","43.436919","-75.881404","-5","1"
+"13454","Salisbury Center","NY","43.222171","-74.80223","-5","1"
+"13455","Sangerfield","NY","42.916235","-75.35448","-5","1"
+"13456","Sauquoit","NY","43.005669","-75.26202","-5","1"
+"13457","Schuyler Lake","NY","42.775805","-75.048502","-5","1"
+"13459","Sharon Springs","NY","42.774077","-74.58404","-5","1"
+"13460","Sherburne","NY","42.680051","-75.46547","-5","1"
+"13461","Sherrill","NY","43.070808","-75.59912","-5","1"
+"13464","Smyrna","NY","42.687757","-75.61558","-5","1"
+"13465","Solsville","NY","42.954541","-75.616793","-5","1"
+"13468","Springfield Center","NY","42.843002","-74.86479","-5","1"
+"13469","Stittville","NY","43.220075","-75.29542","-5","1"
+"13470","Stratford","NY","43.180412","-74.66524","-5","1"
+"13471","Taberg","NY","43.346517","-75.60493","-5","1"
+"13472","Thendara","NY","43.460951","-74.957099","-5","1"
+"13473","Turin","NY","43.654278","-75.43828","-5","1"
+"13475","Van Hornesville","NY","42.870799","-74.84542","-5","1"
+"13476","Vernon","NY","43.079233","-75.5134","-5","1"
+"13477","Vernon Center","NY","43.035057","-75.50381","-5","1"
+"13478","Verona","NY","43.141727","-75.57702","-5","1"
+"13479","Washington Mills","NY","43.053769","-75.271559","-5","1"
+"13480","Waterville","NY","42.922823","-75.36494","-5","1"
+"13482","West Burlington","NY","42.704333","-75.184913","-5","1"
+"13483","Westdale","NY","43.399851","-75.82785","-5","1"
+"13484","West Eaton","NY","42.854631","-75.660462","-5","1"
+"13485","West Edmeston","NY","42.766057","-75.32353","-5","1"
+"13486","Westernville","NY","43.338878","-75.35861","-5","1"
+"13488","Westford","NY","42.680906","-74.76529","-5","1"
+"13489","West Leyden","NY","43.453661","-75.52172","-5","1"
+"13490","Westmoreland","NY","43.106801","-75.41944","-5","1"
+"13491","West Winfield","NY","42.862696","-75.17053","-5","1"
+"13492","Whitesboro","NY","43.11627","-75.31182","-5","1"
+"13493","Williamstown","NY","43.421597","-75.90529","-5","1"
+"13494","Woodgate","NY","43.524904","-75.142771","-5","1"
+"13495","Yorkville","NY","43.110619","-75.27716","-5","1"
+"13501","Utica","NY","43.087669","-75.22681","-5","1"
+"13502","Utica","NY","43.114519","-75.22284","-5","1"
+"13503","Utica","NY","43.101869","-75.231158","-5","1"
+"13504","Utica","NY","43.136033","-75.432486","-5","1"
+"13505","Utica","NY","43.087169","-75.260259","-5","1"
+"13550","Herkimer","NY","43.026416","-74.982271","-5","1"
+"13562","Hermon","NY","44.465307","-75.230195","-5","1"
+"13578","Pharsalia","NY","42.595426","-75.757217","-5","1"
+"13599","Utica","NY","43.239274","-75.47796","-5","1"
+"13601","Watertown","NY","43.976735","-75.91199","-5","1"
+"13602","Fort Drum","NY","44.03803","-75.75793","-5","1"
+"13603","Watertown","NY","44.030204","-75.81845","-5","1"
+"13605","Adams","NY","43.807654","-76.04936","-5","1"
+"13606","Adams Center","NY","43.871728","-76.00793","-5","1"
+"13607","Alexandria Bay","NY","44.328698","-75.93103","-5","1"
+"13608","Antwerp","NY","44.243007","-75.60331","-5","1"
+"13610","Rodman","NY","43.818705","-75.480342","-5","1"
+"13611","Belleville","NY","43.778046","-76.125914","-5","1"
+"13612","Black River","NY","44.003136","-75.77839","-5","1"
+"13613","Brasher Falls","NY","44.864624","-74.75386","-5","1"
+"13614","Brier Hill","NY","44.54141","-75.70576","-5","1"
+"13615","Brownville","NY","44.005613","-75.98315","-5","1"
+"13616","Calcium","NY","44.030831","-75.85521","-5","1"
+"13617","Canton","NY","44.58249","-75.14417","-5","1"
+"13618","Cape Vincent","NY","44.114183","-76.29288","-5","1"
+"13619","Carthage","NY","43.981245","-75.61724","-5","1"
+"13620","Castorland","NY","43.90707","-75.44761","-5","1"
+"13621","Chase Mills","NY","44.850439","-75.06915","-5","1"
+"13622","Chaumont","NY","44.0958","-76.11992","-5","1"
+"13623","Chippewa Bay","NY","44.440171","-75.757938","-5","1"
+"13624","Clayton","NY","44.230421","-76.09312","-5","1"
+"13625","Colton","NY","44.537321","-74.92847","-5","1"
+"13626","Copenhagen","NY","43.859025","-75.72942","-5","1"
+"13627","Deer River","NY","43.818705","-75.480342","-5","1"
+"13628","Deferiet","NY","43.885519","-75.798319","-5","1"
+"13630","De Kalb Junction","NY","44.494708","-75.29944","-5","1"
+"13631","Denmark","NY","43.818705","-75.480342","-5","1"
+"13632","Depauville","NY","44.139501","-76.061552","-5","1"
+"13633","De Peyster","NY","44.469527","-75.50293","-5","1"
+"13634","Dexter","NY","44.015332","-76.05711","-5","1"
+"13635","Edwards","NY","44.314998","-75.26149","-5","1"
+"13636","Ellisburg","NY","43.75965","-76.152508","-5","1"
+"13637","Evans Mills","NY","44.091494","-75.82694","-5","1"
+"13638","Felts Mills","NY","44.021094","-75.76113","-5","1"
+"13639","Fine","NY","44.268403","-75.13664","-5","1"
+"13640","Wellesley Island","NY","44.318866","-75.99068","-5","1"
+"13641","Fishers Landing","NY","44.207681","-75.914556","-5","1"
+"13642","Gouverneur","NY","44.319897","-75.45537","-5","1"
+"13643","Great Bend","NY","44.014698","-75.728357","-5","1"
+"13645","Hailesboro","NY","44.533125","-75.192865","-5","1"
+"13646","Hammond","NY","44.444242","-75.69227","-5","1"
+"13647","Hannawa Falls","NY","44.608735","-74.973218","-5","1"
+"13648","Harrisville","NY","44.168224","-75.29253","-5","1"
+"13649","Helena","NY","44.921678","-74.706763","-5","1"
+"13650","Henderson","NY","43.82212","-76.2127","-5","1"
+"13651","Henderson Harbor","NY","43.870842","-76.180886","-5","1"
+"13652","Hermon","NY","44.436004","-75.22228","-5","1"
+"13654","Heuvelton","NY","44.563604","-75.48794","-5","1"
+"13655","Hogansburg","NY","44.98184","-74.67374","-5","1"
+"13656","La Fargeville","NY","44.194126","-75.95725","-5","1"
+"13657","Limerick","NY","44.035703","-76.090424","-5","1"
+"13658","Lisbon","NY","44.744462","-75.28123","-5","1"
+"13659","Lorraine","NY","43.743998","-75.89354","-5","1"
+"13660","Madrid","NY","44.758378","-75.14571","-5","1"
+"13661","Mannsville","NY","43.714545","-76.10465","-5","1"
+"13662","Massena","NY","44.937212","-74.87693","-5","1"
+"13664","Morristown","NY","44.585561","-75.64797","-5","1"
+"13665","Natural Bridge","NY","44.055436","-75.46279","-5","1"
+"13666","Newton Falls","NY","44.533125","-75.192865","-5","1"
+"13667","Norfolk","NY","44.823502","-74.96875","-5","1"
+"13668","Norwood","NY","44.752355","-74.98906","-5","1"
+"13669","Ogdensburg","NY","44.683636","-75.49024","-5","1"
+"13670","Oswegatchie","NY","44.210178","-75.0697","-5","1"
+"13671","Oxbow","NY","44.308475","-75.66879","-5","1"
+"13672","Parishville","NY","44.4987","-74.74685","-5","1"
+"13673","Philadelphia","NY","44.160785","-75.71159","-5","1"
+"13674","Pierrepont Manor","NY","43.73345","-76.054313","-5","1"
+"13675","Plessis","NY","44.277365","-75.84263","-5","1"
+"13676","Potsdam","NY","44.651265","-74.95289","-5","1"
+"13677","Pyrites","NY","44.673438","-75.082041","-5","1"
+"13678","Raymondville","NY","44.828685","-74.979811","-5","1"
+"13679","Redwood","NY","44.323952","-75.76895","-5","1"
+"13680","Rensselaer Falls","NY","44.593588","-75.32389","-5","1"
+"13681","Richville","NY","44.414762","-75.37897","-5","1"
+"13682","Rodman","NY","43.842808","-75.90347","-5","1"
+"13683","Rooseveltown","NY","44.533125","-75.192865","-5","1"
+"13684","Russell","NY","44.353607","-75.0694","-5","1"
+"13685","Sackets Harbor","NY","43.936173","-76.10295","-5","1"
+"13687","South Colton","NY","44.501065","-74.86633","-5","1"
+"13688","South Rutland","NY","43.951666","-75.767772","-5","1"
+"13690","Star Lake","NY","44.161058","-74.99617","-5","1"
+"13691","Theresa","NY","44.216969","-75.79671","-5","1"
+"13692","Thousand Island Park","NY","44.289833","-76.02621","-5","1"
+"13693","Three Mile Bay","NY","44.064999","-76.24023","-5","1"
+"13694","Waddington","NY","44.866754","-75.17201","-5","1"
+"13695","Wanakena","NY","44.140791","-74.912493","-5","1"
+"13696","West Stockholm","NY","44.69563","-74.89998","-5","1"
+"13697","Winthrop","NY","44.755383","-74.81213","-5","1"
+"13698","Ellisburg","NY","43.775216","-76.202658","-5","1"
+"13699","Potsdam","NY","44.496564","-75.072951","-5","1"
+"13730","Afton","NY","42.232991","-75.53429","-5","1"
+"13731","Andes","NY","42.152105","-74.78184","-5","1"
+"13732","Apalachin","NY","42.059433","-76.14733","-5","1"
+"13733","Bainbridge","NY","42.292692","-75.47528","-5","1"
+"13734","Barton","NY","42.063671","-76.40638","-5","1"
+"13736","Berkshire","NY","42.306877","-76.204","-5","1"
+"13737","Bible School Park","NY","42.080494","-76.097288","-5","1"
+"13738","Blodgett Mills","NY","42.567313","-76.123795","-5","1"
+"13739","Bloomville","NY","42.364673","-74.78034","-5","1"
+"13740","Bovina Center","NY","42.274238","-74.75464","-5","1"
+"13743","Candor","NY","42.213965","-76.34099","-5","1"
+"13744","Castle Creek","NY","42.250715","-75.91871","-5","1"
+"13745","Chenango Bridge","NY","42.173775","-75.872839","-5","1"
+"13746","Chenango Forks","NY","42.261923","-75.84463","-5","1"
+"13747","Colliersville","NY","42.505122","-74.982056","-5","1"
+"13748","Conklin","NY","42.0553","-75.81219","-5","1"
+"13749","Corbettsville","NY","42.206745","-75.74488","-5","1"
+"13750","Davenport","NY","42.473691","-74.8134","-5","1"
+"13751","Davenport Center","NY","42.424859","-74.900195","-5","1"
+"13752","De Lancey","NY","42.187835","-74.89418","-5","1"
+"13753","Delhi","NY","42.302716","-74.91667","-5","1"
+"13754","Deposit","NY","42.076427","-75.44551","-5","1"
+"13755","Downsville","NY","42.086268","-75.00691","-5","1"
+"13756","East Branch","NY","42.018923","-75.11339","-5","1"
+"13757","East Meredith","NY","42.411895","-74.91372","-5","1"
+"13758","East Pharsalia","NY","42.583518","-75.721931","-5","1"
+"13760","Endicott","NY","42.113974","-76.05256","-5","1"
+"13761","Endicott","NY","42.206745","-75.74488","-5","1"
+"13762","Endwell","NY","42.206745","-75.74488","-5","1"
+"13763","Endicott","NY","42.206745","-75.74488","-5","1"
+"13766","Maine","NY","42.155346","-76.071767","-5","1"
+"13774","Fishs Eddy","NY","41.965435","-75.17968","-5","1"
+"13775","Franklin","NY","42.333285","-75.16086","-5","1"
+"13776","Gilbertsville","NY","42.457398","-75.33434","-5","1"
+"13777","Glen Aubrey","NY","42.254154","-76.01194","-5","1"
+"13778","Greene","NY","42.336771","-75.75964","-5","1"
+"13780","Guilford","NY","42.426583","-75.48119","-5","1"
+"13782","Hamden","NY","42.18942","-74.99219","-5","1"
+"13783","Hancock","NY","41.985839","-75.28214","-5","1"
+"13784","Harford","NY","42.431068","-76.159312","-5","1"
+"13786","Harpersfield","NY","42.445257","-74.70189","-5","1"
+"13787","Harpursville","NY","42.197905","-75.65578","-5","1"
+"13788","Hobart","NY","42.368357","-74.66452","-5","1"
+"13790","Johnson City","NY","42.125725","-75.96686","-5","1"
+"13792","Morris","NY","42.509167","-75.208242","-5","1"
+"13794","Killawog","NY","42.402816","-76.036582","-5","1"
+"13795","Kirkwood","NY","42.056312","-75.79275","-5","1"
+"13796","Laurens","NY","42.540359","-75.14604","-5","1"
+"13797","Lisle","NY","42.335102","-76.02313","-5","1"
+"13801","McDonough","NY","42.504765","-75.77739","-5","1"
+"13802","Maine","NY","42.255624","-76.05009","-5","1"
+"13803","Marathon","NY","42.453663","-76.06983","-5","1"
+"13804","Masonville","NY","42.215297","-75.35815","-5","1"
+"13806","Meridale","NY","42.183045","-74.925617","-5","1"
+"13807","Milford","NY","42.606209","-74.97261","-5","1"
+"13808","Morris","NY","42.532969","-75.25536","-5","1"
+"13809","Mount Upton","NY","42.392104","-75.41093","-5","1"
+"13810","Mount Vision","NY","42.609579","-75.09464","-5","1"
+"13811","Newark Valley","NY","42.222777","-76.17822","-5","1"
+"13812","Nichols","NY","42.024157","-76.36558","-5","1"
+"13813","Nineveh","NY","42.163814","-75.55149","-5","1"
+"13814","North Norwich","NY","42.603574","-75.528221","-5","1"
+"13815","Norwich","NY","42.541733","-75.52612","-5","1"
+"13820","Oneonta","NY","42.469761","-75.05192","-5","1"
+"13825","Otego","NY","42.417489","-75.18605","-5","1"
+"13826","Ouaquaga","NY","42.112127","-75.639586","-5","1"
+"13827","Owego","NY","42.120274","-76.25874","-5","1"
+"13830","Oxford","NY","42.428818","-75.62459","-5","1"
+"13832","Plymouth","NY","42.650584","-75.65761","-5","1"
+"13833","Port Crane","NY","42.185196","-75.7763","-5","1"
+"13834","Portlandville","NY","42.536475","-74.96218","-5","1"
+"13835","Richford","NY","42.396659","-76.15709","-5","1"
+"13837","Shinhopple","NY","42.183045","-74.925617","-5","1"
+"13838","Sidney","NY","42.304177","-75.39563","-5","1"
+"13839","Sidney Center","NY","42.236762","-75.25901","-5","1"
+"13840","Smithboro","NY","42.039512","-76.400376","-5","1"
+"13841","Smithville Flats","NY","42.419896","-75.83772","-5","1"
+"13842","South Kortright","NY","42.376254","-74.72258","-5","1"
+"13843","South New Berlin","NY","42.533274","-75.38008","-5","1"
+"13844","South Plymouth","NY","42.603506","-75.67053","-5","1"
+"13845","Tioga Center","NY","42.065842","-76.381946","-5","1"
+"13846","Treadwell","NY","42.344248","-75.05323","-5","1"
+"13847","Trout Creek","NY","42.183045","-74.925617","-5","1"
+"13848","Tunnel","NY","42.214705","-75.727699","-5","1"
+"13849","Unadilla","NY","42.343576","-75.3146","-5","1"
+"13850","Vestal","NY","42.075874","-76.02837","-5","1"
+"13851","Vestal","NY","42.206745","-75.74488","-5","1"
+"13856","Walton","NY","42.182237","-75.14627","-5","1"
+"13859","Wells Bridge","NY","42.367765","-75.24718","-5","1"
+"13860","West Davenport","NY","42.183045","-74.925617","-5","1"
+"13861","West Oneonta","NY","42.488953","-75.12063","-5","1"
+"13862","Whitney Point","NY","42.328284","-75.95021","-5","1"
+"13863","Willet","NY","42.437964","-75.89884","-5","1"
+"13864","Willseyville","NY","42.298203","-76.38844","-5","1"
+"13865","Windsor","NY","42.070228","-75.63584","-5","1"
+"13901","Binghamton","NY","42.142575","-75.88783","-5","1"
+"13902","Binghamton","NY","42.105375","-75.8876","-5","1"
+"13903","Binghamton","NY","42.077258","-75.90226","-5","1"
+"13904","Binghamton","NY","42.110927","-75.85223","-5","1"
+"13905","Binghamton","NY","42.121443","-75.93329","-5","1"
+"13942","Whitestown","NY","43.114669","-75.305811","-5","1"
+"14001","Akron","NY","43.024559","-78.50414","-5","1"
+"14003","Alabama","NY","42.998052","-78.184813","-5","1"
+"14004","Alden","NY","42.898709","-78.51652","-5","1"
+"14005","Alexander","NY","42.906765","-78.24581","-5","1"
+"14006","Angola","NY","42.633375","-79.04567","-5","1"
+"14008","Appleton","NY","43.318768","-78.63328","-5","1"
+"14009","Arcade","NY","42.582693","-78.40069","-5","1"
+"14010","Athol Springs","NY","42.768413","-78.887094","-5","1"
+"14011","Attica","NY","42.844962","-78.27803","-5","1"
+"14012","Barker","NY","43.337798","-78.52955","-5","1"
+"14013","Basom","NY","43.074578","-78.40345","-5","1"
+"14020","Batavia","NY","42.996507","-78.19279","-5","1"
+"14021","Batavia","NY","42.998052","-78.184813","-5","1"
+"14024","Bliss","NY","42.579516","-78.24818","-5","1"
+"14025","Boston","NY","42.627312","-78.73768","-5","1"
+"14026","Bowmansville","NY","42.941025","-78.68548","-5","1"
+"14027","Brant","NY","42.57075","-79.030785","-5","1"
+"14028","Burt","NY","43.326155","-78.71564","-5","1"
+"14029","Centerville","NY","42.474283","-78.247413","-5","1"
+"14030","Chaffee","NY","42.562386","-78.49087","-5","1"
+"14031","Clarence","NY","42.981558","-78.61484","-5","1"
+"14032","Clarence Center","NY","43.019908","-78.63497","-5","1"
+"14033","Colden","NY","42.655098","-78.68472","-5","1"
+"14034","Collins","NY","42.498791","-78.8835","-5","1"
+"14035","Collins Center","NY","42.49064","-78.849861","-5","1"
+"14036","Corfu","NY","42.974083","-78.38961","-5","1"
+"14037","Cowlesville","NY","42.814667","-78.46076","-5","1"
+"14038","Crittenden","NY","42.947259","-78.474444","-5","1"
+"14039","Dale","NY","42.829129","-78.17657","-5","1"
+"14040","Darien Center","NY","42.891116","-78.37872","-5","1"
+"14041","Dayton","NY","42.408583","-78.984391","-5","1"
+"14042","Delevan","NY","42.474779","-78.47303","-5","1"
+"14043","Depew","NY","42.904958","-78.7006","-5","1"
+"14047","Derby","NY","42.694598","-78.98151","-5","1"
+"14048","Dunkirk","NY","42.479471","-79.32805","-5","1"
+"14051","East Amherst","NY","43.025217","-78.70394","-5","1"
+"14052","East Aurora","NY","42.770859","-78.59804","-5","1"
+"14054","East Bethany","NY","42.903676","-78.13481","-5","1"
+"14055","East Concord","NY","42.554206","-78.61829","-5","1"
+"14056","East Pembroke","NY","42.991173","-78.312171","-5","1"
+"14057","Eden","NY","42.651776","-78.87634","-5","1"
+"14058","Elba","NY","43.091886","-78.15151","-5","1"
+"14059","Elma","NY","42.834159","-78.64246","-5","1"
+"14060","Farmersville Station","NY","42.443406","-78.32302","-5","1"
+"14061","Farnham","NY","42.594627","-79.08404","-5","1"
+"14062","Forestville","NY","42.450845","-79.16528","-5","1"
+"14063","Fredonia","NY","42.425683","-79.3371","-5","1"
+"14064","Rochester","NY","43.158013","-77.607049","-5","1"
+"14065","Freedom","NY","42.483508","-78.30011","-5","1"
+"14066","Gainesville","NY","42.619549","-78.16153","-5","1"
+"14067","Gasport","NY","43.20258","-78.56868","-5","1"
+"14068","Getzville","NY","43.02534","-78.76241","-5","1"
+"14069","Glenwood","NY","42.601635","-78.64273","-5","1"
+"14070","Gowanda","NY","42.453234","-78.9348","-5","1"
+"14072","Grand Island","NY","43.011823","-78.95914","-5","1"
+"14075","Hamburg","NY","42.734051","-78.8413","-5","1"
+"14080","Holland","NY","42.640351","-78.53494","-5","1"
+"14081","Irving","NY","42.573552","-79.09002","-5","1"
+"14082","Java Center","NY","42.661838","-78.38309","-5","1"
+"14083","Java Village","NY","42.676913","-78.44075","-5","1"
+"14085","Lake View","NY","42.718308","-78.9372","-5","1"
+"14086","Lancaster","NY","42.904258","-78.65519","-5","1"
+"14091","Lawtons","NY","42.535917","-78.88235","-5","1"
+"14092","Lewiston","NY","43.169055","-79.02426","-5","1"
+"14094","Lockport","NY","43.160857","-78.68756","-5","1"
+"14095","Lockport","NY","43.32684","-78.830681","-5","1"
+"14098","Lyndonville","NY","43.338755","-78.3931","-5","1"
+"14101","Machias","NY","42.393206","-78.52655","-5","1"
+"14102","Marilla","NY","42.838643","-78.55601","-5","1"
+"14103","Medina","NY","43.217155","-78.38746","-5","1"
+"14105","Middleport","NY","43.199665","-78.48378","-5","1"
+"14107","Model City","NY","43.32684","-78.830681","-5","1"
+"14108","Newfane","NY","43.264406","-78.72634","-5","1"
+"14109","Niagara University","NY","43.32684","-78.830681","-5","1"
+"14110","North Boston","NY","42.768413","-78.887094","-5","1"
+"14111","North Collins","NY","42.593148","-78.91498","-5","1"
+"14112","North Evans","NY","42.691742","-78.992658","-5","1"
+"14113","North Java","NY","42.672162","-78.33745","-5","1"
+"14120","North Tonawanda","NY","43.048156","-78.86338","-5","1"
+"14125","Oakfield","NY","43.077433","-78.27816","-5","1"
+"14126","Olcott","NY","43.330443","-78.726661","-5","1"
+"14127","Orchard Park","NY","42.759917","-78.75294","-5","1"
+"14129","Perrysburg","NY","42.469165","-79.01069","-5","1"
+"14130","Pike","NY","42.543108","-78.153849","-5","1"
+"14131","Ransomville","NY","43.237855","-78.90884","-5","1"
+"14132","Sanborn","NY","43.140056","-78.88297","-5","1"
+"14133","Sandusky","NY","42.489129","-78.366991","-5","1"
+"14134","Sardinia","NY","42.534854","-78.52113","-5","1"
+"14135","Sheridan","NY","42.488983","-79.238997","-5","1"
+"14136","Silver Creek","NY","42.535276","-79.16539","-5","1"
+"14138","South Dayton","NY","42.372077","-79.05552","-5","1"
+"14139","South Wales","NY","42.716919","-78.53931","-5","1"
+"14140","Spring Brook","NY","42.807159","-78.667599","-5","1"
+"14141","Springville","NY","42.516248","-78.68944","-5","1"
+"14143","Stafford","NY","42.977828","-78.07934","-5","1"
+"14144","Stella Niagara","NY","43.199494","-79.042477","-5","1"
+"14145","Strykersville","NY","42.720756","-78.43429","-5","1"
+"14150","Tonawanda","NY","43.001907","-78.8631","-5","1"
+"14151","Tonawanda","NY","42.768413","-78.887094","-5","1"
+"14166","Van Buren Point","NY","42.4511","-79.415421","-5","1"
+"14167","Varysburg","NY","42.750175","-78.32283","-5","1"
+"14168","Versailles","NY","42.509271","-78.999471","-5","1"
+"14169","Wales Center","NY","42.767333","-78.585646","-5","1"
+"14170","West Falls","NY","42.692304","-78.67147","-5","1"
+"14171","West Valley","NY","42.426278","-78.6474","-5","1"
+"14172","Wilson","NY","43.307288","-78.83368","-5","1"
+"14173","Yorkshire","NY","42.524691","-78.475474","-5","1"
+"14174","Youngstown","NY","43.247054","-79.02562","-5","1"
+"14201","Buffalo","NY","42.896407","-78.88515","-5","1"
+"14202","Buffalo","NY","42.886357","-78.8779","-5","1"
+"14203","Buffalo","NY","42.880107","-78.8699","-5","1"
+"14204","Buffalo","NY","42.884008","-78.86152","-5","1"
+"14205","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14206","Buffalo","NY","42.880105","-78.81049","-5","1"
+"14207","Buffalo","NY","42.94722","-78.89694","-5","1"
+"14208","Buffalo","NY","42.914307","-78.85072","-5","1"
+"14209","Buffalo","NY","42.913257","-78.86612","-5","1"
+"14210","Buffalo","NY","42.866708","-78.83139","-5","1"
+"14211","Buffalo","NY","42.907358","-78.82355","-5","1"
+"14212","Buffalo","NY","42.894758","-78.82303","-5","1"
+"14213","Buffalo","NY","42.916057","-78.8915","-5","1"
+"14214","Buffalo","NY","42.941407","-78.83741","-5","1"
+"14215","Buffalo","NY","42.934757","-78.8118","-5","1"
+"14216","Buffalo","NY","42.949707","-78.85923","-5","1"
+"14217","Buffalo","NY","42.968707","-78.8745","-5","1"
+"14218","Buffalo","NY","42.821008","-78.82448","-5","1"
+"14219","Buffalo","NY","42.790708","-78.82717","-5","1"
+"14220","Buffalo","NY","42.845758","-78.8187","-5","1"
+"14221","Buffalo","NY","42.977456","-78.73356","-5","1"
+"14222","Buffalo","NY","42.917657","-78.8779","-5","1"
+"14223","Buffalo","NY","42.972207","-78.84234","-5","1"
+"14224","Buffalo","NY","42.836858","-78.75557","-5","1"
+"14225","Buffalo","NY","42.929891","-78.75813","-5","1"
+"14226","Buffalo","NY","42.968057","-78.80047","-5","1"
+"14227","Buffalo","NY","42.881372","-78.74466","-5","1"
+"14228","Buffalo","NY","43.023347","-78.79494","-5","1"
+"14231","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14233","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14240","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14241","Buffalo","NY","42.938258","-78.744053","-5","1"
+"14260","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14261","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14263","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14264","Buffalo","NY","42.885568","-78.873479","-5","1"
+"14265","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14267","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14269","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14270","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14272","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14273","Buffalo","NY","42.75495","-78.784908","-5","1"
+"14276","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14280","Buffalo","NY","42.768413","-78.887094","-5","1"
+"14301","Niagara Falls","NY","43.096555","-79.03925","-5","1"
+"14302","Niagara Falls","NY","43.32684","-78.830681","-5","1"
+"14303","Niagara Falls","NY","43.086355","-79.03736","-5","1"
+"14304","Niagara Falls","NY","43.091106","-78.96249","-5","1"
+"14305","Niagara Falls","NY","43.115355","-79.03769","-5","1"
+"14410","Adams Basin","NY","43.195261","-77.855883","-5","1"
+"14411","Albion","NY","43.244034","-78.2023","-5","1"
+"14413","Alton","NY","43.222735","-76.982149","-5","1"
+"14414","Avon","NY","42.899233","-77.73372","-5","1"
+"14415","Bellona","NY","42.757486","-77.02311","-5","1"
+"14416","Bergen","NY","43.067831","-77.99024","-5","1"
+"14417","Geneseo","NY","42.834813","-77.715406","-5","1"
+"14418","Branchport","NY","42.605481","-77.20117","-5","1"
+"14420","Brockport","NY","43.214261","-77.93937","-5","1"
+"14422","Byron","NY","43.079217","-78.06371","-5","1"
+"14423","Caledonia","NY","42.937589","-77.83528","-5","1"
+"14424","Canandaigua","NY","42.85297","-77.29466","-5","1"
+"14425","Farmington","NY","42.985007","-77.346","-5","1"
+"14427","Castile","NY","42.63529","-78.05135","-5","1"
+"14428","Churchville","NY","43.079181","-77.87334","-5","1"
+"14429","Clarendon","NY","43.381027","-78.231338","-5","1"
+"14430","Clarkson","NY","43.286024","-77.684264","-5","1"
+"14432","Clifton Springs","NY","42.965372","-77.14416","-5","1"
+"14433","Clyde","NY","43.07351","-76.87557","-5","1"
+"14435","Conesus","NY","42.706781","-77.68103","-5","1"
+"14437","Dansville","NY","42.576771","-77.71925","-5","1"
+"14441","Dresden","NY","42.684588","-76.95775","-5","1"
+"14443","East Bloomfield","NY","42.900966","-77.42331","-5","1"
+"14445","East Rochester","NY","43.111663","-77.48709","-5","1"
+"14449","East Williamson","NY","43.235369","-77.137642","-5","1"
+"14450","Fairport","NY","43.091714","-77.43483","-5","1"
+"14452","Fancher","NY","43.381027","-78.231338","-5","1"
+"14453","Fishers","NY","43.010908","-77.47054","-5","1"
+"14454","Geneseo","NY","42.798159","-77.77733","-5","1"
+"14456","Geneva","NY","42.853039","-76.99394","-5","1"
+"14458","Lima","NY","42.855029","-77.668326","-5","1"
+"14461","Gorham","NY","42.808127","-77.287611","-5","1"
+"14462","Groveland","NY","42.681361","-77.75302","-5","1"
+"14463","Hall","NY","42.796578","-77.063876","-5","1"
+"14464","Hamlin","NY","43.319027","-77.91991","-5","1"
+"14466","Hemlock","NY","42.787276","-77.58983","-5","1"
+"14467","Henrietta","NY","43.048663","-77.60843","-5","1"
+"14468","Hilton","NY","43.289787","-77.79548","-5","1"
+"14469","Bloomfield","NY","42.868609","-77.4509","-5","1"
+"14470","Holley","NY","43.221689","-78.04393","-5","1"
+"14471","Honeoye","NY","42.762059","-77.50488","-5","1"
+"14472","Honeoye Falls","NY","42.964593","-77.5919","-5","1"
+"14475","Ionia","NY","42.933105","-77.49687","-5","1"
+"14476","Kendall","NY","43.339304","-78.02581","-5","1"
+"14477","Kent","NY","43.341512","-78.14128","-5","1"
+"14478","Keuka Park","NY","42.589281","-77.11824","-5","1"
+"14479","Knowlesville","NY","43.241502","-78.318828","-5","1"
+"14480","Lakeville","NY","42.837786","-77.70625","-5","1"
+"14481","Leicester","NY","42.780121","-77.91499","-5","1"
+"14482","Le Roy","NY","42.979887","-77.97053","-5","1"
+"14484","Portage","NY","42.558227","-78.047214","-5","1"
+"14485","Lima","NY","42.879208","-77.60183","-5","1"
+"14486","Linwood","NY","42.915297","-77.949818","-5","1"
+"14487","Livonia","NY","42.809908","-77.65301","-5","1"
+"14488","Livonia Center","NY","42.729839","-77.773919","-5","1"
+"14489","Lyons","NY","43.076715","-76.99231","-5","1"
+"14502","Macedon","NY","43.08786","-77.33068","-5","1"
+"14504","Manchester","NY","42.970621","-77.2298","-5","1"
+"14505","Marion","NY","43.160635","-77.16948","-5","1"
+"14506","Mendon","NY","42.999201","-77.50263","-5","1"
+"14507","Middlesex","NY","42.702921","-77.27447","-5","1"
+"14508","Morton","NY","43.381027","-78.231338","-5","1"
+"14510","Mount Morris","NY","42.692608","-77.87663","-5","1"
+"14511","Mumford","NY","43.002612","-77.86458","-5","1"
+"14512","Naples","NY","42.628515","-77.39457","-5","1"
+"14513","Newark","NY","43.052126","-77.09424","-5","1"
+"14514","North Chili","NY","43.122386","-77.80347","-5","1"
+"14515","North Greece","NY","43.257819","-77.735079","-5","1"
+"14516","North Rose","NY","43.197378","-76.91443","-5","1"
+"14517","Nunda","NY","42.589984","-77.9075","-5","1"
+"14518","Oaks Corners","NY","42.931873","-77.011839","-5","1"
+"14519","Ontario","NY","43.227921","-77.30097","-5","1"
+"14520","Ontario Center","NY","43.348369","-77.045288","-5","1"
+"14521","Ovid","NY","42.699637","-76.82964","-5","1"
+"14522","Palmyra","NY","43.063858","-77.2223","-5","1"
+"14525","Pavilion","NY","42.876222","-78.00056","-5","1"
+"14526","Penfield","NY","43.145342","-77.45849","-5","1"
+"14527","Penn Yan","NY","42.664079","-77.05664","-5","1"
+"14529","Perkinsville","NY","42.535363","-77.628857","-5","1"
+"14530","Perry","NY","42.724075","-78.00361","-5","1"
+"14532","Phelps","NY","42.964535","-77.02486","-5","1"
+"14533","Piffard","NY","42.846509","-77.88795","-5","1"
+"14534","Pittsford","NY","43.071131","-77.51181","-5","1"
+"14536","Portageville","NY","42.54523","-78.06929","-5","1"
+"14537","Port Gibson","NY","43.033002","-77.157465","-5","1"
+"14538","Pultneyville","NY","43.283582","-77.142027","-5","1"
+"14539","Retsof","NY","42.834327","-77.877876","-5","1"
+"14541","Romulus","NY","42.75147","-76.85353","-5","1"
+"14542","Rose","NY","43.144795","-76.860779","-5","1"
+"14543","Rush","NY","42.98723","-77.67433","-5","1"
+"14544","Rushville","NY","42.75606","-77.24024","-5","1"
+"14545","Scottsburg","NY","42.664904","-77.71275","-5","1"
+"14546","Scottsville","NY","43.030313","-77.7836","-5","1"
+"14547","Seneca Castle","NY","42.808127","-77.287611","-5","1"
+"14548","Shortsville","NY","42.97342","-77.2434","-5","1"
+"14549","Silver Lake","NY","42.692874","-78.022364","-5","1"
+"14550","Silver Springs","NY","42.669499","-78.09375","-5","1"
+"14551","Sodus","NY","43.226024","-77.03599","-5","1"
+"14555","Sodus Point","NY","43.269332","-76.9876","-5","1"
+"14556","Sonyea","NY","42.729839","-77.773919","-5","1"
+"14557","South Byron","NY","43.041606","-78.057252","-5","1"
+"14558","South Lima","NY","42.855409","-77.687643","-5","1"
+"14559","Spencerport","NY","43.189862","-77.81809","-5","1"
+"14560","Springwater","NY","42.674773","-77.58341","-5","1"
+"14561","Stanley","NY","42.815171","-77.1321","-5","1"
+"14563","Union Hill","NY","43.348369","-77.045288","-5","1"
+"14564","Victor","NY","42.980323","-77.42022","-5","1"
+"14568","Walworth","NY","43.134783","-77.28515","-5","1"
+"14569","Warsaw","NY","42.739447","-78.15948","-5","1"
+"14571","Waterport","NY","43.34653","-78.25412","-5","1"
+"14572","Wayland","NY","42.569876","-77.57637","-5","1"
+"14580","Webster","NY","43.220991","-77.45364","-5","1"
+"14585","West Bloomfield","NY","42.901162","-77.54848","-5","1"
+"14586","West Henrietta","NY","43.040271","-77.68215","-5","1"
+"14588","Willard","NY","42.683451","-76.872442","-5","1"
+"14589","Williamson","NY","43.24816","-77.18498","-5","1"
+"14590","Wolcott","NY","43.234753","-76.8252","-5","1"
+"14591","Wyoming","NY","42.829405","-78.08887","-5","1"
+"14592","York","NY","42.875685","-77.883511","-5","1"
+"14601","Rochester","NY","43.286024","-77.684264","-5","1"
+"14602","Rochester","NY","43.286024","-77.684264","-5","1"
+"14603","Rochester","NY","43.161613","-77.606774","-5","1"
+"14604","Rochester","NY","43.156963","-77.60375","-5","1"
+"14605","Rochester","NY","43.167563","-77.6012","-5","1"
+"14606","Rochester","NY","43.168062","-77.68132","-5","1"
+"14607","Rochester","NY","43.149863","-77.58962","-5","1"
+"14608","Rochester","NY","43.155568","-77.62401","-5","1"
+"14609","Rochester","NY","43.175113","-77.56272","-5","1"
+"14610","Rochester","NY","43.142259","-77.54587","-5","1"
+"14611","Rochester","NY","43.147563","-77.64162","-5","1"
+"14612","Rochester","NY","43.256462","-77.66183","-5","1"
+"14613","Rochester","NY","43.182163","-77.63794","-5","1"
+"14614","Rochester","NY","43.155863","-77.61519","-5","1"
+"14615","Rochester","NY","43.204695","-77.65194","-5","1"
+"14616","Rochester","NY","43.232312","-77.64905","-5","1"
+"14617","Rochester","NY","43.223213","-77.59721","-5","1"
+"14618","Rochester","NY","43.116713","-77.55904","-5","1"
+"14619","Rochester","NY","43.136363","-77.64685","-5","1"
+"14620","Rochester","NY","43.132474","-77.60377","-5","1"
+"14621","Rochester","NY","43.185163","-77.60368","-5","1"
+"14622","Rochester","NY","43.21543","-77.55638","-5","1"
+"14623","Rochester","NY","43.087613","-77.6352","-5","1"
+"14624","Rochester","NY","43.127195","-77.72465","-5","1"
+"14625","Rochester","NY","43.143663","-77.51114","-5","1"
+"14626","Rochester","NY","43.214613","-77.70626","-5","1"
+"14627","Rochester","NY","43.127513","-77.627674","-5","1"
+"14638","Rochester","NY","43.286024","-77.684264","-5","1"
+"14639","Rochester","NY","43.286024","-77.684264","-5","1"
+"14642","Rochester","NY","43.286024","-77.684264","-5","1"
+"14643","Rochester","NY","43.286024","-77.684264","-5","1"
+"14644","Rochester","NY","43.286024","-77.684264","-5","1"
+"14645","Rochester","NY","43.286024","-77.684264","-5","1"
+"14646","Rochester","NY","43.286024","-77.684264","-5","1"
+"14647","Rochester","NY","43.286024","-77.684264","-5","1"
+"14649","Rochester","NY","43.286024","-77.684264","-5","1"
+"14650","Rochester","NY","43.286024","-77.684264","-5","1"
+"14651","Rochester","NY","43.286024","-77.684264","-5","1"
+"14652","Rochester","NY","43.286024","-77.684264","-5","1"
+"14653","Rochester","NY","43.286024","-77.684264","-5","1"
+"14660","Rochester","NY","43.286024","-77.684264","-5","1"
+"14664","Rochester","NY","43.286024","-77.684264","-5","1"
+"14673","Rochester","NY","43.286024","-77.684264","-5","1"
+"14683","Rochester","NY","43.286024","-77.684264","-5","1"
+"14692","Rochester","NY","43.286024","-77.684264","-5","1"
+"14694","Rochester","NY","43.286024","-77.684264","-5","1"
+"14701","Jamestown","NY","42.09179","-79.24459","-5","1"
+"14702","Jamestown","NY","42.081657","-79.294921","-5","1"
+"14703","Jamestown","NY","42.342529","-79.41091","-5","1"
+"14704","Jamestown","NY","42.342529","-79.41091","-5","1"
+"14706","Allegany","NY","42.10143","-78.51587","-5","1"
+"14707","Allentown","NY","42.073739","-78.059374","-5","1"
+"14708","Alma","NY","42.016108","-78.05768","-5","1"
+"14709","Angelica","NY","42.339925","-77.99413","-5","1"
+"14710","Ashville","NY","42.098227","-79.40865","-5","1"
+"14711","Belfast","NY","42.319654","-78.13384","-5","1"
+"14712","Bemus Point","NY","42.170787","-79.37689","-5","1"
+"14714","Black Creek","NY","42.279786","-78.23769","-5","1"
+"14715","Bolivar","NY","42.076186","-78.14489","-5","1"
+"14716","Brocton","NY","42.390802","-79.43873","-5","1"
+"14717","Caneadea","NY","42.37074","-78.19335","-5","1"
+"14718","Cassadaga","NY","42.343265","-79.30101","-5","1"
+"14719","Cattaraugus","NY","42.329183","-78.87436","-5","1"
+"14720","Celoron","NY","42.105907","-79.27912","-5","1"
+"14721","Ceres","NY","41.999435","-78.27257","-5","1"
+"14722","Chautauqua","NY","42.187468","-79.450523","-5","1"
+"14723","Cherry Creek","NY","42.316386","-79.1364","-5","1"
+"14724","Clymer","NY","42.066681","-79.66612","-5","1"
+"14726","Conewango Valley","NY","42.251075","-79.03785","-5","1"
+"14727","Cuba","NY","42.213216","-78.28649","-5","1"
+"14728","Dewittville","NY","42.258967","-79.43348","-5","1"
+"14729","East Otto","NY","42.382899","-78.72101","-5","1"
+"14730","East Randolph","NY","42.174736","-78.94734","-5","1"
+"14731","Ellicottville","NY","42.286037","-78.65425","-5","1"
+"14732","Ellington","NY","42.229098","-79.11347","-5","1"
+"14733","Falconer","NY","42.128469","-79.19126","-5","1"
+"14735","Fillmore","NY","42.456047","-78.0973","-5","1"
+"14736","Findley Lake","NY","42.130247","-79.74933","-5","1"
+"14737","Franklinville","NY","42.335628","-78.43114","-5","1"
+"14738","Frewsburg","NY","42.0385","-79.07622","-5","1"
+"14739","Friendship","NY","42.192384","-78.14308","-5","1"
+"14740","Gerry","NY","42.230692","-79.17185","-5","1"
+"14741","Great Valley","NY","42.220602","-78.6337","-5","1"
+"14742","Greenhurst","NY","42.120512","-79.30958","-5","1"
+"14743","Hinsdale","NY","42.203691","-78.407","-5","1"
+"14744","Houghton","NY","42.426885","-78.19509","-5","1"
+"14745","Hume","NY","42.4777","-78.140343","-5","1"
+"14747","Kennedy","NY","42.154315","-79.08905","-5","1"
+"14748","Kill Buck","NY","42.130224","-78.64583","-5","1"
+"14750","Lakewood","NY","42.098657","-79.32439","-5","1"
+"14751","Leon","NY","42.298328","-79.006231","-5","1"
+"14752","Lily Dale","NY","42.352416","-79.323502","-5","1"
+"14753","Limestone","NY","42.035792","-78.61789","-5","1"
+"14754","Little Genesee","NY","42.020028","-78.20368","-5","1"
+"14755","Little Valley","NY","42.249436","-78.80282","-5","1"
+"14756","Maple Springs","NY","42.19815","-79.417353","-5","1"
+"14757","Mayville","NY","42.226149","-79.48396","-5","1"
+"14758","Niobe","NY","42.342529","-79.41091","-5","1"
+"14760","Olean","NY","42.076574","-78.42744","-5","1"
+"14766","Otto","NY","42.357543","-78.807283","-5","1"
+"14767","Panama","NY","42.043339","-79.51361","-5","1"
+"14769","Portland","NY","42.372864","-79.47523","-5","1"
+"14770","Portville","NY","42.047063","-78.30659","-5","1"
+"14771","Canadice","NY","42.737181","-77.519784","-5","1"
+"14772","Randolph","NY","42.160787","-78.95167","-5","1"
+"14774","Richburg","NY","42.114385","-78.168055","-5","1"
+"14775","Ripley","NY","42.254906","-79.69185","-5","1"
+"14776","Rossburg","NY","42.260012","-78.016139","-5","1"
+"14777","Rushford","NY","42.385744","-78.23754","-5","1"
+"14778","Saint Bonaventure","NY","42.270112","-78.684684","-5","1"
+"14779","Salamanca","NY","42.168508","-78.7297","-5","1"
+"14781","Sherman","NY","42.160982","-79.59738","-5","1"
+"14782","Sinclairville","NY","42.265234","-79.26035","-5","1"
+"14783","Steamburg","NY","42.100539","-78.87967","-5","1"
+"14784","Stockton","NY","42.326844","-79.3902","-5","1"
+"14785","Stow","NY","42.155693","-79.412233","-5","1"
+"14786","West Clarksville","NY","42.12267","-78.221332","-5","1"
+"14787","Westfield","NY","42.327029","-79.57301","-5","1"
+"14788","Westons Mills","NY","42.062125","-78.377974","-5","1"
+"14801","Addison","NY","42.104389","-77.28857","-5","1"
+"14802","Alfred","NY","42.255694","-77.78904","-5","1"
+"14803","Alfred Station","NY","42.258793","-77.77793","-5","1"
+"14804","Almond","NY","42.321173","-77.82312","-5","1"
+"14805","Alpine","NY","42.366682","-76.72562","-5","1"
+"14806","Andover","NY","42.157534","-77.79265","-5","1"
+"14807","Arkport","NY","42.410387","-77.71394","-5","1"
+"14808","Atlanta","NY","42.560553","-77.47257","-5","1"
+"14809","Avoca","NY","42.419988","-77.43392","-5","1"
+"14810","Bath","NY","42.351281","-77.3361","-5","1"
+"14812","Beaver Dams","NY","42.286649","-76.9766","-5","1"
+"14813","Belmont","NY","42.238994","-78.01907","-5","1"
+"14814","Big Flats","NY","42.150834","-76.94805","-5","1"
+"14815","Bradford","NY","42.383304","-77.08762","-5","1"
+"14816","Breesport","NY","42.177039","-76.73437","-5","1"
+"14817","Brooktondale","NY","42.368","-76.35407","-5","1"
+"14818","Burdett","NY","42.444243","-76.83274","-5","1"
+"14819","Cameron","NY","42.20928","-77.42796","-5","1"
+"14820","Cameron Mills","NY","42.192615","-77.35979","-5","1"
+"14821","Campbell","NY","42.235058","-77.20491","-5","1"
+"14822","Canaseraga","NY","42.442261","-77.84125","-5","1"
+"14823","Canisteo","NY","42.250187","-77.58406","-5","1"
+"14824","Cayuta","NY","42.265328","-76.71263","-5","1"
+"14825","Chemung","NY","42.043018","-76.62459","-5","1"
+"14826","Cohocton","NY","42.484672","-77.49846","-5","1"
+"14827","Coopers Plains","NY","42.178527","-77.141357","-5","1"
+"14830","Corning","NY","42.140881","-77.04793","-5","1"
+"14831","Corning","NY","42.145265","-77.56683","-5","1"
+"14836","Dalton","NY","42.523195","-77.93008","-5","1"
+"14837","Dundee","NY","42.502293","-76.9997","-5","1"
+"14838","Erin","NY","42.177019","-76.66687","-5","1"
+"14839","Greenwood","NY","42.129806","-77.63705","-5","1"
+"14840","Hammondsport","NY","42.453547","-77.18019","-5","1"
+"14841","Hector","NY","42.521501","-76.86246","-5","1"
+"14842","Himrod","NY","42.595985","-76.94713","-5","1"
+"14843","Hornell","NY","42.331062","-77.65536","-5","1"
+"14844","Horseheads","NY","42.160717","-76.878456","-5","1"
+"14845","Horseheads","NY","42.181584","-76.83639","-5","1"
+"14846","Hunt","NY","42.542056","-77.99501","-5","1"
+"14847","Interlaken","NY","42.614518","-76.72405","-5","1"
+"14850","Ithaca","NY","42.449454","-76.49685","-5","1"
+"14851","Ithaca","NY","42.460721","-76.505435","-5","1"
+"14852","Ithaca","NY","42.445074","-76.467233","-5","1"
+"14853","Ithaca","NY","42.447373","-76.483703","-5","1"
+"14854","Jacksonville","NY","42.50632","-76.608222","-5","1"
+"14855","Jasper","NY","42.135945","-77.5078","-5","1"
+"14856","Kanona","NY","42.374218","-77.364812","-5","1"
+"14857","Lakemont","NY","42.515233","-76.92063","-5","1"
+"14858","Lindley","NY","42.03128","-77.13413","-5","1"
+"14859","Lockwood","NY","42.116615","-76.54806","-5","1"
+"14860","Lodi","NY","42.590355","-76.84745","-5","1"
+"14861","Lowman","NY","42.074742","-76.69317","-5","1"
+"14863","Mecklenburg","NY","42.451569","-76.706717","-5","1"
+"14864","Millport","NY","42.271938","-76.83926","-5","1"
+"14865","Montour Falls","NY","42.352725","-76.84258","-5","1"
+"14867","Newfield","NY","42.354851","-76.60338","-5","1"
+"14869","Odessa","NY","42.341316","-76.77926","-5","1"
+"14870","Painted Post","NY","42.173481","-77.11844","-5","1"
+"14871","Pine City","NY","42.048032","-76.90521","-5","1"
+"14872","Pine Valley","NY","42.218224","-76.84694","-5","1"
+"14873","Prattsburgh","NY","42.525335","-77.29673","-5","1"
+"14874","Pulteney","NY","42.527075","-77.16963","-5","1"
+"14876","Reading Center","NY","42.429721","-76.925846","-5","1"
+"14877","Rexville","NY","42.060154","-77.68455","-5","1"
+"14878","Rock Stream","NY","42.451153","-76.93132","-5","1"
+"14879","Savona","NY","42.330602","-77.19305","-5","1"
+"14880","Scio","NY","42.170951","-77.97556","-5","1"
+"14881","Slaterville Springs","NY","42.39534","-76.35211","-5","1"
+"14882","Lansing","NY","42.564191","-76.54077","-5","1"
+"14883","Spencer","NY","42.234865","-76.48643","-5","1"
+"14884","Swain","NY","42.473556","-77.89514","-5","1"
+"14885","Troupsburg","NY","42.041973","-77.5632","-5","1"
+"14886","Trumansburg","NY","42.51432","-76.6689","-5","1"
+"14887","Tyrone","NY","42.399371","-77.026768","-5","1"
+"14889","Van Etten","NY","42.212809","-76.58618","-5","1"
+"14891","Watkins Glen","NY","42.374828","-76.91606","-5","1"
+"14892","Waverly","NY","42.023442","-76.53404","-5","1"
+"14893","Wayne","NY","42.474143","-77.097713","-5","1"
+"14894","Wellsburg","NY","42.01359","-76.75307","-5","1"
+"14895","Wellsville","NY","42.094855","-77.94686","-5","1"
+"14897","Whitesville","NY","42.034218","-77.79269","-5","1"
+"14898","Woodhull","NY","42.065376","-77.42392","-5","1"
+"14901","Elmira","NY","42.091924","-76.79217","-5","1"
+"14902","Elmira","NY","42.147285","-76.750888","-5","1"
+"14903","Elmira","NY","42.129274","-76.84497","-5","1"
+"14904","Elmira","NY","42.072024","-76.80393","-5","1"
+"14905","Elmira","NY","42.087824","-76.83686","-5","1"
+"14925","Elmira","NY","42.147285","-76.750888","-5","1"
+"15001","Aliquippa","PA","40.603966","-80.28776","-5","1"
+"15003","Ambridge","PA","40.593917","-80.22181","-5","1"
+"15004","Atlasburg","PA","40.341487","-80.38408","-5","1"
+"15005","Baden","PA","40.641066","-80.20599","-5","1"
+"15006","Bairdford","PA","40.630894","-79.88057","-5","1"
+"15007","Bakerstown","PA","40.652311","-79.93303","-5","1"
+"15009","Beaver","PA","40.695281","-80.3299","-5","1"
+"15010","Beaver Falls","PA","40.763899","-80.33572","-5","1"
+"15012","Belle Vernon","PA","40.140248","-79.84251","-5","1"
+"15014","Brackenridge","PA","40.608403","-79.74234","-5","1"
+"15015","Bradfordwoods","PA","40.635147","-80.08369","-5","1"
+"15017","Bridgeville","PA","40.351802","-80.11534","-5","1"
+"15018","Buena Vista","PA","40.266358","-79.79325","-5","1"
+"15019","Bulger","PA","40.417545","-80.33625","-5","1"
+"15020","Bunola","PA","40.238657","-79.94493","-5","1"
+"15021","Burgettstown","PA","40.383884","-80.41364","-5","1"
+"15022","Charleroi","PA","40.136537","-79.91321","-5","1"
+"15024","Cheswick","PA","40.569723","-79.83242","-5","1"
+"15025","Clairton","PA","40.292974","-79.90179","-5","1"
+"15026","Clinton","PA","40.508376","-80.35953","-5","1"
+"15027","Conway","PA","40.663816","-80.23494","-5","1"
+"15028","Coulters","PA","40.297336","-79.80192","-5","1"
+"15030","Creighton","PA","40.583218","-79.77947","-5","1"
+"15031","Cuddy","PA","40.347826","-80.1656","-5","1"
+"15032","Curtisville","PA","40.434436","-80.024817","-5","1"
+"15033","Donora","PA","40.176375","-79.86138","-5","1"
+"15034","Dravosburg","PA","40.350519","-79.89008","-5","1"
+"15035","East McKeesport","PA","40.384223","-79.80792","-5","1"
+"15036","Eldersville","PA","40.214896","-80.179139","-5","1"
+"15037","Elizabeth","PA","40.258438","-79.85946","-5","1"
+"15038","Elrama","PA","40.251586","-79.92474","-5","1"
+"15042","Freedom","PA","40.682566","-80.23208","-5","1"
+"15043","Georgetown","PA","40.582316","-80.50182","-5","1"
+"15044","Gibsonia","PA","40.631011","-79.95766","-5","1"
+"15045","Glassport","PA","40.326919","-79.88869","-5","1"
+"15046","Crescent","PA","40.558477","-80.2261","-5","1"
+"15047","Greenock","PA","40.434436","-80.024817","-5","1"
+"15049","Harwick","PA","40.555627","-79.8064","-5","1"
+"15050","Hookstown","PA","40.557889","-80.44529","-5","1"
+"15051","Indianola","PA","40.565907","-79.85848","-5","1"
+"15052","Industry","PA","40.665001","-80.42534","-5","1"
+"15053","Joffre","PA","40.379884","-80.36087","-5","1"
+"15054","Langeloth","PA","40.363006","-80.40861","-5","1"
+"15055","Lawrence","PA","40.304019","-80.12246","-5","1"
+"15056","Leetsdale","PA","40.565367","-80.20977","-5","1"
+"15057","McDonald","PA","40.357286","-80.23629","-5","1"
+"15059","Midland","PA","40.649081","-80.47218","-5","1"
+"15060","Midway","PA","40.368154","-80.2924","-5","1"
+"15061","Monaca","PA","40.677132","-80.28881","-5","1"
+"15062","Monessen","PA","40.154271","-79.88277","-5","1"
+"15063","Monongahela","PA","40.196694","-79.92642","-5","1"
+"15064","Morgan","PA","40.352897","-80.14529","-5","1"
+"15065","Natrona Heights","PA","40.628522","-79.72566","-5","1"
+"15066","New Brighton","PA","40.73998","-80.29472","-5","1"
+"15067","New Eagle","PA","40.207526","-79.95304","-5","1"
+"15068","New Kensington","PA","40.571108","-79.74226","-5","1"
+"15069","New Kensington","PA","40.360223","-79.439801","-5","1"
+"15071","Oakdale","PA","40.420319","-80.18692","-5","1"
+"15072","Pricedale","PA","40.13848","-79.85575","-5","1"
+"15074","Rochester","PA","40.708166","-80.2735","-5","1"
+"15075","Rural Ridge","PA","40.586408","-79.82769","-5","1"
+"15076","Russellton","PA","40.61517","-79.83394","-5","1"
+"15077","Shippingport","PA","40.602535","-80.386344","-5","1"
+"15078","Slovan","PA","40.357926","-80.38943","-5","1"
+"15081","South Heights","PA","40.574634","-80.23609","-5","1"
+"15082","Sturgeon","PA","40.378997","-80.21184","-5","1"
+"15083","Sutersville","PA","40.237582","-79.80038","-5","1"
+"15084","Tarentum","PA","40.61357","-79.78095","-5","1"
+"15085","Trafford","PA","40.386968","-79.74467","-5","1"
+"15086","Warrendale","PA","40.661431","-80.09304","-5","1"
+"15087","Webster","PA","40.186047","-79.84994","-5","1"
+"15088","West Elizabeth","PA","40.272901","-79.89491","-5","1"
+"15089","West Newton","PA","40.211895","-79.75483","-5","1"
+"15090","Wexford","PA","40.617016","-80.05916","-5","1"
+"15091","Wildwood","PA","40.434436","-80.024817","-5","1"
+"15095","Warrendale","PA","40.434436","-80.024817","-5","1"
+"15096","Warrendale","PA","40.434436","-80.024817","-5","1"
+"15101","Allison Park","PA","40.570915","-79.96033","-5","1"
+"15102","Bethel Park","PA","40.324535","-80.03864","-5","1"
+"15104","Braddock","PA","40.404743","-79.86439","-5","1"
+"15106","Carnegie","PA","40.404119","-80.09014","-5","1"
+"15108","Coraopolis","PA","40.500665","-80.18464","-5","1"
+"15110","Duquesne","PA","40.369969","-79.85095","-5","1"
+"15112","East Pittsburgh","PA","40.399436","-79.83794","-5","1"
+"15116","Glenshaw","PA","40.533806","-79.96303","-5","1"
+"15120","Homestead","PA","40.395336","-79.90635","-5","1"
+"15122","West Mifflin","PA","40.366177","-79.89418","-5","1"
+"15123","West Mifflin","PA","40.434436","-80.024817","-5","1"
+"15126","Imperial","PA","40.454423","-80.26324","-5","1"
+"15127","Ingomar","PA","40.434436","-80.024817","-5","1"
+"15129","Library","PA","40.289752","-80.00756","-5","1"
+"15130","McKeesport","PA","40.434436","-80.024817","-5","1"
+"15131","McKeesport","PA","40.341469","-79.81105","-5","1"
+"15132","McKeesport","PA","40.341919","-79.84791","-5","1"
+"15133","McKeesport","PA","40.332502","-79.8646","-5","1"
+"15134","McKeesport","PA","40.434436","-80.024817","-5","1"
+"15135","McKeesport","PA","40.306819","-79.8145","-5","1"
+"15136","McKees Rocks","PA","40.471618","-80.07695","-5","1"
+"15137","North Versailles","PA","40.380219","-79.81017","-5","1"
+"15139","Oakmont","PA","40.519518","-79.83762","-5","1"
+"15140","Pitcairn","PA","40.405768","-79.77643","-5","1"
+"15142","Presto","PA","40.379549","-80.12451","-5","1"
+"15143","Sewickley","PA","40.561091","-80.15554","-5","1"
+"15144","Springdale","PA","40.543053","-79.78223","-5","1"
+"15145","Turtle Creek","PA","40.408218","-79.82339","-5","1"
+"15146","Monroeville","PA","40.431034","-79.76526","-5","1"
+"15147","Verona","PA","40.498218","-79.83426","-5","1"
+"15148","Wilmerding","PA","40.394268","-79.80286","-5","1"
+"15163","North Apollo","PA","40.588257","-79.554054","-5","1"
+"15189","Sewickley","PA","40.434436","-80.024817","-5","1"
+"15201","Pittsburgh","PA","40.471468","-79.95726","-5","1"
+"15202","Pittsburgh","PA","40.502918","-80.0704","-5","1"
+"15203","Pittsburgh","PA","40.426211","-79.97826","-5","1"
+"15204","Pittsburgh","PA","40.455118","-80.06008","-5","1"
+"15205","Pittsburgh","PA","40.436618","-80.07289","-5","1"
+"15206","Pittsburgh","PA","40.468968","-79.91863","-5","1"
+"15207","Pittsburgh","PA","40.399355","-79.93414","-5","1"
+"15208","Pittsburgh","PA","40.455168","-79.89709","-5","1"
+"15209","Pittsburgh","PA","40.492618","-79.97458","-5","1"
+"15210","Pittsburgh","PA","40.409219","-79.98948","-5","1"
+"15211","Pittsburgh","PA","40.428369","-80.01269","-5","1"
+"15212","Pittsburgh","PA","40.460669","-80.01144","-5","1"
+"15213","Pittsburgh","PA","40.443269","-79.95487","-5","1"
+"15214","Pittsburgh","PA","40.479469","-80.0115","-5","1"
+"15215","Pittsburgh","PA","40.497701","-79.9157","-5","1"
+"15216","Pittsburgh","PA","40.400319","-80.03566","-5","1"
+"15217","Pittsburgh","PA","40.430919","-79.92569","-5","1"
+"15218","Pittsburgh","PA","40.424336","-79.88725","-5","1"
+"15219","Pittsburgh","PA","40.443819","-79.98067","-5","1"
+"15220","Pittsburgh","PA","40.430822","-80.04453","-5","1"
+"15221","Pittsburgh","PA","40.438035","-79.87191","-5","1"
+"15222","Pittsburgh","PA","40.447036","-79.99313","-5","1"
+"15223","Pittsburgh","PA","40.503768","-79.95164","-5","1"
+"15224","Pittsburgh","PA","40.463463","-79.94612","-5","1"
+"15225","Pittsburgh","PA","40.513778","-80.13571","-5","1"
+"15226","Pittsburgh","PA","40.394002","-80.01655","-5","1"
+"15227","Pittsburgh","PA","40.377869","-79.97516","-5","1"
+"15228","Pittsburgh","PA","40.372802","-80.0448","-5","1"
+"15229","Pittsburgh","PA","40.518368","-80.03364","-5","1"
+"15230","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15231","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15232","Pittsburgh","PA","40.454018","-79.9325","-5","1"
+"15233","Pittsburgh","PA","40.455919","-80.02604","-5","1"
+"15234","Pittsburgh","PA","40.369619","-80.01831","-5","1"
+"15235","Pittsburgh","PA","40.459518","-79.83277","-5","1"
+"15236","Pittsburgh","PA","40.342869","-79.97929","-5","1"
+"15237","Pittsburgh","PA","40.552768","-80.03227","-5","1"
+"15238","Pittsburgh","PA","40.518701","-79.86744","-5","1"
+"15239","Pittsburgh","PA","40.482655","-79.74278","-5","1"
+"15240","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15241","Pittsburgh","PA","40.329619","-80.07364","-5","1"
+"15242","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15243","Pittsburgh","PA","40.372669","-80.0712","-5","1"
+"15244","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15246","Pittsburgh","PA","40.476524","-79.899044","-5","1"
+"15250","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15251","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15252","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15253","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15254","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15255","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15257","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15258","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15259","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15260","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15261","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15262","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15263","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15264","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15265","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15266","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15267","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15268","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15270","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15272","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15274","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15275","Pittsburgh","PA","40.44952","-80.179475","-5","1"
+"15276","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15277","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15278","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15279","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15281","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15282","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15283","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15285","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15286","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15290","Pittsburgh","PA","40.434436","-80.024817","-5","1"
+"15298","Pittsburgh","PA","40.420019","-79.939473","-5","1"
+"15301","Washington","PA","40.170663","-80.25185","-5","1"
+"15310","Aleppo","PA","39.792529","-80.48584","-5","1"
+"15311","Amity","PA","40.042851","-80.18827","-5","1"
+"15312","Avella","PA","40.264217","-80.44199","-5","1"
+"15313","Beallsville","PA","40.065384","-80.02313","-5","1"
+"15314","Bentleyville","PA","40.127951","-80.01226","-5","1"
+"15315","Bobtown","PA","39.760868","-79.98315","-5","1"
+"15316","Brave","PA","39.743424","-80.26376","-5","1"
+"15317","Canonsburg","PA","40.26819","-80.16222","-5","1"
+"15320","Carmichaels","PA","39.883336","-79.98393","-5","1"
+"15321","Cecil","PA","40.322872","-80.18745","-5","1"
+"15322","Clarksville","PA","39.976531","-80.04218","-5","1"
+"15323","Claysville","PA","40.114204","-80.40715","-5","1"
+"15324","Cokeburg","PA","40.10012","-80.06363","-5","1"
+"15325","Crucible","PA","39.94821","-79.96653","-5","1"
+"15327","Dilliner","PA","39.754889","-79.95226","-5","1"
+"15329","Prosperity","PA","40.030707","-80.27353","-5","1"
+"15330","Eighty Four","PA","40.178679","-80.10014","-5","1"
+"15331","Ellsworth","PA","40.105887","-80.02045","-5","1"
+"15332","Finleyville","PA","40.250299","-79.99436","-5","1"
+"15333","Fredericktown","PA","40.010135","-80.00537","-5","1"
+"15334","Garards Fort","PA","39.809756","-79.9969","-5","1"
+"15336","Gastonville","PA","40.260141","-79.992678","-5","1"
+"15337","Graysville","PA","39.943552","-80.37399","-5","1"
+"15338","Greensboro","PA","39.809161","-79.93793","-5","1"
+"15339","Hendersonville","PA","40.301838","-80.15431","-5","1"
+"15340","Hickory","PA","40.290375","-80.31845","-5","1"
+"15341","Holbrook","PA","39.82644","-80.35051","-5","1"
+"15342","Houston","PA","40.241854","-80.21445","-5","1"
+"15344","Jefferson","PA","39.92757","-80.05491","-5","1"
+"15345","Marianna","PA","40.019657","-80.10273","-5","1"
+"15346","Mather","PA","39.935562","-80.07248","-5","1"
+"15347","Meadow Lands","PA","40.214331","-80.22872","-5","1"
+"15348","Millsboro","PA","39.988369","-79.99484","-5","1"
+"15349","Mount Morris","PA","39.741865","-80.07999","-5","1"
+"15350","Muse","PA","40.292528","-80.20022","-5","1"
+"15351","Nemacolin","PA","39.877676","-79.92585","-5","1"
+"15352","New Freeport","PA","39.748534","-80.39778","-5","1"
+"15353","Nineveh","PA","39.961767","-80.3069","-5","1"
+"15354","Pine Bank","PA","39.870635","-80.211335","-5","1"
+"15355","Centerville","PA","40.055216","-80.009135","-5","1"
+"15357","Rices Landing","PA","39.942802","-79.99612","-5","1"
+"15358","Richeyville","PA","40.05604","-79.9981","-5","1"
+"15359","Rogersville","PA","39.880073","-80.27332","-5","1"
+"15360","Scenery Hill","PA","40.08708","-80.07316","-5","1"
+"15361","Southview","PA","40.32826","-80.2596","-5","1"
+"15362","Spraggs","PA","39.748302","-80.21327","-5","1"
+"15363","Strabane","PA","40.251054","-80.19917","-5","1"
+"15364","Sycamore","PA","39.956204","-80.27779","-5","1"
+"15365","Taylorstown","PA","40.16113","-80.378093","-5","1"
+"15366","Van Voorhis","PA","40.110068","-80.031787","-5","1"
+"15367","Venetia","PA","40.261394","-80.05254","-5","1"
+"15368","Vestaburg","PA","40.015501","-79.99019","-5","1"
+"15370","Waynesburg","PA","39.892235","-80.17983","-5","1"
+"15376","West Alexander","PA","40.101254","-80.50229","-5","1"
+"15377","West Finley","PA","39.976027","-80.44474","-5","1"
+"15378","Westland","PA","40.27758","-80.27408","-5","1"
+"15379","West Middletown","PA","40.240402","-80.42414","-5","1"
+"15380","Wind Ridge","PA","39.874975","-80.46845","-5","1"
+"15401","Uniontown","PA","39.89822","-79.7311","-5","1"
+"15410","Adah","PA","39.918848","-79.90832","-5","1"
+"15411","Addison","PA","39.751296","-79.35113","-5","1"
+"15412","Allenport","PA","40.100345","-79.846","-5","1"
+"15413","Allison","PA","39.987842","-79.86681","-5","1"
+"15415","Brier Hill","PA","39.980787","-79.850366","-5","1"
+"15416","Brownfield","PA","39.932084","-79.65217","-5","1"
+"15417","Brownsville","PA","40.01933","-79.89869","-5","1"
+"15419","California","PA","40.063977","-79.89261","-5","1"
+"15420","Cardale","PA","39.958894","-79.86798","-5","1"
+"15421","Chalk Hill","PA","39.845088","-79.599126","-5","1"
+"15422","Chestnut Ridge","PA","39.979032","-79.81957","-5","1"
+"15423","Coal Center","PA","40.082073","-79.91911","-5","1"
+"15424","Confluence","PA","39.817148","-79.34803","-5","1"
+"15425","Connellsville","PA","40.024138","-79.58414","-5","1"
+"15427","Daisytown","PA","40.061044","-79.97336","-5","1"
+"15428","Dawson","PA","40.060912","-79.65886","-5","1"
+"15429","Denbo","PA","40.007062","-79.9339","-5","1"
+"15430","Dickerson Run","PA","40.040653","-79.66089","-5","1"
+"15431","Dunbar","PA","39.968368","-79.61815","-5","1"
+"15432","Dunlevy","PA","40.117368","-79.86413","-5","1"
+"15433","East Millsboro","PA","39.968503","-79.95183","-5","1"
+"15434","Elco","PA","40.079185","-79.87475","-5","1"
+"15435","Fairbank","PA","39.950123","-79.858471","-5","1"
+"15436","Fairchance","PA","39.821336","-79.75186","-5","1"
+"15437","Farmington","PA","39.793095","-79.59465","-5","1"
+"15438","Fayette City","PA","40.093982","-79.83787","-5","1"
+"15439","Gans","PA","39.771324","-79.635842","-5","1"
+"15440","Gibbon Glade","PA","39.72974","-79.59124","-5","1"
+"15442","Grindstone","PA","40.013397","-79.83113","-5","1"
+"15443","Hibbs","PA","39.927312","-79.88768","-5","1"
+"15444","Hiller","PA","40.011146","-79.90541","-5","1"
+"15445","Hopwood","PA","39.876251","-79.69296","-5","1"
+"15446","Indian Head","PA","40.028267","-79.39475","-5","1"
+"15447","Isabella","PA","39.945514","-79.93869","-5","1"
+"15448","Jacobs Creek","PA","40.134792","-79.74272","-5","1"
+"15449","Keisterville","PA","39.963622","-79.785349","-5","1"
+"15450","La Belle","PA","40.00666","-79.96943","-5","1"
+"15451","Lake Lynn","PA","39.737104","-79.83613","-5","1"
+"15454","Leckrone","PA","39.863666","-79.86378","-5","1"
+"15455","Leisenring","PA","39.998299","-79.64333","-5","1"
+"15456","Lemont Furnace","PA","39.923495","-79.66014","-5","1"
+"15458","McClellandtown","PA","39.879185","-79.8618","-5","1"
+"15459","Markleysburg","PA","39.757928","-79.46514","-5","1"
+"15460","Martin","PA","39.804674","-79.9102","-5","1"
+"15461","Masontown","PA","39.847077","-79.90196","-5","1"
+"15462","Melcroft","PA","40.061931","-79.38538","-5","1"
+"15463","Merrittstown","PA","39.882521","-79.833585","-5","1"
+"15464","Mill Run","PA","39.926509","-79.43272","-5","1"
+"15465","Mount Braddock","PA","39.932084","-79.65217","-5","1"
+"15466","Newell","PA","40.075617","-79.89611","-5","1"
+"15467","New Geneva","PA","39.932084","-79.65217","-5","1"
+"15468","New Salem","PA","39.936535","-79.84669","-5","1"
+"15469","Normalville","PA","40.006624","-79.41616","-5","1"
+"15470","Ohiopyle","PA","39.854144","-79.52989","-5","1"
+"15471","German","PA","39.9783","-79.856751","-5","1"
+"15472","Oliver","PA","39.916995","-79.71589","-5","1"
+"15473","Perryopolis","PA","40.080727","-79.75697","-5","1"
+"15474","Point Marion","PA","39.74419","-79.90126","-5","1"
+"15475","Republic","PA","39.964486","-79.87846","-5","1"
+"15476","Ronco","PA","39.869675","-79.922","-5","1"
+"15477","Roscoe","PA","40.079169","-79.86448","-5","1"
+"15478","Smithfield","PA","39.791113","-79.81247","-5","1"
+"15479","Smithton","PA","40.148576","-79.72573","-5","1"
+"15480","Smock","PA","39.987054","-79.77879","-5","1"
+"15482","Star Junction","PA","40.062849","-79.76338","-5","1"
+"15483","Stockdale","PA","40.081257","-79.85174","-5","1"
+"15484","Uledi","PA","39.89615","-79.78956","-5","1"
+"15485","Ursina","PA","39.816608","-79.33009","-5","1"
+"15486","Vanderbilt","PA","40.034355","-79.6819","-5","1"
+"15488","Waltersburg","PA","39.976316","-79.768901","-5","1"
+"15489","West Leisenring","PA","39.955933","-79.69946","-5","1"
+"15490","White","PA","40.077289","-79.42598","-5","1"
+"15492","Wickhaven","PA","40.120876","-79.77089","-5","1"
+"15493","Perry","PA","40.091655","-79.718512","-5","1"
+"15501","Somerset","PA","40.02847","-79.1105","-5","1"
+"15502","Hidden Valley","PA","40.046023","-79.258458","-5","1"
+"15510","Somerset","PA","39.963306","-79.04089","-5","1"
+"15520","Acosta","PA","40.112153","-79.06772","-5","1"
+"15521","Alum Bank","PA","40.188405","-78.63027","-5","1"
+"15522","Bedford","PA","39.998096","-78.52204","-5","1"
+"15530","Berlin","PA","39.937504","-78.94183","-5","1"
+"15531","Boswell","PA","40.173782","-79.0629","-5","1"
+"15532","Boynton","PA","39.766617","-79.06594","-5","1"
+"15533","Breezewood","PA","39.989224","-78.24245","-5","1"
+"15534","Buffalo Mills","PA","39.904209","-78.70159","-5","1"
+"15535","Clearville","PA","39.825578","-78.4423","-5","1"
+"15536","Crystal Spring","PA","39.951222","-78.20512","-5","1"
+"15537","Everett","PA","40.003997","-78.36456","-5","1"
+"15538","Fairhope","PA","39.863486","-78.84235","-5","1"
+"15539","Fishertown","PA","40.128089","-78.5839","-5","1"
+"15540","Fort Hill","PA","39.798343","-79.22064","-5","1"
+"15541","Friedens","PA","40.053525","-78.99023","-5","1"
+"15542","Garrett","PA","39.863543","-79.06935","-5","1"
+"15544","Gray","PA","40.134685","-79.09236","-5","1"
+"15545","Hyndman","PA","39.776675","-78.76286","-5","1"
+"15546","Jenners","PA","40.14376","-79.04944","-5","1"
+"15547","Jennerstown","PA","40.159054","-79.06371","-5","1"
+"15548","Kantner","PA","40.101106","-78.938653","-5","1"
+"15549","Listie","PA","40.020764","-79.012306","-5","1"
+"15550","Manns Choice","PA","40.003724","-78.63685","-5","1"
+"15551","Markleton","PA","39.886916","-79.25388","-5","1"
+"15552","Meyersdale","PA","39.805436","-79.00013","-5","1"
+"15553","New Baltimore","PA","39.983808","-78.77215","-5","1"
+"15554","New Paris","PA","40.121392","-78.5877","-5","1"
+"15555","Quecreek","PA","40.091429","-79.087198","-5","1"
+"15557","Rockwood","PA","39.935728","-79.22093","-5","1"
+"15558","Salisbury","PA","39.742872","-79.0868","-5","1"
+"15559","Schellsburg","PA","40.058077","-78.66391","-5","1"
+"15560","Shanksville","PA","40.017182","-78.90589","-5","1"
+"15561","Sipesville","PA","40.096406","-79.090158","-5","1"
+"15562","Springs","PA","39.746182","-79.13245","-5","1"
+"15563","Stoystown","PA","40.099003","-78.94801","-5","1"
+"15564","Wellersburg","PA","39.729896","-78.844105","-5","1"
+"15565","West Salisbury","PA","40.003476","-79.037983","-5","1"
+"15601","Greensburg","PA","40.298765","-79.54126","-5","1"
+"15605","Greensburg","PA","40.360223","-79.439801","-5","1"
+"15606","Greensburg","PA","40.360223","-79.439801","-5","1"
+"15610","Acme","PA","40.138405","-79.42425","-5","1"
+"15611","Adamsburg","PA","40.3044","-79.65604","-5","1"
+"15612","Alverton","PA","40.136883","-79.59033","-5","1"
+"15613","Apollo","PA","40.560849","-79.57544","-5","1"
+"15615","Ardara","PA","40.358962","-79.73879","-5","1"
+"15616","Armbrust","PA","40.360223","-79.439801","-5","1"
+"15617","Arona","PA","40.26974","-79.66042","-5","1"
+"15618","Avonmore","PA","40.528929","-79.48116","-5","1"
+"15619","Bovard","PA","40.360223","-79.439801","-5","1"
+"15620","Bradenville","PA","40.321426","-79.34079","-5","1"
+"15621","Calumet","PA","40.360223","-79.439801","-5","1"
+"15622","Champion","PA","40.038201","-79.30426","-5","1"
+"15623","Claridge","PA","40.366748","-79.61645","-5","1"
+"15624","Crabtree","PA","40.362739","-79.46886","-5","1"
+"15625","Darragh","PA","40.267005","-79.67427","-5","1"
+"15626","Delmont","PA","40.409992","-79.57266","-5","1"
+"15627","Derry","PA","40.339547","-79.30172","-5","1"
+"15628","Donegal","PA","40.108585","-79.38106","-5","1"
+"15629","East Vandergrift","PA","40.598412","-79.56196","-5","1"
+"15630","Edmon","PA","40.847829","-79.451575","-5","1"
+"15631","Everson","PA","40.090582","-79.58704","-5","1"
+"15632","Export","PA","40.430632","-79.61837","-5","1"
+"15633","Forbes Road","PA","40.355049","-79.52297","-5","1"
+"15634","Grapeville","PA","40.324588","-79.60693","-5","1"
+"15635","Hannastown","PA","40.351619","-79.49612","-5","1"
+"15636","Harrison City","PA","40.359353","-79.65576","-5","1"
+"15637","Herminie","PA","40.261878","-79.71321","-5","1"
+"15638","Hostetter","PA","40.26106","-79.14313","-5","1"
+"15639","Hunker","PA","40.201398","-79.60071","-5","1"
+"15640","Hutchinson","PA","40.22615","-79.73165","-5","1"
+"15641","Hyde Park","PA","40.631729","-79.58961","-5","1"
+"15642","Irwin","PA","40.325902","-79.71324","-5","1"
+"15643","Hempfield","PA","40.322965","-79.653388","-5","1"
+"15644","Jeannette","PA","40.329238","-79.61469","-5","1"
+"15646","Jones Mills","PA","40.087243","-79.32665","-5","1"
+"15647","Larimer","PA","40.344319","-79.72574","-5","1"
+"15650","Latrobe","PA","40.299646","-79.38845","-5","1"
+"15655","Laughlintown","PA","40.202095","-79.19266","-5","1"
+"15656","Leechburg","PA","40.63071","-79.61381","-5","1"
+"15658","Ligonier","PA","40.247351","-79.22882","-5","1"
+"15660","Lowber","PA","40.245378","-79.77196","-5","1"
+"15661","Loyalhanna","PA","40.319956","-79.35901","-5","1"
+"15662","Luxor","PA","40.333489","-79.47547","-5","1"
+"15663","Madison","PA","40.244753","-79.67839","-5","1"
+"15664","Mammoth","PA","40.310772","-79.617187","-5","1"
+"15665","Manor","PA","40.333339","-79.66646","-5","1"
+"15666","Mount Pleasant","PA","40.150143","-79.52492","-5","1"
+"15668","Murrysville","PA","40.451664","-79.67948","-5","1"
+"15670","New Alexandria","PA","40.408295","-79.43967","-5","1"
+"15671","New Derry","PA","40.356055","-79.3194","-5","1"
+"15672","New Stanton","PA","40.231003","-79.61611","-5","1"
+"15673","North Apollo","PA","40.593301","-79.55779","-5","1"
+"15674","Norvelt","PA","40.2071","-79.49619","-5","1"
+"15675","Penn","PA","40.330326","-79.64061","-5","1"
+"15676","Pleasant Unity","PA","40.243195","-79.45737","-5","1"
+"15677","Rector","PA","40.175368","-79.23651","-5","1"
+"15678","Rillton","PA","40.287869","-79.72904","-5","1"
+"15679","Ruffs Dale","PA","40.17462","-79.63584","-5","1"
+"15680","Salina","PA","40.521015","-79.49522","-5","1"
+"15681","Saltsburg","PA","40.500852","-79.4463","-5","1"
+"15682","Schenley","PA","40.847829","-79.451575","-5","1"
+"15683","Scottdale","PA","40.103791","-79.59396","-5","1"
+"15684","Slickville","PA","40.463572","-79.51475","-5","1"
+"15685","Southwest","PA","40.196455","-79.52466","-5","1"
+"15686","Spring Church","PA","40.608969","-79.42092","-5","1"
+"15687","Stahlstown","PA","40.134658","-79.31493","-5","1"
+"15688","Tarrs","PA","40.172199","-79.59265","-5","1"
+"15689","United","PA","40.219344","-79.49244","-5","1"
+"15690","Vandergrift","PA","40.612649","-79.56708","-5","1"
+"15691","Wendel","PA","40.294021","-79.686626","-5","1"
+"15692","Westmoreland City","PA","40.332063","-79.67632","-5","1"
+"15693","Whitney","PA","40.253086","-79.40846","-5","1"
+"15695","Wyano","PA","40.195407","-79.69532","-5","1"
+"15696","Youngstown","PA","40.279151","-79.36465","-5","1"
+"15697","Youngwood","PA","40.238134","-79.58172","-5","1"
+"15698","Yukon","PA","40.217118","-79.68406","-5","1"
+"15701","Indiana","PA","40.626307","-79.16146","-5","1"
+"15705","Indiana","PA","40.640031","-79.129445","-5","1"
+"15710","Alverda","PA","40.632966","-78.85799","-5","1"
+"15711","Anita","PA","41.00232","-78.96306","-5","1"
+"15712","Arcadia","PA","40.786561","-78.84707","-5","1"
+"15713","Aultman","PA","40.56265","-79.25965","-5","1"
+"15714","Barnesboro","PA","40.662676","-78.7936","-5","1"
+"15715","Big Run","PA","40.969945","-78.87784","-5","1"
+"15716","Black Lick","PA","40.472335","-79.19534","-5","1"
+"15717","Blairsville","PA","40.446361","-79.24611","-5","1"
+"15720","Brush Valley","PA","40.529238","-79.0846","-5","1"
+"15721","Burnside","PA","40.813203","-78.78764","-5","1"
+"15722","Carrolltown","PA","40.600375","-78.72133","-5","1"
+"15723","Chambersville","PA","40.70673","-79.16106","-5","1"
+"15724","Cherry Tree","PA","40.734783","-78.81275","-5","1"
+"15725","Clarksburg","PA","40.518067","-79.34538","-5","1"
+"15727","Clune","PA","40.55027","-79.323745","-5","1"
+"15728","Clymer","PA","40.674994","-78.98999","-5","1"
+"15729","Commodore","PA","40.710407","-78.93008","-5","1"
+"15730","Coolspring","PA","41.040903","-79.08486","-5","1"
+"15731","Coral","PA","40.500385","-79.17407","-5","1"
+"15732","Creekside","PA","40.721516","-79.21224","-5","1"
+"15733","De Lancey","PA","40.98415","-78.9622","-5","1"
+"15734","Dixonville","PA","40.717399","-79.00688","-5","1"
+"15736","Elderton","PA","40.694906","-79.34332","-5","1"
+"15737","Elmora","PA","40.607635","-78.752415","-5","1"
+"15738","Emeigh","PA","40.693633","-78.775076","-5","1"
+"15739","Ernest","PA","40.677609","-79.16422","-5","1"
+"15740","Frostburg","PA","41.141079","-78.962877","-5","1"
+"15741","Gipsy","PA","40.804018","-78.86765","-5","1"
+"15742","Glen Campbell","PA","40.816706","-78.8636","-5","1"
+"15744","Hamilton","PA","40.916407","-79.08397","-5","1"
+"15745","Heilwood","PA","40.621037","-78.91839","-5","1"
+"15746","Hillsdale","PA","40.767854","-78.877331","-5","1"
+"15747","Home","PA","40.763402","-79.14759","-5","1"
+"15748","Homer City","PA","40.529621","-79.14264","-5","1"
+"15750","Josephine","PA","40.482783","-79.185048","-5","1"
+"15751","Juneau","PA","40.640031","-79.129445","-5","1"
+"15752","Kent","PA","40.541589","-79.28315","-5","1"
+"15753","La Jose","PA","40.801942","-78.66543","-5","1"
+"15754","Lucernemines","PA","40.558928","-79.1497","-5","1"
+"15756","McIntyre","PA","40.570149","-79.29689","-5","1"
+"15757","Mahaffey","PA","40.890039","-78.72404","-5","1"
+"15758","Marchand","PA","40.640031","-79.129445","-5","1"
+"15759","Marion Center","PA","40.771687","-79.04221","-5","1"
+"15760","Marsteller","PA","40.652164","-78.79936","-5","1"
+"15761","Mentcle","PA","40.625962","-78.89325","-5","1"
+"15762","Nicktown","PA","40.596681","-78.83252","-5","1"
+"15763","Northpoint","PA","40.906164","-79.13757","-5","1"
+"15764","Oliveburg","PA","40.986389","-79.02664","-5","1"
+"15765","Penn Run","PA","40.592854","-78.98412","-5","1"
+"15767","Punxsutawney","PA","40.954059","-78.97017","-5","1"
+"15770","Ringgold","PA","40.999588","-79.15992","-5","1"
+"15771","Rochester Mills","PA","40.827315","-78.98991","-5","1"
+"15772","Rossiter","PA","40.877189","-78.91752","-5","1"
+"15773","Saint Benedict","PA","40.628368","-78.73335","-5","1"
+"15774","Shelocta","PA","40.657804","-79.3328","-5","1"
+"15775","Spangler","PA","40.642174","-78.77125","-5","1"
+"15776","Sprankle Mills","PA","41.013546","-79.11389","-5","1"
+"15777","Starford","PA","40.700574","-78.95812","-5","1"
+"15778","Timblin","PA","40.965989","-79.20053","-5","1"
+"15779","Torrance","PA","40.416334","-79.23317","-5","1"
+"15780","Valier","PA","40.91719","-79.04992","-5","1"
+"15781","Walston","PA","40.964542","-78.99646","-5","1"
+"15783","West Lebanon","PA","40.601789","-79.35524","-5","1"
+"15784","Worthville","PA","41.027404","-79.13928","-5","1"
+"15801","Du Bois","PA","41.125563","-78.74648","-5","1"
+"15817","South Fayette","PA","40.332173","-80.177979","-5","1"
+"15821","Benezett","PA","41.328011","-78.35854","-5","1"
+"15822","Brandy Camp","PA","41.415878","-78.665057","-5","1"
+"15823","Brockport","PA","41.254038","-78.71987","-5","1"
+"15824","Brockway","PA","41.241861","-78.80577","-5","1"
+"15825","Brookville","PA","41.160579","-79.06479","-5","1"
+"15827","Byrnedale","PA","41.293237","-78.50472","-5","1"
+"15828","Clarington","PA","41.34149","-79.13567","-5","1"
+"15829","Corsica","PA","41.173044","-79.19369","-5","1"
+"15831","Dagus Mines","PA","41.304782","-78.621286","-5","1"
+"15832","Driftwood","PA","41.379949","-78.17987","-5","1"
+"15834","Emporium","PA","41.517738","-78.25309","-5","1"
+"15840","Falls Creek","PA","41.160521","-78.81129","-5","1"
+"15841","Force","PA","41.254727","-78.50411","-5","1"
+"15845","Johnsonburg","PA","41.497219","-78.68278","-5","1"
+"15846","Kersey","PA","41.337926","-78.61075","-5","1"
+"15847","Knox Dale","PA","41.08434","-79.0308","-5","1"
+"15848","Luthersburg","PA","41.031691","-78.72684","-5","1"
+"15849","Penfield","PA","41.201892","-78.56335","-5","1"
+"15851","Reynoldsville","PA","41.095493","-78.88994","-5","1"
+"15853","Ridgway","PA","41.420778","-78.74776","-5","1"
+"15856","Rockton","PA","41.082722","-78.62593","-5","1"
+"15857","Saint Marys","PA","41.4376","-78.54272","-5","1"
+"15860","Sigel","PA","41.345663","-79.04707","-5","1"
+"15861","Sinnamahoning","PA","41.370716","-78.04939","-5","1"
+"15863","Stump Creek","PA","41.012739","-78.83719","-5","1"
+"15864","Summerville","PA","41.108591","-79.19553","-5","1"
+"15865","Sykesville","PA","41.049353","-78.81868","-5","1"
+"15866","Troutville","PA","41.023829","-78.78711","-5","1"
+"15868","Weedville","PA","41.283012","-78.42919","-5","1"
+"15870","Wilcox","PA","41.587333","-78.65347","-5","1"
+"15874","Worthville","PA","41.027511","-79.141174","-5","1"
+"15901","Johnstown","PA","40.325374","-78.91485","-5","1"
+"15902","Johnstown","PA","40.309087","-78.90069","-5","1"
+"15904","Johnstown","PA","40.289442","-78.86612","-5","1"
+"15905","Johnstown","PA","40.302374","-78.93802","-5","1"
+"15906","Johnstown","PA","40.348973","-78.94132","-5","1"
+"15907","Johnstown","PA","40.325374","-78.915147","-5","1"
+"15909","Johnstown","PA","40.36344","-78.87674","-5","1"
+"15915","Johnstown","PA","40.484487","-78.702224","-5","1"
+"15920","Armagh","PA","40.460191","-79.04608","-5","1"
+"15921","Beaverdale","PA","40.319561","-78.694043","-5","1"
+"15922","Belsano","PA","40.484487","-78.702224","-5","1"
+"15923","Bolivar","PA","40.372103","-79.14574","-5","1"
+"15924","Cairnbrook","PA","40.123213","-78.80478","-5","1"
+"15925","Cassandra","PA","40.408989","-78.64104","-5","1"
+"15926","Central City","PA","40.097937","-78.81509","-5","1"
+"15927","Colver","PA","40.543153","-78.79067","-5","1"
+"15928","Davidsville","PA","40.23741","-78.92978","-5","1"
+"15929","Dilltown","PA","40.467684","-79.00063","-5","1"
+"15930","Dunlo","PA","40.294347","-78.71981","-5","1"
+"15931","Ebensburg","PA","40.498793","-78.74591","-5","1"
+"15934","Elton","PA","40.280875","-78.80196","-5","1"
+"15935","Hollsopple","PA","40.212192","-78.95052","-5","1"
+"15936","Hooversville","PA","40.156538","-78.91515","-5","1"
+"15937","Jerome","PA","40.208983","-78.98782","-5","1"
+"15938","Lilly","PA","40.42026","-78.61924","-5","1"
+"15940","Loretto","PA","40.506799","-78.62996","-5","1"
+"15942","Mineral Point","PA","40.402861","-78.83563","-5","1"
+"15943","Nanty Glo","PA","40.474488","-78.84402","-5","1"
+"15944","New Florence","PA","40.371165","-79.0772","-5","1"
+"15945","Parkhill","PA","40.356723","-78.873296","-5","1"
+"15946","Portage","PA","40.384718","-78.6651","-5","1"
+"15948","Revloc","PA","40.491089","-78.76419","-5","1"
+"15949","Robinson","PA","40.401076","-79.13701","-5","1"
+"15951","Saint Michael","PA","40.338615","-78.776137","-5","1"
+"15952","Salix","PA","40.298625","-78.77164","-5","1"
+"15953","Seanor","PA","40.206435","-78.900533","-5","1"
+"15954","Seward","PA","40.414654","-79.01806","-5","1"
+"15955","Sidman","PA","40.324295","-78.7063","-5","1"
+"15956","South Fork","PA","40.358541","-78.78201","-5","1"
+"15957","Strongstown","PA","40.536405","-78.89205","-5","1"
+"15958","Summerhill","PA","40.381332","-78.7433","-5","1"
+"15959","Tire Hill","PA","40.267975","-78.915567","-5","1"
+"15960","Twin Rocks","PA","40.49963","-78.861308","-5","1"
+"15961","Vintondale","PA","40.47535","-78.94295","-5","1"
+"15962","Wilmore","PA","40.380188","-78.719019","-5","1"
+"15963","Windber","PA","40.228222","-78.81978","-5","1"
+"15965","Wilmore","PA","40.388921","-78.720134","-5","1"
+"15973","Perry","PA","40.098721","-79.785885","-5","1"
+"16001","Butler","PA","40.877664","-79.9113","-5","1"
+"16002","Butler","PA","40.818663","-79.86119","-5","1"
+"16003","Butler","PA","40.921145","-79.92758","-5","1"
+"16006","Cranberry","PA","40.726206","-80.10054","-5","1"
+"16016","Boyers","PA","40.921145","-79.92758","-5","1"
+"16017","Boyers","PA","40.921145","-79.92758","-5","1"
+"16018","Boyers","PA","40.921145","-79.92758","-5","1"
+"16020","Boyers","PA","41.10936","-79.90816","-5","1"
+"16021","Branchton","PA","40.921145","-79.92758","-5","1"
+"16022","Bruin","PA","41.057142","-79.73005","-5","1"
+"16023","Cabot","PA","40.796809","-79.75147","-5","1"
+"16024","Callery","PA","40.739587","-80.03721","-5","1"
+"16025","Chicora","PA","40.947245","-79.75428","-5","1"
+"16027","Connoquenessing","PA","40.818096","-80.0137","-5","1"
+"16028","East Brady","PA","40.97717","-79.61922","-5","1"
+"16029","East Butler","PA","40.877703","-79.84392","-5","1"
+"16030","Eau Claire","PA","41.135335","-79.79791","-5","1"
+"16033","Evans City","PA","40.789672","-80.04848","-5","1"
+"16034","Fenelton","PA","40.868261","-79.72506","-5","1"
+"16035","Forestville","PA","41.106327","-80.00429","-5","1"
+"16036","Foxburg","PA","41.141525","-79.67366","-5","1"
+"16037","Harmony","PA","40.821535","-80.13033","-5","1"
+"16038","Harrisville","PA","41.152347","-79.9632","-5","1"
+"16039","Herman","PA","40.921145","-79.92758","-5","1"
+"16040","Hilliards","PA","41.098857","-79.84091","-5","1"
+"16041","Karns City","PA","41.009219","-79.7102","-5","1"
+"16045","Lyndora","PA","40.85062","-79.91314","-5","1"
+"16046","Mars","PA","40.695658","-80.03359","-5","1"
+"16048","North Washington","PA","41.04719","-79.808899","-5","1"
+"16049","Parker","PA","41.097836","-79.66317","-5","1"
+"16050","Petrolia","PA","41.028275","-79.75423","-5","1"
+"16051","Portersville","PA","40.953141","-80.14799","-5","1"
+"16052","Prospect","PA","40.898789","-80.06125","-5","1"
+"16053","Renfrew","PA","40.808934","-79.97811","-5","1"
+"16054","Saint Petersburg","PA","41.160944","-79.65393","-5","1"
+"16055","Sarver","PA","40.713078","-79.73603","-5","1"
+"16056","Saxonburg","PA","40.732393","-79.83422","-5","1"
+"16057","Slippery Rock","PA","41.047157","-80.05506","-5","1"
+"16058","Turkey City","PA","41.202325","-79.453751","-5","1"
+"16059","Valencia","PA","40.702289","-79.93733","-5","1"
+"16061","West Sunbury","PA","41.005075","-79.8851","-5","1"
+"16063","Zelienople","PA","40.783001","-80.13343","-5","1"
+"16066","Cranberry Twp","PA","40.700423","-80.11374","-5","1"
+"16101","New Castle","PA","40.992023","-80.32747","-5","1"
+"16102","New Castle","PA","40.970991","-80.38291","-5","1"
+"16103","New Castle","PA","40.989662","-80.308376","-5","1"
+"16105","New Castle","PA","41.038205","-80.34539","-5","1"
+"16107","New Castle","PA","40.989662","-80.308376","-5","1"
+"16108","New Castle","PA","40.989662","-80.308376","-5","1"
+"16110","Adamsville","PA","41.508647","-80.37501","-5","1"
+"16111","Atlantic","PA","41.518256","-80.2834","-5","1"
+"16112","Bessemer","PA","40.976839","-80.49346","-5","1"
+"16113","Clark","PA","41.280779","-80.4241","-5","1"
+"16114","Clarks Mills","PA","41.402438","-80.18346","-5","1"
+"16115","Darlington","PA","40.802863","-80.44364","-5","1"
+"16116","Edinburg","PA","41.025132","-80.45756","-5","1"
+"16117","Ellwood City","PA","40.857663","-80.27534","-5","1"
+"16120","Enon Valley","PA","40.875943","-80.46851","-5","1"
+"16121","Farrell","PA","41.211606","-80.49404","-5","1"
+"16123","Fombell","PA","40.821528","-80.19444","-5","1"
+"16124","Fredonia","PA","41.329301","-80.26042","-5","1"
+"16125","Greenville","PA","41.403462","-80.37424","-5","1"
+"16127","Grove City","PA","41.169987","-80.08174","-5","1"
+"16130","Hadley","PA","41.443741","-80.22367","-5","1"
+"16131","Hartstown","PA","41.549671","-80.37143","-5","1"
+"16132","Hillsville","PA","41.00745","-80.49576","-5","1"
+"16133","Jackson Center","PA","41.274408","-80.12409","-5","1"
+"16134","Jamestown","PA","41.506801","-80.46177","-5","1"
+"16136","Koppel","PA","40.834903","-80.32428","-5","1"
+"16137","Mercer","PA","41.234591","-80.2364","-5","1"
+"16140","New Bedford","PA","41.098098","-80.50393","-5","1"
+"16141","New Galilee","PA","40.853014","-80.40181","-5","1"
+"16142","New Wilmington","PA","41.135063","-80.33492","-5","1"
+"16143","Pulaski","PA","41.096535","-80.46266","-5","1"
+"16145","Sandy Lake","PA","41.385019","-80.07987","-5","1"
+"16146","Sharon","PA","41.230106","-80.49896","-5","1"
+"16148","Hermitage","PA","41.232543","-80.45797","-5","1"
+"16150","Sharpsville","PA","41.266185","-80.46312","-5","1"
+"16151","Sheakleyville","PA","41.443244","-80.2073","-5","1"
+"16153","Stoneboro","PA","41.335391","-80.08895","-5","1"
+"16154","Transfer","PA","41.330028","-80.42771","-5","1"
+"16155","Villa Maria","PA","41.074943","-80.50611","-5","1"
+"16156","Volant","PA","41.097672","-80.23","-5","1"
+"16157","Wampum","PA","40.889241","-80.34189","-5","1"
+"16159","West Middlesex","PA","41.174066","-80.45319","-5","1"
+"16160","West Pittsburg","PA","40.93156","-80.36453","-5","1"
+"16161","Wheatland","PA","41.200389","-80.4957","-5","1"
+"16172","New Wilmington","PA","41.119992","-80.333192","-5","1"
+"16201","Kittanning","PA","40.809467","-79.49922","-5","1"
+"16210","Adrian","PA","40.885328","-79.52058","-5","1"
+"16211","Beyer","PA","40.640031","-79.129445","-5","1"
+"16212","Cadogan","PA","40.7532","-79.58296","-5","1"
+"16213","Callensburg","PA","41.125693","-79.557","-5","1"
+"16214","Clarion","PA","41.199396","-79.37196","-5","1"
+"16215","Kittanning","PA","40.847829","-79.451575","-5","1"
+"16216","Climax","PA","40.847829","-79.451575","-5","1"
+"16217","Cooksburg","PA","41.344067","-79.20159","-5","1"
+"16218","Cowansville","PA","40.923894","-79.59137","-5","1"
+"16220","Crown","PA","41.202325","-79.453751","-5","1"
+"16221","Curllsville","PA","41.202325","-79.453751","-5","1"
+"16222","Dayton","PA","40.8739","-79.24188","-5","1"
+"16223","Distant","PA","40.954782","-79.37922","-5","1"
+"16224","Fairmount City","PA","41.045243","-79.29524","-5","1"
+"16225","Fisher","PA","41.202325","-79.453751","-5","1"
+"16226","Ford City","PA","40.747985","-79.51228","-5","1"
+"16228","Ford Cliff","PA","40.76172","-79.53488","-5","1"
+"16229","Freeport","PA","40.711528","-79.65608","-5","1"
+"16230","Hawthorn","PA","41.020621","-79.27416","-5","1"
+"16232","Knox","PA","41.230562","-79.55397","-5","1"
+"16233","Leeper","PA","41.361473","-79.27869","-5","1"
+"16234","Limestone","PA","41.127485","-79.32695","-5","1"
+"16235","Lucinda","PA","41.323424","-79.35134","-5","1"
+"16236","McGrann","PA","40.780619","-79.52342","-5","1"
+"16238","Manorville","PA","40.786362","-79.52164","-5","1"
+"16239","Marienville","PA","41.496544","-79.13944","-5","1"
+"16240","Mayport","PA","41.035602","-79.2235","-5","1"
+"16242","New Bethlehem","PA","41.007757","-79.3461","-5","1"
+"16244","Nu Mine","PA","40.796406","-79.2727","-5","1"
+"16245","Oak Ridge","PA","41.007679","-79.29719","-5","1"
+"16246","Plumville","PA","40.793823","-79.18023","-5","1"
+"16248","Rimersburg","PA","41.039668","-79.50254","-5","1"
+"16249","Rural Valley","PA","40.779271","-79.31915","-5","1"
+"16250","Sagamore","PA","40.776212","-79.23196","-5","1"
+"16253","Seminole","PA","40.95557","-79.34352","-5","1"
+"16254","Shippenville","PA","41.255691","-79.45122","-5","1"
+"16255","Sligo","PA","41.115411","-79.46865","-5","1"
+"16256","Smicksburg","PA","40.854736","-79.13528","-5","1"
+"16257","Snydersburg","PA","41.202325","-79.453751","-5","1"
+"16258","Strattanville","PA","41.221629","-79.28293","-5","1"
+"16259","Templeton","PA","40.90764","-79.45161","-5","1"
+"16260","Vowinckel","PA","41.41229","-79.22805","-5","1"
+"16261","Widnoon","PA","40.847829","-79.451575","-5","1"
+"16262","Worthington","PA","40.839519","-79.65268","-5","1"
+"16263","Yatesboro","PA","40.801244","-79.33317","-5","1"
+"16299","South Buffalo","PA","40.755638","-79.651602","-5","1"
+"16301","Oil City","PA","41.439658","-79.69044","-5","1"
+"16302","Oil City","PA","41.407066","-79.730975","-5","1"
+"16311","Carlton","PA","41.452879","-80.0222","-5","1"
+"16312","Chandlers Valley","PA","41.935848","-79.309668","-5","1"
+"16313","Clarendon","PA","41.773848","-79.11801","-5","1"
+"16314","Cochranton","PA","41.517339","-80.05761","-5","1"
+"16316","Conneaut Lake","PA","41.607955","-80.29601","-5","1"
+"16317","Cooperstown","PA","41.526679","-79.86027","-5","1"
+"16319","Cranberry","PA","41.321298","-79.6478","-5","1"
+"16321","East Hickory","PA","41.581586","-79.40272","-5","1"
+"16322","Endeavor","PA","41.626321","-79.3633","-5","1"
+"16323","Franklin","PA","41.407366","-79.83921","-5","1"
+"16326","Fryburg","PA","41.362104","-79.43125","-5","1"
+"16327","Guys Mills","PA","41.61792","-79.94934","-5","1"
+"16328","Hydetown","PA","41.666057","-80.065793","-5","1"
+"16329","Irvine","PA","41.821327","-79.27004","-5","1"
+"16331","Kossuth","PA","41.306317","-79.57486","-5","1"
+"16332","Lickingville","PA","41.378962","-79.37128","-5","1"
+"16333","Ludlow","PA","41.732284","-78.9393","-5","1"
+"16334","Marble","PA","41.316316","-79.44164","-5","1"
+"16335","Meadville","PA","41.637502","-80.15214","-5","1"
+"16340","Pittsfield","PA","41.826878","-79.42231","-5","1"
+"16341","Pleasantville","PA","41.560056","-79.53852","-5","1"
+"16342","Polk","PA","41.335938","-79.93647","-5","1"
+"16343","Reno","PA","41.410693","-79.75012","-5","1"
+"16344","Rouseville","PA","41.471398","-79.68946","-5","1"
+"16345","Russell","PA","41.954896","-79.09583","-5","1"
+"16346","Seneca","PA","41.378236","-79.6864","-5","1"
+"16347","Sheffield","PA","41.676904","-79.03116","-5","1"
+"16350","Sugar Grove","PA","41.977253","-79.33007","-5","1"
+"16351","Tidioute","PA","41.680467","-79.39428","-5","1"
+"16352","Tiona","PA","41.764498","-79.04693","-5","1"
+"16353","Tionesta","PA","41.493473","-79.3902","-5","1"
+"16354","Titusville","PA","41.622203","-79.69298","-5","1"
+"16355","East Fairfield","PA","41.562679","-80.062136","-5","1"
+"16360","Townville","PA","41.684627","-79.88684","-5","1"
+"16361","Tylersburg","PA","41.391383","-79.34078","-5","1"
+"16362","Utica","PA","41.445871","-79.96704","-5","1"
+"16364","Venus","PA","41.369406","-79.51724","-5","1"
+"16365","Warren","PA","41.853225","-79.15521","-5","1"
+"16366","Warren","PA","41.811682","-79.264322","-5","1"
+"16367","Warren","PA","41.811682","-79.264322","-5","1"
+"16368","Irvine","PA","41.811682","-79.264322","-5","1"
+"16369","Irvine","PA","41.811682","-79.264322","-5","1"
+"16370","West Hickory","PA","41.569732","-79.40911","-5","1"
+"16371","Youngsville","PA","41.860809","-79.31703","-5","1"
+"16372","Clintonville","PA","41.199578","-79.87436","-5","1"
+"16373","Emlenton","PA","41.195768","-79.70044","-5","1"
+"16374","Kennerdell","PA","41.252823","-79.82675","-5","1"
+"16375","Lamartine","PA","41.202325","-79.453751","-5","1"
+"16388","Meadville","PA","41.659552","-80.157553","-5","1"
+"16401","Albion","PA","41.883648","-80.37687","-5","1"
+"16402","Bear Lake","PA","41.972884","-79.478","-5","1"
+"16403","Cambridge Springs","PA","41.79637","-80.02524","-5","1"
+"16404","Centerville","PA","41.727069","-79.78908","-5","1"
+"16405","Columbus","PA","41.94208","-79.54534","-5","1"
+"16406","Conneautville","PA","41.746056","-80.35888","-5","1"
+"16407","Corry","PA","41.919028","-79.65224","-5","1"
+"16410","Cranesville","PA","41.922138","-80.32884","-5","1"
+"16411","East Springfield","PA","41.981289","-80.44277","-5","1"
+"16412","Edinboro","PA","41.875896","-80.15129","-5","1"
+"16413","Elgin","PA","42.182748","-80.064915","-5","1"
+"16414","Bloomfield","PA","41.785249","-79.787096","-5","1"
+"16415","Fairview","PA","42.035523","-80.23526","-5","1"
+"16416","Garland","PA","41.81426","-79.44777","-5","1"
+"16417","Girard","PA","41.979","-80.3098","-5","1"
+"16420","Grand Valley","PA","41.700333","-79.54788","-5","1"
+"16421","Harborcreek","PA","42.169106","-79.9409","-5","1"
+"16422","Harmonsburg","PA","41.661068","-80.31618","-5","1"
+"16423","Lake City","PA","42.019394","-80.34064","-5","1"
+"16424","Linesville","PA","41.63471","-80.43671","-5","1"
+"16426","McKean","PA","41.992528","-80.14448","-5","1"
+"16427","Mill Village","PA","41.87504","-79.96986","-5","1"
+"16428","North East","PA","42.195488","-79.83296","-5","1"
+"16430","North Springfield","PA","41.999881","-80.42585","-5","1"
+"16432","Riceville","PA","41.666057","-80.065793","-5","1"
+"16433","Saegertown","PA","41.732434","-80.14613","-5","1"
+"16434","Spartansburg","PA","41.803172","-79.68296","-5","1"
+"16435","Springboro","PA","41.817144","-80.38568","-5","1"
+"16436","Spring Creek","PA","41.860822","-79.51047","-5","1"
+"16438","Union City","PA","41.87487","-79.843","-5","1"
+"16440","Venango","PA","41.774575","-80.1145","-5","1"
+"16441","Waterford","PA","41.93958","-79.98542","-5","1"
+"16442","Wattsburg","PA","42.029506","-79.82547","-5","1"
+"16443","West Springfield","PA","41.942171","-80.48002","-5","1"
+"16444","Edinboro","PA","42.182748","-80.064915","-5","1"
+"16475","Albion","PA","42.182748","-80.064915","-5","1"
+"16501","Erie","PA","42.122957","-80.08437","-5","1"
+"16502","Erie","PA","42.110757","-80.10024","-5","1"
+"16503","Erie","PA","42.127807","-80.06351","-5","1"
+"16504","Erie","PA","42.110156","-80.05187","-5","1"
+"16505","Erie","PA","42.100307","-80.15552","-5","1"
+"16506","Erie","PA","42.072606","-80.14541","-5","1"
+"16507","Erie","PA","42.132707","-80.08452","-5","1"
+"16508","Erie","PA","42.097856","-80.09147","-5","1"
+"16509","Erie","PA","42.074056","-80.06927","-5","1"
+"16510","Erie","PA","42.126956","-80.0004","-5","1"
+"16511","Erie","PA","42.156157","-80.01686","-5","1"
+"16512","Erie","PA","42.030201","-80.257855","-5","1"
+"16514","Erie","PA","42.182748","-80.064915","-5","1"
+"16515","Erie","PA","42.182748","-80.064915","-5","1"
+"16522","Erie","PA","42.182748","-80.064915","-5","1"
+"16530","Erie","PA","42.182748","-80.064915","-5","1"
+"16531","Erie","PA","42.182748","-80.064915","-5","1"
+"16532","Erie","PA","42.182748","-80.064915","-5","1"
+"16533","Erie","PA","42.182748","-80.064915","-5","1"
+"16534","Erie","PA","42.182748","-80.064915","-5","1"
+"16538","Erie","PA","42.182748","-80.064915","-5","1"
+"16541","Erie","PA","42.182748","-80.064915","-5","1"
+"16544","Erie","PA","42.182748","-80.064915","-5","1"
+"16546","Erie","PA","42.182748","-80.064915","-5","1"
+"16550","Erie","PA","42.182748","-80.064915","-5","1"
+"16553","Erie","PA","42.182748","-80.064915","-5","1"
+"16554","Erie","PA","42.182748","-80.064915","-5","1"
+"16558","Erie","PA","42.182748","-80.064915","-5","1"
+"16563","Erie","PA","42.182748","-80.064915","-5","1"
+"16565","Erie","PA","42.182748","-80.064915","-5","1"
+"16601","Altoona","PA","40.526319","-78.40082","-5","1"
+"16602","Altoona","PA","40.50217","-78.39121","-5","1"
+"16603","Altoona","PA","40.50177","-78.410035","-5","1"
+"16611","Alexandria","PA","40.561651","-78.10583","-5","1"
+"16613","Ashville","PA","40.554187","-78.5406","-5","1"
+"16614","Bakers Summit","PA","40.262311","-78.421434","-5","1"
+"16616","Beccaria","PA","40.770522","-78.44099","-5","1"
+"16617","Bellwood","PA","40.601566","-78.33361","-5","1"
+"16619","Blandburg","PA","40.684811","-78.41481","-5","1"
+"16620","Brisbin","PA","40.8376","-78.3527","-5","1"
+"16621","Broad Top","PA","40.211299","-78.13","-5","1"
+"16622","Calvin","PA","40.336064","-78.06665","-5","1"
+"16623","Cassville","PA","40.274021","-78.04002","-5","1"
+"16624","Chest Springs","PA","40.578804","-78.6098","-5","1"
+"16625","Claysburg","PA","40.290914","-78.48646","-5","1"
+"16627","Coalport","PA","40.753504","-78.52097","-5","1"
+"16629","Coupon","PA","40.521778","-78.526274","-5","1"
+"16630","Cresson","PA","40.464754","-78.5885","-5","1"
+"16631","Curryville","PA","40.282346","-78.34748","-5","1"
+"16633","Defiance","PA","40.160858","-78.23205","-5","1"
+"16634","Dudley","PA","40.205819","-78.17565","-5","1"
+"16635","Duncansville","PA","40.419572","-78.44934","-5","1"
+"16636","Dysart","PA","40.612642","-78.51947","-5","1"
+"16637","East Freedom","PA","40.34068","-78.43301","-5","1"
+"16638","Entriken","PA","40.335188","-78.20534","-5","1"
+"16639","Fallentimber","PA","40.687083","-78.47615","-5","1"
+"16640","Flinton","PA","40.711195","-78.56081","-5","1"
+"16641","Gallitzin","PA","40.487413","-78.55617","-5","1"
+"16644","Glasgow","PA","40.717845","-78.463679","-5","1"
+"16645","Glen Hope","PA","40.798959","-78.50032","-5","1"
+"16646","Hastings","PA","40.670162","-78.70932","-5","1"
+"16647","Hesston","PA","40.40537","-78.10103","-5","1"
+"16648","Hollidaysburg","PA","40.439272","-78.37421","-5","1"
+"16650","Hopewell","PA","40.132345","-78.26845","-5","1"
+"16651","Houtzdale","PA","40.827635","-78.36046","-5","1"
+"16652","Huntingdon","PA","40.498403","-77.99417","-5","1"
+"16654","Huntingdon","PA","40.402523","-77.966977","-5","1"
+"16655","Imler","PA","40.235","-78.53545","-5","1"
+"16656","Irvona","PA","40.792727","-78.5578","-5","1"
+"16657","James Creek","PA","40.341859","-78.1723","-5","1"
+"16659","Loysburg","PA","40.16478","-78.37709","-5","1"
+"16660","McConnellstown","PA","40.402523","-77.966977","-5","1"
+"16661","Madera","PA","40.841761","-78.46167","-5","1"
+"16662","Martinsburg","PA","40.306709","-78.31987","-5","1"
+"16663","Morann","PA","40.789079","-78.375","-5","1"
+"16664","New Enterprise","PA","40.174807","-78.41772","-5","1"
+"16665","Newry","PA","40.393223","-78.43508","-5","1"
+"16666","Osceola Mills","PA","40.85258","-78.28335","-5","1"
+"16667","Osterburg","PA","40.173012","-78.52762","-5","1"
+"16668","Patton","PA","40.63949","-78.63816","-5","1"
+"16669","Petersburg","PA","40.627047","-77.96449","-5","1"
+"16670","Queen","PA","40.25915","-78.50652","-5","1"
+"16671","Ramey","PA","40.800186","-78.4013","-5","1"
+"16672","Riddlesburg","PA","40.160825","-78.25489","-5","1"
+"16673","Roaring Spring","PA","40.328843","-78.39897","-5","1"
+"16674","Robertsdale","PA","40.196898","-78.10266","-5","1"
+"16675","Saint Boniface","PA","40.671181","-78.675548","-5","1"
+"16677","Sandy Ridge","PA","40.807219","-78.26071","-5","1"
+"16678","Saxton","PA","40.221352","-78.22785","-5","1"
+"16679","Six Mile Run","PA","40.163172","-78.20555","-5","1"
+"16680","Smithmill","PA","40.75212","-78.41085","-5","1"
+"16681","Smokerun","PA","40.792825","-78.43559","-5","1"
+"16682","Sproul","PA","40.271645","-78.45919","-5","1"
+"16683","Spruce Creek","PA","40.662087","-78.07012","-5","1"
+"16684","Tipton","PA","40.636691","-78.303614","-5","1"
+"16685","Todd","PA","40.273559","-78.07926","-5","1"
+"16686","Tyrone","PA","40.666444","-78.24353","-5","1"
+"16689","Waterfall","PA","40.092488","-78.08406","-5","1"
+"16691","Wells Tannery","PA","40.080393","-78.15342","-5","1"
+"16692","Westover","PA","40.757085","-78.69622","-5","1"
+"16693","Williamsburg","PA","40.456531","-78.2221","-5","1"
+"16694","Wood","PA","40.167018","-78.13583","-5","1"
+"16695","Woodbury","PA","40.217753","-78.37197","-5","1"
+"16698","Houtzdale","PA","40.989115","-78.422403","-5","1"
+"16699","Cresson","PA","40.484487","-78.702224","-5","1"
+"16701","Bradford","PA","41.943791","-78.65448","-5","1"
+"16720","Austin","PA","41.613244","-78.07011","-5","1"
+"16724","Crosby","PA","41.747898","-78.37938","-5","1"
+"16725","Custer City","PA","41.902256","-78.659","-5","1"
+"16726","Cyclone","PA","41.816833","-78.58059","-5","1"
+"16727","Derrick City","PA","41.976763","-78.53541","-5","1"
+"16728","De Young","PA","41.415878","-78.665057","-5","1"
+"16729","Duke Center","PA","41.96192","-78.4841","-5","1"
+"16730","East Smethport","PA","41.811926","-78.42256","-5","1"
+"16731","Eldred","PA","41.957479","-78.39317","-5","1"
+"16732","Gifford","PA","41.850657","-78.60663","-5","1"
+"16733","Hazel Hurst","PA","41.713565","-78.56703","-5","1"
+"16734","James City","PA","41.619029","-78.84","-5","1"
+"16735","Kane","PA","41.628726","-78.80734","-5","1"
+"16738","Lewis Run","PA","41.833762","-78.68839","-5","1"
+"16740","Mount Jewett","PA","41.734498","-78.61379","-5","1"
+"16743","Port Allegany","PA","41.809546","-78.27125","-5","1"
+"16744","Rew","PA","41.883626","-78.5454","-5","1"
+"16745","Rixford","PA","41.925564","-78.50206","-5","1"
+"16746","Roulette","PA","41.800699","-78.14362","-5","1"
+"16748","Shinglehouse","PA","41.940288","-78.16186","-5","1"
+"16749","Smethport","PA","41.801302","-78.44419","-5","1"
+"16750","Turtlepoint","PA","41.876559","-78.32445","-5","1"
+"16751","Westline","PA","41.791063","-78.76347","-5","1"
+"16801","State College","PA","40.792011","-77.84993","-5","1"
+"16802","University Park","PA","40.806956","-77.86281","-5","1"
+"16803","State College","PA","40.802661","-77.89936","-5","1"
+"16804","State College","PA","40.972229","-77.760172","-5","1"
+"16805","State College","PA","40.972229","-77.760172","-5","1"
+"16815","Potter","PA","40.771122","-77.658267","-5","1"
+"16820","Aaronsburg","PA","40.908997","-77.42424","-5","1"
+"16821","Allport","PA","40.989115","-78.422403","-5","1"
+"16822","Beech Creek","PA","41.092339","-77.60545","-5","1"
+"16823","Bellefonte","PA","40.91255","-77.77387","-5","1"
+"16825","Bigler","PA","40.98169","-78.30514","-5","1"
+"16826","Blanchard","PA","41.059172","-77.60029","-5","1"
+"16827","Boalsburg","PA","40.78267","-77.78689","-5","1"
+"16828","Centre Hall","PA","40.828679","-77.6849","-5","1"
+"16829","Clarence","PA","41.053528","-77.96226","-5","1"
+"16830","Clearfield","PA","41.026239","-78.43838","-5","1"
+"16832","Coburn","PA","40.847255","-77.47633","-5","1"
+"16833","Curwensville","PA","40.948433","-78.55176","-5","1"
+"16834","Drifting","PA","41.033239","-78.1104","-5","1"
+"16835","Fleming","PA","40.904645","-77.875191","-5","1"
+"16836","Frenchville","PA","41.104737","-78.2344","-5","1"
+"16837","Glen Richey","PA","40.945702","-78.4745","-5","1"
+"16838","Grampian","PA","40.977104","-78.62296","-5","1"
+"16839","Grassflat","PA","41.004152","-78.11298","-5","1"
+"16840","Hawk Run","PA","40.924438","-78.20652","-5","1"
+"16841","Howard","PA","41.021843","-77.66909","-5","1"
+"16843","Hyde","PA","41.001993","-78.46381","-5","1"
+"16844","Julian","PA","40.896662","-77.91555","-5","1"
+"16845","Karthaus","PA","41.131415","-78.10643","-5","1"
+"16847","Kylertown","PA","40.994188","-78.16804","-5","1"
+"16848","Lamar","PA","41.010409","-77.53613","-5","1"
+"16849","Lanse","PA","40.972358","-78.12121","-5","1"
+"16850","Lecontes Mills","PA","40.989115","-78.422403","-5","1"
+"16851","Lemont","PA","40.809461","-77.81584","-5","1"
+"16852","Madisonburg","PA","40.92744","-77.52998","-5","1"
+"16853","Milesburg","PA","40.942533","-77.7892","-5","1"
+"16854","Millheim","PA","40.891594","-77.47605","-5","1"
+"16855","Mineral Springs","PA","40.998733","-78.37324","-5","1"
+"16856","Mingoville","PA","40.929263","-77.64581","-5","1"
+"16858","Morrisdale","PA","41.004198","-78.19085","-5","1"
+"16859","Moshannon","PA","41.0448","-78.024","-5","1"
+"16860","Munson","PA","40.954583","-78.1668","-5","1"
+"16861","New Millport","PA","40.87713","-78.53394","-5","1"
+"16863","Olanta","PA","40.914286","-78.48998","-5","1"
+"16864","Orviston","PA","41.105537","-77.75273","-5","1"
+"16865","Pennsylvania Furnace","PA","40.722897","-77.96941","-5","1"
+"16866","Philipsburg","PA","40.893028","-78.21678","-5","1"
+"16868","Pine Grove Mills","PA","40.726405","-77.911776","-5","1"
+"16870","Port Matilda","PA","40.801396","-78.045","-5","1"
+"16871","Pottersdale","PA","41.177156","-78.04399","-5","1"
+"16872","Rebersburg","PA","40.966199","-77.35299","-5","1"
+"16873","Shawville","PA","40.989115","-78.422403","-5","1"
+"16874","Snow Shoe","PA","41.034029","-77.93356","-5","1"
+"16875","Spring Mills","PA","40.833229","-77.57458","-5","1"
+"16876","Wallaceton","PA","40.960106","-78.28886","-5","1"
+"16877","Warriors Mark","PA","40.721787","-78.08561","-5","1"
+"16878","West Decatur","PA","40.943755","-78.30853","-5","1"
+"16879","Winburne","PA","40.962566","-78.15005","-5","1"
+"16881","Woodland","PA","41.018168","-78.32112","-5","1"
+"16882","Woodward","PA","40.918517","-77.32269","-5","1"
+"16901","Wellsboro","PA","41.736343","-77.31915","-5","1"
+"16910","Alba","PA","41.77197","-76.521266","-5","1"
+"16911","Arnot","PA","41.664117","-77.14153","-5","1"
+"16912","Blossburg","PA","41.676922","-77.0616","-5","1"
+"16914","Columbia Cross Roads","PA","41.86401","-76.76982","-5","1"
+"16915","Coudersport","PA","41.800278","-77.98905","-5","1"
+"16917","Covington","PA","41.739613","-77.07521","-5","1"
+"16918","Cowanesque","PA","41.936663","-77.49843","-5","1"
+"16920","Elkland","PA","41.989863","-77.31123","-5","1"
+"16921","Gaines","PA","41.74103","-77.53768","-5","1"
+"16922","Galeton","PA","41.678935","-77.68562","-5","1"
+"16923","Genesee","PA","41.93668","-77.87089","-5","1"
+"16925","Gillett","PA","41.950785","-76.78511","-5","1"
+"16926","Granville Summit","PA","41.702935","-76.71175","-5","1"
+"16927","Harrison Valley","PA","41.958059","-77.67187","-5","1"
+"16928","Knoxville","PA","41.954314","-77.42457","-5","1"
+"16929","Lawrenceville","PA","41.973095","-77.13731","-5","1"
+"16930","Liberty","PA","41.557848","-77.13755","-5","1"
+"16932","Mainesburg","PA","41.796032","-76.94145","-5","1"
+"16933","Mansfield","PA","41.811139","-77.06939","-5","1"
+"16935","Middlebury Center","PA","41.86292","-77.31285","-5","1"
+"16936","Millerton","PA","41.951518","-76.94413","-5","1"
+"16937","Mills","PA","41.969218","-77.71978","-5","1"
+"16938","Morris","PA","41.564177","-77.31191","-5","1"
+"16939","Morris Run","PA","41.677577","-77.01677","-5","1"
+"16940","Nelson","PA","41.978436","-77.24667","-5","1"
+"16941","Genesee","PA","41.993777","-77.75122","-5","1"
+"16942","Osceola","PA","41.961001","-77.35306","-5","1"
+"16943","Sabinsville","PA","41.84992","-77.59404","-5","1"
+"16945","Sylvania","PA","41.77197","-76.521266","-5","1"
+"16946","Tioga","PA","41.924013","-77.14224","-5","1"
+"16947","Troy","PA","41.759353","-76.80388","-5","1"
+"16948","Ulysses","PA","41.869812","-77.75115","-5","1"
+"16950","Westfield","PA","41.895838","-77.52164","-5","1"
+"17001","Camp Hill","PA","40.21604","-76.924996","-5","1"
+"17002","Allensville","PA","40.510176","-77.83124","-5","1"
+"17003","Annville","PA","40.347757","-76.53498","-5","1"
+"17004","Belleville","PA","40.597698","-77.73883","-5","1"
+"17005","Berrysburg","PA","40.602475","-76.8113","-5","1"
+"17006","Blain","PA","40.325136","-77.52681","-5","1"
+"17007","Boiling Springs","PA","40.14789","-77.12245","-5","1"
+"17008","Bowmansdale","PA","40.167091","-76.978448","-5","1"
+"17009","Burnham","PA","40.637663","-77.56552","-5","1"
+"17010","Campbelltown","PA","40.280149","-76.5806","-5","1"
+"17011","Camp Hill","PA","40.236139","-76.93084","-5","1"
+"17012","Camp Hill","PA","40.136687","-77.242805","-5","1"
+"17013","Carlisle","PA","40.203458","-77.19987","-5","1"
+"17014","Cocolamus","PA","40.478716","-77.345514","-5","1"
+"17015","South Londonderry","PA","40.238207","-76.511942","-5","1"
+"17016","Cornwall","PA","40.273968","-76.40602","-5","1"
+"17017","Dalmatia","PA","40.644085","-76.87648","-5","1"
+"17018","Dauphin","PA","40.385623","-76.92332","-5","1"
+"17019","Dillsburg","PA","40.093968","-77.02628","-5","1"
+"17020","Duncannon","PA","40.401114","-77.03405","-5","1"
+"17021","East Waterford","PA","40.354433","-77.65046","-5","1"
+"17022","Elizabethtown","PA","40.160793","-76.60763","-5","1"
+"17023","Elizabethville","PA","40.560414","-76.81316","-5","1"
+"17024","Elliottsburg","PA","40.413024","-77.30162","-5","1"
+"17025","Enola","PA","40.28807","-76.94251","-5","1"
+"17026","Fredericksburg","PA","40.45253","-76.42443","-5","1"
+"17027","Grantham","PA","40.153656","-76.9963","-5","1"
+"17028","Grantville","PA","40.402578","-76.6434","-5","1"
+"17029","Granville","PA","40.551431","-77.62577","-5","1"
+"17030","Gratz","PA","40.608245","-76.737545","-5","1"
+"17031","Green Park","PA","40.406766","-77.292578","-5","1"
+"17032","Halifax","PA","40.48358","-76.8727","-5","1"
+"17033","Hershey","PA","40.277923","-76.6434","-5","1"
+"17034","Highspire","PA","40.208591","-76.78563","-5","1"
+"17035","Honey Grove","PA","40.4305","-77.5843","-5","1"
+"17036","Hummelstown","PA","40.270367","-76.7048","-5","1"
+"17037","Ickesburg","PA","40.436607","-77.39337","-5","1"
+"17038","Jonestown","PA","40.434998","-76.51296","-5","1"
+"17039","Kleinfeltersville","PA","40.300505","-76.258399","-5","1"
+"17040","Landisburg","PA","40.333508","-77.29933","-5","1"
+"17041","Lawn","PA","40.220907","-76.53769","-5","1"
+"17042","Lebanon","PA","40.31977","-76.42344","-5","1"
+"17043","Lemoyne","PA","40.247189","-76.89807","-5","1"
+"17044","Lewistown","PA","40.595359","-77.5774","-5","1"
+"17045","Liverpool","PA","40.586914","-76.99402","-5","1"
+"17046","Lebanon","PA","40.358015","-76.42501","-5","1"
+"17047","Loysville","PA","40.365242","-77.40369","-5","1"
+"17048","Lykens","PA","40.592398","-76.72086","-5","1"
+"17049","McAlisterville","PA","40.64686","-77.24149","-5","1"
+"17050","Mechanicsburg","PA","40.249543","-77.002296","-5","1"
+"17051","McVeytown","PA","40.458618","-77.77254","-5","1"
+"17052","Mapleton Depot","PA","40.338058","-77.9779","-5","1"
+"17053","Marysville","PA","40.333185","-76.96659","-5","1"
+"17054","Mattawana","PA","40.495979","-77.723716","-5","1"
+"17055","Mechanicsburg","PA","40.215939","-76.99827","-5","1"
+"17056","Mexico","PA","40.478716","-77.345514","-5","1"
+"17057","Middletown","PA","40.201341","-76.73557","-5","1"
+"17058","Mifflin","PA","40.53526","-77.46457","-5","1"
+"17059","Mifflintown","PA","40.582815","-77.36866","-5","1"
+"17060","Mill Creek","PA","40.453498","-77.91154","-5","1"
+"17061","Millersburg","PA","40.550027","-76.93743","-5","1"
+"17062","Millerstown","PA","40.5565","-77.14962","-5","1"
+"17063","Milroy","PA","40.735551","-77.54813","-5","1"
+"17064","Mount Gretna","PA","40.24793","-76.46847","-5","1"
+"17065","Mount Holly Springs","PA","40.114682","-77.19201","-5","1"
+"17066","Mount Union","PA","40.373421","-77.8739","-5","1"
+"17067","Myerstown","PA","40.389502","-76.3147","-5","1"
+"17068","New Bloomfield","PA","40.409544","-77.17959","-5","1"
+"17069","New Buffalo","PA","40.454175","-76.96991","-5","1"
+"17070","New Cumberland","PA","40.22004","-76.86849","-5","1"
+"17071","New Germantown","PA","40.406766","-77.292578","-5","1"
+"17072","New Kingstown","PA","40.233164","-77.08212","-5","1"
+"17073","Newmanstown","PA","40.308675","-76.24974","-5","1"
+"17074","Newport","PA","40.482257","-77.13907","-5","1"
+"17075","Newton Hamilton","PA","40.39213","-77.83649","-5","1"
+"17076","Oakland Mills","PA","40.616926","-77.31228","-5","1"
+"17077","Ono","PA","40.406144","-76.52753","-5","1"
+"17078","Palmyra","PA","40.304156","-76.5912","-5","1"
+"17080","Pillow","PA","40.64043","-76.80346","-5","1"
+"17081","Plainfield","PA","40.202404","-77.28825","-5","1"
+"17082","Port Royal","PA","40.508563","-77.42137","-5","1"
+"17083","Quentin","PA","40.277603","-76.43823","-5","1"
+"17084","Reedsville","PA","40.67845","-77.60264","-5","1"
+"17085","Rexmont","PA","40.277076","-76.385727","-5","1"
+"17086","Richfield","PA","40.675983","-77.11862","-5","1"
+"17087","Richland","PA","40.375621","-76.26401","-5","1"
+"17088","Schaefferstown","PA","40.299051","-76.29673","-5","1"
+"17089","Camp Hill","PA","40.269738","-76.936046","-5","1"
+"17090","Shermans Dale","PA","40.332785","-77.18464","-5","1"
+"17091","Camp Hill","PA","40.136687","-77.242805","-5","1"
+"17093","Summerdale","PA","40.310088","-76.9287","-5","1"
+"17094","Thompsontown","PA","40.574018","-77.23385","-5","1"
+"17097","Wiconisco","PA","40.573636","-76.68525","-5","1"
+"17098","Williamstown","PA","40.581422","-76.62209","-5","1"
+"17099","Yeagertown","PA","40.641204","-77.57953","-5","1"
+"17101","Harrisburg","PA","40.261839","-76.88279","-5","1"
+"17102","Harrisburg","PA","40.272839","-76.89053","-5","1"
+"17103","Harrisburg","PA","40.274389","-76.86217","-5","1"
+"17104","Harrisburg","PA","40.258972","-76.85922","-5","1"
+"17105","Harrisburg","PA","40.278498","-76.875207","-5","1"
+"17106","Harrisburg","PA","40.292664","-76.850061","-5","1"
+"17107","Harrisburg","PA","40.297031","-76.876437","-5","1"
+"17108","Harrisburg","PA","40.308638","-76.801693","-5","1"
+"17109","Harrisburg","PA","40.290439","-76.82841","-5","1"
+"17110","Harrisburg","PA","40.300738","-76.88528","-5","1"
+"17111","Harrisburg","PA","40.264389","-76.80298","-5","1"
+"17112","Harrisburg","PA","40.343261","-76.7808","-5","1"
+"17113","Harrisburg","PA","40.23299","-76.82579","-5","1"
+"17120","Harrisburg","PA","40.265689","-76.882745","-5","1"
+"17121","Harrisburg","PA","40.294396","-76.893751","-5","1"
+"17122","Harrisburg","PA","40.249845","-76.871209","-5","1"
+"17123","Harrisburg","PA","40.267518","-76.883734","-5","1"
+"17124","Harrisburg","PA","40.26746","-76.885967","-5","1"
+"17125","Harrisburg","PA","40.266221","-76.882854","-5","1"
+"17126","Harrisburg","PA","40.26179","-76.880021","-5","1"
+"17127","Harrisburg","PA","40.261516","-76.880884","-5","1"
+"17128","Harrisburg","PA","40.389865","-76.782323","-5","1"
+"17129","Harrisburg","PA","40.261516","-76.880884","-5","1"
+"17130","Harrisburg","PA","40.270222","-76.882889","-5","1"
+"17140","Harrisburg","PA","40.30864","-76.846449","-5","1"
+"17177","Harrisburg","PA","40.298988","-76.847194","-5","1"
+"17201","Chambersburg","PA","39.931123","-77.66139","-5","1"
+"17210","Amberson","PA","40.171667","-77.661354","-5","1"
+"17211","Artemas","PA","39.742192","-78.42113","-5","1"
+"17212","Big Cove Tannery","PA","39.81231","-78.06337","-5","1"
+"17213","Blairs Mills","PA","40.243335","-77.77414","-5","1"
+"17214","Blue Ridge Summit","PA","39.736626","-77.47038","-5","1"
+"17215","Burnt Cabins","PA","40.079326","-77.90039","-5","1"
+"17217","Concord","PA","40.225168","-77.725013","-5","1"
+"17219","Doylesburg","PA","40.228687","-77.71034","-5","1"
+"17220","Dry Run","PA","40.195365","-77.72092","-5","1"
+"17221","Fannettsburg","PA","40.0724","-77.81148","-5","1"
+"17222","Fayetteville","PA","39.897287","-77.52006","-5","1"
+"17223","Fort Littleton","PA","40.062255","-77.96308","-5","1"
+"17224","Fort Loudon","PA","39.957564","-77.90623","-5","1"
+"17225","Greencastle","PA","39.792122","-77.74923","-5","1"
+"17228","Harrisonville","PA","39.995374","-78.09348","-5","1"
+"17229","Hustontown","PA","40.070337","-78.02273","-5","1"
+"17231","Lemasters","PA","39.859432","-77.857889","-5","1"
+"17232","Lurgan","PA","40.105495","-77.640461","-5","1"
+"17233","McConnellsburg","PA","39.942589","-77.99529","-5","1"
+"17235","Marion","PA","39.857218","-77.69775","-5","1"
+"17236","Mercersburg","PA","39.793293","-77.92889","-5","1"
+"17237","Mont Alto","PA","39.840491","-77.55239","-5","1"
+"17238","Needmore","PA","39.847933","-78.12821","-5","1"
+"17239","Neelyton","PA","40.130231","-77.84147","-5","1"
+"17240","Newburg","PA","40.147267","-77.57259","-5","1"
+"17241","Newville","PA","40.172412","-77.40826","-5","1"
+"17243","Orbisonia","PA","40.242121","-77.87139","-5","1"
+"17244","Orrstown","PA","40.076657","-77.65433","-5","1"
+"17246","Pleasant Hall","PA","40.049118","-77.671754","-5","1"
+"17247","Quincy","PA","39.799481","-77.581092","-5","1"
+"17249","Rockhill Furnace","PA","40.242927","-77.90043","-5","1"
+"17250","Rouzerville","PA","39.736395","-77.52474","-5","1"
+"17251","Roxbury","PA","40.112652","-77.670626","-5","1"
+"17252","Saint Thomas","PA","39.913537","-77.81001","-5","1"
+"17253","Saltillo","PA","40.210859","-78.00567","-5","1"
+"17254","Scotland","PA","39.969722","-77.58878","-5","1"
+"17255","Shade Gap","PA","40.152486","-77.8617","-5","1"
+"17256","Shady Grove","PA","39.783391","-77.674851","-5","1"
+"17257","Shippensburg","PA","40.053308","-77.50622","-5","1"
+"17260","Shirleysburg","PA","40.298547","-77.89067","-5","1"
+"17261","South Mountain","PA","39.833095","-77.488633","-5","1"
+"17262","Spring Run","PA","40.153677","-77.70883","-5","1"
+"17263","State Line","PA","39.724825","-77.718629","-5","1"
+"17264","Three Springs","PA","40.190713","-77.98067","-5","1"
+"17265","Upperstrasburg","PA","40.035958","-77.79113","-5","1"
+"17266","Walnut Bottom","PA","40.086522","-77.41026","-5","1"
+"17267","Warfordsburg","PA","39.798516","-78.23675","-5","1"
+"17268","Waynesboro","PA","39.766281","-77.57241","-5","1"
+"17269","Brush Creek","PA","39.88745","-78.245581","-5","1"
+"17270","Williamson","PA","39.851731","-77.7993","-5","1"
+"17271","Willow Hill","PA","40.110585","-77.79943","-5","1"
+"17272","Zullinger","PA","39.771372","-77.62702","-5","1"
+"17275","Southampton","PA","40.019915","-77.464257","-5","1"
+"17294","Blue Ridge Summit","PA","40.004885","-77.77637","-5","1"
+"17301","Abbottstown","PA","39.891548","-76.98359","-5","1"
+"17302","Airville","PA","39.80954","-76.40849","-5","1"
+"17303","Arendtsville","PA","39.923644","-77.300085","-5","1"
+"17304","Aspers","PA","39.969711","-77.218","-5","1"
+"17306","Bendersville","PA","39.982466","-77.2496","-5","1"
+"17307","Biglerville","PA","39.930756","-77.2917","-5","1"
+"17309","Brogue","PA","39.871433","-76.44796","-5","1"
+"17310","Cashtown","PA","39.890605","-77.356642","-5","1"
+"17311","Codorus","PA","39.81667","-76.84165","-5","1"
+"17312","Craley","PA","39.946739","-76.506639","-5","1"
+"17313","Dallastown","PA","39.8989","-76.64405","-5","1"
+"17314","Delta","PA","39.746811","-76.33655","-5","1"
+"17315","Dover","PA","40.002696","-76.85763","-5","1"
+"17316","East Berlin","PA","39.965131","-77.00863","-5","1"
+"17317","East Prospect","PA","39.971506","-76.5206","-5","1"
+"17318","Emigsville","PA","40.017597","-76.72921","-5","1"
+"17319","Etters","PA","40.157382","-76.7872","-5","1"
+"17320","Fairfield","PA","39.759356","-77.37768","-5","1"
+"17321","Fawn Grove","PA","39.747204","-76.44339","-5","1"
+"17322","Felton","PA","39.848832","-76.55122","-5","1"
+"17323","Franklintown","PA","40.07501","-77.027926","-5","1"
+"17324","Gardners","PA","40.030925","-77.22858","-5","1"
+"17325","Gettysburg","PA","39.827337","-77.22904","-5","1"
+"17326","Gettysburg","PA","39.8948","-77.213493","-5","1"
+"17327","Glen Rock","PA","39.780323","-76.74785","-5","1"
+"17329","Glenville","PA","39.759126","-76.85248","-5","1"
+"17331","Hanover","PA","39.795301","-76.97727","-5","1"
+"17332","Hanover","PA","39.775037","-76.735116","-5","1"
+"17333","Hanover","PA","39.972985","-76.687826","-5","1"
+"17337","Idaville","PA","40.015656","-77.200131","-5","1"
+"17339","Lewisberry","PA","40.138959","-76.86904","-5","1"
+"17340","Littlestown","PA","39.748187","-77.10806","-5","1"
+"17342","Loganville","PA","39.853644","-76.707997","-5","1"
+"17343","McKnightstown","PA","39.871147","-77.32608","-5","1"
+"17344","McSherrystown","PA","39.805693","-77.01905","-5","1"
+"17345","Manchester","PA","40.067348","-76.72398","-5","1"
+"17346","Menges Mills","PA","40.079591","-76.703553","-5","1"
+"17347","Mount Wolf","PA","40.067559","-76.69584","-5","1"
+"17349","New Freedom","PA","39.753369","-76.68112","-5","1"
+"17350","New Oxford","PA","39.874531","-77.06305","-5","1"
+"17352","New Park","PA","39.761007","-76.50129","-5","1"
+"17353","Orrtanna","PA","39.876675","-77.3794","-5","1"
+"17354","Porters Sideling","PA","39.82457","-76.89927","-5","1"
+"17355","Railroad","PA","39.756761","-76.69939","-5","1"
+"17356","Red Lion","PA","39.90035","-76.59778","-5","1"
+"17358","Rossville","PA","39.972985","-76.687826","-5","1"
+"17360","Seven Valleys","PA","39.84987","-76.76403","-5","1"
+"17361","Shrewsbury","PA","39.765405","-76.67748","-5","1"
+"17362","Spring Grove","PA","39.853966","-76.87182","-5","1"
+"17363","Stewartstown","PA","39.765741","-76.59359","-5","1"
+"17364","Thomasville","PA","39.92813","-76.9018","-5","1"
+"17365","Wellsville","PA","40.052872","-76.94481","-5","1"
+"17366","Windsor","PA","39.92741","-76.56268","-5","1"
+"17368","Wrightsville","PA","40.002058","-76.52757","-5","1"
+"17370","York Haven","PA","40.120806","-76.76352","-5","1"
+"17371","York New Salem","PA","39.900579","-76.789624","-5","1"
+"17372","York Springs","PA","40.003442","-77.1099","-5","1"
+"17375","Peach Glen","PA","39.8948","-77.213493","-5","1"
+"17401","York","PA","39.962463","-76.72887","-5","1"
+"17402","York","PA","39.976898","-76.67785","-5","1"
+"17403","York","PA","39.952198","-76.71328","-5","1"
+"17404","York","PA","39.962821","-76.76764","-5","1"
+"17405","York","PA","40.008647","-76.597187","-5","1"
+"17406","York","PA","40.002547","-76.59646","-5","1"
+"17407","York","PA","39.882516","-76.71206","-5","1"
+"17415","York","PA","39.972985","-76.687826","-5","1"
+"17501","Akron","PA","40.156472","-76.204","-5","1"
+"17502","Bainbridge","PA","40.095995","-76.66707","-5","1"
+"17503","Bart","PA","40.0185","-76.297582","-5","1"
+"17504","Bausman","PA","40.024047","-76.328081","-5","1"
+"17505","Bird In Hand","PA","40.055467","-76.19149","-5","1"
+"17506","Blue Ball","PA","40.117326","-76.052379","-5","1"
+"17507","Bowmansville","PA","40.196641","-76.016047","-5","1"
+"17508","Brownstown","PA","40.125278","-76.21665","-5","1"
+"17509","Christiana","PA","39.919072","-76.02508","-5","1"
+"17511","Columbia","PA","40.041911","-76.487732","-5","1"
+"17512","Columbia","PA","40.037682","-76.49011","-5","1"
+"17516","Conestoga","PA","39.938255","-76.36066","-5","1"
+"17517","Denver","PA","40.234392","-76.12655","-5","1"
+"17518","Drumore","PA","39.811308","-76.25348","-5","1"
+"17519","East Earl","PA","40.141301","-76.0227","-5","1"
+"17520","East Petersburg","PA","40.098696","-76.35153","-5","1"
+"17521","Elm","PA","40.204393","-76.34643","-5","1"
+"17522","Ephrata","PA","40.174994","-76.17619","-5","1"
+"17527","Gap","PA","40.008814","-75.99195","-5","1"
+"17528","Goodville","PA","40.043523","-76.238766","-5","1"
+"17529","Gordonville","PA","40.0348","-76.11175","-5","1"
+"17532","Holtwood","PA","39.859296","-76.28548","-5","1"
+"17533","Hopeland","PA","40.233892","-76.260725","-5","1"
+"17534","Intercourse","PA","40.036659","-76.106902","-5","1"
+"17535","Kinzers","PA","40.000723","-76.04649","-5","1"
+"17536","Kirkwood","PA","39.840243","-76.07373","-5","1"
+"17537","Lampeter","PA","39.988548","-76.238729","-5","1"
+"17538","Landisville","PA","40.091196","-76.41582","-5","1"
+"17540","Leola","PA","40.096346","-76.19007","-5","1"
+"17543","Lititz","PA","40.164049","-76.29946","-5","1"
+"17545","Manheim","PA","40.168294","-76.4123","-5","1"
+"17547","Marietta","PA","40.064862","-76.57145","-5","1"
+"17549","Martindale","PA","40.154498","-76.08756","-5","1"
+"17550","Maytown","PA","40.072108","-76.57779","-5","1"
+"17551","Millersville","PA","39.994798","-76.36018","-5","1"
+"17552","Mount Joy","PA","40.109445","-76.50919","-5","1"
+"17554","Mountville","PA","40.040697","-76.42806","-5","1"
+"17555","Narvon","PA","40.126611","-75.96767","-5","1"
+"17557","New Holland","PA","40.102296","-76.08031","-5","1"
+"17560","New Providence","PA","39.915209","-76.21546","-5","1"
+"17562","Paradise","PA","39.981916","-76.09224","-5","1"
+"17563","Peach Bottom","PA","39.767658","-76.1749","-5","1"
+"17564","Penryn","PA","40.0185","-76.297582","-5","1"
+"17565","Pequea","PA","39.902788","-76.32496","-5","1"
+"17566","Quarryville","PA","39.872437","-76.15056","-5","1"
+"17567","Reamstown","PA","40.209941","-76.116445","-5","1"
+"17568","Refton","PA","39.9469","-76.232229","-5","1"
+"17569","Reinholds","PA","40.264733","-76.09645","-5","1"
+"17570","Rheems","PA","40.129494","-76.56991","-5","1"
+"17572","Ronks","PA","40.003405","-76.15367","-5","1"
+"17573","Ronks","PA","40.0185","-76.297582","-5","1"
+"17575","Silver Spring","PA","40.064746","-76.434285","-5","1"
+"17576","Smoketown","PA","40.038648","-76.1964","-5","1"
+"17577","Soudersburg","PA","40.0185","-76.297582","-5","1"
+"17578","Stevens","PA","40.226093","-76.16682","-5","1"
+"17579","Strasburg","PA","39.9656","-76.17781","-5","1"
+"17580","Talmage","PA","40.116846","-76.213075","-5","1"
+"17581","Terre Hill","PA","40.157565","-76.05041","-5","1"
+"17582","Washington Boro","PA","39.993398","-76.45568","-5","1"
+"17583","West Willow","PA","39.972349","-76.28733","-5","1"
+"17584","Willow Street","PA","39.963866","-76.26963","-5","1"
+"17585","Witmer","PA","40.048398","-76.211427","-5","1"
+"17601","Lancaster","PA","40.072246","-76.3155","-5","1"
+"17602","Lancaster","PA","40.032664","-76.27575","-5","1"
+"17603","Lancaster","PA","40.03263","-76.33328","-5","1"
+"17604","Lancaster","PA","40.065096","-76.335631","-5","1"
+"17605","Lancaster","PA","40.0185","-76.297582","-5","1"
+"17606","Lancaster","PA","40.110201","-76.305378","-5","1"
+"17607","Lancaster","PA","40.0185","-76.297582","-5","1"
+"17608","Lancaster","PA","40.0185","-76.297582","-5","1"
+"17699","Lancaster","PA","40.0185","-76.297582","-5","1"
+"17701","Williamsport","PA","41.256736","-77.0108","-5","1"
+"17702","Williamsport","PA","41.222128","-77.02267","-5","1"
+"17703","Williamsport","PA","41.33275","-77.023601","-5","1"
+"17705","Williamsport","PA","41.33275","-77.023601","-5","1"
+"17720","Antes Fort","PA","41.186545","-77.218368","-5","1"
+"17721","Avis","PA","41.186038","-77.31604","-5","1"
+"17722","Bodines","PA","41.33275","-77.023601","-5","1"
+"17723","Jersey Shore","PA","41.33275","-77.023601","-5","1"
+"17724","Canton","PA","41.649813","-76.82304","-5","1"
+"17726","Castanea","PA","41.122741","-77.431745","-5","1"
+"17727","Cedar Run","PA","41.33275","-77.023601","-5","1"
+"17728","Cogan Station","PA","41.318934","-77.08211","-5","1"
+"17729","Cross Fork","PA","41.493592","-77.78665","-5","1"
+"17730","Dewart","PA","41.109525","-76.87893","-5","1"
+"17731","Eagles Mere","PA","41.414864","-76.58391","-5","1"
+"17735","Grover","PA","41.77197","-76.521266","-5","1"
+"17737","Hughesville","PA","41.268721","-76.69048","-5","1"
+"17738","Hyner","PA","41.335148","-77.64014","-5","1"
+"17739","Jersey Mills","PA","41.357921","-77.40671","-5","1"
+"17740","Jersey Shore","PA","41.209389","-77.25975","-5","1"
+"17741","Watson","PA","41.229164","-77.28278","-5","1"
+"17742","Lairdsville","PA","41.232059","-76.6084","-5","1"
+"17743","Leroy","PA","41.77197","-76.521266","-5","1"
+"17744","Linden","PA","41.239046","-77.15154","-5","1"
+"17745","Lock Haven","PA","41.146432","-77.42658","-5","1"
+"17747","Loganton","PA","41.038555","-77.29872","-5","1"
+"17748","McElhattan","PA","41.125166","-77.36332","-5","1"
+"17749","McEwensville","PA","41.072139","-76.81871","-5","1"
+"17750","Mackeyville","PA","41.051654","-77.4631","-5","1"
+"17751","Mill Hall","PA","41.108454","-77.49516","-5","1"
+"17752","Montgomery","PA","41.173254","-76.88449","-5","1"
+"17754","Montoursville","PA","41.271098","-76.90382","-5","1"
+"17756","Muncy","PA","41.208834","-76.73877","-5","1"
+"17757","Wolf","PA","41.241656","-76.747251","-5","1"
+"17758","Muncy Valley","PA","41.349559","-76.5442","-5","1"
+"17759","Nisbet","PA","41.218259","-77.12137","-5","1"
+"17760","North Bend","PA","41.404439","-77.68536","-5","1"
+"17762","Picture Rocks","PA","41.280066","-76.71173","-5","1"
+"17763","Ralston","PA","41.505366","-76.95432","-5","1"
+"17764","Renovo","PA","41.351129","-77.79678","-5","1"
+"17765","Roaring Branch","PA","41.592461","-76.95078","-5","1"
+"17767","Salona","PA","41.084417","-77.46288","-5","1"
+"17768","Shunk","PA","41.544194","-76.74643","-5","1"
+"17769","Slate Run","PA","41.33275","-77.023601","-5","1"
+"17771","Trout Run","PA","41.43664","-77.03435","-5","1"
+"17772","Turbotville","PA","41.104021","-76.73831","-5","1"
+"17773","Tylersville","PA","41.220635","-77.618532","-5","1"
+"17774","Unityville","PA","41.239382","-76.53935","-5","1"
+"17776","Waterville","PA","41.36958","-77.38615","-5","1"
+"17777","Watsontown","PA","41.096505","-76.84924","-5","1"
+"17778","Westport","PA","41.290924","-77.92124","-5","1"
+"17779","Woolrich","PA","41.187424","-77.372827","-5","1"
+"17786","Penn","PA","41.254974","-76.681186","-5","1"
+"17801","Sunbury","PA","40.856105","-76.77124","-5","1"
+"17810","Allenwood","PA","41.117517","-77.00557","-5","1"
+"17812","Beaver Springs","PA","40.739459","-77.23037","-5","1"
+"17813","Beavertown","PA","40.768922","-77.17854","-5","1"
+"17814","Benton","PA","41.241255","-76.37738","-5","1"
+"17815","Bloomsburg","PA","41.013364","-76.43982","-5","1"
+"17820","Catawissa","PA","40.916126","-76.43888","-5","1"
+"17821","Danville","PA","40.985594","-76.63449","-5","1"
+"17822","Danville","PA","40.967437","-76.604896","-5","1"
+"17823","Dornsife","PA","40.720016","-76.73738","-5","1"
+"17824","Elysburg","PA","40.848885","-76.53547","-5","1"
+"17825","Excelsior","PA","40.769908","-76.49366","-5","1"
+"17827","Freeburg","PA","40.761179","-76.94339","-5","1"
+"17828","Gowen City","PA","40.889632","-76.664574","-5","1"
+"17829","Hartleton","PA","40.900777","-77.15522","-5","1"
+"17830","Herndon","PA","40.690647","-76.80513","-5","1"
+"17831","Hummels Wharf","PA","40.834408","-76.835439","-5","1"
+"17832","Marion Heights","PA","40.80436","-76.46387","-5","1"
+"17833","Kreamer","PA","40.802232","-76.96291","-5","1"
+"17834","Kulpmont","PA","40.792365","-76.47131","-5","1"
+"17835","Laurelton","PA","40.88358","-77.19808","-5","1"
+"17836","Leck Kill","PA","40.706213","-76.5997","-5","1"
+"17837","Lewisburg","PA","40.965348","-76.9139","-5","1"
+"17839","Light Street","PA","41.020062","-76.438413","-5","1"
+"17840","Locust Gap","PA","40.769941","-76.43928","-5","1"
+"17841","McClure","PA","40.714443","-77.34934","-5","1"
+"17842","Middleburg","PA","40.799235","-77.03834","-5","1"
+"17843","Beaver Springs","PA","40.762675","-77.07752","-5","1"
+"17844","Mifflinburg","PA","40.928666","-77.05294","-5","1"
+"17845","Millmont","PA","40.879182","-77.17437","-5","1"
+"17846","Millville","PA","41.142069","-76.51679","-5","1"
+"17847","Milton","PA","41.010754","-76.83647","-5","1"
+"17850","Montandon","PA","40.964676","-76.85724","-5","1"
+"17851","Mount Carmel","PA","40.797899","-76.41898","-5","1"
+"17853","Mount Pleasant Mills","PA","40.694161","-77.00629","-5","1"
+"17855","New Berlin","PA","40.880509","-76.985","-5","1"
+"17856","New Columbia","PA","41.047295","-76.91245","-5","1"
+"17857","Northumberland","PA","40.899361","-76.78947","-5","1"
+"17858","Numidia","PA","41.042106","-76.424297","-5","1"
+"17859","Orangeville","PA","41.11533","-76.39923","-5","1"
+"17860","Paxinos","PA","40.839093","-76.62615","-5","1"
+"17861","Paxtonville","PA","40.770921","-77.08455","-5","1"
+"17862","Penns Creek","PA","40.860555","-77.0582","-5","1"
+"17864","Port Trevorton","PA","40.696064","-76.90271","-5","1"
+"17865","Potts Grove","PA","40.9921","-76.78654","-5","1"
+"17866","Coal Township","PA","40.791328","-76.56393","-5","1"
+"17867","Rebuck","PA","40.708236","-76.68758","-5","1"
+"17868","Riverside","PA","40.956916","-76.63116","-5","1"
+"17870","Selinsgrove","PA","40.812047","-76.86138","-5","1"
+"17872","Shamokin","PA","40.784453","-76.56417","-5","1"
+"17876","Shamokin Dam","PA","40.845896","-76.82241","-5","1"
+"17877","Snydertown","PA","40.87897","-76.667267","-5","1"
+"17878","Stillwater","PA","41.170314","-76.33154","-5","1"
+"17880","Swengel","PA","40.978059","-77.08184","-5","1"
+"17881","Trevorton","PA","40.780982","-76.67105","-5","1"
+"17882","Troxelville","PA","40.801614","-77.20537","-5","1"
+"17883","Vicksburg","PA","40.978059","-77.08184","-5","1"
+"17884","Washingtonville","PA","41.052616","-76.67506","-5","1"
+"17885","Weikert","PA","40.851747","-77.31213","-5","1"
+"17886","West Milton","PA","41.017937","-76.86828","-5","1"
+"17887","White Deer","PA","41.07552","-76.87189","-5","1"
+"17888","Wilburton","PA","40.818443","-76.37737","-5","1"
+"17889","Winfield","PA","40.884501","-76.91202","-5","1"
+"17901","Pottsville","PA","40.68514","-76.2139","-5","1"
+"17920","Aristes","PA","40.818731","-76.33997","-5","1"
+"17921","Ashland","PA","40.763568","-76.34824","-5","1"
+"17922","Auburn","PA","40.594185","-76.13162","-5","1"
+"17923","Branchdale","PA","40.670753","-76.32397","-5","1"
+"17925","Brockton","PA","40.750666","-76.06899","-5","1"
+"17927","Centralia","PA","40.802567","-76.34017","-5","1"
+"17929","Cressona","PA","40.630557","-76.19448","-5","1"
+"17930","Cumbola","PA","40.711162","-76.13678","-5","1"
+"17931","Frackville","PA","40.782361","-76.23232","-5","1"
+"17932","Frackville","PA","40.649109","-76.503339","-5","1"
+"17933","Friedensburg","PA","40.602141","-76.24143","-5","1"
+"17934","Gilberton","PA","40.79872","-76.21547","-5","1"
+"17935","Girardville","PA","40.793258","-76.28315","-5","1"
+"17936","Gordon","PA","40.750943","-76.33944","-5","1"
+"17938","Hegins","PA","40.658667","-76.4814","-5","1"
+"17941","Klingerstown","PA","40.677386","-76.62897","-5","1"
+"17942","Landingville","PA","40.722587","-76.229623","-5","1"
+"17943","Lavelle","PA","40.763048","-76.38158","-5","1"
+"17944","Llewellyn","PA","40.672834","-76.27989","-5","1"
+"17945","Locustdale","PA","40.777606","-76.37371","-5","1"
+"17946","Lost Creek","PA","40.809063","-76.25805","-5","1"
+"17948","Mahanoy City","PA","40.813869","-76.13737","-5","1"
+"17949","Mahanoy Plane","PA","40.794162","-76.24258","-5","1"
+"17951","Mar Lin","PA","40.679479","-76.24495","-5","1"
+"17952","Mary D","PA","40.759814","-76.05513","-5","1"
+"17953","Middleport","PA","40.727464","-76.08556","-5","1"
+"17954","Minersville","PA","40.690455","-76.26024","-5","1"
+"17957","Muir","PA","40.592705","-76.51986","-5","1"
+"17959","New Philadelphia","PA","40.731739","-76.1278","-5","1"
+"17960","New Ringgold","PA","40.700548","-75.96098","-5","1"
+"17961","Orwigsburg","PA","40.645057","-76.0785","-5","1"
+"17963","Pine Grove","PA","40.558488","-76.38129","-5","1"
+"17964","Pitman","PA","40.710899","-76.52368","-5","1"
+"17965","Port Carbon","PA","40.698814","-76.16405","-5","1"
+"17966","Ravine","PA","40.722587","-76.229623","-5","1"
+"17967","Ringtown","PA","40.859702","-76.21615","-5","1"
+"17968","Sacramento","PA","40.63898","-76.60502","-5","1"
+"17970","Saint Clair","PA","40.718586","-76.19111","-5","1"
+"17972","Schuylkill Haven","PA","40.614771","-76.19352","-5","1"
+"17974","Seltzer","PA","40.696252","-76.23554","-5","1"
+"17976","Shenandoah","PA","40.820862","-76.20421","-5","1"
+"17978","Spring Glen","PA","40.632279","-76.64059","-5","1"
+"17979","Summit Station","PA","40.560225","-76.19887","-5","1"
+"17980","Tower City","PA","40.584748","-76.55479","-5","1"
+"17981","Tremont","PA","40.632681","-76.39579","-5","1"
+"17982","Tuscarora","PA","40.771111","-76.03747","-5","1"
+"17983","Valley View","PA","40.643634","-76.54562","-5","1"
+"17985","Zion Grove","PA","40.909697","-76.20494","-5","1"
+"18001","Lehigh Valley","PA","40.693376","-75.471156","-5","1"
+"18002","Lehigh Valley","PA","40.665597","-75.426247","-5","1"
+"18003","Lehigh Valley","PA","40.693376","-75.471156","-5","1"
+"18010","Ackermanville","PA","40.693376","-75.471156","-5","1"
+"18011","Alburtis","PA","40.496375","-75.62213","-5","1"
+"18012","Aquashicola","PA","40.811206","-75.59136","-5","1"
+"18013","Bangor","PA","40.863124","-75.19004","-5","1"
+"18014","Bath","PA","40.747742","-75.40078","-5","1"
+"18015","Bethlehem","PA","40.601261","-75.37542","-5","1"
+"18016","Bethlehem","PA","40.693376","-75.471156","-5","1"
+"18017","Bethlehem","PA","40.645665","-75.36926","-5","1"
+"18018","Bethlehem","PA","40.625444","-75.38831","-5","1"
+"18020","Bethlehem","PA","40.656498","-75.32938","-5","1"
+"18021","Hazleton","PA","40.954484","-75.973747","-5","1"
+"18024","Bethlehem","PA","40.650883","-75.306102","-5","1"
+"18025","Bethlehem","PA","40.693376","-75.471156","-5","1"
+"18030","Bowmanstown","PA","40.80116","-75.66158","-5","1"
+"18031","Breinigsville","PA","40.552042","-75.64919","-5","1"
+"18032","Catasauqua","PA","40.657089","-75.47123","-5","1"
+"18034","Center Valley","PA","40.540398","-75.41501","-5","1"
+"18035","Cherryville","PA","40.749545","-75.53855","-5","1"
+"18036","Coopersburg","PA","40.508855","-75.40103","-5","1"
+"18037","Coplay","PA","40.671538","-75.5044","-5","1"
+"18038","Danielsville","PA","40.786431","-75.49158","-5","1"
+"18039","Durham","PA","40.328645","-75.10278","-5","1"
+"18040","Easton","PA","40.730182","-75.22349","-5","1"
+"18041","East Greenville","PA","40.410224","-75.50845","-5","1"
+"18042","Easton","PA","40.681798","-75.22082","-5","1"
+"18043","Easton","PA","40.792804","-75.137186","-5","1"
+"18044","Easton","PA","40.693376","-75.471156","-5","1"
+"18045","Easton","PA","40.681531","-75.26722","-5","1"
+"18046","East Texas","PA","40.538843","-75.568502","-5","1"
+"18049","Emmaus","PA","40.533597","-75.49822","-5","1"
+"18050","Flicksville","PA","40.693376","-75.471156","-5","1"
+"18051","Fogelsville","PA","40.593153","-75.65222","-5","1"
+"18052","Whitehall","PA","40.651751","-75.49224","-5","1"
+"18053","Germansville","PA","40.707516","-75.70754","-5","1"
+"18054","Green Lane","PA","40.343587","-75.44613","-5","1"
+"18055","Hellertown","PA","40.585649","-75.3261","-5","1"
+"18056","Hereford","PA","40.451369","-75.55229","-5","1"
+"18058","Kunkletown","PA","40.912421","-75.49765","-5","1"
+"18059","Laurys Station","PA","40.723681","-75.53601","-5","1"
+"18060","Limeport","PA","40.53484","-75.57864","-5","1"
+"18062","Macungie","PA","40.517304","-75.56515","-5","1"
+"18063","Martins Creek","PA","40.781918","-75.18589","-5","1"
+"18064","Nazareth","PA","40.746849","-75.31632","-5","1"
+"18065","Neffs","PA","40.696738","-75.611647","-5","1"
+"18066","New Tripoli","PA","40.653037","-75.72689","-5","1"
+"18067","Northampton","PA","40.693818","-75.48697","-5","1"
+"18068","Old Zionsville","PA","40.693376","-75.471156","-5","1"
+"18069","Orefield","PA","40.624592","-75.60728","-5","1"
+"18070","Palm","PA","40.431982","-75.53852","-5","1"
+"18071","Palmerton","PA","40.820558","-75.58537","-5","1"
+"18072","Pen Argyl","PA","40.857829","-75.25776","-5","1"
+"18073","Pennsburg","PA","40.388263","-75.48659","-5","1"
+"18074","Perkiomenville","PA","40.316397","-75.5154","-5","1"
+"18076","Red Hill","PA","40.375182","-75.48431","-5","1"
+"18077","Riegelsville","PA","40.576989","-75.22121","-5","1"
+"18078","Schnecksville","PA","40.675741","-75.61626","-5","1"
+"18079","Slatedale","PA","40.744055","-75.65864","-5","1"
+"18080","Slatington","PA","40.739576","-75.62113","-5","1"
+"18081","Springtown","PA","40.556976","-75.28817","-5","1"
+"18083","Stockertown","PA","40.754064","-75.26477","-5","1"
+"18084","Sumneytown","PA","40.327782","-75.454043","-5","1"
+"18085","Tatamy","PA","40.740769","-75.25335","-5","1"
+"18086","Treichlers","PA","40.734807","-75.54488","-5","1"
+"18087","Trexlertown","PA","40.549119","-75.60049","-5","1"
+"18088","Walnutport","PA","40.760403","-75.57535","-5","1"
+"18091","Wind Gap","PA","40.835128","-75.30274","-5","1"
+"18092","Zionsville","PA","40.465994","-75.51958","-5","1"
+"18096","South Whitehall","PA","40.633542","-75.583861","-5","1"
+"18098","Emmaus","PA","40.693376","-75.471156","-5","1"
+"18099","Emmaus","PA","40.693376","-75.471156","-5","1"
+"18101","Allentown","PA","40.602847","-75.47022","-5","1"
+"18102","Allentown","PA","40.607747","-75.4793","-5","1"
+"18103","Allentown","PA","40.595097","-75.45915","-5","1"
+"18104","Allentown","PA","40.601996","-75.52104","-5","1"
+"18105","Allentown","PA","40.693376","-75.471156","-5","1"
+"18106","Allentown","PA","40.569288","-75.58893","-5","1"
+"18109","Allentown","PA","40.693376","-75.471156","-5","1"
+"18160","Tunkhannock","PA","41.010299","-75.45705","-5","1"
+"18175","Allentown","PA","40.585561","-75.621058","-5","1"
+"18195","Allentown","PA","40.57983","-75.579884","-5","1"
+"18201","Hazleton","PA","40.958434","-75.98519","-5","1"
+"18202","Hazleton","PA","40.969691","-75.990392","-5","1"
+"18210","Albrightsville","PA","41.000937","-75.55484","-5","1"
+"18211","Andreas","PA","40.749289","-75.82947","-5","1"
+"18212","Ashfield","PA","40.784095","-75.708281","-5","1"
+"18214","Barnesville","PA","40.811198","-76.06652","-5","1"
+"18216","Beaver Meadows","PA","40.931187","-75.91493","-5","1"
+"18218","Coaldale","PA","40.822234","-75.91011","-5","1"
+"18219","Conyngham","PA","40.988834","-76.05963","-5","1"
+"18220","Delano","PA","40.839186","-76.06929","-5","1"
+"18221","Drifton","PA","41.004017","-75.90569","-5","1"
+"18222","Drums","PA","41.030933","-75.98932","-5","1"
+"18223","Ebervale","PA","41.272248","-75.880146","-5","1"
+"18224","Freeland","PA","41.015634","-75.89791","-5","1"
+"18225","Harleigh","PA","40.98227","-75.96874","-5","1"
+"18229","Jim Thorpe","PA","40.913283","-75.6982","-5","1"
+"18230","Junedale","PA","40.924427","-75.94189","-5","1"
+"18231","Kelayres","PA","40.900995","-76.00488","-5","1"
+"18232","Lansford","PA","40.832477","-75.88198","-5","1"
+"18234","Lattimer Mines","PA","40.99303","-75.96009","-5","1"
+"18235","Lehighton","PA","40.828682","-75.70596","-5","1"
+"18237","Mcadoo","PA","40.897038","-75.99548","-5","1"
+"18239","Milnesville","PA","40.989783","-75.98173","-5","1"
+"18240","Nesquehoning","PA","40.857175","-75.84811","-5","1"
+"18241","Nuremberg","PA","40.939035","-76.16898","-5","1"
+"18242","Oneida","PA","40.90757","-76.12636","-5","1"
+"18243","Pardeesville","PA","41.001683","-75.966146","-5","1"
+"18244","Parryville","PA","40.824403","-75.66924","-5","1"
+"18245","Quakake","PA","40.85315","-76.03218","-5","1"
+"18246","Rock Glen","PA","40.965379","-76.18859","-5","1"
+"18247","Saint Johns","PA","41.014808","-76.058391","-5","1"
+"18248","Sheppton","PA","40.89707","-76.11711","-5","1"
+"18249","Sugarloaf","PA","40.99118","-76.09565","-5","1"
+"18250","Summit Hill","PA","40.826908","-75.8674","-5","1"
+"18251","Sybertsville","PA","41.001956","-76.08117","-5","1"
+"18252","Tamaqua","PA","40.792315","-75.97705","-5","1"
+"18254","Tresckow","PA","40.914664","-75.96359","-5","1"
+"18255","Weatherly","PA","40.945334","-75.8265","-5","1"
+"18256","Weston","PA","40.941585","-76.13916","-5","1"
+"18301","East Stroudsburg","PA","41.052199","-75.15936","-5","1"
+"18320","Analomink","PA","41.071213","-75.236436","-5","1"
+"18321","Bartonsville","PA","41.012235","-75.29039","-5","1"
+"18322","Brodheadsville","PA","40.923539","-75.4","-5","1"
+"18323","Buck Hill Falls","PA","41.198247","-75.27298","-5","1"
+"18324","Bushkill","PA","41.141582","-74.99786","-5","1"
+"18325","Canadensis","PA","41.205738","-75.24344","-5","1"
+"18326","Cresco","PA","41.154329","-75.27865","-5","1"
+"18327","Delaware Water Gap","PA","40.982028","-75.14262","-5","1"
+"18328","Dingmans Ferry","PA","41.241889","-74.95917","-5","1"
+"18330","Effort","PA","40.969985","-75.45726","-5","1"
+"18331","Gilbert","PA","40.913651","-75.43501","-5","1"
+"18332","Henryville","PA","41.093813","-75.26213","-5","1"
+"18333","Kresgeville","PA","40.898654","-75.49795","-5","1"
+"18334","Long Pond","PA","41.075315","-75.43058","-5","1"
+"18335","Marshalls Creek","PA","41.050764","-75.208269","-5","1"
+"18336","Matamoras","PA","41.368893","-74.70553","-5","1"
+"18337","Milford","PA","41.320904","-74.88565","-5","1"
+"18340","Millrift","PA","41.411678","-74.744","-5","1"
+"18341","Minisink Hills","PA","40.999857","-75.13254","-5","1"
+"18342","Mountainhome","PA","41.145778","-75.294125","-5","1"
+"18343","Mount Bethel","PA","40.889911","-75.1112","-5","1"
+"18344","Mount Pocono","PA","41.118465","-75.35501","-5","1"
+"18346","Pocono Summit","PA","41.118226","-75.39631","-5","1"
+"18347","Pocono Lake","PA","41.144565","-75.55717","-5","1"
+"18348","Pocono Lake Preserve","PA","41.033755","-75.30798","-5","1"
+"18349","Pocono Manor","PA","41.100236","-75.36453","-5","1"
+"18350","Pocono Pines","PA","41.116737","-75.46037","-5","1"
+"18351","Portland","PA","40.920622","-75.09773","-5","1"
+"18352","Reeders","PA","40.986265","-75.348026","-5","1"
+"18353","Saylorsburg","PA","40.906654","-75.35881","-5","1"
+"18354","Sciota","PA","40.922005","-75.32185","-5","1"
+"18355","Scotrun","PA","41.074757","-75.36259","-5","1"
+"18356","Shawnee On Delaware","PA","41.010333","-75.09995","-5","1"
+"18357","Skytop","PA","41.231091","-75.23884","-5","1"
+"18360","Stroudsburg","PA","40.98314","-75.26026","-5","1"
+"18370","Swiftwater","PA","41.095437","-75.3191","-5","1"
+"18371","Tamiment","PA","41.340936","-75.024055","-5","1"
+"18372","Tannersville","PA","41.048423","-75.31865","-5","1"
+"18373","Unity House","PA","41.340936","-75.024055","-5","1"
+"18377","Dingman","PA","41.31514","-74.95183","-5","1"
+"18401","Aldenville","PA","41.615989","-75.274708","-5","1"
+"18403","Archbald","PA","41.493381","-75.54909","-5","1"
+"18405","Beach Lake","PA","41.598906","-75.10381","-5","1"
+"18407","Carbondale","PA","41.583517","-75.51015","-5","1"
+"18410","Chinchilla","PA","41.486527","-75.693335","-5","1"
+"18411","Clarks Summit","PA","41.485845","-75.71134","-5","1"
+"18413","Clifford","PA","41.64872","-75.59722","-5","1"
+"18414","Dalton","PA","41.537933","-75.73826","-5","1"
+"18415","Damascus","PA","41.743598","-75.12383","-5","1"
+"18416","Elmhurst","PA","41.375602","-75.547966","-5","1"
+"18417","Equinunk","PA","41.800226","-75.20349","-5","1"
+"18419","Factoryville","PA","41.568872","-75.79296","-5","1"
+"18420","Fleetville","PA","41.597115","-75.71102","-5","1"
+"18421","Forest City","PA","41.653139","-75.46199","-5","1"
+"18424","Gouldsboro","PA","41.251286","-75.49121","-5","1"
+"18425","Greeley","PA","41.419116","-75.00683","-5","1"
+"18426","Greentown","PA","41.337195","-75.27069","-5","1"
+"18427","Hamlin","PA","41.422497","-75.335384","-5","1"
+"18428","Hawley","PA","41.427945","-75.13473","-5","1"
+"18430","Herrick Center","PA","41.759285","-75.50111","-5","1"
+"18431","Honesdale","PA","41.60032","-75.25102","-5","1"
+"18433","Jermyn","PA","41.550591","-75.56795","-5","1"
+"18434","Jessup","PA","41.471937","-75.56605","-5","1"
+"18435","Lackawaxen","PA","41.497511","-75.01149","-5","1"
+"18436","Lake Ariel","PA","41.426197","-75.39395","-5","1"
+"18437","Lake Como","PA","41.866271","-75.33611","-5","1"
+"18438","Lakeville","PA","41.429411","-75.24702","-5","1"
+"18439","Lakewood","PA","41.825884","-75.34132","-5","1"
+"18440","La Plume","PA","41.551585","-75.767583","-5","1"
+"18441","Lenoxville","PA","41.663906","-75.62979","-5","1"
+"18443","Milanville","PA","41.656499","-75.11552","-5","1"
+"18444","Moscow","PA","41.344794","-75.52671","-5","1"
+"18445","Newfoundland","PA","41.286968","-75.36218","-5","1"
+"18446","Nicholson","PA","41.64181","-75.74693","-5","1"
+"18447","Olyphant","PA","41.47785","-75.60486","-5","1"
+"18448","Olyphant","PA","41.46488","-75.596231","-5","1"
+"18449","Orson","PA","41.615989","-75.274708","-5","1"
+"18451","Paupack","PA","41.404263","-75.23826","-5","1"
+"18452","Peckville","PA","41.48188","-75.58669","-5","1"
+"18453","Pleasant Mount","PA","41.75098","-75.37109","-5","1"
+"18454","Poyntelle","PA","41.615989","-75.274708","-5","1"
+"18455","Preston Park","PA","41.880371","-75.36086","-5","1"
+"18456","Prompton","PA","41.606185","-75.33971","-5","1"
+"18457","Rowland","PA","41.471736","-75.04617","-5","1"
+"18458","Shohola","PA","41.408589","-74.92544","-5","1"
+"18459","South Canaan","PA","41.515012","-75.40884","-5","1"
+"18460","South Sterling","PA","41.255644","-75.34474","-5","1"
+"18461","Starlight","PA","41.938498","-75.34499","-5","1"
+"18462","Starrucca","PA","41.8914","-75.43221","-5","1"
+"18463","Sterling","PA","41.376953","-75.31601","-5","1"
+"18464","Tafton","PA","41.414421","-75.18585","-5","1"
+"18465","Thompson","PA","41.839349","-75.50841","-5","1"
+"18466","Tobyhanna","PA","41.19012","-75.36779","-5","1"
+"18469","Tyler Hill","PA","41.694366","-75.13718","-5","1"
+"18470","Union Dale","PA","41.722929","-75.5417","-5","1"
+"18471","Waverly","PA","41.527134","-75.70629","-5","1"
+"18472","Waymart","PA","41.579472","-75.39613","-5","1"
+"18473","White Mills","PA","41.525207","-75.20779","-5","1"
+"18501","Scranton","PA","41.401881","-75.637626","-5","1"
+"18502","Scranton","PA","41.350303","-75.689965","-5","1"
+"18503","Scranton","PA","41.41018","-75.66588","-5","1"
+"18504","Scranton","PA","41.414979","-75.6879","-5","1"
+"18505","Scranton","PA","41.39208","-75.66603","-5","1"
+"18507","Moosic","PA","41.35838","-75.71228","-5","1"
+"18508","Scranton","PA","41.439329","-75.66187","-5","1"
+"18509","Scranton","PA","41.42818","-75.64726","-5","1"
+"18510","Scranton","PA","41.40918","-75.64508","-5","1"
+"18512","Scranton","PA","41.427199","-75.61821","-5","1"
+"18514","Scranton","PA","41.401881","-75.637626","-5","1"
+"18515","Scranton","PA","41.403529","-75.706485","-5","1"
+"18517","Taylor","PA","41.391279","-75.71535","-5","1"
+"18518","Old Forge","PA","41.369679","-75.73829","-5","1"
+"18519","Dickson City","PA","41.46213","-75.62478","-5","1"
+"18522","Scranton","PA","41.401881","-75.637626","-5","1"
+"18540","Scranton","PA","41.401881","-75.637626","-5","1"
+"18577","Scranton","PA","41.401881","-75.637626","-5","1"
+"18601","Beach Haven","PA","41.067712","-76.17626","-5","1"
+"18602","Bear Creek","PA","41.184986","-75.75144","-5","1"
+"18603","Berwick","PA","41.061356","-76.24934","-5","1"
+"18610","Blakeslee","PA","41.057574","-75.53909","-5","1"
+"18611","Cambra","PA","41.196076","-76.30735","-5","1"
+"18612","Dallas","PA","41.345579","-75.97596","-5","1"
+"18614","Dushore","PA","41.501249","-76.38889","-5","1"
+"18615","Falls","PA","41.449135","-75.85774","-5","1"
+"18616","Forksville","PA","41.511462","-76.6237","-5","1"
+"18617","Glen Lyon","PA","41.175582","-76.07455","-5","1"
+"18618","Harveys Lake","PA","41.37649","-76.03662","-5","1"
+"18619","Hillsgrove","PA","41.448101","-76.6963","-5","1"
+"18621","Hunlock Creek","PA","41.257193","-76.08882","-5","1"
+"18622","Huntington Mills","PA","41.2044","-76.27211","-5","1"
+"18623","Laceyville","PA","41.653217","-76.1487","-5","1"
+"18624","Lake Harmony","PA","41.058352","-75.60137","-5","1"
+"18625","Lake Winola","PA","41.509364","-75.85458","-5","1"
+"18626","Laporte","PA","41.421281","-76.49446","-5","1"
+"18627","Lehman","PA","41.316584","-76.021037","-5","1"
+"18628","Lopez","PA","41.417231","-76.30865","-5","1"
+"18629","Mehoopany","PA","41.555944","-76.13179","-5","1"
+"18630","Meshoppen","PA","41.653604","-76.03178","-5","1"
+"18631","Mifflinville","PA","41.028617","-76.30717","-5","1"
+"18632","Mildred","PA","41.476652","-76.38074","-5","1"
+"18634","Nanticoke","PA","41.197908","-76.00325","-5","1"
+"18635","Nescopeck","PA","41.038241","-76.20682","-5","1"
+"18636","Noxen","PA","41.402035","-76.07007","-5","1"
+"18638","Solebury","PA","40.384588","-75.058245","-5","1"
+"18640","Pittston","PA","41.317242","-75.77942","-5","1"
+"18641","Pittston","PA","41.333035","-75.74189","-5","1"
+"18642","Duryea","PA","41.348939","-75.76279","-5","1"
+"18643","Pittston","PA","41.337585","-75.81587","-5","1"
+"18644","Wyoming","PA","41.31943","-75.85208","-5","1"
+"18651","Plymouth","PA","41.244281","-75.94878","-5","1"
+"18653","Ransom","PA","41.393881","-75.82447","-5","1"
+"18654","Shawanese","PA","41.350053","-76.03193","-5","1"
+"18655","Shickshinny","PA","41.184223","-76.19361","-5","1"
+"18656","Sweet Valley","PA","41.310649","-76.19316","-5","1"
+"18657","Tunkhannock","PA","41.535917","-75.95006","-5","1"
+"18660","Wapwallopen","PA","41.098371","-76.06397","-5","1"
+"18661","White Haven","PA","41.082188","-75.75965","-5","1"
+"18672","Bridgeton","PA","40.540232","-75.104872","-5","1"
+"18690","Dallas","PA","41.272248","-75.880146","-5","1"
+"18701","Wilkes Barre","PA","41.243181","-75.88438","-5","1"
+"18702","Wilkes Barre","PA","41.236331","-75.87254","-5","1"
+"18703","Wilkes Barre","PA","41.242081","-75.88569","-5","1"
+"18704","Kingston","PA","41.274748","-75.89076","-5","1"
+"18705","Wilkes Barre","PA","41.268231","-75.84569","-5","1"
+"18706","Wilkes Barre","PA","41.209869","-75.91781","-5","1"
+"18707","Mountain Top","PA","41.133482","-75.9194","-5","1"
+"18708","Shavertown","PA","41.305822","-75.94148","-5","1"
+"18709","Luzerne","PA","41.28328","-75.89369","-5","1"
+"18710","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18711","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18715","Almedia","PA","41.016832","-76.377114","-5","1"
+"18761","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18762","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18763","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18764","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18765","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18766","Wilkes Barre","PA","41.244781","-75.88959","-5","1"
+"18767","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18768","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18769","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18773","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18774","Wilkes Barre","PA","41.272248","-75.880146","-5","1"
+"18801","Montrose","PA","41.830406","-75.9179","-5","1"
+"18810","Athens","PA","41.949723","-76.50508","-5","1"
+"18812","Brackney","PA","41.964875","-75.95528","-5","1"
+"18813","Brooklyn","PA","41.753339","-75.80831","-5","1"
+"18814","Burlington","PA","41.782906","-76.60854","-5","1"
+"18815","Camptown","PA","41.77197","-76.521266","-5","1"
+"18816","Dimock","PA","41.747232","-75.89424","-5","1"
+"18817","East Smithfield","PA","41.875402","-76.63313","-5","1"
+"18818","Friendsville","PA","41.909808","-76.04473","-5","1"
+"18820","Gibson","PA","41.803936","-75.64431","-5","1"
+"18821","Great Bend","PA","41.977241","-75.74391","-5","1"
+"18822","Hallstead","PA","41.951797","-75.77536","-5","1"
+"18823","Harford","PA","41.784395","-75.70091","-5","1"
+"18824","Hop Bottom","PA","41.708207","-75.7846","-5","1"
+"18825","Jackson","PA","41.822157","-75.59506","-5","1"
+"18826","Kingsley","PA","41.738688","-75.72679","-5","1"
+"18827","Lanesboro","PA","41.963293","-75.58203","-5","1"
+"18828","Lawton","PA","41.786507","-76.07042","-5","1"
+"18829","Le Raysville","PA","41.837903","-76.17415","-5","1"
+"18830","Little Meadows","PA","41.957125","-76.11639","-5","1"
+"18831","Milan","PA","41.899294","-76.60496","-5","1"
+"18832","Monroeton","PA","41.702433","-76.55565","-5","1"
+"18833","New Albany","PA","41.5932","-76.46516","-5","1"
+"18834","New Milford","PA","41.853082","-75.72077","-5","1"
+"18837","Rome","PA","41.918757","-76.29687","-5","1"
+"18839","Rushville","PA","41.803273","-76.11934","-5","1"
+"18840","Sayre","PA","41.983801","-76.52578","-5","1"
+"18842","South Gibson","PA","41.746871","-75.61752","-5","1"
+"18843","South Montrose","PA","41.8237","-75.88314","-5","1"
+"18844","Springville","PA","41.695782","-75.91836","-5","1"
+"18845","Stevensville","PA","41.797851","-76.18303","-5","1"
+"18846","Sugar Run","PA","41.600392","-76.24243","-5","1"
+"18847","Susquehanna","PA","41.944334","-75.57241","-5","1"
+"18848","Towanda","PA","41.762543","-76.45298","-5","1"
+"18850","Ulster","PA","41.849392","-76.5021","-5","1"
+"18851","Warren Center","PA","41.928722","-76.16896","-5","1"
+"18853","Wyalusing","PA","41.719942","-76.26615","-5","1"
+"18854","Wysox","PA","41.781522","-76.35906","-5","1"
+"18901","Doylestown","PA","40.317473","-75.12854","-5","1"
+"18903","Doylestown","PA","40.339307","-75.152176","-5","1"
+"18910","Bedminster","PA","40.328645","-75.10278","-5","1"
+"18911","Blooming Glen","PA","40.328645","-75.10278","-5","1"
+"18912","Buckingham","PA","40.309942","-75.074252","-5","1"
+"18913","Carversville","PA","40.376499","-75.04129","-5","1"
+"18914","Chalfont","PA","40.282406","-75.20657","-5","1"
+"18915","Colmar","PA","40.272177","-75.25783","-5","1"
+"18916","Danboro","PA","40.328645","-75.10278","-5","1"
+"18917","Dublin","PA","40.37327","-75.20246","-5","1"
+"18918","Earlington","PA","40.320036","-75.374155","-5","1"
+"18920","Erwinna","PA","40.500115","-75.07901","-5","1"
+"18921","Ferndale","PA","40.328645","-75.10278","-5","1"
+"18922","Forest Grove","PA","40.328645","-75.10278","-5","1"
+"18923","Fountainville","PA","40.346926","-75.16497","-5","1"
+"18924","Franconia","PA","40.308116","-75.358575","-5","1"
+"18925","Furlong","PA","40.282168","-75.06283","-5","1"
+"18926","Gardenville","PA","40.39473","-75.098468","-5","1"
+"18927","Hilltown","PA","40.324823","-75.2436","-5","1"
+"18928","Holicong","PA","40.335974","-75.04288","-5","1"
+"18929","Jamison","PA","40.256648","-75.09357","-5","1"
+"18930","Kintnersville","PA","40.537142","-75.21189","-5","1"
+"18931","Lahaska","PA","40.328645","-75.10278","-5","1"
+"18932","Line Lexington","PA","40.289372","-75.25572","-5","1"
+"18933","Lumberville","PA","40.328645","-75.10278","-5","1"
+"18934","Mechanicsville","PA","40.349443","-75.067622","-5","1"
+"18935","Milford Square","PA","40.328645","-75.10278","-5","1"
+"18936","Montgomeryville","PA","40.223216","-75.22829","-5","1"
+"18938","New Hope","PA","40.354735","-74.99319","-5","1"
+"18940","Newtown","PA","40.246802","-74.93912","-5","1"
+"18942","Ottsville","PA","40.466205","-75.16183","-5","1"
+"18943","Penns Park","PA","40.268981","-75.009401","-5","1"
+"18944","Perkasie","PA","40.379029","-75.25926","-5","1"
+"18945","Plumstead","PA","40.431382","-75.100804","-5","1"
+"18946","Pineville","PA","40.271104","-75.062204","-5","1"
+"18947","Pipersville","PA","40.426391","-75.11842","-5","1"
+"18949","Plumsteadville","PA","40.38805","-75.142522","-5","1"
+"18950","Point Pleasant","PA","40.416516","-75.074832","-5","1"
+"18951","Quakertown","PA","40.445203","-75.34838","-5","1"
+"18953","Revere","PA","40.328645","-75.10278","-5","1"
+"18954","Richboro","PA","40.214652","-75.00379","-5","1"
+"18955","Richlandtown","PA","40.478742","-75.31938","-5","1"
+"18956","Rushland","PA","40.262783","-75.01568","-5","1"
+"18957","Salford","PA","40.302945","-75.448579","-5","1"
+"18958","Salfordville","PA","40.290357","-75.435539","-5","1"
+"18960","Sellersville","PA","40.361206","-75.31101","-5","1"
+"18962","Silverdale","PA","40.346017","-75.26953","-5","1"
+"18963","Solebury","PA","40.328645","-75.10278","-5","1"
+"18964","Souderton","PA","40.305176","-75.325","-5","1"
+"18966","Southampton","PA","40.184745","-75.00831","-5","1"
+"18968","Spinnerstown","PA","40.328645","-75.10278","-5","1"
+"18969","Telford","PA","40.32635","-75.34589","-5","1"
+"18970","Trumbauersville","PA","40.412771","-75.38625","-5","1"
+"18971","Tylersport","PA","40.34698","-75.376985","-5","1"
+"18972","Upper Black Eddy","PA","40.535227","-75.12642","-5","1"
+"18974","Warminster","PA","40.211241","-75.0887","-5","1"
+"18976","Warrington","PA","40.240295","-75.13458","-5","1"
+"18977","Washington Crossing","PA","40.289939","-74.87885","-5","1"
+"18979","Woxall","PA","40.211896","-75.35586","-5","1"
+"18980","Wycombe","PA","40.28083","-75.01422","-5","1"
+"18981","Zionhill","PA","40.328645","-75.10278","-5","1"
+"18991","Warminster","PA","40.328645","-75.10278","-5","1"
+"19001","Abington","PA","40.127907","-75.12695","-5","1"
+"19002","Ambler","PA","40.169608","-75.21158","-5","1"
+"19003","Ardmore","PA","40.000861","-75.29694","-5","1"
+"19004","Bala Cynwyd","PA","40.012862","-75.23309","-5","1"
+"19006","Huntingdon Valley","PA","40.129509","-75.06115","-5","1"
+"19007","Bristol","PA","40.108943","-74.85548","-5","1"
+"19008","Broomall","PA","39.974378","-75.36083","-5","1"
+"19009","Bryn Athyn","PA","40.139539","-75.06716","-5","1"
+"19010","Bryn Mawr","PA","40.02371","-75.32764","-5","1"
+"19012","Cheltenham","PA","40.060304","-75.10439","-5","1"
+"19013","Chester","PA","39.84697","-75.37444","-5","1"
+"19014","Aston","PA","39.864761","-75.4326","-5","1"
+"19015","Brookhaven","PA","39.864929","-75.38761","-5","1"
+"19016","Chester","PA","39.934047","-75.405987","-5","1"
+"19017","Chester Heights","PA","39.883911","-75.466949","-5","1"
+"19018","Primos","PA","39.922862","-75.29639","-5","1"
+"19019","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19020","Bensalem","PA","40.10386","-74.93734","-5","1"
+"19021","Croydon","PA","40.093443","-74.89912","-5","1"
+"19022","Crum Lynne","PA","39.862712","-75.33958","-5","1"
+"19023","Darby","PA","39.916262","-75.26517","-5","1"
+"19025","Dresher","PA","40.149164","-75.16047","-5","1"
+"19026","Drexel Hill","PA","39.949962","-75.30184","-5","1"
+"19027","Elkins Park","PA","40.072293","-75.12406","-5","1"
+"19028","Edgemont","PA","39.934047","-75.405987","-5","1"
+"19029","Essington","PA","39.866912","-75.29156","-5","1"
+"19030","Fairless Hills","PA","40.175504","-74.84611","-5","1"
+"19031","Flourtown","PA","40.107743","-75.21334","-5","1"
+"19032","Folcroft","PA","39.893212","-75.28088","-5","1"
+"19033","Folsom","PA","39.890462","-75.32755","-5","1"
+"19034","Fort Washington","PA","40.13477","-75.20374","-5","1"
+"19035","Gladwyne","PA","40.042444","-75.28002","-5","1"
+"19036","Glenolden","PA","39.902045","-75.29371","-5","1"
+"19037","Glen Riddle Lima","PA","39.934047","-75.405987","-5","1"
+"19038","Glenside","PA","40.10346","-75.16829","-5","1"
+"19039","Gradyville","PA","39.88211","-75.337234","-5","1"
+"19040","Hatboro","PA","40.178076","-75.1067","-5","1"
+"19041","Haverford","PA","40.012661","-75.3088","-5","1"
+"19043","Holmes","PA","39.899812","-75.30893","-5","1"
+"19044","Horsham","PA","40.184758","-75.14386","-5","1"
+"19046","Jenkintown","PA","40.09811","-75.10949","-5","1"
+"19047","Langhorne","PA","40.173563","-74.91203","-5","1"
+"19048","Langhorne","PA","40.173509","-74.92461","-5","1"
+"19049","Langhorne","PA","40.328645","-75.10278","-5","1"
+"19050","Lansdowne","PA","39.939609","-75.26453","-5","1"
+"19052","Lenni","PA","39.894161","-75.445589","-5","1"
+"19053","Feasterville Trevose","PA","40.148759","-74.98228","-5","1"
+"19054","Levittown","PA","40.166859","-74.82066","-5","1"
+"19055","Levittown","PA","40.149009","-74.83617","-5","1"
+"19056","Levittown","PA","40.151509","-74.88576","-5","1"
+"19057","Levittown","PA","40.142059","-74.85821","-5","1"
+"19058","Levittown","PA","40.328645","-75.10278","-5","1"
+"19059","Levittown","PA","40.328645","-75.10278","-5","1"
+"19061","Marcus Hook","PA","39.832762","-75.44063","-5","1"
+"19063","Media","PA","39.916078","-75.40251","-5","1"
+"19064","Springfield","PA","39.929511","-75.33562","-5","1"
+"19065","Media","PA","39.921061","-75.386136","-5","1"
+"19066","Merion Station","PA","40.003762","-75.2493","-5","1"
+"19067","Morrisville","PA","40.214661","-74.81812","-5","1"
+"19070","Morton","PA","39.906312","-75.32489","-5","1"
+"19072","Narberth","PA","40.014541","-75.25805","-5","1"
+"19073","Newtown Square","PA","39.98451","-75.41265","-5","1"
+"19074","Norwood","PA","39.888312","-75.29717","-5","1"
+"19075","Oreland","PA","40.11461","-75.18632","-5","1"
+"19076","Prospect Park","PA","39.884562","-75.30847","-5","1"
+"19078","Ridley Park","PA","39.877262","-75.32272","-5","1"
+"19079","Sharon Hill","PA","39.903312","-75.26939","-5","1"
+"19080","Wayne","PA","40.043201","-75.357678","-5","1"
+"19081","Swarthmore","PA","39.897562","-75.34658","-5","1"
+"19082","Upper Darby","PA","39.958512","-75.26856","-5","1"
+"19083","Havertown","PA","39.978728","-75.30861","-5","1"
+"19085","Villanova","PA","40.038477","-75.3473","-5","1"
+"19086","Wallingford","PA","39.888913","-75.37006","-5","1"
+"19087","Wayne","PA","40.058808","-75.40069","-5","1"
+"19088","Wayne","PA","39.934047","-75.405987","-5","1"
+"19089","Wayne","PA","40.043399","-75.357308","-5","1"
+"19090","Willow Grove","PA","40.145859","-75.1216","-5","1"
+"19091","Media","PA","39.934047","-75.405987","-5","1"
+"19092","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19093","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19094","Woodlyn","PA","39.874612","-75.34542","-5","1"
+"19095","Wyncote","PA","40.08786","-75.14707","-5","1"
+"19096","Wynnewood","PA","39.992345","-75.27624","-5","1"
+"19098","Holmes","PA","39.895362","-75.310731","-5","1"
+"19099","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19101","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19102","Philadelphia","PA","39.952962","-75.16558","-5","1"
+"19103","Philadelphia","PA","39.952162","-75.17406","-5","1"
+"19104","Philadelphia","PA","39.961612","-75.19957","-5","1"
+"19105","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19106","Philadelphia","PA","39.951062","-75.14589","-5","1"
+"19107","Philadelphia","PA","39.952112","-75.15853","-5","1"
+"19108","Philadelphia","PA","39.959662","-75.1605","-5","1"
+"19109","Philadelphia","PA","39.949612","-75.163722","-5","1"
+"19110","Philadelphia","PA","39.950212","-75.163572","-5","1"
+"19111","Philadelphia","PA","40.057661","-75.08018","-5","1"
+"19112","Philadelphia","PA","39.895677","-75.19044","-5","1"
+"19113","Philadelphia","PA","39.874179","-75.26353","-5","1"
+"19114","Philadelphia","PA","40.064257","-75.00155","-5","1"
+"19115","Philadelphia","PA","40.09261","-75.04118","-5","1"
+"19116","Philadelphia","PA","40.117413","-75.0154","-5","1"
+"19118","Philadelphia","PA","40.07236","-75.20772","-5","1"
+"19119","Philadelphia","PA","40.053511","-75.18858","-5","1"
+"19120","Philadelphia","PA","40.033944","-75.12118","-5","1"
+"19121","Philadelphia","PA","39.981062","-75.1745","-5","1"
+"19122","Philadelphia","PA","39.977662","-75.14336","-5","1"
+"19123","Philadelphia","PA","39.964012","-75.14764","-5","1"
+"19124","Philadelphia","PA","40.017362","-75.08769","-5","1"
+"19125","Philadelphia","PA","39.978162","-75.12565","-5","1"
+"19126","Philadelphia","PA","40.055411","-75.13793","-5","1"
+"19127","Philadelphia","PA","40.026626","-75.22311","-5","1"
+"19128","Philadelphia","PA","40.038944","-75.22104","-5","1"
+"19129","Philadelphia","PA","40.011562","-75.1839","-5","1"
+"19130","Philadelphia","PA","39.968262","-75.17222","-5","1"
+"19131","Philadelphia","PA","39.981112","-75.22486","-5","1"
+"19132","Philadelphia","PA","39.995412","-75.16977","-5","1"
+"19133","Philadelphia","PA","39.992862","-75.14054","-5","1"
+"19134","Philadelphia","PA","39.991712","-75.11116","-5","1"
+"19135","Philadelphia","PA","40.023611","-75.04966","-5","1"
+"19136","Philadelphia","PA","40.041111","-75.02644","-5","1"
+"19137","Philadelphia","PA","40.000262","-75.07404","-5","1"
+"19138","Philadelphia","PA","40.055861","-75.15654","-5","1"
+"19139","Philadelphia","PA","39.961812","-75.23003","-5","1"
+"19140","Philadelphia","PA","40.012212","-75.14503","-5","1"
+"19141","Philadelphia","PA","40.035778","-75.1447","-5","1"
+"19142","Philadelphia","PA","39.922612","-75.23453","-5","1"
+"19143","Philadelphia","PA","39.944162","-75.22718","-5","1"
+"19144","Philadelphia","PA","40.034111","-75.17203","-5","1"
+"19145","Philadelphia","PA","39.922262","-75.18259","-5","1"
+"19146","Philadelphia","PA","39.938512","-75.18067","-5","1"
+"19147","Philadelphia","PA","39.936562","-75.15409","-5","1"
+"19148","Philadelphia","PA","39.919812","-75.15803","-5","1"
+"19149","Philadelphia","PA","40.037711","-75.06658","-5","1"
+"19150","Philadelphia","PA","40.07226","-75.17106","-5","1"
+"19151","Philadelphia","PA","39.975929","-75.25256","-5","1"
+"19152","Philadelphia","PA","40.059611","-75.04837","-5","1"
+"19153","Philadelphia","PA","39.898985","-75.23221","-5","1"
+"19154","Philadelphia","PA","40.09146","-74.97719","-5","1"
+"19155","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19156","Centerport","PA","40.48586","-76.009125","-5","1"
+"19160","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19161","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19162","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19170","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19171","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19172","Philadelphia","PA","39.947321","-75.150011","-5","1"
+"19173","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19175","Philadelphia","PA","39.990562","-75.12957","-5","1"
+"19177","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19178","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19179","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19181","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19182","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19183","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19184","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19185","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19187","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19188","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19191","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19192","Philadelphia","PA","39.951112","-75.167622","-5","1"
+"19193","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19194","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19196","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19197","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19244","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19255","Philadelphia","PA","40.001811","-75.11787","-5","1"
+"19301","Paoli","PA","40.042252","-75.48357","-5","1"
+"19310","Atglen","PA","39.9451","-75.97024","-5","1"
+"19311","Avondale","PA","39.825643","-75.77244","-5","1"
+"19312","Berwyn","PA","40.037958","-75.44986","-5","1"
+"19316","Brandamore","PA","40.058565","-75.83584","-5","1"
+"19317","Chadds Ford","PA","39.851803","-75.5961","-5","1"
+"19318","Chatham","PA","39.852406","-75.811789","-5","1"
+"19319","Cheyney","PA","39.928663","-75.52526","-5","1"
+"19320","Coatesville","PA","39.978456","-75.82275","-5","1"
+"19330","Cochranville","PA","39.872123","-75.91411","-5","1"
+"19331","Concordville","PA","39.882274","-75.516529","-5","1"
+"19333","Devon","PA","40.044858","-75.42174","-5","1"
+"19335","Downingtown","PA","40.02342","-75.71389","-5","1"
+"19339","Concordville","PA","39.934047","-75.405987","-5","1"
+"19340","Concordville","PA","39.934047","-75.405987","-5","1"
+"19341","Exton","PA","40.040505","-75.63425","-5","1"
+"19342","Glen Mills","PA","39.897677","-75.50109","-5","1"
+"19343","Glenmoore","PA","40.094621","-75.74602","-5","1"
+"19344","Honey Brook","PA","40.078045","-75.88488","-5","1"
+"19345","Immaculata","PA","40.030536","-75.565","-5","1"
+"19346","Kelton","PA","39.983153","-75.748055","-5","1"
+"19347","Kemblesville","PA","39.983153","-75.748055","-5","1"
+"19348","Kennett Square","PA","39.858137","-75.71227","-5","1"
+"19350","Landenberg","PA","39.768218","-75.78759","-5","1"
+"19351","Lewisville","PA","39.983153","-75.748055","-5","1"
+"19352","Lincoln University","PA","39.783675","-75.8944","-5","1"
+"19353","Lionville","PA","40.013158","-75.499046","-5","1"
+"19354","Lyndell","PA","40.058173","-75.743272","-5","1"
+"19355","Malvern","PA","40.042957","-75.53221","-5","1"
+"19357","Mendenhall","PA","39.983153","-75.748055","-5","1"
+"19358","Modena","PA","39.962256","-75.80215","-5","1"
+"19360","New London","PA","39.726143","-75.7857","-5","1"
+"19362","Nottingham","PA","39.750999","-76.059","-5","1"
+"19363","Oxford","PA","39.781938","-75.97458","-5","1"
+"19365","Parkesburg","PA","39.961094","-75.92047","-5","1"
+"19366","Pocopson","PA","39.983153","-75.748055","-5","1"
+"19367","Pomeroy","PA","39.964795","-75.88285","-5","1"
+"19369","Sadsburyville","PA","39.985257","-75.88984","-5","1"
+"19370","Steelville","PA","39.983153","-75.748055","-5","1"
+"19371","Suplee","PA","39.983153","-75.748055","-5","1"
+"19372","Thorndale","PA","39.997469","-75.75964","-5","1"
+"19373","Thornton","PA","39.899315","-75.5314","-5","1"
+"19374","Toughkenamon","PA","39.830992","-75.7553","-5","1"
+"19375","Unionville","PA","39.901177","-75.750203","-5","1"
+"19376","Wagontown","PA","39.983153","-75.748055","-5","1"
+"19380","West Chester","PA","39.983108","-75.59332","-5","1"
+"19381","West Chester","PA","39.983153","-75.748055","-5","1"
+"19382","West Chester","PA","39.940043","-75.59729","-5","1"
+"19383","West Chester","PA","39.94545","-75.602401","-5","1"
+"19390","West Grove","PA","39.820841","-75.84233","-5","1"
+"19395","Westtown","PA","39.932821","-75.544822","-5","1"
+"19397","Southeastern","PA","39.983153","-75.748055","-5","1"
+"19398","Southeastern","PA","39.983153","-75.748055","-5","1"
+"19399","Southeastern","PA","39.983153","-75.748055","-5","1"
+"19401","Norristown","PA","40.123708","-75.33843","-5","1"
+"19403","Norristown","PA","40.146069","-75.38378","-5","1"
+"19404","Norristown","PA","40.211896","-75.35586","-5","1"
+"19405","Bridgeport","PA","40.103208","-75.3405","-5","1"
+"19406","King Of Prussia","PA","40.092941","-75.37525","-5","1"
+"19407","Audubon","PA","40.211896","-75.35586","-5","1"
+"19408","Eagleville","PA","40.156555","-75.413127","-5","1"
+"19409","Fairview Village","PA","40.211896","-75.35586","-5","1"
+"19420","Arcola","PA","40.152871","-75.456719","-5","1"
+"19421","Birchrunville","PA","40.138889","-75.63332","-5","1"
+"19422","Blue Bell","PA","40.157526","-75.27816","-5","1"
+"19423","Cedars","PA","40.21735","-75.364973","-5","1"
+"19424","Blue Bell","PA","40.211896","-75.35586","-5","1"
+"19425","Chester Springs","PA","40.089905","-75.64124","-5","1"
+"19426","Collegeville","PA","40.185637","-75.44873","-5","1"
+"19428","Conshohocken","PA","40.077736","-75.30509","-5","1"
+"19429","Conshohocken","PA","40.211896","-75.35586","-5","1"
+"19430","Creamery","PA","40.185071","-75.419966","-5","1"
+"19432","Devault","PA","40.079629","-75.559975","-5","1"
+"19435","Frederick","PA","40.330348","-75.56937","-5","1"
+"19436","Gwynedd","PA","40.201932","-75.25091","-5","1"
+"19437","Gwynedd Valley","PA","40.183763","-75.26271","-5","1"
+"19438","Harleysville","PA","40.270424","-75.38569","-5","1"
+"19440","Hatfield","PA","40.278294","-75.29479","-5","1"
+"19441","Harleysville","PA","40.211896","-75.35586","-5","1"
+"19442","Kimberton","PA","40.146549","-75.617739","-5","1"
+"19443","Kulpsville","PA","40.241004","-75.34392","-5","1"
+"19444","Lafayette Hill","PA","40.087297","-75.2557","-5","1"
+"19446","Lansdale","PA","40.237206","-75.29156","-5","1"
+"19450","Lederach","PA","40.211896","-75.35586","-5","1"
+"19451","Mainland","PA","40.211896","-75.35586","-5","1"
+"19452","Miquon","PA","40.211896","-75.35586","-5","1"
+"19453","Mont Clare","PA","40.137922","-75.50218","-5","1"
+"19454","North Wales","PA","40.223524","-75.24731","-5","1"
+"19455","North Wales","PA","40.211896","-75.35586","-5","1"
+"19456","Oaks","PA","40.133355","-75.453631","-5","1"
+"19457","Parker Ford","PA","40.204252","-75.58449","-5","1"
+"19460","Phoenixville","PA","40.126271","-75.52341","-5","1"
+"19462","Plymouth Meeting","PA","40.115959","-75.29257","-5","1"
+"19464","Pottstown","PA","40.253496","-75.63481","-5","1"
+"19465","Pottstown","PA","40.206057","-75.66107","-5","1"
+"19468","Royersford","PA","40.200347","-75.53236","-5","1"
+"19470","Saint Peters","PA","40.186707","-75.728759","-5","1"
+"19472","Sassamansville","PA","40.339207","-75.57372","-5","1"
+"19473","Schwenksville","PA","40.257069","-75.47097","-5","1"
+"19474","Skippack","PA","40.222343","-75.4052","-5","1"
+"19475","Spring City","PA","40.176858","-75.57621","-5","1"
+"19477","Spring House","PA","40.185934","-75.232407","-5","1"
+"19478","Spring Mount","PA","40.276511","-75.4582","-5","1"
+"19480","Uwchland","PA","40.098032","-75.688005","-5","1"
+"19481","Valley Forge","PA","40.092269","-75.453735","-5","1"
+"19482","Valley Forge","PA","40.080323","-75.455408","-5","1"
+"19483","Valley Forge","PA","40.211896","-75.35586","-5","1"
+"19484","Valley Forge","PA","40.211896","-75.35586","-5","1"
+"19485","Valley Forge","PA","40.211896","-75.35586","-5","1"
+"19486","West Point","PA","40.203291","-75.301918","-5","1"
+"19487","King Of Prussia","PA","39.983153","-75.748055","-5","1"
+"19488","Norristown","PA","39.983153","-75.748055","-5","1"
+"19489","Norristown","PA","39.983153","-75.748055","-5","1"
+"19490","Worcester","PA","40.192881","-75.357555","-5","1"
+"19492","Zieglerville","PA","40.281036","-75.486","-5","1"
+"19493","Valley Forge","PA","39.983153","-75.748055","-5","1"
+"19494","Valley Forge","PA","39.983153","-75.748055","-5","1"
+"19495","Valley Forge","PA","39.983153","-75.748055","-5","1"
+"19496","Valley Forge","PA","39.983153","-75.748055","-5","1"
+"19501","Adamstown","PA","40.241588","-76.05765","-5","1"
+"19503","Bally","PA","40.401044","-75.58836","-5","1"
+"19504","Barto","PA","40.404892","-75.58992","-5","1"
+"19505","Bechtelsville","PA","40.375925","-75.62617","-5","1"
+"19506","Bernville","PA","40.453886","-76.12911","-5","1"
+"19507","Bethel","PA","40.488558","-76.27269","-5","1"
+"19508","Birdsboro","PA","40.267165","-75.8254","-5","1"
+"19510","Blandon","PA","40.444786","-75.88034","-5","1"
+"19511","Bowers","PA","40.48773","-75.7393","-5","1"
+"19512","Boyertown","PA","40.338497","-75.6632","-5","1"
+"19516","Centerport","PA","40.486726","-76.00719","-5","1"
+"19517","Dauberville","PA","40.407173","-75.984901","-5","1"
+"19518","Douglassville","PA","40.273179","-75.73931","-5","1"
+"19519","Earlville","PA","40.317896","-75.73144","-5","1"
+"19520","Elverson","PA","40.157078","-75.80669","-5","1"
+"19522","Fleetwood","PA","40.447093","-75.81997","-5","1"
+"19523","Geigertown","PA","40.203142","-75.83588","-5","1"
+"19524","Robeson","PA","40.248684","-75.858731","-5","1"
+"19525","Gilbertsville","PA","40.311246","-75.594","-5","1"
+"19526","Hamburg","PA","40.545014","-75.98463","-5","1"
+"19529","Kempton","PA","40.625739","-75.83474","-5","1"
+"19530","Kutztown","PA","40.535102","-75.77566","-5","1"
+"19533","Leesport","PA","40.435509","-75.98937","-5","1"
+"19534","Lenhartsville","PA","40.574033","-75.87434","-5","1"
+"19535","Limekiln","PA","40.335593","-75.801009","-5","1"
+"19536","Lyon Station","PA","40.480194","-75.75698","-5","1"
+"19538","Maxatawny","PA","40.569818","-75.740942","-5","1"
+"19539","Mertztown","PA","40.497369","-75.68225","-5","1"
+"19540","Mohnton","PA","40.250592","-75.96683","-5","1"
+"19541","Mohrsville","PA","40.479447","-76.02438","-5","1"
+"19542","Monocacy Station","PA","40.260992","-75.768437","-5","1"
+"19543","Morgantown","PA","40.167618","-75.89259","-5","1"
+"19544","Mount Aetna","PA","40.418864","-76.29564","-5","1"
+"19545","New Berlinville","PA","40.340392","-75.63082","-5","1"
+"19546","Cumru","PA","40.254667","-75.951709","-5","1"
+"19547","Oley","PA","40.385143","-75.76372","-5","1"
+"19548","Pine Forge","PA","40.407173","-75.984901","-5","1"
+"19549","Port Clinton","PA","40.580744","-76.02559","-5","1"
+"19550","Rehrersburg","PA","40.456862","-76.24373","-5","1"
+"19551","Robesonia","PA","40.357034","-76.13741","-5","1"
+"19554","Shartlesville","PA","40.513794","-76.10833","-5","1"
+"19555","Shoemakersville","PA","40.494943","-75.96466","-5","1"
+"19557","Stony Run","PA","40.613868","-75.814984","-5","1"
+"19559","Strausstown","PA","40.492053","-76.1841","-5","1"
+"19560","Temple","PA","40.407243","-75.91163","-5","1"
+"19562","Topton","PA","40.502511","-75.70315","-5","1"
+"19564","Virginville","PA","40.526803","-75.869653","-5","1"
+"19565","Wernersville","PA","40.327974","-76.08921","-5","1"
+"19567","Womelsdorf","PA","40.373285","-76.20054","-5","1"
+"19601","Reading","PA","40.348092","-75.93577","-5","1"
+"19602","Reading","PA","40.329992","-75.91962","-5","1"
+"19603","Reading","PA","40.388442","-75.963055","-5","1"
+"19604","Reading","PA","40.355092","-75.91205","-5","1"
+"19605","Reading","PA","40.390943","-75.9375","-5","1"
+"19606","Reading","PA","40.327741","-75.87002","-5","1"
+"19607","Reading","PA","40.302492","-75.95565","-5","1"
+"19608","Reading","PA","40.312842","-76.02422","-5","1"
+"19609","Reading","PA","40.324694","-75.9921","-5","1"
+"19610","Reading","PA","40.335023","-75.97099","-5","1"
+"19611","Reading","PA","40.327792","-75.94215","-5","1"
+"19612","Reading","PA","40.4389","-75.885303","-5","1"
+"19640","Reading","PA","40.407173","-75.984901","-5","1"
+"19650","Alsace","PA","40.394884","-75.86638","-5","1"
+"19685","Muhlenberg","PA","40.378451","-75.917477","-5","1"
+"19700","Delaware City","DE","39.570322","-75.590662","-5","1"
+"19701","Bear","DE","39.598203","-75.69945","-5","1"
+"19702","Newark","DE","39.626297","-75.71386","-5","1"
+"19703","Claymont","DE","39.800945","-75.46455","-5","1"
+"19706","Delaware City","DE","39.573744","-75.59204","-5","1"
+"19707","Hockessin","DE","39.784014","-75.68586","-5","1"
+"19708","Kirkwood","DE","39.577567","-75.690069","-5","1"
+"19709","Middletown","DE","39.479602","-75.6932","-5","1"
+"19710","Montchanin","DE","39.788562","-75.58881","-5","1"
+"19711","Newark","DE","39.700561","-75.7431","-5","1"
+"19712","Newark","DE","39.564499","-75.597047","-5","1"
+"19713","Newark","DE","39.669211","-75.71796","-5","1"
+"19714","Newark","DE","39.564499","-75.597047","-5","1"
+"19715","Newark","DE","39.564499","-75.597047","-5","1"
+"19716","Newark","DE","39.564499","-75.597047","-5","1"
+"19717","Newark","DE","39.564499","-75.597047","-5","1"
+"19718","Newark","DE","39.564499","-75.597047","-5","1"
+"19720","New Castle","DE","39.669219","-75.59003","-5","1"
+"19721","New Castle","DE","39.564499","-75.597047","-5","1"
+"19725","Newark","DE","39.564499","-75.597047","-5","1"
+"19726","Newark","DE","39.564499","-75.597047","-5","1"
+"19730","Odessa","DE","39.456484","-75.65976","-5","1"
+"19731","Port Penn","DE","39.518164","-75.57656","-5","1"
+"19732","Rockland","DE","39.794496","-75.57433","-5","1"
+"19733","Saint Georges","DE","39.555794","-75.65058","-5","1"
+"19734","Townsend","DE","39.386601","-75.66801","-5","1"
+"19735","Winterthur","DE","39.794396","-75.597598","-5","1"
+"19736","Yorklyn","DE","39.790911","-75.64934","-5","1"
+"19743","Spring Mount","PA","40.276386","-75.462796","-5","1"
+"19766","Delaware City","DE","39.567092","-75.601491","-5","1"
+"19801","Wilmington","DE","39.738563","-75.54833","-5","1"
+"19802","Wilmington","DE","39.756213","-75.53312","-5","1"
+"19803","Wilmington","DE","39.793962","-75.53401","-5","1"
+"19804","Wilmington","DE","39.721062","-75.60806","-5","1"
+"19805","Wilmington","DE","39.745377","-75.58251","-5","1"
+"19806","Wilmington","DE","39.758563","-75.56413","-5","1"
+"19807","Wilmington","DE","39.787512","-75.60256","-5","1"
+"19808","Wilmington","DE","39.734279","-75.6631","-5","1"
+"19809","Wilmington","DE","39.771663","-75.49656","-5","1"
+"19810","Wilmington","DE","39.817645","-75.50242","-5","1"
+"19814","Newport","DE","39.713625","-75.596283","-5","1"
+"19815","Amity","PA","40.318615","-75.755807","-5","1"
+"19850","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19853","Schuylkill","PA","40.088156","-75.480887","-5","1"
+"19880","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19884","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19885","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19886","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19887","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19889","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19890","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19891","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19892","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19893","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19894","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19895","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19896","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19897","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19898","Wilmington","DE","39.564499","-75.597047","-5","1"
+"19899","Wilmington","DE","39.734792","-75.624617","-5","1"
+"19901","Dover","DE","39.16426","-75.51163","-5","1"
+"19902","Dover AFB","DE","39.131958","-75.46953","-5","1"
+"19903","Dover","DE","39.10868","-75.448023","-5","1"
+"19904","Dover","DE","39.161639","-75.5587","-5","1"
+"19905","Dover","DE","39.10868","-75.448023","-5","1"
+"19925","Upper Uwchlan","PA","40.084337","-75.680797","-5","1"
+"19930","Bethany Beach","DE","38.536354","-75.06062","-5","1"
+"19931","Bethel","DE","38.570238","-75.6147","-5","1"
+"19933","Bridgeville","DE","38.73635","-75.60807","-5","1"
+"19934","Camden Wyoming","DE","39.094699","-75.58871","-5","1"
+"19936","Cheswold","DE","39.218448","-75.584848","-5","1"
+"19938","Clayton","DE","39.265066","-75.6807","-5","1"
+"19939","Dagsboro","DE","38.557501","-75.21465","-5","1"
+"19940","Delmar","DE","38.469655","-75.5669","-5","1"
+"19941","Ellendale","DE","38.80136","-75.42595","-5","1"
+"19942","Farmington","DE","38.868387","-75.57907","-5","1"
+"19943","Felton","DE","39.011387","-75.58978","-5","1"
+"19944","Fenwick Island","DE","38.459314","-75.05356","-5","1"
+"19945","Frankford","DE","38.511469","-75.18364","-5","1"
+"19946","Frederica","DE","39.037803","-75.46634","-5","1"
+"19947","Georgetown","DE","38.676552","-75.39269","-5","1"
+"19950","Greenwood","DE","38.818541","-75.60966","-5","1"
+"19951","Harbeson","DE","38.682345","-75.23286","-5","1"
+"19952","Harrington","DE","38.916908","-75.61343","-5","1"
+"19953","Hartly","DE","39.150822","-75.70428","-5","1"
+"19954","Houston","DE","38.909621","-75.51264","-5","1"
+"19955","Kenton","DE","39.227313","-75.66549","-5","1"
+"19956","Laurel","DE","38.549721","-75.55304","-5","1"
+"19958","Lewes","DE","38.746207","-75.16282","-5","1"
+"19960","Lincoln","DE","38.855872","-75.39889","-5","1"
+"19961","Little Creek","DE","39.166323","-75.448289","-5","1"
+"19962","Magnolia","DE","39.06517","-75.49858","-5","1"
+"19963","Milford","DE","38.922806","-75.41449","-5","1"
+"19964","Marydel","DE","39.098772","-75.73943","-5","1"
+"19966","Millsboro","DE","38.601355","-75.2411","-5","1"
+"19967","Millville","DE","38.54597","-75.11175","-5","1"
+"19968","Milton","DE","38.772648","-75.28665","-5","1"
+"19969","Nassau","DE","38.725562","-75.353387","-5","1"
+"19970","Ocean View","DE","38.55044","-75.09928","-5","1"
+"19971","Rehoboth Beach","DE","38.711512","-75.09677","-5","1"
+"19973","Seaford","DE","38.643248","-75.61102","-5","1"
+"19975","Selbyville","DE","38.463751","-75.15642","-5","1"
+"19977","Smyrna","DE","39.29799","-75.59391","-5","1"
+"19979","Viola","DE","39.0461","-75.57185","-5","1"
+"19980","Woodside","DE","39.07027","-75.57057","-5","1"
+"19999","Bethany Beach","DE","38.542771","-75.05666","-5","1"
+"20001","Washington","DC","38.907711","-77.01732","-5","1"
+"20002","Washington","DC","38.901811","-76.99097","-5","1"
+"20003","Washington","DC","38.881762","-76.99447","-5","1"
+"20004","Washington","DC","38.895268","-77.0276","-5","1"
+"20005","Washington","DC","38.904461","-77.03088","-5","1"
+"20006","Washington","DC","38.897567","-77.04195","-5","1"
+"20007","Washington","DC","38.913961","-77.07179","-5","1"
+"20008","Washington","DC","38.934866","-77.06039","-5","1"
+"20009","Washington","DC","38.919211","-77.03777","-5","1"
+"20010","Washington","DC","38.933311","-77.02929","-5","1"
+"20011","Washington","DC","38.95211","-77.02097","-5","1"
+"20012","Washington","DC","38.97808","-77.02858","-5","1"
+"20013","Washington","DC","38.893311","-77.014647","-5","1"
+"20015","Washington","DC","38.96516","-77.06737","-5","1"
+"20016","Washington","DC","38.94081","-77.08723","-5","1"
+"20017","Washington","DC","38.937478","-76.99125","-5","1"
+"20018","Washington","DC","38.928761","-76.97523","-5","1"
+"20019","Washington","DC","38.891445","-76.93811","-5","1"
+"20020","Washington","DC","38.863079","-76.97138","-5","1"
+"20024","Washington","DC","38.880112","-77.02362","-5","1"
+"20026","Washington","DC","38.893311","-77.014647","-5","1"
+"20029","Washington","DC","38.893311","-77.014647","-5","1"
+"20030","Washington","DC","38.893311","-77.014647","-5","1"
+"20032","Washington","DC","38.836145","-77.00058","-5","1"
+"20033","Washington","DC","38.893311","-77.014647","-5","1"
+"20035","Washington","DC","38.893311","-77.014647","-5","1"
+"20036","Washington","DC","38.906778","-77.04148","-5","1"
+"20037","Washington","DC","38.900394","-77.05126","-5","1"
+"20038","Washington","DC","38.893311","-77.014647","-5","1"
+"20039","Washington","DC","38.893311","-77.014647","-5","1"
+"20040","Washington","DC","38.893311","-77.014647","-5","1"
+"20041","Washington","DC","38.893311","-77.014647","-5","1"
+"20042","Washington","DC","38.893311","-77.014647","-5","1"
+"20043","Washington","DC","38.893311","-77.014647","-5","1"
+"20044","Washington","DC","38.893311","-77.014647","-5","1"
+"20045","Washington","DC","38.896599","-77.0319","-5","1"
+"20046","Washington","DC","38.893311","-77.014647","-5","1"
+"20047","Washington","DC","38.893311","-77.014647","-5","1"
+"20049","Washington","DC","38.895911","-77.020998","-5","1"
+"20050","Washington","DC","38.893311","-77.014647","-5","1"
+"20051","Washington","DC","38.893311","-77.014647","-5","1"
+"20052","Washington","DC","38.90014","-77.047899","-5","1"
+"20053","Washington","DC","38.893311","-77.014647","-5","1"
+"20055","Washington","DC","38.901633","-77.020959","-5","1"
+"20056","Washington","DC","38.893311","-77.014647","-5","1"
+"20057","Washington","DC","38.893311","-77.014647","-5","1"
+"20058","Washington","DC","38.893311","-77.014647","-5","1"
+"20059","Washington","DC","38.893311","-77.014647","-5","1"
+"20060","Washington","DC","38.918011","-77.020398","-5","1"
+"20061","Washington","DC","38.893311","-77.014647","-5","1"
+"20062","Washington","DC","38.900009","-77.036948","-5","1"
+"20063","Washington","DC","38.905317","-77.046645","-5","1"
+"20064","Washington","DC","38.933161","-76.996348","-5","1"
+"20065","Washington","DC","38.883412","-77.028198","-5","1"
+"20066","Washington","DC","38.893311","-77.014647","-5","1"
+"20067","Washington","DC","38.893311","-77.014647","-5","1"
+"20068","Washington","DC","38.893311","-77.014647","-5","1"
+"20069","Washington","DC","38.893311","-77.014647","-5","1"
+"20070","Washington","DC","38.893311","-77.014647","-5","1"
+"20071","Washington","DC","38.893311","-77.014647","-5","1"
+"20073","Washington","DC","38.897011","-77.025098","-5","1"
+"20074","Washington","DC","38.893311","-77.014647","-5","1"
+"20075","Washington","DC","38.893311","-77.014647","-5","1"
+"20076","Washington","DC","38.893311","-77.014647","-5","1"
+"20077","Washington","DC","38.893311","-77.014647","-5","1"
+"20078","Washington","DC","38.893311","-77.014647","-5","1"
+"20080","Washington","DC","38.893311","-77.014647","-5","1"
+"20081","Washington","DC","38.893311","-77.014647","-5","1"
+"20082","Washington","DC","38.893311","-77.014647","-5","1"
+"20088","Washington","DC","38.893311","-77.014647","-5","1"
+"20090","Washington","DC","38.893311","-77.014647","-5","1"
+"20091","Washington","DC","38.893311","-77.014647","-5","1"
+"20097","Washington","DC","38.893311","-77.014647","-5","1"
+"20098","Washington","DC","38.893311","-77.014647","-5","1"
+"20099","Washington","DC","38.893311","-77.014647","-5","1"
+"20101","Dulles","VA","39.002125","-77.442066","-5","1"
+"20102","Dulles","VA","39.085309","-77.645224","-5","1"
+"20103","Dulles","VA","38.996242","-77.449952","-5","1"
+"20104","Dulles","VA","39.085309","-77.645224","-5","1"
+"20105","Aldie","VA","38.964054","-77.60878","-5","1"
+"20106","Amissville","VA","38.683116","-77.99031","-5","1"
+"20107","Arcola","VA","38.968321","-77.533263","-5","1"
+"20108","Manassas","VA","38.744685","-77.487162","-5","1"
+"20109","Manassas","VA","38.790202","-77.51294","-5","1"
+"20110","Manassas","VA","38.752269","-77.47694","-5","1"
+"20111","Manassas","VA","38.769697","-77.44915","-5","1"
+"20112","Manassas","VA","38.685117","-77.44796","-5","1"
+"20113","Manassas","VA","38.770864","-77.449443","-5","1"
+"20115","Marshall","VA","38.855848","-77.88174","-5","1"
+"20116","Marshall","VA","38.853723","-77.860127","-5","1"
+"20117","Middleburg","VA","38.983902","-77.74903","-5","1"
+"20118","Middleburg","VA","38.953454","-77.74996","-5","1"
+"20119","Catlett","VA","38.639283","-77.63866","-5","1"
+"20120","Centreville","VA","38.851221","-77.44998","-5","1"
+"20121","Centreville","VA","38.82571","-77.43964","-5","1"
+"20122","Centreville","VA","38.831813","-77.288755","-5","1"
+"20124","Clifton","VA","38.797424","-77.39237","-5","1"
+"20128","Orlean","VA","38.741639","-77.977432","-5","1"
+"20129","Paeonian Springs","VA","39.149032","-77.61471","-5","1"
+"20130","Paris","VA","39.008532","-77.94907","-5","1"
+"20131","Philomont","VA","39.057952","-77.743423","-5","1"
+"20132","Purcellville","VA","39.146479","-77.72798","-5","1"
+"20134","Purcellville","VA","39.152187","-77.702576","-5","1"
+"20135","Bluemont","VA","39.080229","-77.87192","-5","1"
+"20136","Bristow","VA","38.7475","-77.56917","-5","1"
+"20137","Broad Run","VA","38.810629","-77.7057","-5","1"
+"20138","Calverton","VA","38.630238","-77.67295","-5","1"
+"20139","Casanova","VA","38.651558","-77.70361","-5","1"
+"20140","Rectortown","VA","38.918124","-77.87243","-5","1"
+"20141","Round Hill","VA","39.119917","-77.77328","-5","1"
+"20142","Round Hill","VA","39.130665","-77.774665","-5","1"
+"20143","Catharpin","VA","38.858613","-77.56391","-5","1"
+"20144","Delaplane","VA","38.918435","-77.9255","-5","1"
+"20146","Ashburn","VA","39.085309","-77.645224","-5","1"
+"20147","Ashburn","VA","39.041978","-77.49064","-5","1"
+"20148","Ashburn","VA","39.020637","-77.52276","-5","1"
+"20149","Ashburn","VA","39.085309","-77.645224","-5","1"
+"20151","Chantilly","VA","38.889111","-77.4363","-5","1"
+"20152","Chantilly","VA","38.90371","-77.5038","-5","1"
+"20153","Chantilly","VA","38.831813","-77.288755","-5","1"
+"20155","Gainesville","VA","38.803732","-77.62404","-5","1"
+"20156","Gainesville","VA","38.721912","-77.466897","-5","1"
+"20158","Hamilton","VA","39.137667","-77.66186","-5","1"
+"20159","Hamilton","VA","39.133855","-77.662072","-5","1"
+"20160","Lincoln","VA","39.098479","-77.688338","-5","1"
+"20163","Sterling","VA","39.085309","-77.645224","-5","1"
+"20164","Sterling","VA","39.011909","-77.39295","-5","1"
+"20165","Sterling","VA","39.044855","-77.38701","-5","1"
+"20166","Sterling","VA","39.004276","-77.43442","-5","1"
+"20167","Sterling","VA","39.085309","-77.645224","-5","1"
+"20168","Haymarket","VA","38.721912","-77.466897","-5","1"
+"20169","Haymarket","VA","38.860551","-77.64947","-5","1"
+"20170","Herndon","VA","38.977109","-77.38527","-5","1"
+"20171","Herndon","VA","38.931479","-77.40085","-5","1"
+"20172","Herndon","VA","38.831813","-77.288755","-5","1"
+"20175","Leesburg","VA","39.080037","-77.58025","-5","1"
+"20176","Leesburg","VA","39.138978","-77.54519","-5","1"
+"20177","Leesburg","VA","39.158095","-77.666863","-5","1"
+"20178","Leesburg","VA","39.072918","-77.608014","-5","1"
+"20180","Lovettsville","VA","39.261906","-77.64239","-5","1"
+"20181","Nokesville","VA","38.69835","-77.57365","-5","1"
+"20182","Nokesville","VA","38.700866","-77.585708","-5","1"
+"20184","Upperville","VA","38.997904","-77.87487","-5","1"
+"20185","Upperville","VA","38.992978","-77.879855","-5","1"
+"20186","Warrenton","VA","38.707135","-77.8145","-5","1"
+"20187","Warrenton","VA","38.735202","-77.73717","-5","1"
+"20188","Warrenton","VA","38.765619","-77.820293","-5","1"
+"20190","Reston","VA","38.959673","-77.3462","-5","1"
+"20191","Reston","VA","38.934709","-77.3469","-5","1"
+"20192","Herndon","VA","38.831813","-77.288755","-5","1"
+"20193","Reston","VA","38.831813","-77.288755","-5","1"
+"20194","Reston","VA","38.977362","-77.34658","-5","1"
+"20195","Reston","VA","38.831813","-77.288755","-5","1"
+"20196","Reston","VA","38.831813","-77.288755","-5","1"
+"20197","Waterford","VA","39.191333","-77.63118","-5","1"
+"20198","The Plains","VA","38.889848","-77.75907","-5","1"
+"20199","Dulles","VA","39.085309","-77.645224","-5","1"
+"20201","Washington","DC","38.893311","-77.014647","-5","1"
+"20202","Washington","DC","38.893311","-77.014647","-5","1"
+"20203","Washington","DC","38.905317","-77.046645","-5","1"
+"20204","Washington","DC","38.893311","-77.014647","-5","1"
+"20206","Washington","DC","38.893311","-77.014647","-5","1"
+"20207","Washington","DC","38.893311","-77.014647","-5","1"
+"20208","Washington","DC","38.896611","-77.011748","-5","1"
+"20210","Washington","DC","38.893311","-77.014647","-5","1"
+"20211","Washington","DC","38.893311","-77.014647","-5","1"
+"20212","Washington","DC","38.893311","-77.014647","-5","1"
+"20213","Washington","DC","38.893311","-77.014647","-5","1"
+"20214","Washington","DC","38.893311","-77.014647","-5","1"
+"20215","Washington","DC","38.893311","-77.014647","-5","1"
+"20216","Washington","DC","38.891911","-77.014098","-5","1"
+"20217","Washington","DC","38.893311","-77.014647","-5","1"
+"20218","Washington","DC","38.893311","-77.014647","-5","1"
+"20219","Washington","DC","38.893311","-77.014647","-5","1"
+"20220","Washington","DC","38.893311","-77.014647","-5","1"
+"20221","Washington","DC","38.893311","-77.014647","-5","1"
+"20222","Washington","DC","38.893311","-77.014647","-5","1"
+"20223","Washington","DC","38.893311","-77.014647","-5","1"
+"20224","Washington","DC","38.893311","-77.014647","-5","1"
+"20226","Washington","DC","38.893311","-77.014647","-5","1"
+"20227","Washington","DC","38.893311","-77.014647","-5","1"
+"20228","Washington","DC","38.893311","-77.014647","-5","1"
+"20229","Washington","DC","38.893311","-77.014647","-5","1"
+"20230","Washington","DC","38.893311","-77.014647","-5","1"
+"20231","Washington","DC","38.893311","-77.014647","-5","1"
+"20232","Washington","DC","38.900561","-77.039099","-5","1"
+"20233","Washington","DC","38.893311","-77.014647","-5","1"
+"20235","Washington","DC","38.915361","-77.057199","-5","1"
+"20238","Washington","DC","38.893311","-77.014647","-5","1"
+"20239","Washington","DC","38.893311","-77.014647","-5","1"
+"20240","Washington","DC","38.897143","-77.040895","-5","1"
+"20241","Washington","DC","38.893311","-77.014647","-5","1"
+"20242","Washington","DC","38.867812","-77.028948","-5","1"
+"20244","Washington","DC","38.893311","-77.014647","-5","1"
+"20245","Washington","DC","38.893311","-77.014647","-5","1"
+"20250","Washington","DC","38.887323","-77.03274","-5","1"
+"20251","Washington","DC","38.893311","-77.014647","-5","1"
+"20254","Washington","DC","38.893311","-77.014647","-5","1"
+"20260","Washington","DC","38.893311","-77.014647","-5","1"
+"20261","Washington","DC","38.893311","-77.014647","-5","1"
+"20262","Washington","DC","38.893311","-77.014647","-5","1"
+"20265","Washington","DC","38.893311","-77.014647","-5","1"
+"20266","Washington","DC","38.893311","-77.014647","-5","1"
+"20268","Washington","DC","38.893311","-77.014647","-5","1"
+"20270","Washington","DC","38.893311","-77.014647","-5","1"
+"20277","Washington","DC","38.893311","-77.014647","-5","1"
+"20289","Washington","DC","38.893311","-77.014647","-5","1"
+"20299","Washington","DC","38.893311","-77.014647","-5","1"
+"20301","Washington","DC","38.889357","-77.031113","-5","1"
+"20303","Washington","DC","38.893311","-77.014647","-5","1"
+"20306","Washington","DC","38.893311","-77.014647","-5","1"
+"20307","Washington","DC","38.893311","-77.014647","-5","1"
+"20310","Washington","DC","38.893311","-77.014647","-5","1"
+"20314","Washington","DC","38.893311","-77.014647","-5","1"
+"20315","Washington","DC","38.928861","-77.017948","-5","1"
+"20317","Washington","DC","38.931161","-77.010298","-5","1"
+"20318","Washington","DC","38.893311","-77.014647","-5","1"
+"20319","Washington","DC","38.866924","-77.01424","-5","1"
+"20330","Washington","DC","38.893311","-77.014647","-5","1"
+"20332","Washington","DC","38.829932","-77.0176","-5","1"
+"20336","Washington","DC","38.847768","-77.01299","-5","1"
+"20337","Washington","DC","38.893311","-77.014647","-5","1"
+"20338","Washington","DC","38.893311","-77.014647","-5","1"
+"20340","Washington","DC","38.893311","-77.014647","-5","1"
+"20350","Washington","DC","38.893311","-77.014647","-5","1"
+"20370","Washington","DC","38.893311","-77.014647","-5","1"
+"20372","Washington","DC","38.893311","-77.014647","-5","1"
+"20373","Washington","DC","38.893311","-77.014647","-5","1"
+"20374","Washington","DC","38.855522","-77.002197","-5","1"
+"20375","Washington","DC","38.822713","-77.02322","-5","1"
+"20380","Washington","DC","38.893311","-77.014647","-5","1"
+"20388","Washington","DC","38.872553","-76.996605","-5","1"
+"20389","Washington","DC","38.893311","-77.014647","-5","1"
+"20390","Washington","DC","38.893311","-77.014647","-5","1"
+"20391","Washington","DC","38.893311","-77.014647","-5","1"
+"20392","Washington","DC","38.893311","-77.014647","-5","1"
+"20393","Washington","DC","38.893311","-77.014647","-5","1"
+"20394","Washington","DC","38.893311","-77.014647","-5","1"
+"20395","Washington","DC","38.893311","-77.014647","-5","1"
+"20398","Washington","DC","38.893311","-77.014647","-5","1"
+"20401","Washington","DC","38.893311","-77.014647","-5","1"
+"20402","Washington","DC","38.893311","-77.014647","-5","1"
+"20403","Washington","DC","38.893311","-77.014647","-5","1"
+"20404","Washington","DC","38.899161","-77.008948","-5","1"
+"20405","Washington","DC","38.893311","-77.014647","-5","1"
+"20406","Washington","DC","38.893311","-77.014647","-5","1"
+"20407","Washington","DC","38.893311","-77.014647","-5","1"
+"20408","Washington","DC","38.893311","-77.014647","-5","1"
+"20409","Washington","DC","38.893311","-77.014647","-5","1"
+"20410","Washington","DC","38.893311","-77.014647","-5","1"
+"20411","Washington","DC","38.883962","-77.022098","-5","1"
+"20412","Washington","DC","38.895261","-77.022098","-5","1"
+"20413","Washington","DC","38.893311","-77.014647","-5","1"
+"20414","Washington","DC","38.883962","-77.022098","-5","1"
+"20415","Washington","DC","38.893311","-77.014647","-5","1"
+"20416","Washington","DC","38.893311","-77.014647","-5","1"
+"20418","Washington","DC","38.904253","-77.05723","-5","1"
+"20419","Washington","DC","38.893311","-77.014647","-5","1"
+"20420","Washington","DC","38.903461","-77.027648","-5","1"
+"20421","Washington","DC","38.893311","-77.014647","-5","1"
+"20422","Washington","DC","38.893311","-77.014647","-5","1"
+"20423","Washington","DC","38.893311","-77.014647","-5","1"
+"20424","Washington","DC","38.893311","-77.014647","-5","1"
+"20425","Washington","DC","38.893311","-77.014647","-5","1"
+"20426","Washington","DC","38.893311","-77.014647","-5","1"
+"20427","Washington","DC","38.893311","-77.014647","-5","1"
+"20428","Washington","DC","38.893311","-77.014647","-5","1"
+"20429","Washington","DC","38.893311","-77.014647","-5","1"
+"20431","Washington","DC","38.898618","-77.042753","-5","1"
+"20433","Washington","DC","38.899996","-77.041976","-5","1"
+"20434","Washington","DC","38.893311","-77.014647","-5","1"
+"20435","Washington","DC","38.899399","-77.040319","-5","1"
+"20436","Washington","DC","38.895927","-77.021068","-5","1"
+"20437","Washington","DC","38.902761","-77.048499","-5","1"
+"20439","Washington","DC","38.893311","-77.014647","-5","1"
+"20440","Washington","DC","38.913911","-77.045349","-5","1"
+"20441","Washington","DC","38.923861","-77.036349","-5","1"
+"20442","Washington","DC","38.895977","-77.017668","-5","1"
+"20444","Washington","DC","38.893311","-77.014647","-5","1"
+"20447","Washington","DC","38.884712","-77.025198","-5","1"
+"20451","Washington","DC","38.897711","-77.044449","-5","1"
+"20453","Washington","DC","38.893311","-77.014647","-5","1"
+"20456","Washington","DC","38.898111","-77.040149","-5","1"
+"20460","Washington","DC","38.876362","-77.018798","-5","1"
+"20463","Washington","DC","38.893311","-77.014647","-5","1"
+"20468","Washington","DC","38.893311","-77.014647","-5","1"
+"20469","Washington","DC","38.893311","-77.014647","-5","1"
+"20470","Washington","DC","38.893311","-77.014647","-5","1"
+"20472","Washington","DC","38.893311","-77.014647","-5","1"
+"20500","Washington","DC","38.894781","-77.036122","-5","1"
+"20501","Washington","DC","38.89872","-77.036198","-5","1"
+"20502","Washington","DC","38.89872","-77.036198","-5","1"
+"20503","Washington","DC","38.900711","-77.043068","-5","1"
+"20504","Washington","DC","38.893311","-77.014647","-5","1"
+"20505","Washington","DC","38.893311","-77.014647","-5","1"
+"20506","Washington","DC","38.899364","-77.037668","-5","1"
+"20507","Washington","DC","38.893311","-77.014647","-5","1"
+"20508","Washington","DC","38.893311","-77.014647","-5","1"
+"20510","Washington","DC","38.893311","-77.014647","-5","1"
+"20515","Washington","DC","38.893311","-77.014647","-5","1"
+"20520","Washington","DC","38.893217","-77.048957","-5","1"
+"20521","Washington","DC","38.893311","-77.014647","-5","1"
+"20522","Washington","DC","38.893217","-77.048957","-5","1"
+"20523","Washington","DC","38.89449","-77.047807","-5","1"
+"20524","Washington","DC","38.902414","-77.032601","-5","1"
+"20525","Washington","DC","38.893311","-77.014647","-5","1"
+"20526","Washington","DC","38.902217","-77.043738","-5","1"
+"20527","Washington","DC","38.902933","-77.036091","-5","1"
+"20530","Washington","DC","38.897561","-77.026998","-5","1"
+"20531","Washington","DC","38.893761","-77.021848","-5","1"
+"20532","Washington","DC","38.904486","-77.017291","-5","1"
+"20533","Washington","DC","38.901102","-77.032591","-5","1"
+"20534","Washington","DC","38.894075","-77.01254","-5","1"
+"20535","Washington","DC","38.894097","-77.025133","-5","1"
+"20536","Washington","DC","38.901211","-77.016948","-5","1"
+"20537","Washington","DC","38.894097","-77.025133","-5","1"
+"20538","Washington","DC","38.893311","-77.014647","-5","1"
+"20539","Washington","DC","38.893311","-77.014647","-5","1"
+"20540","Washington","DC","38.887405","-77.004663","-5","1"
+"20541","Washington","DC","38.887405","-77.004663","-5","1"
+"20542","Washington","DC","38.940761","-77.028348","-5","1"
+"20543","Washington","DC","38.893311","-77.014647","-5","1"
+"20544","Washington","DC","38.893311","-77.014647","-5","1"
+"20546","Washington","DC","38.890976","-77.021092","-5","1"
+"20547","Washington","DC","38.893311","-77.014647","-5","1"
+"20548","Washington","DC","38.898111","-77.017698","-5","1"
+"20549","Washington","DC","38.893311","-77.014647","-5","1"
+"20550","Washington","DC","38.893311","-77.014647","-5","1"
+"20551","Washington","DC","38.891995","-77.045219","-5","1"
+"20552","Washington","DC","38.893311","-77.014647","-5","1"
+"20553","Washington","DC","38.887333","-77.023118","-5","1"
+"20554","Washington","DC","38.893311","-77.014647","-5","1"
+"20555","Washington","DC","38.900011","-77.040149","-5","1"
+"20557","Washington","DC","38.887405","-77.004663","-5","1"
+"20558","Washington","DC","38.893311","-77.014647","-5","1"
+"20559","Washington","DC","38.887405","-77.004663","-5","1"
+"20560","Washington","DC","38.893311","-77.014647","-5","1"
+"20565","Washington","DC","38.891941","-77.018853","-5","1"
+"20566","Washington","DC","38.897074","-77.05535","-5","1"
+"20570","Washington","DC","38.899061","-77.040149","-5","1"
+"20571","Washington","DC","38.900559","-77.034554","-5","1"
+"20572","Washington","DC","38.893311","-77.014647","-5","1"
+"20573","Washington","DC","38.893311","-77.014647","-5","1"
+"20575","Washington","DC","38.893311","-77.014647","-5","1"
+"20576","Washington","DC","38.893662","-77.023592","-5","1"
+"20577","Washington","DC","38.900758","-77.034455","-5","1"
+"20578","Washington","DC","38.893311","-77.014647","-5","1"
+"20579","Washington","DC","38.904311","-77.044649","-5","1"
+"20580","Washington","DC","38.893311","-77.014647","-5","1"
+"20581","Washington","DC","38.893311","-77.014647","-5","1"
+"20585","Washington","DC","38.893311","-77.014647","-5","1"
+"20586","Washington","DC","38.902211","-77.047399","-5","1"
+"20590","Washington","DC","38.883962","-77.022098","-5","1"
+"20591","Washington","DC","38.893311","-77.014647","-5","1"
+"20593","Washington","DC","38.893311","-77.014647","-5","1"
+"20594","Washington","DC","38.88494","-77.018372","-5","1"
+"20597","Washington","DC","38.893311","-77.014647","-5","1"
+"20599","Washington","DC","38.893311","-77.014647","-5","1"
+"20601","Waldorf","MD","38.634306","-76.86008","-5","1"
+"20602","Waldorf","MD","38.598185","-76.90381","-5","1"
+"20603","Waldorf","MD","38.631542","-76.95723","-5","1"
+"20604","Waldorf","MD","38.509548","-76.981651","-5","1"
+"20606","Abell","MD","38.250996","-76.73974","-5","1"
+"20607","Accokeek","MD","38.672216","-77.01807","-5","1"
+"20608","Aquasco","MD","38.564649","-76.69229","-5","1"
+"20609","Avenue","MD","38.268558","-76.75084","-5","1"
+"20610","Barstow","MD","38.444727","-76.533026","-5","1"
+"20611","Bel Alton","MD","38.463289","-76.9858","-5","1"
+"20612","Benedict","MD","38.511147","-76.67864","-5","1"
+"20613","Brandywine","MD","38.676968","-76.82215","-5","1"
+"20615","Broomes Island","MD","38.416782","-76.54814","-5","1"
+"20616","Bryans Road","MD","38.639117","-77.08301","-5","1"
+"20617","Bryantown","MD","38.55223","-76.84477","-5","1"
+"20618","Bushwood","MD","38.270124","-76.79155","-5","1"
+"20619","California","MD","38.303103","-76.52231","-5","1"
+"20620","Callaway","MD","38.226406","-76.51759","-5","1"
+"20621","Chaptico","MD","38.330254","-76.80782","-5","1"
+"20622","Charlotte Hall","MD","38.458322","-76.83947","-5","1"
+"20623","Cheltenham","MD","38.748872","-76.83075","-5","1"
+"20624","Clements","MD","38.330096","-76.73113","-5","1"
+"20625","Cobb Island","MD","38.262468","-76.84951","-5","1"
+"20626","Coltons Point","MD","38.229113","-76.75829","-5","1"
+"20627","Compton","MD","38.276828","-76.703971","-5","1"
+"20628","Dameron","MD","38.135718","-76.33865","-5","1"
+"20629","Dowell","MD","38.334336","-76.4534","-5","1"
+"20630","Drayden","MD","38.171834","-76.47437","-5","1"
+"20632","Faulkner","MD","38.421787","-76.96182","-5","1"
+"20634","Great Mills","MD","38.260846","-76.4985","-5","1"
+"20635","Helen","MD","38.312112","-76.607676","-5","1"
+"20636","Hollywood","MD","38.349517","-76.54839","-5","1"
+"20637","Hughesville","MD","38.523408","-76.75435","-5","1"
+"20639","Huntingtown","MD","38.601648","-76.60434","-5","1"
+"20640","Indian Head","MD","38.593095","-77.15212","-5","1"
+"20643","Ironsides","MD","38.503876","-77.148283","-5","1"
+"20645","Issue","MD","38.30126","-76.91539","-5","1"
+"20646","La Plata","MD","38.528103","-76.98063","-5","1"
+"20650","Leonardtown","MD","38.269283","-76.64336","-5","1"
+"20653","Lexington Park","MD","38.234838","-76.44889","-5","1"
+"20656","Loveville","MD","38.359274","-76.683325","-5","1"
+"20657","Lusby","MD","38.370044","-76.43328","-5","1"
+"20658","Marbury","MD","38.567465","-77.16779","-5","1"
+"20659","Mechanicsville","MD","38.427328","-76.72826","-5","1"
+"20660","Morganza","MD","38.363994","-76.694102","-5","1"
+"20661","Mount Victoria","MD","38.343591","-76.884559","-5","1"
+"20662","Nanjemoy","MD","38.42029","-77.19479","-5","1"
+"20664","Newburg","MD","38.343729","-76.92493","-5","1"
+"20667","Park Hall","MD","38.2176","-76.4382","-5","1"
+"20670","Patuxent River","MD","38.268636","-76.42383","-5","1"
+"20674","Piney Point","MD","38.127843","-76.49055","-5","1"
+"20675","Pomfret","MD","38.58215","-77.01739","-5","1"
+"20676","Port Republic","MD","38.489163","-76.52937","-5","1"
+"20677","Port Tobacco","MD","38.501493","-77.03169","-5","1"
+"20678","Prince Frederick","MD","38.535116","-76.58432","-5","1"
+"20680","Ridge","MD","38.112419","-76.36964","-5","1"
+"20682","Rock Point","MD","38.283551","-76.848093","-5","1"
+"20684","Saint Inigoes","MD","38.151666","-76.40512","-5","1"
+"20685","Saint Leonard","MD","38.448869","-76.49776","-5","1"
+"20686","Saint Marys City","MD","38.188796","-76.420738","-5","1"
+"20687","Scotland","MD","38.064947","-76.3444","-5","1"
+"20688","Solomons","MD","38.339176","-76.46568","-5","1"
+"20689","Sunderland","MD","38.668765","-76.58648","-5","1"
+"20690","Tall Timbers","MD","38.165432","-76.53284","-5","1"
+"20692","Valley Lee","MD","38.179764","-76.50185","-5","1"
+"20693","Welcome","MD","38.451267","-77.08955","-5","1"
+"20695","White Plains","MD","38.593202","-76.97063","-5","1"
+"20697","Southern Md Facility","MD","38.833563","-76.877743","-5","1"
+"20701","Annapolis Junction","MD","39.127708","-76.7923","-5","1"
+"20703","Lanham","MD","38.833563","-76.877743","-5","1"
+"20704","Beltsville","MD","38.833563","-76.877743","-5","1"
+"20705","Beltsville","MD","39.044509","-76.9133","-5","1"
+"20706","Lanham","MD","38.964093","-76.85331","-5","1"
+"20707","Laurel","MD","39.098475","-76.86571","-5","1"
+"20708","Laurel","MD","39.0632","-76.84103","-5","1"
+"20709","Laurel","MD","38.833563","-76.877743","-5","1"
+"20710","Bladensburg","MD","38.941428","-76.93005","-5","1"
+"20711","Lothian","MD","38.80884","-76.67236","-5","1"
+"20712","Mount Rainier","MD","38.941594","-76.96369","-5","1"
+"20714","North Beach","MD","38.711264","-76.53637","-5","1"
+"20715","Bowie","MD","38.979413","-76.74382","-5","1"
+"20716","Bowie","MD","38.93193","-76.72457","-5","1"
+"20717","Bowie","MD","38.833563","-76.877743","-5","1"
+"20718","Bowie","MD","38.833563","-76.877743","-5","1"
+"20719","Bowie","MD","38.833563","-76.877743","-5","1"
+"20720","Bowie","MD","38.986699","-76.78612","-5","1"
+"20721","Bowie","MD","38.917506","-76.79404","-5","1"
+"20722","Brentwood","MD","38.939716","-76.95203","-5","1"
+"20723","Laurel","MD","39.134062","-76.8579","-5","1"
+"20724","Laurel","MD","39.101646","-76.80334","-5","1"
+"20725","Laurel","MD","38.833563","-76.877743","-5","1"
+"20726","Laurel","MD","38.833563","-76.877743","-5","1"
+"20731","Capitol Heights","MD","38.833563","-76.877743","-5","1"
+"20732","Chesapeake Beach","MD","38.670858","-76.53652","-5","1"
+"20733","Churchton","MD","38.801516","-76.52469","-5","1"
+"20735","Clinton","MD","38.753264","-76.89913","-5","1"
+"20736","Owings","MD","38.694074","-76.61793","-5","1"
+"20737","Riverdale","MD","38.96146","-76.92056","-5","1"
+"20738","Riverdale","MD","38.833563","-76.877743","-5","1"
+"20740","College Park","MD","38.99756","-76.92577","-5","1"
+"20741","College Park","MD","38.833563","-76.877743","-5","1"
+"20742","College Park","MD","38.833563","-76.877743","-5","1"
+"20743","Capitol Heights","MD","38.886812","-76.90645","-5","1"
+"20744","Fort Washington","MD","38.756347","-76.99034","-5","1"
+"20745","Oxon Hill","MD","38.80758","-76.99193","-5","1"
+"20746","Suitland","MD","38.839663","-76.91478","-5","1"
+"20747","District Heights","MD","38.855479","-76.88621","-5","1"
+"20748","Temple Hills","MD","38.822163","-76.93974","-5","1"
+"20749","Fort Washington","MD","38.833563","-76.877743","-5","1"
+"20750","Oxon Hill","MD","38.833563","-76.877743","-5","1"
+"20751","Deale","MD","38.786949","-76.55335","-5","1"
+"20752","Suitland","MD","38.833563","-76.877743","-5","1"
+"20753","District Heights","MD","38.833563","-76.877743","-5","1"
+"20754","Dunkirk","MD","38.746123","-76.65117","-5","1"
+"20755","Fort George G Meade","MD","39.105015","-76.74126","-5","1"
+"20757","Temple Hills","MD","38.833563","-76.877743","-5","1"
+"20758","Friendship","MD","38.731822","-76.59378","-5","1"
+"20759","Fulton","MD","39.147257","-76.93799","-5","1"
+"20762","Andrews Air Force Base","MD","38.820546","-76.88334","-5","1"
+"20763","Savage","MD","39.137307","-76.82335","-5","1"
+"20764","Shady Side","MD","38.839015","-76.5114","-5","1"
+"20765","Galesville","MD","38.844097","-76.54795","-5","1"
+"20768","Greenbelt","MD","38.833563","-76.877743","-5","1"
+"20769","Glenn Dale","MD","38.984107","-76.81544","-5","1"
+"20770","Greenbelt","MD","39.00391","-76.88005","-5","1"
+"20771","Greenbelt","MD","38.833563","-76.877743","-5","1"
+"20772","Upper Marlboro","MD","38.792281","-76.781","-5","1"
+"20773","Upper Marlboro","MD","38.833563","-76.877743","-5","1"
+"20774","Upper Marlboro","MD","38.892456","-76.80685","-5","1"
+"20775","Upper Marlboro","MD","38.833563","-76.877743","-5","1"
+"20776","Harwood","MD","38.86313","-76.61917","-5","1"
+"20777","Highland","MD","39.173104","-76.95779","-5","1"
+"20778","West River","MD","38.832265","-76.55604","-5","1"
+"20779","Tracys Landing","MD","38.759196","-76.57076","-5","1"
+"20781","Hyattsville","MD","38.946746","-76.9356","-5","1"
+"20782","Hyattsville","MD","38.96401","-76.96139","-5","1"
+"20783","Hyattsville","MD","38.98941","-76.97294","-5","1"
+"20784","Hyattsville","MD","38.950528","-76.8888","-5","1"
+"20785","Hyattsville","MD","38.920111","-76.889","-5","1"
+"20787","Hyattsville","MD","38.98707","-76.982405","-5","1"
+"20788","Hyattsville","MD","38.969434","-76.950913","-5","1"
+"20790","Capitol Heights","MD","38.833563","-76.877743","-5","1"
+"20791","Capitol Heights","MD","38.833563","-76.877743","-5","1"
+"20794","Jessup","MD","39.144807","-76.78767","-5","1"
+"20797","Southern Md Facility","MD","38.833563","-76.877743","-5","1"
+"20799","Capitol Heights","MD","38.833563","-76.877743","-5","1"
+"20812","Glen Echo","MD","38.97026","-77.1442","-5","1"
+"20813","Bethesda","MD","39.143979","-77.207617","-5","1"
+"20814","Bethesda","MD","38.999759","-77.10185","-5","1"
+"20815","Chevy Chase","MD","38.97986","-77.08079","-5","1"
+"20816","Bethesda","MD","38.958377","-77.11425","-5","1"
+"20817","Bethesda","MD","38.996842","-77.13519","-5","1"
+"20818","Cabin John","MD","38.97511","-77.15928","-5","1"
+"20824","Bethesda","MD","39.143979","-77.207617","-5","1"
+"20825","Chevy Chase","MD","39.143979","-77.207617","-5","1"
+"20827","Bethesda","MD","39.143979","-77.207617","-5","1"
+"20830","Olney","MD","39.15522","-77.066745","-5","1"
+"20831","Chesapeake Beach","MD","38.698833","-76.536276","-5","1"
+"20832","Olney","MD","39.155449","-77.07487","-5","1"
+"20833","Brookeville","MD","39.183221","-77.05917","-5","1"
+"20837","Poolesville","MD","39.128854","-77.40763","-5","1"
+"20838","Barnesville","MD","39.221975","-77.37781","-5","1"
+"20839","Beallsville","MD","39.1672","-77.41411","-5","1"
+"20841","Boyds","MD","39.194497","-77.321","-5","1"
+"20842","Dickerson","MD","39.22086","-77.41699","-5","1"
+"20847","Rockville","MD","39.143979","-77.207617","-5","1"
+"20848","Rockville","MD","39.143979","-77.207617","-5","1"
+"20849","Rockville","MD","39.143979","-77.207617","-5","1"
+"20850","Rockville","MD","39.093408","-77.1718","-5","1"
+"20851","Rockville","MD","39.076608","-77.1232","-5","1"
+"20852","Rockville","MD","39.0509","-77.12261","-5","1"
+"20853","Rockville","MD","39.087409","-77.0944","-5","1"
+"20854","Potomac","MD","39.035028","-77.19995","-5","1"
+"20855","Derwood","MD","39.131705","-77.14981","-5","1"
+"20857","Rockville","MD","39.143979","-77.207617","-5","1"
+"20859","Potomac","MD","39.143979","-77.207617","-5","1"
+"20860","Sandy Spring","MD","39.15283","-77.03494","-5","1"
+"20861","Ashton","MD","39.14827","-76.99859","-5","1"
+"20862","Brinklow","MD","39.184019","-77.01708","-5","1"
+"20866","Burtonsville","MD","39.097243","-76.93467","-5","1"
+"20868","Spencerville","MD","39.127028","-76.96372","-5","1"
+"20871","Clarksburg","MD","39.262598","-77.29125","-5","1"
+"20872","Damascus","MD","39.284185","-77.22752","-5","1"
+"20874","Germantown","MD","39.169859","-77.27564","-5","1"
+"20875","Germantown","MD","39.143979","-77.207617","-5","1"
+"20876","Germantown","MD","39.191769","-77.24329","-5","1"
+"20877","Gaithersburg","MD","39.13975","-77.18568","-5","1"
+"20878","Gaithersburg","MD","39.11755","-77.23548","-5","1"
+"20879","Gaithersburg","MD","39.168656","-77.18716","-5","1"
+"20880","Washington Grove","MD","39.139535","-77.17592","-5","1"
+"20882","Gaithersburg","MD","39.229652","-77.1594","-5","1"
+"20884","Gaithersburg","MD","39.143979","-77.207617","-5","1"
+"20885","Gaithersburg","MD","39.187421","-77.202798","-5","1"
+"20886","Montgomery Village","MD","39.178737","-77.19564","-5","1"
+"20889","Bethesda","MD","39.143979","-77.207617","-5","1"
+"20891","Kensington","MD","39.143979","-77.207617","-5","1"
+"20892","Bethesda","MD","39.002375","-77.10341","-5","1"
+"20894","Bethesda","MD","39.143979","-77.207617","-5","1"
+"20895","Kensington","MD","39.027259","-77.07745","-5","1"
+"20896","Garrett Park","MD","39.035276","-77.09263","-5","1"
+"20897","Suburb Maryland Fac","MD","39.143979","-77.207617","-5","1"
+"20898","Gaithersburg","MD","39.143979","-77.207617","-5","1"
+"20899","Gaithersburg","MD","39.140324","-77.221984","-5","1"
+"20901","Silver Spring","MD","39.020359","-77.0115","-5","1"
+"20902","Silver Spring","MD","39.040759","-77.04876","-5","1"
+"20903","Silver Spring","MD","39.014009","-76.98199","-5","1"
+"20904","Silver Spring","MD","39.069108","-76.97834","-5","1"
+"20905","Silver Spring","MD","39.104509","-76.99374","-5","1"
+"20906","Silver Spring","MD","39.07737","-77.06433","-5","1"
+"20907","Silver Spring","MD","39.143979","-77.207617","-5","1"
+"20908","Silver Spring","MD","39.143979","-77.207617","-5","1"
+"20910","Silver Spring","MD","38.999992","-77.03404","-5","1"
+"20911","Silver Spring","MD","39.143979","-77.207617","-5","1"
+"20912","Takoma Park","MD","38.98236","-77.00044","-5","1"
+"20913","Takoma Park","MD","38.833563","-76.877743","-5","1"
+"20914","Silver Spring","MD","39.143979","-77.207617","-5","1"
+"20915","Silver Spring","MD","39.143979","-77.207617","-5","1"
+"20916","Silver Spring","MD","39.143979","-77.207617","-5","1"
+"20918","Silver Spring","MD","39.143979","-77.207617","-5","1"
+"20997","Silver Spring","MD","39.143979","-77.207617","-5","1"
+"21001","Aberdeen","MD","39.508177","-76.18066","-5","1"
+"21002","Perryman","MD","39.487519","-76.199871","-5","1"
+"21004","Bel Air South","MD","39.539458","-76.326363","-5","1"
+"21005","Aberdeen Proving Ground","MD","39.473451","-76.14083","-5","1"
+"21009","Abingdon","MD","39.473899","-76.2983","-5","1"
+"21010","Gunpowder","MD","39.344808","-76.27313","-5","1"
+"21012","Arnold","MD","39.049377","-76.49892","-5","1"
+"21013","Baldwin","MD","39.508739","-76.49191","-5","1"
+"21014","Bel Air","MD","39.536057","-76.34957","-5","1"
+"21015","Bel Air","MD","39.532212","-76.30754","-5","1"
+"21017","Belcamp","MD","39.476018","-76.24355","-5","1"
+"21018","Benson","MD","39.509276","-76.385083","-5","1"
+"21020","Boring","MD","39.521276","-76.804699","-5","1"
+"21022","Brooklandville","MD","39.397861","-76.671742","-5","1"
+"21023","Butler","MD","39.532955","-76.743196","-5","1"
+"21027","Chase","MD","39.438964","-76.592139","-5","1"
+"21028","Churchville","MD","39.559374","-76.24757","-5","1"
+"21029","Clarksville","MD","39.198816","-76.9367","-5","1"
+"21030","Cockeysville","MD","39.477506","-76.64114","-5","1"
+"21031","Hunt Valley","MD","39.487938","-76.65938","-5","1"
+"21032","Crownsville","MD","39.04366","-76.58805","-5","1"
+"21034","Darlington","MD","39.638039","-76.22398","-5","1"
+"21035","Davidsonville","MD","38.931312","-76.65248","-5","1"
+"21036","Dayton","MD","39.24367","-76.99782","-5","1"
+"21037","Edgewater","MD","38.921763","-76.5373","-5","1"
+"21040","Edgewood","MD","39.427058","-76.30183","-5","1"
+"21041","Ellicott City","MD","39.236405","-76.941902","-5","1"
+"21042","Ellicott City","MD","39.276305","-76.86082","-5","1"
+"21043","Ellicott City","MD","39.254356","-76.8006","-5","1"
+"21044","Columbia","MD","39.21536","-76.87823","-5","1"
+"21045","Columbia","MD","39.207523","-76.82527","-5","1"
+"21046","Columbia","MD","39.175004","-76.85319","-5","1"
+"21047","Fallston","MD","39.521572","-76.4258","-5","1"
+"21048","Finksburg","MD","39.506853","-76.90953","-5","1"
+"21050","Forest Hill","MD","39.574606","-76.39022","-5","1"
+"21051","Fork","MD","39.47044","-76.44898","-5","1"
+"21052","Fort Howard","MD","39.206108","-76.44642","-5","1"
+"21053","Freeland","MD","39.70172","-76.71236","-5","1"
+"21054","Gambrills","MD","39.040159","-76.68408","-5","1"
+"21055","Garrison","MD","39.438964","-76.592139","-5","1"
+"21056","Gibson Island","MD","39.07566","-76.4286","-5","1"
+"21057","Glen Arm","MD","39.454943","-76.49718","-5","1"
+"21060","Glen Burnie","MD","39.162225","-76.59444","-5","1"
+"21061","Glen Burnie","MD","39.164158","-76.6306","-5","1"
+"21062","Glen Burnie","MD","38.974203","-76.594942","-5","1"
+"21071","Glyndon","MD","39.472604","-76.81424","-5","1"
+"21074","Hampstead","MD","39.613293","-76.84802","-5","1"
+"21075","Elkridge","MD","39.197119","-76.75178","-5","1"
+"21076","Hanover","MD","39.167708","-76.71706","-5","1"
+"21077","Harmans","MD","39.157958","-76.69854","-5","1"
+"21078","Havre De Grace","MD","39.554644","-76.11118","-5","1"
+"21080","Henryton","MD","39.534703","-77.049302","-5","1"
+"21082","Hydes","MD","39.470274","-76.45964","-5","1"
+"21084","Jarrettsville","MD","39.610405","-76.45569","-5","1"
+"21085","Joppa","MD","39.432273","-76.35578","-5","1"
+"21087","Kingsville","MD","39.444457","-76.40817","-5","1"
+"21088","Lineboro","MD","39.534703","-77.049302","-5","1"
+"21090","Linthicum Heights","MD","39.209529","-76.66177","-5","1"
+"21092","Long Green","MD","39.438964","-76.592139","-5","1"
+"21093","Lutherville Timonium","MD","39.435789","-76.63614","-5","1"
+"21094","Lutherville Timonium","MD","39.438964","-76.592139","-5","1"
+"21098","Hanover","MD","38.974203","-76.594942","-5","1"
+"21102","Manchester","MD","39.685569","-76.8505","-5","1"
+"21104","Marriottsville","MD","39.359754","-76.91103","-5","1"
+"21105","Maryland Line","MD","39.712453","-76.65069","-5","1"
+"21106","Mayo","MD","38.971475","-76.580934","-5","1"
+"21108","Millersville","MD","39.099957","-76.62114","-5","1"
+"21111","Monkton","MD","39.575605","-76.59123","-5","1"
+"21113","Odenton","MD","39.079902","-76.70867","-5","1"
+"21114","Crofton","MD","39.012134","-76.68561","-5","1"
+"21117","Owings Mills","MD","39.419105","-76.78388","-5","1"
+"21120","Parkton","MD","39.656737","-76.66001","-5","1"
+"21122","Pasadena","MD","39.125776","-76.51863","-5","1"
+"21123","Pasadena","MD","38.974203","-76.594942","-5","1"
+"21128","Perry Hall","MD","39.400296","-76.44639","-5","1"
+"21130","Perryman","MD","39.466859","-76.20106","-5","1"
+"21131","Phoenix","MD","39.504706","-76.57112","-5","1"
+"21132","Pylesville","MD","39.696621","-76.42781","-5","1"
+"21133","Randallstown","MD","39.376372","-76.79916","-5","1"
+"21136","Reisterstown","MD","39.470603","-76.81417","-5","1"
+"21139","Riderwood","MD","39.438964","-76.592139","-5","1"
+"21140","Riva","MD","38.952412","-76.58205","-5","1"
+"21144","Severn","MD","39.130224","-76.69142","-5","1"
+"21146","Severna Park","MD","39.079059","-76.55784","-5","1"
+"21150","Simpsonville","MD","39.236405","-76.941902","-5","1"
+"21152","Sparks Glencoe","MD","39.543905","-76.67","-5","1"
+"21153","Stevenson","MD","39.412905","-76.730345","-5","1"
+"21154","Street","MD","39.661905","-76.35166","-5","1"
+"21155","Upperco","MD","39.566103","-76.82125","-5","1"
+"21156","Upper Falls","MD","39.439935","-76.39363","-5","1"
+"21157","Westminster","MD","39.563901","-76.98926","-5","1"
+"21158","Westminster","MD","39.624705","-77.03086","-5","1"
+"21160","Whiteford","MD","39.707377","-76.31864","-5","1"
+"21161","White Hall","MD","39.659671","-76.56859","-5","1"
+"21162","White Marsh","MD","39.387307","-76.41236","-5","1"
+"21163","Woodstock","MD","39.336855","-76.84947","-5","1"
+"21176","New Windsor","MD","39.540072","-77.115045","-5","1"
+"21201","Baltimore","MD","39.295306","-76.62118","-5","1"
+"21202","Baltimore","MD","39.296507","-76.60693","-5","1"
+"21203","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21204","Towson","MD","39.405606","-76.62648","-5","1"
+"21205","Baltimore","MD","39.301157","-76.57478","-5","1"
+"21206","Baltimore","MD","39.341107","-76.54085","-5","1"
+"21207","Gwynn Oak","MD","39.324406","-76.7176","-5","1"
+"21208","Pikesville","MD","39.376879","-76.7287","-5","1"
+"21209","Baltimore","MD","39.368974","-76.66904","-5","1"
+"21210","Baltimore","MD","39.352496","-76.63452","-5","1"
+"21211","Baltimore","MD","39.328957","-76.63361","-5","1"
+"21212","Baltimore","MD","39.363456","-76.61142","-5","1"
+"21213","Baltimore","MD","39.311474","-76.58283","-5","1"
+"21214","Baltimore","MD","39.351857","-76.56399","-5","1"
+"21215","Baltimore","MD","39.345456","-76.68038","-5","1"
+"21216","Baltimore","MD","39.310006","-76.67029","-5","1"
+"21217","Baltimore","MD","39.306306","-76.63786","-5","1"
+"21218","Baltimore","MD","39.325956","-76.60602","-5","1"
+"21219","Sparrows Point","MD","39.229258","-76.44898","-5","1"
+"21220","Middle River","MD","39.337798","-76.41533","-5","1"
+"21221","Essex","MD","39.307737","-76.45171","-5","1"
+"21222","Dundalk","MD","39.263162","-76.5082","-5","1"
+"21223","Baltimore","MD","39.286556","-76.64644","-5","1"
+"21224","Baltimore","MD","39.284607","-76.55696","-5","1"
+"21225","Brooklyn","MD","39.229507","-76.61203","-5","1"
+"21226","Curtis Bay","MD","39.211758","-76.56623","-5","1"
+"21227","Halethorpe","MD","39.241957","-76.67712","-5","1"
+"21228","Catonsville","MD","39.278056","-76.74002","-5","1"
+"21229","Baltimore","MD","39.284856","-76.6878","-5","1"
+"21230","Baltimore","MD","39.273107","-76.62613","-5","1"
+"21231","Baltimore","MD","39.288607","-76.59116","-5","1"
+"21233","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21234","Parkville","MD","39.385006","-76.54177","-5","1"
+"21235","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21236","Nottingham","MD","39.389457","-76.48709","-5","1"
+"21237","Rosedale","MD","39.33224","-76.50365","-5","1"
+"21239","Baltimore","MD","39.36225","-76.58812","-5","1"
+"21240","Baltimore","MD","39.142793","-76.651589","-5","1"
+"21241","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21244","Windsor Mill","MD","39.338156","-76.76438","-5","1"
+"21250","Baltimore","MD","39.258226","-76.713149","-5","1"
+"21251","Baltimore","MD","39.438964","-76.592139","-5","1"
+"21252","Baltimore","MD","39.388799","-76.613325","-5","1"
+"21260","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21263","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21264","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21265","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21268","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21270","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21273","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21274","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21275","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21278","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21279","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21280","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21281","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21282","Baltimore","MD","39.438964","-76.592139","-5","1"
+"21283","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21284","Baltimore","MD","39.438964","-76.592139","-5","1"
+"21285","Baltimore","MD","39.438964","-76.592139","-5","1"
+"21286","Towson","MD","39.399639","-76.58418","-5","1"
+"21287","Baltimore","MD","39.297457","-76.592738","-5","1"
+"21288","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21289","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21290","Baltimore","MD","39.293256","-76.623839","-5","1"
+"21297","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21298","Baltimore","MD","39.284707","-76.620489","-5","1"
+"21401","Annapolis","MD","38.997511","-76.49803","-5","1"
+"21402","Annapolis","MD","38.988506","-76.47229","-5","1"
+"21403","Annapolis","MD","38.946462","-76.48358","-5","1"
+"21404","Annapolis","MD","38.974203","-76.594942","-5","1"
+"21405","Annapolis","MD","39.02801","-76.54183","-5","1"
+"21411","Annapolis","MD","38.974203","-76.594942","-5","1"
+"21412","Annapolis","MD","38.974203","-76.594942","-5","1"
+"21501","Cumberland","MD","39.580691","-78.690593","-5","1"
+"21502","Cumberland","MD","39.646587","-78.77398","-5","1"
+"21503","Cumberland","MD","39.580691","-78.690593","-5","1"
+"21504","Cumberland","MD","39.580691","-78.690593","-5","1"
+"21505","Cumberland","MD","39.594043","-78.843432","-5","1"
+"21520","Accident","MD","39.629925","-79.31377","-5","1"
+"21521","Barton","MD","39.535862","-79.0194","-5","1"
+"21522","Bittinger","MD","39.614779","-79.24494","-5","1"
+"21523","Bloomington","MD","39.47965","-79.07263","-5","1"
+"21524","Corriganville","MD","39.698332","-78.78741","-5","1"
+"21528","Eckhart Mines","MD","39.652187","-78.90123","-5","1"
+"21529","Ellerslie","MD","39.718905","-78.77685","-5","1"
+"21530","Flintstone","MD","39.697548","-78.53893","-5","1"
+"21531","Friendsville","MD","39.662458","-79.416","-5","1"
+"21532","Frostburg","MD","39.64612","-78.93778","-5","1"
+"21536","Grantsville","MD","39.675393","-79.17045","-5","1"
+"21538","Kitzmiller","MD","39.395674","-79.20096","-5","1"
+"21539","Lonaconing","MD","39.580942","-78.99073","-5","1"
+"21540","Luke","MD","39.475166","-79.05968","-5","1"
+"21541","McHenry","MD","39.557364","-79.35999","-5","1"
+"21542","Midland","MD","39.589842","-78.94877","-5","1"
+"21543","Midlothian","MD","39.63664","-78.95027","-5","1"
+"21545","Mount Savage","MD","39.699489","-78.86961","-5","1"
+"21550","Oakland","MD","39.409861","-79.39015","-5","1"
+"21555","Oldtown","MD","39.579649","-78.55826","-5","1"
+"21556","Pinto","MD","39.572452","-78.843962","-5","1"
+"21557","Rawlings","MD","39.509856","-78.92329","-5","1"
+"21560","Spring Gap","MD","39.564946","-78.711","-5","1"
+"21561","Swanton","MD","39.484412","-79.20856","-5","1"
+"21562","Westernport","MD","39.488146","-79.03506","-5","1"
+"21601","Easton","MD","38.777863","-76.0782","-5","1"
+"21606","Easton","MD","38.758525","-76.180166","-5","1"
+"21607","Barclay","MD","39.142967","-75.86144","-5","1"
+"21609","Bethlehem","MD","38.740562","-75.958683","-5","1"
+"21610","Betterton","MD","39.366193","-76.0623","-5","1"
+"21612","Bozman","MD","38.747964","-76.27279","-5","1"
+"21613","Cambridge","MD","38.545285","-76.09118","-5","1"
+"21617","Centreville","MD","39.049697","-76.05309","-5","1"
+"21619","Chester","MD","38.949536","-76.28063","-5","1"
+"21620","Chestertown","MD","39.215278","-76.09726","-5","1"
+"21622","Church Creek","MD","38.393669","-76.16806","-5","1"
+"21623","Church Hill","MD","39.123235","-75.96707","-5","1"
+"21624","Claiborne","MD","38.836142","-76.2702","-5","1"
+"21625","Cordova","MD","38.882856","-75.98842","-5","1"
+"21626","Crapo","MD","38.344103","-76.10098","-5","1"
+"21627","Crocheron","MD","38.17656","-76.04321","-5","1"
+"21628","Crumpton","MD","39.239132","-75.9243","-5","1"
+"21629","Denton","MD","38.871895","-75.8273","-5","1"
+"21631","East New Market","MD","38.589383","-75.94218","-5","1"
+"21632","Federalsburg","MD","38.705731","-75.77488","-5","1"
+"21634","Fishing Creek","MD","38.288409","-76.20146","-5","1"
+"21635","Galena","MD","39.349536","-75.85332","-5","1"
+"21636","Goldsboro","MD","39.026033","-75.7936","-5","1"
+"21638","Grasonville","MD","38.954613","-76.21257","-5","1"
+"21639","Greensboro","MD","38.971566","-75.80107","-5","1"
+"21640","Henderson","MD","39.07733","-75.79992","-5","1"
+"21641","Hillsboro","MD","38.920583","-75.9408","-5","1"
+"21643","Hurlock","MD","38.641666","-75.86418","-5","1"
+"21644","Ingleside","MD","39.094126","-75.87294","-5","1"
+"21645","Kennedyville","MD","39.328784","-75.9666","-5","1"
+"21647","Mcdaniel","MD","38.80503","-76.29105","-5","1"
+"21648","Madison","MD","38.485297","-76.24057","-5","1"
+"21649","Marydel","MD","39.122683","-75.76427","-5","1"
+"21650","Massey","MD","39.311429","-75.80806","-5","1"
+"21651","Millington","MD","39.254014","-75.86239","-5","1"
+"21652","Neavitt","MD","38.795102","-76.152762","-5","1"
+"21653","Newcomb","MD","38.750959","-76.17804","-5","1"
+"21654","Oxford","MD","38.690831","-76.14666","-5","1"
+"21655","Preston","MD","38.747216","-75.91459","-5","1"
+"21656","Price","MD","39.034637","-76.092127","-5","1"
+"21657","Queen Anne","MD","38.945143","-75.96915","-5","1"
+"21658","Queenstown","MD","38.963566","-76.13939","-5","1"
+"21659","Rhodesdale","MD","38.57526","-75.78177","-5","1"
+"21660","Ridgely","MD","38.954731","-75.88459","-5","1"
+"21661","Rock Hall","MD","39.137775","-76.22765","-5","1"
+"21662","Royal Oak","MD","38.709254","-76.2086","-5","1"
+"21663","Saint Michaels","MD","38.783264","-76.22256","-5","1"
+"21664","Secretary","MD","38.609886","-75.949","-5","1"
+"21665","Sherwood","MD","38.754785","-76.32474","-5","1"
+"21666","Stevensville","MD","38.942464","-76.34124","-5","1"
+"21667","Still Pond","MD","39.335017","-76.05365","-5","1"
+"21668","Sudlersville","MD","39.201203","-75.85175","-5","1"
+"21669","Taylors Island","MD","38.458374","-76.30203","-5","1"
+"21670","Templeville","MD","38.88927","-75.861191","-5","1"
+"21671","Tilghman","MD","38.708795","-76.33501","-5","1"
+"21672","Toddville","MD","38.277014","-76.06229","-5","1"
+"21673","Trappe","MD","38.662533","-76.07009","-5","1"
+"21675","Wingate","MD","38.286828","-76.08221","-5","1"
+"21676","Wittman","MD","38.796477","-76.30437","-5","1"
+"21677","Woolford","MD","38.510494","-76.18219","-5","1"
+"21678","Worton","MD","39.295736","-76.09974","-5","1"
+"21679","Wye Mills","MD","38.925358","-76.05652","-5","1"
+"21681","Ridgely","MD","38.88927","-75.861191","-5","1"
+"21682","Ridgely","MD","38.88927","-75.861191","-5","1"
+"21683","Ridgely","MD","38.88927","-75.861191","-5","1"
+"21684","Ridgely","MD","38.88927","-75.861191","-5","1"
+"21685","Ridgely","MD","38.88927","-75.861191","-5","1"
+"21686","Ridgely","MD","38.88927","-75.861191","-5","1"
+"21687","Ridgely","MD","38.88927","-75.861191","-5","1"
+"21688","Ridgely","MD","38.88927","-75.861191","-5","1"
+"21690","Chestertown","MD","39.034637","-76.092127","-5","1"
+"21701","Frederick","MD","39.423344","-77.38902","-5","1"
+"21702","Frederick","MD","39.451934","-77.442","-5","1"
+"21703","Frederick","MD","39.385165","-77.4539","-5","1"
+"21704","Frederick","MD","39.363415","-77.37849","-5","1"
+"21705","Frederick","MD","39.469961","-77.392139","-5","1"
+"21709","Frederick","MD","39.469961","-77.392139","-5","1"
+"21710","Adamstown","MD","39.301647","-77.46667","-5","1"
+"21711","Big Pool","MD","39.654773","-78.01823","-5","1"
+"21713","Boonsboro","MD","39.521507","-77.66056","-5","1"
+"21714","Braddock Heights","MD","39.4203","-77.505098","-5","1"
+"21715","Brownsville","MD","39.386893","-77.658015","-5","1"
+"21716","Brunswick","MD","39.313666","-77.62466","-5","1"
+"21717","Buckeystown","MD","39.334864","-77.4333","-5","1"
+"21718","Burkittsville","MD","39.391459","-77.62709","-5","1"
+"21719","Cascade","MD","39.710433","-77.49104","-5","1"
+"21720","Cavetown","MD","39.647296","-77.584162","-5","1"
+"21721","Chewsville","MD","39.642537","-77.637152","-5","1"
+"21722","Clear Spring","MD","39.656474","-77.9152","-5","1"
+"21723","Cooksville","MD","39.319271","-77.02397","-5","1"
+"21727","Emmitsburg","MD","39.695328","-77.32721","-5","1"
+"21733","Fairplay","MD","39.549752","-77.7557","-5","1"
+"21734","Funkstown","MD","39.609846","-77.70725","-5","1"
+"21736","Gapland","MD","39.520696","-77.916196","-5","1"
+"21737","Glenelg","MD","39.26574","-76.99735","-5","1"
+"21738","Glenwood","MD","39.280106","-77.02052","-5","1"
+"21740","Hagerstown","MD","39.633946","-77.73025","-5","1"
+"21741","Hagerstown","MD","39.693944","-77.742116","-5","1"
+"21742","Hagerstown","MD","39.658897","-77.68297","-5","1"
+"21746","Hagerstown","MD","39.563787","-77.720642","-5","1"
+"21747","Hagerstown","MD","39.520696","-77.916196","-5","1"
+"21748","Hagerstown","MD","39.520696","-77.916196","-5","1"
+"21749","Hagerstown","MD","39.520696","-77.916196","-5","1"
+"21750","Hancock","MD","39.692614","-78.21691","-5","1"
+"21754","Ijamsville","MD","39.342096","-77.29984","-5","1"
+"21755","Jefferson","MD","39.372496","-77.55869","-5","1"
+"21756","Keedysville","MD","39.460534","-77.69284","-5","1"
+"21757","Keymar","MD","39.584616","-77.2686","-5","1"
+"21758","Knoxville","MD","39.342991","-77.66014","-5","1"
+"21759","Ladiesburg","MD","39.569426","-77.290519","-5","1"
+"21762","Libertytown","MD","39.484079","-77.24711","-5","1"
+"21764","Linwood","MD","39.534703","-77.049302","-5","1"
+"21765","Lisbon","MD","39.337804","-77.071952","-5","1"
+"21766","Little Orleans","MD","39.65643","-78.3986","-5","1"
+"21767","Maugansville","MD","39.697894","-77.74514","-5","1"
+"21769","Middletown","MD","39.446452","-77.55169","-5","1"
+"21770","Monrovia","MD","39.354093","-77.24861","-5","1"
+"21771","Mount Airy","MD","39.381295","-77.15867","-5","1"
+"21773","Myersville","MD","39.528123","-77.557","-5","1"
+"21774","New Market","MD","39.408627","-77.28676","-5","1"
+"21775","New Midway","MD","39.564472","-77.29468","-5","1"
+"21776","New Windsor","MD","39.529834","-77.09715","-5","1"
+"21777","Point Of Rocks","MD","39.275498","-77.53385","-5","1"
+"21778","Rocky Ridge","MD","39.610752","-77.34166","-5","1"
+"21779","Rohrersville","MD","39.431058","-77.66169","-5","1"
+"21780","Sabillasville","MD","39.677316","-77.47049","-5","1"
+"21781","Saint James","MD","39.56991","-77.760697","-5","1"
+"21782","Sharpsburg","MD","39.454582","-77.75052","-5","1"
+"21783","Smithsburg","MD","39.655722","-77.5672","-5","1"
+"21784","Sykesville","MD","39.39667","-76.965","-5","1"
+"21787","Taneytown","MD","39.665171","-77.17264","-5","1"
+"21788","Thurmont","MD","39.604303","-77.41092","-5","1"
+"21790","Tuscarora","MD","39.254538","-77.49474","-5","1"
+"21791","Union Bridge","MD","39.5549","-77.18176","-5","1"
+"21792","Unionville","MD","39.469961","-77.392139","-5","1"
+"21793","Walkersville","MD","39.484843","-77.34668","-5","1"
+"21794","West Friendship","MD","39.297519","-76.98377","-5","1"
+"21795","Williamsport","MD","39.600029","-77.81584","-5","1"
+"21797","Woodbine","MD","39.335671","-77.06364","-5","1"
+"21798","Woodsboro","MD","39.540623","-77.30606","-5","1"
+"21801","Salisbury","MD","38.369675","-75.61214","-5","1"
+"21802","Salisbury","MD","38.388434","-75.6276","-5","1"
+"21803","Salisbury","MD","38.388434","-75.6276","-5","1"
+"21804","Salisbury","MD","38.359332","-75.56931","-5","1"
+"21810","Allen","MD","38.292848","-75.68812","-5","1"
+"21811","Berlin","MD","38.343166","-75.19082","-5","1"
+"21813","Bishopville","MD","38.431954","-75.18061","-5","1"
+"21814","Bivalve","MD","38.302152","-75.88812","-5","1"
+"21817","Crisfield","MD","37.985297","-75.84597","-5","1"
+"21821","Deal Island","MD","38.158615","-75.93147","-5","1"
+"21822","Eden","MD","38.284622","-75.64771","-5","1"
+"21824","Ewell","MD","37.991177","-76.02374","-5","1"
+"21826","Fruitland","MD","38.322867","-75.62088","-5","1"
+"21829","Girdletree","MD","38.097861","-75.39378","-5","1"
+"21830","Hebron","MD","38.407885","-75.69357","-5","1"
+"21831","Hebron","MD","38.416292","-75.691572","-5","1"
+"21835","Linkwood","MD","38.540293","-75.94596","-5","1"
+"21836","Manokin","MD","38.073294","-75.734412","-5","1"
+"21837","Mardela Springs","MD","38.469332","-75.74074","-5","1"
+"21838","Marion Station","MD","38.018482","-75.7389","-5","1"
+"21840","Nanticoke","MD","38.268651","-75.90494","-5","1"
+"21841","Newark","MD","38.248485","-75.29106","-5","1"
+"21842","Ocean City","MD","38.385457","-75.07153","-5","1"
+"21843","Ocean City","MD","38.22309","-75.324057","-5","1"
+"21849","Parsonsburg","MD","38.363057","-75.45574","-5","1"
+"21850","Pittsville","MD","38.377713","-75.39747","-5","1"
+"21851","Pocomoke City","MD","38.069322","-75.54811","-5","1"
+"21852","Powellville","MD","38.388434","-75.6276","-5","1"
+"21853","Princess Anne","MD","38.205272","-75.70169","-5","1"
+"21856","Quantico","MD","38.327156","-75.79598","-5","1"
+"21857","Rehobeth","MD","38.092718","-75.888207","-5","1"
+"21861","Sharptown","MD","38.539817","-75.71854","-5","1"
+"21862","Showell","MD","38.39893","-75.21195","-5","1"
+"21863","Snow Hill","MD","38.193683","-75.41162","-5","1"
+"21864","Stockton","MD","38.040265","-75.40992","-5","1"
+"21865","Tyaskin","MD","38.324259","-75.87793","-5","1"
+"21866","Tylerton","MD","37.967803","-76.02337","-5","1"
+"21867","Upper Fairmount","MD","38.111688","-75.79242","-5","1"
+"21868","Fairmount","MD","38.107572","-75.789354","-5","1"
+"21869","Vienna","MD","38.493753","-75.84317","-5","1"
+"21870","Wenona","MD","38.092718","-75.888207","-5","1"
+"21871","Westover","MD","38.100727","-75.7115","-5","1"
+"21872","Whaleyville","MD","38.408973","-75.29575","-5","1"
+"21874","Willards","MD","38.397611","-75.35364","-5","1"
+"21875","Delmar","MD","38.446894","-75.56365","-5","1"
+"21890","Westover","MD","38.092718","-75.888207","-5","1"
+"21901","North East","MD","39.593813","-75.95602","-5","1"
+"21902","Perry Point","MD","39.553014","-76.06542","-5","1"
+"21903","Perryville","MD","39.571003","-76.05077","-5","1"
+"21904","Port Deposit","MD","39.61881","-76.0853","-5","1"
+"21911","Rising Sun","MD","39.694974","-76.05395","-5","1"
+"21912","Warwick","MD","39.44474","-75.80203","-5","1"
+"21913","Cecilton","MD","39.402919","-75.86943","-5","1"
+"21914","Charlestown","MD","39.572476","-75.97904","-5","1"
+"21915","Chesapeake City","MD","39.523096","-75.84155","-5","1"
+"21916","Childs","MD","39.541512","-75.999972","-5","1"
+"21917","Colora","MD","39.671671","-76.0972","-5","1"
+"21918","Conowingo","MD","39.679246","-76.15464","-5","1"
+"21919","Earleville","MD","39.425542","-75.96164","-5","1"
+"21920","Elk Mills","MD","39.658943","-75.82314","-5","1"
+"21921","Elkton","MD","39.626736","-75.84294","-5","1"
+"21922","Elkton","MD","39.593612","-75.947332","-5","1"
+"21930","Georgetown","MD","39.365119","-75.88499","-5","1"
+"22002","Amissville","VA","38.691448","-78.137019","-5","1"
+"22003","Annandale","VA","38.830345","-77.21387","-5","1"
+"22009","Burke","VA","38.831813","-77.288755","-5","1"
+"22015","Burke","VA","38.788646","-77.27888","-5","1"
+"22026","Dumfries","VA","38.582319","-77.32722","-5","1"
+"22027","Dunn Loring","VA","38.893921","-77.21976","-5","1"
+"22030","Fairfax","VA","38.846212","-77.32787","-5","1"
+"22031","Fairfax","VA","38.859675","-77.26167","-5","1"
+"22032","Fairfax","VA","38.821753","-77.29293","-5","1"
+"22033","Fairfax","VA","38.874879","-77.38642","-5","1"
+"22034","Fairfax","VA","38.831813","-77.288755","-5","1"
+"22035","Fairfax","VA","38.855715","-77.361633","-5","1"
+"22036","Fairfax","VA","38.735114","-77.07965","-5","1"
+"22037","Fairfax","VA","38.831813","-77.288755","-5","1"
+"22038","Fairfax","VA","38.852849","-77.30199","-5","1"
+"22039","Fairfax Station","VA","38.760747","-77.31684","-5","1"
+"22040","Falls Church","VA","38.884177","-77.171752","-5","1"
+"22041","Falls Church","VA","38.849136","-77.14081","-5","1"
+"22042","Falls Church","VA","38.864669","-77.18781","-5","1"
+"22043","Falls Church","VA","38.901311","-77.19777","-5","1"
+"22044","Falls Church","VA","38.859645","-77.15328","-5","1"
+"22046","Falls Church","VA","38.886311","-77.18098","-5","1"
+"22047","Falls Church","VA","38.831813","-77.288755","-5","1"
+"22060","Fort Belvoir","VA","38.71299","-77.16615","-5","1"
+"22066","Great Falls","VA","39.003809","-77.30165","-5","1"
+"22067","Greenway","VA","38.96451","-77.233103","-5","1"
+"22079","Lorton","VA","38.695915","-77.20122","-5","1"
+"22081","Merrifield","VA","38.873861","-77.234454","-5","1"
+"22082","Merrifield","VA","38.831813","-77.288755","-5","1"
+"22092","Herndon","VA","38.831813","-77.288755","-5","1"
+"22093","Ashburn","VA","39.085309","-77.645224","-5","1"
+"22095","Herndon","VA","38.831813","-77.288755","-5","1"
+"22096","Reston","VA","38.831813","-77.288755","-5","1"
+"22101","McLean","VA","38.93276","-77.1677","-5","1"
+"22102","McLean","VA","38.938664","-77.22196","-5","1"
+"22103","West Mclean","VA","38.831813","-77.288755","-5","1"
+"22106","McLean","VA","38.831813","-77.288755","-5","1"
+"22109","McLean","VA","38.920165","-77.229043","-5","1"
+"22116","Merrifield","VA","38.871469","-77.234428","-5","1"
+"22118","Merrifield","VA","38.831813","-77.288755","-5","1"
+"22119","Merrifield","VA","38.831813","-77.288755","-5","1"
+"22120","Merrifield","VA","38.831813","-77.288755","-5","1"
+"22121","Mount Vernon","VA","38.830912","-77.432252","-5","1"
+"22122","Newington","VA","38.831813","-77.288755","-5","1"
+"22124","Oakton","VA","38.88619","-77.32402","-5","1"
+"22125","Occoquan","VA","38.683295","-77.26044","-5","1"
+"22134","Quantico","VA","38.503139","-77.33372","-5","1"
+"22135","Quantico","VA","38.721912","-77.466897","-5","1"
+"22150","Springfield","VA","38.778243","-77.18562","-5","1"
+"22151","Springfield","VA","38.803813","-77.20821","-5","1"
+"22152","Springfield","VA","38.775716","-77.23131","-5","1"
+"22153","Springfield","VA","38.745164","-77.23535","-5","1"
+"22156","Springfield","VA","38.831813","-77.288755","-5","1"
+"22158","Springfield","VA","38.831813","-77.288755","-5","1"
+"22159","Springfield","VA","38.831813","-77.288755","-5","1"
+"22160","Springfield","VA","38.831813","-77.288755","-5","1"
+"22161","Springfield","VA","38.807462","-77.219354","-5","1"
+"22172","Triangle","VA","38.557527","-77.35726","-5","1"
+"22180","Vienna","VA","38.894711","-77.25337","-5","1"
+"22181","Vienna","VA","38.896361","-77.29102","-5","1"
+"22182","Vienna","VA","38.922478","-77.2566","-5","1"
+"22183","Vienna","VA","38.831813","-77.288755","-5","1"
+"22184","Vienna","VA","38.831813","-77.288755","-5","1"
+"22185","Vienna","VA","38.831813","-77.288755","-5","1"
+"22191","Woodbridge","VA","38.63275","-77.26786","-5","1"
+"22192","Woodbridge","VA","38.678451","-77.30657","-5","1"
+"22193","Woodbridge","VA","38.646375","-77.34469","-5","1"
+"22194","Woodbridge","VA","38.721912","-77.466897","-5","1"
+"22195","Woodbridge","VA","38.721912","-77.466897","-5","1"
+"22199","Lorton","VA","38.831813","-77.288755","-5","1"
+"22201","Arlington","VA","38.885337","-77.09512","-5","1"
+"22202","Arlington","VA","38.856795","-77.05628","-5","1"
+"22203","Arlington","VA","38.874979","-77.11455","-5","1"
+"22204","Arlington","VA","38.860247","-77.09627","-5","1"
+"22205","Arlington","VA","38.88275","-77.13999","-5","1"
+"22206","Arlington","VA","38.843466","-77.08973","-5","1"
+"22207","Arlington","VA","38.903697","-77.12749","-5","1"
+"22209","Arlington","VA","38.893241","-77.07453","-5","1"
+"22210","Arlington","VA","38.880811","-77.11295","-5","1"
+"22211","Ft Myer","VA","38.878215","-77.06845","-5","1"
+"22212","Arlington","VA","38.880811","-77.11295","-5","1"
+"22213","Arlington","VA","38.894457","-77.16396","-5","1"
+"22214","Arlington","VA","38.880811","-77.11295","-5","1"
+"22215","Arlington","VA","38.880811","-77.11295","-5","1"
+"22216","Arlington","VA","38.880811","-77.11295","-5","1"
+"22217","Arlington","VA","38.880811","-77.11295","-5","1"
+"22218","Arlington","VA","38.880811","-77.11295","-5","1"
+"22219","Arlington","VA","38.880811","-77.11295","-5","1"
+"22222","Arlington","VA","38.861462","-77.053599","-5","1"
+"22223","Arlington","VA","38.880811","-77.11295","-5","1"
+"22225","Arlington","VA","38.880811","-77.11295","-5","1"
+"22226","Arlington","VA","38.883358","-77.10281","-5","1"
+"22227","Arlington","VA","38.880811","-77.11295","-5","1"
+"22229","Arlington","VA","38.880811","-77.11295","-5","1"
+"22230","Arlington","VA","38.87972","-77.110817","-5","1"
+"22234","Arlington","VA","38.880811","-77.11295","-5","1"
+"22240","Arlington","VA","38.856623","-77.051788","-5","1"
+"22241","Arlington","VA","38.880811","-77.11295","-5","1"
+"22242","Arlington","VA","38.850879","-77.052336","-5","1"
+"22243","Arlington","VA","38.86045","-77.051569","-5","1"
+"22244","Arlington","VA","38.854522","-77.052035","-5","1"
+"22245","Arlington","VA","38.851773","-77.052296","-5","1"
+"22246","Arlington","VA","38.880811","-77.11295","-5","1"
+"22301","Alexandria","VA","38.819863","-77.05854","-5","1"
+"22302","Alexandria","VA","38.829512","-77.08204","-5","1"
+"22303","Alexandria","VA","38.792863","-77.07964","-5","1"
+"22304","Alexandria","VA","38.813013","-77.11667","-5","1"
+"22305","Alexandria","VA","38.836779","-77.06418","-5","1"
+"22306","Alexandria","VA","38.757214","-77.08666","-5","1"
+"22307","Alexandria","VA","38.774863","-77.0593","-5","1"
+"22308","Alexandria","VA","38.728464","-77.05701","-5","1"
+"22309","Alexandria","VA","38.725214","-77.10734","-5","1"
+"22310","Alexandria","VA","38.782013","-77.12125","-5","1"
+"22311","Alexandria","VA","38.837312","-77.12064","-5","1"
+"22312","Alexandria","VA","38.817362","-77.1537","-5","1"
+"22313","Alexandria","VA","38.815762","-77.09005","-5","1"
+"22314","Alexandria","VA","38.806163","-77.05139","-5","1"
+"22315","Alexandria","VA","38.757924","-77.15284","-5","1"
+"22320","Alexandria","VA","38.804413","-77.046699","-5","1"
+"22321","Alexandria","VA","38.831813","-77.288755","-5","1"
+"22331","Alexandria","VA","38.801342","-77.070733","-5","1"
+"22332","Alexandria","VA","38.803142","-77.072679","-5","1"
+"22333","Alexandria","VA","38.815762","-77.09005","-5","1"
+"22334","Alexandria","VA","38.815762","-77.09005","-5","1"
+"22336","Alexandria","VA","38.815762","-77.09005","-5","1"
+"22393","Fishersville","VA","38.103819","-78.963004","-5","1"
+"22401","Fredericksburg","VA","38.301829","-77.47077","-5","1"
+"22402","Fredericksburg","VA","38.299613","-77.489666","-5","1"
+"22403","Fredericksburg","VA","38.417273","-77.460814","-5","1"
+"22404","Fredericksburg","VA","38.298305","-77.489913","-5","1"
+"22405","Fredericksburg","VA","38.317636","-77.43297","-5","1"
+"22406","Fredericksburg","VA","38.387261","-77.54676","-5","1"
+"22407","Fredericksburg","VA","38.271028","-77.5559","-5","1"
+"22408","Fredericksburg","VA","38.236023","-77.46111","-5","1"
+"22412","Fredericksburg","VA","38.184716","-77.662559","-5","1"
+"22427","Bowling Green","VA","38.042346","-77.30833","-5","1"
+"22428","Bowling Green","VA","38.014536","-77.355902","-5","1"
+"22430","Brooke","VA","38.385704","-77.374292","-5","1"
+"22432","Burgess","VA","37.860549","-76.35637","-5","1"
+"22433","Burr Hill","VA","38.343691","-77.85964","-5","1"
+"22435","Callao","VA","37.996825","-76.56435","-5","1"
+"22436","Caret","VA","38.069014","-77.09611","-5","1"
+"22437","Center Cross","VA","37.790946","-76.78764","-5","1"
+"22438","Champlain","VA","38.041706","-77.005","-5","1"
+"22442","Coles Point","VA","38.121793","-76.79025","-5","1"
+"22443","Colonial Beach","VA","38.22653","-76.97442","-5","1"
+"22446","Corbin","VA","38.171755","-77.408163","-5","1"
+"22448","Dahlgren","VA","38.340124","-77.03273","-5","1"
+"22451","Dogue","VA","38.271077","-77.17261","-5","1"
+"22454","Dunnsville","VA","37.854791","-76.81298","-5","1"
+"22456","Edwardsville","VA","37.852316","-76.40511","-5","1"
+"22460","Farnham","VA","37.858952","-76.63263","-5","1"
+"22463","Garrisonville","VA","38.468432","-77.461213","-5","1"
+"22469","Hague","VA","38.093956","-76.64055","-5","1"
+"22471","Hartwood","VA","38.39933","-77.581351","-5","1"
+"22472","Haynesville","VA","37.950511","-76.636722","-5","1"
+"22473","Heathsville","VA","37.892668","-76.36307","-5","1"
+"22476","Hustle","VA","38.036866","-77.08033","-5","1"
+"22480","Irvington","VA","37.66871","-76.41038","-5","1"
+"22481","Jersey","VA","38.271077","-77.17261","-5","1"
+"22482","Kilmarnock","VA","37.733327","-76.34389","-5","1"
+"22485","King George","VA","38.277837","-77.1642","-5","1"
+"22486","Irvington","VA","37.665713","-76.420763","-5","1"
+"22488","Kinsale","VA","38.046358","-76.57924","-5","1"
+"22501","Ladysmith","VA","38.015899","-77.559298","-5","1"
+"22503","Lancaster","VA","37.732696","-76.51554","-5","1"
+"22504","Laneview","VA","37.763552","-76.72961","-5","1"
+"22507","Lively","VA","37.762848","-76.49749","-5","1"
+"22508","Locust Grove","VA","38.326624","-77.76987","-5","1"
+"22509","Loretto","VA","38.104829","-77.0743","-5","1"
+"22511","Lottsburg","VA","37.991772","-76.48985","-5","1"
+"22513","Merry Point","VA","37.750261","-76.509615","-5","1"
+"22514","Milford","VA","37.988674","-77.29047","-5","1"
+"22517","Mollusk","VA","37.75028","-76.578109","-5","1"
+"22520","Montross","VA","38.129822","-76.76155","-5","1"
+"22523","Morattico","VA","37.792761","-76.60933","-5","1"
+"22524","Mount Holly","VA","38.118186","-76.680504","-5","1"
+"22526","Ninde","VA","38.271077","-77.17261","-5","1"
+"22528","Nuttsville","VA","37.713175","-76.409946","-5","1"
+"22529","Oldhams","VA","38.006793","-76.68218","-5","1"
+"22530","Ophelia","VA","37.90938","-76.293436","-5","1"
+"22534","Partlow","VA","38.08157","-77.66795","-5","1"
+"22535","Port Royal","VA","38.164219","-77.18217","-5","1"
+"22538","Rappahannock Academy","VA","38.22172","-77.26648","-5","1"
+"22539","Reedville","VA","37.854233","-76.27848","-5","1"
+"22542","Rhoadesville","VA","38.296355","-77.88379","-5","1"
+"22544","Rollins Fork","VA","38.271077","-77.17261","-5","1"
+"22545","Ruby","VA","38.508611","-77.542957","-5","1"
+"22546","Ruther Glen","VA","37.95969","-77.47733","-5","1"
+"22547","Sealston","VA","38.271077","-77.17261","-5","1"
+"22548","Sharps","VA","37.825956","-76.70563","-5","1"
+"22552","Sparta","VA","38.009438","-77.225139","-5","1"
+"22553","Spotsylvania","VA","38.207275","-77.64378","-5","1"
+"22554","Stafford","VA","38.460395","-77.43266","-5","1"
+"22555","Stafford","VA","38.417273","-77.460814","-5","1"
+"22558","Stratford","VA","38.121793","-76.79025","-5","1"
+"22560","Tappahannock","VA","37.916172","-76.90656","-5","1"
+"22565","Thornburg","VA","38.137216","-77.518865","-5","1"
+"22567","Unionville","VA","38.233223","-77.91258","-5","1"
+"22570","Village","VA","37.947224","-76.615358","-5","1"
+"22572","Warsaw","VA","37.957869","-76.75725","-5","1"
+"22576","Weems","VA","37.680124","-76.44242","-5","1"
+"22577","Sandy Point","VA","38.067325","-76.550274","-5","1"
+"22578","White Stone","VA","37.64424","-76.36034","-5","1"
+"22579","Wicomico Church","VA","37.807268","-76.31275","-5","1"
+"22580","Woodford","VA","38.095772","-77.44404","-5","1"
+"22581","Zacata","VA","38.121793","-76.79025","-5","1"
+"22601","Winchester","VA","39.179076","-78.16653","-5","1"
+"22602","Winchester","VA","39.158386","-78.24758","-5","1"
+"22603","Winchester","VA","39.267257","-78.19396","-5","1"
+"22604","Winchester","VA","39.167603","-78.168643","-5","1"
+"22606","Newport News","VA","38.112139","-77.329674","-5","1"
+"22610","Bentonville","VA","38.822506","-78.27368","-5","1"
+"22611","Berryville","VA","39.156378","-77.97857","-5","1"
+"22620","Boyce","VA","39.061499","-78.03693","-5","1"
+"22622","Brucetown","VA","39.2543","-78.066373","-5","1"
+"22623","Chester Gap","VA","38.853733","-78.141239","-5","1"
+"22624","Clear Brook","VA","39.26582","-78.08496","-5","1"
+"22625","Cross Junction","VA","39.345906","-78.30975","-5","1"
+"22626","Fishers Hill","VA","38.980286","-78.4011","-5","1"
+"22627","Flint Hill","VA","38.765004","-78.0948","-5","1"
+"22630","Front Royal","VA","38.926615","-78.17499","-5","1"
+"22637","Gore","VA","39.247386","-78.35444","-5","1"
+"22638","Winchester","VA","39.236944","-78.288465","-5","1"
+"22639","Hume","VA","38.814086","-78.01898","-5","1"
+"22640","Huntly","VA","38.808303","-78.13578","-5","1"
+"22641","Strasburg","VA","39.076317","-78.39617","-5","1"
+"22642","Linden","VA","38.932178","-78.06051","-5","1"
+"22643","Markham","VA","38.905106","-77.98948","-5","1"
+"22644","Maurertown","VA","38.944011","-78.48125","-5","1"
+"22645","Middletown","VA","39.023035","-78.2809","-5","1"
+"22646","Millwood","VA","39.069682","-78.03752","-5","1"
+"22649","Middletown","VA","39.004774","-78.247806","-5","1"
+"22650","Rileyville","VA","38.76592","-78.36545","-5","1"
+"22651","Front Royal","VA","38.947215","-78.213304","-5","1"
+"22652","Fort Valley","VA","38.823987","-78.4531","-5","1"
+"22654","Star Tannery","VA","39.04494","-78.47377","-5","1"
+"22655","Stephens City","VA","39.07814","-78.20713","-5","1"
+"22656","Stephenson","VA","39.230131","-78.09992","-5","1"
+"22657","Strasburg","VA","39.00127","-78.36485","-5","1"
+"22660","Toms Brook","VA","38.949013","-78.43921","-5","1"
+"22663","White Post","VA","39.045019","-78.12417","-5","1"
+"22664","Woodstock","VA","38.881558","-78.51586","-5","1"
+"22701","Culpeper","VA","38.459521","-77.99875","-5","1"
+"22709","Aroda","VA","38.312548","-78.23622","-5","1"
+"22711","Banco","VA","38.476275","-78.2729","-5","1"
+"22712","Bealeton","VA","38.5593","-77.75728","-5","1"
+"22713","Boston","VA","38.549388","-78.15309","-5","1"
+"22714","Brandy Station","VA","38.512989","-77.89529","-5","1"
+"22715","Brightwood","VA","38.414359","-78.18321","-5","1"
+"22716","Castleton","VA","38.627135","-78.11341","-5","1"
+"22718","Elkwood","VA","38.493501","-77.82067","-5","1"
+"22719","Etlan","VA","38.527816","-78.25117","-5","1"
+"22720","Goldvein","VA","38.474222","-77.64361","-5","1"
+"22721","Graves Mill","VA","38.428509","-78.267848","-5","1"
+"22722","Haywood","VA","38.452043","-78.24197","-5","1"
+"22723","Hood","VA","38.331957","-78.3774","-5","1"
+"22724","Jeffersonton","VA","38.630345","-77.89777","-5","1"
+"22725","Leon","VA","38.428509","-78.267848","-5","1"
+"22726","Lignum","VA","38.411845","-77.82208","-5","1"
+"22727","Madison","VA","38.393351","-78.28737","-5","1"
+"22728","Midland","VA","38.587503","-77.70952","-5","1"
+"22729","Mitchells","VA","38.373645","-78.0165","-5","1"
+"22730","Oakpark","VA","38.365699","-78.18604","-5","1"
+"22731","Pratts","VA","38.345179","-78.26151","-5","1"
+"22732","Radiant","VA","38.310141","-78.20098","-5","1"
+"22733","Rapidan","VA","38.324175","-78.05877","-5","1"
+"22734","Remington","VA","38.52916","-77.80274","-5","1"
+"22735","Reva","VA","38.477063","-78.17517","-5","1"
+"22736","Richardsville","VA","38.388311","-77.68111","-5","1"
+"22737","Rixeyville","VA","38.588409","-77.98995","-5","1"
+"22738","Rochelle","VA","38.303414","-78.28937","-5","1"
+"22739","Somerville","VA","38.505945","-77.59557","-5","1"
+"22740","Sperryville","VA","38.636896","-78.24","-5","1"
+"22741","Stevensburg","VA","38.442247","-77.8962","-5","1"
+"22742","Sumerduck","VA","38.456916","-77.7009","-5","1"
+"22743","Syria","VA","38.509556","-78.33721","-5","1"
+"22746","Viewtown","VA","38.638635","-78.03061","-5","1"
+"22747","Washington","VA","38.725801","-78.16767","-5","1"
+"22748","Wolftown","VA","38.372652","-78.380509","-5","1"
+"22749","Woodville","VA","38.629058","-78.18057","-5","1"
+"22801","Harrisonburg","VA","38.426786","-78.88153","-5","1"
+"22802","Harrisonburg","VA","38.477752","-78.86302","-5","1"
+"22807","Harrisonburg","VA","38.440898","-78.874173","-5","1"
+"22810","Basye","VA","38.81913","-78.77149","-5","1"
+"22811","Bergton","VA","38.797789","-78.96672","-5","1"
+"22812","Bridgewater","VA","38.398049","-79.00071","-5","1"
+"22815","Broadway","VA","38.619654","-78.80513","-5","1"
+"22820","Criders","VA","38.725738","-79.01957","-5","1"
+"22821","Dayton","VA","38.436873","-78.99039","-5","1"
+"22824","Edinburg","VA","38.828628","-78.60964","-5","1"
+"22827","Elkton","VA","38.404364","-78.62907","-5","1"
+"22830","Fulks Run","VA","38.637545","-78.95205","-5","1"
+"22831","Hinton","VA","38.584516","-79.04328","-5","1"
+"22832","Keezletown","VA","38.453741","-78.78234","-5","1"
+"22833","Lacey Spring","VA","38.528361","-78.855172","-5","1"
+"22834","Linville","VA","38.544652","-78.86564","-5","1"
+"22835","Luray","VA","38.665615","-78.45621","-5","1"
+"22840","McGaheysville","VA","38.387721","-78.73452","-5","1"
+"22841","Mount Crawford","VA","38.358334","-78.90667","-5","1"
+"22842","Mount Jackson","VA","38.772409","-78.69461","-5","1"
+"22843","Mount Solon","VA","38.337507","-79.11629","-5","1"
+"22844","New Market","VA","38.652274","-78.66417","-5","1"
+"22845","Orkney Springs","VA","38.788499","-78.81488","-5","1"
+"22846","Penn Laird","VA","38.371616","-78.79742","-5","1"
+"22847","Quicksburg","VA","38.704494","-78.70088","-5","1"
+"22848","Pleasant Valley","VA","38.384681","-78.891422","-5","1"
+"22849","Shenandoah","VA","38.49696","-78.61997","-5","1"
+"22850","Singers Glen","VA","38.553225","-78.92206","-5","1"
+"22851","Stanley","VA","38.567459","-78.50696","-5","1"
+"22853","Timberville","VA","38.641556","-78.76258","-5","1"
+"22865","Luray","VA","38.65845","-78.426788","-5","1"
+"22875","Luray","VA","38.665568","-78.466716","-5","1"
+"22880","Waynesboro","VA","38.058102","-78.878493","-5","1"
+"22901","Charlottesville","VA","38.072402","-78.50149","-5","1"
+"22902","Charlottesville","VA","38.00847","-78.47803","-5","1"
+"22903","Charlottesville","VA","38.026342","-78.5348","-5","1"
+"22904","Charlottesville","VA","38.040101","-78.485066","-5","1"
+"22905","Charlottesville","VA","38.040101","-78.485066","-5","1"
+"22906","Charlottesville","VA","38.040101","-78.485066","-5","1"
+"22907","Charlottesville","VA","38.040101","-78.485066","-5","1"
+"22908","Charlottesville","VA","38.040101","-78.485066","-5","1"
+"22909","Charlottesville","VA","38.024474","-78.448214","-5","1"
+"22910","Charlottesville","VA","38.040101","-78.485066","-5","1"
+"22911","Charlottesville","VA","38.07735","-78.42042","-5","1"
+"22920","Afton","VA","37.987812","-78.79701","-5","1"
+"22922","Arrington","VA","37.69474","-78.93251","-5","1"
+"22923","Barboursville","VA","38.167465","-78.3259","-5","1"
+"22924","Batesville","VA","38.000289","-78.72662","-5","1"
+"22931","Covesville","VA","37.890917","-78.70343","-5","1"
+"22932","Crozet","VA","38.116217","-78.71396","-5","1"
+"22935","Dyke","VA","38.254105","-78.56548","-5","1"
+"22936","Earlysville","VA","38.150083","-78.47627","-5","1"
+"22937","Esmont","VA","37.79922","-78.61263","-5","1"
+"22938","Faber","VA","37.85583","-78.77546","-5","1"
+"22939","Fishersville","VA","38.104457","-78.97416","-5","1"
+"22940","Free Union","VA","38.197583","-78.59304","-5","1"
+"22942","Gordonsville","VA","38.125214","-78.197","-5","1"
+"22943","Greenwood","VA","38.039928","-78.75894","-5","1"
+"22945","Ivy","VA","38.065383","-78.595831","-5","1"
+"22946","Keene","VA","37.855103","-78.56162","-5","1"
+"22947","Keswick","VA","38.025346","-78.32925","-5","1"
+"22948","Locust Dale","VA","38.349795","-78.11747","-5","1"
+"22949","Lovingston","VA","37.780882","-78.89239","-5","1"
+"22952","Lyndhurst","VA","37.969657","-78.95712","-5","1"
+"22953","Madison Mills","VA","38.428509","-78.267848","-5","1"
+"22954","Massies Mill","VA","37.790887","-79.00334","-5","1"
+"22957","Montpelier Station","VA","38.221405","-78.19026","-5","1"
+"22958","Nellysford","VA","37.905649","-78.90273","-5","1"
+"22959","North Garden","VA","37.935994","-78.64088","-5","1"
+"22960","Orange","VA","38.231526","-78.07923","-5","1"
+"22963","Palmyra","VA","37.871021","-78.30837","-5","1"
+"22964","Piney River","VA","37.725074","-78.99245","-5","1"
+"22965","Quinque","VA","38.330132","-78.475018","-5","1"
+"22967","Roseland","VA","37.79151","-78.98961","-5","1"
+"22968","Ruckersville","VA","38.233717","-78.41009","-5","1"
+"22969","Schuyler","VA","37.792343","-78.69417","-5","1"
+"22971","Shipman","VA","37.74747","-78.80233","-5","1"
+"22972","Somerset","VA","38.214023","-78.21596","-5","1"
+"22973","Stanardsville","VA","38.301191","-78.46396","-5","1"
+"22974","Troy","VA","37.959376","-78.26353","-5","1"
+"22976","Tyro","VA","37.840892","-79.02459","-5","1"
+"22980","Waynesboro","VA","38.076547","-78.89839","-5","1"
+"22987","White Hall","VA","38.179859","-78.618912","-5","1"
+"22989","Woodberry Forest","VA","38.292221","-78.11865","-5","1"
+"23001","Achilles","VA","37.293165","-76.41057","-5","1"
+"23002","Amelia Court House","VA","37.338511","-77.95893","-5","1"
+"23003","Ark","VA","37.432335","-76.601616","-5","1"
+"23004","Arvonia","VA","37.673369","-78.38899","-5","1"
+"23005","Ashland","VA","37.754254","-77.47465","-5","1"
+"23009","Aylett","VA","37.790757","-77.17553","-5","1"
+"23011","Barhamsville","VA","37.478184","-76.81384","-5","1"
+"23014","Beaumont","VA","37.733844","-77.888082","-5","1"
+"23015","Beaverdam","VA","37.931011","-77.64296","-5","1"
+"23017","Bellamy","VA","37.418242","-76.508402","-5","1"
+"23018","Bena","VA","37.418242","-76.508402","-5","1"
+"23021","Bohannon","VA","37.3946","-76.36571","-5","1"
+"23022","Bremo Bluff","VA","37.728067","-78.26865","-5","1"
+"23023","Bruington","VA","37.777938","-76.95055","-5","1"
+"23024","Bumpass","VA","37.961187","-77.76824","-5","1"
+"23025","Cardinal","VA","37.422209","-76.37304","-5","1"
+"23027","Cartersville","VA","37.653694","-78.11902","-5","1"
+"23030","Charles City","VA","37.342306","-77.0731","-5","1"
+"23031","Christchurch","VA","37.598391","-76.447551","-5","1"
+"23032","Church View","VA","37.674655","-76.68104","-5","1"
+"23035","Cobbs Creek","VA","37.514774","-76.37543","-5","1"
+"23038","Columbia","VA","37.758949","-78.14009","-5","1"
+"23039","Crozier","VA","37.643406","-77.80709","-5","1"
+"23040","Cumberland","VA","37.522085","-78.2553","-5","1"
+"23043","Deltaville","VA","37.550168","-76.34327","-5","1"
+"23045","Diggs","VA","37.426154","-76.26844","-5","1"
+"23047","Doswell","VA","37.855002","-77.47011","-5","1"
+"23050","Dutton","VA","37.490365","-76.44118","-5","1"
+"23054","Fife","VA","37.733844","-77.888082","-5","1"
+"23055","Fork Union","VA","37.782109","-78.23472","-5","1"
+"23056","Foster","VA","37.383629","-76.36167","-5","1"
+"23058","Glen Allen","VA","37.531296","-77.416103","-5","1"
+"23059","Glen Allen","VA","37.686152","-77.53651","-5","1"
+"23060","Glen Allen","VA","37.661647","-77.52632","-5","1"
+"23061","Gloucester","VA","37.414991","-76.52959","-5","1"
+"23062","Gloucester Point","VA","37.257466","-76.49661","-5","1"
+"23063","Goochland","VA","37.69536","-77.99793","-5","1"
+"23064","Grimstead","VA","37.50519","-76.29784","-5","1"
+"23065","Gum Spring","VA","37.801783","-77.92431","-5","1"
+"23066","Gwynn","VA","37.501358","-76.28453","-5","1"
+"23067","Hadensville","VA","37.825208","-77.989878","-5","1"
+"23068","Hallieford","VA","37.492529","-76.33636","-5","1"
+"23069","Hanover","VA","37.753904","-77.33963","-5","1"
+"23070","Hardyville","VA","37.551549","-76.39294","-5","1"
+"23071","Hartfield","VA","37.533471","-76.4609","-5","1"
+"23072","Hayes","VA","37.288999","-76.47393","-5","1"
+"23075","Highland Springs","VA","37.543595","-77.32339","-5","1"
+"23076","Hudgins","VA","37.475132","-76.31316","-5","1"
+"23079","Jamaica","VA","37.748645","-76.66735","-5","1"
+"23081","Jamestown","VA","37.223482","-76.783317","-5","1"
+"23083","Jetersville","VA","37.303726","-78.11349","-5","1"
+"23084","Kents Store","VA","37.90198","-78.09647","-5","1"
+"23085","King And Queen Court Hous","VA","37.711368","-76.85843","-5","1"
+"23086","King William","VA","37.64375","-77.02508","-5","1"
+"23089","Lanexa","VA","37.435153","-76.90719","-5","1"
+"23090","Lightfoot","VA","37.235892","-76.445567","-5","1"
+"23091","Little Plymouth","VA","37.638259","-76.82858","-5","1"
+"23092","Locust Hill","VA","37.593059","-76.50694","-5","1"
+"23093","Louisa","VA","37.995103","-78.04612","-5","1"
+"23101","Macon","VA","37.553314","-77.892964","-5","1"
+"23102","Maidens","VA","37.712894","-77.82379","-5","1"
+"23103","Manakin Sabot","VA","37.639354","-77.72841","-5","1"
+"23104","Gloucester Point","VA","37.298919","-76.530276","-5","1"
+"23105","Mannboro","VA","37.345032","-77.944868","-5","1"
+"23106","Manquin","VA","37.704693","-77.20342","-5","1"
+"23107","Maryus","VA","37.28641","-76.404783","-5","1"
+"23108","Mascot","VA","37.642543","-76.73554","-5","1"
+"23109","Mathews","VA","37.43704","-76.30724","-5","1"
+"23110","Mattaponi","VA","37.571544","-76.78066","-5","1"
+"23111","Mechanicsville","VA","37.605641","-77.31536","-5","1"
+"23112","Midlothian","VA","37.427988","-77.64868","-5","1"
+"23113","Midlothian","VA","37.51338","-77.64165","-5","1"
+"23115","Millers Tavern","VA","37.826347","-76.87751","-5","1"
+"23116","Mechanicsville","VA","37.662559","-77.36778","-5","1"
+"23117","Mineral","VA","38.007186","-77.86809","-5","1"
+"23119","Moon","VA","37.451894","-76.2904","-5","1"
+"23120","Moseley","VA","37.422868","-77.7813","-5","1"
+"23123","New Canton","VA","37.663039","-78.2868","-5","1"
+"23124","New Kent","VA","37.545276","-77.06664","-5","1"
+"23125","New Point","VA","37.342721","-76.27989","-5","1"
+"23126","Newtown","VA","37.902954","-77.14586","-5","1"
+"23127","Norge","VA","37.310451","-76.746769","-5","1"
+"23128","North","VA","37.456363","-76.43298","-5","1"
+"23129","Oilville","VA","37.698646","-77.77111","-5","1"
+"23130","Onemo","VA","37.405038","-76.27785","-5","1"
+"23131","Ordinary","VA","37.312159","-76.518831","-5","1"
+"23138","Port Haywood","VA","37.366838","-76.29577","-5","1"
+"23139","Powhatan","VA","37.55563","-77.90048","-5","1"
+"23140","Providence Forge","VA","37.438569","-77.03578","-5","1"
+"23141","Quinton","VA","37.506369","-77.15127","-5","1"
+"23146","Rockville","VA","37.725675","-77.69002","-5","1"
+"23147","Ruthville","VA","37.37956","-77.034752","-5","1"
+"23148","Saint Stephens Church","VA","37.837177","-77.05555","-5","1"
+"23149","Saluda","VA","37.5787","-76.60916","-5","1"
+"23150","Sandston","VA","37.517804","-77.28678","-5","1"
+"23153","Sandy Hook","VA","37.787745","-77.96916","-5","1"
+"23154","Schley","VA","37.418242","-76.508402","-5","1"
+"23155","Severn","VA","37.418242","-76.508402","-5","1"
+"23156","Shacklefords","VA","37.501267","-76.72389","-5","1"
+"23160","State Farm","VA","37.733844","-77.888082","-5","1"
+"23161","Stevensville","VA","37.701245","-76.92919","-5","1"
+"23162","Studley","VA","37.772187","-77.45264","-5","1"
+"23163","Susan","VA","37.357742","-76.30136","-5","1"
+"23168","Toano","VA","37.403872","-76.81744","-5","1"
+"23169","Topping","VA","37.599217","-76.45876","-5","1"
+"23170","Trevilians","VA","37.940788","-77.996956","-5","1"
+"23173","University Of Richmond","VA","37.524246","-77.493157","-5","1"
+"23175","Urbanna","VA","37.648536","-76.59872","-5","1"
+"23176","Wake","VA","37.571789","-76.41631","-5","1"
+"23177","Walkerton","VA","37.728152","-76.99901","-5","1"
+"23178","Ware Neck","VA","37.400287","-76.46089","-5","1"
+"23180","Water View","VA","37.710586","-76.63179","-5","1"
+"23181","West Point","VA","37.559878","-76.83018","-5","1"
+"23183","White Marsh","VA","37.363201","-76.532492","-5","1"
+"23184","Wicomico","VA","37.285188","-76.5298","-5","1"
+"23185","Williamsburg","VA","37.256301","-76.70024","-5","1"
+"23186","Williamsburg","VA","37.270994","-76.71722","-5","1"
+"23187","Williamsburg","VA","37.310451","-76.746769","-5","1"
+"23188","Williamsburg","VA","37.322936","-76.75793","-5","1"
+"23190","Woods Cross Roads","VA","37.482039","-76.636154","-5","1"
+"23191","Zanoni","VA","37.418242","-76.508402","-5","1"
+"23192","Montpelier","VA","37.813901","-77.68952","-5","1"
+"23201","Richmond","VA","37.541106","-77.431825","-5","1"
+"23218","Richmond","VA","37.524246","-77.493157","-5","1"
+"23219","Richmond","VA","37.541046","-77.43536","-5","1"
+"23220","Richmond","VA","37.549396","-77.45739","-5","1"
+"23221","Richmond","VA","37.557626","-77.48844","-5","1"
+"23222","Richmond","VA","37.573595","-77.42504","-5","1"
+"23223","Richmond","VA","37.544746","-77.40085","-5","1"
+"23224","Richmond","VA","37.505147","-77.46101","-5","1"
+"23225","Richmond","VA","37.51918","-77.49851","-5","1"
+"23226","Richmond","VA","37.581696","-77.51709","-5","1"
+"23227","Richmond","VA","37.606778","-77.44775","-5","1"
+"23228","Richmond","VA","37.621745","-77.48896","-5","1"
+"23229","Richmond","VA","37.593546","-77.56271","-5","1"
+"23230","Richmond","VA","37.580346","-77.48831","-5","1"
+"23231","Richmond","VA","37.482896","-77.36304","-5","1"
+"23232","Richmond","VA","37.520187","-77.408359","-5","1"
+"23233","Richmond","VA","37.622465","-77.61965","-5","1"
+"23234","Richmond","VA","37.457341","-77.4658","-5","1"
+"23235","Richmond","VA","37.522514","-77.56565","-5","1"
+"23236","Richmond","VA","37.475798","-77.58235","-5","1"
+"23237","Richmond","VA","37.406204","-77.4533","-5","1"
+"23238","Richmond","VA","37.733844","-77.888082","-5","1"
+"23240","Richmond","VA","37.524246","-77.493157","-5","1"
+"23241","Richmond","VA","37.524246","-77.493157","-5","1"
+"23242","Richmond","VA","37.531296","-77.416103","-5","1"
+"23249","Richmond","VA","37.524246","-77.493157","-5","1"
+"23250","Richmond","VA","37.507498","-77.332916","-5","1"
+"23255","Richmond","VA","37.531296","-77.416103","-5","1"
+"23260","Richmond","VA","37.524246","-77.493157","-5","1"
+"23261","Richmond","VA","37.524246","-77.493157","-5","1"
+"23266","Richmond","VA","37.567896","-77.528308","-5","1"
+"23269","Richmond","VA","37.524246","-77.493157","-5","1"
+"23270","Richmond","VA","37.524246","-77.493157","-5","1"
+"23272","Richmond","VA","37.524246","-77.493157","-5","1"
+"23273","Richmond","VA","37.524246","-77.493157","-5","1"
+"23274","Richmond","VA","37.524246","-77.493157","-5","1"
+"23275","Richmond","VA","37.524246","-77.493157","-5","1"
+"23276","Richmond","VA","37.524246","-77.493157","-5","1"
+"23278","Richmond","VA","37.524246","-77.493157","-5","1"
+"23279","Richmond","VA","37.524246","-77.493157","-5","1"
+"23280","Richmond","VA","37.637622","-77.46836","-5","1"
+"23282","Richmond","VA","37.524246","-77.493157","-5","1"
+"23284","Richmond","VA","37.549446","-77.451155","-5","1"
+"23285","Richmond","VA","37.524246","-77.493157","-5","1"
+"23286","Richmond","VA","37.524246","-77.493157","-5","1"
+"23288","Richmond","VA","37.531296","-77.416103","-5","1"
+"23289","Richmond","VA","37.531296","-77.416103","-5","1"
+"23290","Richmond","VA","37.524246","-77.493157","-5","1"
+"23291","Richmond","VA","37.524246","-77.493157","-5","1"
+"23292","Richmond","VA","37.524246","-77.493157","-5","1"
+"23293","Richmond","VA","37.524246","-77.493157","-5","1"
+"23294","Richmond","VA","37.633316","-77.54775","-5","1"
+"23297","Richmond","VA","37.389721","-77.561266","-5","1"
+"23298","Richmond","VA","37.539694","-77.42815","-5","1"
+"23301","Accomac","VA","37.713561","-75.67108","-5","1"
+"23302","Assawoman","VA","37.870022","-75.53554","-5","1"
+"23303","Atlantic","VA","37.892445","-75.51107","-5","1"
+"23304","Battery Park","VA","36.99497","-76.56901","-5","1"
+"23306","Belle Haven","VA","37.560093","-75.86182","-5","1"
+"23307","Birdsnest","VA","37.434719","-75.87767","-5","1"
+"23308","Bloxom","VA","37.828492","-75.61896","-5","1"
+"23310","Cape Charles","VA","37.26252","-75.97104","-5","1"
+"23313","Capeville","VA","37.201937","-75.952409","-5","1"
+"23314","Carrollton","VA","36.940626","-76.5378","-5","1"
+"23315","Carrsville","VA","36.740632","-76.84517","-5","1"
+"23316","Cheriton","VA","37.284061","-75.96909","-5","1"
+"23320","Chesapeake","VA","36.761698","-76.24511","-5","1"
+"23321","Chesapeake","VA","36.826239","-76.41524","-5","1"
+"23322","Chesapeake","VA","36.687543","-76.22905","-5","1"
+"23323","Chesapeake","VA","36.757815","-76.3358","-5","1"
+"23324","Chesapeake","VA","36.805717","-76.27126","-5","1"
+"23325","Chesapeake","VA","36.814897","-76.23848","-5","1"
+"23326","Chesapeake","VA","36.777015","-76.239417","-5","1"
+"23327","Chesapeake","VA","36.7085","-76.278531","-5","1"
+"23328","Chesapeake","VA","36.7085","-76.278531","-5","1"
+"23336","Chincoteague Island","VA","37.934673","-75.3678","-5","1"
+"23337","Wallops Island","VA","37.931216","-75.47192","-5","1"
+"23341","Craddockville","VA","37.577292","-75.864607","-5","1"
+"23345","Davis Wharf","VA","37.738248","-75.701449","-5","1"
+"23347","Eastville","VA","37.353286","-75.94203","-5","1"
+"23350","Exmore","VA","37.522269","-75.86132","-5","1"
+"23351","Exmore","VA","37.528076","-75.822769","-5","1"
+"23354","Franktown","VA","37.479588","-75.90262","-5","1"
+"23356","Greenbackville","VA","37.999025","-75.41634","-5","1"
+"23357","Greenbush","VA","37.754497","-75.67974","-5","1"
+"23358","Hacksneck","VA","37.635833","-75.86849","-5","1"
+"23359","Hallwood","VA","37.876357","-75.59686","-5","1"
+"23380","Exmore","VA","37.529341","-75.816851","-5","1"
+"23389","Harborton","VA","37.661513","-75.8315","-5","1"
+"23395","Horntown","VA","37.95715","-75.45296","-5","1"
+"23396","Oak Hall","VA","37.923682","-75.555142","-5","1"
+"23397","Isle Of Wight","VA","36.898915","-76.687745","-5","1"
+"23398","Jamesville","VA","37.534336","-75.877052","-5","1"
+"23399","Jenkins Bridge","VA","37.916218","-75.616754","-5","1"
+"23401","Keller","VA","37.61686","-75.76512","-5","1"
+"23404","Locustville","VA","37.635838","-75.66642","-5","1"
+"23405","Machipongo","VA","37.425567","-75.93117","-5","1"
+"23407","Mappsville","VA","37.848467","-75.55559","-5","1"
+"23408","Marionville","VA","37.424497","-75.877143","-5","1"
+"23409","Mears","VA","37.859953","-75.62995","-5","1"
+"23410","Melfa","VA","37.64682","-75.73996","-5","1"
+"23412","Modest Town","VA","37.790415","-75.60347","-5","1"
+"23413","Nassawadox","VA","37.452186","-75.84523","-5","1"
+"23414","Nelsonia","VA","37.816896","-75.583227","-5","1"
+"23415","New Church","VA","37.973042","-75.53045","-5","1"
+"23416","Oak Hall","VA","37.9268","-75.55339","-5","1"
+"23417","Onancock","VA","37.70973","-75.76272","-5","1"
+"23418","Onley","VA","37.685447","-75.71051","-5","1"
+"23419","Oyster","VA","37.307411","-75.926877","-5","1"
+"23420","Painter","VA","37.589068","-75.79947","-5","1"
+"23421","Parksley","VA","37.780966","-75.64895","-5","1"
+"23422","Pungoteague","VA","37.616183","-75.791519","-5","1"
+"23423","Quinby","VA","37.549044","-75.73237","-5","1"
+"23424","Rescue","VA","36.996881","-76.564516","-5","1"
+"23426","Sanford","VA","37.93359","-75.67692","-5","1"
+"23427","Saxis","VA","37.92358","-75.72178","-5","1"
+"23429","Seaview","VA","37.271104","-75.953608","-5","1"
+"23430","Smithfield","VA","36.978861","-76.63973","-5","1"
+"23431","Smithfield","VA","36.898915","-76.687745","-5","1"
+"23432","Suffolk","VA","36.871628","-76.56063","-5","1"
+"23433","Suffolk","VA","36.906805","-76.49899","-5","1"
+"23434","Suffolk","VA","36.735893","-76.59656","-5","1"
+"23435","Suffolk","VA","36.84882","-76.46521","-5","1"
+"23436","Suffolk","VA","36.894736","-76.51281","-5","1"
+"23437","Suffolk","VA","36.642645","-76.82272","-5","1"
+"23438","Suffolk","VA","36.578692","-76.70129","-5","1"
+"23439","Suffolk","VA","36.746101","-76.665251","-5","1"
+"23440","Tangier","VA","37.847652","-75.99404","-5","1"
+"23441","Tasley","VA","37.711442","-75.70044","-5","1"
+"23442","Temperanceville","VA","37.887538","-75.53645","-5","1"
+"23443","Townsend","VA","37.188217","-75.969003","-5","1"
+"23450","Virginia Beach","VA","36.844004","-76.12036","-5","1"
+"23451","Virginia Beach","VA","36.864788","-76.00098","-5","1"
+"23452","Virginia Beach","VA","36.839209","-76.09333","-5","1"
+"23453","Virginia Beach","VA","36.786753","-76.082079","-5","1"
+"23454","Virginia Beach","VA","36.838398","-76.02862","-5","1"
+"23455","Virginia Beach","VA","36.889797","-76.1426","-5","1"
+"23456","Virginia Beach","VA","36.762459","-76.06139","-5","1"
+"23457","Virginia Beach","VA","36.600219","-76.03592","-5","1"
+"23458","Virginia Beach","VA","36.847388","-76.15581","-5","1"
+"23459","Virginia Beach","VA","36.926647","-76.02058","-5","1"
+"23460","Virginia Beach","VA","36.837598","-76.026053","-5","1"
+"23461","Virginia Beach","VA","36.795328","-75.97768","-5","1"
+"23462","Virginia Beach","VA","36.839648","-76.15177","-5","1"
+"23463","Virginia Beach","VA","36.795669","-76.012628","-5","1"
+"23464","Virginia Beach","VA","36.799284","-76.17767","-5","1"
+"23465","Virginia Beach","VA","36.851243","-76.169215","-5","1"
+"23466","Virginia Beach","VA","36.795669","-76.012628","-5","1"
+"23467","Virginia Beach","VA","36.795669","-76.012628","-5","1"
+"23468","Virginia Beach","VA","36.843948","-76.142407","-5","1"
+"23471","Virginia Beach","VA","36.795669","-76.012628","-5","1"
+"23472","Gloucester Point","VA","37.294975","-76.527425","-5","1"
+"23479","Virginia Beach","VA","36.795669","-76.012628","-5","1"
+"23480","Wachapreague","VA","37.605335","-75.69088","-5","1"
+"23482","Wardtown","VA","37.273986","-75.86913","-5","1"
+"23483","Wattsville","VA","37.943726","-75.502306","-5","1"
+"23486","Willis Wharf","VA","37.518917","-75.810482","-5","1"
+"23487","Windsor","VA","36.828408","-76.73506","-5","1"
+"23488","Withams","VA","37.952168","-75.59681","-5","1"
+"23501","Norfolk","VA","36.895911","-76.208521","-5","1"
+"23502","Norfolk","VA","36.855247","-76.21233","-5","1"
+"23503","Norfolk","VA","36.942947","-76.2547","-5","1"
+"23504","Norfolk","VA","36.859362","-76.27028","-5","1"
+"23505","Norfolk","VA","36.913147","-76.28444","-5","1"
+"23506","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23507","Norfolk","VA","36.864047","-76.29947","-5","1"
+"23508","Norfolk","VA","36.886447","-76.30065","-5","1"
+"23509","Norfolk","VA","36.880297","-76.2596","-5","1"
+"23510","Norfolk","VA","36.852547","-76.29028","-5","1"
+"23511","Norfolk","VA","36.935579","-76.303417","-5","1"
+"23512","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23513","Norfolk","VA","36.888147","-76.23909","-5","1"
+"23514","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23515","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23517","Norfolk","VA","36.870197","-76.29271","-5","1"
+"23518","Norfolk","VA","36.916497","-76.21796","-5","1"
+"23519","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23520","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23521","Norfolk","VA","36.916397","-76.1527","-5","1"
+"23523","Norfolk","VA","36.830936","-76.27354","-5","1"
+"23529","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23530","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23541","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23551","Norfolk","VA","36.931166","-76.23972","-5","1"
+"23601","Newport News","VA","37.053346","-76.45948","-5","1"
+"23602","Newport News","VA","37.115698","-76.5183","-5","1"
+"23603","Newport News","VA","37.193712","-76.57178","-5","1"
+"23604","Fort Eustis","VA","37.144943","-76.58677","-5","1"
+"23605","Newport News","VA","37.019453","-76.43651","-5","1"
+"23606","Newport News","VA","37.078196","-76.49446","-5","1"
+"23607","Newport News","VA","36.987151","-76.4195","-5","1"
+"23608","Newport News","VA","37.151315","-76.54812","-5","1"
+"23609","Newport News","VA","37.195924","-76.524805","-5","1"
+"23612","Newport News","VA","37.195924","-76.524805","-5","1"
+"23620","Franklin","VA","36.694658","-76.965091","-5","1"
+"23628","Newport News","VA","37.195924","-76.524805","-5","1"
+"23630","Hampton","VA","37.072658","-76.38992","-5","1"
+"23631","Hampton","VA","37.072658","-76.38992","-5","1"
+"23642","Virginia Beach","VA","36.843073","-76.154882","-5","1"
+"23651","Fort Monroe","VA","37.002997","-76.32039","-5","1"
+"23653","Hampton","VA","37.072658","-76.38992","-5","1"
+"23661","Hampton","VA","37.005814","-76.38316","-5","1"
+"23662","Poquoson","VA","37.131237","-76.38089","-5","1"
+"23663","Hampton","VA","37.031474","-76.31637","-5","1"
+"23664","Hampton","VA","37.056778","-76.29373","-5","1"
+"23665","Hampton","VA","37.098317","-76.4196","-5","1"
+"23666","Hampton","VA","37.050946","-76.40711","-5","1"
+"23667","Hampton","VA","37.019346","-76.331815","-5","1"
+"23668","Hampton","VA","37.020596","-76.337715","-5","1"
+"23669","Hampton","VA","37.037946","-76.34415","-5","1"
+"23670","Hampton","VA","37.072658","-76.38992","-5","1"
+"23681","Hampton","VA","37.072658","-76.38992","-5","1"
+"23690","Yorktown","VA","37.227904","-76.51278","-5","1"
+"23691","Yorktown","VA","37.257932","-76.56076","-5","1"
+"23692","Yorktown","VA","37.178417","-76.46751","-5","1"
+"23693","Yorktown","VA","37.112915","-76.43591","-5","1"
+"23694","Lackey","VA","37.223152","-76.55901","-5","1"
+"23696","Seaford","VA","37.191262","-76.42135","-5","1"
+"23701","Portsmouth","VA","36.810448","-76.36811","-5","1"
+"23702","Portsmouth","VA","36.803981","-76.32386","-5","1"
+"23703","Portsmouth","VA","36.867248","-76.38232","-5","1"
+"23704","Portsmouth","VA","36.830748","-76.31369","-5","1"
+"23705","Portsmouth","VA","36.868553","-76.355165","-5","1"
+"23707","Portsmouth","VA","36.835215","-76.3457","-5","1"
+"23708","Portsmouth","VA","36.846562","-76.30803","-5","1"
+"23709","Portsmouth","VA","36.868553","-76.355165","-5","1"
+"23801","Fort Lee","VA","37.241173","-77.34845","-5","1"
+"23803","Petersburg","VA","37.21695","-77.43063","-5","1"
+"23804","Petersburg","VA","37.204765","-77.392784","-5","1"
+"23805","Petersburg","VA","37.174217","-77.39008","-5","1"
+"23806","Petersburg","VA","37.204765","-77.392784","-5","1"
+"23810","Cape Charles","VA","37.268263","-76.007162","-5","1"
+"23814","Gloucester Point","VA","37.285231","-76.531577","-5","1"
+"23821","Alberta","VA","36.87229","-77.91125","-5","1"
+"23822","Ammon","VA","37.072361","-77.647495","-5","1"
+"23824","Blackstone","VA","37.070975","-77.98876","-5","1"
+"23827","Boykins","VA","36.602472","-77.20851","-5","1"
+"23828","Branchville","VA","36.582188","-77.27759","-5","1"
+"23829","Capron","VA","36.724498","-77.21893","-5","1"
+"23830","Carson","VA","37.01775","-77.39475","-5","1"
+"23831","Chester","VA","37.350999","-77.43959","-5","1"
+"23832","Chesterfield","VA","37.405699","-77.5838","-5","1"
+"23833","Church Road","VA","37.197024","-77.66932","-5","1"
+"23834","Colonial Heights","VA","37.265403","-77.40438","-5","1"
+"23836","Chester","VA","37.343005","-77.34604","-5","1"
+"23837","Courtland","VA","36.740306","-77.07132","-5","1"
+"23838","Chesterfield","VA","37.328232","-77.61364","-5","1"
+"23839","Dendron","VA","37.079298","-76.92155","-5","1"
+"23840","Dewitt","VA","37.066833","-77.6675","-5","1"
+"23841","Dinwiddie","VA","37.055849","-77.56349","-5","1"
+"23842","Disputanta","VA","37.126708","-77.23281","-5","1"
+"23843","Dolphin","VA","36.848712","-77.80682","-5","1"
+"23844","Drewryville","VA","36.688788","-77.31072","-5","1"
+"23845","Ebony","VA","36.554164","-78.01408","-5","1"
+"23846","Elberon","VA","37.064244","-76.82637","-5","1"
+"23847","Emporia","VA","36.68627","-77.56121","-5","1"
+"23850","Ford","VA","37.169066","-77.74358","-5","1"
+"23851","Franklin","VA","36.668255","-76.93945","-5","1"
+"23856","Freeman","VA","36.776189","-77.71289","-5","1"
+"23857","Gasburg","VA","36.576549","-77.88467","-5","1"
+"23860","Hopewell","VA","37.287869","-77.29359","-5","1"
+"23866","Ivor","VA","36.907991","-76.89025","-5","1"
+"23867","Jarratt","VA","36.811276","-77.47496","-5","1"
+"23868","Lawrenceville","VA","36.722176","-77.81269","-5","1"
+"23870","Jarratt","VA","36.721471","-77.531996","-5","1"
+"23872","McKenney","VA","36.993498","-77.74687","-5","1"
+"23873","Meredithville","VA","36.80878","-77.954397","-5","1"
+"23874","Newsoms","VA","36.610636","-77.10269","-5","1"
+"23875","Prince George","VA","37.235949","-77.30259","-5","1"
+"23876","Rawlings","VA","36.951449","-77.82402","-5","1"
+"23878","Sedley","VA","36.822024","-77.02404","-5","1"
+"23879","Skippers","VA","36.584448","-77.58854","-5","1"
+"23881","Spring Grove","VA","37.181764","-77.0026","-5","1"
+"23882","Stony Creek","VA","36.928972","-77.41971","-5","1"
+"23883","Surry","VA","37.14051","-76.74342","-5","1"
+"23884","Sussex","VA","36.945667","-77.253913","-5","1"
+"23885","Sutherland","VA","37.191579","-77.56682","-5","1"
+"23887","Valentines","VA","36.563755","-77.82652","-5","1"
+"23888","Wakefield","VA","36.963354","-76.98127","-5","1"
+"23889","Warfield","VA","36.912369","-77.75239","-5","1"
+"23890","Waverly","VA","37.005989","-77.09819","-5","1"
+"23891","Waverly","VA","36.909845","-77.286287","-5","1"
+"23893","White Plains","VA","36.628802","-77.92817","-5","1"
+"23894","Wilsons","VA","37.127935","-77.83918","-5","1"
+"23897","Yale","VA","36.828831","-77.28288","-5","1"
+"23898","Zuni","VA","36.836423","-76.83731","-5","1"
+"23899","Claremont","VA","37.227291","-76.96545","-5","1"
+"23901","Farmville","VA","37.307946","-78.40144","-5","1"
+"23909","Farmville","VA","37.301574","-78.394944","-5","1"
+"23915","Baskerville","VA","36.694531","-78.28794","-5","1"
+"23917","Boydton","VA","36.615944","-78.3102","-5","1"
+"23919","Bracey","VA","36.567521","-78.12176","-5","1"
+"23920","Brodnax","VA","36.732859","-77.99591","-5","1"
+"23921","Buckingham","VA","37.581656","-78.62058","-5","1"
+"23922","Burkeville","VA","37.191053","-78.2117","-5","1"
+"23923","Charlotte Court House","VA","37.074876","-78.63263","-5","1"
+"23924","Chase City","VA","36.806422","-78.46048","-5","1"
+"23927","Clarksville","VA","36.61665","-78.54018","-5","1"
+"23930","Crewe","VA","37.173493","-78.11236","-5","1"
+"23934","Cullen","VA","37.164981","-78.62592","-5","1"
+"23936","Dillwyn","VA","37.529284","-78.49082","-5","1"
+"23937","Drakes Branch","VA","36.958048","-78.53403","-5","1"
+"23938","Dundas","VA","36.909504","-78.00646","-5","1"
+"23939","Evergreen","VA","37.312972","-78.77203","-5","1"
+"23941","Fort Mitchell","VA","36.948129","-78.248333","-5","1"
+"23942","Green Bay","VA","37.129269","-78.30107","-5","1"
+"23943","Hampden Sydney","VA","37.241732","-78.4632","-5","1"
+"23944","Kenbridge","VA","36.925375","-78.11767","-5","1"
+"23947","Keysville","VA","37.029877","-78.4643","-5","1"
+"23950","La Crosse","VA","36.678507","-78.08098","-5","1"
+"23952","Lunenburg","VA","36.930088","-78.29215","-5","1"
+"23954","Meherrin","VA","37.097705","-78.37823","-5","1"
+"23955","Nottoway","VA","37.116094","-78.057832","-5","1"
+"23958","Pamplin","VA","37.264896","-78.66558","-5","1"
+"23959","Phenix","VA","37.094313","-78.77182","-5","1"
+"23960","Prospect","VA","37.310203","-78.55359","-5","1"
+"23962","Randolph","VA","37.017706","-78.73668","-5","1"
+"23963","Red House","VA","37.197072","-78.81694","-5","1"
+"23964","Red Oak","VA","36.780021","-78.62102","-5","1"
+"23966","Rice","VA","37.284087","-78.27559","-5","1"
+"23967","Saxe","VA","36.913228","-78.63611","-5","1"
+"23968","Skipwith","VA","36.702863","-78.51218","-5","1"
+"23970","South Hill","VA","36.733874","-78.17287","-5","1"
+"23974","Victoria","VA","36.987595","-78.23285","-5","1"
+"23976","Wylliesburg","VA","36.848612","-78.59064","-5","1"
+"23999","Richmond","VA","37.561962","-77.425452","-5","1"
+"24001","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24002","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24003","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24004","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24005","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24006","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24007","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24008","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24009","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24010","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24011","Roanoke","VA","37.270637","-79.94155","-5","1"
+"24012","Roanoke","VA","37.305769","-79.92767","-5","1"
+"24013","Roanoke","VA","37.267137","-79.92645","-5","1"
+"24014","Roanoke","VA","37.236753","-79.93549","-5","1"
+"24015","Roanoke","VA","37.258787","-79.97816","-5","1"
+"24016","Roanoke","VA","37.272186","-79.95321","-5","1"
+"24017","Roanoke","VA","37.290886","-79.98256","-5","1"
+"24018","Roanoke","VA","37.229786","-80.02477","-5","1"
+"24019","Roanoke","VA","37.341428","-79.95049","-5","1"
+"24020","Roanoke","VA","37.357149","-79.94541","-5","1"
+"24022","Roanoke","VA","37.278439","-79.933206","-5","1"
+"24023","Roanoke","VA","37.210663","-80.406172","-5","1"
+"24024","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24025","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24026","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24027","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24028","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24029","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24030","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24031","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24032","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24033","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24034","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24035","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24036","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24037","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24038","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24040","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24042","Roanoke","VA","37.271687","-79.939228","-5","1"
+"24043","Roanoke","VA","37.269168","-79.939905","-5","1"
+"24044","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24045","Roanoke","VA","37.268618","-79.940655","-5","1"
+"24048","Roanoke","VA","37.274175","-79.95786","-5","1"
+"24050","Roanoke","VA","37.555083","-79.786151","-5","1"
+"24053","Ararat","VA","36.618824","-80.53102","-5","1"
+"24054","Axton","VA","36.677075","-79.70604","-5","1"
+"24055","Bassett","VA","36.757893","-80.00161","-5","1"
+"24058","Belspring","VA","37.189876","-80.59761","-5","1"
+"24059","Bent Mountain","VA","37.146244","-80.12562","-5","1"
+"24060","Blacksburg","VA","37.232027","-80.42127","-5","1"
+"24061","Blacksburg","VA","37.179115","-80.351482","-5","1"
+"24062","Blacksburg","VA","37.174227","-80.395698","-5","1"
+"24063","Blacksburg","VA","37.174227","-80.395698","-5","1"
+"24064","Blue Ridge","VA","37.373117","-79.79043","-5","1"
+"24065","Boones Mill","VA","37.116716","-79.95528","-5","1"
+"24066","Buchanan","VA","37.532991","-79.68004","-5","1"
+"24067","Callaway","VA","37.010772","-80.08111","-5","1"
+"24068","Christiansburg","VA","37.154804","-80.418396","-5","1"
+"24069","Cascade","VA","36.586545","-79.64194","-5","1"
+"24070","Catawba","VA","37.361962","-80.19485","-5","1"
+"24072","Check","VA","37.040036","-80.2167","-5","1"
+"24073","Christiansburg","VA","37.136013","-80.41222","-5","1"
+"24076","Claudville","VA","36.580514","-80.4332","-5","1"
+"24077","Cloverdale","VA","37.369313","-79.90303","-5","1"
+"24078","Collinsville","VA","36.720217","-79.91425","-5","1"
+"24079","Copper Hill","VA","37.043459","-80.14868","-5","1"
+"24082","Critz","VA","36.625817","-80.13542","-5","1"
+"24083","Daleville","VA","37.407301","-79.91761","-5","1"
+"24084","Dublin","VA","37.107273","-80.67384","-5","1"
+"24085","Eagle Rock","VA","37.671394","-79.81681","-5","1"
+"24086","Eggleston","VA","37.287326","-80.62194","-5","1"
+"24087","Elliston","VA","37.218668","-80.2335","-5","1"
+"24088","Ferrum","VA","36.901203","-80.0715","-5","1"
+"24089","Fieldale","VA","36.70487","-79.95681","-5","1"
+"24090","Fincastle","VA","37.512912","-79.87046","-5","1"
+"24091","Floyd","VA","36.910051","-80.30871","-5","1"
+"24092","Glade Hill","VA","37.014685","-79.75335","-5","1"
+"24093","Glen Lyn","VA","37.377877","-80.85658","-5","1"
+"24094","Goldbond","VA","37.427111","-80.55227","-5","1"
+"24095","Goodview","VA","37.21556","-79.73922","-5","1"
+"24101","Hardy","VA","37.180713","-79.76536","-5","1"
+"24102","Henry","VA","36.838473","-79.99093","-5","1"
+"24104","Huddleston","VA","37.107479","-79.53046","-5","1"
+"24105","Indian Valley","VA","36.901524","-80.5936","-5","1"
+"24111","McCoy","VA","37.174227","-80.395698","-5","1"
+"24112","Martinsville","VA","36.696264","-79.86879","-5","1"
+"24113","Martinsville","VA","36.679571","-79.865168","-5","1"
+"24114","Martinsville","VA","36.679571","-79.865168","-5","1"
+"24115","Martinsville","VA","36.679571","-79.865168","-5","1"
+"24120","Meadows Of Dan","VA","36.720001","-80.41975","-5","1"
+"24121","Moneta","VA","37.145705","-79.64786","-5","1"
+"24122","Montvale","VA","37.413397","-79.70789","-5","1"
+"24124","Narrows","VA","37.331818","-80.80847","-5","1"
+"24126","Newbern","VA","37.069206","-80.689067","-5","1"
+"24127","New Castle","VA","37.505033","-80.17302","-5","1"
+"24128","Newport","VA","37.325758","-80.47021","-5","1"
+"24129","New River","VA","37.096403","-80.608056","-5","1"
+"24130","Oriskany","VA","37.555083","-79.786151","-5","1"
+"24131","Paint Bank","VA","37.562902","-80.2538","-5","1"
+"24132","Parrott","VA","37.210996","-80.62751","-5","1"
+"24133","Patrick Springs","VA","36.677978","-80.13511","-5","1"
+"24134","Pearisburg","VA","37.291252","-80.73601","-5","1"
+"24136","Pembroke","VA","37.31803","-80.62267","-5","1"
+"24137","Penhook","VA","36.947422","-79.63536","-5","1"
+"24138","Pilot","VA","37.048647","-80.32048","-5","1"
+"24139","Pittsville","VA","37.010279","-79.47217","-5","1"
+"24141","Radford","VA","37.11979","-80.57325","-5","1"
+"24142","Radford","VA","37.138427","-80.55031","-5","1"
+"24143","Radford","VA","37.122583","-80.562913","-5","1"
+"24146","Redwood","VA","37.006912","-79.913875","-5","1"
+"24147","Rich Creek","VA","37.38389","-80.81734","-5","1"
+"24148","Ridgeway","VA","36.595224","-79.87353","-5","1"
+"24149","Riner","VA","37.011934","-80.41897","-5","1"
+"24150","Ripplemead","VA","37.351691","-80.67726","-5","1"
+"24151","Rocky Mount","VA","36.980013","-79.88027","-5","1"
+"24153","Salem","VA","37.288807","-80.07821","-5","1"
+"24155","Salem","VA","37.288384","-80.067062","-5","1"
+"24156","Salem","VA","37.288384","-80.067062","-5","1"
+"24157","Salem","VA","37.288384","-80.067062","-5","1"
+"24161","Sandy Level","VA","36.985629","-79.53939","-5","1"
+"24162","Shawsville","VA","37.14374","-80.26233","-5","1"
+"24165","Spencer","VA","36.590431","-80.03589","-5","1"
+"24167","Staffordsville","VA","37.240021","-80.73083","-5","1"
+"24168","Stanleytown","VA","36.734651","-79.94572","-5","1"
+"24171","Stuart","VA","36.655575","-80.23909","-5","1"
+"24174","Thaxton","VA","37.357587","-79.66552","-5","1"
+"24175","Troutville","VA","37.427597","-79.90595","-5","1"
+"24176","Union Hall","VA","37.024494","-79.69241","-5","1"
+"24177","Vesta","VA","36.724064","-80.35806","-5","1"
+"24178","Villamont","VA","37.310494","-79.789799","-5","1"
+"24179","Vinton","VA","37.276218","-79.8524","-5","1"
+"24184","Wirtz","VA","37.068743","-79.74911","-5","1"
+"24185","Woolwine","VA","36.806528","-80.26895","-5","1"
+"24201","Bristol","VA","36.606582","-82.18087","-5","1"
+"24202","Bristol","VA","36.645419","-82.18137","-5","1"
+"24203","Bristol","VA","36.761613","-81.968712","-5","1"
+"24209","Bristol","VA","36.761613","-81.968712","-5","1"
+"24210","Abingdon","VA","36.728639","-82.00845","-5","1"
+"24211","Abingdon","VA","36.657812","-81.96207","-5","1"
+"24212","Abingdon","VA","36.690942","-81.970764","-5","1"
+"24215","Andover","VA","36.921924","-82.79644","-5","1"
+"24216","Appalachia","VA","36.919476","-82.78974","-5","1"
+"24217","Bee","VA","37.082275","-82.18978","-5","1"
+"24218","Ben Hur","VA","36.733931","-83.0635","-5","1"
+"24219","Big Stone Gap","VA","36.851953","-82.77056","-5","1"
+"24220","Birchleaf","VA","37.138489","-82.25643","-5","1"
+"24221","Blackwater","VA","36.627827","-82.96464","-5","1"
+"24224","Castlewood","VA","36.870051","-82.27792","-5","1"
+"24225","Cleveland","VA","36.968491","-82.1623","-5","1"
+"24226","Clinchco","VA","37.147222","-82.34369","-5","1"
+"24228","Clintwood","VA","37.153509","-82.44936","-5","1"
+"24230","Coeburn","VA","36.952634","-82.46657","-5","1"
+"24236","Damascus","VA","36.624632","-81.76732","-5","1"
+"24237","Dante","VA","37.001752","-82.28089","-5","1"
+"24239","Davenport","VA","37.107474","-82.12413","-5","1"
+"24243","Dryden","VA","36.780481","-82.94428","-5","1"
+"24244","Duffield","VA","36.70122","-82.79538","-5","1"
+"24245","Dungannon","VA","36.844539","-82.49147","-5","1"
+"24246","East Stone Gap","VA","36.864429","-82.737469","-5","1"
+"24248","Ewing","VA","36.62928","-83.48322","-5","1"
+"24250","Fort Blackmore","VA","36.759614","-82.59473","-5","1"
+"24251","Gate City","VA","36.642027","-82.58685","-5","1"
+"24256","Haysi","VA","37.213189","-82.29759","-5","1"
+"24258","Hiltons","VA","36.658518","-82.42645","-5","1"
+"24260","Honaker","VA","37.02264","-81.99859","-5","1"
+"24263","Jonesville","VA","36.687716","-83.15587","-5","1"
+"24265","Keokee","VA","36.851769","-82.93593","-5","1"
+"24266","Lebanon","VA","36.876177","-82.11083","-5","1"
+"24269","McClure","VA","37.103304","-82.37613","-5","1"
+"24270","Mendota","VA","36.720381","-82.26093","-5","1"
+"24271","Nickelsville","VA","36.741128","-82.41823","-5","1"
+"24272","Nora","VA","37.008665","-82.35244","-5","1"
+"24273","Norton","VA","36.942047","-82.63138","-5","1"
+"24274","Pound","VA","37.126639","-82.59599","-5","1"
+"24277","Pennington Gap","VA","36.756705","-83.04178","-5","1"
+"24279","Pound","VA","37.10297","-82.59626","-5","1"
+"24280","Rosedale","VA","36.954936","-81.94252","-5","1"
+"24281","Rose Hill","VA","36.65364","-83.34736","-5","1"
+"24282","Saint Charles","VA","36.805965","-83.05467","-5","1"
+"24283","Saint Paul","VA","36.943316","-82.33154","-5","1"
+"24285","Stonega","VA","36.953228","-82.79025","-5","1"
+"24289","Trammel","VA","37.130943","-82.344881","-5","1"
+"24290","Weber City","VA","36.617348","-82.5666","-5","1"
+"24292","Whitetop","VA","36.59565","-81.59154","-5","1"
+"24293","Wise","VA","36.979817","-82.56963","-5","1"
+"24301","Pulaski","VA","37.053297","-80.7728","-5","1"
+"24311","Atkins","VA","36.870607","-81.40497","-5","1"
+"24312","Austinville","VA","36.837699","-80.85731","-5","1"
+"24313","Barren Springs","VA","36.909335","-80.80411","-5","1"
+"24314","Bastian","VA","37.183901","-81.17641","-5","1"
+"24315","Bland","VA","37.107412","-81.0571","-5","1"
+"24316","Broadford","VA","36.937195","-81.67617","-5","1"
+"24317","Cana","VA","36.609475","-80.67102","-5","1"
+"24318","Ceres","VA","36.982193","-81.38945","-5","1"
+"24319","Chilhowie","VA","36.776534","-81.65827","-5","1"
+"24322","Cripple Creek","VA","36.820139","-81.11128","-5","1"
+"24323","Crockett","VA","36.88091","-81.1992","-5","1"
+"24324","Draper","VA","36.973028","-80.79309","-5","1"
+"24325","Dugspur","VA","36.801489","-80.60492","-5","1"
+"24326","Elk Creek","VA","36.729236","-81.2001","-5","1"
+"24327","Emory","VA","36.773659","-81.82771","-5","1"
+"24328","Fancy Gap","VA","36.659171","-80.70387","-5","1"
+"24330","Fries","VA","36.721913","-81.00535","-5","1"
+"24333","Galax","VA","36.649548","-80.92683","-5","1"
+"24338","Fries","VA","36.718307","-80.978273","-5","1"
+"24340","Glade Spring","VA","36.772376","-81.7742","-5","1"
+"24343","Hillsville","VA","36.750353","-80.68706","-5","1"
+"24347","Hiwassee","VA","36.958829","-80.65995","-5","1"
+"24348","Independence","VA","36.626454","-81.16554","-5","1"
+"24350","Ivanhoe","VA","36.809933","-80.99526","-5","1"
+"24351","Lambsburg","VA","36.580074","-80.76311","-5","1"
+"24352","Laurel Fork","VA","36.708515","-80.52791","-5","1"
+"24354","Marion","VA","36.828526","-81.53045","-5","1"
+"24360","Max Meadows","VA","36.933981","-80.92897","-5","1"
+"24361","Meadowview","VA","36.763059","-81.84774","-5","1"
+"24363","Mouth Of Wilson","VA","36.597486","-81.37604","-5","1"
+"24366","Rocky Gap","VA","37.261609","-81.10659","-5","1"
+"24368","Rural Retreat","VA","36.889364","-81.28162","-5","1"
+"24370","Saltville","VA","36.893445","-81.74825","-5","1"
+"24373","Seven Mile Ford","VA","36.826371","-81.549231","-5","1"
+"24374","Speedwell","VA","36.813383","-81.19791","-5","1"
+"24375","Sugar Grove","VA","36.790265","-81.37541","-5","1"
+"24377","Tannersville","VA","37.000956","-81.54797","-5","1"
+"24378","Trout Dale","VA","36.684567","-81.43411","-5","1"
+"24379","Volney","VA","36.682782","-81.257795","-5","1"
+"24380","Willis","VA","36.853525","-80.52024","-5","1"
+"24381","Woodlawn","VA","36.714663","-80.82602","-5","1"
+"24382","Wytheville","VA","36.947446","-81.09439","-5","1"
+"24401","Staunton","VA","38.146216","-79.07625","-5","1"
+"24402","Staunton","VA","38.159275","-79.062858","-5","1"
+"24407","Staunton","VA","38.179715","-79.141332","-5","1"
+"24411","Augusta Springs","VA","38.091705","-79.322363","-5","1"
+"24412","Bacova","VA","38.054111","-79.84575","-5","1"
+"24413","Blue Grass","VA","38.521373","-79.58361","-5","1"
+"24415","Brownsburg","VA","37.929347","-79.31644","-5","1"
+"24416","Buena Vista","VA","37.74078","-79.35038","-5","1"
+"24421","Churchville","VA","38.252683","-79.17339","-5","1"
+"24422","Clifton Forge","VA","37.821088","-79.79619","-5","1"
+"24426","Covington","VA","37.772399","-80.02705","-5","1"
+"24430","Craigsville","VA","38.085244","-79.36209","-5","1"
+"24431","Crimora","VA","38.167914","-78.84222","-5","1"
+"24432","Deerfield","VA","38.178513","-79.42701","-5","1"
+"24433","Doe Hill","VA","38.443961","-79.44072","-5","1"
+"24435","Fairfield","VA","37.871126","-79.29041","-5","1"
+"24437","Fort Defiance","VA","38.212067","-78.94563","-5","1"
+"24438","Glen Wilton","VA","37.555083","-79.786151","-5","1"
+"24439","Goshen","VA","37.997778","-79.48004","-5","1"
+"24440","Greenville","VA","37.996542","-79.15354","-5","1"
+"24441","Grottoes","VA","38.255747","-78.8242","-5","1"
+"24442","Head Waters","VA","38.345202","-79.38497","-5","1"
+"24444","Iron Gate","VA","37.799435","-79.790895","-5","1"
+"24445","Hot Springs","VA","37.970734","-79.89283","-5","1"
+"24448","Iron Gate","VA","37.797214","-79.79002","-5","1"
+"24450","Lexington","VA","37.794344","-79.47658","-5","1"
+"24457","Low Moor","VA","37.802424","-79.86351","-5","1"
+"24458","McDowell","VA","38.322663","-79.54418","-5","1"
+"24459","Middlebrook","VA","38.042173","-79.28175","-5","1"
+"24460","Millboro","VA","38.015153","-79.65065","-5","1"
+"24463","Mint Spring","VA","38.064112","-79.10979","-5","1"
+"24464","Montebello","VA","37.897702","-79.08939","-5","1"
+"24465","Monterey","VA","38.374628","-79.63611","-5","1"
+"24467","Mount Sidney","VA","38.258308","-78.95941","-5","1"
+"24468","Mustoe","VA","38.385967","-79.559157","-5","1"
+"24469","New Hope","VA","38.179715","-79.141332","-5","1"
+"24471","Port Republic","VA","38.310311","-78.80409","-5","1"
+"24472","Raphine","VA","37.936577","-79.22828","-5","1"
+"24473","Rockbridge Baths","VA","37.912977","-79.39906","-5","1"
+"24474","Selma","VA","37.805268","-79.84752","-5","1"
+"24475","Spottswood","VA","37.9651","-79.2357","-5","1"
+"24476","Steeles Tavern","VA","38.179715","-79.141332","-5","1"
+"24477","Stuarts Draft","VA","38.01473","-79.02733","-5","1"
+"24479","Swoope","VA","38.151767","-79.21998","-5","1"
+"24482","Verona","VA","38.19958","-78.99553","-5","1"
+"24483","Vesuvius","VA","37.819652","-79.21508","-5","1"
+"24484","Warm Springs","VA","38.103122","-79.81478","-5","1"
+"24485","West Augusta","VA","38.270442","-79.33402","-5","1"
+"24486","Weyers Cave","VA","38.290722","-78.92423","-5","1"
+"24487","Williamsville","VA","38.197757","-79.57766","-5","1"
+"24501","Lynchburg","VA","37.390209","-79.16132","-5","1"
+"24502","Lynchburg","VA","37.362109","-79.21525","-5","1"
+"24503","Lynchburg","VA","37.440641","-79.20923","-5","1"
+"24504","Lynchburg","VA","37.400275","-79.12597","-5","1"
+"24505","Lynchburg","VA","37.400944","-79.178506","-5","1"
+"24506","Lynchburg","VA","37.381692","-79.161046","-5","1"
+"24512","Lynchburg","VA","37.242503","-79.109789","-5","1"
+"24513","Lynchburg","VA","37.245798","-79.133546","-5","1"
+"24514","Lynchburg","VA","37.400944","-79.178506","-5","1"
+"24515","Lynchburg","VA","37.400944","-79.178506","-5","1"
+"24517","Altavista","VA","37.127543","-79.27409","-5","1"
+"24520","Alton","VA","36.561396","-79.05268","-5","1"
+"24521","Amherst","VA","37.616606","-79.08763","-5","1"
+"24522","Appomattox","VA","37.374688","-78.80585","-5","1"
+"24523","Bedford","VA","37.339184","-79.52839","-5","1"
+"24526","Big Island","VA","37.528701","-79.39812","-5","1"
+"24527","Blairs","VA","36.725028","-79.35877","-5","1"
+"24528","Brookneal","VA","37.079385","-78.90765","-5","1"
+"24529","Buffalo Junction","VA","36.631531","-78.63806","-5","1"
+"24530","Callands","VA","36.807043","-79.61864","-5","1"
+"24531","Chatham","VA","36.836822","-79.45193","-5","1"
+"24533","Clifford","VA","37.582488","-78.93618","-5","1"
+"24534","Clover","VA","36.864697","-78.76019","-5","1"
+"24535","Cluster Springs","VA","36.611317","-78.945519","-5","1"
+"24536","Coleman Falls","VA","37.486603","-79.30501","-5","1"
+"24538","Concord","VA","37.343394","-78.96433","-5","1"
+"24539","Crystal Hill","VA","36.861612","-78.91187","-5","1"
+"24540","Danville","VA","36.622638","-79.39998","-5","1"
+"24541","Danville","VA","36.581085","-79.45027","-5","1"
+"24542","Danville","VA","36.579313","-79.398748","-5","1"
+"24543","Danville","VA","36.592679","-79.410983","-5","1"
+"24544","Danville","VA","36.592679","-79.410983","-5","1"
+"24549","Dry Fork","VA","36.710985","-79.48517","-5","1"
+"24550","Evington","VA","37.237928","-79.28268","-5","1"
+"24551","Forest","VA","37.366744","-79.29977","-5","1"
+"24553","Gladstone","VA","37.541726","-78.80777","-5","1"
+"24554","Gladys","VA","37.142894","-79.05412","-5","1"
+"24555","Glasgow","VA","37.641788","-79.45652","-5","1"
+"24556","Goode","VA","37.361512","-79.3981","-5","1"
+"24557","Gretna","VA","36.971021","-79.31787","-5","1"
+"24558","Halifax","VA","36.774635","-78.93426","-5","1"
+"24562","Howardsville","VA","37.715293","-78.64175","-5","1"
+"24563","Hurt","VA","37.071568","-79.2923","-5","1"
+"24565","Java","VA","36.842686","-79.19748","-5","1"
+"24566","Keeling","VA","36.726236","-79.26279","-5","1"
+"24569","Long Island","VA","37.041512","-79.1278","-5","1"
+"24570","Lowry","VA","37.333936","-79.406303","-5","1"
+"24571","Lynch Station","VA","37.133274","-79.37324","-5","1"
+"24572","Madison Heights","VA","37.461272","-79.09364","-5","1"
+"24574","Monroe","VA","37.576208","-79.26133","-5","1"
+"24576","Naruna","VA","37.245798","-79.133546","-5","1"
+"24577","Nathalie","VA","36.940538","-78.98017","-5","1"
+"24578","Natural Bridge","VA","37.650711","-79.55269","-5","1"
+"24579","Natural Bridge Station","VA","37.597531","-79.50659","-5","1"
+"24580","Nelson","VA","36.589704","-78.66151","-5","1"
+"24581","Norwood","VA","37.644171","-78.79447","-5","1"
+"24585","Republican Grove","VA","36.801515","-78.883933","-5","1"
+"24586","Ringgold","VA","36.595244","-79.28647","-5","1"
+"24588","Rustburg","VA","37.268024","-79.11686","-5","1"
+"24589","Scottsburg","VA","36.759749","-78.78547","-5","1"
+"24590","Scottsville","VA","37.806508","-78.48134","-5","1"
+"24592","South Boston","VA","36.701855","-78.92008","-5","1"
+"24593","Spout Spring","VA","37.320709","-78.91071","-5","1"
+"24594","Sutherlin","VA","36.635902","-79.1968","-5","1"
+"24595","Sweet Briar","VA","37.556248","-79.08249","-5","1"
+"24597","Vernon Hill","VA","36.782331","-79.1237","-5","1"
+"24598","Virgilina","VA","36.592597","-78.78207","-5","1"
+"24599","Wingina","VA","37.638783","-78.71934","-5","1"
+"24601","Amonate","VA","37.177549","-81.6578","-5","1"
+"24602","Bandy","VA","37.170062","-81.64412","-5","1"
+"24603","Big Rock","VA","37.371119","-82.1645","-5","1"
+"24604","Bishop","VA","37.201022","-81.53963","-5","1"
+"24605","Bluefield","VA","37.222548","-81.3367","-5","1"
+"24606","Boissevain","VA","37.28526","-81.38993","-5","1"
+"24607","Breaks","VA","37.297387","-82.27942","-5","1"
+"24608","Burkes Garden","VA","37.13549","-81.563406","-5","1"
+"24609","Cedar Bluff","VA","37.055512","-81.76922","-5","1"
+"24612","Doran","VA","37.091572","-81.84119","-5","1"
+"24613","Falls Mills","VA","37.273973","-81.31688","-5","1"
+"24614","Grundy","VA","37.296213","-82.05775","-5","1"
+"24618","Harman","VA","37.287992","-82.027408","-5","1"
+"24619","Horsepen","VA","37.13549","-81.563406","-5","1"
+"24620","Hurley","VA","37.409883","-82.02317","-5","1"
+"24622","Jewell Ridge","VA","37.214471","-81.78967","-5","1"
+"24624","Keen Mountain","VA","37.204272","-81.97936","-5","1"
+"24627","Mavisdale","VA","37.287992","-82.027408","-5","1"
+"24628","Maxie","VA","37.308652","-82.18593","-5","1"
+"24630","North Tazewell","VA","37.155621","-81.49787","-5","1"
+"24631","Oakwood","VA","37.223011","-82.00538","-5","1"
+"24634","Pilgrims Knob","VA","37.250363","-81.89766","-5","1"
+"24635","Pocahontas","VA","37.305821","-81.34697","-5","1"
+"24637","Pounding Mill","VA","37.076801","-81.70519","-5","1"
+"24639","Raven","VA","37.136584","-81.89068","-5","1"
+"24640","Red Ash","VA","37.13549","-81.563406","-5","1"
+"24641","Richlands","VA","37.098588","-81.80607","-5","1"
+"24646","Rowe","VA","37.14445","-81.99735","-5","1"
+"24647","Shortt Gap","VA","37.287992","-82.027408","-5","1"
+"24649","Swords Creek","VA","37.077291","-81.91973","-5","1"
+"24651","Tazewell","VA","37.113004","-81.50326","-5","1"
+"24656","Vansant","VA","37.198005","-82.12193","-5","1"
+"24657","Whitewood","VA","37.226416","-81.86739","-5","1"
+"24658","Wolford","VA","37.287992","-82.027408","-5","1"
+"24701","Bluefield","WV","37.2757","-81.2145","-5","1"
+"24704","Bluefield","WV","37.264098","-81.229646","-5","1"
+"24712","Athens","WV","37.448532","-81.0032","-5","1"
+"24714","Beeson","WV","37.501743","-81.22148","-5","1"
+"24715","Bramwell","WV","37.335297","-81.31112","-5","1"
+"24716","Bud","WV","37.532524","-81.37275","-5","1"
+"24719","Covel","WV","37.48929","-81.29736","-5","1"
+"24724","Freeman","WV","37.32767","-81.29994","-5","1"
+"24726","Herndon","WV","37.520914","-81.33026","-5","1"
+"24729","Hiawatha","WV","37.416395","-81.105803","-5","1"
+"24731","Kegley","WV","37.404113","-81.14078","-5","1"
+"24732","Kellysville","WV","37.416395","-81.105803","-5","1"
+"24733","Lashmeet","WV","37.431153","-81.22628","-5","1"
+"24736","Matoaka","WV","37.425866","-81.27625","-5","1"
+"24737","Montcalm","WV","37.352655","-81.24781","-5","1"
+"24738","Nemours","WV","37.416395","-81.105803","-5","1"
+"24739","Oakvale","WV","37.336554","-80.95523","-5","1"
+"24740","Princeton","WV","37.368167","-81.07307","-5","1"
+"24747","Rock","WV","37.394221","-81.21868","-5","1"
+"24751","Wolfe","WV","37.416395","-81.105803","-5","1"
+"24801","Welch","WV","37.424498","-81.57835","-5","1"
+"24808","Anawalt","WV","37.338242","-81.43081","-5","1"
+"24811","Avondale","WV","37.399793","-81.78312","-5","1"
+"24813","Bartley","WV","37.355111","-81.73002","-5","1"
+"24815","Berwind","WV","37.25068","-81.65044","-5","1"
+"24816","Big Sandy","WV","37.459251","-81.70173","-5","1"
+"24817","Bradshaw","WV","37.358272","-81.8013","-5","1"
+"24818","Brenton","WV","37.594959","-81.62947","-5","1"
+"24820","Capels","WV","37.375246","-81.653889","-5","1"
+"24821","Caretta","WV","37.345693","-81.66789","-5","1"
+"24822","Clear Fork","WV","37.62127","-81.69408","-5","1"
+"24823","Coal Mountain","WV","37.664172","-81.7338","-5","1"
+"24824","Coalwood","WV","37.416947","-81.69288","-5","1"
+"24825","Crumpler","WV","37.421641","-81.34504","-5","1"
+"24826","Cucumber","WV","37.375246","-81.653889","-5","1"
+"24827","Cyclone","WV","37.742953","-81.67951","-5","1"
+"24828","Davy","WV","37.478583","-81.66169","-5","1"
+"24829","Eckman","WV","37.40273","-81.4629","-5","1"
+"24830","Elbert","WV","37.319439","-81.5432","-5","1"
+"24831","Elkhorn","WV","37.385757","-81.41415","-5","1"
+"24832","English","WV","37.375246","-81.653889","-5","1"
+"24834","Fanrock","WV","37.603344","-81.53998","-5","1"
+"24836","Gary","WV","37.352131","-81.54688","-5","1"
+"24839","Hanover","WV","37.567007","-81.77969","-5","1"
+"24841","Havaco","WV","37.405828","-81.576548","-5","1"
+"24842","Hemphill","WV","37.444465","-81.59684","-5","1"
+"24843","Hensley","WV","37.474577","-81.69961","-5","1"
+"24844","Iaeger","WV","37.469496","-81.79548","-5","1"
+"24845","Ikes Fork","WV","37.530418","-81.79553","-5","1"
+"24846","Isaban","WV","37.530963","-81.8885","-5","1"
+"24847","Itmann","WV","37.603344","-81.53998","-5","1"
+"24848","Jenkinjones","WV","37.296401","-81.43135","-5","1"
+"24849","Jesse","WV","37.666079","-81.57309","-5","1"
+"24850","Jolo","WV","37.312239","-81.82478","-5","1"
+"24851","Justice","WV","37.602126","-81.84968","-5","1"
+"24852","Keystone","WV","37.417857","-81.44874","-5","1"
+"24853","Kimball","WV","37.427781","-81.48654","-5","1"
+"24854","Kopperston","WV","37.741813","-81.53722","-5","1"
+"24855","Kyle","WV","37.409655","-81.42559","-5","1"
+"24856","Leckie","WV","37.343452","-81.40244","-5","1"
+"24857","Lynco","WV","37.683273","-81.66048","-5","1"
+"24859","Marianna","WV","37.603344","-81.53998","-5","1"
+"24860","Matheny","WV","37.664685","-81.5967","-5","1"
+"24861","Maybeury","WV","37.363882","-81.36531","-5","1"
+"24862","Mohawk","WV","37.485276","-81.93955","-5","1"
+"24866","Newhall","WV","37.265686","-81.6155","-5","1"
+"24867","New Richmond","WV","37.568981","-81.49308","-5","1"
+"24868","Northfork","WV","37.418471","-81.41706","-5","1"
+"24869","North Spring","WV","37.551372","-81.84229","-5","1"
+"24870","Oceana","WV","37.69629","-81.60845","-5","1"
+"24871","Pageton","WV","37.325163","-81.47554","-5","1"
+"24872","Panther","WV","37.45926","-81.89024","-5","1"
+"24873","Paynesville","WV","37.357831","-81.89583","-5","1"
+"24874","Pineville","WV","37.562494","-81.51746","-5","1"
+"24877","Powhatan","WV","37.375246","-81.653889","-5","1"
+"24878","Premier","WV","37.375246","-81.653889","-5","1"
+"24879","Raysal","WV","37.35294","-81.768","-5","1"
+"24880","Rock View","WV","37.641027","-81.53625","-5","1"
+"24881","Roderfield","WV","37.444527","-81.69146","-5","1"
+"24882","Simon","WV","37.609388","-81.75668","-5","1"
+"24883","Skygusty","WV","37.375246","-81.653889","-5","1"
+"24884","Squire","WV","37.249595","-81.55208","-5","1"
+"24887","Switchback","WV","37.371122","-81.384","-5","1"
+"24888","Thorpe","WV","37.365675","-81.50968","-5","1"
+"24889","Twin Branch","WV","37.375246","-81.653889","-5","1"
+"24892","War","WV","37.309666","-81.69546","-5","1"
+"24894","Warriormine","WV","37.291157","-81.69541","-5","1"
+"24895","Wilcoe","WV","37.381834","-81.56342","-5","1"
+"24896","Wolf Pen","WV","37.603344","-81.53998","-5","1"
+"24897","Worth","WV","37.422523","-81.38363","-5","1"
+"24898","Wyoming","WV","37.585536","-81.60347","-5","1"
+"24899","Yukon","WV","37.375246","-81.653889","-5","1"
+"24901","Lewisburg","WV","37.80848","-80.44493","-5","1"
+"24902","Fairlea","WV","37.774666","-80.461492","-5","1"
+"24910","Alderson","WV","37.731717","-80.65942","-5","1"
+"24915","Arbovale","WV","38.462522","-79.80308","-5","1"
+"24916","Asbury","WV","37.841919","-80.55325","-5","1"
+"24917","Auto","WV","37.975595","-80.426874","-5","1"
+"24918","Ballard","WV","37.515724","-80.76748","-5","1"
+"24919","Ballengee","WV","37.620418","-80.71636","-5","1"
+"24920","Bartow","WV","38.552106","-79.7315","-5","1"
+"24924","Buckeye","WV","38.185341","-80.13261","-5","1"
+"24925","Caldwell","WV","37.741887","-80.37481","-5","1"
+"24927","Cass","WV","38.380196","-79.93278","-5","1"
+"24931","Crawley","WV","37.901788","-80.59452","-5","1"
+"24934","Dunmore","WV","38.325205","-79.90179","-5","1"
+"24935","Forest Hill","WV","37.549702","-80.80017","-5","1"
+"24936","Fort Spring","WV","37.743322","-80.52942","-5","1"
+"24938","Frankford","WV","37.918994","-80.36331","-5","1"
+"24941","Gap Mills","WV","37.602172","-80.3464","-5","1"
+"24942","Glace","WV","37.552029","-80.539672","-5","1"
+"24943","Grassy Meadows","WV","37.838288","-80.75393","-5","1"
+"24944","Green Bank","WV","38.412244","-79.79796","-5","1"
+"24945","Greenville","WV","37.543667","-80.69604","-5","1"
+"24946","Hillsboro","WV","38.114627","-80.22808","-5","1"
+"24950","Kieffer","WV","37.94046","-80.61007","-5","1"
+"24951","Lindside","WV","37.485348","-80.64293","-5","1"
+"24954","Marlinton","WV","38.196374","-80.05957","-5","1"
+"24957","Maxwelton","WV","37.869998","-80.41067","-5","1"
+"24958","Meadow Bluff","WV","37.975595","-80.426874","-5","1"
+"24961","Neola","WV","37.975595","-80.426874","-5","1"
+"24962","Pence Springs","WV","37.675571","-80.73336","-5","1"
+"24963","Peterstown","WV","37.424195","-80.78465","-5","1"
+"24966","Renick","WV","38.059474","-80.35569","-5","1"
+"24970","Ronceverte","WV","37.742719","-80.47151","-5","1"
+"24971","Lewisburg","WV","37.792525","-80.443556","-5","1"
+"24974","Secondcreek","WV","37.665867","-80.44338","-5","1"
+"24976","Sinks Grove","WV","37.667594","-80.54184","-5","1"
+"24977","Smoot","WV","37.893306","-80.65773","-5","1"
+"24981","Talcott","WV","37.654267","-80.72899","-5","1"
+"24983","Union","WV","37.590774","-80.53448","-5","1"
+"24984","Waiteville","WV","37.515131","-80.38284","-5","1"
+"24985","Wayside","WV","37.597231","-80.74638","-5","1"
+"24986","White Sulphur Springs","WV","37.861237","-80.24008","-5","1"
+"24991","Williamsburg","WV","38.001124","-80.48027","-5","1"
+"24993","Wolfcreek","WV","37.552029","-80.539672","-5","1"
+"25002","Alloy","WV","38.129903","-81.25882","-5","1"
+"25003","Alum Creek","WV","38.254483","-81.79045","-5","1"
+"25004","Ameagle","WV","37.784459","-81.118491","-5","1"
+"25005","Amma","WV","38.552755","-81.24219","-5","1"
+"25007","Arnett","WV","37.832443","-81.42991","-5","1"
+"25008","Artie","WV","37.933384","-81.36076","-5","1"
+"25009","Ashford","WV","38.179811","-81.72566","-5","1"
+"25010","Bald Knob","WV","37.842289","-81.61919","-5","1"
+"25011","Bancroft","WV","38.508675","-81.84134","-5","1"
+"25015","Belle","WV","38.224918","-81.5151","-5","1"
+"25018","Bentree","WV","38.465777","-81.050662","-5","1"
+"25019","Bickmore","WV","38.38338","-81.08555","-5","1"
+"25021","Bim","WV","37.922612","-81.68729","-5","1"
+"25022","Blair","WV","37.858735","-81.81253","-5","1"
+"25024","Bloomingrose","WV","38.143324","-81.63578","-5","1"
+"25025","Blount","WV","38.324795","-81.38164","-5","1"
+"25026","Blue Creek","WV","38.490789","-81.392845","-5","1"
+"25028","Bob White","WV","37.948618","-81.71199","-5","1"
+"25030","Bomont","WV","38.453331","-81.22481","-5","1"
+"25031","Boomer","WV","38.151116","-81.28483","-5","1"
+"25033","Buffalo","WV","38.61324","-81.95406","-5","1"
+"25035","Cabin Creek","WV","38.177823","-81.49148","-5","1"
+"25036","Cannelton","WV","38.199924","-81.28865","-5","1"
+"25039","Cedar Grove","WV","38.242575","-81.39377","-5","1"
+"25040","Charlton Heights","WV","38.12563","-81.24499","-5","1"
+"25043","Clay","WV","38.46791","-81.0082","-5","1"
+"25044","Clear Creek","WV","37.90907","-81.35066","-5","1"
+"25045","Clendenin","WV","38.464079","-81.33836","-5","1"
+"25046","Clio","WV","38.731737","-81.314633","-5","1"
+"25047","Clothier","WV","37.950033","-81.78924","-5","1"
+"25048","Colcord","WV","37.949813","-81.42024","-5","1"
+"25049","Comfort","WV","38.131663","-81.56282","-5","1"
+"25051","Costa","WV","38.161661","-81.70438","-5","1"
+"25053","Danville","WV","38.05738","-81.86082","-5","1"
+"25054","Dawes","WV","38.108987","-81.46418","-5","1"
+"25057","Deep Water","WV","38.126873","-81.25954","-5","1"
+"25059","Dixie","WV","38.260339","-81.19697","-5","1"
+"25060","Dorothy","WV","37.958702","-81.47577","-5","1"
+"25061","Drybranch","WV","38.296818","-81.554655","-5","1"
+"25062","Dry Creek","WV","37.854572","-81.453786","-5","1"
+"25063","Duck","WV","38.583094","-80.94056","-5","1"
+"25064","Dunbar","WV","38.367255","-81.74473","-5","1"
+"25067","East Bank","WV","38.198471","-81.44797","-5","1"
+"25070","Eleanor","WV","38.538953","-81.93548","-5","1"
+"25071","Elkview","WV","38.451344","-81.46602","-5","1"
+"25075","Eskdale","WV","38.046638","-81.4311","-5","1"
+"25076","Ethel","WV","37.861621","-81.90361","-5","1"
+"25079","Falling Rock","WV","38.495072","-81.398422","-5","1"
+"25081","Foster","WV","38.092103","-81.75855","-5","1"
+"25082","Fraziers Bottom","WV","38.621761","-82.02827","-5","1"
+"25083","Gallagher","WV","38.077863","-81.37333","-5","1"
+"25085","Gauley Bridge","WV","38.176834","-81.19688","-5","1"
+"25086","Glasgow","WV","38.214254","-81.42028","-5","1"
+"25088","Glen","WV","38.382145","-81.19842","-5","1"
+"25090","Glen Ferris","WV","38.149058","-81.21276","-5","1"
+"25093","Gordon","WV","37.997105","-81.71704","-5","1"
+"25095","Grimms Landing","WV","38.752312","-81.997278","-5","1"
+"25102","Handley","WV","38.186707","-81.3639","-5","1"
+"25103","Hansford","WV","38.202669","-81.39427","-5","1"
+"25106","Henderson","WV","38.805615","-82.11034","-5","1"
+"25107","Hernshaw","WV","38.211477","-81.60468","-5","1"
+"25108","Hewett","WV","37.960963","-81.85261","-5","1"
+"25109","Hometown","WV","38.526637","-81.85738","-5","1"
+"25110","Hugheston","WV","38.212287","-81.34327","-5","1"
+"25111","Indore","WV","38.391188","-81.16398","-5","1"
+"25112","Institute","WV","38.282497","-81.56514","-5","1"
+"25113","Ivydale","WV","38.557141","-81.03747","-5","1"
+"25114","Jeffrey","WV","37.978787","-81.81354","-5","1"
+"25115","Kanawha Falls","WV","38.136263","-81.20064","-5","1"
+"25118","Kimberly","WV","38.135059","-81.30312","-5","1"
+"25119","Kincaid","WV","38.024108","-81.28534","-5","1"
+"25121","Lake","WV","37.929438","-81.90109","-5","1"
+"25122","Leewood","WV","38.296818","-81.554655","-5","1"
+"25123","Leon","WV","38.743247","-81.90281","-5","1"
+"25124","Liberty","WV","38.619376","-81.76361","-5","1"
+"25125","Lizemores","WV","38.323058","-81.19769","-5","1"
+"25126","London","WV","38.186871","-81.35285","-5","1"
+"25130","Madison","WV","38.038145","-81.79154","-5","1"
+"25132","Mammoth","WV","38.293438","-81.34526","-5","1"
+"25133","Maysel","WV","38.485889","-81.13105","-5","1"
+"25134","Miami","WV","38.153818","-81.44962","-5","1"
+"25136","Montgomery","WV","38.175742","-81.33047","-5","1"
+"25139","Mount Carbon","WV","38.143496","-81.29088","-5","1"
+"25140","Naoma","WV","37.883223","-81.48001","-5","1"
+"25141","Nebo","WV","38.642203","-81.03691","-5","1"
+"25142","Nellis","WV","37.997105","-81.71704","-5","1"
+"25143","Nitro","WV","38.417852","-81.8321","-5","1"
+"25147","Ohley","WV","38.296818","-81.554655","-5","1"
+"25148","Orgas","WV","38.04358","-81.57171","-5","1"
+"25149","Ottawa","WV","37.957458","-81.81583","-5","1"
+"25150","Ovapa","WV","38.504506","-81.15739","-5","1"
+"25152","Page","WV","38.052957","-81.26966","-5","1"
+"25154","Peytona","WV","38.136987","-81.70112","-5","1"
+"25156","Pinch","WV","38.401962","-81.461063","-5","1"
+"25159","Poca","WV","38.49008","-81.79515","-5","1"
+"25160","Pond Gap","WV","38.317053","-81.29336","-5","1"
+"25161","Powellton","WV","38.084773","-81.31241","-5","1"
+"25162","Pratt","WV","38.209912","-81.38475","-5","1"
+"25164","Procious","WV","38.48444","-81.19156","-5","1"
+"25165","Racine","WV","38.140732","-81.66005","-5","1"
+"25168","Red House","WV","38.547027","-81.88002","-5","1"
+"25169","Ridgeview","WV","38.18125","-81.77755","-5","1"
+"25173","Robson","WV","38.072309","-81.2457","-5","1"
+"25174","Rock Creek","WV","37.850007","-81.4451","-5","1"
+"25177","Saint Albans","WV","38.378841","-81.82633","-5","1"
+"25180","Saxon","WV","37.793057","-81.384755","-5","1"
+"25181","Seth","WV","38.069687","-81.62346","-5","1"
+"25182","Sharon","WV","38.296818","-81.554655","-5","1"
+"25183","Sharples","WV","37.909119","-81.83666","-5","1"
+"25185","Mount Olive","WV","38.041293","-81.064784","-5","1"
+"25186","Smithers","WV","38.176382","-81.30575","-5","1"
+"25187","Southside","WV","38.72218","-82.02759","-5","1"
+"25193","Sylvester","WV","38.018753","-81.55106","-5","1"
+"25201","Tad","WV","38.296818","-81.554655","-5","1"
+"25202","Tornado","WV","38.327452","-81.84485","-5","1"
+"25203","Turtle Creek","WV","37.986266","-81.942704","-5","1"
+"25204","Twilight","WV","37.898585","-81.60628","-5","1"
+"25205","Uneeda","WV","38.021082","-81.7733","-5","1"
+"25206","Van","WV","37.972887","-81.71468","-5","1"
+"25208","Wharton","WV","37.887883","-81.67191","-5","1"
+"25209","Whitesville","WV","37.978232","-81.53288","-5","1"
+"25211","Widen","WV","38.462053","-80.86627","-5","1"
+"25213","Winfield","WV","38.509445","-81.90578","-5","1"
+"25214","Winifrede","WV","38.19411","-81.54396","-5","1"
+"25231","Advent","WV","38.597265","-81.57934","-5","1"
+"25234","Arnoldsburg","WV","38.806907","-81.12827","-5","1"
+"25235","Chloe","WV","38.661766","-81.07615","-5","1"
+"25239","Cottageville","WV","38.851872","-81.84501","-5","1"
+"25241","Evans","WV","38.792125","-81.80117","-5","1"
+"25243","Gandeeville","WV","38.665227","-81.47783","-5","1"
+"25244","Gay","WV","38.770723","-81.55043","-5","1"
+"25245","Given","WV","38.698253","-81.75416","-5","1"
+"25247","Hartford","WV","39.005918","-81.99083","-5","1"
+"25248","Kenna","WV","38.631892","-81.62048","-5","1"
+"25250","Lakin","WV","38.752312","-81.997278","-5","1"
+"25251","Left Hand","WV","38.618255","-81.22913","-5","1"
+"25252","Le Roy","WV","38.884","-81.53807","-5","1"
+"25253","Letart","WV","38.923595","-81.97414","-5","1"
+"25256","Linden","WV","38.731737","-81.314633","-5","1"
+"25258","Lockney","WV","38.913649","-80.831256","-5","1"
+"25259","Looneyville","WV","38.679327","-81.27334","-5","1"
+"25260","Mason","WV","39.017309","-82.03031","-5","1"
+"25261","Millstone","WV","38.835085","-81.10284","-5","1"
+"25262","Millwood","WV","38.906099","-81.83274","-5","1"
+"25264","Mount Alto","WV","38.853643","-81.8985","-5","1"
+"25265","New Haven","WV","38.988059","-81.96731","-5","1"
+"25266","Newton","WV","38.585331","-81.17428","-5","1"
+"25267","Normantown","WV","38.849663","-80.96569","-5","1"
+"25268","Orma","WV","38.73796","-81.09478","-5","1"
+"25270","Reedy","WV","38.879098","-81.42115","-5","1"
+"25271","Ripley","WV","38.803814","-81.70763","-5","1"
+"25275","Sandyville","WV","38.926713","-81.6196","-5","1"
+"25276","Spencer","WV","38.780168","-81.34244","-5","1"
+"25279","Statts Mills","WV","38.732716","-81.61753","-5","1"
+"25281","Tariff","WV","38.682668","-81.18846","-5","1"
+"25283","Valley Fork","WV","38.536815","-81.12623","-5","1"
+"25285","Wallback","WV","38.566365","-81.12923","-5","1"
+"25286","Walton","WV","38.617139","-81.39537","-5","1"
+"25287","West Columbia","WV","38.950609","-82.0603","-5","1"
+"25301","Charleston","WV","38.350647","-81.63028","-5","1"
+"25302","Charleston","WV","38.375397","-81.62367","-5","1"
+"25303","Charleston","WV","38.362374","-81.6863","-5","1"
+"25304","Charleston","WV","38.313411","-81.58564","-5","1"
+"25305","Charleston","WV","38.335798","-81.612344","-5","1"
+"25306","Charleston","WV","38.310827","-81.53106","-5","1"
+"25309","Charleston","WV","38.329768","-81.73418","-5","1"
+"25311","Charleston","WV","38.351204","-81.58198","-5","1"
+"25312","Charleston","WV","38.414155","-81.66166","-5","1"
+"25313","Charleston","WV","38.425721","-81.76168","-5","1"
+"25314","Charleston","WV","38.335969","-81.66084","-5","1"
+"25315","Charleston","WV","38.23753","-81.55661","-5","1"
+"25317","Charleston","WV","38.335647","-81.613794","-5","1"
+"25320","Charleston","WV","38.530623","-81.62565","-5","1"
+"25321","Charleston","WV","38.296818","-81.554655","-5","1"
+"25322","Charleston","WV","38.534661","-81.56035","-5","1"
+"25323","Charleston","WV","38.296818","-81.554655","-5","1"
+"25324","Charleston","WV","38.296818","-81.554655","-5","1"
+"25325","Charleston","WV","38.296818","-81.554655","-5","1"
+"25326","Charleston","WV","38.296818","-81.554655","-5","1"
+"25327","Charleston","WV","38.296818","-81.554655","-5","1"
+"25328","Charleston","WV","38.296818","-81.554655","-5","1"
+"25329","Charleston","WV","38.296818","-81.554655","-5","1"
+"25330","Charleston","WV","38.296818","-81.554655","-5","1"
+"25331","Charleston","WV","38.296818","-81.554655","-5","1"
+"25332","Charleston","WV","38.296818","-81.554655","-5","1"
+"25333","Charleston","WV","38.296818","-81.554655","-5","1"
+"25334","Charleston","WV","38.296818","-81.554655","-5","1"
+"25335","Charleston","WV","38.296818","-81.554655","-5","1"
+"25336","Charleston","WV","38.296818","-81.554655","-5","1"
+"25337","Charleston","WV","38.296818","-81.554655","-5","1"
+"25338","Charleston","WV","38.296818","-81.554655","-5","1"
+"25339","Charleston","WV","38.296818","-81.554655","-5","1"
+"25350","Charleston","WV","38.296818","-81.554655","-5","1"
+"25356","Charleston","WV","38.296818","-81.554655","-5","1"
+"25357","Charleston","WV","38.296818","-81.554655","-5","1"
+"25358","Charleston","WV","38.296818","-81.554655","-5","1"
+"25360","Charleston","WV","38.296818","-81.554655","-5","1"
+"25361","Charleston","WV","38.296818","-81.554655","-5","1"
+"25362","Charleston","WV","38.296818","-81.554655","-5","1"
+"25364","Charleston","WV","38.296818","-81.554655","-5","1"
+"25365","Charleston","WV","38.296818","-81.554655","-5","1"
+"25375","Charleston","WV","38.296818","-81.554655","-5","1"
+"25387","Charleston","WV","38.296818","-81.554655","-5","1"
+"25389","Charleston","WV","38.354041","-81.639389","-5","1"
+"25392","Charleston","WV","38.296818","-81.554655","-5","1"
+"25396","Charleston","WV","38.296818","-81.554655","-5","1"
+"25401","Martinsburg","WV","39.463781","-77.95767","-5","1"
+"25402","Martinsburg","WV","39.461663","-78.011472","-5","1"
+"25410","Bakerton","WV","39.315914","-77.877223","-5","1"
+"25411","Berkeley Springs","WV","39.567987","-78.22783","-5","1"
+"25413","Bunker Hill","WV","39.323628","-78.04157","-5","1"
+"25414","Charles Town","WV","39.279965","-77.86203","-5","1"
+"25419","Falling Waters","WV","39.58132","-77.8804","-5","1"
+"25420","Gerrardstown","WV","39.379281","-78.12229","-5","1"
+"25421","Glengary","WV","39.372769","-78.1676","-5","1"
+"25422","Great Cacapon","WV","39.571804","-78.37183","-5","1"
+"25423","Halltown","WV","39.315914","-77.877223","-5","1"
+"25425","Harpers Ferry","WV","39.272324","-77.77982","-5","1"
+"25427","Hedgesville","WV","39.540636","-78.05882","-5","1"
+"25428","Inwood","WV","39.368967","-78.02742","-5","1"
+"25429","Kearneysville","WV","39.349586","-77.878957","-5","1"
+"25430","Kearneysville","WV","39.349476","-77.93415","-5","1"
+"25431","Levels","WV","39.50219","-78.55592","-5","1"
+"25432","Millville","WV","39.315914","-77.877223","-5","1"
+"25434","Paw Paw","WV","39.500633","-78.43726","-5","1"
+"25437","Points","WV","39.418178","-78.57871","-5","1"
+"25438","Ranson","WV","39.300223","-77.8599","-5","1"
+"25440","Ridgeway","WV","39.442661","-78.02628","-5","1"
+"25441","Rippon","WV","39.210527","-77.91403","-5","1"
+"25442","Shenandoah Junction","WV","39.358159","-77.83296","-5","1"
+"25443","Shepherdstown","WV","39.434479","-77.81132","-5","1"
+"25444","Slanesville","WV","39.412828","-78.52587","-5","1"
+"25446","Summit Point","WV","39.247155","-77.95747","-5","1"
+"25501","Alkol","WV","38.169041","-81.92567","-5","1"
+"25502","Apple Grove","WV","38.669561","-82.12662","-5","1"
+"25503","Ashton","WV","38.613255","-82.12468","-5","1"
+"25504","Barboursville","WV","38.391209","-82.28563","-5","1"
+"25505","Big Creek","WV","38.009633","-82.04481","-5","1"
+"25506","Branchland","WV","38.214232","-82.191","-5","1"
+"25507","Ceredo","WV","38.396081","-82.55881","-5","1"
+"25508","Chapmanville","WV","37.962522","-82.01954","-5","1"
+"25510","Culloden","WV","38.399499","-82.06562","-5","1"
+"25511","Dunlow","WV","38.011587","-82.38072","-5","1"
+"25512","East Lynn","WV","38.20651","-82.34523","-5","1"
+"25514","Fort Gay","WV","38.101664","-82.5456","-5","1"
+"25515","Gallipolis Ferry","WV","38.764623","-82.16003","-5","1"
+"25517","Genoa","WV","38.116605","-82.46238","-5","1"
+"25519","Glenhayes","WV","38.132114","-82.418277","-5","1"
+"25520","Glenwood","WV","38.558344","-82.17149","-5","1"
+"25521","Griffithsville","WV","38.238045","-81.98991","-5","1"
+"25523","Hamlin","WV","38.280976","-82.08584","-5","1"
+"25524","Harts","WV","38.02644","-82.1086","-5","1"
+"25526","Hurricane","WV","38.427011","-81.9896","-5","1"
+"25529","Julian","WV","38.152035","-81.84153","-5","1"
+"25530","Kenova","WV","38.385975","-82.57461","-5","1"
+"25534","Kiahsville","WV","38.082632","-82.27115","-5","1"
+"25535","Lavalette","WV","38.30329","-82.44551","-5","1"
+"25537","Lesage","WV","38.534701","-82.27982","-5","1"
+"25540","Midkiff","WV","38.159971","-82.12506","-5","1"
+"25541","Milton","WV","38.440316","-82.13535","-5","1"
+"25543","Shepherdstown","WV","39.43028","-77.807994","-5","1"
+"25544","Myra","WV","38.219991","-82.11462","-5","1"
+"25545","Ona","WV","38.44068","-82.22311","-5","1"
+"25547","Pecks Mill","WV","37.925145","-81.95826","-5","1"
+"25550","Point Pleasant","WV","38.87018","-82.10751","-5","1"
+"25555","Prichard","WV","38.238942","-82.58178","-5","1"
+"25557","Ranger","WV","38.106001","-82.15143","-5","1"
+"25559","Salt Rock","WV","38.324409","-82.22242","-5","1"
+"25560","Scott Depot","WV","38.446225","-81.90315","-5","1"
+"25562","Shoals","WV","38.343176","-82.490494","-5","1"
+"25564","Sod","WV","38.268079","-81.88769","-5","1"
+"25565","Spurlockville","WV","38.106045","-81.99598","-5","1"
+"25567","Sumerco","WV","38.219996","-81.85414","-5","1"
+"25569","Teays","WV","38.475369","-81.880455","-5","1"
+"25570","Wayne","WV","38.225065","-82.43909","-5","1"
+"25571","West Hamlin","WV","38.290859","-82.17566","-5","1"
+"25572","Woodville","WV","38.187456","-81.901236","-5","1"
+"25573","Yawkey","WV","38.229352","-81.94543","-5","1"
+"25601","Logan","WV","37.833826","-82.00011","-5","1"
+"25606","Accoville","WV","37.75979","-81.82027","-5","1"
+"25607","Amherstdale","WV","37.788146","-81.80248","-5","1"
+"25608","Baisden","WV","37.55612","-81.92315","-5","1"
+"25611","Bruno","WV","37.690439","-81.85711","-5","1"
+"25612","Chauncey","WV","37.76662","-81.98755","-5","1"
+"25614","Cora","WV","37.833204","-81.902401","-5","1"
+"25617","Davin","WV","37.733955","-81.81897","-5","1"
+"25621","Gilbert","WV","37.625805","-81.90186","-5","1"
+"25623","Hampden","WV","37.743063","-82.10801","-5","1"
+"25624","Henlawson","WV","37.904732","-81.9827","-5","1"
+"25625","Holden","WV","37.827404","-82.06382","-5","1"
+"25628","Kistler","WV","37.757905","-81.85517","-5","1"
+"25630","Lorado","WV","37.80126","-81.70802","-5","1"
+"25631","Amherstdale-Robinette","WV","37.790435","-81.784532","-5","1"
+"25632","Lyburn","WV","37.779196","-81.91651","-5","1"
+"25634","Mallory","WV","37.72738","-81.84577","-5","1"
+"25635","Man","WV","37.729265","-81.87853","-5","1"
+"25636","Monaville","WV","37.808757","-81.99433","-5","1"
+"25637","Mount Gay","WV","37.849418","-82.02174","-5","1"
+"25638","Omar","WV","37.734818","-82.01452","-5","1"
+"25639","Peach Creek","WV","37.878311","-81.96519","-5","1"
+"25644","Sarah Ann","WV","37.688162","-81.98826","-5","1"
+"25645","Stirrat","WV","37.833204","-81.902401","-5","1"
+"25646","Stollings","WV","37.837136","-81.95921","-5","1"
+"25647","Switzer","WV","37.793612","-81.98738","-5","1"
+"25649","Verdunville","WV","37.852728","-82.06678","-5","1"
+"25650","Verner","WV","37.686815","-81.81441","-5","1"
+"25651","Wharncliffe","WV","37.555503","-81.96819","-5","1"
+"25652","Whitman","WV","37.800168","-82.03943","-5","1"
+"25653","Wilkinson","WV","37.828926","-81.99936","-5","1"
+"25654","Yolyn","WV","37.801671","-81.87113","-5","1"
+"25661","Williamson","WV","37.705144","-82.26827","-5","1"
+"25665","Borderland","WV","37.714369","-82.30873","-5","1"
+"25666","Breeden","WV","37.924415","-82.27394","-5","1"
+"25667","Chattaroy","WV","37.703827","-82.27824","-5","1"
+"25669","Crum","WV","37.938427","-82.4254","-5","1"
+"25670","Delbarton","WV","37.705946","-82.14416","-5","1"
+"25671","Dingess","WV","37.863118","-82.21671","-5","1"
+"25672","Edgarton","WV","37.570813","-82.13578","-5","1"
+"25674","Kermit","WV","37.860845","-82.37574","-5","1"
+"25676","Lenore","WV","37.818843","-82.27267","-5","1"
+"25678","Matewan","WV","37.617949","-82.16397","-5","1"
+"25682","Meador","WV","37.583945","-82.04459","-5","1"
+"25685","Naugatuck","WV","37.786897","-82.34373","-5","1"
+"25686","Newtown","WV","37.743063","-82.10801","-5","1"
+"25687","Nolan","WV","37.743063","-82.10801","-5","1"
+"25688","North Matewan","WV","37.627833","-82.14774","-5","1"
+"25690","Ragland","WV","37.743063","-82.10801","-5","1"
+"25691","Rawl","WV","37.643043","-82.21701","-5","1"
+"25692","Red Jacket","WV","37.640357","-82.13265","-5","1"
+"25694","Thacker","WV","37.743063","-82.10801","-5","1"
+"25696","Varney","WV","37.669222","-82.12599","-5","1"
+"25697","Vulcan","WV","37.743063","-82.10801","-5","1"
+"25699","Wilsondale","WV","37.966899","-82.29414","-5","1"
+"25701","Huntington","WV","38.403511","-82.43904","-5","1"
+"25702","Huntington","WV","38.431116","-82.37019","-5","1"
+"25703","Huntington","WV","38.421443","-82.41924","-5","1"
+"25704","Huntington","WV","38.386966","-82.49609","-5","1"
+"25705","Huntington","WV","38.410745","-82.36995","-5","1"
+"25706","Huntington","WV","38.413384","-82.277401","-5","1"
+"25707","Huntington","WV","38.413384","-82.277401","-5","1"
+"25708","Huntington","WV","38.413384","-82.277401","-5","1"
+"25709","Huntington","WV","38.132114","-82.418277","-5","1"
+"25710","Huntington","WV","38.413384","-82.277401","-5","1"
+"25711","Huntington","WV","38.413384","-82.277401","-5","1"
+"25712","Huntington","WV","38.413384","-82.277401","-5","1"
+"25713","Huntington","WV","38.413384","-82.277401","-5","1"
+"25714","Huntington","WV","38.413384","-82.277401","-5","1"
+"25715","Huntington","WV","38.413384","-82.277401","-5","1"
+"25716","Huntington","WV","38.413384","-82.277401","-5","1"
+"25717","Huntington","WV","38.413384","-82.277401","-5","1"
+"25718","Huntington","WV","38.413384","-82.277401","-5","1"
+"25719","Huntington","WV","38.413384","-82.277401","-5","1"
+"25720","Huntington","WV","38.413384","-82.277401","-5","1"
+"25721","Huntington","WV","38.413384","-82.277401","-5","1"
+"25722","Huntington","WV","38.413384","-82.277401","-5","1"
+"25723","Huntington","WV","38.413384","-82.277401","-5","1"
+"25724","Huntington","WV","38.413384","-82.277401","-5","1"
+"25725","Huntington","WV","38.413384","-82.277401","-5","1"
+"25726","Huntington","WV","38.413384","-82.277401","-5","1"
+"25727","Huntington","WV","38.413384","-82.277401","-5","1"
+"25728","Huntington","WV","38.413384","-82.277401","-5","1"
+"25729","Huntington","WV","38.413384","-82.277401","-5","1"
+"25755","Huntington","WV","38.422115","-82.431667","-5","1"
+"25770","Huntington","WV","38.413384","-82.277401","-5","1"
+"25771","Huntington","WV","38.413384","-82.277401","-5","1"
+"25772","Huntington","WV","38.413384","-82.277401","-5","1"
+"25773","Huntington","WV","38.413384","-82.277401","-5","1"
+"25774","Huntington","WV","38.413384","-82.277401","-5","1"
+"25775","Huntington","WV","38.413384","-82.277401","-5","1"
+"25776","Huntington","WV","38.413384","-82.277401","-5","1"
+"25777","Huntington","WV","38.413384","-82.277401","-5","1"
+"25778","Huntington","WV","38.413384","-82.277401","-5","1"
+"25779","Huntington","WV","38.413384","-82.277401","-5","1"
+"25801","Beckley","WV","37.79064","-81.19958","-5","1"
+"25802","Beckley","WV","37.748935","-81.224458","-5","1"
+"25810","Allen Junction","WV","37.603344","-81.53998","-5","1"
+"25811","Amigo","WV","37.603344","-81.53998","-5","1"
+"25812","Ansted","WV","38.138419","-81.10403","-5","1"
+"25813","Beaver","WV","37.754656","-81.11304","-5","1"
+"25816","Blue Jay","WV","37.735161","-81.136328","-5","1"
+"25817","Bolt","WV","37.77672","-81.41377","-5","1"
+"25818","Bradley","WV","37.865746","-81.19244","-5","1"
+"25820","Camp Creek","WV","37.504558","-81.11622","-5","1"
+"25823","Coal City","WV","37.679582","-81.20968","-5","1"
+"25825","Cool Ridge","WV","37.648813","-81.11241","-5","1"
+"25826","Corinne","WV","37.577807","-81.35319","-5","1"
+"25827","Crab Orchard","WV","37.733391","-81.23769","-5","1"
+"25831","Danese","WV","37.950115","-80.92051","-5","1"
+"25832","Daniels","WV","37.728559","-81.10364","-5","1"
+"25833","Dothan","WV","38.041293","-81.064784","-5","1"
+"25836","Eccles","WV","37.777391","-81.26443","-5","1"
+"25837","Edmond","WV","38.048578","-81.03387","-5","1"
+"25839","Fairdale","WV","37.776961","-81.36179","-5","1"
+"25840","Fayetteville","WV","38.059415","-81.11208","-5","1"
+"25841","Flat Top","WV","37.557975","-81.09537","-5","1"
+"25843","Ghent","WV","37.618115","-81.10724","-5","1"
+"25844","Glen Daniel","WV","37.802995","-81.36495","-5","1"
+"25845","Glen Fork","WV","37.687988","-81.5314","-5","1"
+"25846","Glen Jean","WV","37.927809","-81.15174","-5","1"
+"25847","Glen Morgan","WV","37.72329","-81.17444","-5","1"
+"25848","Glen Rogers","WV","37.714713","-81.41815","-5","1"
+"25849","Glen White","WV","37.731521","-81.28108","-5","1"
+"25851","Harper","WV","37.802469","-81.282759","-5","1"
+"25853","Helen","WV","37.63215","-81.31644","-5","1"
+"25854","Hico","WV","38.128245","-80.99151","-5","1"
+"25855","Hilltop","WV","37.94251","-81.14995","-5","1"
+"25856","Jonben","WV","37.653792","-81.18833","-5","1"
+"25857","Josephine","WV","37.625307","-81.25093","-5","1"
+"25859","Kilsyth","WV","38.041293","-81.064784","-5","1"
+"25860","Lanark","WV","37.748935","-81.224458","-5","1"
+"25862","Lansing","WV","38.079509","-81.06238","-5","1"
+"25864","Layland","WV","37.906682","-80.99175","-5","1"
+"25865","Lester","WV","37.737104","-81.32536","-5","1"
+"25866","Lochgelly","WV","38.007725","-81.1391","-5","1"
+"25868","Lookout","WV","38.073479","-80.9522","-5","1"
+"25870","Maben","WV","37.67337","-81.42001","-5","1"
+"25871","Mabscott","WV","37.771364","-81.2093","-5","1"
+"25873","Mac Arthur","WV","37.7517","-81.214825","-5","1"
+"25875","McGraws","WV","37.68344","-81.44608","-5","1"
+"25876","Saulsville","WV","37.603344","-81.53998","-5","1"
+"25878","Midway","WV","37.715335","-81.24131","-5","1"
+"25879","Minden","WV","37.980561","-81.10208","-5","1"
+"25880","Mount Hope","WV","37.88169","-81.19273","-5","1"
+"25882","Mullens","WV","37.596209","-81.38193","-5","1"
+"25898","Shady Spring","WV","37.698351","-81.081333","-5","1"
+"25901","Oak Hill","WV","37.982775","-81.14533","-5","1"
+"25902","Odd","WV","37.589172","-81.2324","-5","1"
+"25904","Pax","WV","37.935699","-81.26724","-5","1"
+"25906","Piney View","WV","37.837573","-81.128631","-5","1"
+"25907","Prince","WV","37.855763","-81.06673","-5","1"
+"25908","Princewick","WV","37.663234","-81.23911","-5","1"
+"25909","Prosperity","WV","37.837706","-81.19722","-5","1"
+"25911","Raleigh","WV","37.758469","-81.167549","-5","1"
+"25912","Ramsey","WV","38.041293","-81.064784","-5","1"
+"25913","Ravencliff","WV","37.699568","-81.48138","-5","1"
+"25914","Redstar","WV","38.041293","-81.064784","-5","1"
+"25915","Rhodell","WV","37.608562","-81.3019","-5","1"
+"25916","Sabine","WV","37.677563","-81.50071","-5","1"
+"25917","Scarbro","WV","37.964622","-81.21634","-5","1"
+"25918","Shady Spring","WV","37.712469","-81.00561","-5","1"
+"25919","Skelton","WV","37.800481","-81.180561","-5","1"
+"25920","Slab Fork","WV","37.683749","-81.34359","-5","1"
+"25921","Sophia","WV","37.70708","-81.26263","-5","1"
+"25922","Spanishburg","WV","37.467516","-81.11672","-5","1"
+"25926","Sprague","WV","37.787252","-81.195122","-5","1"
+"25927","Stanaford","WV","37.748935","-81.224458","-5","1"
+"25928","Stephenson","WV","37.576978","-81.33086","-5","1"
+"25931","Summerlee","WV","38.041293","-81.064784","-5","1"
+"25932","Surveyor","WV","37.764498","-81.3169","-5","1"
+"25934","Terry","WV","37.848955","-81.093678","-5","1"
+"25936","Thurmond","WV","37.930061","-81.05964","-5","1"
+"25938","Victor","WV","38.151832","-81.05101","-5","1"
+"25942","Winona","WV","38.040215","-80.99702","-5","1"
+"25943","Wyco","WV","37.603344","-81.53998","-5","1"
+"25951","Hinton","WV","37.671295","-80.86867","-5","1"
+"25958","Charmco","WV","38.012459","-80.72757","-5","1"
+"25961","Crichton","WV","37.975595","-80.426874","-5","1"
+"25962","Rainelle","WV","37.966816","-80.7889","-5","1"
+"25965","Elton","WV","37.648541","-80.877395","-5","1"
+"25966","Green Sulphur Springs","WV","37.798406","-80.77039","-5","1"
+"25967","Hines","WV","37.975595","-80.426874","-5","1"
+"25969","Jumping Branch","WV","37.630988","-81.00955","-5","1"
+"25971","Lerona","WV","37.478519","-80.95735","-5","1"
+"25972","Leslie","WV","38.048182","-80.74821","-5","1"
+"25976","Meadow Bridge","WV","37.854735","-80.84199","-5","1"
+"25977","Meadow Creek","WV","37.808181","-80.92321","-5","1"
+"25978","Nimitz","WV","37.645397","-80.92422","-5","1"
+"25979","Pipestem","WV","37.49671","-80.91401","-5","1"
+"25981","Quinwood","WV","38.07743","-80.72476","-5","1"
+"25984","Rupert","WV","37.981358","-80.66798","-5","1"
+"25985","Sandstone","WV","37.772844","-80.86438","-5","1"
+"25986","Spring Dale","WV","37.878258","-80.80217","-5","1"
+"25988","True","WV","37.648541","-80.877395","-5","1"
+"25989","White Oak","WV","37.67906","-81.03591","-5","1"
+"26003","Wheeling","WV","40.071472","-80.6868","-5","1"
+"26030","Beech Bottom","WV","40.219614","-80.65404","-5","1"
+"26031","Benwood","WV","40.013637","-80.72744","-5","1"
+"26032","Bethany","WV","40.198956","-80.54683","-5","1"
+"26033","Cameron","WV","39.81304","-80.58446","-5","1"
+"26034","Chester","WV","40.609272","-80.55893","-5","1"
+"26035","Colliers","WV","40.352943","-80.55585","-5","1"
+"26036","Dallas","WV","39.974547","-80.53003","-5","1"
+"26037","Follansbee","WV","40.330969","-80.58889","-5","1"
+"26038","Glen Dale","WV","39.951586","-80.74994","-5","1"
+"26039","Glen Easton","WV","39.835605","-80.67752","-5","1"
+"26040","McMechen","WV","39.987177","-80.73048","-5","1"
+"26041","Moundsville","WV","39.912923","-80.73701","-5","1"
+"26047","New Cumberland","WV","40.519953","-80.58925","-5","1"
+"26050","Newell","WV","40.616853","-80.60454","-5","1"
+"26055","Proctor","WV","39.768143","-80.79867","-5","1"
+"26056","New Manchester","WV","40.5323","-80.57999","-5","1"
+"26058","Short Creek","WV","40.27932","-80.599949","-5","1"
+"26059","Triadelphia","WV","40.063895","-80.6091","-5","1"
+"26060","Valley Grove","WV","40.104818","-80.54634","-5","1"
+"26062","Weirton","WV","40.412067","-80.57542","-5","1"
+"26070","Wellsburg","WV","40.266698","-80.59709","-5","1"
+"26074","West Liberty","WV","40.167471","-80.59377","-5","1"
+"26075","Windsor Heights","WV","40.190886","-80.66613","-5","1"
+"26101","Parkersburg","WV","39.265408","-81.53706","-5","1"
+"26102","Parkersburg","WV","39.218276","-81.497865","-5","1"
+"26103","Parkersburg","WV","39.236427","-81.540501","-5","1"
+"26104","Parkersburg","WV","39.285724","-81.52639","-5","1"
+"26105","Vienna","WV","39.323907","-81.54206","-5","1"
+"26106","Parkersburg","WV","39.218276","-81.497865","-5","1"
+"26120","Mineral Wells","WV","39.218276","-81.497865","-5","1"
+"26121","Mineral Wells","WV","39.218276","-81.497865","-5","1"
+"26133","Belleville","WV","39.122989","-81.68365","-5","1"
+"26134","Belmont","WV","39.374773","-81.27886","-5","1"
+"26135","Bens Run","WV","39.450612","-80.870081","-5","1"
+"26136","Big Bend","WV","38.977792","-81.13917","-5","1"
+"26137","Big Springs","WV","38.991483","-81.06772","-5","1"
+"26138","Brohard","WV","39.03594","-81.18787","-5","1"
+"26141","Creston","WV","38.939317","-81.24459","-5","1"
+"26142","Davisville","WV","39.2059","-81.46549","-5","1"
+"26143","Elizabeth","WV","39.070067","-81.40762","-5","1"
+"26145","Pennsboro","WV","39.288336","-80.968967","-5","1"
+"26146","Friendly","WV","39.462447","-81.05091","-5","1"
+"26147","Grantsville","WV","38.911018","-81.07278","-5","1"
+"26148","Macfarlan","WV","39.065862","-81.18722","-5","1"
+"26149","Middlebourne","WV","39.481247","-80.87533","-5","1"
+"26150","Mineral Wells","WV","39.162229","-81.53788","-5","1"
+"26151","Mount Zion","WV","38.885826","-81.16885","-5","1"
+"26152","Munday","WV","38.988098","-81.20721","-5","1"
+"26155","New Martinsville","WV","39.646099","-80.83465","-5","1"
+"26159","Paden City","WV","39.604088","-80.93276","-5","1"
+"26160","Palestine","WV","38.971224","-81.40218","-5","1"
+"26161","Petroleum","WV","39.173299","-81.25595","-5","1"
+"26162","Porters Falls","WV","39.576419","-80.77211","-5","1"
+"26164","Ravenswood","WV","38.977445","-81.72789","-5","1"
+"26167","Reader","WV","39.550395","-80.71163","-5","1"
+"26169","Rockport","WV","39.076628","-81.55299","-5","1"
+"26170","Saint Marys","WV","39.370217","-81.17215","-5","1"
+"26173","Sherman","WV","38.95192","-81.709496","-5","1"
+"26175","Sistersville","WV","39.547803","-80.97408","-5","1"
+"26178","Smithville","WV","39.059792","-81.02943","-5","1"
+"26180","Walker","WV","39.179485","-81.37836","-5","1"
+"26181","Washington","WV","39.220948","-81.66508","-5","1"
+"26184","Waverly","WV","39.306083","-81.36639","-5","1"
+"26186","Wileyville","WV","39.619007","-80.61225","-5","1"
+"26187","Williamstown","WV","39.387718","-81.44585","-5","1"
+"26201","Buckhannon","WV","38.997267","-80.20915","-5","1"
+"26202","Fenwick","WV","38.224393","-80.61391","-5","1"
+"26203","Erbacon","WV","38.520078","-80.59518","-5","1"
+"26205","Craigsville","WV","38.330842","-80.64803","-5","1"
+"26206","Cowen","WV","38.424309","-80.53771","-5","1"
+"26208","Camden On Gauley","WV","38.364123","-80.5902","-5","1"
+"26209","Snowshoe","WV","38.422376","-79.99344","-5","1"
+"26210","Adrian","WV","38.900064","-80.26795","-5","1"
+"26215","Cleveland","WV","38.716238","-80.39927","-5","1"
+"26217","Diana","WV","38.60286","-80.4595","-5","1"
+"26218","French Creek","WV","38.857567","-80.27872","-5","1"
+"26219","Frenchton","WV","38.899314","-80.226855","-5","1"
+"26222","Hacker Valley","WV","38.663739","-80.39794","-5","1"
+"26224","Helvetia","WV","38.735363","-80.18033","-5","1"
+"26228","Kanawha Head","WV","38.753031","-80.38231","-5","1"
+"26229","Lorentz","WV","38.899314","-80.226855","-5","1"
+"26230","Pickens","WV","38.66362","-80.24361","-5","1"
+"26234","Rock Cave","WV","38.792214","-80.3159","-5","1"
+"26236","Selbyville","WV","38.752157","-80.23537","-5","1"
+"26237","Tallmansville","WV","38.854653","-80.15531","-5","1"
+"26238","Volga","WV","39.091657","-80.1442","-5","1"
+"26241","Elkins","WV","38.920042","-79.8446","-5","1"
+"26250","Belington","WV","39.032644","-79.95295","-5","1"
+"26253","Beverly","WV","38.827205","-79.89057","-5","1"
+"26254","Bowden","WV","38.918159","-79.63227","-5","1"
+"26257","Coalton","WV","38.916124","-80.00221","-5","1"
+"26259","Dailey","WV","38.798094","-79.89941","-5","1"
+"26260","Davis","WV","39.101535","-79.43805","-5","1"
+"26261","Richwood","WV","38.224781","-80.5425","-5","1"
+"26263","Dryfork","WV","38.992079","-79.40533","-5","1"
+"26264","Durbin","WV","38.55181","-79.83449","-5","1"
+"26266","Upperglade","WV","38.41012","-80.49595","-5","1"
+"26267","Ellamore","WV","38.912609","-80.07907","-5","1"
+"26268","Glady","WV","38.780919","-79.74674","-5","1"
+"26269","Hambleton","WV","39.097545","-79.63848","-5","1"
+"26270","Harman","WV","38.915141","-79.53066","-5","1"
+"26271","Hendricks","WV","39.042297","-79.60611","-5","1"
+"26273","Huttonsville","WV","38.671662","-79.98029","-5","1"
+"26275","Junior","WV","38.97639","-79.95201","-5","1"
+"26276","Kerens","WV","39.019639","-79.74614","-5","1"
+"26278","Mabie","WV","38.861656","-80.00402","-5","1"
+"26280","Mill Creek","WV","38.736144","-80","-5","1"
+"26282","Monterville","WV","38.518735","-80.14368","-5","1"
+"26283","Montrose","WV","39.067689","-79.82219","-5","1"
+"26285","Norton","WV","38.934414","-79.96518","-5","1"
+"26287","Parsons","WV","39.141165","-79.67466","-5","1"
+"26288","Webster Springs","WV","38.484777","-80.38023","-5","1"
+"26289","Red Creek","WV","38.99095","-79.50217","-5","1"
+"26291","Slatyfork","WV","38.444873","-80.09781","-5","1"
+"26292","Thomas","WV","39.149624","-79.5003","-5","1"
+"26293","Valley Bend","WV","38.758699","-79.91798","-5","1"
+"26294","Valley Head","WV","38.52061","-80.03629","-5","1"
+"26296","Whitmer","WV","38.810555","-79.54723","-5","1"
+"26298","Bergoo","WV","38.480062","-80.29679","-5","1"
+"26301","Clarksburg","WV","39.281289","-80.34348","-5","1"
+"26302","Clarksburg","WV","39.26277","-80.30858","-5","1"
+"26306","Clarksburg","WV","39.285204","-80.385344","-5","1"
+"26320","Alma","WV","39.41849","-80.80604","-5","1"
+"26321","Alum Bridge","WV","39.051863","-80.6844","-5","1"
+"26323","Anmoore","WV","39.258328","-80.28798","-5","1"
+"26325","Auburn","WV","39.095644","-80.86182","-5","1"
+"26327","Berea","WV","39.122023","-80.95448","-5","1"
+"26328","Blandville","WV","39.270846","-80.719742","-5","1"
+"26330","Bridgeport","WV","39.296499","-80.24199","-5","1"
+"26332","Bristol","WV","39.286975","-80.50197","-5","1"
+"26333","Burnsville","WV","38.859246","-80.657019","-5","1"
+"26334","Brownton","WV","39.220701","-80.15881","-5","1"
+"26335","Burnsville","WV","38.856879","-80.66528","-5","1"
+"26337","Cairo","WV","39.228729","-81.16135","-5","1"
+"26338","Camden","WV","39.09666","-80.62283","-5","1"
+"26339","Center Point","WV","39.42039","-80.60204","-5","1"
+"26342","Coxs Mills","WV","39.018602","-80.85231","-5","1"
+"26343","Crawford","WV","38.85389","-80.40589","-5","1"
+"26346","Ellenboro","WV","39.270902","-81.06189","-5","1"
+"26347","Flemington","WV","39.258358","-80.12604","-5","1"
+"26348","Folsom","WV","39.472363","-80.5275","-5","1"
+"26349","Galloway","WV","39.226574","-80.08514","-5","1"
+"26350","Gilmer","WV","38.913649","-80.831256","-5","1"
+"26351","Glenville","WV","38.939952","-80.84886","-5","1"
+"26354","Grafton","WV","39.343418","-80.02665","-5","1"
+"26361","Gypsy","WV","39.368814","-80.31872","-5","1"
+"26362","Harrisville","WV","39.171784","-81.05325","-5","1"
+"26366","Haywood","WV","39.380098","-80.33785","-5","1"
+"26369","Hepzibah","WV","39.328064","-80.33566","-5","1"
+"26372","Horner","WV","38.969579","-80.36881","-5","1"
+"26374","Independence","WV","39.436084","-79.87873","-5","1"
+"26375","Industrial","WV","39.279818","-80.575379","-5","1"
+"26376","Ireland","WV","38.766855","-80.46172","-5","1"
+"26377","Jacksonburg","WV","39.485593","-80.64053","-5","1"
+"26378","Jane Lew","WV","39.106153","-80.42691","-5","1"
+"26384","Linn","WV","38.983677","-80.70654","-5","1"
+"26385","Lost Creek","WV","39.163304","-80.35527","-5","1"
+"26386","Lumberport","WV","39.378137","-80.3709","-5","1"
+"26404","Meadowbrook","WV","39.344303","-80.31744","-5","1"
+"26405","Moatsville","WV","39.230125","-79.89397","-5","1"
+"26407","Mountain","WV","39.198501","-81.068913","-5","1"
+"26408","Mount Clare","WV","39.205852","-80.29416","-5","1"
+"26410","Newburg","WV","39.39905","-79.82996","-5","1"
+"26411","New Milton","WV","39.185707","-80.71039","-5","1"
+"26412","Orlando","WV","38.891517","-80.5648","-5","1"
+"26415","Pennsboro","WV","39.294877","-80.96009","-5","1"
+"26416","Philippi","WV","39.155551","-80.02419","-5","1"
+"26419","Pine Grove","WV","39.551892","-80.67076","-5","1"
+"26421","Pullman","WV","39.183473","-80.92668","-5","1"
+"26422","Reynoldsville","WV","39.285303","-80.44628","-5","1"
+"26424","Rosemont","WV","39.268207","-80.1652","-5","1"
+"26425","Rowlesburg","WV","39.320034","-79.68442","-5","1"
+"26426","Salem","WV","39.284467","-80.57219","-5","1"
+"26430","Sand Fork","WV","38.891042","-80.74656","-5","1"
+"26431","Shinnston","WV","39.392285","-80.28438","-5","1"
+"26434","Shirley","WV","39.450612","-80.870081","-5","1"
+"26435","Simpson","WV","39.266262","-80.09206","-5","1"
+"26436","Smithburg","WV","39.287254","-80.73186","-5","1"
+"26437","Smithfield","WV","39.513468","-80.53196","-5","1"
+"26438","Spelter","WV","39.346726","-80.31889","-5","1"
+"26440","Thornton","WV","39.329797","-79.90371","-5","1"
+"26443","Troy","WV","39.080329","-80.76956","-5","1"
+"26444","Tunnelton","WV","39.377589","-79.76428","-5","1"
+"26447","Walkersville","WV","38.881069","-80.47432","-5","1"
+"26448","Wallace","WV","39.407957","-80.48869","-5","1"
+"26451","West Milford","WV","39.204169","-80.40294","-5","1"
+"26452","Weston","WV","39.04101","-80.47731","-5","1"
+"26456","West Union","WV","39.293095","-80.77811","-5","1"
+"26461","Wilsonburg","WV","39.285204","-80.385344","-5","1"
+"26462","Weston","WV","39.03525","-80.467765","-5","1"
+"26463","Wyatt","WV","39.440245","-80.35233","-5","1"
+"26501","Morgantown","WV","39.628475","-79.98796","-5","1"
+"26502","Morgantown","WV","39.625302","-79.967184","-5","1"
+"26503","Morgantown","WV","39.636606","-79.895639","-5","1"
+"26504","Morgantown","WV","39.578512","-80.093007","-5","1"
+"26505","Morgantown","WV","39.646497","-79.95154","-5","1"
+"26506","Morgantown","WV","39.645276","-79.962669","-5","1"
+"26507","Morgantown","WV","39.680786","-79.836473","-5","1"
+"26508","Morgantown","WV","39.61098","-79.89947","-5","1"
+"26519","Albright","WV","39.539088","-79.63241","-5","1"
+"26520","Arthurdale","WV","39.497676","-79.82003","-5","1"
+"26521","Blacksville","WV","39.718922","-80.21137","-5","1"
+"26522","Booth","WV","39.578512","-80.093007","-5","1"
+"26524","Bretz","WV","39.458091","-79.688154","-5","1"
+"26525","Bruceton Mills","WV","39.646876","-79.59847","-5","1"
+"26527","Cassville","WV","39.578512","-80.093007","-5","1"
+"26529","Core","WV","39.68903","-80.14113","-5","1"
+"26531","Dellslow","WV","39.607447","-79.89012","-5","1"
+"26533","Everettville","WV","39.578512","-80.093007","-5","1"
+"26534","Granville","WV","39.646705","-79.98826","-5","1"
+"26535","Hazelton","WV","39.458091","-79.688154","-5","1"
+"26537","Kingwood","WV","39.472924","-79.69873","-5","1"
+"26541","Maidsville","WV","39.69234","-79.97335","-5","1"
+"26542","Masontown","WV","39.561031","-79.79533","-5","1"
+"26543","Osage","WV","39.660624","-80.0072","-5","1"
+"26544","Pentress","WV","39.707009","-80.16451","-5","1"
+"26546","Pursglove","WV","39.674575","-80.034965","-5","1"
+"26547","Reedsville","WV","39.509001","-79.80521","-5","1"
+"26554","Fairmont","WV","39.470949","-80.13936","-5","1"
+"26555","Fairmont","WV","39.514343","-80.218538","-5","1"
+"26559","Barrackville","WV","39.5017","-80.1664","-5","1"
+"26560","Baxter","WV","39.514343","-80.218538","-5","1"
+"26561","Big Run","WV","39.575518","-80.666712","-5","1"
+"26562","Burton","WV","39.646936","-80.44192","-5","1"
+"26563","Carolina","WV","39.480838","-80.27183","-5","1"
+"26566","Colfax","WV","39.514343","-80.218538","-5","1"
+"26568","Enterprise","WV","39.422397","-80.27564","-5","1"
+"26570","Fairview","WV","39.642393","-80.23405","-5","1"
+"26571","Farmington","WV","39.513513","-80.25738","-5","1"
+"26572","Four States","WV","39.48057","-80.30851","-5","1"
+"26574","Grant Town","WV","39.558702","-80.17617","-5","1"
+"26575","Hundred","WV","39.696744","-80.43872","-5","1"
+"26576","Idamay","WV","39.494727","-80.25872","-5","1"
+"26578","Kingmont","WV","39.446631","-80.176171","-5","1"
+"26581","Littleton","WV","39.695772","-80.53077","-5","1"
+"26582","Mannington","WV","39.527817","-80.3586","-5","1"
+"26585","Metz","WV","39.611767","-80.41237","-5","1"
+"26586","Montana Mines","WV","39.525505","-80.10866","-5","1"
+"26587","Rachel","WV","39.520705","-80.30336","-5","1"
+"26588","Rivesville","WV","39.549346","-80.13097","-5","1"
+"26589","Wadestown","WV","39.668566","-80.335","-5","1"
+"26590","Wana","WV","39.704464","-80.27178","-5","1"
+"26591","Worthington","WV","39.452034","-80.27599","-5","1"
+"26601","Sutton","WV","38.641439","-80.67497","-5","1"
+"26610","Birch River","WV","38.465291","-80.72323","-5","1"
+"26611","Cedarville","WV","38.833295","-80.80006","-5","1"
+"26612","Centralia","WV","38.620506","-80.586148","-5","1"
+"26615","Copen","WV","38.836102","-80.72573","-5","1"
+"26617","Dille","WV","38.49119","-80.83069","-5","1"
+"26618","Elmira","WV","38.706017","-80.736884","-5","1"
+"26619","Exchange","WV","38.788013","-80.73291","-5","1"
+"26621","Flatwoods","WV","38.728405","-80.58745","-5","1"
+"26623","Frametown","WV","38.653616","-80.86194","-5","1"
+"26624","Gassaway","WV","38.704457","-80.79366","-5","1"
+"26627","Heaters","WV","38.767682","-80.61266","-5","1"
+"26629","Little Birch","WV","38.553898","-80.69864","-5","1"
+"26630","Bridgeport","WV","39.280867","-80.249302","-5","1"
+"26631","Napier","WV","38.790368","-80.57981","-5","1"
+"26634","Perkins","WV","38.786153","-80.91878","-5","1"
+"26636","Rosedale","WV","38.74076","-80.9435","-5","1"
+"26638","Shock","WV","38.7357","-80.98431","-5","1"
+"26639","Strange Creek","WV","38.55291","-80.86928","-5","1"
+"26641","Wilsie","WV","38.690755","-80.90285","-5","1"
+"26651","Summersville","WV","38.30696","-80.87329","-5","1"
+"26656","Belva","WV","38.244559","-81.16153","-5","1"
+"26660","Calvin","WV","38.355607","-80.69639","-5","1"
+"26662","Canvas","WV","38.245298","-80.75434","-5","1"
+"26667","Drennen","WV","38.268633","-80.98148","-5","1"
+"26671","Gilboa","WV","38.302121","-80.93549","-5","1"
+"26674","Jodie","WV","38.210552","-81.13906","-5","1"
+"26675","Keslers Cross Lanes","WV","38.318389","-80.834152","-5","1"
+"26676","Leivasy","WV","38.153472","-80.66112","-5","1"
+"26678","Mount Lookout","WV","38.15798","-80.91002","-5","1"
+"26679","Mount Nebo","WV","38.1755","-80.80897","-5","1"
+"26680","Nallen","WV","38.090457","-80.88462","-5","1"
+"26681","Nettie","WV","38.218258","-80.70048","-5","1"
+"26684","Pool","WV","38.163524","-80.86864","-5","1"
+"26690","Swiss","WV","38.243168","-81.10596","-5","1"
+"26691","Tioga","WV","38.408153","-80.67026","-5","1"
+"26704","Augusta","WV","39.285323","-78.59401","-5","1"
+"26705","Aurora","WV","39.327576","-79.54714","-5","1"
+"26707","Bayard","WV","39.264409","-79.3654","-5","1"
+"26710","Burlington","WV","39.335771","-78.91724","-5","1"
+"26711","Capon Bridge","WV","39.293252","-78.47306","-5","1"
+"26714","Delray","WV","39.18253","-78.62152","-5","1"
+"26716","Eglon","WV","39.261474","-79.50612","-5","1"
+"26717","Elk Garden","WV","39.351231","-79.17606","-5","1"
+"26719","Fort Ashby","WV","39.497698","-78.76381","-5","1"
+"26720","Gormania","WV","39.280652","-79.33844","-5","1"
+"26722","Green Spring","WV","39.509416","-78.6438","-5","1"
+"26726","Keyser","WV","39.434856","-78.95987","-5","1"
+"26731","Lahmansville","WV","39.153987","-79.07088","-5","1"
+"26734","Medley","WV","39.070601","-79.233536","-5","1"
+"26739","Mount Storm","WV","39.248761","-79.23785","-5","1"
+"26743","New Creek","WV","39.291478","-79.07484","-5","1"
+"26750","Piedmont","WV","39.476243","-79.04681","-5","1"
+"26753","Ridgeley","WV","39.579717","-78.78539","-5","1"
+"26755","Rio","WV","39.13957","-78.66841","-5","1"
+"26757","Romney","WV","39.321688","-78.74815","-5","1"
+"26761","Shanks","WV","39.291196","-78.69317","-5","1"
+"26763","Springfield","WV","39.44763","-78.6661","-5","1"
+"26764","Terra Alta","WV","39.454805","-79.54326","-5","1"
+"26767","Wiley Ford","WV","39.616008","-78.77489","-5","1"
+"26801","Baker","WV","39.084895","-78.779","-5","1"
+"26802","Brandywine","WV","38.633148","-79.21669","-5","1"
+"26804","Circleville","WV","38.626289","-79.53068","-5","1"
+"26807","Franklin","WV","38.65585","-79.33975","-5","1"
+"26808","High View","WV","39.210787","-78.44261","-5","1"
+"26810","Lost City","WV","38.973027","-78.73978","-5","1"
+"26812","Mathias","WV","38.878002","-78.88245","-5","1"
+"26814","Riverton","WV","38.737991","-79.43087","-5","1"
+"26815","Sugar Grove","WV","38.482224","-79.33161","-5","1"
+"26817","Bloomery","WV","39.344466","-78.38374","-5","1"
+"26818","Fisher","WV","39.068317","-79.01717","-5","1"
+"26823","Capon Springs","WV","39.13982","-78.49576","-5","1"
+"26824","Junction","WV","39.314071","-78.659428","-5","1"
+"26833","Maysville","WV","39.089792","-79.18014","-5","1"
+"26836","Moorefield","WV","39.038183","-78.97189","-5","1"
+"26838","Milam","WV","38.81801","-79.09107","-5","1"
+"26845","Old Fields","WV","39.184315","-78.9458","-5","1"
+"26847","Petersburg","WV","38.959188","-79.13703","-5","1"
+"26851","Wardensville","WV","39.066543","-78.6218","-5","1"
+"26852","Purgitsville","WV","39.248438","-78.92736","-5","1"
+"26855","Cabins","WV","38.98645","-79.25455","-5","1"
+"26865","Yellow Spring","WV","39.199856","-78.49655","-5","1"
+"26866","Upper Tract","WV","38.814289","-79.23861","-5","1"
+"26884","Seneca Rocks","WV","38.849407","-79.37151","-5","1"
+"26886","Onego","WV","38.844294","-79.42206","-5","1"
+"26905","Morgantown","WV","39.635272","-79.933496","-5","1"
+"27006","Advance","NC","35.954679","-80.44132","-5","1"
+"27007","Ararat","NC","36.390363","-80.58746","-5","1"
+"27009","Belews Creek","NC","36.236829","-80.07495","-5","1"
+"27010","Bethania","NC","36.182975","-80.338662","-5","1"
+"27011","Boonville","NC","36.218385","-80.70955","-5","1"
+"27012","Clemmons","NC","36.027101","-80.39312","-5","1"
+"27013","Cleveland","NC","35.73956","-80.69407","-5","1"
+"27014","Cooleemee","NC","35.812635","-80.55724","-5","1"
+"27016","Danbury","NC","36.429179","-80.19588","-5","1"
+"27017","Dobson","NC","36.367258","-80.72296","-5","1"
+"27018","East Bend","NC","36.198622","-80.52694","-5","1"
+"27019","Germanton","NC","36.297049","-80.23777","-5","1"
+"27020","Hamptonville","NC","36.115196","-80.81872","-5","1"
+"27021","King","NC","36.293122","-80.3546","-5","1"
+"27022","Lawsonville","NC","36.52235","-80.22195","-5","1"
+"27023","Lewisville","NC","36.097767","-80.42715","-5","1"
+"27024","Lowgap","NC","36.520921","-80.84824","-5","1"
+"27025","Madison","NC","36.383107","-79.97451","-5","1"
+"27027","Mayodan","NC","36.421448","-79.97458","-5","1"
+"27028","Mocksville","NC","35.920477","-80.57143","-5","1"
+"27030","Mount Airy","NC","36.49376","-80.62336","-5","1"
+"27031","White Plains","NC","36.399366","-80.70809","-5","1"
+"27040","Pfafftown","NC","36.182718","-80.36487","-5","1"
+"27041","Pilot Mountain","NC","36.398995","-80.48006","-5","1"
+"27042","Pine Hall","NC","36.335676","-80.05135","-5","1"
+"27043","Pinnacle","NC","36.331502","-80.4417","-5","1"
+"27045","Rural Hall","NC","36.232354","-80.30391","-5","1"
+"27046","Sandy Ridge","NC","36.488575","-80.09267","-5","1"
+"27047","Siloam","NC","36.305687","-80.5824","-5","1"
+"27048","Stoneville","NC","36.47266","-79.90522","-5","1"
+"27049","Toast","NC","36.551332","-80.655786","-5","1"
+"27050","Tobaccoville","NC","36.235252","-80.38089","-5","1"
+"27051","Walkertown","NC","36.174243","-80.16679","-5","1"
+"27052","Walnut Cove","NC","36.298241","-80.14383","-5","1"
+"27053","Westfield","NC","36.473951","-80.34752","-5","1"
+"27054","Woodleaf","NC","35.787743","-80.59377","-5","1"
+"27055","Yadkinville","NC","36.12301","-80.64557","-5","1"
+"27094","Rural Hall","NC","36.027482","-80.20728","-5","1"
+"27098","Rural Hall","NC","36.027482","-80.20728","-5","1"
+"27099","Rural Hall","NC","36.027482","-80.20728","-5","1"
+"27101","Winston Salem","NC","36.107037","-80.21918","-5","1"
+"27102","Winston Salem","NC","36.032304","-80.396168","-5","1"
+"27103","Winston Salem","NC","36.066545","-80.30733","-5","1"
+"27104","Winston Salem","NC","36.094104","-80.31503","-5","1"
+"27105","Winston Salem","NC","36.147887","-80.23423","-5","1"
+"27106","Winston Salem","NC","36.141395","-80.3137","-5","1"
+"27107","Winston Salem","NC","36.046215","-80.18998","-5","1"
+"27108","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27109","Winston Salem","NC","36.133577","-80.2768","-5","1"
+"27110","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27111","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27113","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27114","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27115","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27116","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27117","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27120","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27127","Winston Salem","NC","36.039398","-80.26171","-5","1"
+"27130","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27144","Salisbury","NC","35.708966","-80.464515","-5","1"
+"27150","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27151","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27152","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27155","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27156","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27157","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27198","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27199","Winston Salem","NC","36.027482","-80.20728","-5","1"
+"27201","Alamance","NC","36.031836","-79.485643","-5","1"
+"27202","Altamahaw","NC","36.185712","-79.50496","-5","1"
+"27203","Asheboro","NC","35.686122","-79.82919","-5","1"
+"27204","Asheboro","NC","35.788286","-79.720556","-5","1"
+"27205","Asheboro","NC","35.665973","-79.832161","-5","1"
+"27207","Bear Creek","NC","35.613837","-79.38984","-5","1"
+"27208","Bennett","NC","35.559258","-79.54591","-5","1"
+"27209","Biscoe","NC","35.354158","-79.76839","-5","1"
+"27212","Blanch","NC","36.461871","-79.26388","-5","1"
+"27213","Bonlee","NC","35.648194","-79.414859","-5","1"
+"27214","Browns Summit","NC","36.205771","-79.69839","-5","1"
+"27215","Burlington","NC","36.072336","-79.4698","-5","1"
+"27216","Burlington","NC","36.047523","-79.479743","-5","1"
+"27217","Burlington","NC","36.132737","-79.41135","-5","1"
+"27220","Burlington","NC","36.046677","-79.389631","-5","1"
+"27228","Bynum","NC","35.783476","-79.129791","-5","1"
+"27229","Candor","NC","35.280008","-79.79467","-5","1"
+"27230","Cedar Falls","NC","35.802758","-79.879711","-5","1"
+"27231","Cedar Grove","NC","36.207994","-79.16879","-5","1"
+"27233","Climax","NC","35.911979","-79.69566","-5","1"
+"27235","Colfax","NC","36.092076","-80.01009","-5","1"
+"27237","Cumnock","NC","35.467567","-79.165314","-5","1"
+"27239","Denton","NC","35.618434","-80.10517","-5","1"
+"27242","Eagle Springs","NC","35.307299","-79.65327","-5","1"
+"27243","Efland","NC","36.082138","-79.18649","-5","1"
+"27244","Elon College","NC","36.152742","-79.50839","-5","1"
+"27247","Ether","NC","35.451411","-79.783404","-5","1"
+"27248","Franklinville","NC","35.761433","-79.69835","-5","1"
+"27249","Gibsonville","NC","36.125747","-79.56352","-5","1"
+"27252","Goldston","NC","35.564257","-79.35011","-5","1"
+"27253","Graham","NC","36.031837","-79.37815","-5","1"
+"27256","Gulf","NC","35.562184","-79.28751","-5","1"
+"27258","Haw River","NC","36.064176","-79.34421","-5","1"
+"27259","Highfalls","NC","35.492077","-79.479016","-5","1"
+"27260","High Point","NC","35.950436","-79.99345","-5","1"
+"27261","High Point","NC","36.080707","-80.0244","-5","1"
+"27262","High Point","NC","35.964586","-80.02239","-5","1"
+"27263","High Point","NC","35.914548","-79.96062","-5","1"
+"27264","High Point","NC","36.080707","-80.0244","-5","1"
+"27265","High Point","NC","36.017647","-80.00628","-5","1"
+"27278","Hillsborough","NC","36.079726","-79.09459","-5","1"
+"27281","Jackson Springs","NC","35.177643","-79.60491","-5","1"
+"27282","Jamestown","NC","35.998221","-79.93573","-5","1"
+"27283","Julian","NC","35.936904","-79.63191","-5","1"
+"27284","Kernersville","NC","36.119887","-80.08726","-5","1"
+"27285","Kernersville","NC","36.027482","-80.20728","-5","1"
+"27288","Eden","NC","36.505996","-79.74935","-5","1"
+"27289","Eden","NC","36.392135","-79.773094","-5","1"
+"27291","Leasburg","NC","36.415102","-79.14221","-5","1"
+"27292","Lexington","NC","35.775789","-80.23174","-5","1"
+"27293","Lexington","NC","35.882943","-80.275963","-5","1"
+"27294","Lexington","NC","35.882943","-80.275963","-5","1"
+"27295","Lexington","NC","35.856896","-80.28961","-5","1"
+"27298","Liberty","NC","35.884276","-79.56809","-5","1"
+"27299","Linwood","NC","35.752578","-80.37587","-5","1"
+"27301","McLeansville","NC","36.108536","-79.6808","-5","1"
+"27302","Mebane","NC","36.111449","-79.27142","-5","1"
+"27305","Milton","NC","36.532166","-79.21379","-5","1"
+"27306","Mount Gilead","NC","35.227919","-79.99741","-5","1"
+"27310","Oak Ridge","NC","36.178137","-79.9842","-5","1"
+"27311","Pelham","NC","36.49076","-79.48073","-5","1"
+"27312","Pittsboro","NC","35.756091","-79.17848","-5","1"
+"27313","Pleasant Garden","NC","35.937595","-79.75441","-5","1"
+"27314","Prospect Hill","NC","36.285009","-79.19809","-5","1"
+"27315","Providence","NC","36.512448","-79.37498","-5","1"
+"27316","Ramseur","NC","35.711954","-79.63723","-5","1"
+"27317","Randleman","NC","35.817411","-79.80389","-5","1"
+"27320","Reidsville","NC","36.345919","-79.67075","-5","1"
+"27321","Reidsville","NC","36.347568","-79.680318","-5","1"
+"27322","Reidsville","NC","36.392135","-79.773094","-5","1"
+"27323","Reidsville","NC","36.392135","-79.773094","-5","1"
+"27325","Robbins","NC","35.447663","-79.57555","-5","1"
+"27326","Ruffin","NC","36.478349","-79.55518","-5","1"
+"27330","Sanford","NC","35.458804","-79.16415","-5","1"
+"27331","Sanford","NC","35.372577","-79.276577","-5","1"
+"27332","Sanford","NC","35.401023","-79.14419","-5","1"
+"27340","Saxapahaw","NC","35.948814","-79.329664","-5","1"
+"27341","Seagrove","NC","35.53332","-79.71018","-5","1"
+"27342","Sedalia","NC","36.075975","-79.63132","-5","1"
+"27343","Semora","NC","36.495772","-79.09331","-5","1"
+"27344","Siler City","NC","35.729692","-79.44984","-5","1"
+"27349","Snow Camp","NC","35.897155","-79.42344","-5","1"
+"27350","Sophia","NC","35.808395","-79.90244","-5","1"
+"27351","Southmont","NC","35.660548","-80.283647","-5","1"
+"27355","Staley","NC","35.79386","-79.55521","-5","1"
+"27356","Star","NC","35.414095","-79.78487","-5","1"
+"27357","Stokesdale","NC","36.252154","-79.97548","-5","1"
+"27358","Summerfield","NC","36.209976","-79.88921","-5","1"
+"27359","Swepsonville","NC","36.021389","-79.357399","-5","1"
+"27360","Thomasville","NC","35.871","-80.08603","-5","1"
+"27361","Thomasville","NC","35.882943","-80.275963","-5","1"
+"27370","Trinity","NC","35.843856","-79.9849","-5","1"
+"27371","Troy","NC","35.382213","-79.92418","-5","1"
+"27373","Wallburg","NC","35.882943","-80.275963","-5","1"
+"27374","Welcome","NC","35.781848","-80.203546","-5","1"
+"27375","Wentworth","NC","36.392135","-79.773094","-5","1"
+"27376","West End","NC","35.248989","-79.54383","-5","1"
+"27377","Whitsett","NC","36.050652","-79.59483","-5","1"
+"27379","Yanceyville","NC","36.387904","-79.33107","-5","1"
+"27391","Troy","NC","35.353048","-79.901349","-5","1"
+"27397","Yanceyville","NC","36.403393","-79.333836","-5","1"
+"27401","Greensboro","NC","36.071135","-79.77468","-5","1"
+"27402","Greensboro","NC","36.106711","-79.791901","-5","1"
+"27403","Greensboro","NC","36.064485","-79.82206","-5","1"
+"27404","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27405","Greensboro","NC","36.107499","-79.75242","-5","1"
+"27406","Greensboro","NC","36.022863","-79.77895","-5","1"
+"27407","Greensboro","NC","36.025379","-79.87112","-5","1"
+"27408","Greensboro","NC","36.101385","-79.81425","-5","1"
+"27409","Greensboro","NC","36.083885","-79.94122","-5","1"
+"27410","Greensboro","NC","36.116854","-79.88291","-5","1"
+"27411","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27412","Greensboro","NC","36.066129","-79.806735","-5","1"
+"27413","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27415","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27416","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27417","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27419","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27420","Greensboro","NC","36.112987","-79.775913","-5","1"
+"27425","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27427","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27429","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27435","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27438","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27455","Greensboro","NC","36.156707","-79.80644","-5","1"
+"27480","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27495","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27498","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27499","Greensboro","NC","36.080707","-80.0244","-5","1"
+"27501","Angier","NC","35.494384","-78.71","-5","1"
+"27502","Apex","NC","35.73663","-78.86462","-5","1"
+"27503","Bahama","NC","36.158344","-78.87419","-5","1"
+"27504","Benson","NC","35.390431","-78.53155","-5","1"
+"27505","Broadway","NC","35.42638","-79.03409","-5","1"
+"27506","Buies Creek","NC","35.406513","-78.73848","-5","1"
+"27507","Bullock","NC","36.525791","-78.57014","-5","1"
+"27508","Bunn","NC","35.954331","-78.25342","-5","1"
+"27509","Butner","NC","36.138298","-78.75882","-5","1"
+"27510","Carrboro","NC","35.912489","-79.08144","-5","1"
+"27511","Cary","NC","35.755651","-78.77508","-5","1"
+"27512","Cary","NC","35.808387","-78.839488","-5","1"
+"27513","Cary","NC","35.797882","-78.79702","-5","1"
+"27514","Chapel Hill","NC","35.915083","-79.02939","-5","1"
+"27515","Chapel Hill","NC","36.05251","-79.107692","-5","1"
+"27516","Chapel Hill","NC","35.912786","-79.10931","-5","1"
+"27517","Chapel Hill","NC","35.892359","-79.020849","-5","1"
+"27518","Cary","NC","35.797692","-78.625265","-5","1"
+"27519","Cary","NC","35.76812","-78.829548","-5","1"
+"27520","Clayton","NC","35.635275","-78.4489","-5","1"
+"27521","Coats","NC","35.408375","-78.66964","-5","1"
+"27522","Creedmoor","NC","36.111937","-78.69122","-5","1"
+"27523","Eagle Rock","NC","35.797692","-78.625265","-5","1"
+"27524","Four Oaks","NC","35.4152","-78.42116","-5","1"
+"27525","Franklinton","NC","36.104866","-78.45893","-5","1"
+"27526","Fuquay Varina","NC","35.575302","-78.80234","-5","1"
+"27529","Garner","NC","35.679194","-78.60246","-5","1"
+"27530","Goldsboro","NC","35.384344","-78.00893","-5","1"
+"27531","Goldsboro","NC","35.463121","-77.995728","-5","1"
+"27532","Goldsboro","NC","35.372045","-78.052422","-5","1"
+"27533","Goldsboro","NC","35.372045","-78.052422","-5","1"
+"27534","Goldsboro","NC","35.377069","-77.92463","-5","1"
+"27536","Henderson","NC","36.340681","-78.39425","-5","1"
+"27537","Henderson","NC","36.33705","-78.387374","-5","1"
+"27539","Apex","NC","35.681429","-78.782556","-5","1"
+"27540","Holly Springs","NC","35.643545","-78.83486","-5","1"
+"27541","Hurdle Mills","NC","36.264894","-79.08338","-5","1"
+"27542","Kenly","NC","35.606392","-78.13755","-5","1"
+"27543","Kipling","NC","35.429849","-78.882395","-5","1"
+"27544","Kittrell","NC","36.215193","-78.43861","-5","1"
+"27545","Knightdale","NC","35.790516","-78.48345","-5","1"
+"27546","Lillington","NC","35.396654","-78.83852","-5","1"
+"27549","Louisburg","NC","36.062239","-78.24953","-5","1"
+"27551","Macon","NC","36.474898","-78.04505","-5","1"
+"27552","Mamers","NC","35.413579","-78.979964","-5","1"
+"27553","Manson","NC","36.484233","-78.30615","-5","1"
+"27555","Micro","NC","35.562142","-78.20349","-5","1"
+"27556","Middleburg","NC","36.413473","-78.327491","-5","1"
+"27557","Middlesex","NC","35.777862","-78.19889","-5","1"
+"27559","Moncure","NC","35.631434","-79.0894","-5","1"
+"27560","Morrisville","NC","35.846363","-78.83866","-5","1"
+"27561","Raleigh","NC","35.898538","-78.738904","-5","1"
+"27562","New Hill","NC","35.633286","-78.97271","-5","1"
+"27563","Norlina","NC","36.450603","-78.21676","-5","1"
+"27564","Creedmoor","NC","36.101529","-78.713346","-5","1"
+"27565","Oxford","NC","36.340501","-78.61595","-5","1"
+"27568","Pine Level","NC","35.511864","-78.24273","-5","1"
+"27569","Princeton","NC","35.458912","-78.1638","-5","1"
+"27570","Ridgeway","NC","36.441215","-78.24044","-5","1"
+"27571","Rolesville","NC","35.921662","-78.45805","-5","1"
+"27572","Rougemont","NC","36.238956","-78.88293","-5","1"
+"27573","Roxboro","NC","36.414739","-78.97375","-5","1"
+"27574","Roxboro","NC","36.416628","-78.970224","-5","1"
+"27576","Selma","NC","35.557966","-78.26479","-5","1"
+"27577","Smithfield","NC","35.506459","-78.34446","-5","1"
+"27581","Stem","NC","36.195036","-78.72657","-5","1"
+"27582","Stovall","NC","36.454831","-78.5702","-5","1"
+"27583","Timberlake","NC","36.291896","-78.93552","-5","1"
+"27584","Townsville","NC","36.528939","-78.44504","-5","1"
+"27586","Vaughan","NC","36.37367","-78.110931","-5","1"
+"27587","Wake Forest","NC","35.97154","-78.52241","-5","1"
+"27588","Wake Forest","NC","35.973108","-78.450754","-5","1"
+"27589","Warrenton","NC","36.378439","-78.13903","-5","1"
+"27591","Wendell","NC","35.781595","-78.37287","-5","1"
+"27592","Willow Spring","NC","35.554891","-78.67038","-5","1"
+"27593","Wilsons Mills","NC","35.590731","-78.360723","-5","1"
+"27594","Wise","NC","36.37367","-78.110931","-5","1"
+"27596","Youngsville","NC","36.000487","-78.44921","-5","1"
+"27597","Zebulon","NC","35.848039","-78.30135","-5","1"
+"27599","Chapel Hill","NC","36.05251","-79.107692","-5","1"
+"27601","Raleigh","NC","35.774451","-78.63274","-5","1"
+"27602","Raleigh","NC","35.758667","-78.671089","-5","1"
+"27603","Raleigh","NC","35.716105","-78.65734","-5","1"
+"27604","Raleigh","NC","35.814572","-78.58348","-5","1"
+"27605","Raleigh","NC","35.788284","-78.65316","-5","1"
+"27606","Raleigh","NC","35.758268","-78.71783","-5","1"
+"27607","Raleigh","NC","35.807458","-78.70086","-5","1"
+"27608","Raleigh","NC","35.808451","-78.64667","-5","1"
+"27609","Raleigh","NC","35.844753","-78.63263","-5","1"
+"27610","Raleigh","NC","35.767829","-78.5861","-5","1"
+"27611","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27612","Raleigh","NC","35.847788","-78.70161","-5","1"
+"27613","Raleigh","NC","35.899208","-78.71161","-5","1"
+"27614","Raleigh","NC","35.939255","-78.60317","-5","1"
+"27615","Raleigh","NC","35.891726","-78.63203","-5","1"
+"27616","Raleigh","NC","35.865441","-78.54929","-5","1"
+"27617","Raleigh","NC","35.906016","-78.743197","-5","1"
+"27619","Raleigh","NC","35.851463","-78.63141","-5","1"
+"27620","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27621","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27622","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27623","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27624","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27625","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27626","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27627","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27628","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27629","Raleigh","NC","35.817497","-78.552388","-5","1"
+"27630","Thomasville","NC","35.875344","-80.081269","-5","1"
+"27634","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27635","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27636","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27640","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27650","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27656","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27658","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27661","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27668","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27675","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27676","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27690","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27695","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27697","Raleigh","NC","35.88224","-78.413371","-5","1"
+"27698","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27699","Raleigh","NC","35.797692","-78.625265","-5","1"
+"27701","Durham","NC","35.997193","-78.89731","-5","1"
+"27702","Durham","NC","36.051155","-78.857651","-5","1"
+"27703","Durham","NC","35.966431","-78.83969","-5","1"
+"27704","Durham","NC","36.034561","-78.86892","-5","1"
+"27705","Durham","NC","36.015992","-78.95911","-5","1"
+"27706","Durham","NC","35.993143","-78.93735","-5","1"
+"27707","Durham","NC","35.963994","-78.93602","-5","1"
+"27708","Durham","NC","36.028685","-78.92398","-5","1"
+"27709","Durham","NC","36.051155","-78.857651","-5","1"
+"27710","Durham","NC","36.051155","-78.857651","-5","1"
+"27711","Durham","NC","36.051155","-78.857651","-5","1"
+"27712","Durham","NC","36.087738","-78.92313","-5","1"
+"27713","Durham","NC","35.905765","-78.92113","-5","1"
+"27715","Durham","NC","36.051155","-78.857651","-5","1"
+"27717","Durham","NC","36.051155","-78.857651","-5","1"
+"27722","Durham","NC","36.051155","-78.857651","-5","1"
+"27801","Rocky Mount","NC","35.935125","-77.77076","-5","1"
+"27802","Rocky Mount","NC","35.935563","-77.78077","-5","1"
+"27803","Rocky Mount","NC","35.924465","-77.83689","-5","1"
+"27804","Rocky Mount","NC","35.973773","-77.82694","-5","1"
+"27805","Aulander","NC","36.223682","-77.10397","-5","1"
+"27806","Aurora","NC","35.308035","-76.79019","-5","1"
+"27807","Bailey","NC","35.797988","-78.10641","-5","1"
+"27808","Bath","NC","35.47031","-76.77855","-5","1"
+"27809","Battleboro","NC","36.032405","-77.78636","-5","1"
+"27810","Belhaven","NC","35.545041","-76.60012","-5","1"
+"27811","Bellarthur","NC","35.584685","-77.513357","-5","1"
+"27812","Bethel","NC","35.799764","-77.37765","-5","1"
+"27813","Black Creek","NC","35.633996","-77.93311","-5","1"
+"27814","Blounts Creek","NC","35.384013","-76.93188","-5","1"
+"27816","Castalia","NC","36.085542","-78.07321","-5","1"
+"27817","Chocowinity","NC","35.487026","-77.07986","-5","1"
+"27818","Como","NC","36.507288","-77.01668","-5","1"
+"27819","Conetoe","NC","35.818414","-77.45335","-5","1"
+"27820","Conway","NC","36.416472","-77.23117","-5","1"
+"27821","Edward","NC","35.321447","-76.87437","-5","1"
+"27822","Elm City","NC","35.809514","-77.8601","-5","1"
+"27823","Enfield","NC","36.190589","-77.71859","-5","1"
+"27824","Engelhard","NC","35.514202","-76.00736","-5","1"
+"27825","Everetts","NC","35.866711","-77.084958","-5","1"
+"27826","Fairfield","NC","35.575982","-76.20409","-5","1"
+"27827","Falkland","NC","35.69872","-77.5108","-5","1"
+"27828","Farmville","NC","35.598204","-77.59066","-5","1"
+"27829","Fountain","NC","35.686549","-77.64461","-5","1"
+"27830","Fremont","NC","35.552162","-77.9727","-5","1"
+"27831","Garysburg","NC","36.458825","-77.57834","-5","1"
+"27832","Gaston","NC","36.502541","-77.68887","-5","1"
+"27833","Greenville","NC","35.580444","-77.392609","-5","1"
+"27834","Greenville","NC","35.626653","-77.37896","-5","1"
+"27835","Greenville","NC","35.588523","-77.353092","-5","1"
+"27836","Greenville","NC","35.580444","-77.392609","-5","1"
+"27837","Grimesland","NC","35.531965","-77.20349","-5","1"
+"27838","Gumberry","NC","36.356129","-77.483072","-5","1"
+"27839","Halifax","NC","36.310967","-77.57821","-5","1"
+"27840","Hamilton","NC","35.948738","-77.2083","-5","1"
+"27841","Hassell","NC","35.908558","-77.27835","-5","1"
+"27842","Henrico","NC","36.531252","-77.86277","-5","1"
+"27843","Hobgood","NC","35.999591","-77.40241","-5","1"
+"27844","Hollister","NC","36.255897","-77.93998","-5","1"
+"27845","Jackson","NC","36.366571","-77.44254","-5","1"
+"27846","Jamesville","NC","35.759335","-76.89865","-5","1"
+"27847","Kelford","NC","36.184037","-77.21536","-5","1"
+"27849","Lewiston Woodville","NC","36.083011","-77.19032","-5","1"
+"27850","Littleton","NC","36.451785","-77.90383","-5","1"
+"27851","Lucama","NC","35.640324","-78.02336","-5","1"
+"27852","Macclesfield","NC","35.746654","-77.64342","-5","1"
+"27853","Margarettsville","NC","36.518839","-77.30888","-5","1"
+"27854","Milwaukee","NC","36.363144","-77.386748","-5","1"
+"27855","Murfreesboro","NC","36.432993","-77.10287","-5","1"
+"27856","Nashville","NC","35.993357","-77.96738","-5","1"
+"27857","Oak City","NC","35.948539","-77.27013","-5","1"
+"27858","Greenville","NC","35.579216","-77.33836","-5","1"
+"27859","Palmyra","NC","36.064879","-77.364499","-5","1"
+"27860","Pantego","NC","35.624117","-76.67274","-5","1"
+"27861","Parmele","NC","35.819037","-77.314288","-5","1"
+"27862","Pendleton","NC","36.490929","-77.1981","-5","1"
+"27863","Pikeville","NC","35.491814","-77.98298","-5","1"
+"27864","Pinetops","NC","35.795738","-77.64106","-5","1"
+"27865","Pinetown","NC","35.588518","-76.83431","-5","1"
+"27866","Pleasant Hill","NC","36.52177","-77.51319","-5","1"
+"27867","Potecasi","NC","36.356129","-77.483072","-5","1"
+"27868","Red Oak","NC","36.054832","-77.911635","-5","1"
+"27869","Rich Square","NC","36.281144","-77.28809","-5","1"
+"27870","Roanoke Rapids","NC","36.448592","-77.67144","-5","1"
+"27871","Robersonville","NC","35.821436","-77.26186","-5","1"
+"27872","Roxobel","NC","36.203511","-77.24791","-5","1"
+"27873","Saratoga","NC","35.65363","-77.77649","-5","1"
+"27874","Scotland Neck","NC","36.128851","-77.41983","-5","1"
+"27875","Scranton","NC","35.481914","-76.44693","-5","1"
+"27876","Seaboard","NC","36.487125","-77.43618","-5","1"
+"27877","Severn","NC","36.515084","-77.18438","-5","1"
+"27878","Sharpsburg","NC","35.867224","-77.83054","-5","1"
+"27879","Simpson","NC","35.567478","-77.280169","-5","1"
+"27880","Sims","NC","35.748755","-78.06759","-5","1"
+"27881","Speed","NC","35.915927","-77.585471","-5","1"
+"27882","Spring Hope","NC","35.94178","-78.11872","-5","1"
+"27883","Stantonsburg","NC","35.598504","-77.81173","-5","1"
+"27884","Stokes","NC","35.700448","-77.27014","-5","1"
+"27885","Swanquarter","NC","35.452071","-76.27892","-5","1"
+"27886","Tarboro","NC","35.905299","-77.54056","-5","1"
+"27887","Tillery","NC","36.235198","-77.502602","-5","1"
+"27888","Walstonburg","NC","35.593689","-77.70192","-5","1"
+"27889","Washington","NC","35.560439","-77.03459","-5","1"
+"27890","Weldon","NC","36.421387","-77.60825","-5","1"
+"27891","Whitakers","NC","36.10607","-77.73","-5","1"
+"27892","Williamston","NC","35.824061","-77.08093","-5","1"
+"27893","Wilson","NC","35.715315","-77.91989","-5","1"
+"27894","Wilson","NC","35.715778","-77.904283","-5","1"
+"27895","Wilson","NC","35.719923","-77.926691","-5","1"
+"27896","Wilson","NC","35.768693","-77.95167","-5","1"
+"27897","Woodland","NC","36.332552","-77.20441","-5","1"
+"27906","Elizabeth City","NC","36.285388","-76.213284","-5","1"
+"27907","Elizabeth City","NC","36.285026","-76.255312","-5","1"
+"27909","Elizabeth City","NC","36.293192","-76.23692","-5","1"
+"27910","Ahoskie","NC","36.293352","-76.98612","-5","1"
+"27915","Avon","NC","35.354252","-75.50417","-5","1"
+"27916","Aydlett","NC","36.314447","-75.89888","-5","1"
+"27917","Barco","NC","36.388493","-75.98097","-5","1"
+"27919","Belvidere","NC","36.319777","-76.49654","-5","1"
+"27920","Buxton","NC","35.263128","-75.55787","-5","1"
+"27921","Camden","NC","36.344333","-76.16595","-5","1"
+"27922","Cofield","NC","36.339548","-76.88086","-5","1"
+"27923","Coinjock","NC","36.381161","-75.94115","-5","1"
+"27924","Colerain","NC","36.192231","-76.83458","-5","1"
+"27925","Columbia","NC","35.883885","-76.22037","-5","1"
+"27926","Corapeake","NC","36.519826","-76.61637","-5","1"
+"27927","Corolla","NC","36.435092","-75.84497","-5","1"
+"27928","Creswell","NC","35.849234","-76.4067","-5","1"
+"27929","Currituck","NC","36.433902","-75.97921","-5","1"
+"27930","Durants Neck","NC","36.198539","-76.373908","-5","1"
+"27932","Edenton","NC","36.093252","-76.62077","-5","1"
+"27935","Eure","NC","36.440867","-76.86007","-5","1"
+"27936","Frisco","NC","35.24554","-75.618","-5","1"
+"27937","Gates","NC","36.501152","-76.78039","-5","1"
+"27938","Gatesville","NC","36.410008","-76.75097","-5","1"
+"27939","Grandy","NC","36.239666","-75.87361","-5","1"
+"27941","Harbinger","NC","36.099065","-75.81974","-5","1"
+"27942","Harrellsville","NC","36.289302","-76.76737","-5","1"
+"27943","Hatteras","NC","35.218342","-75.68792","-5","1"
+"27944","Hertford","NC","36.157292","-76.4275","-5","1"
+"27946","Hobbsville","NC","36.362745","-76.60188","-5","1"
+"27947","Jarvisburg","NC","36.189366","-75.86047","-5","1"
+"27948","Kill Devil Hills","NC","36.022242","-75.67686","-5","1"
+"27949","Kitty Hawk","NC","36.115899","-75.72772","-5","1"
+"27950","Knotts Island","NC","36.513626","-75.9518","-5","1"
+"27953","Manns Harbor","NC","35.795867","-75.85014","-5","1"
+"27954","Manteo","NC","35.913938","-75.67961","-5","1"
+"27956","Maple","NC","36.419422","-76.03362","-5","1"
+"27957","Merry Hill","NC","36.067244","-76.76046","-5","1"
+"27958","Moyock","NC","36.497406","-76.13715","-5","1"
+"27959","Nags Head","NC","35.923805","-75.61144","-5","1"
+"27960","Ocracoke","NC","35.113265","-75.97255","-5","1"
+"27962","Plymouth","NC","35.842107","-76.73206","-5","1"
+"27964","Point Harbor","NC","36.093211","-75.80319","-5","1"
+"27965","Poplar Branch","NC","36.273428","-75.87867","-5","1"
+"27966","Powells Point","NC","36.13655","-75.82653","-5","1"
+"27967","Powellsville","NC","36.234231","-76.94686","-5","1"
+"27968","Rodanthe","NC","35.661979","-75.47741","-5","1"
+"27969","Roduco","NC","36.424152","-76.702125","-5","1"
+"27970","Roper","NC","35.892486","-76.57584","-5","1"
+"27972","Salvo","NC","35.538351","-75.47473","-5","1"
+"27973","Shawboro","NC","36.384779","-76.08293","-5","1"
+"27974","Shiloh","NC","36.233836","-76.03822","-5","1"
+"27976","South Mills","NC","36.466396","-76.29809","-5","1"
+"27978","Stumpy Point","NC","35.698493","-75.772775","-5","1"
+"27979","Sunbury","NC","36.440509","-76.60411","-5","1"
+"27980","Tyner","NC","36.256548","-76.62627","-5","1"
+"27981","Wanchese","NC","35.845046","-75.63954","-5","1"
+"27982","Waves","NC","35.56179","-75.47152","-5","1"
+"27983","Windsor","NC","36.015391","-76.9349","-5","1"
+"27985","Winfall","NC","36.217959","-76.46994","-5","1"
+"27986","Winton","NC","36.386605","-76.92641","-5","1"
+"28001","Albemarle","NC","35.351477","-80.19879","-5","1"
+"28002","Albemarle","NC","35.264179","-80.108188","-5","1"
+"28003","Marshville","NC","34.995653","-80.355204","-5","1"
+"28006","Alexis","NC","35.403268","-81.09974","-5","1"
+"28007","Ansonville","NC","35.104652","-80.10965","-5","1"
+"28009","Badin","NC","35.40846","-80.11171","-5","1"
+"28010","Barium Springs","NC","35.719228","-80.89909","-5","1"
+"28012","Belmont","NC","35.2406","-81.04028","-5","1"
+"28016","Bessemer City","NC","35.292581","-81.28723","-5","1"
+"28017","Boiling Springs","NC","35.254223","-81.65456","-5","1"
+"28018","Bostic","NC","35.441168","-81.7995","-5","1"
+"28019","Caroleen","NC","35.279371","-81.79475","-5","1"
+"28020","Casar","NC","35.518637","-81.62728","-5","1"
+"28021","Cherryville","NC","35.383935","-81.39368","-5","1"
+"28023","China Grove","NC","35.567189","-80.59116","-5","1"
+"28024","Cliffside","NC","35.241615","-81.775456","-5","1"
+"28025","Concord","NC","35.400407","-80.56574","-5","1"
+"28026","Concord","NC","35.346285","-80.541088","-5","1"
+"28027","Concord","NC","35.405636","-80.63823","-5","1"
+"28031","Cornelius","NC","35.477583","-80.8924","-5","1"
+"28032","Cramerton","NC","35.239702","-81.07753","-5","1"
+"28033","Crouse","NC","35.416189","-81.31911","-5","1"
+"28034","Dallas","NC","35.333668","-81.18303","-5","1"
+"28036","Davidson","NC","35.490772","-80.82576","-5","1"
+"28037","Denver","NC","35.501448","-81.00412","-5","1"
+"28038","Earl","NC","35.198687","-81.54162","-5","1"
+"28039","East Spencer","NC","35.677889","-80.44593","-5","1"
+"28040","Ellenboro","NC","35.346886","-81.75621","-5","1"
+"28041","Faith","NC","35.58167","-80.45806","-5","1"
+"28042","Fallston","NC","35.373884","-81.543706","-5","1"
+"28043","Forest City","NC","35.317602","-81.86722","-5","1"
+"28051","Gastonia","NC","35.284018","-81.189693","-5","1"
+"28052","Gastonia","NC","35.248787","-81.2142","-5","1"
+"28053","Gastonia","NC","35.275073","-81.213369","-5","1"
+"28054","Gastonia","NC","35.263287","-81.15312","-5","1"
+"28055","Gastonia","NC","35.284018","-81.189693","-5","1"
+"28056","Gastonia","NC","35.229565","-81.12847","-5","1"
+"28070","Huntersville","NC","35.462187","-80.898668","-5","1"
+"28071","Gold Hill","NC","35.513974","-80.32779","-5","1"
+"28072","Granite Quarry","NC","35.614966","-80.44198","-5","1"
+"28073","Grover","NC","35.189591","-81.47928","-5","1"
+"28074","Harris","NC","35.224743","-81.885081","-5","1"
+"28075","Harrisburg","NC","35.335294","-80.6633","-5","1"
+"28076","Henrietta","NC","35.256252","-81.77804","-5","1"
+"28077","High Shoals","NC","35.404772","-81.20268","-5","1"
+"28078","Huntersville","NC","35.409544","-80.86362","-5","1"
+"28079","Indian Trail","NC","35.105208","-80.62098","-5","1"
+"28080","Iron Station","NC","35.454565","-81.12368","-5","1"
+"28081","Kannapolis","NC","35.499521","-80.64447","-5","1"
+"28082","Kannapolis","NC","35.346285","-80.541088","-5","1"
+"28083","Kannapolis","NC","35.492989","-80.60293","-5","1"
+"28086","Kings Mountain","NC","35.241188","-81.3614","-5","1"
+"28088","Landis","NC","35.543639","-80.61167","-5","1"
+"28089","Lattimore","NC","35.318573","-81.66601","-5","1"
+"28090","Lawndale","NC","35.450548","-81.56223","-5","1"
+"28091","Lilesville","NC","34.970129","-79.93705","-5","1"
+"28092","Lincolnton","NC","35.473447","-81.24094","-5","1"
+"28093","Lincolnton","NC","35.484822","-81.239543","-5","1"
+"28097","Locust","NC","35.267185","-80.4268","-5","1"
+"28098","Lowell","NC","35.267234","-81.09942","-5","1"
+"28101","McAdenville","NC","35.256379","-81.07978","-5","1"
+"28102","McFarlan","NC","34.819916","-79.97188","-5","1"
+"28103","Marshville","NC","34.99545","-80.35635","-5","1"
+"28104","Matthews","NC","35.067285","-80.68424","-5","1"
+"28105","Matthews","NC","35.116851","-80.7164","-5","1"
+"28106","Matthews","NC","35.26002","-80.804151","-5","1"
+"28107","Midland","NC","35.247181","-80.52363","-5","1"
+"28108","Mineral Springs","NC","34.916253","-80.640383","-5","1"
+"28109","Misenheimer","NC","35.485703","-80.28811","-5","1"
+"28110","Monroe","NC","35.031947","-80.56002","-5","1"
+"28111","Monroe","NC","35.011204","-80.558743","-5","1"
+"28112","Monroe","NC","34.936388","-80.5382","-5","1"
+"28114","Mooresboro","NC","35.243585","-81.75656","-5","1"
+"28115","Mooresville","NC","35.584157","-80.80258","-5","1"
+"28117","Mooresville","NC","35.571827","-80.89228","-5","1"
+"28119","Morven","NC","34.858713","-80.02232","-5","1"
+"28120","Mount Holly","NC","35.311862","-81.02441","-5","1"
+"28123","Mount Mourne","NC","35.529792","-80.947028","-5","1"
+"28124","Mount Pleasant","NC","35.407499","-80.41228","-5","1"
+"28125","Mount Ulla","NC","35.664696","-80.71056","-5","1"
+"28126","Newell","NC","35.276794","-80.716495","-5","1"
+"28127","New London","NC","35.463024","-80.1649","-5","1"
+"28128","Norwood","NC","35.228831","-80.15214","-5","1"
+"28129","Oakboro","NC","35.232542","-80.33123","-5","1"
+"28130","Paw Creek","NC","35.26002","-80.804151","-5","1"
+"28133","Peachland","NC","34.969886","-80.27001","-5","1"
+"28134","Pineville","NC","35.086017","-80.89034","-5","1"
+"28135","Polkton","NC","35.043566","-80.21272","-5","1"
+"28136","Polkville","NC","35.396126","-81.630272","-5","1"
+"28137","Richfield","NC","35.49326","-80.25524","-5","1"
+"28138","Rockwell","NC","35.536561","-80.42959","-5","1"
+"28139","Rutherfordton","NC","35.361333","-81.98377","-5","1"
+"28144","Salisbury","NC","35.679639","-80.46645","-5","1"
+"28145","Salisbury","NC","35.682683","-80.477116","-5","1"
+"28146","Salisbury","NC","35.614422","-80.43115","-5","1"
+"28147","Salisbury","NC","35.665362","-80.54673","-5","1"
+"28150","Shelby","NC","35.315118","-81.55584","-5","1"
+"28151","Shelby","NC","35.233125","-81.574711","-5","1"
+"28152","Shelby","NC","35.258879","-81.57867","-5","1"
+"28159","Spencer","NC","35.693339","-80.4342","-5","1"
+"28160","Spindale","NC","35.360536","-81.92506","-5","1"
+"28163","Stanfield","NC","35.245048","-80.4163","-5","1"
+"28164","Stanley","NC","35.377576","-81.07238","-5","1"
+"28166","Troutman","NC","35.687365","-80.88715","-5","1"
+"28167","Union Mills","NC","35.48902","-81.95039","-5","1"
+"28168","Vale","NC","35.545918","-81.42942","-5","1"
+"28169","Waco","NC","35.362026","-81.42911","-5","1"
+"28170","Wadesboro","NC","34.985423","-80.08543","-5","1"
+"28173","Waxhaw","NC","34.929433","-80.73061","-5","1"
+"28174","Wingate","NC","34.981605","-80.44305","-5","1"
+"28201","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28202","Charlotte","NC","35.227192","-80.84419","-5","1"
+"28203","Charlotte","NC","35.208992","-80.85539","-5","1"
+"28204","Charlotte","NC","35.214693","-80.82665","-5","1"
+"28205","Charlotte","NC","35.222406","-80.79221","-5","1"
+"28206","Charlotte","NC","35.248292","-80.82748","-5","1"
+"28207","Charlotte","NC","35.197643","-80.82752","-5","1"
+"28208","Charlotte","NC","35.235791","-80.89295","-5","1"
+"28209","Charlotte","NC","35.178543","-80.85375","-5","1"
+"28210","Charlotte","NC","35.13451","-80.85632","-5","1"
+"28211","Charlotte","NC","35.170094","-80.79857","-5","1"
+"28212","Charlotte","NC","35.189544","-80.74742","-5","1"
+"28213","Charlotte","NC","35.280464","-80.75678","-5","1"
+"28214","Charlotte","NC","35.276639","-80.96111","-5","1"
+"28215","Charlotte","NC","35.244468","-80.72164","-5","1"
+"28216","Charlotte","NC","35.286967","-80.87903","-5","1"
+"28217","Charlotte","NC","35.172319","-80.89731","-5","1"
+"28218","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28219","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28220","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28221","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28222","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28223","Charlotte","NC","35.305552","-80.73303","-5","1"
+"28224","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28225","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28226","Charlotte","NC","35.107804","-80.82139","-5","1"
+"28227","Charlotte","NC","35.192919","-80.66822","-5","1"
+"28228","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28229","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28230","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28231","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28232","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28233","Charlotte","NC","35.489411","-80.825368","-5","1"
+"28234","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28235","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28236","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28237","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28240","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28241","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28242","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28243","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28244","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28246","Charlotte","NC","35.227542","-80.842543","-5","1"
+"28247","Charlotte","NC","35.065595","-80.851149","-5","1"
+"28250","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28253","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28254","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28255","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28256","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28258","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28260","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28261","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28262","Charlotte","NC","35.321279","-80.7405","-5","1"
+"28265","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28266","Charlotte","NC","35.284459","-80.858155","-5","1"
+"28269","Charlotte","NC","35.329235","-80.80486","-5","1"
+"28270","Charlotte","NC","35.113906","-80.7613","-5","1"
+"28272","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28273","Charlotte","NC","35.124032","-80.93954","-5","1"
+"28274","Charlotte","NC","35.187943","-80.831693","-5","1"
+"28275","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28277","Charlotte","NC","35.054546","-80.81792","-5","1"
+"28278","Charlotte","NC","35.119012","-81.02213","-5","1"
+"28280","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28281","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28282","Charlotte","NC","35.224242","-80.844743","-5","1"
+"28283","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28284","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28285","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28286","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28287","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28288","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28289","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28290","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28296","Charlotte","NC","35.225242","-80.845843","-5","1"
+"28297","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28299","Charlotte","NC","35.26002","-80.804151","-5","1"
+"28301","Fayetteville","NC","35.042389","-78.84124","-5","1"
+"28302","Fayetteville","NC","35.034307","-78.908828","-5","1"
+"28303","Fayetteville","NC","35.084163","-78.953","-5","1"
+"28304","Fayetteville","NC","35.02844","-78.97037","-5","1"
+"28305","Fayetteville","NC","35.056963","-78.90369","-5","1"
+"28306","Fayetteville","NC","35.003712","-78.92179","-5","1"
+"28307","Fort Bragg","NC","35.142321","-79.01225","-5","1"
+"28308","Pope A F B","NC","35.173377","-79.013799","-5","1"
+"28309","Fayetteville","NC","35.039726","-78.842868","-5","1"
+"28310","Fort Bragg","NC","35.050612","-78.80384","-5","1"
+"28311","Fayetteville","NC","35.134301","-78.89411","-5","1"
+"28314","Fayetteville","NC","35.060087","-79.00848","-5","1"
+"28315","Aberdeen","NC","35.12416","-79.4415","-5","1"
+"28318","Autryville","NC","35.020272","-78.614","-5","1"
+"28319","Barnesville","NC","34.595364","-79.197058","-5","1"
+"28320","Bladenboro","NC","34.552642","-78.78102","-5","1"
+"28323","Bunnlevel","NC","35.316332","-78.82527","-5","1"
+"28325","Calypso","NC","35.152512","-78.10474","-5","1"
+"28326","Cameron","NC","35.278125","-79.15153","-5","1"
+"28327","Carthage","NC","35.319639","-79.40248","-5","1"
+"28328","Clinton","NC","35.000056","-78.33424","-5","1"
+"28329","Clinton","NC","34.994005","-78.277669","-5","1"
+"28330","Cordova","NC","34.913233","-79.82302","-5","1"
+"28331","Cumberland","NC","35.150896","-78.915788","-5","1"
+"28332","Dublin","NC","34.655921","-78.72076","-5","1"
+"28333","Dudley","NC","35.293245","-78.01897","-5","1"
+"28334","Dunn","NC","35.302419","-78.6012","-5","1"
+"28335","Dunn","NC","35.350774","-78.625362","-5","1"
+"28337","Elizabethtown","NC","34.647611","-78.58643","-5","1"
+"28338","Ellerbe","NC","35.089476","-79.72904","-5","1"
+"28339","Erwin","NC","35.322849","-78.68964","-5","1"
+"28340","Fairmont","NC","34.476857","-79.13005","-5","1"
+"28341","Faison","NC","35.119076","-78.16439","-5","1"
+"28342","Falcon","NC","35.191142","-78.6514","-5","1"
+"28343","Gibson","NC","34.767875","-79.59239","-5","1"
+"28344","Godwin","NC","35.171062","-78.63648","-5","1"
+"28345","Hamlet","NC","34.879186","-79.69001","-5","1"
+"28347","Hoffman","NC","35.042172","-79.53503","-5","1"
+"28348","Hope Mills","NC","34.954709","-78.93744","-5","1"
+"28349","Kenansville","NC","34.977225","-77.94761","-5","1"
+"28350","Lakeview","NC","35.24356","-79.31355","-5","1"
+"28351","Laurel Hill","NC","34.827291","-79.56026","-5","1"
+"28352","Laurinburg","NC","34.779227","-79.45745","-5","1"
+"28353","Laurinburg","NC","34.781768","-79.482423","-5","1"
+"28355","Lemon Springs","NC","35.467567","-79.165314","-5","1"
+"28356","Linden","NC","35.237338","-78.79613","-5","1"
+"28357","Lumber Bridge","NC","34.902698","-79.08288","-5","1"
+"28358","Lumberton","NC","34.620874","-78.98986","-5","1"
+"28359","Lumberton","NC","34.607669","-79.014425","-5","1"
+"28360","Lumberton","NC","34.659575","-79.06282","-5","1"
+"28361","Mccain","NC","35.02363","-79.246841","-5","1"
+"28362","Marietta","NC","34.368246","-79.12124","-5","1"
+"28363","Marston","NC","34.938451","-79.54609","-5","1"
+"28364","Maxton","NC","34.735024","-79.32836","-5","1"
+"28365","Mount Olive","NC","35.184516","-78.06056","-5","1"
+"28366","Newton Grove","NC","35.237142","-78.36593","-5","1"
+"28367","Norman","NC","35.173481","-79.72363","-5","1"
+"28368","Olivia","NC","35.35149","-79.10586","-5","1"
+"28369","Orrum","NC","34.434292","-79.03714","-5","1"
+"28370","Pinehurst","NC","35.216222","-79.452352","-5","1"
+"28371","Parkton","NC","34.912113","-78.9999","-5","1"
+"28372","Pembroke","NC","34.69004","-79.18802","-5","1"
+"28373","Pinebluff","NC","35.100144","-79.47979","-5","1"
+"28374","Pinehurst","NC","35.195417","-79.46496","-5","1"
+"28375","Proctorville","NC","34.471259","-79.041388","-5","1"
+"28376","Raeford","NC","34.992085","-79.23013","-5","1"
+"28377","Red Springs","NC","34.828798","-79.21215","-5","1"
+"28378","Rex","NC","34.858715","-79.04705","-5","1"
+"28379","Rockingham","NC","34.937078","-79.7605","-5","1"
+"28380","Rockingham","NC","34.994152","-79.767341","-5","1"
+"28382","Roseboro","NC","34.945305","-78.51432","-5","1"
+"28383","Rowland","NC","34.571076","-79.27404","-5","1"
+"28384","Saint Pauls","NC","34.804654","-78.9594","-5","1"
+"28385","Salemburg","NC","35.053627","-78.50025","-5","1"
+"28386","Shannon","NC","34.851865","-79.12266","-5","1"
+"28387","Southern Pines","NC","35.180394","-79.39084","-5","1"
+"28388","Southern Pines","NC","35.280335","-79.432734","-5","1"
+"28390","Spring Lake","NC","35.211913","-78.97499","-5","1"
+"28391","Stedman","NC","35.016373","-78.6941","-5","1"
+"28392","Tar Heel","NC","34.742752","-78.80645","-5","1"
+"28393","Turkey","NC","34.989801","-78.18555","-5","1"
+"28394","Vass","NC","35.218131","-79.24449","-5","1"
+"28395","Wade","NC","35.145952","-78.74102","-5","1"
+"28396","Wagram","NC","34.927483","-79.40099","-5","1"
+"28397","Stedman","NC","35.015586","-78.690428","-5","1"
+"28398","Warsaw","NC","34.993016","-78.08407","-5","1"
+"28399","White Oak","NC","34.786138","-78.70765","-5","1"
+"28401","Wilmington","NC","34.235219","-77.94134","-5","1"
+"28402","Wilmington","NC","34.340518","-77.901408","-5","1"
+"28403","Wilmington","NC","34.221512","-77.88452","-5","1"
+"28404","Wilmington","NC","33.926255","-78.07127","-5","1"
+"28405","Wilmington","NC","34.254235","-77.87251","-5","1"
+"28406","Wilmington","NC","34.088079","-77.852599","-5","1"
+"28407","Wilmington","NC","34.088079","-77.852599","-5","1"
+"28408","Wilmington","NC","34.212707","-77.792177","-5","1"
+"28409","Wilmington","NC","34.169953","-77.87113","-5","1"
+"28410","Wilmington","NC","34.088079","-77.852599","-5","1"
+"28411","Wilmington","NC","34.285519","-77.80572","-5","1"
+"28412","Wilmington","NC","34.152021","-77.91346","-5","1"
+"28420","Ash","NC","34.07367","-78.48214","-5","1"
+"28421","Atkinson","NC","34.524003","-78.18584","-5","1"
+"28422","Bolivia","NC","34.006479","-78.19035","-5","1"
+"28423","Bolton","NC","34.319905","-78.37743","-5","1"
+"28424","Brunswick","NC","34.290716","-78.699417","-5","1"
+"28425","Burgaw","NC","34.554821","-77.92764","-5","1"
+"28428","Carolina Beach","NC","34.034336","-77.89903","-5","1"
+"28429","Castle Hayne","NC","34.332126","-77.90554","-5","1"
+"28430","Cerro Gordo","NC","34.285951","-78.93039","-5","1"
+"28431","Chadbourn","NC","34.312363","-78.83023","-5","1"
+"28432","Clarendon","NC","34.17074","-78.75997","-5","1"
+"28433","Clarkton","NC","34.491177","-78.64362","-5","1"
+"28434","Council","NC","34.461167","-78.46244","-5","1"
+"28435","Currie","NC","34.430433","-78.10539","-5","1"
+"28436","Delco","NC","34.275453","-78.26673","-5","1"
+"28438","Evergreen","NC","34.430348","-78.91932","-5","1"
+"28439","Fair Bluff","NC","34.309767","-79.02516","-5","1"
+"28441","Garland","NC","34.788387","-78.40574","-5","1"
+"28442","Hallsboro","NC","34.323483","-78.59534","-5","1"
+"28443","Hampstead","NC","34.407677","-77.65238","-5","1"
+"28444","Harrells","NC","34.686496","-78.32406","-5","1"
+"28445","Holly Ridge","NC","34.47722","-77.55978","-5","1"
+"28446","Ingold","NC","34.83661","-78.348111","-5","1"
+"28447","Ivanhoe","NC","34.595158","-78.23438","-5","1"
+"28448","Kelly","NC","34.464635","-78.29701","-5","1"
+"28449","Kure Beach","NC","33.99207","-77.91092","-5","1"
+"28450","Lake Waccamaw","NC","34.319538","-78.51678","-5","1"
+"28451","Leland","NC","34.25124","-78.06492","-5","1"
+"28452","Longwood","NC","33.997345","-78.5565","-5","1"
+"28453","Magnolia","NC","34.888483","-78.05955","-5","1"
+"28454","Maple Hill","NC","34.676719","-77.65343","-5","1"
+"28455","Nakina","NC","34.11045","-78.6608","-5","1"
+"28456","Riegelwood","NC","34.36338","-78.28251","-5","1"
+"28457","Rocky Point","NC","34.449782","-77.88697","-5","1"
+"28458","Rose Hill","NC","34.822407","-78.04176","-5","1"
+"28459","Shallotte","NC","33.933388","-78.412864","-5","1"
+"28460","Sneads Ferry","NC","34.52072","-77.42096","-5","1"
+"28461","Southport","NC","33.963111","-78.05743","-5","1"
+"28462","Supply","NC","33.974251","-78.30961","-5","1"
+"28463","Tabor City","NC","34.12483","-78.82187","-5","1"
+"28464","Teachey","NC","34.772249","-78.01392","-5","1"
+"28465","Oak Island","NC","33.915522","-78.12862","-5","1"
+"28466","Wallace","NC","34.738793","-77.97788","-5","1"
+"28467","Calabash","NC","33.905566","-78.5759","-5","1"
+"28468","Sunset Beach","NC","33.885203","-78.51224","-5","1"
+"28469","Ocean Isle Beach","NC","33.913508","-78.44868","-5","1"
+"28470","South Brunswick","NC","33.9666","-78.3878","-5","1"
+"28471","Watha","NC","34.605639","-77.99977","-5","1"
+"28472","Whiteville","NC","34.312063","-78.70773","-5","1"
+"28478","Willard","NC","34.671237","-78.06544","-5","1"
+"28479","Winnabow","NC","34.107077","-78.04965","-5","1"
+"28480","Wrightsville Beach","NC","34.21222","-77.7981","-5","1"
+"28501","Kinston","NC","35.260895","-77.56469","-5","1"
+"28502","Kinston","NC","35.288558","-77.662614","-5","1"
+"28503","Kinston","NC","35.319066","-77.595034","-5","1"
+"28504","Kinston","NC","35.264739","-77.62481","-5","1"
+"28508","Albertson","NC","35.11493","-77.82238","-5","1"
+"28509","Alliance","NC","35.156145","-76.632264","-5","1"
+"28510","Arapahoe","NC","35.000658","-76.81297","-5","1"
+"28511","Atlantic","NC","34.887266","-76.33033","-5","1"
+"28512","Atlantic Beach","NC","34.698274","-76.78706","-5","1"
+"28513","Ayden","NC","35.463012","-77.4161","-5","1"
+"28515","Bayboro","NC","35.176466","-76.71853","-5","1"
+"28516","Beaufort","NC","34.769532","-76.64783","-5","1"
+"28518","Beulaville","NC","34.911417","-77.77153","-5","1"
+"28519","Bridgeton","NC","35.120742","-77.01969","-5","1"
+"28520","Cedar Island","NC","34.984608","-76.1988","-5","1"
+"28521","Chinquapin","NC","34.826715","-77.75929","-5","1"
+"28522","Comfort","NC","35.005079","-77.523102","-5","1"
+"28523","Cove City","NC","35.193213","-77.32292","-5","1"
+"28524","Davis","NC","34.794527","-76.46317","-5","1"
+"28525","Deep Run","NC","35.119845","-77.69208","-5","1"
+"28526","Dover","NC","35.238886","-77.41061","-5","1"
+"28527","Ernul","NC","35.244257","-77.01504","-5","1"
+"28528","Gloucester","NC","34.732744","-76.53869","-5","1"
+"28529","Grantsboro","NC","35.085784","-76.86135","-5","1"
+"28530","Grifton","NC","35.370945","-77.42548","-5","1"
+"28531","Harkers Island","NC","34.712315","-76.52748","-5","1"
+"28532","Havelock","NC","34.884421","-76.88972","-5","1"
+"28533","Cherry Point","NC","34.903793","-76.899976","-5","1"
+"28537","Hobucken","NC","35.259895","-76.55591","-5","1"
+"28538","Hookerton","NC","35.424381","-77.58452","-5","1"
+"28539","Hubert","NC","34.694262","-77.20701","-5","1"
+"28540","Jacksonville","NC","34.755669","-77.4559","-5","1"
+"28541","Jacksonville","NC","34.692056","-77.391199","-5","1"
+"28542","Camp Lejeune","NC","34.664035","-77.463687","-5","1"
+"28543","Tarawa Terrace","NC","34.74167","-77.37117","-5","1"
+"28544","Midway Park","NC","34.724322","-77.31866","-5","1"
+"28545","Mccutcheon Field","NC","34.692056","-77.391199","-5","1"
+"28546","Jacksonville","NC","34.781212","-77.3756","-5","1"
+"28547","Camp Lejeune","NC","34.637348","-77.3127","-5","1"
+"28551","La Grange","NC","35.320045","-77.78042","-5","1"
+"28552","Lowland","NC","35.304817","-76.57115","-5","1"
+"28553","Marshallberg","NC","34.725663","-76.51632","-5","1"
+"28554","Maury","NC","35.481503","-77.58718","-5","1"
+"28555","Maysville","NC","34.879658","-77.22214","-5","1"
+"28556","Merritt","NC","35.124491","-76.66595","-5","1"
+"28557","Morehead City","NC","34.729839","-76.75219","-5","1"
+"28559","Fairplains","NC","36.214395","-81.165972","-5","1"
+"28560","New Bern","NC","35.119674","-77.01509","-5","1"
+"28561","New Bern","NC","35.103736","-77.07585","-5","1"
+"28562","New Bern","NC","35.091472","-77.09936","-5","1"
+"28563","New Bern","NC","35.110855","-77.06336","-5","1"
+"28564","New Bern","NC","35.110855","-77.06336","-5","1"
+"28570","Newport","NC","34.770681","-76.87786","-5","1"
+"28571","Oriental","NC","35.040757","-76.69263","-5","1"
+"28572","Pink Hill","NC","35.030154","-77.7221","-5","1"
+"28573","Pollocksville","NC","35.000858","-77.21501","-5","1"
+"28574","Richlands","NC","34.888736","-77.57157","-5","1"
+"28575","Salter Path","NC","34.689821","-76.89242","-5","1"
+"28577","Sealevel","NC","34.868975","-76.38149","-5","1"
+"28578","Seven Springs","NC","35.206329","-77.87444","-5","1"
+"28579","Smyrna","NC","34.753595","-76.5184","-5","1"
+"28580","Snow Hill","NC","35.44451","-77.69186","-5","1"
+"28581","Stacy","NC","34.842394","-76.44111","-5","1"
+"28582","Stella","NC","34.756033","-77.15405","-5","1"
+"28583","Stonewall","NC","35.156145","-76.632264","-5","1"
+"28584","Swansboro","NC","34.69771","-77.10614","-5","1"
+"28585","Trenton","NC","35.056317","-77.43518","-5","1"
+"28586","Vanceboro","NC","35.302937","-77.15546","-5","1"
+"28587","Vandemere","NC","35.191279","-76.660435","-5","1"
+"28589","Williston","NC","34.7994","-76.49457","-5","1"
+"28590","Winterville","NC","35.53445","-77.39714","-5","1"
+"28594","Emerald Isle","NC","34.667473","-77.01025","-5","1"
+"28599","Emerald Isle","NC","34.662495","-77.030502","-5","1"
+"28601","Hickory","NC","35.759932","-81.33012","-5","1"
+"28602","Hickory","NC","35.70701","-81.3534","-5","1"
+"28603","Hickory","NC","35.679876","-81.287181","-5","1"
+"28604","Banner Elk","NC","36.166515","-81.84672","-5","1"
+"28605","Blowing Rock","NC","36.133083","-81.68783","-5","1"
+"28606","Boomer","NC","36.058853","-81.30497","-5","1"
+"28607","Boone","NC","36.21277","-81.66255","-5","1"
+"28608","Boone","NC","36.221334","-81.713416","-5","1"
+"28609","Catawba","NC","35.689806","-81.06694","-5","1"
+"28610","Claremont","NC","35.725163","-81.14279","-5","1"
+"28611","Collettsville","NC","36.009373","-81.73139","-5","1"
+"28612","Connellys Springs","NC","35.693787","-81.51726","-5","1"
+"28613","Conover","NC","35.720227","-81.21466","-5","1"
+"28615","Creston","NC","36.455882","-81.65141","-5","1"
+"28616","Crossnore","NC","36.024252","-81.92693","-5","1"
+"28617","Crumpler","NC","36.488377","-81.39224","-5","1"
+"28618","Deep Gap","NC","36.197882","-81.52276","-5","1"
+"28619","Drexel","NC","35.75779","-81.60359","-5","1"
+"28620","Pleasant Hill","NC","35.891211","-81.102329","-5","1"
+"28621","Elkin","NC","36.283497","-80.84586","-5","1"
+"28622","Elk Park","NC","36.17893","-81.95958","-5","1"
+"28623","Ennice","NC","36.523031","-80.97109","-5","1"
+"28624","Ferguson","NC","36.110425","-81.42262","-5","1"
+"28625","Statesville","NC","35.840579","-80.87988","-5","1"
+"28626","Fleetwood","NC","36.290889","-81.51951","-5","1"
+"28627","Glade Valley","NC","36.445484","-81.0081","-5","1"
+"28628","Glen Alpine","NC","35.721174","-81.817998","-5","1"
+"28629","Glendale Springs","NC","36.343002","-81.37502","-5","1"
+"28630","Granite Falls","NC","35.811919","-81.43478","-5","1"
+"28631","Grassy Creek","NC","36.557892","-81.42635","-5","1"
+"28633","Lenoir","NC","35.937564","-81.539847","-5","1"
+"28634","Harmony","NC","35.97991","-80.77085","-5","1"
+"28635","Hays","NC","36.315077","-81.13146","-5","1"
+"28636","Hiddenite","NC","35.928486","-81.07441","-5","1"
+"28637","Hildebran","NC","35.718432","-81.41878","-5","1"
+"28638","Hudson","NC","35.840553","-81.48192","-5","1"
+"28640","Jefferson","NC","36.410186","-81.42409","-5","1"
+"28641","Jonas Ridge","NC","35.938422","-81.884521","-5","1"
+"28642","Jonesville","NC","36.227576","-80.82988","-5","1"
+"28643","Lansing","NC","36.532301","-81.53117","-5","1"
+"28644","Laurel Springs","NC","36.43591","-81.27736","-5","1"
+"28645","Lenoir","NC","35.934783","-81.54476","-5","1"
+"28646","Linville","NC","36.073202","-81.87177","-5","1"
+"28647","Linville Falls","NC","35.779182","-81.675545","-5","1"
+"28649","McGrady","NC","36.329636","-81.2111","-5","1"
+"28650","Maiden","NC","35.575785","-81.18843","-5","1"
+"28651","Millers Creek","NC","36.241685","-81.27076","-5","1"
+"28652","Minneapolis","NC","36.086466","-81.934265","-5","1"
+"28653","Montezuma","NC","36.065053","-81.901715","-5","1"
+"28654","Moravian Falls","NC","36.073489","-81.16056","-5","1"
+"28655","Morganton","NC","35.742752","-81.71625","-5","1"
+"28656","North Wilkesboro","NC","36.238438","-81.045963","-5","1"
+"28657","Newland","NC","36.049348","-81.94286","-5","1"
+"28658","Newton","NC","35.653437","-81.23443","-5","1"
+"28659","North Wilkesboro","NC","36.169604","-81.11615","-5","1"
+"28660","Olin","NC","35.970599","-80.86439","-5","1"
+"28661","Patterson","NC","35.99726","-81.562609","-5","1"
+"28662","Pineola","NC","36.023359","-81.84888","-5","1"
+"28663","Piney Creek","NC","36.541861","-81.3195","-5","1"
+"28664","Plumtree","NC","36.044098","-82.003691","-5","1"
+"28665","Purlear","NC","36.195632","-81.37303","-5","1"
+"28666","Icard","NC","35.726966","-81.47238","-5","1"
+"28667","Rhodhiss","NC","35.777241","-81.43023","-5","1"
+"28668","Roaring Gap","NC","36.38846","-81.00733","-5","1"
+"28669","Roaring River","NC","36.229983","-80.99639","-5","1"
+"28670","Ronda","NC","36.204458","-80.93481","-5","1"
+"28671","Rutherford College","NC","35.753767","-81.53545","-5","1"
+"28672","Scottville","NC","36.414156","-81.492983","-5","1"
+"28673","Sherrills Ford","NC","35.589022","-80.99326","-5","1"
+"28674","North Wilkesboro","NC","36.216247","-81.207166","-5","1"
+"28675","Sparta","NC","36.506064","-81.1362","-5","1"
+"28676","State Road","NC","36.326001","-80.86182","-5","1"
+"28677","Statesville","NC","35.765719","-80.8981","-5","1"
+"28678","Stony Point","NC","35.846848","-81.05152","-5","1"
+"28679","Sugar Grove","NC","36.255467","-81.83002","-5","1"
+"28680","Morganton","NC","35.750657","-81.695292","-5","1"
+"28681","Taylorsville","NC","35.914275","-81.2083","-5","1"
+"28682","Terrell","NC","35.585074","-80.96141","-5","1"
+"28683","Thurmond","NC","36.394123","-80.91951","-5","1"
+"28684","Todd","NC","36.345453","-81.61009","-5","1"
+"28685","Traphill","NC","36.33942","-81.03564","-5","1"
+"28687","Statesville","NC","35.529792","-80.947028","-5","1"
+"28688","Turnersburg","NC","35.529792","-80.947028","-5","1"
+"28689","Union Grove","NC","36.03559","-80.91265","-5","1"
+"28690","Valdese","NC","35.740368","-81.56804","-5","1"
+"28691","Valle Crucis","NC","36.209158","-81.778871","-5","1"
+"28692","Vilas","NC","36.268944","-81.77819","-5","1"
+"28693","Warrensville","NC","36.474746","-81.5371","-5","1"
+"28694","West Jefferson","NC","36.375468","-81.47784","-5","1"
+"28697","Wilkesboro","NC","36.136991","-81.17462","-5","1"
+"28698","Zionville","NC","36.321009","-81.74404","-5","1"
+"28699","Scotts","NC","35.831037","-81.00762","-5","1"
+"28701","Alexander","NC","35.712999","-82.63479","-5","1"
+"28702","Almond","NC","35.412166","-83.58395","-5","1"
+"28704","Arden","NC","35.459869","-82.54142","-5","1"
+"28705","Bakersville","NC","36.033454","-82.16858","-5","1"
+"28707","Balsam","NC","35.419931","-83.08029","-5","1"
+"28708","Balsam Grove","NC","35.289152","-82.83859","-5","1"
+"28709","Barnardsville","NC","35.756437","-82.41471","-5","1"
+"28710","Bat Cave","NC","35.464897","-82.28307","-5","1"
+"28711","Black Mountain","NC","35.605146","-82.31665","-5","1"
+"28712","Brevard","NC","35.188077","-82.75799","-5","1"
+"28713","Bryson City","NC","35.395491","-83.47397","-5","1"
+"28714","Burnsville","NC","35.891276","-82.30008","-5","1"
+"28715","Candler","NC","35.529895","-82.70449","-5","1"
+"28716","Canton","NC","35.503301","-82.85103","-5","1"
+"28717","Cashiers","NC","35.103251","-83.09538","-5","1"
+"28718","Cedar Mountain","NC","35.154193","-82.62466","-5","1"
+"28719","Cherokee","NC","35.50359","-83.29698","-5","1"
+"28720","Chimney Rock","NC","35.436893","-82.241744","-5","1"
+"28721","Clyde","NC","35.60089","-82.93536","-5","1"
+"28722","Columbus","NC","35.248689","-82.18161","-5","1"
+"28723","Cullowhee","NC","35.256241","-83.14464","-5","1"
+"28724","Dana","NC","35.295403","-82.388325","-5","1"
+"28725","Dillsboro","NC","35.36852","-83.25321","-5","1"
+"28726","East Flat Rock","NC","35.280702","-82.41834","-5","1"
+"28727","Edneyville","NC","35.322276","-82.503226","-5","1"
+"28728","Enka","NC","35.498797","-82.708024","-5","1"
+"28729","Etowah","NC","35.311112","-82.60288","-5","1"
+"28730","Fairview","NC","35.526686","-82.37542","-5","1"
+"28731","Flat Rock","NC","35.270682","-82.41515","-5","1"
+"28732","Fletcher","NC","35.437611","-82.48999","-5","1"
+"28733","Fontana Dam","NC","35.435102","-83.82171","-5","1"
+"28734","Franklin","NC","35.185018","-83.39032","-5","1"
+"28735","Gerton","NC","35.478887","-82.34855","-5","1"
+"28736","Glenville","NC","35.175847","-83.11146","-5","1"
+"28737","Glenwood","NC","35.738725","-82.059494","-5","1"
+"28738","Hazelwood","NC","35.468264","-83.002841","-5","1"
+"28739","Hendersonville","NC","35.290454","-82.50652","-5","1"
+"28740","Greenmountain","NC","36.023817","-82.29237","-5","1"
+"28741","Highlands","NC","35.06252","-83.21173","-5","1"
+"28742","Horse Shoe","NC","35.362016","-82.60353","-5","1"
+"28743","Hot Springs","NC","35.834212","-82.86149","-5","1"
+"28744","Franklin","NC","35.117299","-83.295244","-5","1"
+"28745","Lake Junaluska","NC","35.527982","-82.96774","-5","1"
+"28746","Lake Lure","NC","35.451314","-82.185","-5","1"
+"28747","Lake Toxaway","NC","35.146004","-82.92258","-5","1"
+"28748","Leicester","NC","35.661009","-82.73513","-5","1"
+"28749","Little Switzerland","NC","35.849372","-82.07899","-5","1"
+"28750","Lynn","NC","35.236179","-82.236198","-5","1"
+"28751","Maggie Valley","NC","35.518138","-83.085","-5","1"
+"28752","Marion","NC","35.709124","-82.01719","-5","1"
+"28753","Marshall","NC","35.852912","-82.68447","-5","1"
+"28754","Mars Hill","NC","35.866763","-82.52043","-5","1"
+"28755","Micaville","NC","35.909707","-82.21395","-5","1"
+"28756","Mill Spring","NC","35.336523","-82.18313","-5","1"
+"28757","Montreat","NC","35.646373","-82.29968","-5","1"
+"28758","Mountain Home","NC","35.37094","-82.4945","-5","1"
+"28760","Naples","NC","35.381677","-82.481257","-5","1"
+"28761","Nebo","NC","35.666254","-81.90629","-5","1"
+"28762","Old Fort","NC","35.625414","-82.18229","-5","1"
+"28763","Otto","NC","35.050529","-83.42225","-5","1"
+"28765","Penland","NC","35.931539","-82.11072","-5","1"
+"28766","Penrose","NC","35.264303","-82.62357","-5","1"
+"28767","Old Fort","NC","35.640648","-82.165546","-5","1"
+"28768","Pisgah Forest","NC","35.272331","-82.67373","-5","1"
+"28770","Ridgecrest","NC","35.618596","-82.30048","-5","1"
+"28771","Robbinsville","NC","35.345611","-83.79634","-5","1"
+"28772","Rosman","NC","35.139812","-82.84253","-5","1"
+"28773","Saluda","NC","35.23899","-82.34408","-5","1"
+"28774","Sapphire","NC","35.115467","-83.01052","-5","1"
+"28775","Scaly Mountain","NC","35.03107","-83.327411","-5","1"
+"28776","Skyland","NC","35.483482","-82.520707","-5","1"
+"28777","Spruce Pine","NC","35.910932","-82.07366","-5","1"
+"28778","Swannanoa","NC","35.60243","-82.40531","-5","1"
+"28779","Sylva","NC","35.37273","-83.20772","-5","1"
+"28781","Topton","NC","35.241747","-83.62998","-5","1"
+"28782","Tryon","NC","35.221428","-82.21712","-5","1"
+"28783","Tuckasegee","NC","35.248885","-83.04111","-5","1"
+"28784","Tuxedo","NC","35.219796","-82.43186","-5","1"
+"28785","Maggie Valley","NC","35.569047","-83.009416","-5","1"
+"28786","Waynesville","NC","35.511094","-82.99607","-5","1"
+"28787","Weaverville","NC","35.723848","-82.54285","-5","1"
+"28788","Webster","NC","35.328533","-83.233302","-5","1"
+"28789","Whittier","NC","35.418018","-83.30887","-5","1"
+"28790","Zirconia","NC","35.202275","-82.47156","-5","1"
+"28791","Hendersonville","NC","35.345487","-82.49673","-5","1"
+"28792","Hendersonville","NC","35.353837","-82.41625","-5","1"
+"28793","Hendersonville","NC","35.292714","-82.503611","-5","1"
+"28796","East Flat Rock","NC","35.29118","-82.41453","-5","1"
+"28800","Asheville","NC","35.564734","-82.597992","-5","1"
+"28801","Asheville","NC","35.595661","-82.55632","-5","1"
+"28802","Asheville","NC","35.623732","-82.667132","-5","1"
+"28803","Asheville","NC","35.54179","-82.52307","-5","1"
+"28804","Asheville","NC","35.635844","-82.55992","-5","1"
+"28805","Asheville","NC","35.599363","-82.50007","-5","1"
+"28806","Asheville","NC","35.575877","-82.6062","-5","1"
+"28808","Asheville","NC","35.486156","-82.532081","-5","1"
+"28810","Asheville","NC","35.620335","-82.528558","-5","1"
+"28813","Asheville","NC","35.50042","-82.502644","-5","1"
+"28814","Asheville","NC","35.664752","-82.492664","-5","1"
+"28815","Asheville","NC","35.620335","-82.528558","-5","1"
+"28816","Asheville","NC","35.620335","-82.528558","-5","1"
+"28818","Beulaville","NC","34.924076","-77.764819","-5","1"
+"28849","Wrightsboro","NC","34.300421","-77.934656","-5","1"
+"28894","Vass","NC","35.267373","-79.280088","-5","1"
+"28901","Andrews","NC","35.202178","-83.81695","-5","1"
+"28902","Brasstown","NC","35.02851","-83.94882","-5","1"
+"28903","Culberson","NC","35.094379","-84.035916","-5","1"
+"28904","Hayesville","NC","35.052591","-83.76683","-5","1"
+"28905","Marble","NC","35.152197","-83.94231","-5","1"
+"28906","Murphy","NC","35.091332","-84.09018","-5","1"
+"28909","Warne","NC","34.994752","-83.90161","-5","1"
+"28950","Winterville","NC","35.526959","-77.404512","-5","1"
+"28954","Emerald Isle","NC","34.673805","-76.97842","-5","1"
+"28971","Hendersonville","NC","35.350962","-82.494187","-5","1"
+"28972","Hendersonville","NC","35.299726","-82.449228","-5","1"
+"29001","Alcolu","SC","33.76993","-80.17278","-5","1"
+"29002","Ballentine","SC","34.126535","-81.234811","-5","1"
+"29003","Bamberg","SC","33.272026","-81.03203","-5","1"
+"29006","Batesburg","SC","33.872503","-81.55245","-5","1"
+"29009","Bethune","SC","34.422793","-80.36129","-5","1"
+"29010","Bishopville","SC","34.213582","-80.26083","-5","1"
+"29014","Blackstock","SC","34.552119","-81.13542","-5","1"
+"29015","Blair","SC","34.428673","-81.35898","-5","1"
+"29016","Blythewood","SC","34.200042","-80.98653","-5","1"
+"29018","Bowman","SC","33.354403","-80.65134","-5","1"
+"29020","Camden","SC","34.278935","-80.59142","-5","1"
+"29030","Cameron","SC","33.572356","-80.67158","-5","1"
+"29031","Carlisle","SC","34.603967","-81.4496","-5","1"
+"29032","Cassatt","SC","34.349725","-80.48117","-5","1"
+"29033","Cayce","SC","33.964753","-81.06618","-5","1"
+"29036","Chapin","SC","34.128998","-81.33822","-5","1"
+"29037","Chappells","SC","34.188584","-81.87043","-5","1"
+"29038","Cope","SC","33.372063","-80.98409","-5","1"
+"29039","Cordova","SC","33.425547","-80.90083","-5","1"
+"29040","Dalzell","SC","34.029407","-80.44405","-5","1"
+"29041","Davis Station","SC","33.688373","-80.208109","-5","1"
+"29042","Denmark","SC","33.321406","-81.14318","-5","1"
+"29044","Eastover","SC","33.911025","-80.70157","-5","1"
+"29045","Elgin","SC","34.1699","-80.81448","-5","1"
+"29046","Elliott","SC","34.107967","-80.161","-5","1"
+"29047","Elloree","SC","33.52803","-80.58127","-5","1"
+"29048","Eutawville","SC","33.399511","-80.32069","-5","1"
+"29051","Gable","SC","33.845399","-80.13052","-5","1"
+"29052","Gadsden","SC","33.839441","-80.74802","-5","1"
+"29053","Gaston","SC","33.830405","-81.09219","-5","1"
+"29054","Gilbert","SC","33.947764","-81.3823","-5","1"
+"29055","Great Falls","SC","34.569908","-80.90972","-5","1"
+"29056","Greeleyville","SC","33.634675","-79.99205","-5","1"
+"29058","Heath Springs","SC","34.588329","-80.70107","-5","1"
+"29059","Holly Hill","SC","33.332666","-80.42251","-5","1"
+"29061","Hopkins","SC","33.920721","-80.84535","-5","1"
+"29062","Horatio","SC","34.020978","-80.56786","-5","1"
+"29063","Irmo","SC","34.120487","-81.19686","-5","1"
+"29065","Jenkinsville","SC","34.295632","-81.30068","-5","1"
+"29066","Batesburg-Leesville","SC","33.905722","-81.530165","-5","1"
+"29067","Kershaw","SC","34.545825","-80.54807","-5","1"
+"29069","Lamar","SC","34.183978","-80.07629","-5","1"
+"29070","Leesville","SC","33.931279","-81.465","-5","1"
+"29071","Lexington","SC","33.925183","-81.248345","-5","1"
+"29072","Lexington","SC","33.991362","-81.25047","-5","1"
+"29073","Lexington","SC","33.917812","-81.21854","-5","1"
+"29074","Liberty Hill","SC","34.450789","-80.79844","-5","1"
+"29075","Little Mountain","SC","34.194914","-81.39016","-5","1"
+"29078","Lugoff","SC","34.204467","-80.70776","-5","1"
+"29079","Lydia","SC","34.296064","-80.11319","-5","1"
+"29080","Lynchburg","SC","34.007854","-80.0675","-5","1"
+"29081","Ehrhardt","SC","33.094711","-81.04345","-5","1"
+"29082","Lodge","SC","33.040507","-80.95448","-5","1"
+"29101","McBee","SC","34.461353","-80.2506","-5","1"
+"29102","Manning","SC","33.647611","-80.21281","-5","1"
+"29103","Mayesville","SC","33.989924","-80.208361","-5","1"
+"29104","Mayesville","SC","34.000732","-80.2136","-5","1"
+"29105","Monetta","SC","33.831118","-81.59772","-5","1"
+"29106","Monticello","SC","34.373596","-81.098735","-5","1"
+"29107","Neeses","SC","33.532767","-81.12298","-5","1"
+"29108","Newberry","SC","34.282877","-81.61641","-5","1"
+"29111","New Zion","SC","33.795243","-80.04196","-5","1"
+"29112","North","SC","33.629017","-81.09763","-5","1"
+"29113","Norway","SC","33.445032","-81.12334","-5","1"
+"29114","Olanta","SC","33.9413","-79.93219","-5","1"
+"29115","Orangeburg","SC","33.487767","-80.8564","-5","1"
+"29116","Orangeburg","SC","33.49593","-80.824603","-5","1"
+"29117","Orangeburg","SC","33.442019","-80.797486","-5","1"
+"29118","Orangeburg","SC","33.548282","-80.88513","-5","1"
+"29122","Peak","SC","34.242848","-81.32649","-5","1"
+"29123","Pelion","SC","33.771358","-81.25987","-5","1"
+"29124","Perry","SC","33.630125","-81.30861","-5","1"
+"29125","Pinewood","SC","33.71469","-80.4548","-5","1"
+"29126","Pomaria","SC","34.305501","-81.4218","-5","1"
+"29127","Prosperity","SC","34.14854","-81.511","-5","1"
+"29128","Rembert","SC","34.094472","-80.54447","-5","1"
+"29129","Ridge Spring","SC","33.804368","-81.65577","-5","1"
+"29130","Ridgeway","SC","34.328826","-80.88762","-5","1"
+"29132","Rion","SC","34.309957","-81.12724","-5","1"
+"29133","Rowesville","SC","33.37731","-80.81601","-5","1"
+"29135","Saint Matthews","SC","33.675533","-80.79563","-5","1"
+"29137","Salley","SC","33.593634","-81.32226","-5","1"
+"29138","Saluda","SC","34.029635","-81.77579","-5","1"
+"29142","Santee","SC","33.462378","-80.50903","-5","1"
+"29143","Sardinia","SC","33.688373","-80.208109","-5","1"
+"29145","Silverstreet","SC","34.215881","-81.75318","-5","1"
+"29146","Springfield","SC","33.506999","-81.28947","-5","1"
+"29147","State Park","SC","34.005992","-80.970766","-5","1"
+"29148","Summerton","SC","33.570595","-80.33969","-5","1"
+"29150","Sumter","SC","33.916418","-80.35738","-5","1"
+"29151","Sumter","SC","33.899856","-80.37434","-5","1"
+"29152","Shaw A F B","SC","33.972863","-80.46534","-5","1"
+"29153","Sumter","SC","33.948928","-80.32025","-5","1"
+"29154","Sumter","SC","33.899155","-80.43433","-5","1"
+"29160","Swansea","SC","33.734171","-81.07563","-5","1"
+"29161","Timmonsville","SC","34.115691","-79.94482","-5","1"
+"29162","Turbeville","SC","33.88759","-80.01013","-5","1"
+"29163","Vance","SC","33.434712","-80.43046","-5","1"
+"29164","Wagener","SC","33.659078","-81.40845","-5","1"
+"29166","Ward","SC","33.90529","-81.70607","-5","1"
+"29168","Wedgefield","SC","33.881986","-80.50487","-5","1"
+"29169","West Columbia","SC","33.990952","-81.08956","-5","1"
+"29170","West Columbia","SC","33.943251","-81.14142","-5","1"
+"29171","West Columbia","SC","33.925183","-81.248345","-5","1"
+"29172","West Columbia","SC","33.902216","-81.08256","-5","1"
+"29175","Westville","SC","34.443733","-80.60138","-5","1"
+"29176","White Oak","SC","34.373596","-81.098735","-5","1"
+"29177","White Rock","SC","34.143934","-81.27281","-5","1"
+"29178","Whitmire","SC","34.502577","-81.60777","-5","1"
+"29180","Winnsboro","SC","34.369441","-81.08218","-5","1"
+"29201","Columbia","SC","33.998454","-81.03519","-5","1"
+"29202","Columbia","SC","34.022921","-81.02886","-5","1"
+"29203","Columbia","SC","34.066271","-81.02492","-5","1"
+"29204","Columbia","SC","34.027955","-81.00008","-5","1"
+"29205","Columbia","SC","33.990555","-80.99826","-5","1"
+"29206","Columbia","SC","34.037557","-80.96024","-5","1"
+"29207","Columbia","SC","34.021442","-80.94144","-5","1"
+"29208","Columbia","SC","33.993705","-81.019913","-5","1"
+"29209","Columbia","SC","33.968011","-80.93844","-5","1"
+"29210","Columbia","SC","34.041646","-81.10624","-5","1"
+"29211","Columbia","SC","34.096716","-80.922338","-5","1"
+"29212","Columbia","SC","34.075611","-81.17611","-5","1"
+"29214","Columbia","SC","34.005992","-80.970766","-5","1"
+"29215","Columbia","SC","34.005992","-80.970766","-5","1"
+"29216","Columbia","SC","34.005992","-80.970766","-5","1"
+"29217","Columbia","SC","34.005992","-80.970766","-5","1"
+"29218","Columbia","SC","34.005992","-80.970766","-5","1"
+"29219","Columbia","SC","34.005992","-80.970766","-5","1"
+"29220","Columbia","SC","34.005992","-80.970766","-5","1"
+"29221","Columbia","SC","34.005992","-80.970766","-5","1"
+"29222","Columbia","SC","34.005992","-80.970766","-5","1"
+"29223","Columbia","SC","34.084069","-80.93286","-5","1"
+"29224","Columbia","SC","34.005992","-80.970766","-5","1"
+"29225","Columbia","SC","34.005992","-80.970766","-5","1"
+"29226","Columbia","SC","34.005992","-80.970766","-5","1"
+"29227","Columbia","SC","34.005992","-80.970766","-5","1"
+"29228","Columbia","SC","33.925183","-81.248345","-5","1"
+"29229","Columbia","SC","34.139511","-80.88783","-5","1"
+"29230","Columbia","SC","34.107483","-81.062623","-5","1"
+"29233","Columbia","SC","34.091966","-80.87343","-5","1"
+"29235","Clinton","SC","34.457522","-81.880871","-5","1"
+"29240","Columbia","SC","34.005992","-80.970766","-5","1"
+"29250","Columbia","SC","34.005992","-80.970766","-5","1"
+"29260","Columbia","SC","34.005992","-80.970766","-5","1"
+"29290","Columbia","SC","34.005992","-80.970766","-5","1"
+"29292","Columbia","SC","34.005992","-80.970766","-5","1"
+"29301","Spartanburg","SC","34.940921","-81.98682","-5","1"
+"29302","Spartanburg","SC","34.926075","-81.87919","-5","1"
+"29303","Spartanburg","SC","34.980636","-81.95665","-5","1"
+"29304","Spartanburg","SC","34.916625","-81.863874","-5","1"
+"29305","Spartanburg","SC","35.111404","-82.105503","-5","1"
+"29306","Spartanburg","SC","34.925353","-81.9308","-5","1"
+"29307","Spartanburg","SC","34.982424","-81.85729","-5","1"
+"29316","Spartanburg","SC","35.033903","-81.97413","-5","1"
+"29318","Spartanburg","SC","34.888237","-81.96902","-5","1"
+"29319","Spartanburg","SC","34.888237","-81.96902","-5","1"
+"29320","Arcadia","SC","34.957898","-81.99252","-5","1"
+"29321","Buffalo","SC","34.715641","-81.71187","-5","1"
+"29322","Campobello","SC","35.109207","-82.141","-5","1"
+"29323","Chesnee","SC","35.131971","-81.88553","-5","1"
+"29324","Clifton","SC","34.99056","-81.83271","-5","1"
+"29325","Clinton","SC","34.470115","-81.86761","-5","1"
+"29329","Converse","SC","35.001748","-81.832999","-5","1"
+"29330","Cowpens","SC","35.043505","-81.81026","-5","1"
+"29331","Cross Anchor","SC","34.638315","-81.856745","-5","1"
+"29332","Cross Hill","SC","34.270774","-81.98276","-5","1"
+"29333","Drayton","SC","34.968472","-81.906376","-5","1"
+"29334","Duncan","SC","34.915071","-82.13322","-5","1"
+"29335","Enoree","SC","34.660137","-81.90924","-5","1"
+"29336","Fairforest","SC","34.888237","-81.96902","-5","1"
+"29338","Fingerville","SC","35.136333","-82.00328","-5","1"
+"29340","Gaffney","SC","35.03653","-81.62497","-5","1"
+"29341","Gaffney","SC","35.10425","-81.69232","-5","1"
+"29342","Gaffney","SC","34.996314","-81.652395","-5","1"
+"29346","Glendale","SC","35.044719","-81.977324","-5","1"
+"29348","Gramling","SC","34.888237","-81.96902","-5","1"
+"29349","Inman","SC","35.061431","-82.07523","-5","1"
+"29351","Joanna","SC","34.415818","-81.8106","-5","1"
+"29353","Jonesville","SC","34.828217","-81.66903","-5","1"
+"29355","Kinards","SC","34.338289","-81.78674","-5","1"
+"29356","Landrum","SC","35.15617","-82.22045","-5","1"
+"29360","Laurens","SC","34.503167","-82.02271","-5","1"
+"29363","Lake View","SC","34.342221","-79.165102","-5","1"
+"29364","Lockhart","SC","34.788053","-81.46124","-5","1"
+"29365","Lyman","SC","34.96589","-82.14541","-5","1"
+"29368","Mayo","SC","34.949241","-81.990216","-5","1"
+"29369","Moore","SC","34.865445","-82.02018","-5","1"
+"29370","Mountville","SC","34.367183","-81.9768","-5","1"
+"29372","Pacolet","SC","34.900682","-81.74846","-5","1"
+"29373","Pacolet Mills","SC","34.925281","-81.74321","-5","1"
+"29374","Pauline","SC","34.783908","-81.85468","-5","1"
+"29375","Reidville","SC","34.862432","-82.11066","-5","1"
+"29376","Roebuck","SC","34.856283","-81.95444","-5","1"
+"29377","Startex","SC","34.935828","-82.09514","-5","1"
+"29378","Una","SC","34.853013","-81.772738","-5","1"
+"29379","Union","SC","34.714045","-81.60496","-5","1"
+"29384","Waterloo","SC","34.323605","-82.08325","-5","1"
+"29385","Wellford","SC","34.954729","-82.09312","-5","1"
+"29386","White Stone","SC","34.888237","-81.96902","-5","1"
+"29388","Woodruff","SC","34.758703","-82.0483","-5","1"
+"29390","Duncan","SC","34.888237","-81.96902","-5","1"
+"29391","Duncan","SC","34.888237","-81.96902","-5","1"
+"29401","Charleston","SC","32.779126","-79.9355","-5","1"
+"29402","Charleston","SC","32.84885","-79.85773","-5","1"
+"29403","Charleston","SC","32.799326","-79.94813","-5","1"
+"29404","Charleston AFB","SC","32.897903","-80.06061","-5","1"
+"29405","North Charleston","SC","32.856634","-79.98218","-5","1"
+"29406","Charleston","SC","32.918757","-80.0228","-5","1"
+"29407","Charleston","SC","32.794841","-80.005","-5","1"
+"29409","Charleston","SC","32.84885","-79.85773","-5","1"
+"29410","Charleston","SC","33.192514","-80.03063","-5","1"
+"29412","Charleston","SC","32.73727","-79.95409","-5","1"
+"29413","Charleston","SC","32.84885","-79.85773","-5","1"
+"29414","Charleston","SC","32.821238","-80.05353","-5","1"
+"29415","Charleston","SC","32.84885","-79.85773","-5","1"
+"29416","Charleston","SC","32.84885","-79.85773","-5","1"
+"29417","Charleston","SC","32.84885","-79.85773","-5","1"
+"29418","North Charleston","SC","32.879529","-80.05911","-5","1"
+"29419","Charleston","SC","32.84885","-79.85773","-5","1"
+"29420","North Charleston","SC","32.93064","-80.09247","-5","1"
+"29422","Charleston","SC","32.84885","-79.85773","-5","1"
+"29423","Charleston","SC","32.981952","-80.07363","-5","1"
+"29424","Charleston","SC","32.783076","-79.93701","-5","1"
+"29425","Charleston","SC","32.786176","-79.94711","-5","1"
+"29426","Adams Run","SC","32.790622","-80.38489","-5","1"
+"29429","Awendaw","SC","32.97251","-79.6607","-5","1"
+"29430","Bethera","SC","33.174292","-79.78991","-5","1"
+"29431","Bonneau","SC","33.284887","-79.91504","-5","1"
+"29432","Branchville","SC","33.229581","-80.80248","-5","1"
+"29433","Canadys","SC","33.061376","-80.631208","-5","1"
+"29434","Cordesville","SC","33.119898","-79.85797","-5","1"
+"29435","Cottageville","SC","32.976399","-80.47925","-5","1"
+"29436","Cross","SC","33.345833","-80.19009","-5","1"
+"29437","Dorchester","SC","33.144807","-80.41593","-5","1"
+"29438","Edisto Island","SC","32.542343","-80.31682","-5","1"
+"29439","Folly Beach","SC","32.662451","-79.93224","-5","1"
+"29440","Georgetown","SC","33.38934","-79.32638","-5","1"
+"29442","Georgetown","SC","33.403693","-79.226361","-5","1"
+"29445","Goose Creek","SC","32.991185","-80.02347","-5","1"
+"29446","Green Pond","SC","32.683083","-80.56074","-5","1"
+"29447","Grover","SC","33.086324","-80.62279","-5","1"
+"29448","Harleyville","SC","33.237382","-80.45186","-5","1"
+"29449","Hollywood","SC","32.715745","-80.26738","-5","1"
+"29450","Huger","SC","33.046869","-79.8097","-5","1"
+"29451","Isle Of Palms","SC","32.798138","-79.76496","-5","1"
+"29452","Jacksonboro","SC","32.745396","-80.46458","-5","1"
+"29453","Jamestown","SC","33.235105","-79.61472","-5","1"
+"29455","Johns Island","SC","32.717109","-80.08507","-5","1"
+"29456","Ladson","SC","32.993571","-80.12165","-5","1"
+"29457","Johns Island","SC","32.84885","-79.85773","-5","1"
+"29458","McClellanville","SC","33.10594","-79.4657","-5","1"
+"29461","Moncks Corner","SC","33.164225","-80.01039","-5","1"
+"29464","Mount Pleasant","SC","32.813518","-79.85899","-5","1"
+"29465","Mount Pleasant","SC","32.84885","-79.85773","-5","1"
+"29466","Mount Pleasant","SC","32.87602","-79.79148","-5","1"
+"29468","Pineville","SC","33.418106","-80.07822","-5","1"
+"29469","Pinopolis","SC","33.252941","-80.08297","-5","1"
+"29470","Ravenel","SC","32.788784","-80.22778","-5","1"
+"29471","Reevesville","SC","33.198286","-80.65637","-5","1"
+"29472","Ridgeville","SC","33.03271","-80.31958","-5","1"
+"29474","Round O","SC","32.939642","-80.54405","-5","1"
+"29475","Ruffin","SC","32.977614","-80.81529","-5","1"
+"29476","Russellville","SC","33.164201","-79.904182","-5","1"
+"29477","Saint George","SC","33.187906","-80.57602","-5","1"
+"29479","Saint Stephen","SC","33.391941","-79.91737","-5","1"
+"29481","Smoaks","SC","33.105834","-80.81066","-5","1"
+"29482","Sullivans Island","SC","32.763456","-79.83791","-5","1"
+"29483","Summerville","SC","33.034586","-80.18599","-5","1"
+"29484","Summerville","SC","33.00234","-80.226694","-5","1"
+"29485","Summerville","SC","32.983408","-80.17627","-5","1"
+"29487","Wadmalaw Island","SC","32.651864","-80.17774","-5","1"
+"29488","Walterboro","SC","32.89989","-80.67195","-5","1"
+"29492","Charleston","SC","32.91583","-79.8846","-5","1"
+"29493","Williams","SC","33.03378","-80.84282","-5","1"
+"29494","Hollywood","SC","32.727638","-80.24773","-5","1"
+"29501","Florence","SC","34.195705","-79.80977","-5","1"
+"29502","Florence","SC","34.200994","-79.784721","-5","1"
+"29503","Florence","SC","34.062999","-79.650627","-5","1"
+"29504","Florence","SC","34.041582","-79.693294","-5","1"
+"29505","Florence","SC","34.142119","-79.74311","-5","1"
+"29506","Florence","SC","34.201299","-79.71722","-5","1"
+"29510","Andrews","SC","33.45053","-79.59233","-5","1"
+"29511","Aynor","SC","33.985128","-79.14985","-5","1"
+"29512","Bennettsville","SC","34.657694","-79.69151","-5","1"
+"29516","Blenheim","SC","34.467072","-79.6437","-5","1"
+"29518","Cades","SC","33.78144","-79.88688","-5","1"
+"29519","Centenary","SC","34.028989","-79.3594","-5","1"
+"29520","Cheraw","SC","34.68862","-79.92315","-5","1"
+"29525","Clio","SC","34.571839","-79.53847","-5","1"
+"29526","Conway","SC","33.850218","-79.01692","-5","1"
+"29527","Conway","SC","33.801049","-79.1148","-5","1"
+"29528","Conway","SC","33.935814","-78.919205","-5","1"
+"29530","Coward","SC","33.985431","-79.74037","-5","1"
+"29532","Darlington","SC","34.291269","-79.8761","-5","1"
+"29535","McCormick","SC","33.911717","-82.30074","-5","1"
+"29536","Dillon","SC","34.413907","-79.36512","-5","1"
+"29540","Darlington","SC","34.388055","-79.89135","-5","1"
+"29541","Effingham","SC","34.070033","-79.75793","-5","1"
+"29542","Floyd Dale","SC","34.425629","-79.352291","-5","1"
+"29543","Fork","SC","34.289399","-79.27039","-5","1"
+"29544","Galivants Ferry","SC","34.002167","-79.19325","-5","1"
+"29545","Green Sea","SC","34.164187","-78.96696","-5","1"
+"29546","Gresham","SC","33.939996","-79.36142","-5","1"
+"29547","Hamer","SC","34.483711","-79.32815","-5","1"
+"29549","Myrtle Beach","SC","33.798844","-78.739531","-5","1"
+"29550","Hartsville","SC","34.386728","-80.08256","-5","1"
+"29551","Hartsville","SC","34.365898","-80.132418","-5","1"
+"29554","Hemingway","SC","33.71239","-79.40387","-5","1"
+"29555","Johnsonville","SC","33.830612","-79.45494","-5","1"
+"29556","Kingstree","SC","33.671678","-79.78693","-5","1"
+"29560","Lake City","SC","33.859815","-79.7542","-5","1"
+"29561","Latta","SC","34.336439","-79.432546","-5","1"
+"29563","Lake View","SC","34.345437","-79.18651","-5","1"
+"29564","Lane","SC","33.493553","-79.87402","-5","1"
+"29565","Latta","SC","34.340797","-79.45893","-5","1"
+"29566","Little River","SC","33.873017","-78.64282","-5","1"
+"29567","Little Rock","SC","34.525937","-79.42049","-5","1"
+"29568","Longs","SC","33.915705","-78.74796","-5","1"
+"29569","Loris","SC","34.046247","-78.9008","-5","1"
+"29570","McColl","SC","34.671428","-79.55308","-5","1"
+"29571","Marion","SC","34.164094","-79.396","-5","1"
+"29572","Myrtle Beach","SC","33.765136","-78.79097","-5","1"
+"29573","Minturn","SC","34.488255","-79.476859","-5","1"
+"29574","Mullins","SC","34.194685","-79.25775","-5","1"
+"29575","Myrtle Beach","SC","33.627763","-78.98126","-5","1"
+"29576","Murrells Inlet","SC","33.568115","-79.03226","-5","1"
+"29577","Myrtle Beach","SC","33.698101","-78.89604","-5","1"
+"29578","Myrtle Beach","SC","33.738887","-78.999561","-5","1"
+"29579","Myrtle Beach","SC","33.729439","-78.97824","-5","1"
+"29580","Nesmith","SC","33.653454","-79.56773","-5","1"
+"29581","Nichols","SC","34.19138","-79.11348","-5","1"
+"29582","North Myrtle Beach","SC","33.823495","-78.67824","-5","1"
+"29583","Pamplico","SC","33.983639","-79.57018","-5","1"
+"29584","Patrick","SC","34.585217","-80.06109","-5","1"
+"29585","Pawleys Island","SC","33.467343","-79.1301","-5","1"
+"29587","Myrtle Beach","SC","33.621094","-78.963155","-5","1"
+"29588","Myrtle Beach","SC","33.694757","-78.999862","-5","1"
+"29589","Rains","SC","34.095976","-79.31738","-5","1"
+"29590","Salters","SC","33.575913","-79.85551","-5","1"
+"29591","Scranton","SC","33.927936","-79.76429","-5","1"
+"29592","Sellers","SC","34.283207","-79.47272","-5","1"
+"29593","Society Hill","SC","34.492154","-79.87045","-5","1"
+"29594","Tatum","SC","34.645047","-79.58188","-5","1"
+"29596","Wallace","SC","34.743074","-79.83177","-5","1"
+"29597","North Myrtle Beach","SC","33.785803","-78.971795","-5","1"
+"29598","North Myrtle Beach","SC","33.935814","-78.919205","-5","1"
+"29599","Socastee","SC","33.694492","-79.011696","-5","1"
+"29601","Greenville","SC","34.848301","-82.40578","-5","1"
+"29602","Greenville","SC","34.800718","-82.395594","-5","1"
+"29603","Greenville","SC","34.837666","-82.371519","-5","1"
+"29604","Greenville","SC","34.849745","-82.453779","-5","1"
+"29605","Greenville","SC","34.798035","-82.39289","-5","1"
+"29606","Greenville","SC","34.849745","-82.453779","-5","1"
+"29607","Greenville","SC","34.825592","-82.34099","-5","1"
+"29608","Greenville","SC","34.849745","-82.453779","-5","1"
+"29609","Greenville","SC","34.889217","-82.39364","-5","1"
+"29610","Greenville","SC","34.849745","-82.453779","-5","1"
+"29611","Greenville","SC","34.840717","-82.44234","-5","1"
+"29612","Greenville","SC","34.849745","-82.453779","-5","1"
+"29613","Greenville","SC","34.924876","-82.433132","-5","1"
+"29614","Greenville","SC","34.872423","-82.362585","-5","1"
+"29615","Greenville","SC","34.866801","-82.31739","-5","1"
+"29616","Greenville","SC","34.849745","-82.453779","-5","1"
+"29617","Greenville","SC","34.897829","-82.447","-5","1"
+"29620","Abbeville","SC","34.189812","-82.41245","-5","1"
+"29621","Anderson","SC","34.523657","-82.62509","-5","1"
+"29622","Anderson","SC","34.491988","-82.782868","-5","1"
+"29623","Anderson","SC","34.438087","-82.835449","-5","1"
+"29624","Anderson","SC","34.478139","-82.6455","-5","1"
+"29625","Anderson","SC","34.532638","-82.71615","-5","1"
+"29626","Anderson","SC","34.464572","-82.74032","-5","1"
+"29627","Belton","SC","34.517231","-82.49053","-5","1"
+"29628","Calhoun Falls","SC","34.095246","-82.56215","-5","1"
+"29630","Central","SC","34.733515","-82.78407","-5","1"
+"29631","Clemson","SC","34.681255","-82.82176","-5","1"
+"29632","Clemson","SC","34.847372","-82.710126","-5","1"
+"29633","Clemson","SC","34.847372","-82.710126","-5","1"
+"29634","Clemson","SC","34.847372","-82.710126","-5","1"
+"29635","Cleveland","SC","35.084282","-82.62565","-5","1"
+"29636","Conestee","SC","34.849745","-82.453779","-5","1"
+"29638","Donalds","SC","34.370703","-82.33427","-5","1"
+"29639","Due West","SC","34.325575","-82.4023","-5","1"
+"29640","Easley","SC","34.849655","-82.59365","-5","1"
+"29641","Easley","SC","34.813542","-82.653067","-5","1"
+"29642","Easley","SC","34.789884","-82.56459","-5","1"
+"29643","Fair Play","SC","34.505005","-82.99703","-5","1"
+"29644","Fountain Inn","SC","34.681279","-82.19732","-5","1"
+"29645","Gray Court","SC","34.601311","-82.13111","-5","1"
+"29646","Greenwood","SC","34.169781","-82.15474","-5","1"
+"29647","Greenwood","SC","34.178813","-82.163078","-5","1"
+"29648","Greenwood","SC","34.21241","-82.168139","-5","1"
+"29649","Greenwood","SC","34.225872","-82.15614","-5","1"
+"29650","Greer","SC","34.911469","-82.25178","-5","1"
+"29651","Greer","SC","34.937356","-82.22117","-5","1"
+"29652","Greer","SC","34.849745","-82.453779","-5","1"
+"29653","Hodges","SC","34.286915","-82.23672","-5","1"
+"29654","Honea Path","SC","34.45451","-82.38755","-5","1"
+"29655","Iva","SC","34.299215","-82.63812","-5","1"
+"29656","La France","SC","34.612144","-82.76263","-5","1"
+"29657","Liberty","SC","34.779483","-82.68861","-5","1"
+"29658","Long Creek","SC","34.774914","-83.27236","-5","1"
+"29659","Lowndesville","SC","34.210243","-82.63239","-5","1"
+"29661","Marietta","SC","35.048312","-82.52726","-5","1"
+"29662","Mauldin","SC","34.774657","-82.30432","-5","1"
+"29664","Mountain Rest","SC","34.855841","-83.16336","-5","1"
+"29665","Newry","SC","34.725935","-82.90985","-5","1"
+"29666","Ninety Six","SC","34.14606","-82.00203","-5","1"
+"29667","Norris","SC","34.766305","-82.75838","-5","1"
+"29669","Pelzer","SC","34.646501","-82.44077","-5","1"
+"29670","Pendleton","SC","34.641851","-82.76668","-5","1"
+"29671","Pickens","SC","34.912476","-82.71136","-5","1"
+"29672","Seneca","SC","34.736907","-82.94599","-5","1"
+"29673","Piedmont","SC","34.723173","-82.4565","-5","1"
+"29675","Richland","SC","34.764076","-83.088332","-5","1"
+"29676","Salem","SC","34.888111","-82.95878","-5","1"
+"29677","Sandy Springs","SC","34.589662","-82.74935","-5","1"
+"29678","Seneca","SC","34.660345","-82.94557","-5","1"
+"29679","Seneca","SC","34.607898","-82.939668","-5","1"
+"29680","Simpsonville","SC","34.709869","-82.28385","-5","1"
+"29681","Simpsonville","SC","34.762693","-82.24512","-5","1"
+"29682","Six Mile","SC","34.833113","-82.83794","-5","1"
+"29683","Slater","SC","35.031252","-82.49425","-5","1"
+"29684","Starr","SC","34.376689","-82.71772","-5","1"
+"29685","Sunset","SC","34.95424","-82.8484","-5","1"
+"29686","Tamassee","SC","34.898387","-83.04391","-5","1"
+"29687","Taylors","SC","34.935636","-82.32238","-5","1"
+"29688","Tigerville","SC","35.068914","-82.37061","-5","1"
+"29689","Townville","SC","34.527385","-82.86993","-5","1"
+"29690","Travelers Rest","SC","35.018511","-82.43224","-5","1"
+"29691","Walhalla","SC","34.769994","-83.06882","-5","1"
+"29692","Ware Shoals","SC","34.404535","-82.23851","-5","1"
+"29693","Westminster","SC","34.633763","-83.11495","-5","1"
+"29695","Hodges","SC","34.218582","-82.304658","-5","1"
+"29696","West Union","SC","34.77272","-83.02066","-5","1"
+"29697","Williamston","SC","34.622494","-82.50551","-5","1"
+"29698","Greenville","SC","34.888237","-81.96902","-5","1"
+"29702","Blacksburg","SC","35.118338","-81.49413","-5","1"
+"29703","Bowling Green","SC","34.992612","-81.178712","-5","1"
+"29704","Catawba","SC","34.843469","-80.92235","-5","1"
+"29706","Chester","SC","34.720597","-81.21429","-5","1"
+"29708","Fort Mill","SC","35.040969","-80.99427","-5","1"
+"29709","Chesterfield","SC","34.720306","-80.09371","-5","1"
+"29710","Clover","SC","35.109114","-81.19429","-5","1"
+"29712","Edgemoor","SC","34.795665","-80.97792","-5","1"
+"29714","Fort Lawn","SC","34.702249","-80.90157","-5","1"
+"29715","Fort Mill","SC","35.008416","-80.91644","-5","1"
+"29716","Fort Mill","SC","35.062815","-80.969035","-5","1"
+"29717","Hickory Grove","SC","34.963208","-81.43049","-5","1"
+"29718","Jefferson","SC","34.631305","-80.35877","-5","1"
+"29720","Lancaster","SC","34.729073","-80.76005","-5","1"
+"29721","Lancaster","SC","34.699412","-80.781721","-5","1"
+"29722","Lancaster","SC","34.767269","-80.658932","-5","1"
+"29724","Lando","SC","34.774347","-81.00994","-5","1"
+"29726","McConnells","SC","34.861633","-81.22788","-5","1"
+"29727","Mount Croghan","SC","34.712457","-80.26799","-5","1"
+"29728","Pageland","SC","34.769259","-80.39935","-5","1"
+"29729","Richburg","SC","34.692002","-81.00536","-5","1"
+"29730","Rock Hill","SC","34.914611","-81.0125","-5","1"
+"29731","Rock Hill","SC","34.992612","-81.178712","-5","1"
+"29732","Rock Hill","SC","34.969427","-81.0509","-5","1"
+"29733","Rock Hill","SC","34.992612","-81.178712","-5","1"
+"29734","Rock Hill","SC","34.992612","-81.178712","-5","1"
+"29741","Ruby","SC","34.721265","-80.19733","-5","1"
+"29742","Sharon","SC","34.870127","-81.39136","-5","1"
+"29743","Smyrna","SC","35.041829","-81.40335","-5","1"
+"29744","Van Wyck","SC","34.973866","-80.851836","-5","1"
+"29745","York","SC","35.005981","-81.21176","-5","1"
+"29756","Garden City","SC","33.595996","-79.001441","-5","1"
+"29801","Aiken","SC","33.569885","-81.71368","-5","1"
+"29802","Aiken","SC","33.723519","-81.59072","-5","1"
+"29803","Aiken","SC","33.486049","-81.70946","-5","1"
+"29804","Aiken","SC","33.53773","-81.599891","-5","1"
+"29805","Aiken","SC","33.650812","-81.61561","-5","1"
+"29808","Aiken","SC","33.53773","-81.599891","-5","1"
+"29809","New Ellenton","SC","33.415481","-81.68632","-5","1"
+"29810","Allendale","SC","33.010041","-81.33069","-5","1"
+"29812","Barnwell","SC","33.226172","-81.36031","-5","1"
+"29813","Hilda","SC","33.291666","-81.482658","-5","1"
+"29816","Bath","SC","33.503438","-81.87128","-5","1"
+"29817","Blackville","SC","33.363785","-81.28416","-5","1"
+"29819","Bradley","SC","34.074234","-82.23492","-5","1"
+"29821","Clarks Hill","SC","33.643924","-82.13638","-5","1"
+"29822","Clearwater","SC","33.498386","-81.89705","-5","1"
+"29824","Edgefield","SC","33.819096","-81.95036","-5","1"
+"29826","Elko","SC","33.380314","-81.37854","-5","1"
+"29827","Fairfax","SC","32.963048","-81.24052","-5","1"
+"29828","Gloverville","SC","33.523241","-81.82785","-5","1"
+"29829","Graniteville","SC","33.566349","-81.84119","-5","1"
+"29831","Jackson","SC","33.337781","-81.8214","-5","1"
+"29832","Johnston","SC","33.824496","-81.79179","-5","1"
+"29834","Langley","SC","33.51344","-81.85264","-5","1"
+"29835","McCormick","SC","33.91509","-82.30548","-5","1"
+"29836","Martin","SC","33.080604","-81.49201","-5","1"
+"29838","Modoc","SC","33.733657","-82.19251","-5","1"
+"29839","Montmorenci","SC","33.507335","-81.599198","-5","1"
+"29840","Mount Carmel","SC","33.997908","-82.51411","-5","1"
+"29841","North Augusta","SC","33.517435","-81.94945","-5","1"
+"29842","Beech Island","SC","33.443562","-81.87994","-5","1"
+"29843","Olar","SC","33.190068","-81.18294","-5","1"
+"29844","Parksville","SC","33.7802","-82.21285","-5","1"
+"29845","Plum Branch","SC","33.84674","-82.23442","-5","1"
+"29846","Sycamore","SC","33.047132","-81.22185","-5","1"
+"29847","Trenton","SC","33.695638","-81.85192","-5","1"
+"29848","Troy","SC","33.980222","-82.19013","-5","1"
+"29849","Ulmer","SC","33.092403","-81.2209","-5","1"
+"29850","Vaucluse","SC","33.619604","-81.81628","-5","1"
+"29851","Warrenville","SC","33.530409","-81.81743","-5","1"
+"29853","Williston","SC","33.405948","-81.42936","-5","1"
+"29856","Windsor","SC","33.475916","-81.51935","-5","1"
+"29860","North Augusta","SC","33.59107","-81.96445","-5","1"
+"29861","North Augusta","SC","33.53773","-81.599891","-5","1"
+"29875","Murrells Inlet","SC","33.55016","-79.053838","-5","1"
+"29899","McCormick","SC","33.83562","-82.319983","-5","1"
+"29901","Beaufort","SC","32.424353","-80.565343","-5","1"
+"29902","Beaufort","SC","32.421594","-80.67505","-5","1"
+"29903","Beaufort","SC","32.443974","-80.735245","-5","1"
+"29904","Beaufort","SC","32.390605","-80.661027","-5","1"
+"29905","Beaufort","SC","32.340119","-80.689041","-5","1"
+"29906","Beaufort","SC","32.445712","-80.74845","-5","1"
+"29907","Beaufort","SC","32.447677","-80.642097","-5","1"
+"29909","Hilton Head Island","SC","32.312621","-80.915532","-5","1"
+"29910","Bluffton","SC","32.241315","-80.87404","-5","1"
+"29911","Brunson","SC","32.928131","-81.16602","-5","1"
+"29912","Coosawatchie","SC","32.488929","-80.989142","-5","1"
+"29913","Crocketville","SC","32.929902","-81.184627","-5","1"
+"29914","Dale","SC","32.552652","-80.677001","-5","1"
+"29915","Daufuskie Island","SC","32.156011","-80.787899","-5","1"
+"29916","Early Branch","SC","32.72765","-80.94972","-5","1"
+"29918","Estill","SC","32.744565","-81.24794","-5","1"
+"29920","Saint Helena Island","SC","32.371697","-80.5503","-5","1"
+"29921","Furman","SC","32.67553","-81.17208","-5","1"
+"29922","Garnett","SC","32.593295","-81.24035","-5","1"
+"29923","Gifford","SC","32.866195","-81.24215","-5","1"
+"29924","Hampton","SC","32.868065","-81.10998","-5","1"
+"29925","Hilton Head Island","SC","32.21319","-80.799698","-5","1"
+"29926","Hilton Head Island","SC","32.226713","-80.74325","-5","1"
+"29927","Hardeeville","SC","32.277216","-81.07847","-5","1"
+"29928","Hilton Head Island","SC","32.159476","-80.75144","-5","1"
+"29929","Islandton","SC","32.934459","-80.91937","-5","1"
+"29931","Lobeco","SC","32.538432","-80.702594","-5","1"
+"29932","Luray","SC","32.818844","-81.30864","-5","1"
+"29933","Miley","SC","32.788773","-81.126913","-5","1"
+"29934","Pineland","SC","32.602042","-81.12453","-5","1"
+"29935","Port Royal","SC","32.382453","-80.69009","-5","1"
+"29936","Ridgeland","SC","32.493936","-80.97461","-5","1"
+"29938","Hilton Head Island","SC","32.390605","-80.661027","-5","1"
+"29939","Scotia","SC","32.669734","-81.2447","-5","1"
+"29940","Seabrook","SC","32.566537","-80.74987","-5","1"
+"29941","Sheldon","SC","32.586005","-80.82739","-5","1"
+"29942","Hampton","SC","32.881971","-81.111258","-5","1"
+"29943","Tillman","SC","32.458459","-81.10567","-5","1"
+"29944","Varnville","SC","32.822292","-81.05236","-5","1"
+"29945","Yemassee","SC","32.681058","-80.83348","-5","1"
+"29982","Hilton Head Island","SC","32.206894","-80.687134","-5","1"
+"30002","Avondale Estates","GA","33.772122","-84.26491","-5","1"
+"30003","Norcross","GA","33.960353","-84.037859","-5","1"
+"30004","Alpharetta","GA","34.119177","-84.30292","-5","1"
+"30005","Alpharetta","GA","34.080035","-84.21929","-5","1"
+"30006","Marietta","GA","33.912473","-84.557181","-5","1"
+"30007","Marietta","GA","33.912473","-84.557181","-5","1"
+"30008","Marietta","GA","33.907336","-84.5788","-5","1"
+"30009","Alpharetta","GA","33.844371","-84.47405","-5","1"
+"30010","Norcross","GA","33.960353","-84.037859","-5","1"
+"30011","Auburn","GA","34.022974","-83.83416","-5","1"
+"30012","Conyers","GA","33.696714","-84.01732","-5","1"
+"30013","Conyers","GA","33.633685","-83.98382","-5","1"
+"30014","Covington","GA","33.581406","-83.851","-5","1"
+"30015","Covington","GA","33.555791","-83.864915","-5","1"
+"30016","Covington","GA","33.542118","-83.93372","-5","1"
+"30017","Grayson","GA","33.888829","-83.96848","-5","1"
+"30018","Jersey","GA","33.717989","-83.801451","-5","1"
+"30019","Dacula","GA","33.981721","-83.88302","-5","1"
+"30021","Clarkston","GA","33.809604","-84.2387","-5","1"
+"30022","Alpharetta","GA","34.026238","-84.24506","-5","1"
+"30023","Alpharetta","GA","33.844371","-84.47405","-5","1"
+"30024","Suwanee","GA","34.052698","-84.07485","-5","1"
+"30025","Social Circle","GA","33.65072","-83.70779","-5","1"
+"30026","Duluth","GA","33.962979","-84.092267","-5","1"
+"30028","Cumming","GA","34.193041","-84.092588","-5","1"
+"30029","Duluth","GA","33.960353","-84.037859","-5","1"
+"30030","Decatur","GA","33.771705","-84.29407","-5","1"
+"30031","Decatur","GA","33.891251","-84.07456","-5","1"
+"30032","Decatur","GA","33.740055","-84.26791","-5","1"
+"30033","Decatur","GA","33.811354","-84.28335","-5","1"
+"30034","Decatur","GA","33.693448","-84.24743","-5","1"
+"30035","Decatur","GA","33.725739","-84.21114","-5","1"
+"30036","Decatur","GA","33.891251","-84.07456","-5","1"
+"30037","Decatur","GA","33.891251","-84.07456","-5","1"
+"30038","Lithonia","GA","33.676358","-84.15381","-5","1"
+"30039","Snellville","GA","33.822204","-84.03707","-5","1"
+"30040","Cumming","GA","34.235408","-84.17441","-5","1"
+"30041","Cumming","GA","34.201503","-84.09764","-5","1"
+"30042","Lawrenceville","GA","33.929464","-84.103226","-5","1"
+"30043","Lawrenceville","GA","34.001159","-84.01487","-5","1"
+"30044","Lawrenceville","GA","33.91967","-84.07482","-5","1"
+"30045","Lawrenceville","GA","33.949054","-83.98565","-5","1"
+"30046","Lawrenceville","GA","33.960353","-84.037859","-5","1"
+"30047","Lilburn","GA","33.872371","-84.11655","-5","1"
+"30048","Lilburn","GA","33.960353","-84.037859","-5","1"
+"30052","Loganville","GA","33.823809","-83.89423","-5","1"
+"30054","Oxford","GA","33.658113","-83.86249","-5","1"
+"30055","Mansfield","GA","33.504952","-83.74735","-5","1"
+"30056","Newborn","GA","33.500008","-83.67165","-5","1"
+"30058","Lithonia","GA","33.750257","-84.0964","-5","1"
+"30060","Marietta","GA","33.932052","-84.54746","-5","1"
+"30061","Marietta","GA","33.932842","-84.556004","-5","1"
+"30062","Marietta","GA","33.99605","-84.47464","-5","1"
+"30063","Marietta","GA","33.965294","-84.511209","-5","1"
+"30064","Marietta","GA","33.946735","-84.602","-5","1"
+"30065","Marietta","GA","33.912473","-84.557181","-5","1"
+"30066","Marietta","GA","34.027533","-84.51475","-5","1"
+"30067","Marietta","GA","33.933002","-84.47633","-5","1"
+"30068","Marietta","GA","33.965601","-84.4433","-5","1"
+"30069","Marietta","GA","33.912473","-84.557181","-5","1"
+"30070","Porterdale","GA","33.576043","-83.89821","-5","1"
+"30071","Norcross","GA","33.940768","-84.2062","-5","1"
+"30072","Pine Lake","GA","33.791505","-84.20642","-5","1"
+"30074","Redan","GA","33.891251","-84.07456","-5","1"
+"30075","Roswell","GA","34.049789","-84.38539","-5","1"
+"30076","Roswell","GA","34.032532","-84.31774","-5","1"
+"30077","Roswell","GA","33.844371","-84.47405","-5","1"
+"30078","Snellville","GA","33.860955","-84.01807","-5","1"
+"30079","Scottdale","GA","33.791537","-84.25994","-5","1"
+"30080","Smyrna","GA","33.87578","-84.50382","-5","1"
+"30081","Smyrna","GA","33.858836","-84.71062","-5","1"
+"30082","Smyrna","GA","33.859137","-84.53744","-5","1"
+"30083","Stone Mountain","GA","33.795622","-84.19771","-5","1"
+"30084","Tucker","GA","33.853853","-84.22036","-5","1"
+"30085","Tucker","GA","33.891251","-84.07456","-5","1"
+"30086","Stone Mountain","GA","33.891251","-84.07456","-5","1"
+"30087","Stone Mountain","GA","33.817438","-84.13167","-5","1"
+"30088","Stone Mountain","GA","33.762106","-84.17938","-5","1"
+"30090","Marietta","GA","33.952451","-84.547082","-5","1"
+"30091","Norcross","GA","33.960353","-84.037859","-5","1"
+"30092","Norcross","GA","33.9692","-84.23261","-5","1"
+"30093","Norcross","GA","33.909952","-84.1794","-5","1"
+"30094","Conyers","GA","33.621906","-84.04633","-5","1"
+"30095","Duluth","GA","34.025598","-84.13045","-5","1"
+"30096","Duluth","GA","33.979401","-84.15118","-5","1"
+"30097","Duluth","GA","34.020621","-84.14294","-5","1"
+"30098","Duluth","GA","33.960353","-84.037859","-5","1"
+"30099","Duluth","GA","33.959535","-84.105011","-5","1"
+"30101","Acworth","GA","34.052285","-84.68483","-5","1"
+"30102","Acworth","GA","34.097998","-84.6183","-5","1"
+"30103","Adairsville","GA","34.368647","-84.92452","-5","1"
+"30104","Aragon","GA","34.065792","-85.07227","-5","1"
+"30105","Armuchee","GA","34.448075","-85.15313","-5","1"
+"30106","Austell","GA","33.828061","-84.62593","-5","1"
+"30107","Ball Ground","GA","34.344939","-84.37204","-5","1"
+"30108","Bowdon","GA","33.533934","-85.26088","-5","1"
+"30109","Bowdon Junction","GA","33.653355","-85.136227","-5","1"
+"30110","Bremen","GA","33.723939","-85.14282","-5","1"
+"30111","Clarkdale","GA","33.912473","-84.557181","-5","1"
+"30113","Buchanan","GA","33.84627","-85.20291","-5","1"
+"30114","Canton","GA","34.228478","-84.50402","-5","1"
+"30115","Canton","GA","34.194029","-84.43884","-5","1"
+"30116","Carrollton","GA","33.560454","-85.02254","-5","1"
+"30117","Carrollton","GA","33.588486","-85.1062","-5","1"
+"30118","Carrollton","GA","33.571176","-85.09612","-5","1"
+"30119","Carrollton","GA","33.618931","-85.073582","-5","1"
+"30120","Cartersville","GA","34.167327","-84.82764","-5","1"
+"30121","Cartersville","GA","34.200264","-84.77533","-5","1"
+"30122","Lithia Springs","GA","33.776137","-84.64484","-5","1"
+"30123","Cassville","GA","34.244179","-84.845684","-5","1"
+"30124","Cave Spring","GA","34.118206","-85.34001","-5","1"
+"30125","Cedartown","GA","34.010162","-85.25762","-5","1"
+"30126","Mableton","GA","33.817738","-84.56087","-5","1"
+"30127","Powder Springs","GA","33.874553","-84.68784","-5","1"
+"30129","Coosa","GA","34.333308","-85.233721","-5","1"
+"30132","Dallas","GA","33.945735","-84.84463","-5","1"
+"30133","Douglasville","GA","33.68966","-84.744595","-5","1"
+"30134","Douglasville","GA","33.769636","-84.74967","-5","1"
+"30135","Douglasville","GA","33.701554","-84.73756","-5","1"
+"30137","Emerson","GA","34.124283","-84.75579","-5","1"
+"30138","Esom Hill","GA","33.99994","-85.172297","-5","1"
+"30139","Fairmount","GA","34.434629","-84.70133","-5","1"
+"30140","Felton","GA","33.88232","-85.234946","-5","1"
+"30141","Hiram","GA","33.867574","-84.77103","-5","1"
+"30142","Holly Springs","GA","34.242944","-84.458326","-5","1"
+"30143","Jasper","GA","34.454934","-84.41583","-5","1"
+"30144","Kennesaw","GA","34.038949","-84.59706","-5","1"
+"30145","Kingston","GA","34.237986","-84.97801","-5","1"
+"30146","Lebanon","GA","34.242944","-84.458326","-5","1"
+"30147","Lindale","GA","34.175095","-85.18084","-5","1"
+"30148","Marble Hill","GA","34.452988","-84.25925","-5","1"
+"30149","Mount Berry","GA","34.280355","-85.182085","-5","1"
+"30150","Mount Zion","GA","33.643002","-85.181782","-5","1"
+"30151","Nelson","GA","34.242944","-84.458326","-5","1"
+"30152","Kennesaw","GA","34.002147","-84.63392","-5","1"
+"30153","Rockmart","GA","33.987497","-85.05508","-5","1"
+"30154","Douglasville","GA","33.68966","-84.744595","-5","1"
+"30157","Dallas","GA","33.892504","-84.8346","-5","1"
+"30161","Rome","GA","34.253343","-85.15312","-5","1"
+"30162","Rome","GA","34.290508","-85.213817","-5","1"
+"30163","Rome","GA","34.333308","-85.233721","-5","1"
+"30164","Rome","GA","34.333308","-85.233721","-5","1"
+"30165","Rome","GA","34.281423","-85.23825","-5","1"
+"30166","Carrollton","GA","33.571329","-85.030663","-5","1"
+"30168","Austell","GA","33.797456","-84.60621","-5","1"
+"30170","Roopville","GA","33.434562","-85.16973","-5","1"
+"30171","Rydal","GA","34.346142","-84.73232","-5","1"
+"30172","Shannon","GA","34.333308","-85.233721","-5","1"
+"30173","Silver Creek","GA","34.145931","-85.14342","-5","1"
+"30175","Talking Rock","GA","34.537611","-84.51135","-5","1"
+"30176","Tallapoosa","GA","33.748838","-85.29304","-5","1"
+"30177","Tate","GA","34.418116","-84.38462","-5","1"
+"30178","Taylorsville","GA","34.113826","-84.97274","-5","1"
+"30179","Temple","GA","33.76324","-85.02667","-5","1"
+"30180","Villa Rica","GA","33.718079","-84.92356","-5","1"
+"30182","Waco","GA","33.658254","-85.23497","-5","1"
+"30183","Waleska","GA","34.332315","-84.577","-5","1"
+"30184","White","GA","34.236128","-84.72539","-5","1"
+"30185","Whitesburg","GA","33.517698","-84.91725","-5","1"
+"30187","Winston","GA","33.670405","-84.83809","-5","1"
+"30188","Woodstock","GA","34.108027","-84.4843","-5","1"
+"30189","Woodstock","GA","34.117565","-84.57176","-5","1"
+"30202","Alpharetta","GA","34.062176","-84.240414","-5","1"
+"30203","Brooks","GA","33.288993","-84.464401","-5","1"
+"30204","Barnesville","GA","33.05413","-84.14862","-5","1"
+"30205","Brooks","GA","33.275707","-84.46706","-5","1"
+"30206","Concord","GA","33.109599","-84.45541","-5","1"
+"30212","Experiment","GA","33.278205","-84.288803","-5","1"
+"30213","Fairburn","GA","33.565662","-84.59321","-5","1"
+"30214","Fayetteville","GA","33.47875","-84.47668","-5","1"
+"30215","Fayetteville","GA","33.40147","-84.46271","-5","1"
+"30216","Flovilla","GA","33.251174","-83.89284","-5","1"
+"30217","Franklin","GA","33.298014","-85.12243","-5","1"
+"30218","Gay","GA","33.121379","-84.58776","-5","1"
+"30219","Glenn","GA","33.157214","-85.170588","-5","1"
+"30220","Grantville","GA","33.230734","-84.82543","-5","1"
+"30222","Greenville","GA","33.034761","-84.73593","-5","1"
+"30223","Griffin","GA","33.268185","-84.27306","-5","1"
+"30224","Griffin","GA","33.215454","-84.25427","-5","1"
+"30228","Hampton","GA","33.401827","-84.30152","-5","1"
+"30229","Haralson","GA","33.232156","-84.56854","-5","1"
+"30230","Hogansville","GA","33.173516","-84.91737","-5","1"
+"30232","Inman","GA","33.403811","-84.504403","-5","1"
+"30233","Jackson","GA","33.294522","-83.97568","-5","1"
+"30234","Jenkinsburg","GA","33.325951","-84.03346","-5","1"
+"30236","Jonesboro","GA","33.528345","-84.33347","-5","1"
+"30237","Jonesboro","GA","33.500697","-84.351273","-5","1"
+"30238","Jonesboro","GA","33.49348","-84.37871","-5","1"
+"30240","Lagrange","GA","33.029838","-85.0745","-5","1"
+"30241","Lagrange","GA","33.036715","-84.98895","-5","1"
+"30248","Locust Grove","GA","33.351277","-84.10645","-5","1"
+"30250","Lovejoy","GA","33.437428","-84.31519","-5","1"
+"30251","Luthersville","GA","33.201986","-84.69943","-5","1"
+"30252","Mcdonough","GA","33.464387","-84.08154","-5","1"
+"30253","Mcdonough","GA","33.455031","-84.17215","-5","1"
+"30256","Meansville","GA","33.015476","-84.32187","-5","1"
+"30257","Milner","GA","33.136567","-84.19386","-5","1"
+"30258","Molena","GA","32.999261","-84.47168","-5","1"
+"30259","Moreland","GA","33.277468","-84.75388","-5","1"
+"30260","Morrow","GA","33.58776","-84.33011","-5","1"
+"30261","Lagrange","GA","33.04567","-85.048995","-5","1"
+"30263","Newnan","GA","33.38779","-84.82536","-5","1"
+"30264","Newnan","GA","33.361003","-84.814173","-5","1"
+"30265","Newnan","GA","33.400875","-84.71206","-5","1"
+"30266","Orchard Hill","GA","33.265656","-84.298964","-5","1"
+"30268","Palmetto","GA","33.527793","-84.69453","-5","1"
+"30269","Peachtree City","GA","33.398992","-84.57062","-5","1"
+"30271","Newnan","GA","33.351401","-84.756109","-5","1"
+"30272","Red Oak","GA","33.625894","-84.516327","-5","1"
+"30273","Rex","GA","33.582877","-84.26906","-5","1"
+"30274","Riverdale","GA","33.555145","-84.40108","-5","1"
+"30275","Sargent","GA","33.431181","-84.86733","-5","1"
+"30276","Senoia","GA","33.281102","-84.58017","-5","1"
+"30277","Sharpsburg","GA","33.387534","-84.65511","-5","1"
+"30281","Stockbridge","GA","33.547578","-84.21809","-5","1"
+"30283","Jackson","GA","33.295159","-83.965099","-5","1"
+"30284","Sunny Side","GA","33.345253","-84.289814","-5","1"
+"30285","The Rock","GA","32.995865","-84.25092","-5","1"
+"30286","Thomaston","GA","32.895794","-84.33084","-5","1"
+"30287","Morrow","GA","33.500697","-84.351273","-5","1"
+"30288","Conley","GA","33.647275","-84.32753","-5","1"
+"30289","Turin","GA","33.32603","-84.637108","-5","1"
+"30290","Tyrone","GA","33.48012","-84.58724","-5","1"
+"30291","Union City","GA","33.580878","-84.54611","-5","1"
+"30292","Williamson","GA","33.169646","-84.37168","-5","1"
+"30293","Woodbury","GA","32.973728","-84.5903","-5","1"
+"30294","Ellenwood","GA","33.639658","-84.26822","-5","1"
+"30295","Zebulon","GA","33.101705","-84.31252","-5","1"
+"30296","Riverdale","GA","33.564711","-84.43987","-5","1"
+"30297","Forest Park","GA","33.615409","-84.36704","-5","1"
+"30298","Forest Park","GA","33.500697","-84.351273","-5","1"
+"30301","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30302","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30303","Atlanta","GA","33.752856","-84.39013","-5","1"
+"30304","Atlanta","GA","33.848196","-84.429296","-5","1"
+"30305","Atlanta","GA","33.830054","-84.38472","-5","1"
+"30306","Atlanta","GA","33.786755","-84.35149","-5","1"
+"30307","Atlanta","GA","33.768205","-84.33786","-5","1"
+"30308","Atlanta","GA","33.771755","-84.38065","-5","1"
+"30309","Atlanta","GA","33.794055","-84.38525","-5","1"
+"30310","Atlanta","GA","33.727807","-84.41983","-5","1"
+"30311","Atlanta","GA","33.724907","-84.47131","-5","1"
+"30312","Atlanta","GA","33.745739","-84.3764","-5","1"
+"30313","Atlanta","GA","33.761223","-84.39599","-5","1"
+"30314","Atlanta","GA","33.758056","-84.42268","-5","1"
+"30315","Atlanta","GA","33.709595","-84.38365","-5","1"
+"30316","Atlanta","GA","33.729506","-84.34087","-5","1"
+"30317","Atlanta","GA","33.750005","-84.31854","-5","1"
+"30318","Atlanta","GA","33.786805","-84.437","-5","1"
+"30319","Atlanta","GA","33.872053","-84.33611","-5","1"
+"30320","Atlanta","GA","33.656824","-84.423648","-5","1"
+"30321","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30322","Atlanta","GA","33.793754","-84.3238","-5","1"
+"30323","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30324","Atlanta","GA","33.818304","-84.35779","-5","1"
+"30325","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30326","Atlanta","GA","33.849853","-84.3606","-5","1"
+"30327","Atlanta","GA","33.86427","-84.41972","-5","1"
+"30328","Atlanta","GA","33.931746","-84.37817","-5","1"
+"30329","Atlanta","GA","33.827554","-84.32355","-5","1"
+"30330","Atlanta","GA","33.707107","-84.432127","-5","1"
+"30331","Atlanta","GA","33.715558","-84.52728","-5","1"
+"30332","Atlanta","GA","33.776305","-84.397976","-5","1"
+"30333","Atlanta","GA","33.891251","-84.07456","-5","1"
+"30334","Atlanta","GA","33.702657","-84.439127","-5","1"
+"30335","Atlanta","GA","33.752406","-84.389676","-5","1"
+"30336","Atlanta","GA","33.744007","-84.56032","-5","1"
+"30337","Atlanta","GA","33.646984","-84.4538","-5","1"
+"30338","Atlanta","GA","33.942751","-84.31769","-5","1"
+"30339","Atlanta","GA","33.87507","-84.46615","-5","1"
+"30340","Atlanta","GA","33.899381","-84.25367","-5","1"
+"30341","Atlanta","GA","33.888102","-84.29321","-5","1"
+"30342","Atlanta","GA","33.879003","-84.37203","-5","1"
+"30343","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30344","Atlanta","GA","33.676258","-84.44977","-5","1"
+"30345","Atlanta","GA","33.851736","-84.28412","-5","1"
+"30346","Atlanta","GA","33.926753","-84.33877","-5","1"
+"30347","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30348","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30349","Atlanta","GA","33.61541","-84.49033","-5","1"
+"30350","Atlanta","GA","33.97285","-84.32775","-5","1"
+"30351","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30353","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30354","Atlanta","GA","33.658834","-84.39682","-5","1"
+"30355","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30356","Atlanta","GA","33.891251","-84.07456","-5","1"
+"30357","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30358","Atlanta","GA","33.998151","-84.34112","-5","1"
+"30359","Atlanta","GA","33.891251","-84.07456","-5","1"
+"30360","Atlanta","GA","33.934536","-84.27215","-5","1"
+"30361","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30362","Atlanta","GA","33.891251","-84.07456","-5","1"
+"30363","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30364","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30365","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30366","Atlanta","GA","33.891251","-84.07456","-5","1"
+"30367","Atlanta","GA","33.789255","-84.387276","-5","1"
+"30368","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30369","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30370","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30371","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30374","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30375","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30376","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30377","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30378","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30379","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30380","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30381","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30384","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30385","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30386","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30387","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30388","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30389","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30390","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30392","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30394","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30396","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30398","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30399","Atlanta","GA","33.844371","-84.47405","-5","1"
+"30401","Swainsboro","GA","32.605196","-82.3391","-5","1"
+"30410","Ailey","GA","32.196136","-82.50985","-5","1"
+"30411","Alamo","GA","32.146031","-82.792","-5","1"
+"30412","Alston","GA","32.083879","-82.47988","-5","1"
+"30413","Bartow","GA","32.884137","-82.50969","-5","1"
+"30414","Bellville","GA","32.15499","-81.97826","-5","1"
+"30415","Brooklet","GA","32.3456","-81.62339","-5","1"
+"30417","Claxton","GA","32.162077","-81.90984","-5","1"
+"30420","Cobbtown","GA","32.301639","-82.11842","-5","1"
+"30421","Collins","GA","32.186824","-82.10699","-5","1"
+"30423","Daisy","GA","32.150061","-81.83478","-5","1"
+"30424","Dover","GA","32.767634","-81.629062","-5","1"
+"30425","Garfield","GA","32.632683","-82.036","-5","1"
+"30426","Girard","GA","33.032445","-81.63251","-5","1"
+"30427","Glennville","GA","31.945767","-81.93594","-5","1"
+"30428","Glenwood","GA","32.190739","-82.69115","-5","1"
+"30429","Hagan","GA","32.159458","-81.93724","-5","1"
+"30434","Louisville","GA","33.008983","-82.378","-5","1"
+"30436","Lyons","GA","32.177508","-82.30448","-5","1"
+"30438","Manassas","GA","32.152792","-82.01301","-5","1"
+"30439","Metter","GA","32.414401","-82.05534","-5","1"
+"30441","Midville","GA","32.792831","-82.23715","-5","1"
+"30442","Millen","GA","32.802448","-81.98381","-5","1"
+"30444","East Point","GA","33.696073","-84.450276","-5","1"
+"30445","Mount Vernon","GA","32.186824","-82.59171","-5","1"
+"30446","Newington","GA","32.567281","-81.48627","-5","1"
+"30447","Norristown","GA","32.505913","-82.49502","-5","1"
+"30448","Nunez","GA","32.49126","-82.36787","-5","1"
+"30449","Oliver","GA","32.528104","-81.533198","-5","1"
+"30450","Portal","GA","32.555659","-81.9242","-5","1"
+"30451","Pulaski","GA","32.414349","-82.086658","-5","1"
+"30452","Register","GA","32.327219","-81.89818","-5","1"
+"30453","Reidsville","GA","32.057356","-82.1214","-5","1"
+"30454","Rockledge","GA","32.432854","-82.72979","-5","1"
+"30455","Rocky Ford","GA","32.697762","-81.81036","-5","1"
+"30456","Sardis","GA","32.969028","-81.79396","-5","1"
+"30457","Soperton","GA","32.387041","-82.58272","-5","1"
+"30458","Statesboro","GA","32.423083","-81.80677","-5","1"
+"30459","Statesboro","GA","32.447036","-81.77772","-5","1"
+"30460","Statesboro","GA","32.41795","-81.78233","-5","1"
+"30461","Statesboro","GA","32.4906","-81.73166","-5","1"
+"30464","Stillmore","GA","32.439708","-82.22278","-5","1"
+"30466","Summertown","GA","32.566594","-82.324475","-5","1"
+"30467","Sylvania","GA","32.754635","-81.63543","-5","1"
+"30470","Tarrytown","GA","32.309128","-82.52255","-5","1"
+"30471","Twin City","GA","32.547214","-82.17048","-5","1"
+"30473","Uvalda","GA","32.03096","-82.48797","-5","1"
+"30474","Vidalia","GA","32.220155","-82.41493","-5","1"
+"30475","Vidalia","GA","32.177513","-82.373889","-5","1"
+"30477","Wadley","GA","32.872098","-82.4023","-5","1"
+"30499","Reidsville","GA","32.050694","-81.998348","-5","1"
+"30501","Gainesville","GA","34.306643","-83.82352","-5","1"
+"30502","Chestnut Mountain","GA","34.212993","-83.794858","-5","1"
+"30503","Gainesville","GA","34.345432","-83.950541","-5","1"
+"30504","Gainesville","GA","34.274355","-83.87003","-5","1"
+"30505","Gainesville","GA","34.306188","-83.838936","-5","1"
+"30506","Gainesville","GA","34.346102","-83.901","-5","1"
+"30507","Gainesville","GA","34.253714","-83.77348","-5","1"
+"30510","Alto","GA","34.455729","-83.58913","-5","1"
+"30511","Baldwin","GA","34.469971","-83.50035","-5","1"
+"30512","Blairsville","GA","34.875556","-84.00419","-5","1"
+"30513","Blue Ridge","GA","34.851171","-84.32905","-5","1"
+"30514","Blairsville","GA","34.903398","-84.019157","-5","1"
+"30515","Buford","GA","33.960353","-84.037859","-5","1"
+"30516","Bowersville","GA","34.370551","-83.05998","-5","1"
+"30517","Braselton","GA","34.121974","-83.78604","-5","1"
+"30518","Buford","GA","34.12115","-84.01804","-5","1"
+"30519","Buford","GA","34.089419","-83.94701","-5","1"
+"30520","Canon","GA","34.338008","-83.09656","-5","1"
+"30521","Carnesville","GA","34.360544","-83.28544","-5","1"
+"30522","Cherrylog","GA","34.801665","-84.37931","-5","1"
+"30523","Clarkesville","GA","34.700311","-83.51879","-5","1"
+"30525","Clayton","GA","34.882362","-83.4156","-5","1"
+"30527","Clermont","GA","34.481514","-83.78599","-5","1"
+"30528","Cleveland","GA","34.595859","-83.76194","-5","1"
+"30529","Commerce","GA","34.210423","-83.46842","-5","1"
+"30530","Commerce","GA","34.209907","-83.38389","-5","1"
+"30531","Cornelia","GA","34.514215","-83.54118","-5","1"
+"30533","Dahlonega","GA","34.542098","-83.99718","-5","1"
+"30534","Dawsonville","GA","34.416521","-84.10849","-5","1"
+"30535","Demorest","GA","34.573072","-83.55992","-5","1"
+"30537","Dillard","GA","34.977198","-83.35161","-5","1"
+"30538","Eastanollee","GA","34.511618","-83.25811","-5","1"
+"30539","East Ellijay","GA","34.680011","-84.47154","-5","1"
+"30540","Ellijay","GA","34.688716","-84.46716","-5","1"
+"30541","Epworth","GA","34.925622","-84.42981","-5","1"
+"30542","Flowery Branch","GA","34.188281","-83.91813","-5","1"
+"30543","Gillsville","GA","34.299459","-83.65226","-5","1"
+"30544","Demorest","GA","34.593092","-83.562922","-5","1"
+"30545","Helen","GA","34.713441","-83.74189","-5","1"
+"30546","Hiawassee","GA","34.923847","-83.7231","-5","1"
+"30547","Homer","GA","34.348822","-83.47738","-5","1"
+"30548","Hoschton","GA","34.097915","-83.77864","-5","1"
+"30549","Jefferson","GA","34.112581","-83.58251","-5","1"
+"30552","Lakemont","GA","34.763553","-83.44201","-5","1"
+"30553","Lavonia","GA","34.450501","-83.09448","-5","1"
+"30554","Lula","GA","34.391688","-83.65979","-5","1"
+"30555","McCaysville","GA","34.977037","-84.39839","-5","1"
+"30557","Martin","GA","34.491829","-83.17539","-5","1"
+"30558","Maysville","GA","34.258054","-83.56058","-5","1"
+"30559","Mineral Bluff","GA","34.949755","-84.28317","-5","1"
+"30560","Morganton","GA","34.887912","-84.2098","-5","1"
+"30562","Mountain City","GA","34.917466","-83.38487","-5","1"
+"30563","Mount Airy","GA","34.549681","-83.47201","-5","1"
+"30564","Murrayville","GA","34.466226","-83.88442","-5","1"
+"30565","Nicholson","GA","34.094345","-83.41617","-5","1"
+"30566","Oakwood","GA","34.236556","-83.89115","-5","1"
+"30567","Pendergrass","GA","34.167309","-83.68536","-5","1"
+"30568","Rabun Gap","GA","34.952452","-83.4073","-5","1"
+"30571","Sautee Nacoochee","GA","34.696896","-83.68012","-5","1"
+"30572","Suches","GA","34.731084","-84.07943","-5","1"
+"30573","Tallulah Falls","GA","34.742007","-83.397716","-5","1"
+"30575","Talmo","GA","34.191571","-83.71124","-5","1"
+"30576","Tiger","GA","34.846806","-83.48178","-5","1"
+"30577","Toccoa","GA","34.561584","-83.31718","-5","1"
+"30580","Turnerville","GA","34.676584","-83.43578","-5","1"
+"30581","Wiley","GA","34.797611","-83.42329","-5","1"
+"30582","Young Harris","GA","34.954638","-83.86484","-5","1"
+"30596","Alto","GA","34.629391","-83.509934","-5","1"
+"30597","Dahlonega","GA","34.527671","-83.980879","-5","1"
+"30598","Toccoa","GA","34.597674","-83.36207","-5","1"
+"30599","Commerce","GA","34.130594","-83.587419","-5","1"
+"30601","Athens","GA","33.979016","-83.36423","-5","1"
+"30602","Athens","GA","33.948432","-83.3749","-5","1"
+"30603","Athens","GA","33.947587","-83.408897","-5","1"
+"30604","Athens","GA","33.944339","-83.38908","-5","1"
+"30605","Athens","GA","33.925085","-83.34529","-5","1"
+"30606","Athens","GA","33.945619","-83.41732","-5","1"
+"30607","Athens","GA","34.013154","-83.43565","-5","1"
+"30608","Athens","GA","33.944339","-83.38908","-5","1"
+"30609","Athens","GA","33.946364","-83.37743","-5","1"
+"30610","Athens","GA","33.944339","-83.38908","-5","1"
+"30612","Athens","GA","33.944339","-83.38908","-5","1"
+"30613","Athens","GA","33.962364","-83.39828","-5","1"
+"30619","Arnoldsville","GA","33.863663","-83.24825","-5","1"
+"30620","Bethlehem","GA","33.928949","-83.73524","-5","1"
+"30621","Bishop","GA","33.804849","-83.48164","-5","1"
+"30622","Bogart","GA","33.927792","-83.51552","-5","1"
+"30623","Bostwick","GA","33.754235","-83.511055","-5","1"
+"30624","Bowman","GA","34.193943","-83.03375","-5","1"
+"30625","Buckhead","GA","33.527207","-83.34676","-5","1"
+"30627","Carlton","GA","33.994139","-82.97819","-5","1"
+"30628","Colbert","GA","34.041416","-83.21997","-5","1"
+"30629","Comer","GA","34.072573","-83.11913","-5","1"
+"30630","Crawford","GA","33.892957","-83.15548","-5","1"
+"30631","Crawfordville","GA","33.570317","-82.88542","-5","1"
+"30633","Danielsville","GA","34.17085","-83.24654","-5","1"
+"30634","Dewy Rose","GA","34.212836","-82.94112","-5","1"
+"30635","Elberton","GA","34.119972","-82.825","-5","1"
+"30638","Farmington","GA","33.775001","-83.42456","-5","1"
+"30639","Franklin Springs","GA","34.281721","-83.14746","-5","1"
+"30641","Good Hope","GA","33.766057","-83.57597","-5","1"
+"30642","Greensboro","GA","33.547041","-83.19797","-5","1"
+"30643","Hartwell","GA","34.366948","-82.9201","-5","1"
+"30645","High Shoals","GA","33.801274","-83.516374","-5","1"
+"30646","Hull","GA","34.065588","-83.31318","-5","1"
+"30647","Ila","GA","34.120239","-83.288117","-5","1"
+"30648","Lexington","GA","33.863779","-83.06063","-5","1"
+"30650","Madison","GA","33.588436","-83.47936","-5","1"
+"30652","Greensboro","GA","33.559342","-83.364156","-5","1"
+"30655","Monroe","GA","33.786041","-83.69901","-5","1"
+"30656","Monroe","GA","33.857423","-83.71899","-5","1"
+"30660","Rayle","GA","33.775127","-82.94624","-5","1"
+"30662","Royston","GA","34.270167","-83.12842","-5","1"
+"30663","Rutledge","GA","33.614556","-83.61157","-5","1"
+"30664","Sharon","GA","33.560693","-82.80015","-5","1"
+"30665","Siloam","GA","33.535009","-83.07787","-5","1"
+"30666","Statham","GA","33.957713","-83.58491","-5","1"
+"30667","Stephens","GA","33.784316","-83.16666","-5","1"
+"30668","Tignall","GA","33.912362","-82.6684","-5","1"
+"30669","Union Point","GA","33.652489","-83.08857","-5","1"
+"30671","Maxeys","GA","33.748344","-83.18538","-5","1"
+"30673","Washington","GA","33.728754","-82.72612","-5","1"
+"30677","Watkinsville","GA","33.849286","-83.41232","-5","1"
+"30678","White Plains","GA","33.46171","-83.05852","-5","1"
+"30680","Winder","GA","33.992538","-83.71061","-5","1"
+"30683","Winterville","GA","33.954047","-83.2673","-5","1"
+"30701","Calhoun","GA","34.4966","-84.93798","-5","1"
+"30703","Calhoun","GA","34.479066","-84.762161","-5","1"
+"30705","Chatsworth","GA","34.753129","-84.77502","-5","1"
+"30707","Chickamauga","GA","34.827019","-85.32883","-5","1"
+"30708","Cisco","GA","34.945576","-84.7113","-5","1"
+"30710","Cohutta","GA","34.935105","-84.94642","-5","1"
+"30711","Crandall","GA","34.93882","-84.76558","-5","1"
+"30716","Tallapoosa","GA","33.744222","-85.286982","-5","1"
+"30719","Dalton","GA","34.801861","-84.989796","-5","1"
+"30720","Dalton","GA","34.766095","-84.9865","-5","1"
+"30721","Dalton","GA","34.780699","-84.93994","-5","1"
+"30722","Dalton","GA","34.759522","-84.951261","-5","1"
+"30724","Eton","GA","34.822176","-84.75967","-5","1"
+"30725","Flintstone","GA","34.932348","-85.35064","-5","1"
+"30726","Graysville","GA","34.975939","-85.1416","-5","1"
+"30728","La Fayette","GA","34.696201","-85.25824","-5","1"
+"30730","Lyerly","GA","34.376063","-85.4043","-5","1"
+"30731","Menlo","GA","34.553485","-85.47893","-5","1"
+"30732","Oakman","GA","34.569015","-84.711863","-5","1"
+"30733","Plainville","GA","34.409661","-85.03345","-5","1"
+"30734","Ranger","GA","34.531444","-84.69955","-5","1"
+"30735","Resaca","GA","34.604648","-84.91926","-5","1"
+"30736","Ringgold","GA","34.916552","-85.14435","-5","1"
+"30738","Rising Fawn","GA","34.793833","-85.49945","-5","1"
+"30739","Rock Spring","GA","34.801988","-85.21956","-5","1"
+"30740","Rocky Face","GA","34.757918","-85.05879","-5","1"
+"30741","Rossville","GA","34.96311","-85.27405","-5","1"
+"30742","Fort Oglethorpe","GA","34.948979","-85.25212","-5","1"
+"30746","Sugar Valley","GA","34.574804","-85.02482","-5","1"
+"30747","Summerville","GA","34.489848","-85.32928","-5","1"
+"30750","Lookout Mountain","GA","34.957134","-85.37183","-5","1"
+"30751","Tennga","GA","34.981449","-84.735233","-5","1"
+"30752","Trenton","GA","34.895625","-85.52702","-5","1"
+"30753","Trion","GA","34.558404","-85.30301","-5","1"
+"30754","Summerville","GA","34.484483","-85.345544","-5","1"
+"30755","Tunnel Hill","GA","34.85973","-85.03867","-5","1"
+"30756","Varnell","GA","34.9298","-84.988536","-5","1"
+"30757","Wildwood","GA","34.954188","-85.43232","-5","1"
+"30802","Appling","GA","33.620669","-82.30514","-5","1"
+"30803","Avera","GA","33.163467","-82.52017","-5","1"
+"30805","Blythe","GA","33.297318","-82.21503","-5","1"
+"30806","Boneville","GA","33.527993","-82.5104","-5","1"
+"30807","Camak","GA","33.453039","-82.64828","-5","1"
+"30808","Dearing","GA","33.397137","-82.40335","-5","1"
+"30809","Evans","GA","33.551145","-82.13949","-5","1"
+"30810","Gibson","GA","33.236721","-82.58135","-5","1"
+"30811","Gough","GA","33.050487","-81.929165","-5","1"
+"30812","Gracewood","GA","33.386041","-82.090996","-5","1"
+"30813","Grovetown","GA","33.459489","-82.20102","-5","1"
+"30814","Harlem","GA","33.42359","-82.31013","-5","1"
+"30815","Hephzibah","GA","33.32157","-82.08872","-5","1"
+"30816","Keysville","GA","33.16249","-82.18933","-5","1"
+"30817","Lincolnton","GA","33.765566","-82.43899","-5","1"
+"30818","Matthews","GA","33.244829","-82.32636","-5","1"
+"30819","Mesena","GA","33.432384","-82.625213","-5","1"
+"30820","Mitchell","GA","33.224199","-82.713","-5","1"
+"30821","Norwood","GA","33.477946","-82.73454","-5","1"
+"30822","Perkins","GA","32.914843","-81.87901","-5","1"
+"30823","Stapleton","GA","33.234802","-82.46303","-5","1"
+"30824","Thomson","GA","33.490536","-82.5028","-5","1"
+"30828","Warrenton","GA","33.399555","-82.65655","-5","1"
+"30830","Waynesboro","GA","33.080965","-81.9944","-5","1"
+"30833","Wrens","GA","33.200325","-82.37625","-5","1"
+"30881","Atlanta","GA","33.793006","-84.504081","-5","1"
+"30901","Augusta","GA","33.461121","-81.97265","-5","1"
+"30903","Augusta","GA","33.386041","-82.090996","-5","1"
+"30904","Augusta","GA","33.474136","-82.01018","-5","1"
+"30905","Augusta","GA","33.417282","-82.14435","-5","1"
+"30906","Augusta","GA","33.387089","-82.01237","-5","1"
+"30907","Augusta","GA","33.512541","-82.09491","-5","1"
+"30909","Augusta","GA","33.475936","-82.0697","-5","1"
+"30910","Augusta","GA","33.386041","-82.090996","-5","1"
+"30911","Augusta","GA","33.386041","-82.090996","-5","1"
+"30912","Augusta","GA","33.386041","-82.090996","-5","1"
+"30913","Augusta","GA","33.386041","-82.090996","-5","1"
+"30914","Augusta","GA","33.386041","-82.090996","-5","1"
+"30916","Augusta","GA","33.386041","-82.090996","-5","1"
+"30917","Augusta","GA","33.527678","-82.235542","-5","1"
+"30919","Augusta","GA","33.386041","-82.090996","-5","1"
+"30999","Augusta","GA","33.386041","-82.090996","-5","1"
+"31001","Abbeville","GA","31.972626","-83.33082","-5","1"
+"31002","Adrian","GA","32.549854","-82.56948","-5","1"
+"31003","Allentown","GA","32.600622","-83.22096","-5","1"
+"31004","Bolingbroke","GA","32.946971","-83.800628","-5","1"
+"31005","Bonaire","GA","32.556668","-83.62435","-5","1"
+"31006","Butler","GA","32.563544","-84.2461","-5","1"
+"31007","Byromville","GA","32.199721","-83.91327","-5","1"
+"31008","Byron","GA","32.652313","-83.75918","-5","1"
+"31009","Cadwell","GA","32.309003","-83.02647","-5","1"
+"31010","Cordele","GA","31.917178","-83.785365","-5","1"
+"31011","Chauncey","GA","32.108676","-83.06006","-5","1"
+"31012","Chester","GA","32.396381","-83.16892","-5","1"
+"31013","Clinchfield","GA","32.338639","-83.692562","-5","1"
+"31014","Cochran","GA","32.397039","-83.3404","-5","1"
+"31015","Cordele","GA","31.950899","-83.77808","-5","1"
+"31016","Culloden","GA","32.861386","-84.11732","-5","1"
+"31017","Danville","GA","32.600844","-83.24549","-5","1"
+"31018","Davisboro","GA","32.976548","-82.61607","-5","1"
+"31019","Dexter","GA","32.427633","-83.05632","-5","1"
+"31020","Dry Branch","GA","32.719907","-83.4905","-5","1"
+"31021","Dublin","GA","32.526359","-82.93375","-5","1"
+"31022","Dudley","GA","32.516865","-83.09905","-5","1"
+"31023","Eastman","GA","32.193953","-83.1848","-5","1"
+"31024","Eatonton","GA","33.318579","-83.35432","-5","1"
+"31025","Elko","GA","32.335147","-83.74571","-5","1"
+"31027","Dublin","GA","32.569122","-82.80959","-5","1"
+"31028","Centerville","GA","32.632111","-83.67795","-5","1"
+"31029","Forsyth","GA","33.0409","-83.92941","-5","1"
+"31030","Fort Valley","GA","32.55568","-83.88641","-5","1"
+"31031","Gordon","GA","32.891499","-83.32748","-5","1"
+"31032","Gray","GA","33.003455","-83.55078","-5","1"
+"31033","Haddock","GA","33.053288","-83.43902","-5","1"
+"31034","Hardwick","GA","33.040103","-83.2182","-5","1"
+"31035","Harrison","GA","32.835471","-82.70761","-5","1"
+"31036","Hawkinsville","GA","32.270314","-83.48517","-5","1"
+"31037","Helena","GA","32.094127","-82.91713","-5","1"
+"31038","Hillsboro","GA","33.172786","-83.63554","-5","1"
+"31039","Howard","GA","32.587537","-84.3895","-5","1"
+"31040","Dublin","GA","32.540073","-82.914974","-5","1"
+"31041","Ideal","GA","32.371371","-84.18258","-5","1"
+"31042","Irwinton","GA","32.7615","-83.1612","-5","1"
+"31044","Jeffersonville","GA","32.630784","-83.37027","-5","1"
+"31045","Jewell","GA","33.285774","-82.7749","-5","1"
+"31046","Juliette","GA","33.054591","-83.78583","-5","1"
+"31047","Kathleen","GA","32.509384","-83.64773","-5","1"
+"31049","Kite","GA","32.69992","-82.51381","-5","1"
+"31050","Knoxville","GA","32.742085","-83.94646","-5","1"
+"31051","Lilly","GA","32.148624","-83.88003","-5","1"
+"31052","Lizella","GA","32.788484","-83.80726","-5","1"
+"31054","McIntyre","GA","32.875574","-83.19785","-5","1"
+"31055","McRae","GA","32.045313","-82.8916","-5","1"
+"31057","Marshallville","GA","32.446656","-83.93413","-5","1"
+"31058","Mauk","GA","32.498727","-84.42804","-5","1"
+"31060","Milan","GA","32.003035","-83.06337","-5","1"
+"31061","Milledgeville","GA","33.083579","-83.23397","-5","1"
+"31062","Milledgeville","GA","33.087138","-83.22492","-5","1"
+"31063","Montezuma","GA","32.293293","-83.98913","-5","1"
+"31064","Monticello","GA","33.319093","-83.70862","-5","1"
+"31065","Montrose","GA","32.564036","-83.16019","-5","1"
+"31066","Musella","GA","32.799959","-84.00588","-5","1"
+"31067","Oconee","GA","32.860031","-82.95019","-5","1"
+"31068","Oglethorpe","GA","32.329164","-84.07988","-5","1"
+"31069","Perry","GA","32.460791","-83.73541","-5","1"
+"31070","Pinehurst","GA","32.185677","-83.76348","-5","1"
+"31071","Pineview","GA","32.13702","-83.52604","-5","1"
+"31072","Pitts","GA","31.951839","-83.56747","-5","1"
+"31073","Plainfield","GA","32.176429","-83.122891","-5","1"
+"31075","Rentz","GA","32.370333","-82.96091","-5","1"
+"31076","Reynolds","GA","32.54748","-84.10042","-5","1"
+"31077","Rhine","GA","31.953407","-83.18058","-5","1"
+"31078","Roberta","GA","32.702635","-84.03811","-5","1"
+"31079","Rochelle","GA","31.933079","-83.45722","-5","1"
+"31081","Rupert","GA","32.419094","-84.28475","-5","1"
+"31082","Sandersville","GA","32.984529","-82.8375","-5","1"
+"31083","Scotland","GA","32.046427","-82.81923","-5","1"
+"31084","Seville","GA","31.989039","-83.394574","-5","1"
+"31085","Shady Dale","GA","33.421694","-83.61433","-5","1"
+"31086","Smarr","GA","32.989503","-83.876108","-5","1"
+"31087","Sparta","GA","33.260235","-83.00647","-5","1"
+"31088","Warner Robins","GA","32.594698","-83.64873","-5","1"
+"31089","Tennille","GA","32.89115","-82.82775","-5","1"
+"31090","Toomsboro","GA","32.801223","-83.06671","-5","1"
+"31091","Unadilla","GA","32.24473","-83.72075","-5","1"
+"31092","Vienna","GA","32.091578","-83.79311","-5","1"
+"31093","Warner Robins","GA","32.638316","-83.64332","-5","1"
+"31094","Warthen","GA","33.125097","-82.81018","-5","1"
+"31095","Warner Robins","GA","32.487403","-83.669655","-5","1"
+"31096","Wrightsville","GA","32.71732","-82.68926","-5","1"
+"31097","Yatesville","GA","32.912207","-84.14812","-5","1"
+"31098","Warner Robins","GA","32.614742","-83.59829","-5","1"
+"31099","Warner Robins","GA","32.646236","-83.6513","-5","1"
+"31106","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31107","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31119","Atlanta","GA","33.891251","-84.07456","-5","1"
+"31126","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31131","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31139","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31141","Atlanta","GA","33.891251","-84.07456","-5","1"
+"31145","Atlanta","GA","33.891251","-84.07456","-5","1"
+"31146","Atlanta","GA","33.891251","-84.07456","-5","1"
+"31150","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31156","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31191","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31192","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31193","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31195","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31196","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31197","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31198","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31199","Atlanta","GA","33.844371","-84.47405","-5","1"
+"31201","Macon","GA","32.830839","-83.63529","-5","1"
+"31202","Macon","GA","32.806707","-83.691315","-5","1"
+"31203","Macon","GA","32.806707","-83.691315","-5","1"
+"31204","Macon","GA","32.844872","-83.67119","-5","1"
+"31205","Macon","GA","32.806707","-83.691315","-5","1"
+"31206","Macon","GA","32.79904","-83.67216","-5","1"
+"31207","Macon","GA","32.830389","-83.648552","-5","1"
+"31208","Macon","GA","32.806707","-83.691315","-5","1"
+"31209","Macon","GA","32.806707","-83.691315","-5","1"
+"31210","Macon","GA","32.88899","-83.72204","-5","1"
+"31211","Macon","GA","32.878304","-83.59963","-5","1"
+"31212","Macon","GA","32.806707","-83.691315","-5","1"
+"31213","Macon","GA","32.839289","-83.638752","-5","1"
+"31216","Macon","GA","32.730641","-83.6793","-5","1"
+"31217","Macon","GA","32.839005","-83.56749","-5","1"
+"31220","Macon","GA","32.862246","-83.78665","-5","1"
+"31221","Macon","GA","32.806707","-83.691315","-5","1"
+"31267","Cecil","GA","31.046761","-83.395669","-5","1"
+"31294","Macon","GA","32.806707","-83.691315","-5","1"
+"31295","Macon","GA","32.810189","-83.569001","-5","1"
+"31296","Macon","GA","32.806707","-83.691315","-5","1"
+"31297","Macon","GA","32.70045","-83.657207","-5","1"
+"31298","Macon","GA","32.87333","-83.708399","-5","1"
+"31299","Macon","GA","32.806707","-83.691315","-5","1"
+"31301","Allenhurst","GA","31.764663","-81.6098","-5","1"
+"31302","Bloomingdale","GA","32.129474","-81.33121","-5","1"
+"31303","Clyo","GA","32.508239","-81.3128","-5","1"
+"31304","Crescent","GA","31.495071","-81.381908","-5","1"
+"31305","Darien","GA","31.407598","-81.39094","-5","1"
+"31307","Eden","GA","32.183211","-81.39979","-5","1"
+"31308","Ellabell","GA","32.172661","-81.48447","-5","1"
+"31309","Fleming","GA","31.873145","-81.42676","-5","1"
+"31310","Hinesville","GA","31.806832","-81.437074","-5","1"
+"31312","Guyton","GA","32.313816","-81.3908","-5","1"
+"31313","Hinesville","GA","31.828575","-81.61617","-5","1"
+"31314","Fort Stewart","GA","31.868699","-81.61083","-5","1"
+"31315","Fort Stewart","GA","31.886944","-81.60109","-5","1"
+"31316","Ludowici","GA","31.74991","-81.75813","-5","1"
+"31318","Meldrim","GA","32.141974","-81.37892","-5","1"
+"31319","Meridian","GA","31.478486","-81.34528","-5","1"
+"31320","Midway","GA","31.788811","-81.37637","-5","1"
+"31321","Pembroke","GA","32.163245","-81.64211","-5","1"
+"31322","Pooler","GA","32.110421","-81.24568","-5","1"
+"31323","Riceboro","GA","31.658252","-81.48778","-5","1"
+"31324","Richmond Hill","GA","31.906365","-81.3108","-5","1"
+"31326","Rincon","GA","32.293147","-81.23006","-5","1"
+"31327","Sapelo Island","GA","31.423776","-81.27064","-5","1"
+"31328","Tybee Island","GA","32.006672","-80.84937","-5","1"
+"31329","Springfield","GA","32.390879","-81.32427","-5","1"
+"31331","Townsend","GA","31.547412","-81.3862","-5","1"
+"31332","Valona","GA","31.495071","-81.381908","-5","1"
+"31333","Walthourville","GA","31.77789","-81.64534","-5","1"
+"31337","Lenox","GA","31.271852","-83.459054","-5","1"
+"31401","Savannah","GA","32.068658","-81.09258","-5","1"
+"31402","Savannah","GA","31.971394","-81.07156","-5","1"
+"31403","Savannah","GA","31.971394","-81.07156","-5","1"
+"31404","Savannah","GA","32.046143","-81.06724","-5","1"
+"31405","Savannah","GA","32.043058","-81.12183","-5","1"
+"31406","Savannah","GA","31.988676","-81.09116","-5","1"
+"31407","Savannah","GA","32.162963","-81.17233","-5","1"
+"31408","Savannah","GA","32.106705","-81.16915","-5","1"
+"31409","Savannah","GA","31.971394","-81.07156","-5","1"
+"31410","Savannah","GA","32.022019","-80.99193","-5","1"
+"31411","Savannah","GA","31.927434","-81.0425","-5","1"
+"31412","Savannah","GA","31.971394","-81.07156","-5","1"
+"31414","Savannah","GA","31.971394","-81.07156","-5","1"
+"31415","Savannah","GA","32.075806","-81.12002","-5","1"
+"31416","Savannah","GA","32.005255","-81.047711","-5","1"
+"31418","Savannah","GA","31.971394","-81.07156","-5","1"
+"31419","Savannah","GA","31.986249","-81.20259","-5","1"
+"31420","Savannah","GA","31.971394","-81.07156","-5","1"
+"31421","Savannah","GA","31.971394","-81.07156","-5","1"
+"31422","Savannah","GA","31.971394","-81.07156","-5","1"
+"31424","Richmond Hill","GA","31.919866","-81.325815","-5","1"
+"31441","Savannah","GA","32.008183","-81.101502","-5","1"
+"31498","Savannah","GA","31.971394","-81.07156","-5","1"
+"31499","Savannah","GA","31.971394","-81.07156","-5","1"
+"31501","Waycross","GA","31.220059","-82.35133","-5","1"
+"31502","Waycross","GA","31.018954","-82.416543","-5","1"
+"31503","Waycross","GA","31.205194","-82.37534","-5","1"
+"31507","Marshallville","GA","32.452926","-83.944336","-5","1"
+"31510","Alma","GA","31.551458","-82.44618","-5","1"
+"31512","Ambrose","GA","31.57344","-83.01502","-5","1"
+"31513","Baxley","GA","31.768849","-82.35198","-5","1"
+"31515","Baxley","GA","31.717717","-82.299677","-5","1"
+"31516","Blackshear","GA","31.307234","-82.25779","-5","1"
+"31518","Bristol","GA","31.513511","-82.18481","-5","1"
+"31519","Broxton","GA","31.67654","-82.88991","-5","1"
+"31520","Brunswick","GA","31.166786","-81.49213","-5","1"
+"31521","Brunswick","GA","31.241505","-81.532489","-5","1"
+"31522","Saint Simons Island","GA","31.176516","-81.3802","-5","1"
+"31523","Brunswick","GA","31.212705","-81.60975","-5","1"
+"31524","Brunswick","GA","31.221995","-81.482551","-5","1"
+"31525","Brunswick","GA","31.260995","-81.49832","-5","1"
+"31527","Jekyll Island","GA","31.06419","-81.42072","-5","1"
+"31532","Denton","GA","31.718382","-82.73595","-5","1"
+"31533","Douglas","GA","31.522042","-82.84153","-5","1"
+"31534","Douglas","GA","31.571596","-82.854631","-5","1"
+"31535","Douglas","GA","31.464973","-82.86325","-5","1"
+"31537","Folkston","GA","30.860915","-82.02194","-5","1"
+"31539","Hazlehurst","GA","31.844772","-82.59809","-5","1"
+"31542","Hoboken","GA","31.1747","-82.13812","-5","1"
+"31543","Hortense","GA","31.320167","-81.85818","-5","1"
+"31544","Jacksonville","GA","31.840974","-82.96137","-5","1"
+"31545","Jesup","GA","31.636895","-81.90843","-5","1"
+"31546","Jesup","GA","31.575166","-81.86481","-5","1"
+"31547","Kings Bay","GA","30.804684","-81.627717","-5","1"
+"31548","Kingsland","GA","30.793409","-81.68428","-5","1"
+"31549","Lumber City","GA","31.928525","-82.69332","-5","1"
+"31550","Manor","GA","31.101953","-82.58299","-5","1"
+"31551","Mershon","GA","31.496025","-82.27322","-5","1"
+"31552","Millwood","GA","31.281103","-82.6201","-5","1"
+"31553","Nahunta","GA","31.17326","-81.97244","-5","1"
+"31554","Nicholls","GA","31.495983","-82.62928","-5","1"
+"31555","Odum","GA","31.670475","-82.04944","-5","1"
+"31556","Offerman","GA","31.412649","-82.115541","-5","1"
+"31557","Patterson","GA","31.372403","-82.10743","-5","1"
+"31558","Saint Marys","GA","30.761081","-81.56912","-5","1"
+"31560","Screven","GA","31.515981","-82.04908","-5","1"
+"31561","Sea Island","GA","31.198914","-81.332211","-5","1"
+"31563","Surrency","GA","31.715778","-82.19784","-5","1"
+"31564","Waresboro","GA","31.018954","-82.416543","-5","1"
+"31565","Waverly","GA","31.066479","-81.62656","-5","1"
+"31566","Waynesville","GA","31.144635","-81.83011","-5","1"
+"31567","West Green","GA","31.631943","-82.71829","-5","1"
+"31568","White Oak","GA","31.003385","-81.79512","-5","1"
+"31569","Woodbine","GA","30.915778","-81.67924","-5","1"
+"31598","Jesup","GA","31.578181","-81.880222","-5","1"
+"31599","Jesup","GA","31.578181","-81.880222","-5","1"
+"31601","Valdosta","GA","30.807279","-83.28661","-5","1"
+"31602","Valdosta","GA","30.866613","-83.30078","-5","1"
+"31603","Valdosta","GA","30.827965","-83.252192","-5","1"
+"31604","Valdosta","GA","30.827965","-83.252192","-5","1"
+"31605","Valdosta","GA","30.92205","-83.25332","-5","1"
+"31606","Valdosta","GA","30.802411","-83.19624","-5","1"
+"31607","Valdosta","GA","30.831442","-83.318647","-5","1"
+"31610","Sparks","GA","31.172669","-83.439433","-5","1"
+"31620","Adel","GA","31.133004","-83.42736","-5","1"
+"31622","Alapaha","GA","31.379665","-83.21803","-5","1"
+"31623","Argyle","GA","31.071563","-82.65232","-5","1"
+"31624","Axson","GA","31.297883","-82.71029","-5","1"
+"31625","Barney","GA","31.003274","-83.5282","-5","1"
+"31626","Boston","GA","30.782963","-83.78882","-5","1"
+"31627","Cecil","GA","31.047996","-83.39135","-5","1"
+"31629","Dixie","GA","30.802821","-83.69126","-5","1"
+"31630","Du Pont","GA","30.96373","-82.86455","-5","1"
+"31631","Fargo","GA","30.680867","-82.58028","-5","1"
+"31632","Hahira","GA","30.991859","-83.36415","-5","1"
+"31634","Homerville","GA","31.062818","-82.72399","-5","1"
+"31635","Lakeland","GA","31.055578","-83.07103","-5","1"
+"31636","Lake Park","GA","30.72289","-83.13302","-5","1"
+"31637","Lenox","GA","31.291612","-83.45328","-5","1"
+"31638","Morven","GA","30.935087","-83.50211","-5","1"
+"31639","Nashville","GA","31.199","-83.2188","-5","1"
+"31641","Naylor","GA","30.934298","-83.08841","-5","1"
+"31642","Pearson","GA","31.27291","-82.83342","-5","1"
+"31643","Quitman","GA","30.783639","-83.55343","-5","1"
+"31645","Ray City","GA","31.070627","-83.20286","-5","1"
+"31646","Saint George","GA","30.518903","-82.08063","-5","1"
+"31647","Sparks","GA","31.183567","-83.43559","-5","1"
+"31648","Statenville","GA","30.703175","-83.02568","-5","1"
+"31649","Stockton","GA","30.957421","-83.00524","-5","1"
+"31650","Willacoochee","GA","31.375165","-83.01949","-5","1"
+"31659","Nashville","GA","31.205388","-83.246084","-5","1"
+"31698","Valdosta","GA","30.84848","-83.287753","-5","1"
+"31699","Valdosta","GA","30.965263","-83.19316","-5","1"
+"31700","Albany","GA","31.564274","-84.165407","-5","1"
+"31701","Albany","GA","31.580774","-84.16044","-5","1"
+"31702","Albany","GA","31.594782","-84.194812","-5","1"
+"31703","Albany","GA","31.543065","-84.219594","-5","1"
+"31704","Albany","GA","31.549975","-84.061155","-5","1"
+"31705","Albany","GA","31.552483","-84.09678","-5","1"
+"31706","Albany","GA","31.559274","-84.176507","-5","1"
+"31707","Albany","GA","31.568073","-84.22644","-5","1"
+"31708","Albany","GA","31.591073","-84.132357","-5","1"
+"31709","Americus","GA","32.071641","-84.21942","-5","1"
+"31710","Americus","GA","32.051235","-84.181547","-5","1"
+"31711","Andersonville","GA","32.195361","-84.137","-5","1"
+"31712","Arabi","GA","31.836577","-83.72045","-5","1"
+"31713","Arlington","GA","31.427845","-84.71025","-5","1"
+"31714","Ashburn","GA","31.709742","-83.66519","-5","1"
+"31715","Attapulgus","GA","30.743234","-84.48229","-5","1"
+"31716","Baconton","GA","31.3709","-84.12921","-5","1"
+"31717","Bainbridge","GA","30.884525","-84.58951","-5","1"
+"31718","Bainbridge","GA","30.901863","-84.570049","-5","1"
+"31719","Americus","GA","32.085491","-84.252665","-5","1"
+"31720","Barwick","GA","30.890906","-83.73816","-5","1"
+"31721","Albany","GA","31.56889","-84.248211","-5","1"
+"31722","Berlin","GA","31.067313","-83.62288","-5","1"
+"31723","Blakely","GA","31.334337","-84.94899","-5","1"
+"31724","Bluffton","GA","31.528299","-84.86025","-5","1"
+"31725","Brinson","GA","30.945016","-84.72284","-5","1"
+"31726","Bronwood","GA","31.832214","-84.35727","-5","1"
+"31727","Brookfield","GA","31.44172","-83.503715","-5","1"
+"31728","Cairo","GA","30.87039","-84.21343","-5","1"
+"31729","Calvary","GA","30.729915","-84.34762","-5","1"
+"31730","Camilla","GA","31.209854","-84.23667","-5","1"
+"31732","Cedar Springs","GA","31.169794","-85.0557","-5","1"
+"31733","Chula","GA","31.592199","-83.48004","-5","1"
+"31734","Climax","GA","30.88096","-84.42415","-5","1"
+"31735","Cobb","GA","31.959367","-83.96028","-5","1"
+"31736","Coleman","GA","31.650442","-84.87908","-5","1"
+"31737","Colquitt","GA","31.152253","-84.69653","-5","1"
+"31738","Coolidge","GA","31.012042","-83.87218","-5","1"
+"31739","Cotton","GA","31.260443","-84.253089","-5","1"
+"31740","Cuthbert","GA","31.781815","-84.76444","-5","1"
+"31741","Damascus","GA","31.299009","-84.68772","-5","1"
+"31742","Dawson","GA","31.756995","-84.43357","-5","1"
+"31743","De Soto","GA","31.930451","-84.02921","-5","1"
+"31744","Doerun","GA","31.325004","-83.90937","-5","1"
+"31745","Donalsonville","GA","30.974364","-84.87703","-5","1"
+"31746","Edison","GA","31.563327","-84.75869","-5","1"
+"31747","Ellenton","GA","31.176563","-83.58801","-5","1"
+"31749","Enigma","GA","31.439212","-83.34041","-5","1"
+"31750","Fitzgerald","GA","31.720029","-83.25093","-5","1"
+"31751","Fort Gaines","GA","31.631333","-85.03241","-5","1"
+"31752","Fowlstown","GA","30.803291","-84.54711","-5","1"
+"31753","Funston","GA","31.205365","-83.877554","-5","1"
+"31754","Georgetown","GA","31.860476","-85.07534","-5","1"
+"31756","Hartsfield","GA","31.177174","-83.96555","-5","1"
+"31757","Thomasville","GA","30.883208","-83.91237","-5","1"
+"31758","Thomasville","GA","30.868187","-83.927785","-5","1"
+"31759","Iron City","GA","31.011595","-84.80242","-5","1"
+"31760","Irwinville","GA","31.706283","-83.408633","-5","1"
+"31761","Jakin","GA","31.113122","-85.00251","-5","1"
+"31762","Leary","GA","31.454628","-84.51726","-5","1"
+"31763","Leesburg","GA","31.714526","-84.16931","-5","1"
+"31764","Leslie","GA","31.98309","-84.06866","-5","1"
+"31765","Meigs","GA","31.082141","-84.05767","-5","1"
+"31766","Morgan","GA","31.575228","-84.59849","-5","1"
+"31767","Morris","GA","31.834324","-84.94739","-5","1"
+"31768","Moultrie","GA","31.165358","-83.77172","-5","1"
+"31769","Mystic","GA","31.620866","-83.249754","-5","1"
+"31770","Newton","GA","31.33349","-84.36269","-5","1"
+"31771","Norman Park","GA","31.256287","-83.66005","-5","1"
+"31772","Oakfield","GA","31.723178","-83.9628","-5","1"
+"31773","Ochlocknee","GA","30.977162","-84.0615","-5","1"
+"31774","Ocilla","GA","31.586426","-83.27583","-5","1"
+"31775","Omega","GA","31.334062","-83.59971","-5","1"
+"31776","Moultrie","GA","31.172696","-83.792379","-5","1"
+"31777","Parrott","GA","31.905462","-84.51526","-5","1"
+"31778","Pavo","GA","30.966781","-83.72075","-5","1"
+"31779","Pelham","GA","31.117271","-84.15678","-5","1"
+"31780","Plains","GA","32.026125","-84.39361","-5","1"
+"31781","Poulan","GA","31.526584","-83.79025","-5","1"
+"31782","Putney","GA","31.543065","-84.219594","-5","1"
+"31783","Rebecca","GA","31.767986","-83.47325","-5","1"
+"31784","Sale City","GA","31.258794","-84.02897","-5","1"
+"31785","Sasser","GA","31.689973","-84.32748","-5","1"
+"31786","Shellman","GA","31.72952","-84.60173","-5","1"
+"31787","Smithville","GA","31.901066","-84.25037","-5","1"
+"31788","White House","TN","31.138011","-83.716729","-5","1"
+"31789","Sumner","GA","31.484091","-83.73515","-5","1"
+"31790","Sycamore","GA","31.652542","-83.57934","-5","1"
+"31791","Sylvester","GA","31.536886","-83.86041","-5","1"
+"31792","Thomasville","GA","30.817654","-83.98919","-5","1"
+"31793","Tifton","GA","31.485438","-83.503621","-5","1"
+"31794","Tifton","GA","31.459666","-83.51083","-5","1"
+"31795","Ty Ty","GA","31.47387","-83.66484","-5","1"
+"31796","Warwick","GA","31.782466","-83.86973","-5","1"
+"31797","Whigham","GA","30.888809","-84.32976","-5","1"
+"31798","Wray","GA","31.621764","-83.05502","-5","1"
+"31799","Thomasville","GA","30.880968","-83.885902","-5","1"
+"31801","Box Springs","GA","32.527813","-84.59822","-5","1"
+"31803","Buena Vista","GA","32.315915","-84.52238","-5","1"
+"31804","Cataula","GA","32.651617","-84.88805","-5","1"
+"31805","Cusseta","GA","32.285535","-84.76332","-5","1"
+"31806","Ellaville","GA","32.246795","-84.32008","-5","1"
+"31807","Ellerslie","GA","32.634965","-84.80137","-5","1"
+"31808","Fortson","GA","32.638885","-85.00736","-5","1"
+"31810","Geneva","GA","32.57791","-84.54513","-5","1"
+"31811","Hamilton","GA","32.722333","-84.95803","-5","1"
+"31812","Junction City","GA","32.614374","-84.44513","-5","1"
+"31814","Louvale","GA","32.154164","-84.83857","-5","1"
+"31815","Lumpkin","GA","32.030297","-84.81218","-5","1"
+"31816","Manchester","GA","32.862377","-84.60879","-5","1"
+"31820","Midland","GA","32.566197","-84.84122","-5","1"
+"31821","Omaha","GA","32.1342","-84.98499","-5","1"
+"31822","Pine Mountain","GA","32.867211","-84.88437","-5","1"
+"31823","Pine Mountain Valley","GA","32.801174","-84.82038","-5","1"
+"31824","Preston","GA","32.051618","-84.53419","-5","1"
+"31825","Richland","GA","32.109225","-84.66063","-5","1"
+"31826","Shiloh","GA","32.803518","-84.69384","-5","1"
+"31827","Talbotton","GA","32.683146","-84.52243","-5","1"
+"31829","Upatoi","GA","32.557718","-84.73957","-5","1"
+"31830","Warm Springs","GA","32.896166","-84.71191","-5","1"
+"31831","Waverly Hall","GA","32.698622","-84.71552","-5","1"
+"31832","Weston","GA","31.973541","-84.62522","-5","1"
+"31833","West Point","GA","32.867469","-85.13779","-5","1"
+"31836","Woodland","GA","32.797475","-84.54095","-5","1"
+"31901","Columbus","GA","32.471492","-84.98005","-5","1"
+"31902","Columbus","GA","32.524252","-84.955843","-5","1"
+"31903","Columbus","GA","32.423311","-84.94879","-5","1"
+"31904","Columbus","GA","32.513391","-84.97753","-5","1"
+"31905","Fort Benning","GA","32.37349","-84.90612","-5","1"
+"31906","Columbus","GA","32.468442","-84.95128","-5","1"
+"31907","Columbus","GA","32.479492","-84.90942","-5","1"
+"31908","Columbus","GA","32.534852","-84.906483","-5","1"
+"31909","Columbus","GA","32.53554","-84.92583","-5","1"
+"31914","Columbus","GA","32.491005","-84.874123","-5","1"
+"31917","Columbus","GA","32.491005","-84.874123","-5","1"
+"31993","Columbus","GA","32.482142","-84.977131","-5","1"
+"31994","Columbus","GA","32.491005","-84.874123","-5","1"
+"31995","Fort Benning","GA","32.495841","-84.963981","-5","1"
+"31997","Columbus","GA","32.491005","-84.874123","-5","1"
+"31998","Columbus","GA","32.491005","-84.874123","-5","1"
+"31999","Columbus","GA","32.491005","-84.874123","-5","1"
+"32004","Ponte Vedra Beach","FL","29.937673","-81.420603","-5","1"
+"32007","Bostwick","FL","29.799631","-81.627324","-5","1"
+"32008","Branford","FL","29.928691","-82.91032","-5","1"
+"32009","Bryceville","FL","30.421425","-81.95741","-5","1"
+"32011","Callahan","FL","30.567684","-81.84051","-5","1"
+"32013","Day","FL","30.193758","-83.29266","-5","1"
+"32024","Lake City","FL","30.108128","-82.72529","-5","1"
+"32025","Lake City","FL","30.155229","-82.62165","-5","1"
+"32030","Doctors Inlet","FL","30.105553","-81.768964","-5","1"
+"32033","Elkton","FL","29.787831","-81.44668","-5","1"
+"32034","Fernandina Beach","FL","30.641487","-81.46092","-5","1"
+"32035","Fernandina Beach","FL","30.551558","-81.698422","-5","1"
+"32038","Fort White","FL","29.922221","-82.71425","-5","1"
+"32040","Glen Saint Mary","FL","30.272356","-82.21351","-5","1"
+"32041","Yulee","FL","30.6233","-81.590249","-5","1"
+"32042","Graham","FL","29.968926","-82.122553","-5","1"
+"32043","Green Cove Springs","FL","29.97289","-81.72195","-5","1"
+"32044","Hampton","FL","29.863141","-82.15623","-5","1"
+"32046","Hilliard","FL","30.685319","-81.93061","-5","1"
+"32047","Yulee","FL","30.621671","-81.617754","-5","1"
+"32050","Middleburg","FL","30.031702","-81.848401","-5","1"
+"32052","Jasper","FL","30.491893","-82.94876","-5","1"
+"32053","Jennings","FL","30.581517","-83.13841","-5","1"
+"32054","Lake Butler","FL","30.005135","-82.38103","-5","1"
+"32055","Lake City","FL","30.216073","-82.6396","-5","1"
+"32056","Lake City","FL","30.162772","-82.651184","-5","1"
+"32058","Lawtey","FL","30.061174","-82.0943","-5","1"
+"32059","Lee","FL","30.421598","-83.27037","-5","1"
+"32060","Live Oak","FL","30.285127","-83.04106","-5","1"
+"32061","Lulu","FL","30.101542","-82.50337","-5","1"
+"32062","McAlpin","FL","30.13762","-82.98732","-5","1"
+"32063","Macclenny","FL","30.267664","-82.12457","-5","1"
+"32064","Live Oak","FL","30.331517","-82.957151","-5","1"
+"32065","Orange Park","FL","30.133007","-81.77904","-5","1"
+"32066","Mayo","FL","30.084849","-83.21849","-5","1"
+"32067","Orange Park","FL","29.956068","-81.815115","-5","1"
+"32068","Middleburg","FL","30.074926","-81.87932","-5","1"
+"32071","O Brien","FL","30.039096","-82.94481","-5","1"
+"32072","Olustee","FL","30.210947","-82.43601","-5","1"
+"32073","Orange Park","FL","30.160965","-81.72916","-5","1"
+"32079","Penney Farms","FL","29.979095","-81.80991","-5","1"
+"32080","St. Augustine","FL","29.838279","-81.275174","-5","1"
+"32081","Pomona Park","FL","29.50199","-81.600108","-5","1"
+"32082","Ponte Vedra Beach","FL","30.189934","-81.38213","-5","1"
+"32083","Raiford","FL","30.070341","-82.22371","-5","1"
+"32084","Saint Augustine","FL","29.87131","-81.29464","-5","1"
+"32085","Saint Augustine","FL","29.937673","-81.420603","-5","1"
+"32086","Saint Augustine","FL","29.811123","-81.30987","-5","1"
+"32087","Sanderson","FL","30.390734","-82.26039","-5","1"
+"32091","Starke","FL","29.937512","-82.11706","-5","1"
+"32092","Saint Augustine","FL","29.955409","-81.51284","-5","1"
+"32094","Wellborn","FL","30.203153","-82.81421","-5","1"
+"32095","Saint Augustine","FL","29.923718","-81.33962","-5","1"
+"32096","White Springs","FL","30.366085","-82.76055","-5","1"
+"32097","Yulee","FL","30.63928","-81.59442","-5","1"
+"32098","Palm Valley","FL","30.164918","-81.378181","-5","1"
+"32099","Jacksonville","FL","30.337538","-81.768622","-5","1"
+"32102","Astor","FL","29.174417","-81.56319","-5","1"
+"32105","Barberville","FL","29.200508","-81.406458","-5","1"
+"32110","Bunnell","FL","29.445826","-81.30203","-5","1"
+"32111","Candler","FL","29.060711","-81.969048","-5","1"
+"32112","Crescent City","FL","29.425693","-81.55686","-5","1"
+"32113","Citra","FL","29.393366","-82.09805","-5","1"
+"32114","Daytona Beach","FL","29.204009","-81.03602","-5","1"
+"32115","Daytona Beach","FL","29.022729","-81.172169","-5","1"
+"32116","Daytona Beach","FL","29.10909","-80.984344","-5","1"
+"32117","Daytona Beach","FL","29.238606","-81.05316","-5","1"
+"32118","Daytona Beach","FL","29.210309","-81.00259","-5","1"
+"32119","Daytona Beach","FL","29.153239","-81.02229","-5","1"
+"32120","Daytona Beach","FL","29.022729","-81.172169","-5","1"
+"32121","Daytona Beach","FL","29.022729","-81.172169","-5","1"
+"32122","Daytona Beach","FL","29.022729","-81.172169","-5","1"
+"32123","Daytona Beach","FL","29.022729","-81.172169","-5","1"
+"32124","Daytona Beach","FL","29.105506","-81.08642","-5","1"
+"32125","Daytona Beach","FL","29.022729","-81.172169","-5","1"
+"32126","Daytona Beach","FL","29.022729","-81.172169","-5","1"
+"32127","Daytona Beach","FL","29.116361","-80.98175","-5","1"
+"32128","Port Orange","FL","29.080251","-81.045962","-5","1"
+"32129","Port Orange","FL","29.022729","-81.172169","-5","1"
+"32130","De Leon Springs","FL","29.140657","-81.34497","-5","1"
+"32131","East Palatka","FL","29.668112","-81.59005","-5","1"
+"32132","Edgewater","FL","28.982714","-80.911","-5","1"
+"32133","Eastlake Weir","FL","29.008805","-81.909445","-5","1"
+"32134","Fort McCoy","FL","29.401523","-81.83636","-5","1"
+"32135","Palm Coast","FL","29.466085","-81.282815","-5","1"
+"32136","Flagler Beach","FL","29.47033","-81.13316","-5","1"
+"32137","Palm Coast","FL","29.581683","-81.21645","-5","1"
+"32138","Grandin","FL","29.727276","-81.9205","-5","1"
+"32139","Georgetown","FL","29.385225","-81.61052","-5","1"
+"32140","Florahome","FL","29.765329","-81.85602","-5","1"
+"32141","Edgewater","FL","28.944915","-80.89524","-5","1"
+"32142","Palm Coast","FL","29.466085","-81.282815","-5","1"
+"32145","Hastings","FL","29.656806","-81.46122","-5","1"
+"32147","Hollister","FL","29.634649","-81.80743","-5","1"
+"32148","Interlachen","FL","29.640791","-81.88648","-5","1"
+"32149","Interlachen","FL","29.58203","-81.744852","-5","1"
+"32151","Flagler Beach","FL","29.466085","-81.282815","-5","1"
+"32157","Lake Como","FL","29.467357","-81.57164","-5","1"
+"32158","Lady Lake","FL","28.811078","-81.653642","-5","1"
+"32159","Lady Lake","FL","28.930573","-81.93806","-5","1"
+"32160","Lake Geneva","FL","29.768321","-81.990729","-5","1"
+"32162","The Villages","FL","28.945246","-81.987609","-5","1"
+"32164","Palm Coast","FL","29.499591","-81.22328","-5","1"
+"32168","New Smyrna Beach","FL","29.016897","-80.95736","-5","1"
+"32169","New Smyrna Beach","FL","28.998887","-80.87561","-5","1"
+"32170","New Smyrna Beach","FL","29.022729","-81.172169","-5","1"
+"32173","Ormond Beach","FL","29.022729","-81.172169","-5","1"
+"32174","Ormond Beach","FL","29.284924","-81.10296","-5","1"
+"32175","Ormond Beach","FL","29.022729","-81.172169","-5","1"
+"32176","Ormond Beach","FL","29.316606","-81.05611","-5","1"
+"32177","Palatka","FL","29.666218","-81.67401","-5","1"
+"32178","Palatka","FL","29.644306","-81.668593","-5","1"
+"32179","Ocklawaha","FL","29.071931","-81.89073","-5","1"
+"32180","Pierson","FL","29.231366","-81.45095","-5","1"
+"32181","Pomona Park","FL","29.488583","-81.6088","-5","1"
+"32182","Orange Springs","FL","29.493034","-81.96523","-5","1"
+"32183","Ocklawaha","FL","29.084013","-81.8349","-5","1"
+"32185","Putnam Hall","FL","29.740034","-81.95858","-5","1"
+"32187","San Mateo","FL","29.589748","-81.57009","-5","1"
+"32189","Satsuma","FL","29.556365","-81.64433","-5","1"
+"32190","Seville","FL","29.332109","-81.50008","-5","1"
+"32192","Sparr","FL","29.326821","-82.104632","-5","1"
+"32193","Welaka","FL","29.476035","-81.66331","-5","1"
+"32195","Weirsdale","FL","29.003387","-81.89262","-5","1"
+"32198","Daytona Beach","FL","29.022729","-81.172169","-5","1"
+"32201","Jacksonville","FL","30.389438","-81.680806","-5","1"
+"32202","Jacksonville","FL","30.328539","-81.65101","-5","1"
+"32203","Jacksonville","FL","30.32281","-81.547044","-5","1"
+"32204","Jacksonville","FL","30.323806","-81.68174","-5","1"
+"32205","Jacksonville","FL","30.307439","-81.72044","-5","1"
+"32206","Jacksonville","FL","30.351006","-81.64664","-5","1"
+"32207","Jacksonville","FL","30.294389","-81.6374","-5","1"
+"32208","Jacksonville","FL","30.392888","-81.67933","-5","1"
+"32209","Jacksonville","FL","30.354588","-81.69113","-5","1"
+"32210","Jacksonville","FL","30.268572","-81.73987","-5","1"
+"32211","Jacksonville","FL","30.333022","-81.586","-5","1"
+"32212","Jacksonville","FL","30.222683","-81.70165","-5","1"
+"32214","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32215","Jacksonville","FL","30.23289","-81.91485","-5","1"
+"32216","Jacksonville","FL","30.28374","-81.58359","-5","1"
+"32217","Jacksonville","FL","30.24354","-81.62098","-5","1"
+"32218","Jacksonville","FL","30.449096","-81.65651","-5","1"
+"32219","Jacksonville","FL","30.411564","-81.76653","-5","1"
+"32220","Jacksonville","FL","30.329588","-81.80865","-5","1"
+"32221","Jacksonville","FL","30.292631","-81.80502","-5","1"
+"32222","Jacksonville","FL","30.230272","-81.81255","-5","1"
+"32223","Jacksonville","FL","30.159091","-81.63073","-5","1"
+"32224","Jacksonville","FL","30.284511","-81.47043","-5","1"
+"32225","Jacksonville","FL","30.348585","-81.49965","-5","1"
+"32226","Jacksonville","FL","30.453405","-81.52551","-5","1"
+"32227","Jacksonville","FL","30.383023","-81.41049","-5","1"
+"32228","Jacksonville","FL","30.38239","-81.436859","-5","1"
+"32229","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32230","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32231","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32232","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32233","Atlantic Beach","FL","30.343407","-81.40949","-5","1"
+"32234","Jacksonville","FL","30.226463","-81.98364","-5","1"
+"32235","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32236","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32237","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32238","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32239","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32240","Jacksonville Beach","FL","30.34494","-81.683107","-5","1"
+"32241","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32244","Jacksonville","FL","30.222489","-81.74894","-5","1"
+"32245","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32246","Jacksonville","FL","30.296911","-81.52228","-5","1"
+"32247","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32250","Jacksonville Beach","FL","30.284641","-81.39844","-5","1"
+"32254","Jacksonville","FL","30.336038","-81.72509","-5","1"
+"32255","Jacksonville","FL","30.287041","-81.389305","-5","1"
+"32256","Jacksonville","FL","30.206922","-81.54604","-5","1"
+"32257","Jacksonville","FL","30.192434","-81.60597","-5","1"
+"32258","Jacksonville","FL","30.148209","-81.56882","-5","1"
+"32259","Jacksonville","FL","30.092346","-81.60274","-5","1"
+"32260","Jacksonville","FL","29.937673","-81.420603","-5","1"
+"32266","Neptune Beach","FL","30.316641","-81.40308","-5","1"
+"32267","Jacksonville","FL","30.34494","-81.683107","-5","1"
+"32276","Jacksonville","FL","30.325739","-81.659017","-5","1"
+"32277","Jacksonville","FL","30.364339","-81.59087","-5","1"
+"32301","Tallahassee","FL","30.431283","-84.26903","-5","1"
+"32302","Tallahassee","FL","30.479347","-84.346204","-5","1"
+"32303","Tallahassee","FL","30.486061","-84.31528","-5","1"
+"32304","Tallahassee","FL","30.446766","-84.32394","-5","1"
+"32305","Wakulla Springs","FL","30.130775","-84.406629","-5","1"
+"32306","Tallahassee","FL","30.442499","-84.29855","-5","1"
+"32307","Tallahassee","FL","30.42565","-84.287749","-5","1"
+"32308","Tallahassee","FL","30.531677","-84.16049","-5","1"
+"32309","Miccosukee Cpo","FL","30.514599","-84.188446","-5","1"
+"32310","Tallahassee","FL","30.400318","-84.34803","-5","1"
+"32311","Tallahassee","FL","30.403146","-84.18841","-5","1"
+"32312","Tallahassee","FL","30.554434","-84.25979","-5","1"
+"32313","Tallahassee","FL","30.479347","-84.346204","-5","1"
+"32314","Tallahassee","FL","30.479347","-84.346204","-5","1"
+"32315","Tallahassee","FL","30.479347","-84.346204","-5","1"
+"32316","Tallahassee","FL","30.479347","-84.346204","-5","1"
+"32317","Tallahassee","FL","30.479347","-84.346204","-5","1"
+"32320","Apalachicola","FL","29.71877","-85.02704","-5","1"
+"32321","Bristol","FL","30.36007","-84.97668","-5","1"
+"32322","Carrabelle","FL","29.912584","-84.6407","-5","1"
+"32323","Lanark Village","FL","29.879559","-84.60134","-5","1"
+"32324","Chattahoochee","FL","30.687983","-84.8218","-5","1"
+"32326","Crawfordville","FL","30.183372","-84.34906","-5","1"
+"32327","Crawfordville","FL","30.194939","-84.35533","-5","1"
+"32328","Eastpoint","FL","29.825252","-84.89247","-5","1"
+"32329","Apalachicola","FL","29.745526","-85.023947","-5","1"
+"32330","Greensboro","FL","30.571364","-84.74346","-5","1"
+"32331","Greenville","FL","30.442203","-83.65112","-5","1"
+"32332","Gretna","FL","30.616479","-84.66292","-5","1"
+"32333","Havana","FL","30.607352","-84.41376","-5","1"
+"32334","Hosford","FL","30.381958","-84.77767","-5","1"
+"32335","Sumatra","FL","30.060351","-85.04477","-5","1"
+"32336","Lamont","FL","30.416739","-83.8239","-5","1"
+"32337","Lloyd","FL","30.478502","-84.02083","-5","1"
+"32340","Madison","FL","30.476181","-83.40303","-5","1"
+"32341","Madison","FL","30.47756","-83.391393","-5","1"
+"32342","Midway","FL","30.496047","-84.483258","-5","1"
+"32343","Midway","FL","30.494878","-84.46259","-5","1"
+"32344","Monticello","FL","30.530854","-83.88017","-5","1"
+"32345","Monticello","FL","30.342161","-83.840177","-5","1"
+"32346","Panacea","FL","29.983931","-84.38798","-5","1"
+"32347","Perry","FL","30.080602","-83.58119","-5","1"
+"32348","Perry","FL","29.966454","-83.659371","-5","1"
+"32349","Perry","FL","30.100578","-83.578106","-5","1"
+"32350","Pinetta","FL","30.594145","-83.32545","-5","1"
+"32351","Quincy","FL","30.573563","-84.6147","-5","1"
+"32352","Mount Pleasant","FL","30.665715","-84.75363","-5","1"
+"32353","Quincy","FL","30.549676","-84.606864","-5","1"
+"32355","Saint Marks","FL","30.162414","-84.20923","-5","1"
+"32356","Salem","FL","29.900822","-83.42088","-5","1"
+"32357","Shady Grove","FL","30.28163","-83.63082","-5","1"
+"32358","Sopchoppy","FL","30.029899","-84.50595","-5","1"
+"32359","Steinhatchee","FL","29.673459","-83.38416","-5","1"
+"32360","Telogia","FL","30.184365","-84.88355","-5","1"
+"32361","Wacissa","FL","30.357761","-83.98882","-5","1"
+"32362","Woodville","FL","30.319263","-84.267397","-5","1"
+"32395","Tallahassee","FL","30.479347","-84.346204","-5","1"
+"32399","Tallahassee","FL","30.420146","-84.23331","-5","1"
+"32401","Panama City","FL","30.161901","-85.65297","-6","1"
+"32402","Panama City","FL","30.234451","-85.692035","-5","1"
+"32403","Panama City","FL","30.068188","-85.60975","-6","1"
+"32404","Panama City","FL","30.188585","-85.56392","-6","1"
+"32405","Panama City","FL","30.195424","-85.66458","-6","1"
+"32406","Panama City","FL","30.234451","-85.692035","-5","1"
+"32407","Panama City Beach","FL","30.196771","-85.81279","-6","1"
+"32408","Panama City","FL","30.154621","-85.76367","-6","1"
+"32409","Panama City","FL","30.330553","-85.65413","-6","1"
+"32410","Mexico Beach","FL","29.945008","-85.41461","-6","1"
+"32411","Panama City","FL","30.234451","-85.692035","-5","1"
+"32412","Panama City","FL","30.234451","-85.692035","-5","1"
+"32413","Panama City Beach","FL","30.252616","-85.90413","-6","1"
+"32417","Panama City","FL","30.243832","-85.916988","-6","1"
+"32420","Alford","FL","30.641154","-85.37542","-6","1"
+"32421","Altha","FL","30.5403","-85.18229","-6","1"
+"32422","Argyle","FL","30.716494","-86.03889","-6","1"
+"32423","Bascom","FL","30.959504","-85.05644","-6","1"
+"32424","Blountstown","FL","30.42007","-85.07299","-6","1"
+"32425","Bonifay","FL","30.838337","-85.67495","-6","1"
+"32426","Campbellton","FL","30.955359","-85.38288","-6","1"
+"32427","Caryville","FL","30.821603","-85.806","-6","1"
+"32428","Chipley","FL","30.636228","-85.5775","-6","1"
+"32430","Clarksville","FL","30.438819","-85.24381","-6","1"
+"32431","Cottondale","FL","30.779196","-85.39371","-6","1"
+"32432","Cypress","FL","30.713868","-85.0779","-6","1"
+"32433","Defuniak Springs","FL","30.747244","-86.14665","-6","1"
+"32434","Mossy Head","FL","30.762486","-86.342683","-6","1"
+"32435","Defuniak Springs","FL","30.603777","-86.12111","-6","1"
+"32436","Wewahitchka","FL","30.110171","-85.198431","-6","1"
+"32437","Ebro","FL","30.443152","-85.88079","-6","1"
+"32438","Fountain","FL","30.488955","-85.41673","-6","1"
+"32439","Freeport","FL","30.482838","-86.1675","-6","1"
+"32440","Graceville","FL","30.935306","-85.52171","-6","1"
+"32442","Grand Ridge","FL","30.698517","-85.01619","-6","1"
+"32443","Greenwood","FL","30.860528","-85.11142","-6","1"
+"32444","Lynn Haven","FL","30.239849","-85.64577","-6","1"
+"32445","Malone","FL","30.961401","-85.16919","-6","1"
+"32446","Marianna","FL","30.804698","-85.2206","-6","1"
+"32447","Marianna","FL","30.759353","-85.25712","-6","1"
+"32448","Marianna","FL","30.675635","-85.23283","-6","1"
+"32449","Kinard","FL","30.283088","-85.21892","-6","1"
+"32452","Noma","FL","30.849972","-85.768022","-6","1"
+"32454","Point Washington","FL","30.603777","-86.12111","-6","1"
+"32455","Ponce De Leon","FL","30.657214","-85.96035","-6","1"
+"32456","Port Saint Joe","FL","29.846517","-85.32792","-5","1"
+"32457","Port Saint Joe","FL","29.902484","-85.242169","-6","1"
+"32459","Santa Rosa Beach","FL","30.361248","-86.18759","-6","1"
+"32460","Sneads","FL","30.735645","-84.94563","-6","1"
+"32461","Sunnyside","FL","30.252531","-85.942389","-6","1"
+"32462","Vernon","FL","30.563809","-85.82357","-6","1"
+"32463","Wausau","FL","30.631345","-85.58981","-6","1"
+"32464","Westville","FL","30.892936","-85.93988","-6","1"
+"32465","Wewahitchka","FL","30.045471","-85.22822","-6","1"
+"32466","Youngstown","FL","30.373845","-85.52891","-6","1"
+"32476","Lake Mary","FL","28.773699","-81.344414","-5","1"
+"32478","Chipley","FL","30.778182","-85.53832","-6","1"
+"32501","Pensacola","FL","30.420997","-87.22305","-6","1"
+"32502","Pensacola","FL","30.474288","-87.225691","-6","1"
+"32503","Pensacola","FL","30.447997","-87.20727","-6","1"
+"32504","Pensacola","FL","30.48787","-87.18937","-6","1"
+"32505","Pensacola","FL","30.441994","-87.25472","-6","1"
+"32506","Pensacola","FL","30.408807","-87.31919","-6","1"
+"32507","Pensacola","FL","30.360887","-87.33451","-6","1"
+"32508","Pensacola","FL","30.355477","-87.29035","-6","1"
+"32509","Pensacola","FL","30.464324","-87.340262","-6","1"
+"32511","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32512","Pensacola","FL","30.394327","-87.299129","-6","1"
+"32513","Pensacola","FL","30.557064","-87.259592","-6","1"
+"32514","Pensacola","FL","30.527195","-87.21485","-6","1"
+"32516","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32520","Pensacola","FL","30.412377","-87.203543","-6","1"
+"32521","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32522","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32523","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32524","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32526","Pensacola","FL","30.479002","-87.31996","-6","1"
+"32530","Bagdad","FL","30.598564","-87.031496","-6","1"
+"32531","Baker","FL","30.8752","-86.68607","-6","1"
+"32533","Cantonment","FL","30.600993","-87.31979","-6","1"
+"32534","Pensacola","FL","30.526345","-87.27734","-6","1"
+"32535","Century","FL","30.969066","-87.30604","-6","1"
+"32536","Crestview","FL","30.760184","-86.58533","-6","1"
+"32537","Milligan","FL","30.741965","-86.655208","-6","1"
+"32538","Paxton","FL","30.970853","-86.311093","-6","1"
+"32539","Crestview","FL","30.757479","-86.51088","-6","1"
+"32540","Destin","FL","30.661155","-86.594479","-6","1"
+"32541","Destin","FL","30.391795","-86.4338","-6","1"
+"32542","Eglin AFB","FL","30.457156","-86.55081","-6","1"
+"32544","Hurlburt Field","FL","30.464755","-86.64643","-6","1"
+"32546","Myrtle Grove","FL","30.409264","-87.292755","-6","1"
+"32547","Fort Walton Beach","FL","30.447248","-86.62113","-6","1"
+"32548","Fort Walton Beach","FL","30.414932","-86.61992","-6","1"
+"32549","Fort Walton Beach","FL","30.661155","-86.594479","-6","1"
+"32550","Miramar Beach","FL","30.381934","-86.359508","-6","1"
+"32559","Pensacola","FL","30.356287","-87.277307","-6","1"
+"32560","Gonzalez","FL","30.581825","-87.292918","-6","1"
+"32561","Gulf Breeze","FL","30.375469","-87.09013","-6","1"
+"32562","Gulf Breeze","FL","30.659159","-87.04972","-6","1"
+"32563","Harold","FL","30.659159","-87.04972","-6","1"
+"32564","Holt","FL","30.717437","-86.77075","-6","1"
+"32565","Jay","FL","30.902015","-87.13267","-6","1"
+"32566","Gulf Breeze","FL","30.435069","-86.89025","-6","1"
+"32567","Laurel Hill","FL","30.945123","-86.43749","-6","1"
+"32568","McDavid","FL","30.878449","-87.47861","-6","1"
+"32569","Mary Esther","FL","30.409902","-86.71497","-5","1"
+"32570","Milton","FL","30.70969","-87.01098","-6","1"
+"32571","Milton","FL","30.627637","-87.16724","-6","1"
+"32572","Milton","FL","30.659159","-87.04972","-6","1"
+"32573","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32574","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32575","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32576","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32577","Molino","FL","30.743945","-87.34872","-6","1"
+"32578","Niceville","FL","30.500901","-86.45335","-5","1"
+"32579","Shalimar","FL","30.444975","-86.57331","-6","1"
+"32580","Valparaiso","FL","30.507047","-86.49702","-6","1"
+"32581","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32582","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32583","Milton","FL","30.58149","-87.00178","-6","1"
+"32588","Niceville","FL","30.661155","-86.594479","-6","1"
+"32589","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32590","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32591","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32592","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32593","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32594","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32595","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32596","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32597","Pensacola","FL","30.529739","-87.275693","-6","1"
+"32598","Pensacola","FL","30.61428","-87.275772","-6","1"
+"32601","Gainesville","FL","29.653195","-82.3244","-5","1"
+"32602","Gainesville","FL","29.629887","-82.396567","-5","1"
+"32603","Gainesville","FL","29.653145","-82.3469","-5","1"
+"32604","Gainesville","FL","29.573293","-82.397904","-5","1"
+"32605","Gainesville","FL","29.676006","-82.36889","-5","1"
+"32606","Gainesville","FL","29.681426","-82.41502","-5","1"
+"32607","Gainesville","FL","29.646189","-82.39658","-5","1"
+"32608","Gainesville","FL","29.611545","-82.3941","-5","1"
+"32609","Gainesville","FL","29.713911","-82.29591","-5","1"
+"32610","Gainesville","FL","29.681312","-82.353862","-5","1"
+"32611","Gainesville","FL","29.681312","-82.353862","-5","1"
+"32612","Gainesville","FL","29.681312","-82.353862","-5","1"
+"32613","Gainesville","FL","29.681312","-82.353862","-5","1"
+"32614","Gainesville","FL","29.681312","-82.353862","-5","1"
+"32615","Alachua","FL","29.801949","-82.48872","-5","1"
+"32616","Alachua","FL","29.790674","-82.49351","-5","1"
+"32617","Anthony","FL","29.315961","-82.10092","-5","1"
+"32618","Archer","FL","29.517277","-82.54518","-5","1"
+"32619","Bell","FL","29.764553","-82.87062","-5","1"
+"32621","Bronson","FL","29.447069","-82.60452","-5","1"
+"32622","Brooker","FL","29.896156","-82.30358","-5","1"
+"32625","Cedar Key","FL","29.178171","-83.02243","-5","1"
+"32626","Chiefland","FL","29.453178","-82.86837","-5","1"
+"32627","Gainesville","FL","29.681312","-82.353862","-5","1"
+"32628","Cross City","FL","29.630964","-83.1148","-5","1"
+"32631","Earleton","FL","29.730413","-82.097095","-5","1"
+"32633","Evinston","FL","29.681312","-82.353862","-5","1"
+"32634","Fairfield","FL","29.35089","-82.27648","-5","1"
+"32635","Gainesville","FL","29.681312","-82.353862","-5","1"
+"32638","Trenton","FL","29.622568","-82.808642","-5","1"
+"32639","Gulf Hammock","FL","29.231843","-82.72965","-5","1"
+"32640","Hawthorne","FL","29.601599","-82.0309","-5","1"
+"32641","Gainesville","FL","29.648594","-82.28621","-5","1"
+"32643","High Springs","FL","29.823616","-82.60407","-5","1"
+"32644","Chiefland","FL","29.460221","-82.855334","-5","1"
+"32648","Horseshoe Beach","FL","29.458513","-83.27604","-5","1"
+"32653","Gainesville","FL","29.735832","-82.39008","-5","1"
+"32654","Island Grove","FL","29.459973","-82.10819","-5","1"
+"32655","High Springs","FL","29.817457","-82.60064","-5","1"
+"32656","Keystone Heights","FL","29.788679","-82.00421","-5","1"
+"32658","La Crosse","FL","29.845122","-82.39845","-5","1"
+"32662","Lochloosa","FL","29.514298","-82.09829","-5","1"
+"32663","Lowell","FL","29.342404","-82.212649","-5","1"
+"32664","McIntosh","FL","29.450353","-82.22069","-5","1"
+"32666","Melrose","FL","29.733375","-82.01048","-5","1"
+"32667","Micanopy","FL","29.502067","-82.27775","-5","1"
+"32668","Morriston","FL","29.282158","-82.51776","-5","1"
+"32669","Newberry","FL","29.640613","-82.59446","-5","1"
+"32680","Old Town","FL","29.643244","-82.99026","-5","1"
+"32681","Orange Lake","FL","29.425291","-82.2158","-5","1"
+"32683","Otter Creek","FL","29.319173","-82.77965","-5","1"
+"32686","Reddick","FL","29.364039","-82.23483","-5","1"
+"32692","Suwannee","FL","29.330426","-83.14401","-5","1"
+"32693","Trenton","FL","29.598935","-82.82752","-5","1"
+"32694","Waldo","FL","29.789597","-82.1621","-5","1"
+"32696","Williston","FL","29.369207","-82.49831","-5","1"
+"32697","Worthington Springs","FL","29.931204","-82.42643","-5","1"
+"32699","Newberry","FL","29.636632","-82.611304","-5","1"
+"32701","Altamonte Springs","FL","28.666249","-81.36796","-5","1"
+"32702","Altoona","FL","29.046215","-81.64043","-5","1"
+"32703","Apopka","FL","28.658395","-81.50319","-5","1"
+"32704","Apopka","FL","28.566338","-81.260818","-5","1"
+"32706","Cassadaga","FL","28.965591","-81.23654","-5","1"
+"32707","Casselberry","FL","28.665125","-81.31772","-5","1"
+"32708","Winter Springs","FL","28.683408","-81.28151","-5","1"
+"32709","Christmas","FL","28.513011","-80.99418","-5","1"
+"32710","Clarcona","FL","28.566338","-81.260818","-5","1"
+"32712","Apopka","FL","28.713173","-81.52359","-5","1"
+"32713","Debary","FL","28.888595","-81.31212","-5","1"
+"32714","Altamonte Springs","FL","28.663913","-81.41112","-5","1"
+"32715","Altamonte Springs","FL","28.744752","-81.22328","-5","1"
+"32716","Altamonte Springs","FL","28.744752","-81.22328","-5","1"
+"32718","Casselberry","FL","28.744752","-81.22328","-5","1"
+"32719","Winter Springs","FL","28.744752","-81.22328","-5","1"
+"32720","Deland","FL","29.021782","-81.33352","-5","1"
+"32721","Deland","FL","28.997288","-81.299521","-5","1"
+"32722","Glenwood","FL","29.022729","-81.172169","-5","1"
+"32724","Deland","FL","29.039757","-81.27927","-5","1"
+"32725","Deltona","FL","28.902426","-81.24515","-5","1"
+"32726","Eustis","FL","28.850617","-81.68034","-5","1"
+"32727","Eustis","FL","28.855517","-81.674147","-5","1"
+"32728","Deltona","FL","29.022729","-81.172169","-5","1"
+"32730","Casselberry","FL","28.653875","-81.34387","-5","1"
+"32732","Geneva","FL","28.746588","-81.10985","-5","1"
+"32733","Goldenrod","FL","28.613308","-81.258108","-5","1"
+"32735","Grand Island","FL","28.893559","-81.74343","-5","1"
+"32736","Eustis","FL","28.895482","-81.5228","-5","1"
+"32738","Deltona","FL","28.910383","-81.18764","-5","1"
+"32739","Deltona","FL","29.022729","-81.172169","-5","1"
+"32744","Lake Helen","FL","28.985274","-81.23495","-5","1"
+"32745","Heathrow","FL","28.77368","-81.390498","-5","1"
+"32746","Lake Mary","FL","28.758133","-81.33992","-5","1"
+"32747","Lake Monroe","FL","28.827219","-81.332888","-5","1"
+"32750","Longwood","FL","28.703674","-81.35384","-5","1"
+"32751","Maitland","FL","28.628359","-81.35942","-5","1"
+"32752","Longwood","FL","28.744752","-81.22328","-5","1"
+"32754","Mims","FL","28.707648","-80.89049","-5","1"
+"32756","Mount Dora","FL","28.811078","-81.653642","-5","1"
+"32757","Mount Dora","FL","28.786272","-81.64475","-5","1"
+"32759","Oak Hill","FL","28.868986","-80.85374","-5","1"
+"32762","Oviedo","FL","28.744752","-81.22328","-5","1"
+"32763","Orange City","FL","28.945857","-81.30512","-5","1"
+"32764","Osteen","FL","28.834172","-81.0948","-5","1"
+"32765","Oviedo","FL","28.656375","-81.21026","-5","1"
+"32766","Oviedo","FL","28.639275","-81.11906","-5","1"
+"32767","Paisley","FL","29.008612","-81.50174","-5","1"
+"32768","Plymouth","FL","28.698542","-81.569764","-5","1"
+"32769","Oak Hill","FL","28.858941","-80.856373","-5","1"
+"32771","Sanford","FL","28.803979","-81.28761","-5","1"
+"32772","Sanford","FL","28.80722","-81.250236","-5","1"
+"32773","Sanford","FL","28.769173","-81.27631","-5","1"
+"32774","Orange City","FL","29.022729","-81.172169","-5","1"
+"32775","Scottsmoor","FL","28.76507","-80.87315","-5","1"
+"32776","Sorrento","FL","28.804039","-81.53689","-5","1"
+"32777","Tangerine","FL","28.566338","-81.260818","-5","1"
+"32778","Tavares","FL","28.799017","-81.73184","-5","1"
+"32779","Longwood","FL","28.704874","-81.41711","-5","1"
+"32780","Titusville","FL","28.564077","-80.81695","-5","1"
+"32781","Titusville","FL","28.306726","-80.686159","-5","1"
+"32782","Titusville","FL","28.306726","-80.686159","-5","1"
+"32783","Titusville","FL","28.306726","-80.686159","-5","1"
+"32784","Umatilla","FL","28.948549","-81.70621","-5","1"
+"32789","Winter Park","FL","28.598677","-81.35594","-5","1"
+"32790","Winter Park","FL","28.566338","-81.260818","-5","1"
+"32791","Longwood","FL","28.744752","-81.22328","-5","1"
+"32792","Winter Park","FL","28.607077","-81.30606","-5","1"
+"32793","Winter Park","FL","28.566338","-81.260818","-5","1"
+"32794","Maitland","FL","28.566338","-81.260818","-5","1"
+"32795","Lake Mary","FL","28.744752","-81.22328","-5","1"
+"32796","Titusville","FL","28.623371","-80.84123","-5","1"
+"32798","Zellwood","FL","28.716923","-81.5754","-5","1"
+"32799","Mid Florida","FL","28.744752","-81.22328","-5","1"
+"32801","Orlando","FL","28.541879","-81.37446","-5","1"
+"32802","Orlando","FL","28.519024","-81.343903","-5","1"
+"32803","Orlando","FL","28.557579","-81.35244","-5","1"
+"32804","Orlando","FL","28.577723","-81.3931","-5","1"
+"32805","Orlando","FL","28.53028","-81.40089","-5","1"
+"32806","Orlando","FL","28.51483","-81.36054","-5","1"
+"32807","Orlando","FL","28.546897","-81.30774","-5","1"
+"32808","Orlando","FL","28.576028","-81.44369","-5","1"
+"32809","Orlando","FL","28.463482","-81.38814","-5","1"
+"32810","Orlando","FL","28.619445","-81.42695","-5","1"
+"32811","Orlando","FL","28.52493","-81.43994","-5","1"
+"32812","Orlando","FL","28.493531","-81.32609","-5","1"
+"32813","Orlando","FL","28.567928","-81.325842","-5","1"
+"32814","Orlando","FL","28.566338","-81.260818","-5","1"
+"32815","Orlando","FL","28.306726","-80.686159","-5","1"
+"32816","Orlando","FL","28.566338","-81.260818","-5","1"
+"32817","Orlando","FL","28.591692","-81.24717","-5","1"
+"32818","Orlando","FL","28.583103","-81.48608","-5","1"
+"32819","Orlando","FL","28.463509","-81.47514","-5","1"
+"32820","Orlando","FL","28.561242","-81.10735","-5","1"
+"32821","Orlando","FL","28.391608","-81.47345","-5","1"
+"32822","Orlando","FL","28.494931","-81.28949","-5","1"
+"32824","Orlando","FL","28.410872","-81.35898","-5","1"
+"32825","Orlando","FL","28.543248","-81.2456","-5","1"
+"32826","Orlando","FL","28.584177","-81.18634","-5","1"
+"32827","Orlando","FL","28.425221","-81.30353","-5","1"
+"32828","Orlando","FL","28.542132","-81.18404","-5","1"
+"32829","Orlando","FL","28.491653","-81.26436","-5","1"
+"32830","Orlando","FL","28.385549","-81.505894","-5","1"
+"32831","Orlando","FL","28.458149","-81.13666","-5","1"
+"32832","Orlando","FL","28.395979","-81.17653","-5","1"
+"32833","Orlando","FL","28.511879","-81.09078","-5","1"
+"32834","Orlando","FL","28.566338","-81.260818","-5","1"
+"32835","Orlando","FL","28.528789","-81.47863","-5","1"
+"32836","Orlando","FL","28.401151","-81.52488","-5","1"
+"32837","Orlando","FL","28.385906","-81.41182","-5","1"
+"32839","Orlando","FL","28.489758","-81.40625","-5","1"
+"32853","Orlando","FL","28.566338","-81.260818","-5","1"
+"32854","Orlando","FL","28.566338","-81.260818","-5","1"
+"32855","Orlando","FL","28.550028","-81.104185","-5","1"
+"32856","Orlando","FL","28.548379","-81.420092","-5","1"
+"32857","Orlando","FL","28.566338","-81.260818","-5","1"
+"32858","Orlando","FL","28.566338","-81.260818","-5","1"
+"32859","Orlando","FL","28.442926","-81.402613","-5","1"
+"32860","Orlando","FL","28.566338","-81.260818","-5","1"
+"32861","Orlando","FL","28.566338","-81.260818","-5","1"
+"32862","Orlando","FL","28.417368","-81.332763","-5","1"
+"32867","Orlando","FL","28.566338","-81.260818","-5","1"
+"32868","Orlando","FL","28.566338","-81.260818","-5","1"
+"32869","Orlando","FL","28.566338","-81.260818","-5","1"
+"32872","Orlando","FL","28.566338","-81.260818","-5","1"
+"32877","Orlando","FL","28.566338","-81.260818","-5","1"
+"32878","Orlando","FL","28.566338","-81.260818","-5","1"
+"32886","Orlando","FL","28.566338","-81.260818","-5","1"
+"32887","Orlando","FL","28.566338","-81.260818","-5","1"
+"32889","Orlando","FL","28.566338","-81.260818","-5","1"
+"32890","Orlando","FL","28.566338","-81.260818","-5","1"
+"32891","Orlando","FL","28.566338","-81.260818","-5","1"
+"32893","Orlando","FL","28.566338","-81.260818","-5","1"
+"32897","Orlando","FL","28.566338","-81.260818","-5","1"
+"32898","Orlando","FL","28.566338","-81.260818","-5","1"
+"32899","Orlando","FL","28.306726","-80.686159","-5","1"
+"32901","Melbourne","FL","28.077494","-80.61987","-5","1"
+"32902","Melbourne","FL","28.306726","-80.686159","-5","1"
+"32903","Indialantic","FL","28.103191","-80.57414","-5","1"
+"32904","Melbourne","FL","28.073891","-80.67167","-5","1"
+"32905","Palm Bay","FL","28.031689","-80.60014","-5","1"
+"32906","Palm Bay","FL","28.067128","-80.650341","-5","1"
+"32907","Palm Bay","FL","28.012241","-80.67729","-5","1"
+"32908","Palm Bay","FL","27.958982","-80.68591","-5","1"
+"32909","Palm Bay","FL","27.950975","-80.64679","-5","1"
+"32910","Palm Bay","FL","28.306726","-80.686159","-5","1"
+"32911","Palm Bay","FL","28.306726","-80.686159","-5","1"
+"32912","Melbourne","FL","28.306726","-80.686159","-5","1"
+"32919","Melbourne","FL","28.306726","-80.686159","-5","1"
+"32920","Cape Canaveral","FL","28.390932","-80.60501","-5","1"
+"32922","Cocoa","FL","28.366284","-80.74196","-5","1"
+"32923","Cocoa","FL","28.427535","-80.828991","-5","1"
+"32924","Cocoa","FL","28.306726","-80.686159","-5","1"
+"32925","Patrick AFB","FL","28.235092","-80.60159","-5","1"
+"32926","Cocoa","FL","28.392933","-80.79585","-5","1"
+"32927","Cocoa","FL","28.47123","-80.79887","-5","1"
+"32931","Cocoa Beach","FL","28.326985","-80.61119","-5","1"
+"32932","Cocoa Beach","FL","28.306726","-80.686159","-5","1"
+"32934","Melbourne","FL","28.137443","-80.69211","-5","1"
+"32935","Melbourne","FL","28.13926","-80.65077","-5","1"
+"32936","Melbourne","FL","28.306726","-80.686159","-5","1"
+"32937","Satellite Beach","FL","28.172041","-80.59957","-5","1"
+"32940","Melbourne","FL","28.21981","-80.69402","-5","1"
+"32941","Melbourne","FL","27.924577","-80.523463","-5","1"
+"32948","Fellsmere","FL","27.762118","-80.59472","-5","1"
+"32949","Grant","FL","27.929103","-80.52879","-5","1"
+"32950","Malabar","FL","27.974173","-80.56986","-5","1"
+"32951","Melbourne Beach","FL","28.01514","-80.53518","-5","1"
+"32952","Merritt Island","FL","28.350373","-80.6691","-5","1"
+"32953","Merritt Island","FL","28.396301","-80.70198","-5","1"
+"32954","Merritt Island","FL","28.22571","-80.673356","-5","1"
+"32955","Rockledge","FL","28.308581","-80.72558","-5","1"
+"32956","Rockledge","FL","28.329785","-80.732327","-5","1"
+"32957","Roseland","FL","27.709049","-80.572557","-5","1"
+"32958","Sebastian","FL","27.78783","-80.48266","-5","1"
+"32959","Sharpes","FL","28.306726","-80.686159","-5","1"
+"32960","Vero Beach","FL","27.636828","-80.40294","-5","1"
+"32961","Vero Beach","FL","27.617473","-80.423083","-5","1"
+"32962","Vero Beach","FL","27.582151","-80.39141","-5","1"
+"32963","Vero Beach","FL","27.676376","-80.37248","-5","1"
+"32964","Vero Beach","FL","27.709049","-80.572557","-5","1"
+"32965","Vero Beach","FL","27.709049","-80.572557","-5","1"
+"32966","Vero Beach","FL","27.645377","-80.51468","-5","1"
+"32967","Vero Beach","FL","27.724801","-80.49708","-5","1"
+"32968","Vero Beach","FL","27.594718","-80.45722","-5","1"
+"32969","Vero Beach","FL","27.709049","-80.572557","-5","1"
+"32970","Wabasso","FL","27.750176","-80.45364","-5","1"
+"32971","Winter Beach","FL","27.709049","-80.572557","-5","1"
+"32976","Sebastian","FL","27.877504","-80.51457","-5","1"
+"32977","Winter Beach","FL","27.718868","-80.421607","-5","1"
+"32978","Sebastian","FL","27.709049","-80.572557","-5","1"
+"33001","Long Key","FL","24.841814","-80.79405","-5","1"
+"33002","Hialeah","FL","25.558428","-80.458168","-5","1"
+"33003","Florida City","FL","25.455229","-80.475479","-5","1"
+"33004","Dania","FL","26.051916","-80.14526","-5","1"
+"33008","Hallandale","FL","26.145724","-80.448254","-5","1"
+"33009","Hallandale","FL","25.987069","-80.15004","-5","1"
+"33010","Hialeah","FL","25.832374","-80.27874","-5","1"
+"33011","Hialeah","FL","25.558428","-80.458168","-5","1"
+"33012","Hialeah","FL","25.864773","-80.30069","-5","1"
+"33013","Hialeah","FL","25.860373","-80.27174","-5","1"
+"33014","Hialeah","FL","25.902172","-80.30732","-5","1"
+"33015","Hialeah","FL","25.938687","-80.3182","-5","1"
+"33016","Hialeah","FL","25.887983","-80.33284","-5","1"
+"33017","Hialeah","FL","25.558428","-80.458168","-5","1"
+"33018","Hialeah","FL","25.895557","-80.35509","-5","1"
+"33019","Hollywood","FL","26.018967","-80.12231","-5","1"
+"33020","Hollywood","FL","26.016984","-80.14925","-5","1"
+"33021","Hollywood","FL","26.023634","-80.18922","-5","1"
+"33022","Hollywood","FL","26.013368","-80.144217","-5","1"
+"33023","Hollywood","FL","25.989119","-80.21318","-5","1"
+"33024","Hollywood","FL","26.023567","-80.23851","-5","1"
+"33025","Hollywood","FL","25.990494","-80.27326","-5","1"
+"33026","Hollywood","FL","26.0267","-80.29443","-5","1"
+"33027","Hollywood","FL","25.981409","-80.34491","-5","1"
+"33028","Pembroke Pines","FL","26.018418","-80.34798","-5","1"
+"33029","Hollywood","FL","26.006373","-80.40212","-5","1"
+"33030","Homestead","FL","25.479438","-80.48687","-5","1"
+"33031","Homestead","FL","25.526214","-80.49632","-5","1"
+"33032","Homestead","FL","25.524528","-80.40521","-5","1"
+"33033","Homestead","FL","25.487988","-80.42692","-5","1"
+"33034","Homestead","FL","25.431506","-80.51382","-5","1"
+"33035","Homestead","FL","25.457913","-80.44781","-5","1"
+"33036","Islamorada","FL","24.91828","-80.63676","-5","1"
+"33037","Key Largo","FL","25.137661","-80.40735","-5","1"
+"33039","Homestead","FL","25.558428","-80.458168","-5","1"
+"33040","Key West","FL","24.567593","-81.7566","-5","1"
+"33041","Key West","FL","25.100957","-81.568862","-5","1"
+"33042","Summerland Key","FL","24.663121","-81.48694","-5","1"
+"33043","Big Pine Key","FL","24.675731","-81.34359","-5","1"
+"33044","Sugarloaf Shores","FL","24.664649","-81.565319","-5","1"
+"33045","Key West","FL","25.100957","-81.568862","-5","1"
+"33047","West Little River","FL","25.859273","-80.242671","-5","1"
+"33050","Marathon","FL","24.731758","-81.0278","-5","1"
+"33051","Key Colony Beach","FL","24.72339","-81.020281","-5","1"
+"33052","Marathon Shores","FL","24.723283","-81.063249","-5","1"
+"33054","Opa Locka","FL","25.909039","-80.24945","-5","1"
+"33055","Opa Locka","FL","25.94422","-80.2773","-5","1"
+"33056","Opa Locka","FL","25.946754","-80.24962","-5","1"
+"33058","Lake Lucerne","FL","25.968737","-80.262604","-5","1"
+"33060","Pompano Beach","FL","26.232009","-80.12211","-5","1"
+"33061","Pompano Beach","FL","26.253909","-80.134216","-5","1"
+"33062","Pompano Beach","FL","26.236792","-80.09594","-5","1"
+"33063","Pompano Beach","FL","26.251909","-80.21016","-5","1"
+"33064","Pompano Beach","FL","26.279108","-80.11319","-5","1"
+"33065","Pompano Beach","FL","26.272608","-80.25589","-5","1"
+"33066","Pompano Beach","FL","26.253238","-80.17799","-5","1"
+"33067","Pompano Beach","FL","26.3007","-80.22727","-5","1"
+"33068","Pompano Beach","FL","26.21606","-80.21776","-5","1"
+"33069","Pompano Beach","FL","26.22876","-80.15816","-5","1"
+"33070","Tavernier","FL","25.006349","-80.53139","-5","1"
+"33071","Pompano Beach","FL","26.242559","-80.26564","-5","1"
+"33072","Pompano Beach","FL","26.233459","-80.092365","-5","1"
+"33073","Pompano Beach","FL","26.305433","-80.18287","-5","1"
+"33074","Pompano Beach","FL","26.145724","-80.448254","-5","1"
+"33075","Pompano Beach","FL","26.145724","-80.448254","-5","1"
+"33076","Pompano Beach","FL","26.30116","-80.2731","-5","1"
+"33077","Pompano Beach","FL","26.145724","-80.448254","-5","1"
+"33081","Hollywood","FL","26.145724","-80.448254","-5","1"
+"33082","Pembroke Pines","FL","26.145724","-80.448254","-5","1"
+"33083","Hollywood","FL","26.145724","-80.448254","-5","1"
+"33084","Pembroke Pines","FL","26.289057","-80.129816","-5","1"
+"33090","Homestead","FL","25.558428","-80.458168","-5","1"
+"33092","Homestead","FL","25.558428","-80.458168","-5","1"
+"33093","Pompano Beach","FL","26.145724","-80.448254","-5","1"
+"33097","Pompano Beach","FL","26.145724","-80.448254","-5","1"
+"33101","Miami","FL","25.779076","-80.19782","-5","1"
+"33102","Miami","FL","25.558428","-80.458168","-5","1"
+"33107","Miami","FL","25.558428","-80.458168","-5","1"
+"33109","Miami Beach","FL","25.759474","-80.13907","-5","1"
+"33110","Miami","FL","25.846874","-80.20827","-5","1"
+"33111","Miami","FL","25.558428","-80.458168","-5","1"
+"33114","Miami","FL","25.558428","-80.458168","-5","1"
+"33116","Miami","FL","25.558428","-80.458168","-5","1"
+"33119","Miami Beach","FL","25.784526","-80.131967","-5","1"
+"33121","Miami","FL","25.558428","-80.458168","-5","1"
+"33122","Miami","FL","25.799962","-80.31775","-5","1"
+"33124","Miami","FL","25.558428","-80.458168","-5","1"
+"33125","Miami","FL","25.782176","-80.23607","-5","1"
+"33126","Miami","FL","25.777977","-80.29718","-5","1"
+"33127","Miami","FL","25.813808","-80.2058","-5","1"
+"33128","Miami","FL","25.777143","-80.20225","-5","1"
+"33129","Miami","FL","25.757227","-80.20656","-5","1"
+"33130","Miami","FL","25.768277","-80.20339","-5","1"
+"33131","Miami","FL","25.767368","-80.1893","-5","1"
+"33132","Miami","FL","25.784326","-80.18753","-5","1"
+"33133","Miami","FL","25.730678","-80.2441","-5","1"
+"33134","Miami","FL","25.753927","-80.27034","-5","1"
+"33135","Miami","FL","25.766577","-80.23576","-5","1"
+"33136","Miami","FL","25.786326","-80.2029","-5","1"
+"33137","Miami","FL","25.817325","-80.19046","-5","1"
+"33138","Miami","FL","25.853184","-80.18622","-5","1"
+"33139","Miami Beach","FL","25.784276","-80.14126","-5","1"
+"33140","Miami Beach","FL","25.814225","-80.13085","-5","1"
+"33141","Miami Beach","FL","25.858573","-80.12973","-5","1"
+"33142","Miami","FL","25.812625","-80.2369","-5","1"
+"33143","Miami","FL","25.702929","-80.29642","-5","1"
+"33144","Miami","FL","25.76226","-80.30839","-5","1"
+"33145","Miami","FL","25.753177","-80.23327","-5","1"
+"33146","Miami","FL","25.720728","-80.27255","-5","1"
+"33147","Miami","FL","25.850124","-80.23773","-5","1"
+"33148","Miami","FL","25.558428","-80.458168","-5","1"
+"33149","Key Biscayne","FL","25.700966","-80.16195","-5","1"
+"33150","Miami","FL","25.851974","-80.20566","-5","1"
+"33151","Miami","FL","25.832074","-80.20942","-5","1"
+"33152","Miami","FL","25.795476","-80.312873","-5","1"
+"33153","Miami","FL","25.865523","-80.193619","-5","1"
+"33154","Miami","FL","25.881391","-80.1276","-5","1"
+"33155","Miami","FL","25.739011","-80.30685","-5","1"
+"33156","Miami","FL","25.66558","-80.30688","-5","1"
+"33157","Miami","FL","25.606583","-80.34859","-5","1"
+"33158","Miami","FL","25.637132","-80.31641","-5","1"
+"33159","Miami","FL","25.558428","-80.458168","-5","1"
+"33160","North Miami Beach","FL","25.941535","-80.13861","-5","1"
+"33161","Miami","FL","25.893372","-80.18164","-5","1"
+"33162","Miami","FL","25.929571","-80.17839","-5","1"
+"33163","Miami","FL","25.94497","-80.21452","-5","1"
+"33164","Miami","FL","25.558428","-80.458168","-5","1"
+"33165","Miami","FL","25.734828","-80.3583","-5","1"
+"33166","Miami","FL","25.824725","-80.30476","-5","1"
+"33167","Miami","FL","25.885739","-80.23264","-5","1"
+"33168","Miami","FL","25.892185","-80.21032","-5","1"
+"33169","Miami","FL","25.94267","-80.21276","-5","1"
+"33170","Miami","FL","25.559785","-80.41664","-5","1"
+"33172","Miami","FL","25.786634","-80.36151","-5","1"
+"33173","Miami","FL","25.702429","-80.36184","-5","1"
+"33174","Miami","FL","25.763044","-80.35919","-5","1"
+"33175","Miami","FL","25.733204","-80.41197","-5","1"
+"33176","Miami","FL","25.653431","-80.35999","-5","1"
+"33177","Miami","FL","25.595983","-80.40234","-5","1"
+"33178","Miami","FL","25.837696","-80.36947","-5","1"
+"33179","Miami","FL","25.95872","-80.17941","-5","1"
+"33180","Miami","FL","25.962069","-80.14465","-5","1"
+"33181","Miami","FL","25.897372","-80.16048","-5","1"
+"33182","Miami","FL","25.781127","-80.40467","-5","1"
+"33183","Miami","FL","25.699968","-80.40811","-5","1"
+"33184","Miami","FL","25.759184","-80.40773","-5","1"
+"33185","Miami","FL","25.723173","-80.43995","-5","1"
+"33186","Miami","FL","25.662292","-80.40947","-5","1"
+"33187","Miami","FL","25.596234","-80.4765","-5","1"
+"33188","Miami","FL","25.558428","-80.458168","-5","1"
+"33189","Miami","FL","25.574834","-80.3467","-5","1"
+"33190","Miami","FL","25.56071","-80.3494","-5","1"
+"33192","Miami","FL","25.558428","-80.458168","-5","1"
+"33193","Miami","FL","25.70028","-80.44721","-5","1"
+"33194","Miami","FL","25.745549","-80.4651","-5","1"
+"33195","Miami","FL","25.772876","-80.187019","-5","1"
+"33196","Miami","FL","25.650232","-80.45925","-5","1"
+"33197","Miami","FL","25.558428","-80.458168","-5","1"
+"33199","Miami","FL","25.558428","-80.458168","-5","1"
+"33201","Hollywood","FL","26.013768","-80.206869","-5","1"
+"33231","Miami","FL","25.558428","-80.458168","-5","1"
+"33233","Miami","FL","25.558428","-80.458168","-5","1"
+"33234","Miami","FL","25.558428","-80.458168","-5","1"
+"33238","Miami","FL","25.558428","-80.458168","-5","1"
+"33239","Miami Beach","FL","25.558428","-80.458168","-5","1"
+"33242","Miami","FL","25.558428","-80.458168","-5","1"
+"33243","Miami","FL","25.558428","-80.458168","-5","1"
+"33245","Miami","FL","25.558428","-80.458168","-5","1"
+"33247","Miami","FL","25.558428","-80.458168","-5","1"
+"33255","Miami","FL","25.558428","-80.458168","-5","1"
+"33256","Miami","FL","25.558428","-80.458168","-5","1"
+"33257","Miami","FL","25.558428","-80.458168","-5","1"
+"33261","Miami","FL","25.558428","-80.458168","-5","1"
+"33265","Miami","FL","25.558428","-80.458168","-5","1"
+"33266","Miami","FL","25.558428","-80.458168","-5","1"
+"33269","Miami","FL","25.558428","-80.458168","-5","1"
+"33280","Miami","FL","25.558428","-80.458168","-5","1"
+"33283","Miami","FL","25.558428","-80.458168","-5","1"
+"33296","Miami","FL","25.558428","-80.458168","-5","1"
+"33299","Miami","FL","25.558428","-80.458168","-5","1"
+"33301","Fort Lauderdale","FL","26.121114","-80.13187","-5","1"
+"33302","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33303","Fort Lauderdale","FL","26.196911","-80.095165","-5","1"
+"33304","Fort Lauderdale","FL","26.137693","-80.12646","-5","1"
+"33305","Fort Lauderdale","FL","26.153728","-80.12606","-5","1"
+"33306","Fort Lauderdale","FL","26.165212","-80.11379","-5","1"
+"33307","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33308","Fort Lauderdale","FL","26.191111","-80.10846","-5","1"
+"33309","Fort Lauderdale","FL","26.185461","-80.17218","-5","1"
+"33310","Fort Lauderdale","FL","26.144263","-80.206919","-5","1"
+"33311","Fort Lauderdale","FL","26.13883","-80.16865","-5","1"
+"33312","Fort Lauderdale","FL","26.094665","-80.17987","-5","1"
+"33313","Fort Lauderdale","FL","26.148613","-80.22446","-5","1"
+"33314","Fort Lauderdale","FL","26.067966","-80.22016","-5","1"
+"33315","Fort Lauderdale","FL","26.094385","-80.15422","-5","1"
+"33316","Fort Lauderdale","FL","26.101114","-80.12931","-5","1"
+"33317","Fort Lauderdale","FL","26.113664","-80.22376","-5","1"
+"33318","Fort Lauderdale","FL","26.11842","-80.251988","-5","1"
+"33319","Fort Lauderdale","FL","26.183628","-80.22122","-5","1"
+"33320","Fort Lauderdale","FL","26.162462","-80.25822","-5","1"
+"33321","Fort Lauderdale","FL","26.211122","-80.2631","-5","1"
+"33322","Fort Lauderdale","FL","26.150863","-80.27284","-5","1"
+"33323","Fort Lauderdale","FL","26.156854","-80.31408","-5","1"
+"33324","Fort Lauderdale","FL","26.110631","-80.27469","-5","1"
+"33325","Fort Lauderdale","FL","26.112924","-80.32097","-5","1"
+"33326","Weston","FL","26.112366","-80.37697","-5","1"
+"33327","Weston","FL","26.120134","-80.41441","-5","1"
+"33328","Fort Lauderdale","FL","26.062016","-80.27202","-5","1"
+"33329","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33330","Fort Lauderdale","FL","26.05479","-80.31581","-5","1"
+"33331","Fort Lauderdale","FL","26.056111","-80.36373","-5","1"
+"33332","Fort Lauderdale","FL","26.049367","-80.40885","-5","1"
+"33334","Fort Lauderdale","FL","26.182161","-80.13341","-5","1"
+"33335","Fort Lauderdale","FL","26.089215","-80.335973","-5","1"
+"33337","Fort Lauderdale","FL","26.129013","-80.260071","-5","1"
+"33338","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33339","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33340","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33345","Fort Lauderdale","FL","26.165424","-80.29589","-5","1"
+"33346","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33348","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33349","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33351","Fort Lauderdale","FL","26.179495","-80.27183","-5","1"
+"33352","Pine Island Ridge","FL","26.094025","-80.273961","-5","1"
+"33355","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33359","Fort Lauderdale","FL","26.145724","-80.448254","-5","1"
+"33380","Winter Haven","FL","28.017179","-81.754949","-5","1"
+"33388","Fort Lauderdale","FL","26.120714","-80.25326","-5","1"
+"33394","Fort Lauderdale","FL","26.121364","-80.13916","-5","1"
+"33401","West Palm Beach","FL","26.711192","-80.06043","-5","1"
+"33402","West Palm Beach","FL","26.645895","-80.430269","-5","1"
+"33403","West Palm Beach","FL","26.802139","-80.07032","-5","1"
+"33404","West Palm Beach","FL","26.782114","-80.06528","-5","1"
+"33405","West Palm Beach","FL","26.669744","-80.0585","-5","1"
+"33406","West Palm Beach","FL","26.659294","-80.09118","-5","1"
+"33407","West Palm Beach","FL","26.750991","-80.07296","-5","1"
+"33408","North Palm Beach","FL","26.840684","-80.06312","-5","1"
+"33409","West Palm Beach","FL","26.709575","-80.09443","-5","1"
+"33410","West Palm Beach","FL","26.839588","-80.08824","-5","1"
+"33411","West Palm Beach","FL","26.719596","-80.22077","-5","1"
+"33412","West Palm Beach","FL","26.795367","-80.24044","-5","1"
+"33413","West Palm Beach","FL","26.668944","-80.14721","-5","1"
+"33414","West Palm Beach","FL","26.65671","-80.25377","-5","1"
+"33415","West Palm Beach","FL","26.659344","-80.12704","-5","1"
+"33416","West Palm Beach","FL","26.665394","-80.092864","-5","1"
+"33417","West Palm Beach","FL","26.715596","-80.1262","-5","1"
+"33418","West Palm Beach","FL","26.877984","-80.16052","-5","1"
+"33419","West Palm Beach","FL","26.645895","-80.430269","-5","1"
+"33420","West Palm Beach","FL","26.645895","-80.430269","-5","1"
+"33421","West Palm Beach","FL","26.645895","-80.430269","-5","1"
+"33422","West Palm Beach","FL","26.645895","-80.430269","-5","1"
+"33424","Boynton Beach","FL","26.645895","-80.430269","-5","1"
+"33425","Boynton Beach","FL","26.645895","-80.430269","-5","1"
+"33426","Boynton Beach","FL","26.529581","-80.08226","-5","1"
+"33427","Boca Raton","FL","26.375954","-80.10717","-5","1"
+"33428","Boca Raton","FL","26.348354","-80.21841","-5","1"
+"33429","Boca Raton","FL","26.645895","-80.430269","-5","1"
+"33430","Belle Glade","FL","26.685125","-80.66279","-5","1"
+"33431","Boca Raton","FL","26.381304","-80.09623","-5","1"
+"33432","Boca Raton","FL","26.347305","-80.08552","-5","1"
+"33433","Boca Raton","FL","26.347711","-80.15648","-5","1"
+"33434","Boca Raton","FL","26.382408","-80.16699","-5","1"
+"33435","Boynton Beach","FL","26.524549","-80.06321","-5","1"
+"33436","Boynton Beach","FL","26.530144","-80.10461","-5","1"
+"33437","Boynton Beach","FL","26.522249","-80.15031","-5","1"
+"33438","Canal Point","FL","26.900359","-80.60368","-5","1"
+"33439","Bryant","FL","26.645895","-80.430269","-5","1"
+"33440","Clewiston","FL","26.714088","-80.9973","-5","1"
+"33441","Deerfield Beach","FL","26.309657","-80.09541","-5","1"
+"33442","Deerfield Beach","FL","26.309757","-80.14548","-5","1"
+"33443","Deerfield Beach","FL","26.145724","-80.448254","-5","1"
+"33444","Delray Beach","FL","26.460951","-80.07891","-5","1"
+"33445","Delray Beach","FL","26.459571","-80.10582","-5","1"
+"33446","Delray Beach","FL","26.452473","-80.16509","-5","1"
+"33447","Delray Beach","FL","26.645895","-80.430269","-5","1"
+"33448","Delray Beach","FL","26.645895","-80.430269","-5","1"
+"33452","Lantana","FL","26.590609","-80.052663","-5","1"
+"33454","Lake Worth","FL","26.645895","-80.430269","-5","1"
+"33455","Hobe Sound","FL","27.076516","-80.14697","-5","1"
+"33458","Jupiter","FL","26.928035","-80.11803","-5","1"
+"33459","Lake Harbor","FL","26.645895","-80.430269","-5","1"
+"33460","Lake Worth","FL","26.619695","-80.05676","-5","1"
+"33461","Lake Worth","FL","26.621145","-80.08976","-5","1"
+"33462","Lake Worth","FL","26.579714","-80.07437","-5","1"
+"33463","Lake Worth","FL","26.609226","-80.12874","-5","1"
+"33464","Lake Worth","FL","26.645895","-80.430269","-5","1"
+"33465","Lake Worth","FL","26.628272","-80.132569","-5","1"
+"33466","Lake Worth","FL","26.645895","-80.430269","-5","1"
+"33467","Lake Worth","FL","26.601937","-80.17921","-5","1"
+"33468","Jupiter","FL","26.645895","-80.430269","-5","1"
+"33469","Jupiter","FL","26.968795","-80.0994","-5","1"
+"33470","Loxahatchee","FL","26.751094","-80.30156","-5","1"
+"33471","Moore Haven","FL","26.844989","-81.1105","-5","1"
+"33474","Boynton Beach","FL","26.645895","-80.430269","-5","1"
+"33475","Hobe Sound","FL","27.110182","-80.454196","-5","1"
+"33476","Pahokee","FL","26.817786","-80.65425","-5","1"
+"33477","Jupiter","FL","26.924709","-80.08119","-5","1"
+"33478","Jupiter","FL","26.925835","-80.21526","-5","1"
+"33480","Palm Beach","FL","26.715067","-80.03937","-5","1"
+"33481","Boca Raton","FL","26.645895","-80.430269","-5","1"
+"33482","Delray Beach","FL","26.645895","-80.430269","-5","1"
+"33483","Delray Beach","FL","26.465051","-80.06517","-5","1"
+"33484","Delray Beach","FL","26.458152","-80.1356","-5","1"
+"33486","Boca Raton","FL","26.344955","-80.11226","-5","1"
+"33487","Boca Raton","FL","26.409953","-80.08841","-5","1"
+"33488","Boca Raton","FL","26.645895","-80.430269","-5","1"
+"33493","South Bay","FL","26.663097","-80.71827","-5","1"
+"33496","Boca Raton","FL","26.404353","-80.1627","-5","1"
+"33497","Boca Raton","FL","26.645895","-80.430269","-5","1"
+"33498","Boca Raton","FL","26.391346","-80.21824","-5","1"
+"33499","Boca Raton","FL","26.645895","-80.430269","-5","1"
+"33501","Brandon","FL","27.929731","-82.315058","-5","1"
+"33503","Balm","FL","27.764761","-82.273409","-5","1"
+"33509","Brandon","FL","28.119579","-82.451959","-5","1"
+"33510","Brandon","FL","27.953801","-82.29748","-5","1"
+"33511","Brandon","FL","27.911201","-82.2948","-5","1"
+"33513","Bushnell","FL","28.663132","-82.14042","-5","1"
+"33514","Center Hill","FL","28.654412","-81.98278","-5","1"
+"33515","Fort Lauderdale","FL","26.092115","-80.163418","-5","1"
+"33521","Coleman","FL","28.805331","-82.07371","-5","1"
+"33523","Dade City","FL","28.433019","-82.19736","-5","1"
+"33524","Crystal Springs","FL","28.182209","-82.152341","-5","1"
+"33525","Dade City","FL","28.346914","-82.20293","-5","1"
+"33526","Dade City","FL","28.310134","-82.247783","-5","1"
+"33527","Dover","FL","27.98706","-82.21357","-5","1"
+"33528","Lake Panasoffkee","FL","28.801617","-82.133869","-5","1"
+"33530","Durant","FL","27.906823","-82.176749","-5","1"
+"33534","Gibsonton","FL","27.837894","-82.37407","-5","1"
+"33537","Lacoochee","FL","28.324796","-82.481766","-5","1"
+"33538","Lake Panasoffkee","FL","28.835261","-82.14818","-5","1"
+"33539","Zephyrhills","FL","28.21305","-82.16568","-5","1"
+"33540","Zephyrhills","FL","28.235313","-82.16868","-5","1"
+"33541","Zephyrhills","FL","28.234624","-82.20022","-5","1"
+"33542","Zephyrhills","FL","28.238489","-82.181913","-5","1"
+"33543","Zephyrhills","FL","28.187356","-82.31601","-5","1"
+"33544","Zephyrhills","FL","28.26658","-82.34222","-5","1"
+"33547","Lithia","FL","27.788498","-82.1508","-5","1"
+"33548","Lutz","FL","27.871964","-82.438841","-5","1"
+"33549","Lutz","FL","28.142694","-82.46629","-5","1"
+"33550","Mango","FL","27.871964","-82.438841","-5","1"
+"33556","Odessa","FL","28.143377","-82.59054","-5","1"
+"33558","Land O' Lakes","FL","28.157704","-82.514615","-5","1"
+"33559","Land O' Lakes","FL","28.156536","-82.415275","-5","1"
+"33563","Plant City","FL","28.016971","-82.128584","-5","1"
+"33564","Plant City","FL","28.029627","-82.134741","-5","1"
+"33565","Plant City","FL","28.065552","-82.14506","-5","1"
+"33566","Plant City","FL","28.013755","-82.11685","-5","1"
+"33567","Plant City","FL","27.982949","-82.14539","-5","1"
+"33568","Riverview","FL","27.871964","-82.438841","-5","1"
+"33569","Riverview","FL","27.847802","-82.31799","-5","1"
+"33570","Ruskin","FL","27.703801","-82.44385","-5","1"
+"33571","Sun City Center","FL","27.720111","-82.453041","-5","1"
+"33572","Apollo Beach","FL","27.771988","-82.41078","-5","1"
+"33573","Sun City Center","FL","27.713353","-82.35965","-5","1"
+"33574","Saint Leo","FL","28.334752","-82.269323","-5","1"
+"33576","San Antonio","FL","28.331979","-82.28877","-5","1"
+"33578","St. Leo","FL","28.331186","-82.252917","-5","1"
+"33583","Seffner","FL","27.871964","-82.438841","-5","1"
+"33584","Seffner","FL","27.987925","-82.28819","-5","1"
+"33585","Sumterville","FL","28.754347","-82.06126","-5","1"
+"33586","Sun City","FL","27.871964","-82.438841","-5","1"
+"33587","Sydney","FL","27.871964","-82.438841","-5","1"
+"33592","Thonotosassa","FL","28.077843","-82.29837","-5","1"
+"33593","Trilby","FL","28.324796","-82.481766","-5","1"
+"33594","Valrico","FL","27.911226","-82.24508","-5","1"
+"33595","Valrico","FL","27.871964","-82.438841","-5","1"
+"33597","Webster","FL","28.568393","-82.15053","-5","1"
+"33598","Wimauma","FL","27.693924","-82.32758","-5","1"
+"33599","Punta Gorda","FL","26.871443","-82.007115","-5","1"
+"33601","Tampa","FL","27.996097","-82.582035","-5","1"
+"33602","Tampa","FL","27.956149","-82.45723","-5","1"
+"33603","Tampa","FL","27.984198","-82.4627","-5","1"
+"33604","Tampa","FL","28.016846","-82.4566","-5","1"
+"33605","Tampa","FL","27.963849","-82.43193","-5","1"
+"33606","Tampa","FL","27.936799","-82.46911","-5","1"
+"33607","Tampa","FL","27.963798","-82.49537","-5","1"
+"33608","Tampa","FL","27.84343","-82.488413","-5","1"
+"33609","Tampa","FL","27.943549","-82.50656","-5","1"
+"33610","Tampa","FL","27.993498","-82.40914","-5","1"
+"33611","Tampa","FL","27.891151","-82.50581","-5","1"
+"33612","Tampa","FL","28.048595","-82.45171","-5","1"
+"33613","Tampa","FL","28.077994","-82.44989","-5","1"
+"33614","Tampa","FL","28.006247","-82.50632","-5","1"
+"33615","Tampa","FL","28.005446","-82.57776","-5","1"
+"33616","Tampa","FL","27.869251","-82.52226","-5","1"
+"33617","Tampa","FL","28.039096","-82.39371","-5","1"
+"33618","Tampa","FL","28.071502","-82.49392","-5","1"
+"33619","Tampa","FL","27.94605","-82.37525","-5","1"
+"33620","Tampa","FL","28.062961","-82.41314","-5","1"
+"33621","Tampa","FL","27.855078","-82.52464","-5","1"
+"33622","Tampa","FL","27.871964","-82.438841","-5","1"
+"33623","Tampa","FL","27.871964","-82.438841","-5","1"
+"33624","Tampa","FL","28.07506","-82.52355","-5","1"
+"33625","Tampa","FL","28.069755","-82.55734","-5","1"
+"33626","Tampa","FL","28.052799","-82.61135","-5","1"
+"33629","Tampa","FL","27.92085","-82.50916","-5","1"
+"33630","Tampa","FL","27.871964","-82.438841","-5","1"
+"33631","Tampa","FL","27.871964","-82.438841","-5","1"
+"33633","Tampa","FL","27.871964","-82.438841","-5","1"
+"33634","Tampa","FL","28.005497","-82.54936","-5","1"
+"33635","Tampa","FL","28.031088","-82.60593","-5","1"
+"33637","Tampa","FL","28.038324","-82.36289","-5","1"
+"33643","Tampa","FL","28.130402","-82.337751","-5","1"
+"33647","Tampa","FL","28.127973","-82.36123","-5","1"
+"33650","Tampa","FL","27.871964","-82.438841","-5","1"
+"33651","Tampa","FL","27.871964","-82.438841","-5","1"
+"33655","Tampa","FL","27.871964","-82.438841","-5","1"
+"33659","Palm River-Clair Mel","FL","27.894362","-82.338911","-5","1"
+"33660","Tampa","FL","27.871964","-82.438841","-5","1"
+"33661","Tampa","FL","27.871964","-82.438841","-5","1"
+"33662","Tampa","FL","27.871964","-82.438841","-5","1"
+"33663","Tampa","FL","27.871964","-82.438841","-5","1"
+"33664","Tampa","FL","27.871964","-82.438841","-5","1"
+"33672","Tampa","FL","27.871964","-82.438841","-5","1"
+"33673","Tampa","FL","27.871964","-82.438841","-5","1"
+"33674","Tampa","FL","27.871964","-82.438841","-5","1"
+"33675","Tampa","FL","27.871964","-82.438841","-5","1"
+"33677","Tampa","FL","27.871964","-82.438841","-5","1"
+"33679","Tampa","FL","27.871964","-82.438841","-5","1"
+"33680","Tampa","FL","27.871964","-82.438841","-5","1"
+"33681","Tampa","FL","27.871964","-82.438841","-5","1"
+"33682","Tampa","FL","27.871964","-82.438841","-5","1"
+"33684","Tampa","FL","27.871964","-82.438841","-5","1"
+"33685","Tampa","FL","27.871964","-82.438841","-5","1"
+"33686","Tampa","FL","27.871964","-82.438841","-5","1"
+"33687","Tampa","FL","27.871964","-82.438841","-5","1"
+"33688","Tampa","FL","27.871964","-82.438841","-5","1"
+"33689","Tampa","FL","27.871964","-82.438841","-5","1"
+"33690","Tampa","FL","27.871964","-82.438841","-5","1"
+"33694","Tampa","FL","27.871964","-82.438841","-5","1"
+"33697","Tampa","FL","27.871964","-82.438841","-5","1"
+"33701","Saint Petersburg","FL","27.770955","-82.63931","-5","1"
+"33702","Saint Petersburg","FL","27.843052","-82.6449","-5","1"
+"33703","Saint Petersburg","FL","27.816977","-82.62795","-5","1"
+"33704","Saint Petersburg","FL","27.796454","-82.63751","-5","1"
+"33705","Saint Petersburg","FL","27.741306","-82.64349","-5","1"
+"33706","Saint Petersburg","FL","27.741505","-82.75179","-5","1"
+"33707","Saint Petersburg","FL","27.756505","-82.71764","-5","1"
+"33708","Saint Petersburg","FL","27.811626","-82.79321","-5","1"
+"33709","Saint Petersburg","FL","27.815953","-82.72865","-5","1"
+"33710","Saint Petersburg","FL","27.788637","-82.72244","-5","1"
+"33711","Saint Petersburg","FL","27.750655","-82.6882","-5","1"
+"33712","Saint Petersburg","FL","27.745355","-82.66572","-5","1"
+"33713","Saint Petersburg","FL","27.787904","-82.68039","-5","1"
+"33714","Saint Petersburg","FL","27.817323","-82.67612","-5","1"
+"33715","Saint Petersburg","FL","27.68301","-82.72096","-5","1"
+"33716","Saint Petersburg","FL","27.874324","-82.64515","-5","1"
+"33728","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33729","Saint Petersburg","FL","27.881909","-82.664359","-5","1"
+"33730","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33731","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33732","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33733","Saint Petersburg","FL","27.925755","-82.75211","-5","1"
+"33734","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33736","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33737","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33738","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33740","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33741","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33742","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33743","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33744","Bay Pines","FL","27.891809","-82.724763","-5","1"
+"33747","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33755","Clearwater","FL","27.979114","-82.78166","-5","1"
+"33756","Clearwater","FL","27.944631","-82.78702","-5","1"
+"33757","Clearwater","FL","27.891809","-82.724763","-5","1"
+"33758","Clearwater","FL","27.891809","-82.724763","-5","1"
+"33759","Clearwater","FL","27.980297","-82.71645","-5","1"
+"33760","Clearwater","FL","27.90802","-82.71365","-5","1"
+"33761","Clearwater","FL","28.032827","-82.72596","-5","1"
+"33762","Clearwater","FL","27.883118","-82.68389","-5","1"
+"33763","Clearwater","FL","28.001394","-82.74549","-5","1"
+"33764","Clearwater","FL","27.932797","-82.74115","-5","1"
+"33765","Clearwater","FL","27.971362","-82.74482","-5","1"
+"33766","Clearwater","FL","27.891809","-82.724763","-5","1"
+"33767","Clearwater Beach","FL","27.982722","-82.82504","-5","1"
+"33769","Clearwater","FL","27.891809","-82.724763","-5","1"
+"33770","Largo","FL","27.916149","-82.80122","-5","1"
+"33771","Largo","FL","27.906088","-82.7553","-5","1"
+"33772","Seminole","FL","27.843349","-82.79307","-5","1"
+"33773","Largo","FL","27.883188","-82.75633","-5","1"
+"33774","Largo","FL","27.885283","-82.82607","-5","1"
+"33775","Seminole","FL","27.891809","-82.724763","-5","1"
+"33776","Seminole","FL","27.853151","-82.82712","-5","1"
+"33777","Largo","FL","27.851052","-82.76111","-5","1"
+"33778","Largo","FL","27.885344","-82.79594","-5","1"
+"33779","Largo","FL","27.839698","-82.772483","-5","1"
+"33780","Pinellas Park","FL","27.891809","-82.724763","-5","1"
+"33781","Pinellas Park","FL","27.839802","-82.71094","-5","1"
+"33782","Pinellas Park","FL","27.861925","-82.71145","-5","1"
+"33784","Saint Petersburg","FL","27.891809","-82.724763","-5","1"
+"33785","Indian Rocks Beach","FL","27.887923","-82.84703","-5","1"
+"33786","Belleair Beach","FL","27.924748","-82.83937","-5","1"
+"33801","Lakeland","FL","28.041198","-81.92392","-5","1"
+"33802","Lakeland","FL","28.020992","-81.985185","-5","1"
+"33803","Lakeland","FL","28.015032","-81.95206","-5","1"
+"33804","Lakeland","FL","28.002553","-81.61864","-5","1"
+"33805","Lakeland","FL","28.071564","-81.95802","-5","1"
+"33806","Lakeland","FL","28.002553","-81.61864","-5","1"
+"33807","Lakeland","FL","28.002553","-81.61864","-5","1"
+"33809","Lakeland","FL","28.128494","-81.95625","-5","1"
+"33810","Lakeland","FL","28.106787","-82.01033","-5","1"
+"33811","Lakeland","FL","27.978316","-82.00841","-5","1"
+"33813","Lakeland","FL","27.965469","-81.92215","-5","1"
+"33815","Lakeland","FL","28.042948","-81.9849","-5","1"
+"33820","Alturas","FL","28.002553","-81.61864","-5","1"
+"33823","Auburndale","FL","28.068865","-81.80267","-5","1"
+"33825","Avon Park","FL","27.60047","-81.50932","-5","1"
+"33826","Avon Park","FL","27.339483","-81.252872","-5","1"
+"33827","Babson Park","FL","27.826864","-81.53291","-5","1"
+"33830","Bartow","FL","27.894991","-81.82638","-5","1"
+"33831","Bartow","FL","27.955426","-81.951673","-5","1"
+"33834","Bowling Green","FL","27.613064","-81.93581","-5","1"
+"33835","Bradley","FL","27.710056","-81.95196","-5","1"
+"33836","Davenport","FL","28.167211","-81.631589","-5","1"
+"33837","Davenport","FL","28.223014","-81.63131","-5","1"
+"33838","Dundee","FL","28.021066","-81.61872","-5","1"
+"33839","Eagle Lake","FL","27.98038","-81.75531","-5","1"
+"33840","Eaton Park","FL","28.084383","-81.5415","-5","1"
+"33841","Fort Meade","FL","27.7437","-81.79405","-5","1"
+"33843","Frostproof","FL","27.757986","-81.5088","-5","1"
+"33844","Haines City","FL","28.101527","-81.6235","-5","1"
+"33845","Haines City","FL","28.002553","-81.61864","-5","1"
+"33846","Highland City","FL","27.964651","-81.867153","-5","1"
+"33847","Homeland","FL","27.815882","-81.82529","-5","1"
+"33848","Intercession City","FL","28.26074","-81.50669","-5","1"
+"33849","Kathleen","FL","28.24625","-82.06358","-5","1"
+"33850","Lake Alfred","FL","28.092512","-81.72758","-5","1"
+"33851","Lake Hamilton","FL","28.044641","-81.62373","-5","1"
+"33852","Lake Placid","FL","27.293327","-81.38206","-5","1"
+"33853","Lake Wales","FL","27.894622","-81.52824","-5","1"
+"33854","Fedhaven","FL","28.002553","-81.61864","-5","1"
+"33855","Indian Lake Estates","FL","27.798022","-81.357154","-5","1"
+"33856","Nalcrest","FL","27.855686","-81.430915","-5","1"
+"33857","Lorida","FL","27.397067","-81.1411","-5","1"
+"33858","Loughman","FL","28.050121","-81.505211","-5","1"
+"33859","Lake Wales","FL","27.885359","-81.522998","-5","1"
+"33860","Mulberry","FL","27.884256","-81.97697","-5","1"
+"33862","Lake Placid","FL","27.244668","-81.288424","-5","1"
+"33863","Nichols","FL","28.002553","-81.61864","-5","1"
+"33865","Ona","FL","27.432764","-81.93703","-5","1"
+"33867","River Ranch","FL","27.768567","-81.19664","-5","1"
+"33868","Polk City","FL","28.180035","-81.81863","-5","1"
+"33870","Sebring","FL","27.483817","-81.42131","-5","1"
+"33871","Sebring","FL","27.485803","-81.407884","-5","1"
+"33872","Sebring","FL","27.475288","-81.48535","-5","1"
+"33873","Wauchula","FL","27.541676","-81.8127","-5","1"
+"33875","Sebring","FL","27.430819","-81.463297","-5","1"
+"33876","Sebring","FL","27.436826","-81.35515","-5","1"
+"33877","Waverly","FL","27.982891","-81.61743","-5","1"
+"33880","Winter Haven","FL","27.997276","-81.74554","-5","1"
+"33881","Winter Haven","FL","28.051985","-81.72457","-5","1"
+"33882","Winter Haven","FL","28.029402","-81.732139","-5","1"
+"33883","Winter Haven","FL","28.002553","-81.61864","-5","1"
+"33884","Winter Haven","FL","27.997387","-81.68256","-5","1"
+"33885","Winter Haven","FL","28.002553","-81.61864","-5","1"
+"33888","Winter Haven","FL","28.023115","-81.723417","-5","1"
+"33890","Zolfo Springs","FL","27.485551","-81.72528","-5","1"
+"33896","Loughman","FL","28.252198","-81.607612","-5","1"
+"33897","Citrus Ridge","FL","28.310679","-81.670264","-5","1"
+"33898","Highland Park","FL","27.918187","-81.493521","-5","1"
+"33901","Fort Myers","FL","26.62365","-81.8727","-5","1"
+"33902","Fort Myers","FL","26.623908","-81.883648","-5","1"
+"33903","North Fort Myers","FL","26.698526","-81.9178","-5","1"
+"33904","Cape Coral","FL","26.582185","-81.95528","-5","1"
+"33905","Fort Myers","FL","26.680407","-81.74812","-5","1"
+"33906","Fort Myers","FL","26.552895","-81.94861","-5","1"
+"33907","Fort Myers","FL","26.566053","-81.87009","-5","1"
+"33908","Fort Myers","FL","26.502677","-81.93052","-5","1"
+"33909","Cape Coral","FL","26.687462","-81.94968","-5","1"
+"33910","Cape Coral","FL","26.552895","-81.94861","-5","1"
+"33911","Fort Myers","FL","26.596286","-81.882373","-5","1"
+"33912","Fort Myers","FL","26.501582","-81.82841","-5","1"
+"33913","Fort Myers","FL","26.542097","-81.69984","-5","1"
+"33914","Cape Coral","FL","26.579862","-82.00227","-5","1"
+"33915","Cape Coral","FL","26.659942","-81.893427","-5","1"
+"33916","Fort Myers","FL","26.6435","-81.84418","-5","1"
+"33917","North Fort Myers","FL","26.711647","-81.865","-5","1"
+"33918","North Fort Myers","FL","26.71613","-81.607007","-5","1"
+"33919","Fort Myers","FL","26.555958","-81.90174","-5","1"
+"33920","Alva","FL","26.711362","-81.61684","-5","1"
+"33921","Boca Grande","FL","26.759514","-82.26351","-5","1"
+"33922","Bokeelia","FL","26.6636","-82.14112","-5","1"
+"33924","Captiva","FL","26.519415","-82.19101","-5","1"
+"33927","Punta Gorda","FL","26.901981","-82.000005","-5","1"
+"33928","Estero","FL","26.425671","-81.80196","-5","1"
+"33930","Felda","FL","26.581172","-81.46202","-5","1"
+"33931","Fort Myers Beach","FL","26.446463","-81.93269","-5","1"
+"33932","Fort Myers Beach","FL","26.552895","-81.94861","-5","1"
+"33935","Labelle","FL","26.760476","-81.43029","-5","1"
+"33936","Lehigh Acres","FL","26.588982","-81.61163","-5","1"
+"33938","Murdock","FL","26.901981","-82.000005","-5","1"
+"33944","Palmdale","FL","26.95925","-81.31568","-5","1"
+"33945","Pineland","FL","26.59951","-82.22166","-5","1"
+"33946","Placida","FL","26.849473","-82.28661","-5","1"
+"33947","Rotonda West","FL","26.894448","-82.26125","-5","1"
+"33948","Port Charlotte","FL","26.984486","-82.14859","-5","1"
+"33949","Port Charlotte","FL","26.993904","-82.098418","-5","1"
+"33950","Punta Gorda","FL","26.914393","-82.04106","-5","1"
+"33951","Punta Gorda","FL","26.970756","-81.984504","-5","1"
+"33952","Port Charlotte","FL","26.993876","-82.09821","-5","1"
+"33953","Port Charlotte","FL","27.012758","-82.2112","-5","1"
+"33954","Port Charlotte","FL","27.02442","-82.12225","-5","1"
+"33955","Punta Gorda","FL","26.837879","-82.00403","-5","1"
+"33956","Saint James City","FL","26.536435","-82.0915","-5","1"
+"33957","Sanibel","FL","26.439608","-82.08045","-5","1"
+"33960","Venus","FL","27.052583","-81.39628","-5","1"
+"33961","Fort Myers","FL","26.629875","-81.857683","-5","1"
+"33965","Fort Myers","FL","26.552895","-81.94861","-5","1"
+"33970","Lehigh Acres","FL","26.564718","-81.620778","-5","1"
+"33971","Lehigh Acres","FL","26.60599","-81.70296","-5","1"
+"33972","Lehigh Acres","FL","26.634332","-81.59391","-5","1"
+"33975","Labelle","FL","26.742327","-81.27863","-5","1"
+"33980","Port Charlotte","FL","26.983094","-82.05972","-5","1"
+"33981","Port Charlotte","FL","26.922089","-82.23092","-5","1"
+"33982","Punta Gorda","FL","26.958821","-81.95134","-5","1"
+"33983","Punta Gorda","FL","26.999486","-82.00964","-5","1"
+"33990","Cape Coral","FL","26.63075","-81.95251","-5","1"
+"33991","Cape Coral","FL","26.634338","-82.00674","-5","1"
+"33993","Cape Coral","FL","26.681122","-82.01319","-5","1"
+"33994","Fort Myers","FL","26.552895","-81.94861","-5","1"
+"34101","Naples","FL","25.855534","-81.38719","-5","1"
+"34102","Naples","FL","26.142938","-81.79852","-5","1"
+"34103","Naples","FL","26.191117","-81.80333","-5","1"
+"34104","Naples","FL","26.15091","-81.7477","-5","1"
+"34105","Naples","FL","26.187767","-81.76829","-5","1"
+"34106","Naples","FL","26.14326","-81.389124","-5","1"
+"34107","Vanderbilt Beach","FL","26.14326","-81.389124","-5","1"
+"34108","Naples","FL","26.252711","-81.80825","-5","1"
+"34109","Naples","FL","26.240637","-81.76663","-5","1"
+"34110","Naples","FL","26.28828","-81.78726","-5","1"
+"34112","Naples","FL","26.121546","-81.75251","-5","1"
+"34113","Naples","FL","26.067538","-81.72002","-5","1"
+"34114","Naples","FL","26.020283","-81.63094","-5","1"
+"34116","Naples","FL","26.183424","-81.70643","-5","1"
+"34117","Naples","FL","26.1785","-81.55495","-5","1"
+"34119","Naples","FL","26.256551","-81.7186","-5","1"
+"34120","Naples","FL","26.275676","-81.59586","-5","1"
+"34133","Bonita Springs","FL","26.552895","-81.94861","-5","1"
+"34134","Bonita Springs","FL","26.348608","-81.83134","-5","1"
+"34135","Bonita Springs","FL","26.348523","-81.77391","-5","1"
+"34136","Bonita Springs","FL","26.552895","-81.94861","-5","1"
+"34137","Copeland","FL","26.03569","-81.46799","-5","1"
+"34138","Chokoloskee","FL","25.813786","-81.36291","-5","1"
+"34139","Everglades City","FL","25.856771","-81.38412","-5","1"
+"34140","Goodland","FL","26.14326","-81.389124","-5","1"
+"34141","Ochopee","FL","25.7265","-81.20151","-5","1"
+"34142","Immokalee","FL","26.398248","-81.39325","-5","1"
+"34143","Immokalee","FL","26.464183","-81.504661","-5","1"
+"34145","Marco Island","FL","25.940112","-81.71329","-5","1"
+"34146","Marco Island","FL","26.14326","-81.389124","-5","1"
+"34154","Goodland","FL","25.925446","-81.644387","-5","1"
+"34168","Chokoloskee","FL","25.81528","-81.359902","-5","1"
+"34201","Bradenton","FL","27.400627","-82.47104","-5","1"
+"34202","Bradenton","FL","27.434755","-82.40211","-5","1"
+"34203","Bradenton","FL","27.448369","-82.52324","-5","1"
+"34204","Bradenton","FL","27.427213","-82.438689","-5","1"
+"34205","Bradenton","FL","27.485617","-82.58294","-5","1"
+"34206","Bradenton","FL","27.427213","-82.438689","-5","1"
+"34207","Bradenton","FL","27.438719","-82.57646","-5","1"
+"34208","Bradenton","FL","27.486448","-82.535","-5","1"
+"34209","Bradenton","FL","27.488866","-82.62737","-5","1"
+"34210","Bradenton","FL","27.455543","-82.63372","-5","1"
+"34211","Memphis","FL","27.437698","-82.372125","-5","1"
+"34215","Cortez","FL","27.469113","-82.68765","-5","1"
+"34216","Anna Maria","FL","27.530644","-82.73594","-5","1"
+"34217","Bradenton Beach","FL","27.499982","-82.7129","-5","1"
+"34218","Holmes Beach","FL","27.499515","-82.709871","-5","1"
+"34219","Parrish","FL","27.574128","-82.40701","-5","1"
+"34220","Palmetto","FL","27.427213","-82.438689","-5","1"
+"34221","Palmetto","FL","27.549314","-82.55981","-5","1"
+"34222","Ellenton","FL","27.532098","-82.5009","-5","1"
+"34223","Englewood","FL","26.974858","-82.3665","-5","1"
+"34224","Englewood","FL","26.925265","-82.29693","-5","1"
+"34228","Longboat Key","FL","27.396931","-82.64475","-5","1"
+"34229","Osprey","FL","27.187829","-82.48539","-5","1"
+"34230","Sarasota","FL","27.335023","-82.537169","-5","1"
+"34231","Sarasota","FL","27.267649","-82.51663","-5","1"
+"34232","Sarasota","FL","27.321313","-82.47648","-5","1"
+"34233","Sarasota","FL","27.285142","-82.47363","-5","1"
+"34234","Sarasota","FL","27.365622","-82.53556","-5","1"
+"34235","Sarasota","FL","27.365549","-82.48659","-5","1"
+"34236","Sarasota","FL","27.333014","-82.54613","-5","1"
+"34237","Sarasota","FL","27.336973","-82.51506","-5","1"
+"34238","Sarasota","FL","27.240571","-82.47836","-5","1"
+"34239","Sarasota","FL","27.310924","-82.5213","-5","1"
+"34240","Sarasota","FL","27.33458","-82.40894","-5","1"
+"34241","Sarasota","FL","27.272873","-82.41676","-5","1"
+"34242","Sarasota","FL","27.275225","-82.54934","-5","1"
+"34243","Sarasota","FL","27.407657","-82.52923","-5","1"
+"34250","Terra Ceia","FL","27.575972","-82.58493","-5","1"
+"34251","Myakka City","FL","27.396045","-82.23349","-5","1"
+"34260","Manasota","FL","27.427213","-82.438689","-5","1"
+"34264","Oneco","FL","27.427213","-82.438689","-5","1"
+"34265","Arcadia","FL","27.186146","-81.809939","-5","1"
+"34266","Arcadia","FL","27.201006","-81.87196","-5","1"
+"34267","Fort Ogden","FL","27.186146","-81.809939","-5","1"
+"34268","Nocatee","FL","27.158612","-81.88324","-5","1"
+"34270","Tallevast","FL","27.405429","-82.543519","-5","1"
+"34272","Laurel","FL","27.146963","-82.425512","-5","1"
+"34274","Nokomis","FL","27.144031","-82.464468","-5","1"
+"34275","Nokomis","FL","27.136731","-82.45241","-5","1"
+"34276","Sarasota","FL","27.167521","-82.380967","-5","1"
+"34277","Sarasota","FL","27.167521","-82.380967","-5","1"
+"34278","Sarasota","FL","27.331628","-82.528488","-5","1"
+"34280","Bradenton","FL","27.427213","-82.438689","-5","1"
+"34281","Bradenton","FL","27.427213","-82.438689","-5","1"
+"34282","Bradenton","FL","27.427213","-82.438689","-5","1"
+"34284","Venice","FL","27.167521","-82.380967","-5","1"
+"34285","Venice","FL","27.091783","-82.44846","-5","1"
+"34286","North Port","FL","27.072445","-82.1606","-5","1"
+"34287","North Port","FL","27.051075","-82.24417","-5","1"
+"34288","North Port","FL","27.048707","-82.127196","-5","1"
+"34289","North Port","FL","27.08464","-82.156884","-5","1"
+"34292","Venice","FL","27.098474","-82.41481","-5","1"
+"34293","Venice","FL","27.055013","-82.3973","-5","1"
+"34295","Englewood","FL","27.085985","-82.438918","-5","1"
+"34334","Grove City","FL","26.89679","-82.317993","-5","1"
+"34420","Belleview","FL","29.054976","-82.04255","-5","1"
+"34421","Belleview","FL","29.240728","-82.087458","-5","1"
+"34423","Crystal River","FL","28.867027","-82.572703","-5","1"
+"34424","Crystal River","FL","28.916441","-82.608795","-5","1"
+"34426","Pine Ridge","FL","28.94159","-82.503117","-5","1"
+"34428","Crystal River","FL","28.95138","-82.61213","-5","1"
+"34429","Crystal River","FL","28.872108","-82.5961","-5","1"
+"34430","Dunnellon","FL","29.240728","-82.087458","-5","1"
+"34431","Dunnellon","FL","29.131665","-82.49726","-5","1"
+"34432","Dunnellon","FL","29.060092","-82.35195","-5","1"
+"34433","Dunnellon","FL","28.997155","-82.50053","-5","1"
+"34434","Dunnellon","FL","28.99409","-82.45364","-5","1"
+"34436","Floral City","FL","28.751024","-82.28449","-5","1"
+"34442","Hernando","FL","28.932925","-82.39477","-5","1"
+"34445","Holder","FL","28.948753","-82.406476","-5","1"
+"34446","Homosassa","FL","28.746912","-82.53331","-5","1"
+"34447","Homosassa Springs","FL","28.804911","-82.574264","-5","1"
+"34448","Homosassa","FL","28.797979","-82.5912","-5","1"
+"34449","Inglis","FL","29.07664","-82.68022","-5","1"
+"34450","Inverness","FL","28.829773","-82.29019","-5","1"
+"34451","Inverness","FL","28.803207","-82.32167","-5","1"
+"34452","Inverness","FL","28.793722","-82.35021","-5","1"
+"34453","Inverness","FL","28.865761","-82.35982","-5","1"
+"34460","Lecanto","FL","28.859286","-82.508694","-5","1"
+"34461","Lecanto","FL","28.848776","-82.48108","-5","1"
+"34464","Beverly Hills","FL","28.859286","-82.508694","-5","1"
+"34465","Beverly Hills","FL","28.932403","-82.47641","-5","1"
+"34470","Ocala","FL","29.198704","-82.10556","-5","1"
+"34471","Ocala","FL","29.171187","-82.10394","-5","1"
+"34472","Ocala","FL","29.120287","-82.02133","-5","1"
+"34473","Ocala","FL","29.003195","-82.1899","-5","1"
+"34474","Ocala","FL","29.166186","-82.17027","-5","1"
+"34475","Ocala","FL","29.212886","-82.15378","-5","1"
+"34476","Ocala","FL","29.08091","-82.21004","-5","1"
+"34477","Ocala","FL","29.240728","-82.087458","-5","1"
+"34478","Ocala","FL","29.187178","-82.112278","-5","1"
+"34479","Ocala","FL","29.23543","-82.1107","-5","1"
+"34480","Ocala","FL","29.12295","-82.0816","-5","1"
+"34481","Ocala","FL","29.124611","-82.32271","-5","1"
+"34482","Ocala","FL","29.232873","-82.2522","-5","1"
+"34483","Ocala","FL","29.240728","-82.087458","-5","1"
+"34484","Oxford","FL","28.921705","-82.07847","-5","1"
+"34487","Homosassa","FL","28.859286","-82.508694","-5","1"
+"34488","Silver Springs","FL","29.198564","-81.92095","-5","1"
+"34489","Silver Springs","FL","29.215153","-82.097163","-5","1"
+"34491","Summerfield","FL","28.991135","-82.02658","-5","1"
+"34492","Summerfield","FL","28.99796","-82.016139","-5","1"
+"34498","Yankeetown","FL","29.031155","-82.7201","-5","1"
+"34592","Port St. Lucie","FL","27.287855","-80.2978","-5","1"
+"34601","Brooksville","FL","28.566183","-82.38002","-5","1"
+"34602","Brooksville","FL","28.51589","-82.26576","-5","1"
+"34603","Brooksville","FL","28.564167","-82.416515","-5","1"
+"34604","Spring Hill","FL","28.478994","-82.453508","-5","1"
+"34605","Brooksville","FL","28.505896","-82.422554","-5","1"
+"34606","Spring Hill","FL","28.470236","-82.59741","-5","1"
+"34607","Spring Hill","FL","28.516609","-82.61302","-5","1"
+"34608","Spring Hill","FL","28.484316","-82.55181","-5","1"
+"34609","Brooksville","FL","28.475662","-82.50199","-5","1"
+"34610","Brooksville","FL","28.397791","-82.53084","-5","1"
+"34611","Spring Hill","FL","28.564167","-82.416515","-5","1"
+"34613","Brooksville","FL","28.555346","-82.53601","-5","1"
+"34614","Brooksville","FL","28.632101","-82.52181","-5","1"
+"34636","Istachatta","FL","28.65503","-82.267706","-5","1"
+"34639","Land O Lakes","FL","28.233671","-82.45463","-5","1"
+"34652","New Port Richey","FL","28.237582","-82.72818","-5","1"
+"34653","New Port Richey","FL","28.248558","-82.69869","-5","1"
+"34654","New Port Richey","FL","28.295714","-82.61782","-5","1"
+"34655","New Port Richey","FL","28.209833","-82.66973","-5","1"
+"34656","New Port Richey","FL","28.324796","-82.481766","-5","1"
+"34660","Ozona","FL","28.067043","-82.778424","-5","1"
+"34661","Nobleton","FL","28.643141","-82.26051","-5","1"
+"34667","Hudson","FL","28.372441","-82.66603","-5","1"
+"34668","Port Richey","FL","28.30073","-82.69698","-5","1"
+"34669","Hudson","FL","28.348507","-82.61937","-5","1"
+"34673","Port Richey","FL","28.324796","-82.481766","-5","1"
+"34674","Hudson","FL","28.324796","-82.481766","-5","1"
+"34677","Oldsmar","FL","28.042799","-82.67737","-5","1"
+"34678","Palm Harbor","FL","28.061727","-82.777757","-5","1"
+"34679","Aripeka","FL","28.429478","-82.66315","-5","1"
+"34680","Elfers","FL","28.324796","-82.481766","-5","1"
+"34681","Crystal Beach","FL","28.088443","-82.77834","-5","1"
+"34682","Palm Harbor","FL","27.891809","-82.724763","-5","1"
+"34683","Palm Harbor","FL","28.076744","-82.76116","-5","1"
+"34684","Palm Harbor","FL","28.081325","-82.72751","-5","1"
+"34685","Palm Harbor","FL","28.099485","-82.69532","-5","1"
+"34688","Tarpon Springs","FL","27.891809","-82.724763","-5","1"
+"34689","Tarpon Springs","FL","28.149691","-82.75339","-5","1"
+"34690","Holiday","FL","28.190181","-82.72696","-5","1"
+"34691","Holiday","FL","28.19006","-82.75735","-5","1"
+"34695","Safety Harbor","FL","28.005639","-82.69511","-5","1"
+"34697","Dunedin","FL","27.891809","-82.724763","-5","1"
+"34698","Dunedin","FL","28.025395","-82.77534","-5","1"
+"34703","Astatula","FL","28.718224","-81.735239","-5","1"
+"34705","Astatula","FL","28.708139","-81.73307","-5","1"
+"34711","Clermont","FL","28.545742","-81.74805","-5","1"
+"34712","Clermont","FL","28.811078","-81.653642","-5","1"
+"34713","Clermont","FL","28.811078","-81.653642","-5","1"
+"34729","Ferndale","FL","28.811078","-81.653642","-5","1"
+"34731","Fruitland Park","FL","28.859765","-81.90184","-5","1"
+"34734","Gotha","FL","28.543429","-81.52479","-5","1"
+"34736","Groveland","FL","28.571677","-81.86649","-5","1"
+"34737","Howey In The Hills","FL","28.711167","-81.77955","-5","1"
+"34739","Kenansville","FL","27.938975","-81.0951","-5","1"
+"34740","Killarney","FL","28.545385","-81.650667","-5","1"
+"34741","Kissimmee","FL","28.301788","-81.42159","-5","1"
+"34742","Kissimmee","FL","27.995287","-81.259332","-5","1"
+"34743","Kissimmee","FL","28.325715","-81.35408","-5","1"
+"34744","Kissimmee","FL","28.308979","-81.37594","-5","1"
+"34745","Kissimmee","FL","27.995287","-81.259332","-5","1"
+"34746","Kissimmee","FL","28.287883","-81.46862","-5","1"
+"34747","Kissimmee","FL","28.326187","-81.58897","-5","1"
+"34748","Leesburg","FL","28.797245","-81.88466","-5","1"
+"34749","Leesburg","FL","28.811078","-81.653642","-5","1"
+"34753","Mascotte","FL","28.583191","-81.89038","-5","1"
+"34755","Minneola","FL","28.578234","-81.831883","-5","1"
+"34756","Montverde","FL","28.597126","-81.67579","-5","1"
+"34758","Kissimmee","FL","28.178192","-81.48731","-5","1"
+"34759","Kissimmee","FL","28.094144","-81.48395","-5","1"
+"34760","Oakland","FL","28.555328","-81.63104","-5","1"
+"34761","Ocoee","FL","28.574628","-81.52946","-5","1"
+"34762","Okahumpka","FL","28.735088","-81.91035","-5","1"
+"34769","Saint Cloud","FL","28.24934","-81.28749","-5","1"
+"34770","Saint Cloud","FL","27.995287","-81.259332","-5","1"
+"34771","Saint Cloud","FL","28.271939","-81.19645","-5","1"
+"34772","Saint Cloud","FL","28.198441","-81.27246","-5","1"
+"34773","Saint Cloud","FL","28.160376","-81.00041","-5","1"
+"34777","Winter Garden","FL","28.541579","-81.605846","-5","1"
+"34778","Winter Garden","FL","28.566338","-81.260818","-5","1"
+"34785","Wildwood","FL","28.852564","-82.0321","-5","1"
+"34786","Windermere","FL","28.495982","-81.5362","-5","1"
+"34787","Winter Garden","FL","28.536794","-81.59344","-5","1"
+"34788","Leesburg","FL","28.857425","-81.7845","-5","1"
+"34789","Leesburg","FL","28.811078","-81.653642","-5","1"
+"34797","Yalaha","FL","28.744182","-81.81859","-5","1"
+"34801","Brooksville","FL","28.566148","-82.371747","-5","1"
+"34837","Hunters Creek","FL","28.368679","-81.423542","-5","1"
+"34869","Tarpon Springs","FL","28.126307","-82.766173","-5","1"
+"34876","Lake Butter","FL","28.505419","-81.571248","-5","1"
+"34924","Okeechobee","FL","27.227002","-80.829442","-5","1"
+"34945","Fort Pierce","FL","27.431607","-80.4915","-5","1"
+"34946","Fort Pierce","FL","27.485272","-80.35243","-5","1"
+"34947","Fort Pierce","FL","27.448688","-80.36247","-5","1"
+"34948","Fort Pierce","FL","27.382196","-80.409024","-5","1"
+"34949","Fort Pierce","FL","27.472857","-80.29901","-5","1"
+"34950","Fort Pierce","FL","27.448016","-80.33644","-5","1"
+"34951","Fort Pierce","FL","27.53831","-80.40526","-5","1"
+"34952","Port Saint Lucie","FL","27.291694","-80.29691","-5","1"
+"34953","Port Saint Lucie","FL","27.246754","-80.38145","-5","1"
+"34954","Fort Pierce","FL","27.382196","-80.409024","-5","1"
+"34956","Indiantown","FL","27.049788","-80.48057","-5","1"
+"34957","Jensen Beach","FL","27.248445","-80.23277","-5","1"
+"34958","Jensen Beach","FL","27.242402","-80.224613","-5","1"
+"34972","Okeechobee","FL","27.39171","-80.87555","-5","1"
+"34973","Okeechobee","FL","27.297631","-80.802656","-5","1"
+"34974","Okeechobee","FL","27.1944","-80.84644","-5","1"
+"34979","Fort Pierce","FL","27.382196","-80.409024","-5","1"
+"34981","Fort Pierce","FL","27.410069","-80.36327","-5","1"
+"34982","Fort Pierce","FL","27.393097","-80.3279","-5","1"
+"34983","Port Saint Lucie","FL","27.312471","-80.34907","-5","1"
+"34984","Port Saint Lucie","FL","27.273272","-80.34727","-5","1"
+"34985","Port Saint Lucie","FL","27.382196","-80.409024","-5","1"
+"34986","Port Saint Lucie","FL","27.341158","-80.39786","-5","1"
+"34987","Port Saint Lucie","FL","27.273586","-80.46447","-5","1"
+"34988","Port Saint Lucie","FL","27.386818","-80.503746","-5","1"
+"34990","Palm City","FL","27.163485","-80.31267","-5","1"
+"34991","Palm City","FL","27.110182","-80.454196","-5","1"
+"34992","Port Salerno","FL","27.110182","-80.454196","-5","1"
+"34994","Stuart","FL","27.195291","-80.25225","-5","1"
+"34995","Stuart","FL","27.17537","-80.241512","-5","1"
+"34996","Stuart","FL","27.195927","-80.21143","-5","1"
+"34997","Stuart","FL","27.136003","-80.21686","-5","1"
+"35004","Moody","AL","33.606379","-86.50249","-6","1"
+"35005","Adamsville","AL","33.592585","-86.95969","-6","1"
+"35006","Adger","AL","33.451714","-87.23957","-6","1"
+"35007","Alabaster","AL","33.232422","-86.80871","-6","1"
+"35010","Alexander City","AL","32.903432","-85.92669","-6","1"
+"35011","Alexander City","AL","32.990191","-85.958001","-6","1"
+"35013","Allgood","AL","33.922162","-86.449262","-6","1"
+"35014","Alpine","AL","33.35596","-86.2772","-6","1"
+"35015","Alton","AL","33.544622","-86.929208","-6","1"
+"35016","Arab","AL","34.323715","-86.49278","-6","1"
+"35019","Baileyton","AL","34.29254","-86.63505","-6","1"
+"35020","Bessemer","AL","33.405559","-86.95141","-6","1"
+"35021","Bessemer","AL","33.544622","-86.929208","-6","1"
+"35022","Bessemer","AL","33.346817","-86.95252","-6","1"
+"35023","Bessemer","AL","33.443039","-87.0193","-6","1"
+"35026","Clanton","AL","32.859262","-86.638819","-6","1"
+"35031","Blountsville","AL","34.111425","-86.5338","-6","1"
+"35032","Bon Air","AL","33.256886","-86.338572","-6","1"
+"35033","Bremen","AL","33.952939","-87.02889","-6","1"
+"35034","Brent","AL","32.915182","-87.21488","-6","1"
+"35035","Brierfield","AL","33.041166","-86.95117","-6","1"
+"35036","Brookside","AL","33.63815","-86.91956","-6","1"
+"35038","Burnwell","AL","33.804411","-87.202136","-6","1"
+"35039","Brookside","AL","33.635848","-86.918818","-6","1"
+"35040","Calera","AL","33.107572","-86.74996","-6","1"
+"35041","Cardiff","AL","33.64672","-86.931818","-6","1"
+"35042","Centreville","AL","32.963486","-87.13867","-6","1"
+"35043","Chelsea","AL","33.317093","-86.66295","-6","1"
+"35044","Childersburg","AL","33.268471","-86.35582","-6","1"
+"35045","Clanton","AL","32.834501","-86.64355","-6","1"
+"35046","Clanton","AL","32.894351","-86.56504","-6","1"
+"35048","Clay","AL","33.544622","-86.929208","-6","1"
+"35049","Cleveland","AL","33.963435","-86.5954","-6","1"
+"35050","Columbiana","AL","33.158454","-86.621931","-6","1"
+"35051","Columbiana","AL","33.201789","-86.61584","-6","1"
+"35052","Cook Springs","AL","33.593115","-86.4084","-6","1"
+"35053","Crane Hill","AL","34.041061","-87.06771","-6","1"
+"35054","Cropwell","AL","33.506012","-86.31547","-6","1"
+"35055","Cullman","AL","34.167893","-86.82506","-6","1"
+"35056","Cullman","AL","34.196448","-86.895226","-6","1"
+"35057","Cullman","AL","34.139198","-86.92449","-6","1"
+"35058","Cullman","AL","34.223732","-86.7562","-6","1"
+"35060","Docena","AL","33.559455","-86.92968","-6","1"
+"35061","Dolomite","AL","33.462541","-86.95736","-6","1"
+"35062","Dora","AL","33.731278","-87.0361","-6","1"
+"35063","Empire","AL","33.805216","-87.00192","-6","1"
+"35064","Fairfield","AL","33.476908","-86.91684","-6","1"
+"35068","Fultondale","AL","33.611297","-86.81518","-6","1"
+"35070","Garden City","AL","34.011027","-86.74877","-6","1"
+"35071","Gardendale","AL","33.67933","-86.8206","-6","1"
+"35072","Goodwater","AL","33.089342","-86.04682","-6","1"
+"35073","Graysville","AL","33.640865","-86.96885","-6","1"
+"35074","Green Pond","AL","33.22584","-87.12515","-6","1"
+"35077","Hanceville","AL","34.043589","-86.80644","-6","1"
+"35078","Harpersville","AL","33.337092","-86.44085","-6","1"
+"35079","Hayden","AL","33.922179","-86.7607","-6","1"
+"35080","Helena","AL","33.280625","-86.88411","-6","1"
+"35082","Hollins","AL","33.116909","-86.1698","-6","1"
+"35083","Holly Pond","AL","34.198738","-86.59814","-6","1"
+"35085","Jemison","AL","32.96512","-86.74405","-6","1"
+"35087","Joppa","AL","34.303718","-86.58323","-6","1"
+"35089","Kellyton","AL","32.941708","-86.06098","-6","1"
+"35091","Kimberly","AL","33.77109","-86.80672","-6","1"
+"35094","Leeds","AL","33.530698","-86.55506","-6","1"
+"35096","Lincoln","AL","33.605233","-86.12079","-6","1"
+"35097","Locust Fork","AL","33.896526","-86.63056","-6","1"
+"35098","Logan","AL","34.120006","-87.05075","-6","1"
+"35111","McCalla","AL","33.279946","-87.10148","-6","1"
+"35112","Margaret","AL","33.681899","-86.48237","-6","1"
+"35114","Maylene","AL","33.225377","-86.86443","-6","1"
+"35115","Montevallo","AL","33.114972","-86.8738","-6","1"
+"35116","Morris","AL","33.74137","-86.78543","-6","1"
+"35117","Mount Olive","AL","33.665823","-86.87111","-6","1"
+"35118","Mulga","AL","33.529224","-87.01546","-6","1"
+"35119","New Castle","AL","33.640823","-86.77574","-6","1"
+"35120","Odenville","AL","33.668341","-86.43641","-6","1"
+"35121","Oneonta","AL","33.944897","-86.45813","-6","1"
+"35123","Palmerdale","AL","33.544622","-86.929208","-6","1"
+"35124","Pelham","AL","33.317471","-86.78726","-6","1"
+"35125","Pell City","AL","33.606663","-86.28912","-6","1"
+"35126","Pinson","AL","33.728568","-86.66052","-6","1"
+"35127","Pleasant Grove","AL","33.487675","-86.97331","-6","1"
+"35128","Pell City","AL","33.561597","-86.30285","-6","1"
+"35130","Quinton","AL","33.640629","-87.11584","-6","1"
+"35131","Ragland","AL","33.721107","-86.17492","-6","1"
+"35133","Remlap","AL","33.827521","-86.60703","-6","1"
+"35135","Riverside","AL","33.614465","-86.20067","-6","1"
+"35136","Rockford","AL","32.8697","-86.2822","-6","1"
+"35137","Saginaw","AL","33.206302","-86.781162","-6","1"
+"35139","Sayre","AL","33.712204","-86.97203","-6","1"
+"35142","Shannon","AL","33.406869","-86.87347","-6","1"
+"35143","Shelby","AL","33.080971","-86.53875","-6","1"
+"35144","Siluria","AL","33.28241","-86.683891","-6","1"
+"35146","Springville","AL","33.781133","-86.45052","-6","1"
+"35147","Sterrett","AL","33.397441","-86.54218","-6","1"
+"35148","Sumiton","AL","33.753474","-87.04756","-6","1"
+"35149","Sycamore","AL","33.252906","-86.20523","-6","1"
+"35150","Sylacauga","AL","33.185782","-86.25105","-6","1"
+"35151","Sylacauga","AL","33.137515","-86.33414","-6","1"
+"35160","Talladega","AL","33.415449","-86.10908","-6","1"
+"35161","Talladega","AL","33.420206","-86.102782","-6","1"
+"35171","Thorsby","AL","32.907616","-86.71868","-6","1"
+"35172","Trafford","AL","33.823416","-86.71537","-6","1"
+"35173","Trussville","AL","33.623485","-86.58546","-6","1"
+"35175","Union Grove","AL","34.426844","-86.51841","-6","1"
+"35176","Vandiver","AL","33.4776","-86.5126","-6","1"
+"35178","Vincent","AL","33.414831","-86.3925","-6","1"
+"35179","Vinemont","AL","34.256106","-86.92158","-6","1"
+"35180","Warrior","AL","33.82343","-86.81569","-6","1"
+"35181","Watson","AL","33.544622","-86.929208","-6","1"
+"35182","Wattsville","AL","33.706786","-86.256658","-6","1"
+"35183","Weogufka","AL","33.016558","-86.33936","-6","1"
+"35184","West Blocton","AL","33.118259","-87.13548","-6","1"
+"35185","Westover","AL","33.335629","-86.543692","-6","1"
+"35186","Wilsonville","AL","33.241272","-86.50614","-6","1"
+"35187","Wilton","AL","33.08104","-86.879328","-6","1"
+"35188","Woodstock","AL","33.195743","-87.16252","-6","1"
+"35201","Birmingham","AL","33.456412","-86.801904","-6","1"
+"35202","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35203","Birmingham","AL","33.519055","-86.8097","-6","1"
+"35204","Birmingham","AL","33.519855","-86.83534","-6","1"
+"35205","Birmingham","AL","33.497055","-86.8057","-6","1"
+"35206","Birmingham","AL","33.568573","-86.72163","-6","1"
+"35207","Birmingham","AL","33.560652","-86.81897","-6","1"
+"35208","Birmingham","AL","33.494545","-86.88115","-6","1"
+"35209","Birmingham","AL","33.468306","-86.80814","-6","1"
+"35210","Birmingham","AL","33.546051","-86.66963","-6","1"
+"35211","Birmingham","AL","33.479306","-86.85878","-6","1"
+"35212","Birmingham","AL","33.542004","-86.74896","-6","1"
+"35213","Birmingham","AL","33.507637","-86.74161","-6","1"
+"35214","Birmingham","AL","33.558772","-86.89199","-6","1"
+"35215","Birmingham","AL","33.636102","-86.69506","-6","1"
+"35216","Birmingham","AL","33.420558","-86.78489","-6","1"
+"35217","Birmingham","AL","33.590003","-86.76708","-6","1"
+"35218","Birmingham","AL","33.506456","-86.89524","-6","1"
+"35219","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35220","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35221","Birmingham","AL","33.450267","-86.8965","-6","1"
+"35222","Birmingham","AL","33.524254","-86.77335","-6","1"
+"35223","Birmingham","AL","33.488355","-86.73402","-6","1"
+"35224","Birmingham","AL","33.517706","-86.93189","-6","1"
+"35225","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35226","Birmingham","AL","33.406409","-86.8295","-6","1"
+"35228","Birmingham","AL","33.454262","-86.92273","-6","1"
+"35229","Birmingham","AL","33.462856","-86.790389","-6","1"
+"35230","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35231","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35232","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35233","Birmingham","AL","33.509623","-86.7997","-6","1"
+"35234","Birmingham","AL","33.538504","-86.80602","-6","1"
+"35235","Birmingham","AL","33.609779","-86.65507","-6","1"
+"35236","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35237","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35238","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35240","Birmingham","AL","33.425892","-86.776926","-6","1"
+"35242","Birmingham","AL","33.409582","-86.69684","-6","1"
+"35243","Birmingham","AL","33.437667","-86.74586","-6","1"
+"35244","Birmingham","AL","33.356981","-86.81577","-6","1"
+"35245","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35246","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35249","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35253","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35254","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35255","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35259","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35260","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35261","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35263","Birmingham","AL","33.522505","-86.80939","-6","1"
+"35266","Birmingham","AL","33.372861","-86.853075","-6","1"
+"35277","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35278","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35279","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35280","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35281","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35282","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35283","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35285","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35286","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35287","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35288","Birmingham","AL","33.445808","-86.928542","-6","1"
+"35289","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35290","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35291","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35292","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35293","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35294","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35295","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35296","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35297","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35298","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35299","Birmingham","AL","33.544622","-86.929208","-6","1"
+"35308","Dora","AL","33.706068","-87.092112","-6","1"
+"35401","Tuscaloosa","AL","33.193818","-87.56843","-6","1"
+"35402","Tuscaloosa","AL","33.306606","-87.453224","-6","1"
+"35403","Tuscaloosa","AL","33.205073","-87.52749","-6","1"
+"35404","Tuscaloosa","AL","33.217168","-87.49461","-6","1"
+"35405","Tuscaloosa","AL","33.149246","-87.52303","-6","1"
+"35406","Tuscaloosa","AL","33.271585","-87.50611","-6","1"
+"35407","Tuscaloosa","AL","33.306606","-87.453224","-6","1"
+"35440","Abernant","AL","33.311014","-87.18975","-6","1"
+"35441","Akron","AL","32.871514","-87.73326","-6","1"
+"35442","Aliceville","AL","33.095505","-88.18653","-6","1"
+"35443","Boligee","AL","32.772835","-88.0321","-6","1"
+"35444","Brookwood","AL","33.276411","-87.3052","-6","1"
+"35446","Buhl","AL","33.207547","-87.75054","-6","1"
+"35447","Carrollton","AL","33.254197","-88.16866","-6","1"
+"35448","Clinton","AL","32.835692","-87.956884","-6","1"
+"35449","Coaling","AL","33.135876","-87.338369","-6","1"
+"35452","Coker","AL","33.249332","-87.67217","-6","1"
+"35453","Cottondale","AL","33.170357","-87.39889","-6","1"
+"35456","Duncanville","AL","33.068806","-87.43974","-6","1"
+"35457","Echola","AL","33.301003","-87.77187","-6","1"
+"35458","Elrod","AL","33.274081","-87.80211","-6","1"
+"35459","Emelle","AL","32.80728","-88.31069","-6","1"
+"35460","Epes","AL","32.716468","-88.15261","-6","1"
+"35461","Ethelsville","AL","33.421827","-88.22013","-6","1"
+"35462","Eutaw","AL","32.931143","-87.93837","-6","1"
+"35463","Fosters","AL","33.081289","-87.68988","-6","1"
+"35464","Gainesville","AL","32.811241","-88.1648","-6","1"
+"35466","Gordo","AL","33.299935","-87.88368","-6","1"
+"35468","Kellerman","AL","33.306606","-87.453224","-6","1"
+"35469","Knoxville","AL","33.012557","-87.79793","-6","1"
+"35470","Livingston","AL","32.558949","-88.12485","-6","1"
+"35471","McShan","AL","33.402134","-88.14732","-6","1"
+"35473","Northport","AL","33.260567","-87.58945","-6","1"
+"35474","Moundville","AL","32.962981","-87.61717","-6","1"
+"35475","Northport","AL","33.388654","-87.57913","-6","1"
+"35476","Northport","AL","33.227736","-87.58819","-6","1"
+"35477","Panola","AL","32.915891","-88.25764","-6","1"
+"35478","Peterson","AL","33.306606","-87.453224","-6","1"
+"35480","Ralph","AL","33.102981","-87.83382","-6","1"
+"35481","Reform","AL","33.399471","-88.02086","-6","1"
+"35482","Samantha","AL","33.306606","-87.453224","-6","1"
+"35485","Tuscaloosa","AL","33.306606","-87.453224","-6","1"
+"35486","Tuscaloosa","AL","33.272662","-87.793794","-6","1"
+"35487","Tuscaloosa","AL","33.307222","-87.585902","-6","1"
+"35490","Vance","AL","33.197284","-87.25156","-6","1"
+"35491","West Greene","AL","32.835692","-87.956884","-6","1"
+"35501","Jasper","AL","33.828412","-87.27632","-6","1"
+"35502","Jasper","AL","33.901993","-87.293888","-6","1"
+"35503","Jasper","AL","33.907546","-87.29957","-6","1"
+"35504","Jasper","AL","33.883566","-87.2125","-6","1"
+"35540","Addison","AL","34.223057","-87.17232","-6","1"
+"35541","Arley","AL","34.059527","-87.18344","-6","1"
+"35542","Bankston","AL","33.703682","-87.67155","-6","1"
+"35543","Bear Creek","AL","34.247898","-87.72171","-6","1"
+"35544","Beaverton","AL","33.939291","-88.01367","-6","1"
+"35545","Belk","AL","33.641227","-87.92911","-6","1"
+"35546","Berry","AL","33.628719","-87.58251","-6","1"
+"35548","Brilliant","AL","34.043457","-87.7594","-6","1"
+"35549","Carbon Hill","AL","33.87798","-87.52728","-6","1"
+"35550","Cordova","AL","33.754767","-87.16587","-6","1"
+"35551","Delmar","AL","34.145939","-87.373241","-6","1"
+"35552","Detroit","AL","34.061266","-88.15462","-6","1"
+"35553","Double Springs","AL","34.146713","-87.39317","-6","1"
+"35554","Eldridge","AL","33.903299","-87.65194","-6","1"
+"35555","Fayette","AL","33.681768","-87.83026","-6","1"
+"35559","Glen Allen","AL","33.909001","-87.73186","-6","1"
+"35560","Goodsprings","AL","33.679503","-87.237372","-6","1"
+"35563","Guin","AL","33.972007","-87.90302","-6","1"
+"35564","Hackleburg","AL","34.262751","-87.83441","-6","1"
+"35565","Haleyville","AL","34.225425","-87.6118","-6","1"
+"35570","Hamilton","AL","34.149717","-88.00384","-6","1"
+"35571","Hodges","AL","34.341907","-87.94612","-6","1"
+"35572","Houston","AL","34.16678","-87.26526","-6","1"
+"35573","Kansas","AL","33.92169","-87.524264","-6","1"
+"35574","Kennedy","AL","33.586897","-87.97695","-6","1"
+"35575","Lynn","AL","34.049426","-87.57065","-6","1"
+"35576","Millport","AL","33.581135","-88.10835","-6","1"
+"35577","Natural Bridge","AL","34.093409","-87.600815","-6","1"
+"35578","Nauvoo","AL","33.97173","-87.45746","-6","1"
+"35579","Oakman","AL","33.673236","-87.37169","-6","1"
+"35580","Parrish","AL","33.701484","-87.27103","-6","1"
+"35581","Phil Campbell","AL","34.343017","-87.71277","-6","1"
+"35582","Red Bay","AL","34.448328","-88.12041","-6","1"
+"35584","Sipsey","AL","33.823683","-87.08699","-6","1"
+"35585","Spruce Pine","AL","34.428048","-87.80695","-6","1"
+"35586","Sulligent","AL","33.864591","-88.13117","-6","1"
+"35587","Townley","AL","33.807412","-87.446","-6","1"
+"35592","Vernon","AL","33.752857","-88.0996","-6","1"
+"35593","Vina","AL","34.369264","-88.06745","-6","1"
+"35594","Winfield","AL","33.925454","-87.78949","-6","1"
+"35601","Decatur","AL","34.595332","-86.98786","-6","1"
+"35602","Decatur","AL","34.606216","-87.088142","-6","1"
+"35603","Decatur","AL","34.539072","-86.95732","-6","1"
+"35609","Decatur","AL","34.495365","-86.82993","-6","1"
+"35610","Anderson","AL","34.944113","-87.24921","-6","1"
+"35611","Athens","AL","34.784028","-87.02767","-6","1"
+"35612","Athens","AL","34.774907","-87.030479","-6","1"
+"35613","Athens","AL","34.808165","-86.89623","-6","1"
+"35614","Athens","AL","34.860179","-87.06231","-6","1"
+"35615","Belle Mina","AL","34.774907","-87.030479","-6","1"
+"35616","Cherokee","AL","34.748498","-87.9986","-6","1"
+"35617","Cloverdale","AL","34.869964","-87.706859","-6","1"
+"35618","Courtland","AL","34.665033","-87.30978","-6","1"
+"35619","Danville","AL","34.404908","-87.12915","-6","1"
+"35620","Elkmont","AL","34.930354","-86.9809","-6","1"
+"35621","Eva","AL","34.334972","-86.71847","-6","1"
+"35622","Falkville","AL","34.340484","-86.89176","-6","1"
+"35630","Florence","AL","34.817537","-87.66253","-6","1"
+"35631","Florence","AL","34.869964","-87.706859","-6","1"
+"35632","Florence","AL","34.869964","-87.706859","-6","1"
+"35633","Florence","AL","34.898897","-87.77379","-6","1"
+"35634","Florence","AL","34.888897","-87.60731","-6","1"
+"35640","Hartselle","AL","34.442184","-86.94027","-6","1"
+"35643","Hillsboro","AL","34.648768","-87.20394","-6","1"
+"35645","Killen","AL","34.904208","-87.50776","-6","1"
+"35646","Leighton","AL","34.660322","-87.53577","-6","1"
+"35647","Lester","AL","34.967939","-87.11732","-6","1"
+"35648","Lexington","AL","34.966009","-87.38262","-6","1"
+"35649","Mooresville","AL","34.625704","-86.8784","-6","1"
+"35650","Moulton","AL","34.496476","-87.27802","-6","1"
+"35651","Mount Hope","AL","34.476048","-87.48875","-6","1"
+"35652","Rogersville","AL","34.843309","-87.29937","-6","1"
+"35653","Russellville","AL","34.519453","-87.78077","-6","1"
+"35654","Russellville","AL","34.516472","-87.65265","-6","1"
+"35659","Russellville","AL","34.536839","-87.704179","-6","1"
+"35660","Sheffield","AL","34.759738","-87.69317","-6","1"
+"35661","Muscle Shoals","AL","34.759947","-87.62705","-6","1"
+"35662","Muscle Shoals","AL","34.757152","-87.966575","-6","1"
+"35670","Somerville","AL","34.481885","-86.7525","-6","1"
+"35671","Tanner","AL","34.67373","-86.94986","-6","1"
+"35672","Town Creek","AL","34.64248","-87.41166","-6","1"
+"35673","Trinity","AL","34.581591","-87.11884","-6","1"
+"35674","Tuscumbia","AL","34.70017","-87.7142","-6","1"
+"35677","Waterloo","AL","34.950648","-88.02603","-6","1"
+"35699","Decatur","AL","34.495365","-86.82993","-6","1"
+"35703","Cardiff","AL","33.64672","-86.931818","-6","1"
+"35715","Montevallo","AL","33.08696","-86.855772","-6","1"
+"35739","Ardmore","AL","34.972309","-86.81352","-6","1"
+"35740","Bridgeport","AL","34.943871","-85.73077","-6","1"
+"35741","Brownsboro","AL","34.720813","-86.48932","-6","1"
+"35742","Capshaw","AL","34.813577","-86.80405","-6","1"
+"35744","Dutton","AL","34.610055","-85.91553","-6","1"
+"35745","Estillfork","AL","34.929269","-86.20726","-6","1"
+"35746","Fackler","AL","34.830058","-85.97048","-6","1"
+"35747","Grant","AL","34.500216","-86.27889","-6","1"
+"35748","Gurley","AL","34.710942","-86.38995","-6","1"
+"35749","Harvest","AL","34.815817","-86.76003","-6","1"
+"35750","Hazel Green","AL","34.948321","-86.58988","-6","1"
+"35751","Hollytree","AL","34.815033","-86.27258","-6","1"
+"35752","Hollywood","AL","34.745259","-85.94729","-6","1"
+"35754","Laceys Spring","AL","34.520438","-86.61977","-6","1"
+"35755","Langston","AL","34.501178","-86.11516","-6","1"
+"35756","Madison","AL","34.630103","-86.80159","-6","1"
+"35757","Madison","AL","34.776638","-86.75164","-6","1"
+"35758","Madison","AL","34.715065","-86.73964","-6","1"
+"35759","Meridianville","AL","34.863236","-86.56137","-6","1"
+"35760","New Hope","AL","34.541285","-86.39852","-6","1"
+"35761","New Market","AL","34.902137","-86.44272","-6","1"
+"35762","Normal","AL","34.733964","-86.522913","-6","1"
+"35763","Owens Cross Roads","AL","34.624533","-86.47069","-6","1"
+"35764","Paint Rock","AL","34.694662","-86.31816","-6","1"
+"35765","Pisgah","AL","34.695645","-85.80484","-6","1"
+"35766","Princeton","AL","34.842944","-86.23149","-6","1"
+"35767","Ryland","AL","34.733964","-86.522913","-6","1"
+"35768","Scottsboro","AL","34.712327","-86.08387","-6","1"
+"35769","Scottsboro","AL","34.606124","-86.06464","-6","1"
+"35771","Section","AL","34.546397","-85.98279","-6","1"
+"35772","Stevenson","AL","34.877531","-85.84528","-6","1"
+"35773","Toney","AL","34.90267","-86.71367","-6","1"
+"35774","Trenton","AL","34.752369","-86.22634","-6","1"
+"35775","Valhermoso Springs","AL","34.550375","-86.70576","-6","1"
+"35776","Woodville","AL","34.664895","-86.23363","-6","1"
+"35801","Huntsville","AL","34.72879","-86.57316","-6","1"
+"35802","Huntsville","AL","34.666041","-86.55929","-6","1"
+"35803","Huntsville","AL","34.603017","-86.54293","-6","1"
+"35804","Huntsville","AL","34.728366","-86.585312","-6","1"
+"35805","Huntsville","AL","34.711291","-86.61691","-6","1"
+"35806","Huntsville","AL","34.748066","-86.68317","-6","1"
+"35807","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35808","Huntsville","AL","34.623075","-86.6647","-6","1"
+"35809","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35810","Huntsville","AL","34.77624","-86.61339","-6","1"
+"35811","Huntsville","AL","34.78108","-86.53163","-6","1"
+"35812","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35813","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35814","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35815","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35816","Huntsville","AL","34.73969","-86.62464","-6","1"
+"35824","Huntsville","AL","34.654126","-86.73987","-6","1"
+"35893","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35894","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35895","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35896","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35897","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35898","Huntsville","AL","34.733964","-86.522913","-6","1"
+"35899","Huntsville","AL","34.733898","-86.645592","-6","1"
+"35901","Gadsden","AL","34.016747","-85.99282","-6","1"
+"35902","Gadsden","AL","33.984062","-85.803434","-6","1"
+"35903","Gadsden","AL","33.996698","-85.92496","-6","1"
+"35904","Gadsden","AL","34.032097","-86.0353","-6","1"
+"35905","Gadsden","AL","33.942031","-85.93993","-6","1"
+"35906","Rainbow City","AL","33.943964","-86.06154","-6","1"
+"35907","Gadsden","AL","33.906415","-86.02665","-6","1"
+"35950","Albertville","AL","34.261878","-86.22835","-6","1"
+"35951","Albertville","AL","34.313014","-86.19282","-6","1"
+"35952","Altoona","AL","34.057496","-86.32225","-6","1"
+"35953","Ashville","AL","33.825516","-86.24231","-6","1"
+"35954","Attalla","AL","34.043263","-86.08904","-6","1"
+"35956","Boaz","AL","34.155318","-86.13237","-6","1"
+"35957","Boaz","AL","34.203621","-86.1728","-6","1"
+"35958","Bryant","AL","34.921827","-85.63784","-6","1"
+"35959","Cedar Bluff","AL","34.237989","-85.61277","-6","1"
+"35960","Centre","AL","34.141067","-85.60472","-6","1"
+"35961","Collinsville","AL","34.279268","-85.85634","-6","1"
+"35962","Crossville","AL","34.297717","-86.036","-6","1"
+"35963","Dawson","AL","34.359766","-85.92825","-6","1"
+"35964","Douglas","AL","34.34962","-86.319824","-6","1"
+"35966","Flat Rock","AL","34.788306","-85.67642","-6","1"
+"35967","Fort Payne","AL","34.429472","-85.71078","-6","1"
+"35968","Fort Payne","AL","34.460537","-85.76744","-6","1"
+"35969","Fort Payne","AL","34.452575","-85.717302","-6","1"
+"35971","Fyffe","AL","34.457657","-85.92772","-6","1"
+"35972","Gallant","AL","33.987653","-86.25523","-6","1"
+"35973","Gaylesville","AL","34.333048","-85.55172","-6","1"
+"35974","Geraldine","AL","34.361787","-86.0098","-6","1"
+"35975","Groveoak","AL","34.431683","-86.06169","-6","1"
+"35976","Guntersville","AL","34.350835","-86.30475","-6","1"
+"35978","Henagar","AL","34.637589","-85.73274","-6","1"
+"35979","Higdon","AL","34.831242","-85.61564","-6","1"
+"35980","Horton","AL","34.179277","-86.36882","-6","1"
+"35981","Ider","AL","34.717362","-85.65353","-6","1"
+"35983","Leesburg","AL","34.189256","-85.76816","-6","1"
+"35984","Mentone","AL","34.557735","-85.5751","-6","1"
+"35986","Rainsville","AL","34.500878","-85.83763","-6","1"
+"35987","Steele","AL","33.9117","-86.24408","-6","1"
+"35988","Sylvania","AL","34.56838","-85.79646","-6","1"
+"35989","Valley Head","AL","34.5852","-85.65125","-6","1"
+"35990","Walnut Grove","AL","34.066644","-86.30438","-6","1"
+"36003","Autaugaville","AL","32.439967","-86.68801","-6","1"
+"36005","Banks","AL","31.859531","-85.75558","-6","1"
+"36006","Billingsley","AL","32.65279","-86.7143","-6","1"
+"36008","Booth","AL","32.501649","-86.572711","-6","1"
+"36009","Brantley","AL","31.579451","-86.3188","-6","1"
+"36010","Brundidge","AL","31.678393","-85.82425","-6","1"
+"36013","Cecil","AL","32.295289","-85.99653","-6","1"
+"36015","Chapman","AL","31.642713","-86.734317","-6","1"
+"36016","Clayton","AL","31.843675","-85.43298","-6","1"
+"36017","Clio","AL","31.692576","-85.55787","-6","1"
+"36020","Coosada","AL","32.496067","-86.33073","-6","1"
+"36022","Deatsville","AL","32.612619","-86.39497","-6","1"
+"36023","East Tallassee","AL","32.800155","-85.803427","-6","1"
+"36024","Eclectic","AL","32.697561","-86.016","-6","1"
+"36025","Elmore","AL","32.538878","-86.33358","-6","1"
+"36026","Equality","AL","32.776549","-86.0477","-6","1"
+"36027","Eufaula","AL","31.876168","-85.17362","-6","1"
+"36028","Dozier","AL","31.474803","-86.37618","-6","1"
+"36029","Fitzpatrick","AL","32.214818","-85.93281","-6","1"
+"36030","Forest Home","AL","31.847964","-86.86441","-6","1"
+"36031","Fort Davis","AL","32.251957","-85.73589","-6","1"
+"36032","Fort Deposit","AL","31.984289","-86.57087","-6","1"
+"36033","Georgiana","AL","31.655458","-86.76737","-6","1"
+"36034","Glenwood","AL","31.637696","-86.13578","-6","1"
+"36035","Goshen","AL","31.756986","-86.14489","-6","1"
+"36036","Grady","AL","31.985456","-86.15741","-6","1"
+"36037","Greenville","AL","31.8007","-86.60591","-6","1"
+"36038","Gantt","AL","31.260882","-86.444833","-6","1"
+"36039","Hardaway","AL","32.28032","-85.81979","-6","1"
+"36040","Hayneville","AL","32.182677","-86.66877","-6","1"
+"36041","Highland Home","AL","31.913456","-86.30083","-6","1"
+"36042","Honoraville","AL","31.860078","-86.44607","-6","1"
+"36043","Hope Hull","AL","32.22381","-86.39798","-6","1"
+"36045","Kent","AL","32.587631","-86.132981","-6","1"
+"36046","Lapine","AL","32.025367","-86.34182","-6","1"
+"36047","Letohatchee","AL","32.070433","-86.49437","-6","1"
+"36048","Louisville","AL","31.776734","-85.58908","-6","1"
+"36049","Luverne","AL","31.737407","-86.26946","-6","1"
+"36051","Marbury","AL","32.682598","-86.47451","-6","1"
+"36052","Mathews","AL","32.171705","-86.06661","-6","1"
+"36053","Midway","AL","32.011153","-85.46827","-6","1"
+"36054","Millbrook","AL","32.492335","-86.36692","-6","1"
+"36057","Mount Meigs","AL","32.233377","-86.208528","-6","1"
+"36061","Perote","AL","32.092808","-85.704649","-6","1"
+"36062","Petrey","AL","31.74589","-86.323949","-6","1"
+"36064","Pike Road","AL","32.318234","-86.09585","-6","1"
+"36065","Pine Level","AL","32.042813","-86.0514","-6","1"
+"36066","Prattville","AL","32.459435","-86.42746","-6","1"
+"36067","Prattville","AL","32.488113","-86.52962","-6","1"
+"36068","Prattville","AL","32.507893","-86.666272","-6","1"
+"36069","Ramer","AL","32.07955","-86.14911","-6","1"
+"36071","Rutledge","AL","31.708837","-86.38617","-6","1"
+"36072","Eufaula","AL","31.826055","-85.166028","-6","1"
+"36075","Shorter","AL","32.399994","-85.9237","-6","1"
+"36078","Tallassee","AL","32.553036","-85.9136","-6","1"
+"36079","Troy","AL","31.780847","-85.992","-6","1"
+"36080","Titus","AL","32.691057","-86.29429","-6","1"
+"36081","Troy","AL","31.852825","-85.92314","-6","1"
+"36082","Troy","AL","31.816474","-85.964713","-6","1"
+"36083","Tuskegee","AL","32.427987","-85.69542","-6","1"
+"36087","Tuskegee Institute","AL","32.40926","-85.738032","-6","1"
+"36088","Tuskegee Institute","AL","32.419862","-85.71699","-6","1"
+"36089","Union Springs","AL","32.145437","-85.70998","-6","1"
+"36091","Verbena","AL","32.759543","-86.51111","-6","1"
+"36092","Wetumpka","AL","32.592889","-86.21902","-6","1"
+"36093","Wetumpka","AL","32.505741","-86.15644","-6","1"
+"36101","Montgomery","AL","32.356988","-86.257817","-6","1"
+"36102","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36103","Montgomery","AL","32.346158","-86.287316","-6","1"
+"36104","Montgomery","AL","32.377509","-86.31068","-6","1"
+"36105","Montgomery","AL","32.30234","-86.30504","-6","1"
+"36106","Montgomery","AL","32.354888","-86.27161","-6","1"
+"36107","Montgomery","AL","32.378138","-86.27905","-6","1"
+"36108","Montgomery","AL","32.353188","-86.36037","-6","1"
+"36109","Montgomery","AL","32.386088","-86.24511","-6","1"
+"36110","Montgomery","AL","32.426372","-86.27007","-6","1"
+"36111","Montgomery","AL","32.338989","-86.27316","-6","1"
+"36112","Montgomery","AL","32.374287","-86.345719","-6","1"
+"36113","Montgomery","AL","32.359588","-86.34434","-6","1"
+"36114","Montgomery","AL","32.403987","-86.253867","-6","1"
+"36115","Montgomery","AL","32.404754","-86.24963","-6","1"
+"36116","Montgomery","AL","32.31324","-86.23672","-6","1"
+"36117","Montgomery","AL","32.373714","-86.16443","-6","1"
+"36118","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36119","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36120","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36121","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36123","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36124","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36125","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36130","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36131","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36132","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36133","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36134","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36135","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36140","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36141","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36142","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36177","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36191","Montgomery","AL","32.233377","-86.208528","-6","1"
+"36201","Anniston","AL","33.658803","-85.85178","-6","1"
+"36202","Anniston","AL","33.762195","-85.837828","-6","1"
+"36203","Anniston","AL","33.591301","-85.83571","-6","1"
+"36204","Anniston","AL","33.762195","-85.837828","-6","1"
+"36205","Anniston","AL","33.711314","-85.78527","-6","1"
+"36206","Anniston","AL","33.719701","-85.83166","-6","1"
+"36207","Anniston","AL","33.651673","-85.75895","-6","1"
+"36250","Alexandria","AL","33.766057","-85.88969","-6","1"
+"36251","Ashland","AL","33.243964","-85.84503","-6","1"
+"36253","Bynum","AL","33.762195","-85.837828","-6","1"
+"36254","Choccolocco","AL","33.657349","-85.699116","-6","1"
+"36255","Cragford","AL","33.185338","-85.72548","-6","1"
+"36256","Daviston","AL","33.032076","-85.69962","-6","1"
+"36257","De Armanville","AL","33.762195","-85.837828","-6","1"
+"36258","Delta","AL","33.473789","-85.71409","-6","1"
+"36260","Eastaboga","AL","33.593189","-85.99551","-6","1"
+"36261","Edwardsville","AL","33.706595","-85.509902","-6","1"
+"36262","Fruithurst","AL","33.761052","-85.45227","-6","1"
+"36263","Graham","AL","33.469709","-85.36139","-6","1"
+"36264","Heflin","AL","33.613541","-85.55457","-6","1"
+"36265","Jacksonville","AL","33.824496","-85.77037","-6","1"
+"36266","Lineville","AL","33.328958","-85.72073","-6","1"
+"36267","Millerville","AL","33.200704","-85.94159","-6","1"
+"36268","Munford","AL","33.51179","-85.94756","-6","1"
+"36269","Muscadine","AL","33.740158","-85.37813","-6","1"
+"36270","Newell","AL","33.423088","-85.47202","-6","1"
+"36271","Ohatchee","AL","33.79933","-86.0286","-6","1"
+"36272","Piedmont","AL","33.948018","-85.61491","-6","1"
+"36273","Ranburne","AL","33.535491","-85.36312","-6","1"
+"36274","Roanoke","AL","33.159848","-85.36865","-6","1"
+"36275","Spring Garden","AL","33.977829","-85.552143","-6","1"
+"36276","Wadley","AL","33.142612","-85.57418","-6","1"
+"36277","Weaver","AL","33.754308","-85.81991","-6","1"
+"36278","Wedowee","AL","33.338853","-85.509","-6","1"
+"36279","Wellington","AL","33.862349","-85.89512","-6","1"
+"36280","Woodland","AL","33.366136","-85.36501","-6","1"
+"36301","Dothan","AL","31.180076","-85.4045","-6","1"
+"36302","Dothan","AL","31.156018","-85.355931","-6","1"
+"36303","Dothan","AL","31.249042","-85.40605","-6","1"
+"36304","Dothan","AL","31.156018","-85.355931","-6","1"
+"36305","Dothan","AL","31.214832","-85.47402","-6","1"
+"36310","Abbeville","AL","31.599256","-85.2094","-6","1"
+"36311","Ariton","AL","31.589226","-85.69097","-6","1"
+"36312","Ashford","AL","31.178688","-85.2429","-6","1"
+"36313","Bellwood","AL","31.174249","-85.79562","-6","1"
+"36314","Black","AL","31.013308","-85.75742","-6","1"
+"36316","Chancellor","AL","31.172641","-85.86482","-6","1"
+"36317","Clopton","AL","31.645125","-85.37812","-6","1"
+"36318","Coffee Springs","AL","31.16782","-85.94917","-6","1"
+"36319","Columbia","AL","31.312599","-85.14456","-6","1"
+"36320","Cottonwood","AL","31.051843","-85.31561","-6","1"
+"36321","Cowarts","AL","31.202473","-85.301373","-6","1"
+"36322","Daleville","AL","31.284499","-85.72111","-6","1"
+"36323","Elba","AL","31.428389","-86.07271","-6","1"
+"36330","Enterprise","AL","31.32579","-85.84117","-6","1"
+"36331","Enterprise","AL","31.297817","-85.90364","-6","1"
+"36340","Geneva","AL","31.043454","-85.87941","-6","1"
+"36343","Gordon","AL","31.087556","-85.13116","-6","1"
+"36344","Hartford","AL","31.096994","-85.7001","-6","1"
+"36345","Headland","AL","31.381263","-85.3149","-6","1"
+"36346","Jack","AL","31.567171","-85.93102","-6","1"
+"36349","Malvern","AL","31.121244","-85.559235","-6","1"
+"36350","Midland City","AL","31.319083","-85.48718","-6","1"
+"36351","New Brockton","AL","31.406536","-85.9175","-6","1"
+"36352","Newton","AL","31.262955","-85.60789","-6","1"
+"36353","Newville","AL","31.453069","-85.36241","-6","1"
+"36360","Ozark","AL","31.447119","-85.62908","-6","1"
+"36361","Ozark","AL","31.407872","-85.603458","-6","1"
+"36362","Fort Rucker","AL","31.352676","-85.70509","-6","1"
+"36370","Pansey","AL","31.141962","-85.15675","-6","1"
+"36371","Pinckard","AL","31.31201","-85.54722","-6","1"
+"36373","Shorterville","AL","31.52151","-85.1146","-6","1"
+"36374","Skipperville","AL","31.569287","-85.48581","-6","1"
+"36375","Slocomb","AL","31.096836","-85.54403","-6","1"
+"36376","Webb","AL","31.243717","-85.27681","-6","1"
+"36383","Lanett","AL","32.890759","-85.221739","-6","1"
+"36395","Malvern","AL","31.138076","-85.529661","-6","1"
+"36401","Evergreen","AL","31.461019","-86.96271","-6","1"
+"36420","Andalusia","AL","31.279043","-86.48699","-6","1"
+"36422","Lockhart","AL","31.045685","-86.433655","-6","1"
+"36425","Beatrice","AL","31.737883","-87.17442","-6","1"
+"36426","Brewton","AL","31.129008","-87.10173","-6","1"
+"36427","Brewton","AL","31.091784","-87.26404","-6","1"
+"36429","Brooklyn","AL","31.466945","-87.044687","-6","1"
+"36431","Burnt Corn","AL","31.529531","-87.345345","-6","1"
+"36432","Castleberry","AL","31.291038","-87.03109","-6","1"
+"36435","Coy","AL","31.874887","-87.4311","-6","1"
+"36436","Dickinson","AL","31.756797","-87.645","-6","1"
+"36439","Excel","AL","31.429472","-87.339329","-6","1"
+"36441","Flomaton","AL","31.023139","-87.23957","-6","1"
+"36442","Florala","AL","31.042071","-86.34347","-6","1"
+"36444","Franklin","AL","31.63857","-87.46772","-6","1"
+"36445","Frisco City","AL","31.429994","-87.41631","-6","1"
+"36446","Fulton","AL","31.786539","-87.72688","-6","1"
+"36449","Goodway","AL","31.529531","-87.345345","-6","1"
+"36451","Grove Hill","AL","31.704736","-87.77773","-6","1"
+"36453","Kinston","AL","31.203287","-86.15169","-6","1"
+"36454","Lenox","AL","31.466945","-87.044687","-6","1"
+"36455","Lockhart","AL","31.011435","-86.35065","-6","1"
+"36456","McKenzie","AL","31.54668","-86.77355","-6","1"
+"36457","Megargel","AL","31.361214","-87.435279","-6","1"
+"36458","Mexia","AL","31.514659","-87.408362","-6","1"
+"36460","Monroeville","AL","31.509039","-87.32416","-6","1"
+"36461","Monroeville","AL","31.522093","-87.341108","-6","1"
+"36462","Monroeville","AL","31.529531","-87.345345","-6","1"
+"36467","Opp","AL","31.280048","-86.25484","-6","1"
+"36470","Perdue Hill","AL","31.514262","-87.50401","-6","1"
+"36471","Peterman","AL","31.612646","-87.24886","-6","1"
+"36473","Range","AL","31.306814","-87.20327","-6","1"
+"36474","Red Level","AL","31.416059","-86.61397","-6","1"
+"36475","Repton","AL","31.410205","-87.22474","-6","1"
+"36476","River Falls","AL","31.356774","-86.54879","-6","1"
+"36477","Samson","AL","31.091359","-86.04782","-6","1"
+"36480","Uriah","AL","31.320897","-87.59607","-6","1"
+"36481","Vredenburgh","AL","31.821448","-87.34313","-6","1"
+"36482","Whatley","AL","31.614138","-87.63373","-6","1"
+"36483","Wing","AL","31.03183","-86.70207","-6","1"
+"36501","Alma","AL","31.463968","-87.73883","-6","1"
+"36502","Atmore","AL","31.090528","-87.49715","-6","1"
+"36503","Atmore","AL","31.128242","-87.152068","-6","1"
+"36504","Atmore","AL","31.015817","-87.497165","-6","1"
+"36505","Axis","AL","30.930065","-88.00103","-6","1"
+"36507","Bay Minette","AL","30.875697","-87.76592","-6","1"
+"36508","Dauphin Island","AL","30.253557","-88.101463","-6","1"
+"36509","Bayou La Batre","AL","30.401384","-88.24671","-6","1"
+"36511","Bon Secour","AL","30.312316","-87.73468","-6","1"
+"36512","Bucks","AL","30.658865","-88.177975","-6","1"
+"36513","Calvert","AL","31.161966","-87.99588","-6","1"
+"36515","Carlton","AL","31.375467","-87.78506","-6","1"
+"36518","Chatom","AL","31.463383","-88.26781","-6","1"
+"36521","Chunchula","AL","30.965694","-88.18697","-6","1"
+"36522","Citronelle","AL","31.0753","-88.2633","-6","1"
+"36523","Coden","AL","30.383724","-88.18466","-6","1"
+"36524","Coffeeville","AL","31.790834","-88.06933","-6","1"
+"36525","Creola","AL","30.886317","-88.02806","-6","1"
+"36526","Daphne","AL","30.620594","-87.88312","-6","1"
+"36527","Spanish Fort","AL","30.684873","-87.89723","-6","1"
+"36528","Dauphin Island","AL","30.250825","-88.11819","-6","1"
+"36529","Deer Park","AL","31.309194","-88.26036","-6","1"
+"36530","Elberta","AL","30.377657","-87.56159","-6","1"
+"36531","Loxley","AL","30.620944","-87.753091","-6","1"
+"36532","Fairhope","AL","30.512458","-87.88559","-6","1"
+"36533","Fairhope","AL","30.484131","-87.860613","-6","1"
+"36535","Foley","AL","30.396876","-87.69616","-6","1"
+"36536","Foley","AL","30.42216","-87.706371","-6","1"
+"36538","Frankville","AL","31.646087","-88.14188","-6","1"
+"36539","Fruitdale","AL","31.375241","-88.41557","-6","1"
+"36540","Gainestown","AL","31.453836","-87.64373","-6","1"
+"36541","Grand Bay","AL","30.487783","-88.32722","-6","1"
+"36542","Gulf Shores","AL","30.262276","-87.72784","-6","1"
+"36543","Huxford","AL","31.216132","-87.461537","-6","1"
+"36544","Irvington","AL","30.479171","-88.23793","-6","1"
+"36545","Jackson","AL","31.508231","-87.88346","-6","1"
+"36547","Gulf Shores","AL","30.265325","-87.629926","-6","1"
+"36548","Leroy","AL","31.495691","-87.9626","-6","1"
+"36549","Lillian","AL","30.393983","-87.45664","-6","1"
+"36550","Little River","AL","31.242801","-87.76099","-6","1"
+"36551","Loxley","AL","30.6316","-87.75299","-6","1"
+"36553","McIntosh","AL","31.234589","-88.08089","-6","1"
+"36555","Magnolia Springs","AL","30.427641","-87.796011","-6","1"
+"36556","Malcolm","AL","31.213801","-87.96228","-6","1"
+"36558","Millry","AL","31.629578","-88.34737","-6","1"
+"36559","Montrose","AL","30.564701","-87.90216","-6","1"
+"36560","Mount Vernon","AL","31.088463","-88.03007","-6","1"
+"36561","Orange Beach","AL","30.291503","-87.56198","-6","1"
+"36562","Perdido","AL","31.021335","-87.64417","-6","1"
+"36564","Point Clear","AL","30.471767","-87.91874","-6","1"
+"36567","Robertsdale","AL","30.5822","-87.63936","-6","1"
+"36568","Saint Elmo","AL","30.49434","-88.269865","-6","1"
+"36569","Saint Stephens","AL","31.529488","-88.06349","-6","1"
+"36570","Salitpa","AL","31.613745","-88.01381","-6","1"
+"36571","Saraland","AL","30.831636","-88.09386","-6","1"
+"36572","Satsuma","AL","30.857435","-88.05414","-6","1"
+"36574","Seminole","AL","30.511685","-87.4686","-6","1"
+"36575","Semmes","AL","30.76635","-88.26553","-6","1"
+"36576","Silverhill","AL","30.540664","-87.7549","-6","1"
+"36577","Spanish Fort","AL","30.668757","-87.93971","-6","1"
+"36578","Stapleton","AL","30.744745","-87.81486","-6","1"
+"36579","Stockton","AL","31.126122","-87.80317","-6","1"
+"36580","Summerdale","AL","30.485351","-87.71292","-6","1"
+"36581","Sunflower","AL","31.373999","-87.99791","-6","1"
+"36582","Theodore","AL","30.533744","-88.16865","-6","1"
+"36583","Tibbie","AL","31.35209","-88.20879","-6","1"
+"36584","Vinegar Bend","AL","31.202048","-88.38071","-6","1"
+"36585","Wagarville","AL","31.38122","-88.02433","-6","1"
+"36586","Walker Springs","AL","31.58842","-87.840875","-6","1"
+"36587","Wilmer","AL","30.828988","-88.35079","-6","1"
+"36590","Theodore","AL","30.487953","-88.253278","-6","1"
+"36601","Mobile","AL","30.701142","-88.103184","-6","1"
+"36602","Mobile","AL","30.693389","-88.04416","-6","1"
+"36603","Mobile","AL","30.688457","-88.05341","-6","1"
+"36604","Mobile","AL","30.68164","-88.06676","-6","1"
+"36605","Mobile","AL","30.641191","-88.08222","-6","1"
+"36606","Mobile","AL","30.674057","-88.10249","-6","1"
+"36607","Mobile","AL","30.699539","-88.10474","-6","1"
+"36608","Mobile","AL","30.69044","-88.19701","-6","1"
+"36609","Mobile","AL","30.662735","-88.16255","-6","1"
+"36610","Mobile","AL","30.737405","-88.08201","-6","1"
+"36611","Mobile","AL","30.764938","-88.08505","-6","1"
+"36612","Mobile","AL","30.753155","-88.11116","-6","1"
+"36613","Eight Mile","AL","30.795637","-88.1577","-6","1"
+"36614","Mobile","AL","30.601892","-88.211103","-6","1"
+"36615","Mobile","AL","30.64109","-88.062248","-6","1"
+"36616","Mobile","AL","30.671048","-88.126656","-6","1"
+"36617","Mobile","AL","30.717539","-88.09609","-6","1"
+"36618","Mobile","AL","30.728488","-88.16845","-6","1"
+"36619","Mobile","AL","30.586808","-88.18552","-6","1"
+"36621","Mobile","AL","30.658865","-88.177975","-6","1"
+"36622","Mobile","AL","30.658865","-88.177975","-6","1"
+"36623","Mobile","AL","30.658865","-88.177975","-6","1"
+"36625","Mobile","AL","30.658865","-88.177975","-6","1"
+"36626","Mobile","AL","30.658865","-88.177975","-6","1"
+"36628","Mobile","AL","30.658865","-88.177975","-6","1"
+"36630","Mobile","AL","30.658865","-88.177975","-6","1"
+"36631","Mobile","AL","30.658865","-88.177975","-6","1"
+"36633","Mobile","AL","30.658865","-88.177975","-6","1"
+"36640","Mobile","AL","30.658865","-88.177975","-6","1"
+"36641","Mobile","AL","30.658865","-88.177975","-6","1"
+"36644","Mobile","AL","30.658865","-88.177975","-6","1"
+"36652","Mobile","AL","30.658865","-88.177975","-6","1"
+"36660","Mobile","AL","30.658865","-88.177975","-6","1"
+"36663","Mobile","AL","30.81901","-88.231726","-6","1"
+"36670","Mobile","AL","30.658865","-88.177975","-6","1"
+"36671","Mobile","AL","30.658865","-88.177975","-6","1"
+"36675","Mobile","AL","30.658865","-88.177975","-6","1"
+"36685","Mobile","AL","30.658865","-88.177975","-6","1"
+"36688","Mobile","AL","30.696589","-88.173652","-6","1"
+"36689","Mobile","AL","30.658865","-88.177975","-6","1"
+"36690","Mobile","AL","30.658865","-88.177975","-6","1"
+"36691","Mobile","AL","30.658865","-88.177975","-6","1"
+"36693","Mobile","AL","30.630441","-88.15397","-6","1"
+"36695","Mobile","AL","30.646415","-88.23657","-6","1"
+"36701","Selma","AL","32.429066","-87.03809","-6","1"
+"36702","Selma","AL","32.419259","-87.124708","-6","1"
+"36703","Selma","AL","32.419846","-86.97783","-6","1"
+"36720","Alberta","AL","32.170653","-87.36217","-6","1"
+"36721","Annemanie","AL","32.048079","-87.26226","-6","1"
+"36722","Arlington","AL","32.079894","-87.57551","-6","1"
+"36723","Boykin","AL","32.08846","-87.28018","-6","1"
+"36726","Camden","AL","32.008444","-87.25911","-6","1"
+"36727","Campbell","AL","31.910694","-88.03148","-6","1"
+"36728","Catherine","AL","32.147166","-87.45675","-6","1"
+"36732","Demopolis","AL","32.495484","-87.84521","-6","1"
+"36736","Dixons Mills","AL","32.069338","-87.77893","-6","1"
+"36738","Faunsdale","AL","32.41786","-87.62729","-6","1"
+"36740","Forkland","AL","32.629096","-87.84004","-6","1"
+"36741","Furman","AL","32.006129","-86.981703","-6","1"
+"36742","Gallion","AL","32.454007","-87.75003","-6","1"
+"36744","Greensboro","AL","32.703529","-87.60177","-6","1"
+"36745","Jefferson","AL","32.414036","-87.898611","-6","1"
+"36748","Linden","AL","32.297441","-87.78812","-6","1"
+"36749","Jones","AL","32.54896","-86.87897","-6","1"
+"36750","Maplesville","AL","32.789726","-86.8496","-6","1"
+"36751","Lower Peach Tree","AL","31.833493","-87.55005","-6","1"
+"36752","Lowndesboro","AL","32.322266","-86.64395","-6","1"
+"36753","McWilliams","AL","32.048079","-87.26226","-6","1"
+"36754","Magnolia","AL","32.140637","-87.6801","-6","1"
+"36755","Greensboro","AL","32.700467","-87.578576","-6","1"
+"36756","Marion","AL","32.665966","-87.33889","-6","1"
+"36758","Plantersville","AL","32.639376","-86.91034","-6","1"
+"36759","Marion Junction","AL","32.420138","-87.27857","-6","1"
+"36761","Minter","AL","32.080532","-86.95524","-6","1"
+"36762","Morvin","AL","31.940191","-88.00336","-6","1"
+"36763","Myrtlewood","AL","32.249718","-87.96332","-6","1"
+"36764","Nanafalia","AL","32.268329","-87.795275","-6","1"
+"36765","Newbern","AL","32.594818","-87.53543","-6","1"
+"36766","Oak Hill","AL","31.947005","-87.074497","-6","1"
+"36767","Orrville","AL","32.29165","-87.23168","-6","1"
+"36768","Pine Apple","AL","31.901412","-86.95505","-6","1"
+"36769","Pine Hill","AL","31.990494","-87.55222","-6","1"
+"36773","Safford","AL","32.291429","-87.39972","-6","1"
+"36775","Sardis","AL","32.213369","-86.98313","-6","1"
+"36776","Sawyerville","AL","32.739091","-87.7417","-6","1"
+"36778","Snow Hill","AL","32.01998","-87.054284","-6","1"
+"36779","Sprott","AL","32.701812","-87.17423","-6","1"
+"36782","Sweet Water","AL","32.114999","-87.90187","-6","1"
+"36783","Thomaston","AL","32.263473","-87.60214","-6","1"
+"36784","Thomasville","AL","31.936003","-87.77013","-6","1"
+"36785","Tyler","AL","32.282192","-86.8216","-6","1"
+"36786","Uniontown","AL","32.440868","-87.49657","-6","1"
+"36790","Stanton","AL","32.731866","-86.90004","-6","1"
+"36792","Randolph","AL","32.917983","-86.89046","-6","1"
+"36793","Lawley","AL","32.838805","-86.99911","-6","1"
+"36801","Opelika","AL","32.660497","-85.39917","-6","1"
+"36802","Opelika","AL","32.578185","-85.349003","-6","1"
+"36803","Opelika","AL","32.522567","-85.431517","-6","1"
+"36804","Opelika","AL","32.556296","-85.33465","-6","1"
+"36830","Auburn","AL","32.577135","-85.47282","-6","1"
+"36831","Auburn","AL","32.578185","-85.349003","-6","1"
+"36832","Auburn","AL","32.589553","-85.53991","-6","1"
+"36849","Auburn University","AL","32.602434","-85.4858","-6","1"
+"36850","Camp Hill","AL","32.799998","-85.64621","-6","1"
+"36851","Cottonton","AL","32.286092","-85.161497","-6","1"
+"36852","Cusseta","AL","32.745844","-85.28076","-6","1"
+"36853","Dadeville","AL","32.787441","-85.79955","-6","1"
+"36854","Valley","AL","32.777662","-85.17623","-6","1"
+"36855","Five Points","AL","33.046756","-85.30102","-6","1"
+"36856","Fort Mitchell","AL","32.282085","-84.98389","-6","1"
+"36858","Hatchechubbee","AL","32.297792","-85.31205","-6","1"
+"36859","Holy Trinity","AL","32.229846","-85.008178","-6","1"
+"36860","Hurtsboro","AL","32.237339","-85.41029","-6","1"
+"36861","Jacksons Gap","AL","32.862333","-85.84588","-6","1"
+"36862","Lafayette","AL","32.903922","-85.42905","-6","1"
+"36863","Lanett","AL","32.871306","-85.21314","-6","1"
+"36865","Loachapoka","AL","32.578185","-85.349003","-6","1"
+"36866","Notasulga","AL","32.551474","-85.69859","-6","1"
+"36867","Phenix City","AL","32.492304","-85.01943","-6","1"
+"36868","Phenix City","AL","32.464614","-85.020604","-6","1"
+"36869","Phenix City","AL","32.433065","-85.04512","-6","1"
+"36870","Phenix City","AL","32.484671","-85.0752","-6","1"
+"36871","Pittsview","AL","32.16827","-85.11621","-6","1"
+"36872","Valley","AL","32.578185","-85.349003","-6","1"
+"36874","Salem","AL","32.587751","-85.18539","-6","1"
+"36875","Seale","AL","32.315128","-85.11348","-6","1"
+"36876","Uniontown","AL","32.454371","-87.519156","-6","1"
+"36877","Smiths","AL","32.545138","-85.09212","-6","1"
+"36879","Waverly","AL","32.733511","-85.55322","-6","1"
+"36901","Bellamy","AL","32.451618","-88.131","-6","1"
+"36904","Butler","AL","32.097363","-88.22647","-6","1"
+"36906","Cromwell","AL","32.004227","-88.200738","-6","1"
+"36907","Cuba","AL","32.403275","-88.36252","-6","1"
+"36908","Gilbertown","AL","31.891177","-88.28508","-6","1"
+"36910","Jachin","AL","32.220752","-88.15471","-6","1"
+"36912","Lisman","AL","32.227905","-88.32468","-6","1"
+"36913","Melvin","AL","32.004227","-88.200738","-6","1"
+"36915","Needham","AL","31.970871","-88.34902","-6","1"
+"36916","Pennington","AL","32.209381","-88.05965","-6","1"
+"36919","Silas","AL","31.779344","-88.30045","-6","1"
+"36921","Toxey","AL","31.96958","-88.18661","-6","1"
+"36922","Ward","AL","32.304709","-88.17081","-6","1"
+"36925","York","AL","32.487726","-88.2679","-6","1"
+"37010","Adams","TN","36.569635","-87.10026","-6","1"
+"37011","Antioch","TN","36.170556","-86.8825","-6","1"
+"37012","Alexandria","TN","36.076635","-86.01978","-6","1"
+"37013","Antioch","TN","36.055115","-86.64782","-6","1"
+"37014","Arrington","TN","35.856372","-86.66189","-6","1"
+"37015","Ashland City","TN","36.299293","-87.06949","-6","1"
+"37016","Auburntown","TN","35.951494","-86.09259","-6","1"
+"37018","Beechgrove","TN","35.642797","-86.1669","-6","1"
+"37019","Belfast","TN","35.390308","-86.70969","-6","1"
+"37020","Bell Buckle","TN","35.616935","-86.39629","-6","1"
+"37022","Bethpage","TN","36.501049","-86.3","-6","1"
+"37023","Big Rock","TN","36.574224","-87.79018","-6","1"
+"37024","Brentwood","TN","35.874553","-86.907565","-6","1"
+"37025","Bon Aqua","TN","35.943598","-87.28991","-6","1"
+"37026","Bradyville","TN","35.699599","-86.10976","-6","1"
+"37027","Brentwood","TN","36.007373","-86.79121","-6","1"
+"37028","Bumpus Mills","TN","36.633539","-87.86841","-6","1"
+"37029","Burns","TN","36.047742","-87.28938","-6","1"
+"37030","Carthage","TN","36.264959","-85.94893","-6","1"
+"37031","Castalian Springs","TN","36.377228","-86.30112","-6","1"
+"37032","Cedar Hill","TN","36.522355","-87.02542","-6","1"
+"37033","Centerville","TN","35.76714","-87.49418","-6","1"
+"37034","Chapel Hill","TN","35.639491","-86.6865","-6","1"
+"37035","Chapmansboro","TN","36.388731","-87.13175","-6","1"
+"37036","Charlotte","TN","36.225389","-87.29179","-6","1"
+"37037","Christiana","TN","35.702877","-86.35134","-6","1"
+"37040","Clarksville","TN","36.528448","-87.34142","-6","1"
+"37041","Clarksville","TN","36.477428","-87.377197","-6","1"
+"37042","Clarksville","TN","36.58068","-87.4056","-6","1"
+"37043","Clarksville","TN","36.506407","-87.2572","-6","1"
+"37044","Clarksville","TN","36.531398","-87.353008","-6","1"
+"37046","College Grove","TN","35.7557","-86.72272","-6","1"
+"37047","Cornersville","TN","35.330683","-86.8406","-6","1"
+"37048","Cottontown","TN","36.491753","-86.59963","-6","1"
+"37049","Cross Plains","TN","36.548569","-86.67907","-6","1"
+"37050","Cumberland City","TN","36.373626","-87.63158","-6","1"
+"37051","Cumberland Furnace","TN","36.310027","-87.4128","-6","1"
+"37052","Cunningham","TN","36.371609","-87.4039","-6","1"
+"37055","Dickson","TN","36.065779","-87.40831","-6","1"
+"37056","Dickson","TN","36.146949","-87.352971","-6","1"
+"37057","Dixon Springs","TN","36.389736","-86.04135","-6","1"
+"37058","Dover","TN","36.477136","-87.85877","-6","1"
+"37059","Dowelltown","TN","35.993983","-85.92851","-6","1"
+"37060","Eagleville","TN","35.73843","-86.64441","-6","1"
+"37061","Erin","TN","36.301089","-87.68198","-6","1"
+"37062","Fairview","TN","35.976983","-87.14128","-6","1"
+"37063","Fosterville","TN","35.859565","-86.420958","-6","1"
+"37064","Franklin","TN","35.893823","-86.89919","-6","1"
+"37065","Franklin","TN","35.895085","-86.921416","-6","1"
+"37066","Gallatin","TN","36.388997","-86.4548","-6","1"
+"37067","Franklin","TN","35.921811","-86.7952","-6","1"
+"37068","Franklin","TN","35.874553","-86.907565","-6","1"
+"37069","Franklin","TN","35.97706","-86.89653","-6","1"
+"37070","Goodlettsville","TN","36.186605","-86.785248","-6","1"
+"37071","Gladeville","TN","36.156231","-86.304922","-6","1"
+"37072","Goodlettsville","TN","36.35465","-86.71879","-6","1"
+"37073","Greenbrier","TN","36.427758","-86.81023","-6","1"
+"37074","Hartsville","TN","36.407653","-86.15305","-6","1"
+"37075","Hendersonville","TN","36.311047","-86.61173","-6","1"
+"37076","Hermitage","TN","36.180507","-86.60111","-6","1"
+"37077","Hendersonville","TN","36.304701","-86.621095","-6","1"
+"37078","Hurricane Mills","TN","35.924976","-87.77219","-6","1"
+"37079","Indian Mound","TN","36.48677","-87.66331","-6","1"
+"37080","Joelton","TN","36.329551","-86.90949","-6","1"
+"37082","Kingston Springs","TN","36.084917","-87.1106","-6","1"
+"37083","Lafayette","TN","36.537994","-86.01497","-6","1"
+"37085","Lascassas","TN","35.950979","-86.29596","-6","1"
+"37086","La Vergne","TN","36.01333","-86.56268","-6","1"
+"37087","Lebanon","TN","36.240331","-86.29271","-6","1"
+"37088","Lebanon","TN","36.156231","-86.304922","-6","1"
+"37089","La Vergne","TN","35.859565","-86.420958","-6","1"
+"37090","Lebanon","TN","36.147433","-86.31061","-6","1"
+"37091","Lewisburg","TN","35.461359","-86.7792","-6","1"
+"37095","Liberty","TN","36.000953","-85.97669","-6","1"
+"37096","Linden","TN","35.61432","-87.87486","-6","1"
+"37097","Lobelville","TN","35.769743","-87.80286","-6","1"
+"37098","Lyles","TN","35.882639","-87.31395","-6","1"
+"37101","McEwen","TN","36.069712","-87.64489","-6","1"
+"37110","McMinnville","TN","35.687286","-85.787","-6","1"
+"37111","McMinnville","TN","35.678368","-85.777633","-6","1"
+"37115","Madison","TN","36.264069","-86.70566","-6","1"
+"37116","Madison","TN","36.186605","-86.785248","-6","1"
+"37118","Milton","TN","35.929221","-86.18393","-6","1"
+"37119","Mitchellville","TN","36.631981","-86.539028","-6","1"
+"37121","Mount Juliet","TN","36.156231","-86.304922","-6","1"
+"37122","Mount Juliet","TN","36.195016","-86.49732","-6","1"
+"37127","Murfreesboro","TN","35.791021","-86.34445","-6","1"
+"37128","Murfreesboro","TN","35.813319","-86.4455","-6","1"
+"37129","Murfreesboro","TN","35.896645","-86.42425","-6","1"
+"37130","Murfreesboro","TN","35.860152","-86.3648","-6","1"
+"37131","Murfreesboro","TN","35.859565","-86.420958","-6","1"
+"37132","Murfreesboro","TN","35.859565","-86.420958","-6","1"
+"37133","Murfreesboro","TN","35.859565","-86.420958","-6","1"
+"37134","New Johnsonville","TN","36.022057","-87.9564","-6","1"
+"37135","Nolensville","TN","35.940383","-86.6686","-6","1"
+"37136","Norene","TN","36.156231","-86.304922","-6","1"
+"37137","Nunnelly","TN","35.88662","-87.50471","-6","1"
+"37138","Old Hickory","TN","36.243698","-86.62308","-6","1"
+"37140","Only","TN","35.863362","-87.67179","-6","1"
+"37141","Orlinda","TN","36.60983","-86.69226","-6","1"
+"37142","Palmyra","TN","36.421075","-87.49893","-6","1"
+"37143","Pegram","TN","36.121471","-87.04467","-6","1"
+"37144","Petersburg","TN","35.301331","-86.63337","-6","1"
+"37145","Pleasant Shade","TN","36.377253","-85.90866","-6","1"
+"37146","Pleasant View","TN","36.393153","-87.0285","-6","1"
+"37147","Pleasantville","TN","35.679617","-87.65472","-6","1"
+"37148","Portland","TN","36.576137","-86.51355","-6","1"
+"37149","Readyville","TN","35.800108","-86.19391","-6","1"
+"37150","Red Boiling Springs","TN","36.543183","-85.81114","-6","1"
+"37151","Riddleton","TN","36.335403","-86.0317","-6","1"
+"37152","Ridgetop","TN","36.396821","-86.76679","-6","1"
+"37153","Rockvale","TN","35.751016","-86.55056","-6","1"
+"37155","Saint Bethlehem","TN","36.477428","-87.377197","-6","1"
+"37160","Shelbyville","TN","35.47066","-86.45974","-6","1"
+"37161","Shelbyville","TN","35.471531","-86.489019","-6","1"
+"37162","Shelbyville","TN","35.510825","-86.450042","-6","1"
+"37165","Slayden","TN","36.283543","-87.458058","-6","1"
+"37166","Smithville","TN","35.922583","-85.80108","-6","1"
+"37167","Smyrna","TN","35.968513","-86.52231","-6","1"
+"37171","Southside","TN","36.354736","-87.30571","-6","1"
+"37172","Springfield","TN","36.513979","-86.86892","-6","1"
+"37174","Spring Hill","TN","35.73062","-86.91144","-6","1"
+"37175","Stewart","TN","36.316042","-87.89028","-6","1"
+"37178","Tennessee Ridge","TN","36.323799","-87.77676","-6","1"
+"37179","Thompsons Station","TN","35.79867","-86.90734","-6","1"
+"37180","Unionville","TN","35.621614","-86.57353","-6","1"
+"37181","Vanleer","TN","36.237999","-87.49831","-6","1"
+"37183","Wartrace","TN","35.508541","-86.30889","-6","1"
+"37184","Watertown","TN","36.096166","-86.13715","-6","1"
+"37185","Waverly","TN","36.085376","-87.81626","-6","1"
+"37186","Westmoreland","TN","36.579247","-86.23954","-6","1"
+"37187","White Bluff","TN","36.117433","-87.21761","-6","1"
+"37188","White House","TN","36.467624","-86.66941","-6","1"
+"37189","Whites Creek","TN","36.27062","-86.82052","-6","1"
+"37190","Woodbury","TN","35.813335","-86.05538","-6","1"
+"37191","Woodlawn","TN","36.503792","-87.54263","-6","1"
+"37201","Nashville","TN","36.164556","-86.77738","-6","1"
+"37202","Nashville","TN","36.340304","-86.827254","-6","1"
+"37203","Nashville","TN","36.152607","-86.78927","-6","1"
+"37204","Nashville","TN","36.112058","-86.77626","-6","1"
+"37205","Nashville","TN","36.113558","-86.86207","-6","1"
+"37206","Nashville","TN","36.180806","-86.74176","-6","1"
+"37207","Nashville","TN","36.215535","-86.77317","-6","1"
+"37208","Nashville","TN","36.174806","-86.80252","-6","1"
+"37209","Nashville","TN","36.151324","-86.8559","-6","1"
+"37210","Nashville","TN","36.140857","-86.74437","-6","1"
+"37211","Nashville","TN","36.079259","-86.72584","-6","1"
+"37212","Nashville","TN","36.133251","-86.80057","-6","1"
+"37213","Nashville","TN","36.167179","-86.76777","-6","1"
+"37214","Nashville","TN","36.166956","-86.66869","-6","1"
+"37215","Nashville","TN","36.098408","-86.82522","-6","1"
+"37216","Nashville","TN","36.213004","-86.72594","-6","1"
+"37217","Nashville","TN","36.103408","-86.66616","-6","1"
+"37218","Nashville","TN","36.206755","-86.85215","-6","1"
+"37219","Nashville","TN","36.166806","-86.78172","-6","1"
+"37220","Nashville","TN","36.069659","-86.77266","-6","1"
+"37221","Nashville","TN","36.065032","-86.94674","-6","1"
+"37222","Nashville","TN","36.056164","-86.980116","-6","1"
+"37224","Nashville","TN","36.186605","-86.785248","-6","1"
+"37227","Nashville","TN","36.186605","-86.785248","-6","1"
+"37228","Nashville","TN","36.190205","-86.80078","-6","1"
+"37229","Nashville","TN","36.186605","-86.785248","-6","1"
+"37230","Nashville","TN","36.186605","-86.785248","-6","1"
+"37232","Nashville","TN","36.186605","-86.785248","-6","1"
+"37234","Nashville","TN","36.186605","-86.785248","-6","1"
+"37235","Nashville","TN","36.186605","-86.785248","-6","1"
+"37236","Nashville","TN","36.186605","-86.785248","-6","1"
+"37237","Nashville","TN","36.186605","-86.785248","-6","1"
+"37238","Nashville","TN","36.186605","-86.785248","-6","1"
+"37239","Nashville","TN","36.186605","-86.785248","-6","1"
+"37240","Nashville","TN","36.186605","-86.785248","-6","1"
+"37241","Nashville","TN","36.186605","-86.785248","-6","1"
+"37242","Nashville","TN","36.186605","-86.785248","-6","1"
+"37243","Nashville","TN","36.167606","-86.784498","-6","1"
+"37244","Nashville","TN","36.186605","-86.785248","-6","1"
+"37245","Nashville","TN","36.186605","-86.785248","-6","1"
+"37246","Nashville","TN","36.158606","-86.789998","-6","1"
+"37247","Nashville","TN","36.186605","-86.785248","-6","1"
+"37248","Nashville","TN","36.186605","-86.785248","-6","1"
+"37249","Nashville","TN","36.186605","-86.785248","-6","1"
+"37250","Nashville","TN","36.186605","-86.785248","-6","1"
+"37301","Altamont","TN","35.429018","-85.77679","-6","1"
+"37302","Apison","TN","35.017404","-85.01322","-5","1"
+"37303","Athens","TN","35.441378","-84.61975","-5","1"
+"37304","Bakewell","TN","35.345216","-85.138046","-5","1"
+"37305","Beersheba Springs","TN","35.467486","-85.67736","-6","1"
+"37306","Belvidere","TN","35.106467","-86.2035","-6","1"
+"37307","Benton","TN","35.172376","-84.63913","-5","1"
+"37308","Birchwood","TN","35.357001","-84.99288","-5","1"
+"37309","Calhoun","TN","35.302952","-84.74359","-5","1"
+"37310","Charleston","TN","35.275808","-84.76927","-5","1"
+"37311","Cleveland","TN","35.146362","-84.88723","-5","1"
+"37312","Cleveland","TN","35.219532","-84.86489","-5","1"
+"37313","Coalmont","TN","35.361678","-85.70288","-6","1"
+"37314","Cokercreek","TN","35.246689","-84.303121","-5","1"
+"37315","Collegedale","TN","35.047891","-85.057359","-5","1"
+"37316","Conasauga","TN","34.995039","-84.72951","-5","1"
+"37317","Copperhill","TN","35.008596","-84.3859","-5","1"
+"37318","Cowan","TN","35.168862","-86.00538","-6","1"
+"37320","Cleveland","TN","35.17272","-84.861885","-5","1"
+"37321","Dayton","TN","35.495894","-85.01032","-5","1"
+"37322","Decatur","TN","35.503723","-84.80741","-5","1"
+"37323","Cleveland","TN","35.114482","-84.82836","-5","1"
+"37324","Decherd","TN","35.234156","-86.0324","-6","1"
+"37325","Delano","TN","35.245578","-84.58812","-5","1"
+"37326","Ducktown","TN","35.030319","-84.38284","-5","1"
+"37327","Dunlap","TN","35.399109","-85.38755","-6","1"
+"37328","Elora","TN","35.018508","-86.36085","-6","1"
+"37329","Englewood","TN","35.41142","-84.47473","-5","1"
+"37330","Estill Springs","TN","35.280936","-86.12247","-6","1"
+"37331","Etowah","TN","35.325991","-84.53015","-5","1"
+"37332","Evensville","TN","35.585467","-84.94125","-5","1"
+"37333","Farner","TN","35.14864","-84.31707","-5","1"
+"37334","Fayetteville","TN","35.136177","-86.57433","-6","1"
+"37335","Flintville","TN","35.063253","-86.41866","-6","1"
+"37336","Georgetown","TN","35.308786","-84.93042","-5","1"
+"37337","Grandview","TN","35.78168","-84.87955","-6","1"
+"37338","Graysville","TN","35.443503","-85.18397","-6","1"
+"37339","Gruetli Laager","TN","35.373152","-85.62361","-6","1"
+"37340","Guild","TN","35.013853","-85.53107","-6","1"
+"37341","Harrison","TN","35.19154","-85.09827","-5","1"
+"37342","Hillsboro","TN","35.39156","-85.96367","-6","1"
+"37343","Hixson","TN","35.167987","-85.21158","-5","1"
+"37345","Huntland","TN","35.052678","-86.27141","-6","1"
+"37347","Jasper","TN","35.065007","-85.61818","-6","1"
+"37348","Kelso","TN","35.1149","-86.4421","-6","1"
+"37349","Manchester","TN","35.497637","-86.07482","-6","1"
+"37350","Lookout Mountain","TN","34.998375","-85.34865","-5","1"
+"37351","Lupton City","TN","35.104789","-85.26415","-5","1"
+"37352","Lynchburg","TN","35.276795","-86.35264","-6","1"
+"37353","McDonald","TN","35.114036","-84.98535","-5","1"
+"37354","Madisonville","TN","35.506259","-84.35738","-5","1"
+"37355","Manchester","TN","35.500068","-86.08414","-6","1"
+"37356","Monteagle","TN","35.238756","-85.82911","-6","1"
+"37357","Morrison","TN","35.596484","-85.92275","-6","1"
+"37359","Mulberry","TN","35.203361","-86.40563","-6","1"
+"37360","Normandy","TN","35.433962","-86.26045","-6","1"
+"37361","Ocoee","TN","35.108559","-84.70139","-5","1"
+"37362","Oldfort","TN","35.043475","-84.73957","-5","1"
+"37363","Ooltewah","TN","35.087881","-85.06005","-5","1"
+"37364","Cleveland","TN","35.17272","-84.861885","-5","1"
+"37365","Palmer","TN","35.375156","-85.55501","-6","1"
+"37366","Pelham","TN","35.304582","-85.85456","-6","1"
+"37367","Pikeville","TN","35.635097","-85.17161","-6","1"
+"37369","Reliance","TN","35.191719","-84.49446","-5","1"
+"37370","Riceville","TN","35.363968","-84.70392","-5","1"
+"37371","Athens","TN","35.441376","-84.641623","-5","1"
+"37372","Saint Andrews","TN","35.175522","-86.098338","-6","1"
+"37373","Sale Creek","TN","35.391643","-85.10329","-5","1"
+"37374","Sequatchie","TN","35.19174","-85.64149","-6","1"
+"37375","Sewanee","TN","35.193891","-85.91048","-6","1"
+"37376","Sherwood","TN","35.060787","-85.92217","-6","1"
+"37377","Signal Mountain","TN","35.159778","-85.33332","-5","1"
+"37378","Smartt","TN","35.678368","-85.777633","-6","1"
+"37379","Soddy Daisy","TN","35.269694","-85.16227","-5","1"
+"37380","South Pittsburg","TN","35.045886","-85.72513","-6","1"
+"37381","Spring City","TN","35.68801","-84.82777","-5","1"
+"37382","Summitville","TN","35.497637","-86.07482","-6","1"
+"37383","Sewanee","TN","35.180503","-85.903522","-6","1"
+"37384","Soddy Daisy","TN","35.221092","-85.209082","-5","1"
+"37385","Tellico Plains","TN","35.345237","-84.27728","-5","1"
+"37387","Tracy City","TN","35.275367","-85.74039","-6","1"
+"37388","Tullahoma","TN","35.357522","-86.21484","-6","1"
+"37389","Arnold AFB","TN","35.497637","-86.07482","-6","1"
+"37391","Turtletown","TN","35.098017","-84.36195","-5","1"
+"37394","Viola","TN","35.538116","-85.86169","-6","1"
+"37395","Watts Bar Dam","TN","35.61722","-84.928921","-5","1"
+"37396","Whiteside","TN","34.994156","-85.48755","-6","1"
+"37397","Whitwell","TN","35.20297","-85.49733","-6","1"
+"37398","Winchester","TN","35.192829","-86.14045","-6","1"
+"37401","Chattanooga","TN","35.017818","-85.206426","-5","1"
+"37402","Chattanooga","TN","35.046324","-85.31199","-5","1"
+"37403","Chattanooga","TN","35.046173","-85.2988","-5","1"
+"37404","Chattanooga","TN","35.030474","-85.2749","-5","1"
+"37405","Chattanooga","TN","35.081323","-85.31903","-5","1"
+"37406","Chattanooga","TN","35.065723","-85.25014","-5","1"
+"37407","Chattanooga","TN","35.000825","-85.28673","-5","1"
+"37408","Chattanooga","TN","35.030907","-85.31004","-5","1"
+"37409","Chattanooga","TN","35.001842","-85.33092","-5","1"
+"37410","Chattanooga","TN","35.002342","-85.31407","-5","1"
+"37411","Chattanooga","TN","35.023824","-85.2333","-5","1"
+"37412","Chattanooga","TN","34.996674","-85.23748","-5","1"
+"37414","Chattanooga","TN","35.221092","-85.209082","-5","1"
+"37415","Chattanooga","TN","35.116285","-85.28466","-5","1"
+"37416","Chattanooga","TN","35.089805","-85.18152","-5","1"
+"37419","Chattanooga","TN","35.031674","-85.37276","-5","1"
+"37421","Chattanooga","TN","35.028574","-85.15939","-5","1"
+"37422","Chattanooga","TN","35.221092","-85.209082","-5","1"
+"37424","Chattanooga","TN","35.221092","-85.209082","-5","1"
+"37450","Chattanooga","TN","35.221092","-85.209082","-5","1"
+"37499","Chattanooga","TN","35.221092","-85.209082","-5","1"
+"37501","Memphis","TN","35.169255","-89.990415","-6","1"
+"37601","Johnson City","TN","36.331006","-82.3386","-5","1"
+"37602","Johnson City","TN","36.271729","-82.501212","-5","1"
+"37604","Johnson City","TN","36.312633","-82.3802","-5","1"
+"37605","Johnson City","TN","36.315795","-82.383792","-5","1"
+"37614","Johnson City","TN","36.302479","-82.36984","-5","1"
+"37615","Johnson City","TN","36.405338","-82.44593","-5","1"
+"37616","Afton","TN","36.218863","-82.74704","-5","1"
+"37617","Blountville","TN","36.534729","-82.37229","-5","1"
+"37618","Bluff City","TN","36.469605","-82.22998","-5","1"
+"37620","Bristol","TN","36.561341","-82.16869","-5","1"
+"37621","Bristol","TN","36.504158","-82.26446","-5","1"
+"37625","Bristol","TN","36.504158","-82.26446","-5","1"
+"37640","Butler","TN","36.335618","-81.97775","-5","1"
+"37641","Chuckey","TN","36.21503","-82.6744","-5","1"
+"37642","Church Hill","TN","36.534489","-82.71292","-5","1"
+"37643","Elizabethton","TN","36.355251","-82.18843","-5","1"
+"37644","Elizabethton","TN","36.436637","-82.051765","-5","1"
+"37645","Mount Carmel","TN","36.560966","-82.65855","-5","1"
+"37650","Erwin","TN","36.128301","-82.4273","-5","1"
+"37656","Fall Branch","TN","36.4017","-82.62705","-5","1"
+"37657","Flag Pond","TN","36.011662","-82.56056","-5","1"
+"37658","Hampton","TN","36.269157","-82.17558","-5","1"
+"37659","Jonesborough","TN","36.293805","-82.49704","-5","1"
+"37660","Kingsport","TN","36.547133","-82.55408","-5","1"
+"37662","Kingsport","TN","36.530517","-82.529816","-5","1"
+"37663","Kingsport","TN","36.468953","-82.49765","-5","1"
+"37664","Kingsport","TN","36.522968","-82.51162","-5","1"
+"37665","Kingsport","TN","36.583233","-82.57249","-5","1"
+"37669","Kingsport","TN","36.504158","-82.26446","-5","1"
+"37680","Laurel Bloomery","TN","36.580229","-81.75509","-5","1"
+"37681","Limestone","TN","36.246547","-82.62095","-5","1"
+"37682","Milligan College","TN","36.296007","-82.305359","-5","1"
+"37683","Mountain City","TN","36.451041","-81.81906","-5","1"
+"37684","Mountain Home","TN","36.309201","-82.37338","-5","1"
+"37686","Piney Flats","TN","36.430799","-82.33344","-5","1"
+"37687","Roan Mountain","TN","36.192236","-82.0975","-5","1"
+"37688","Shady Valley","TN","36.529827","-81.91718","-5","1"
+"37690","Telford","TN","36.254547","-82.55708","-5","1"
+"37691","Trade","TN","36.367169","-81.75553","-5","1"
+"37692","Unicoi","TN","36.20493","-82.31214","-5","1"
+"37694","Watauga","TN","36.376371","-82.278","-5","1"
+"37699","Piney Flats","TN","36.504158","-82.26446","-5","1"
+"37701","Alcoa","TN","35.784708","-83.97956","-5","1"
+"37705","Andersonville","TN","36.217896","-84.01131","-5","1"
+"37707","Arthur","TN","36.566257","-83.636479","-5","1"
+"37708","Bean Station","TN","36.320262","-83.32206","-5","1"
+"37709","Blaine","TN","36.161001","-83.67602","-5","1"
+"37710","Briceville","TN","36.15231","-84.28968","-5","1"
+"37711","Bulls Gap","TN","36.274715","-83.05737","-5","1"
+"37713","Bybee","TN","36.081083","-83.13505","-5","1"
+"37714","Caryville","TN","36.290972","-84.22104","-5","1"
+"37715","Clairfield","TN","36.567165","-83.94202","-5","1"
+"37716","Clinton","TN","36.099283","-84.14656","-5","1"
+"37717","Clinton","TN","36.110028","-84.167208","-5","1"
+"37719","Coalfield","TN","36.029022","-84.42541","-5","1"
+"37721","Corryton","TN","36.141925","-83.8066","-5","1"
+"37722","Cosby","TN","35.820011","-83.24441","-5","1"
+"37723","Crab Orchard","TN","35.933213","-84.86226","-6","1"
+"37724","Cumberland Gap","TN","36.566416","-83.67499","-5","1"
+"37725","Dandridge","TN","35.996454","-83.39791","-5","1"
+"37726","Deer Lodge","TN","36.186086","-84.838","-5","1"
+"37727","Del Rio","TN","35.900308","-83.01575","-5","1"
+"37729","Duff","TN","36.510252","-84.02712","-5","1"
+"37730","Eagan","TN","36.553851","-83.97503","-5","1"
+"37731","Eidson","TN","36.531811","-83.03714","-5","1"
+"37732","Elgin","TN","36.327029","-84.60898","-5","1"
+"37733","Rugby","TN","36.351914","-84.713666","-5","1"
+"37737","Friendsville","TN","35.760657","-84.11925","-5","1"
+"37738","Gatlinburg","TN","35.733627","-83.47156","-5","1"
+"37742","Greenback","TN","35.66806","-84.1817","-5","1"
+"37743","Greeneville","TN","36.102325","-82.85446","-5","1"
+"37744","Greeneville","TN","36.182289","-82.73948","-5","1"
+"37745","Greeneville","TN","36.229928","-82.81406","-5","1"
+"37748","Harriman","TN","35.930801","-84.53135","-5","1"
+"37752","Harrogate","TN","36.581713","-83.61278","-5","1"
+"37753","Hartford","TN","35.822918","-83.10835","-5","1"
+"37754","Heiskell","TN","36.138832","-84.03142","-5","1"
+"37755","Helenwood","TN","36.434757","-84.53288","-5","1"
+"37756","Huntsville","TN","36.351978","-84.42137","-5","1"
+"37757","Jacksboro","TN","36.326509","-84.17277","-5","1"
+"37760","Jefferson City","TN","36.109404","-83.48325","-5","1"
+"37762","Jellico","TN","36.578257","-84.13698","-5","1"
+"37763","Kingston","TN","35.839274","-84.50562","-5","1"
+"37764","Kodak","TN","35.97555","-83.61374","-5","1"
+"37765","Kyles Ford","TN","36.572764","-83.05028","-5","1"
+"37766","La Follette","TN","36.388766","-84.08164","-5","1"
+"37769","Lake City","TN","36.221786","-84.14984","-5","1"
+"37770","Lancing","TN","36.133166","-84.66792","-5","1"
+"37771","Lenoir City","TN","35.815524","-84.29301","-5","1"
+"37772","Lenoir City","TN","35.800329","-84.23281","-5","1"
+"37773","Lone Mountain","TN","36.466398","-83.678621","-5","1"
+"37774","Loudon","TN","35.725969","-84.33069","-5","1"
+"37777","Louisville","TN","35.835374","-84.01196","-5","1"
+"37778","Lowland","TN","36.213293","-83.275211","-5","1"
+"37779","Luttrell","TN","36.20423","-83.75046","-5","1"
+"37801","Maryville","TN","35.709071","-84.05015","-5","1"
+"37802","Maryville","TN","35.728283","-83.933815","-5","1"
+"37803","Maryville","TN","35.693358","-83.98412","-5","1"
+"37804","Maryville","TN","35.781607","-83.93591","-5","1"
+"37806","Mascot","TN","36.086398","-83.7413","-5","1"
+"37807","Maynardville","TN","36.251265","-83.82558","-5","1"
+"37809","Midway","TN","36.162502","-83.0211","-5","1"
+"37810","Mohawk","TN","36.188878","-83.09599","-5","1"
+"37811","Mooresburg","TN","36.352009","-83.22676","-5","1"
+"37813","Morristown","TN","36.186008","-83.27474","-5","1"
+"37814","Morristown","TN","36.225565","-83.30799","-5","1"
+"37815","Morristown","TN","36.213293","-83.275211","-5","1"
+"37816","Morristown","TN","36.213293","-83.275211","-5","1"
+"37818","Mosheim","TN","36.190417","-82.96185","-5","1"
+"37819","Newcomb","TN","36.547121","-84.18206","-5","1"
+"37820","New Market","TN","36.089568","-83.56389","-5","1"
+"37821","Newport","TN","35.963276","-83.20116","-5","1"
+"37822","Newport","TN","35.947688","-83.106554","-5","1"
+"37824","New Tazewell","TN","36.449963","-83.591129","-5","1"
+"37825","New Tazewell","TN","36.417235","-83.65241","-5","1"
+"37826","Niota","TN","35.548316","-84.58403","-5","1"
+"37828","Norris","TN","36.190257","-84.07017","-5","1"
+"37829","Oakdale","TN","35.98291","-84.60149","-5","1"
+"37830","Oak Ridge","TN","35.992691","-84.27044","-5","1"
+"37831","Oak Ridge","TN","36.105971","-84.195796","-5","1"
+"37838","Sewanee","TN","35.199411","-85.93221","-6","1"
+"37840","Oliver Springs","TN","36.045663","-84.36685","-5","1"
+"37841","Oneida","TN","36.49787","-84.51808","-5","1"
+"37842","Ozone","TN","35.87543","-84.792927","-6","1"
+"37843","Parrottsville","TN","36.013728","-83.05351","-5","1"
+"37845","Petros","TN","36.09122","-84.44598","-5","1"
+"37846","Philadelphia","TN","35.679462","-84.45838","-5","1"
+"37847","Pioneer","TN","36.432891","-84.27781","-5","1"
+"37848","Powder Springs","TN","36.24404","-83.68053","-5","1"
+"37849","Powell","TN","36.044507","-84.04192","-5","1"
+"37851","Pruden","TN","36.557884","-83.81392","-5","1"
+"37852","Robbins","TN","36.335832","-84.6022","-5","1"
+"37853","Rockford","TN","35.834126","-83.93452","-5","1"
+"37854","Rockwood","TN","35.861763","-84.70042","-5","1"
+"37857","Rogersville","TN","36.413437","-82.96804","-5","1"
+"37860","Russellville","TN","36.248645","-83.19321","-5","1"
+"37861","Rutledge","TN","36.243526","-83.51516","-5","1"
+"37862","Sevierville","TN","35.818653","-83.59197","-5","1"
+"37863","Pigeon Forge","TN","35.792313","-83.5605","-5","1"
+"37864","Sevierville","TN","35.854211","-83.613849","-5","1"
+"37865","Seymour","TN","35.853932","-83.74476","-5","1"
+"37866","Sharps Chapel","TN","36.355257","-83.82637","-5","1"
+"37867","Shawanee","TN","36.580283","-83.647254","-5","1"
+"37868","Pigeon Forge","TN","35.880902","-83.556134","-5","1"
+"37869","Sneedville","TN","36.521297","-83.22818","-5","1"
+"37870","Speedwell","TN","36.45491","-83.8546","-5","1"
+"37871","Strawberry Plains","TN","36.04051","-83.67934","-5","1"
+"37872","Sunbright","TN","36.262842","-84.66549","-5","1"
+"37873","Surgoinsville","TN","36.51276","-82.83526","-5","1"
+"37874","Sweetwater","TN","35.598659","-84.46613","-5","1"
+"37876","Sevierville","TN","35.860157","-83.48694","-5","1"
+"37877","Talbott","TN","36.154381","-83.40946","-5","1"
+"37878","Tallassee","TN","35.63373","-83.93138","-5","1"
+"37879","Tazewell","TN","36.465808","-83.52357","-5","1"
+"37880","Ten Mile","TN","35.684788","-84.67782","-5","1"
+"37881","Thorn Hill","TN","36.407028","-83.34113","-5","1"
+"37882","Townsend","TN","35.680116","-83.75801","-5","1"
+"37885","Vonore","TN","35.543355","-84.1933","-5","1"
+"37886","Walland","TN","35.734481","-83.81988","-5","1"
+"37887","Wartburg","TN","36.091018","-84.56863","-5","1"
+"37888","Washburn","TN","36.310299","-83.60658","-5","1"
+"37890","White Pine","TN","36.094622","-83.29024","-5","1"
+"37891","Whitesburg","TN","36.277627","-83.13987","-5","1"
+"37892","Winfield","TN","36.563797","-84.41935","-5","1"
+"37893","Winona","TN","36.383425","-84.517287","-5","1"
+"37901","Knoxville","TN","36.032334","-83.884804","-5","1"
+"37902","Knoxville","TN","35.964032","-83.91964","-5","1"
+"37909","Knoxville","TN","35.947846","-84.01554","-5","1"
+"37912","Knoxville","TN","36.008048","-83.97962","-5","1"
+"37913","Knoxville","TN","35.906808","-84.024627","-5","1"
+"37914","Knoxville","TN","35.988528","-83.84981","-5","1"
+"37915","Knoxville","TN","35.97125","-83.90149","-5","1"
+"37916","Knoxville","TN","35.955732","-83.93271","-5","1"
+"37917","Knoxville","TN","35.991982","-83.91859","-5","1"
+"37918","Knoxville","TN","36.046598","-83.92511","-5","1"
+"37919","Knoxville","TN","35.922881","-84.00384","-5","1"
+"37920","Knoxville","TN","35.923517","-83.89042","-5","1"
+"37921","Knoxville","TN","35.973731","-83.97413","-5","1"
+"37922","Knoxville","TN","35.875925","-84.12608","-5","1"
+"37923","Knoxville","TN","35.928997","-84.07543","-5","1"
+"37924","Knoxville","TN","36.029987","-83.80705","-5","1"
+"37927","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37928","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37929","Knoxville","TN","35.922421","-83.795492","-5","1"
+"37930","Knoxville","TN","35.9029","-83.953554","-5","1"
+"37931","Knoxville","TN","35.976063","-84.1182","-5","1"
+"37932","Knoxville","TN","35.919695","-84.17255","-5","1"
+"37933","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37937","Powells Crossroads","TN","35.187308","-85.47929","-6","1"
+"37938","Knoxville","TN","36.113552","-83.93785","-5","1"
+"37939","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37940","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37950","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37951","Knoxville","TN","35.972146","-83.950384","-5","1"
+"37990","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37995","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37996","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37997","Knoxville","TN","35.990142","-83.96218","-5","1"
+"37998","Knoxville","TN","35.935134","-83.750258","-5","1"
+"37999","Knoxville","TN","35.990142","-83.96218","-5","1"
+"38001","Alamo","TN","35.796157","-89.14016","-6","1"
+"38002","Arlington","TN","35.272386","-89.71198","-6","1"
+"38004","Atoka","TN","35.422035","-89.80806","-6","1"
+"38006","Bells","TN","35.696656","-89.08457","-6","1"
+"38007","Bogota","TN","36.158668","-89.437684","-6","1"
+"38008","Bolivar","TN","35.25543","-88.98751","-6","1"
+"38010","Braden","TN","35.288624","-89.48802","-6","1"
+"38011","Brighton","TN","35.474694","-89.72344","-6","1"
+"38012","Brownsville","TN","35.590558","-89.2609","-6","1"
+"38014","Brunswick","TN","35.201738","-89.971538","-6","1"
+"38015","Burlison","TN","35.551277","-89.82387","-6","1"
+"38016","Memphis","TN","35.177475","-89.776835","-6","1"
+"38017","Collierville","TN","35.057224","-89.67417","-6","1"
+"38018","Cordova","TN","35.157681","-89.78249","-6","1"
+"38019","Covington","TN","35.560622","-89.64201","-6","1"
+"38021","Crockett Mills","TN","35.875396","-89.16485","-6","1"
+"38023","Drummonds","TN","35.489296","-89.94754","-6","1"
+"38024","Dyersburg","TN","36.038042","-89.38613","-6","1"
+"38025","Dyersburg","TN","36.046851","-89.443779","-6","1"
+"38026","Memphis","TN","35.132219","-90.047966","-6","1"
+"38027","Collierville","TN","35.201738","-89.971538","-6","1"
+"38028","Eads","TN","35.203968","-89.62203","-6","1"
+"38029","Ellendale","TN","35.201738","-89.971538","-6","1"
+"38030","Finley","TN","35.980206","-89.60112","-6","1"
+"38034","Friendship","TN","35.908286","-89.24555","-6","1"
+"38036","Gallaway","TN","35.320487","-89.6215","-6","1"
+"38037","Gates","TN","35.82036","-89.41497","-6","1"
+"38039","Grand Junction","TN","35.057728","-89.18599","-6","1"
+"38040","Halls","TN","35.879497","-89.41989","-6","1"
+"38041","Henning","AR","35.629555","-89.86945","-6","1"
+"38042","Hickory Valley","TN","35.149952","-89.1536","-6","1"
+"38043","Hickory Withe","TN","35.199265","-89.414113","-6","1"
+"38044","Hornsby","TN","35.211663","-88.80988","-6","1"
+"38045","Laconia","TN","35.290428","-89.232185","-6","1"
+"38046","La Grange","TN","35.049339","-89.23476","-6","1"
+"38047","Lenox","TN","36.063947","-89.62287","-6","1"
+"38048","Macon","TN","35.15066","-89.481362","-6","1"
+"38049","Mason","TN","35.391363","-89.53988","-6","1"
+"38050","Maury City","TN","35.815535","-89.22386","-6","1"
+"38052","Middleton","TN","35.074302","-88.90845","-6","1"
+"38053","Millington","TN","35.347965","-89.90668","-6","1"
+"38054","Millington","TN","35.334132","-89.870636","-6","1"
+"38055","Millington","TN","35.201738","-89.971538","-6","1"
+"38056","Miston","TN","36.046851","-89.443779","-6","1"
+"38057","Moscow","TN","35.055545","-89.37347","-6","1"
+"38058","Munford","TN","35.451159","-89.80845","-6","1"
+"38059","Newbern","TN","36.114872","-89.25419","-6","1"
+"38060","Oakland","TN","35.214462","-89.5034","-6","1"
+"38061","Pocahontas","TN","35.067152","-88.76534","-6","1"
+"38063","Ripley","AR","35.637993","-89.86859","-6","1"
+"38066","Rossville","TN","35.076213","-89.5329","-6","1"
+"38067","Saulsbury","TN","35.090194","-89.02951","-6","1"
+"38068","Somerville","TN","35.275036","-89.32907","-6","1"
+"38069","Stanton","TN","35.459089","-89.35699","-6","1"
+"38070","Tigrett","TN","35.942019","-89.243405","-6","1"
+"38071","Tipton","TN","35.414319","-89.818781","-6","1"
+"38073","Gates","TN","35.839785","-89.40664","-6","1"
+"38074","Bolivar","TN","35.213371","-88.990028","-6","1"
+"38075","Whiteville","TN","35.35001","-89.15508","-6","1"
+"38076","Williston","TN","35.152913","-89.43406","-6","1"
+"38077","Wynnburg","TN","36.344296","-89.522851","-6","1"
+"38079","Tiptonville","KY","36.513386","-89.50472","-6","1"
+"38080","Ridgely","TN","36.224429","-89.48641","-6","1"
+"38083","Millington","TN","35.201738","-89.971538","-6","1"
+"38088","Cordova","TN","35.201738","-89.971538","-6","1"
+"38101","Memphis","TN","35.050667","-89.847782","-6","1"
+"38103","Memphis","TN","35.146131","-90.0534","-6","1"
+"38104","Memphis","TN","35.133825","-90.00463","-6","1"
+"38105","Memphis","TN","35.15275","-90.0356","-6","1"
+"38106","Memphis","TN","35.103019","-90.04017","-6","1"
+"38107","Memphis","TN","35.167515","-90.02224","-6","1"
+"38108","Memphis","TN","35.174165","-89.96028","-6","1"
+"38109","Memphis","TN","35.050286","-90.07523","-6","1"
+"38110","Memphis","TN","35.201738","-89.971538","-6","1"
+"38111","Memphis","TN","35.10935","-89.94363","-6","1"
+"38112","Memphis","TN","35.148605","-89.97479","-6","1"
+"38113","Memphis","TN","35.12738","-89.984484","-6","1"
+"38114","Memphis","TN","35.101525","-89.98543","-6","1"
+"38115","Memphis","TN","35.057311","-89.86291","-6","1"
+"38116","Memphis","TN","35.03319","-90.01128","-6","1"
+"38117","Memphis","TN","35.112929","-89.90389","-6","1"
+"38118","Memphis","TN","35.048455","-89.92426","-6","1"
+"38119","Memphis","TN","35.082936","-89.84892","-6","1"
+"38120","Memphis","TN","35.124818","-89.86562","-6","1"
+"38122","Memphis","TN","35.155589","-89.92315","-6","1"
+"38124","Memphis","TN","35.201738","-89.971538","-6","1"
+"38125","Memphis","TN","35.035466","-89.80329","-6","1"
+"38126","Memphis","TN","35.126469","-90.04359","-6","1"
+"38127","Memphis","TN","35.223796","-90.00646","-6","1"
+"38128","Memphis","TN","35.219882","-89.92588","-6","1"
+"38130","Memphis","TN","35.201738","-89.971538","-6","1"
+"38131","Memphis","TN","35.063236","-89.99403","-6","1"
+"38132","Memphis","TN","35.073545","-89.99788","-6","1"
+"38133","Memphis","TN","35.208709","-89.80518","-6","1"
+"38134","Memphis","TN","35.193046","-89.86559","-6","1"
+"38135","Memphis","TN","35.232085","-89.85214","-6","1"
+"38136","Memphis","TN","35.201738","-89.971538","-6","1"
+"38137","Memphis","TN","35.201738","-89.971538","-6","1"
+"38138","Germantown","TN","35.088885","-89.80677","-6","1"
+"38139","Germantown","TN","35.087468","-89.7615","-6","1"
+"38140","Memphis","TN","35.201738","-89.971538","-6","1"
+"38141","Memphis","TN","35.016803","-89.84701","-6","1"
+"38142","Memphis","TN","35.201738","-89.971538","-6","1"
+"38143","Memphis","TN","35.201738","-89.971538","-6","1"
+"38145","Memphis","TN","35.201738","-89.971538","-6","1"
+"38146","Memphis","TN","35.201738","-89.971538","-6","1"
+"38147","Memphis","TN","35.201738","-89.971538","-6","1"
+"38148","Memphis","TN","35.201738","-89.971538","-6","1"
+"38150","Memphis","TN","35.201738","-89.971538","-6","1"
+"38151","Memphis","TN","35.201738","-89.971538","-6","1"
+"38152","Memphis","TN","35.201738","-89.971538","-6","1"
+"38157","Memphis","TN","35.114416","-89.89189","-6","1"
+"38159","Memphis","TN","35.201738","-89.971538","-6","1"
+"38160","Metcalfe","MS","34.259164","-89.06039","-6","1"
+"38161","Memphis","TN","35.201738","-89.971538","-6","1"
+"38163","Memphis","TN","35.201738","-89.971538","-6","1"
+"38165","Memphis","TN","35.201738","-89.971538","-6","1"
+"38166","Memphis","TN","35.201738","-89.971538","-6","1"
+"38167","Memphis","TN","35.201738","-89.971538","-6","1"
+"38168","Memphis","TN","35.201738","-89.971538","-6","1"
+"38173","Memphis","TN","35.201738","-89.971538","-6","1"
+"38174","Memphis","TN","35.201738","-89.971538","-6","1"
+"38175","Memphis","TN","35.201738","-89.971538","-6","1"
+"38177","Memphis","TN","35.201738","-89.971538","-6","1"
+"38181","Memphis","TN","35.201738","-89.971538","-6","1"
+"38182","Memphis","TN","35.201738","-89.971538","-6","1"
+"38183","Germantown","TN","35.201738","-89.971538","-6","1"
+"38184","Memphis","TN","35.201738","-89.971538","-6","1"
+"38186","Memphis","TN","35.201738","-89.971538","-6","1"
+"38187","Memphis","TN","35.201738","-89.971538","-6","1"
+"38188","Memphis","TN","35.201738","-89.971538","-6","1"
+"38190","Memphis","TN","35.201738","-89.971538","-6","1"
+"38193","Memphis","TN","35.201738","-89.971538","-6","1"
+"38194","Memphis","TN","35.201738","-89.971538","-6","1"
+"38195","Memphis","TN","35.201738","-89.971538","-6","1"
+"38197","Memphis","TN","35.201738","-89.971538","-6","1"
+"38201","McKenzie","TN","36.133065","-88.52246","-6","1"
+"38220","Atwood","TN","35.98269","-88.66966","-6","1"
+"38221","Big Sandy","TN","36.254423","-88.04885","-6","1"
+"38222","Buchanan","TN","36.458738","-88.14836","-6","1"
+"38223","Como","TN","36.310995","-88.260367","-6","1"
+"38224","Cottage Grove","TN","36.395616","-88.49515","-6","1"
+"38225","Dresden","TN","36.305305","-88.6869","-6","1"
+"38226","Dukedom","TN","36.488409","-88.66672","-6","1"
+"38229","Gleason","TN","36.223573","-88.60614","-6","1"
+"38230","Greenfield","TN","36.154281","-88.76867","-6","1"
+"38231","Henry","TN","36.210847","-88.42518","-6","1"
+"38232","Hornbeak","TN","36.339084","-89.33228","-6","1"
+"38233","Kenton","TN","36.201487","-89.03087","-6","1"
+"38235","McLemoresville","TN","35.992987","-88.57656","-6","1"
+"38236","Mansfield","TN","36.167573","-88.26817","-6","1"
+"38237","Martin","TN","36.353928","-88.84191","-6","1"
+"38238","Martin","TN","36.282357","-88.738132","-6","1"
+"38240","Obion","TN","36.253678","-89.25364","-6","1"
+"38241","Palmersville","TN","36.427351","-88.59234","-6","1"
+"38242","Paris","TN","36.300311","-88.32891","-6","1"
+"38251","Puryear","TN","36.444446","-88.35903","-6","1"
+"38253","Rives","TN","36.307957","-89.0377","-6","1"
+"38254","Samburg","TN","36.379051","-89.353821","-6","1"
+"38255","Sharon","TN","36.236377","-88.83586","-6","1"
+"38256","Springville","TN","36.330953","-88.12309","-6","1"
+"38257","South Fulton","TN","36.483302","-88.87895","-6","1"
+"38258","Trezevant","TN","36.016599","-88.61825","-6","1"
+"38259","Trimble","TN","36.198652","-89.18203","-6","1"
+"38260","Troy","TN","36.358158","-89.17888","-6","1"
+"38261","Union City","TN","36.426933","-89.0727","-6","1"
+"38271","Woodland Mills","TN","36.458295","-89.233227","-6","1"
+"38281","Union City","TN","36.354384","-89.149881","-6","1"
+"38301","Jackson","TN","35.60758","-88.81959","-6","1"
+"38302","Jackson","TN","35.612405","-88.841225","-6","1"
+"38303","Jackson","TN","35.612405","-88.841225","-6","1"
+"38305","Jackson","TN","35.693101","-88.80653","-6","1"
+"38308","Jackson","TN","35.612405","-88.841225","-6","1"
+"38310","Adamsville","TN","35.241412","-88.38425","-6","1"
+"38311","Bath Springs","TN","35.436584","-88.11912","-6","1"
+"38313","Beech Bluff","TN","35.601914","-88.62354","-6","1"
+"38314","Jackson","TN","35.612405","-88.841225","-6","1"
+"38315","Bethel Springs","TN","35.260888","-88.64275","-6","1"
+"38316","Bradford","TN","36.067294","-88.81209","-6","1"
+"38317","Bruceton","TN","36.038551","-88.25144","-6","1"
+"38318","Buena Vista","TN","35.960377","-88.26959","-6","1"
+"38320","Camden","TN","36.050286","-88.10137","-6","1"
+"38321","Cedar Grove","TN","35.844195","-88.5322","-6","1"
+"38324","Clarksburg","TN","35.867454","-88.39343","-6","1"
+"38326","Counce","TN","35.041335","-88.27379","-6","1"
+"38327","Crump","TN","35.225753","-88.30456","-6","1"
+"38328","Darden","TN","35.667861","-88.21648","-6","1"
+"38329","Decaturville","TN","35.546839","-88.12345","-6","1"
+"38330","Dyer","TN","36.073575","-89.01767","-6","1"
+"38331","Eaton","TN","35.969336","-89.131915","-6","1"
+"38332","Enville","TN","35.411713","-88.40388","-6","1"
+"38333","Eva","TN","36.114049","-87.97808","-6","1"
+"38334","Finger","TN","35.357639","-88.60089","-6","1"
+"38336","Fruitvale","TN","35.748414","-89.032672","-6","1"
+"38337","Gadsden","TN","35.794403","-89.01731","-6","1"
+"38338","Gibson","TN","35.870849","-88.846372","-6","1"
+"38339","Guys","TN","35.047877","-88.52289","-6","1"
+"38340","Henderson","TN","35.414454","-88.66118","-6","1"
+"38341","Holladay","TN","35.866499","-88.09896","-6","1"
+"38342","Hollow Rock","TN","36.075068","-88.28916","-6","1"
+"38343","Humboldt","TN","35.825299","-88.90218","-6","1"
+"38344","Huntingdon","TN","35.995802","-88.41385","-6","1"
+"38345","Huron","TN","35.576402","-88.51041","-6","1"
+"38346","Idlewild","TN","36.030588","-88.805599","-6","1"
+"38347","Jacks Creek","TN","35.462376","-88.50539","-6","1"
+"38348","Lavinia","TN","35.867764","-88.63929","-6","1"
+"38350","Collinwood","TN","35.148316","-87.745118","-6","1"
+"38351","Lexington","TN","35.658409","-88.40535","-6","1"
+"38352","Luray","TN","35.52953","-88.53275","-6","1"
+"38355","Medina","TN","35.795399","-88.77185","-6","1"
+"38356","Medon","TN","35.431381","-88.88248","-6","1"
+"38357","Michie","TN","35.051008","-88.42611","-6","1"
+"38358","Milan","TN","35.916722","-88.76628","-6","1"
+"38359","Milledgeville","TN","35.37046","-88.36434","-6","1"
+"38361","Morris Chapel","TN","35.311586","-88.29757","-6","1"
+"38362","Oakfield","TN","35.73006","-88.78683","-6","1"
+"38363","Parsons","TN","35.66088","-88.1184","-6","1"
+"38365","Pickwick Dam","TN","35.038284","-88.225601","-6","1"
+"38366","Pinson","TN","35.4832","-88.73125","-6","1"
+"38367","Ramer","TN","35.062793","-88.60533","-6","1"
+"38368","Reagan","TN","35.502859","-88.36148","-6","1"
+"38369","Rutherford","TN","36.12836","-88.98134","-6","1"
+"38370","Saltillo","TN","35.381331","-88.23261","-6","1"
+"38371","Sardis","TN","35.432389","-88.30407","-6","1"
+"38372","Savannah","TN","35.180947","-88.18946","-6","1"
+"38374","Scotts Hill","TN","35.522263","-88.24152","-6","1"
+"38375","Selmer","TN","35.165045","-88.59327","-6","1"
+"38376","Shiloh","TN","35.130384","-88.34742","-6","1"
+"38377","Silerton","TN","35.35604","-88.826923","-6","1"
+"38378","Spring Creek","TN","35.764637","-88.685","-6","1"
+"38379","Stantonville","TN","35.159237","-88.41878","-6","1"
+"38380","Sugar Tree","TN","35.77928","-88.02646","-6","1"
+"38381","Toone","TN","35.35452","-88.95209","-6","1"
+"38382","Trenton","TN","35.973431","-88.95035","-6","1"
+"38384","Toone","TN","35.544159","-88.950206","-6","1"
+"38387","Westport","TN","35.878702","-88.27401","-6","1"
+"38388","Wildersville","TN","35.782093","-88.35061","-6","1"
+"38389","Yorkville","TN","36.135364","-89.111653","-6","1"
+"38390","Yuma","TN","35.843868","-88.36661","-6","1"
+"38391","Denmark","TN","35.560669","-89.00984","-6","1"
+"38392","Mercer","TN","35.468337","-89.04069","-6","1"
+"38393","Chewalla","TN","34.99687","-88.645577","-6","1"
+"38401","Columbia","TN","35.619784","-87.03565","-6","1"
+"38402","Columbia","TN","35.629413","-87.068172","-6","1"
+"38425","Clifton","TN","35.401188","-87.97188","-6","1"
+"38449","Ardmore","TN","35.043961","-86.84324","-6","1"
+"38450","Collinwood","TN","35.187869","-87.77263","-6","1"
+"38451","Culleoka","TN","35.474034","-86.98993","-6","1"
+"38452","Cypress Inn","TN","35.066147","-87.80171","-6","1"
+"38453","Dellrose","TN","35.128317","-86.81188","-6","1"
+"38454","Duck River","TN","35.727189","-87.31927","-6","1"
+"38455","Elkton","TN","35.05392","-86.895305","-6","1"
+"38456","Ethridge","TN","35.336135","-87.26409","-6","1"
+"38457","Five Points","TN","35.025423","-87.29104","-6","1"
+"38459","Frankewing","TN","35.188143","-86.81014","-6","1"
+"38460","Goodspring","TN","35.08957","-87.16259","-6","1"
+"38461","Hampshire","TN","35.606697","-87.33058","-6","1"
+"38462","Hohenwald","TN","35.535397","-87.54905","-6","1"
+"38463","Iron City","TN","35.069017","-87.62171","-6","1"
+"38464","Lawrenceburg","TN","35.259613","-87.37522","-6","1"
+"38468","Leoma","TN","35.135003","-87.29218","-6","1"
+"38469","Loretto","TN","35.071804","-87.41974","-6","1"
+"38471","Lutts","TN","35.083644","-87.91309","-6","1"
+"38472","Lynnville","TN","35.376463","-87.04478","-6","1"
+"38473","Minor Hill","TN","35.026969","-87.16763","-6","1"
+"38474","Mount Pleasant","TN","35.52478","-87.22342","-6","1"
+"38475","Olivehill","TN","35.270793","-88.01666","-6","1"
+"38476","Primm Springs","TN","35.839045","-87.2243","-6","1"
+"38477","Prospect","TN","35.040578","-86.98456","-6","1"
+"38478","Pulaski","TN","35.204983","-87.01246","-6","1"
+"38481","Saint Joseph","TN","35.03492","-87.50215","-6","1"
+"38482","Santa Fe","TN","35.77692","-87.1517","-6","1"
+"38483","Summertown","TN","35.43506","-87.33748","-6","1"
+"38485","Waynesboro","TN","35.343716","-87.75739","-6","1"
+"38486","Westpoint","TN","35.164749","-87.54145","-6","1"
+"38487","Williamsport","TN","35.734499","-87.21926","-6","1"
+"38488","Taft","TN","35.045279","-86.69047","-6","1"
+"38501","Cookeville","TN","36.1832","-85.52054","-6","1"
+"38502","Cookeville","TN","36.141824","-85.454779","-6","1"
+"38503","Cookeville","TN","36.141824","-85.454779","-6","1"
+"38504","Allardt","TN","36.392571","-84.73614","-6","1"
+"38505","Cookeville","TN","36.141824","-85.454779","-6","1"
+"38506","Cookeville","TN","36.177831","-85.46238","-6","1"
+"38514","Clarksdale","MS","34.196894","-90.572408","-6","1"
+"38528","Trezevant","TN","36.003208","-88.614501","-6","1"
+"38541","Allons","TN","36.525275","-85.36148","-6","1"
+"38542","Allred","TN","36.323957","-85.20787","-6","1"
+"38543","Alpine","TN","36.400338","-85.16208","-6","1"
+"38544","Baxter","TN","36.127733","-85.64636","-6","1"
+"38545","Bloomington Springs","TN","36.228911","-85.66854","-6","1"
+"38547","Brush Creek","TN","36.141741","-86.00868","-6","1"
+"38548","Buffalo Valley","TN","36.163234","-85.78987","-6","1"
+"38549","Byrdstown","TN","36.572543","-85.15007","-6","1"
+"38550","Campaign","TN","35.773417","-85.619169","-6","1"
+"38551","Celina","TN","36.547412","-85.48904","-6","1"
+"38552","Chestnut Mound","TN","36.214724","-85.79907","-6","1"
+"38553","Clarkrange","TN","36.209271","-85.00757","-6","1"
+"38554","Crawford","TN","36.26742","-85.16204","-6","1"
+"38555","Crossville","TN","35.929314","-85.05926","-6","1"
+"38556","Jamestown","TN","36.409385","-84.93393","-6","1"
+"38557","Crossville","TN","35.988457","-85.012389","-6","1"
+"38558","Crossville","TN","36.008521","-84.91132","-6","1"
+"38559","Doyle","TN","35.833271","-85.51921","-6","1"
+"38560","Elmwood","TN","36.236398","-85.88908","-6","1"
+"38562","Gainesboro","TN","36.351803","-85.65757","-6","1"
+"38563","Gordonsville","TN","36.182334","-85.9832","-6","1"
+"38564","Granville","TN","36.259907","-85.7555","-6","1"
+"38565","Grimsley","TN","36.260904","-84.99517","-6","1"
+"38567","Hickman","TN","36.140473","-85.91072","-6","1"
+"38568","Hilham","TN","36.414282","-85.45701","-6","1"
+"38569","Lancaster","TN","36.104271","-85.84696","-6","1"
+"38570","Livingston","TN","36.376289","-85.32585","-6","1"
+"38571","Crossville","TN","36.04347","-85.094842","-6","1"
+"38572","Pleasant Hill","TN","35.861811","-85.0902","-6","1"
+"38573","Monroe","TN","36.480151","-85.20656","-6","1"
+"38574","Monterey","TN","36.133983","-85.23805","-6","1"
+"38575","Moss","TN","36.555932","-85.65072","-6","1"
+"38577","Pall Mall","TN","36.571669","-84.99647","-6","1"
+"38578","Pleasant Hill","TN","36.007405","-85.162272","-6","1"
+"38579","Quebeck","TN","35.817417","-85.55772","-6","1"
+"38580","Rickman","TN","36.270655","-85.32525","-6","1"
+"38581","Rock Island","TN","35.751554","-85.63943","-6","1"
+"38582","Silver Point","TN","36.09651","-85.74373","-6","1"
+"38583","Sparta","TN","35.943026","-85.45113","-6","1"
+"38585","Spencer","TN","35.69653","-85.41146","-6","1"
+"38587","Walling","TN","35.869657","-85.61165","-6","1"
+"38588","Whitleyville","TN","36.456113","-85.72381","-6","1"
+"38589","Wilder","TN","36.29017","-85.08484","-6","1"
+"38597","Sumner","MS","33.969302","-90.371546","-6","1"
+"38601","Abbeville","MS","34.489297","-89.47412","-6","1"
+"38602","Arkabutla","MS","34.686272","-90.106756","-6","1"
+"38603","Ashland","MS","34.839417","-89.15818","-6","1"
+"38606","Batesville","MS","34.309659","-89.963","-6","1"
+"38609","Belen","MS","34.275423","-90.37392","-6","1"
+"38610","Blue Mountain","MS","34.659973","-89.02625","-6","1"
+"38611","Byhalia","MS","34.862416","-89.68014","-6","1"
+"38614","Clarksdale","MS","34.196126","-90.59442","-6","1"
+"38617","Coahoma","MS","34.362729","-90.5035","-6","1"
+"38618","Coldwater","MS","34.699588","-89.95004","-6","1"
+"38619","Como","MS","34.514853","-89.88781","-6","1"
+"38620","Courtland","MS","34.236973","-89.91568","-6","1"
+"38621","Crenshaw","MS","34.45965","-90.17154","-6","1"
+"38622","Crowder","MS","34.172051","-90.13765","-6","1"
+"38623","Darling","MS","34.360101","-90.2717","-6","1"
+"38625","Dumas","MS","34.597573","-88.83252","-6","1"
+"38626","Dundee","MS","34.48647","-90.45124","-6","1"
+"38627","Etta","MS","34.425389","-89.20431","-6","1"
+"38628","Falcon","MS","34.291611","-90.292717","-6","1"
+"38629","Falkner","MS","34.879287","-88.99516","-6","1"
+"38630","Farrell","MS","34.22795","-90.63213","-6","1"
+"38631","Friars Point","MS","34.365436","-90.634","-6","1"
+"38632","Hernando","MS","34.811777","-90.01917","-6","1"
+"38633","Hickory Flat","MS","34.628795","-89.20147","-6","1"
+"38634","Holly Springs","MS","34.74504","-89.484963","-6","1"
+"38635","Holly Springs","MS","34.762615","-89.46092","-6","1"
+"38637","Horn Lake","MS","34.959171","-90.04093","-6","1"
+"38638","Independence","MS","34.695853","-89.828798","-6","1"
+"38639","Jonestown","MS","34.31465","-90.44966","-6","1"
+"38641","Lake Cormorant","MS","34.904881","-90.19353","-6","1"
+"38642","Lamar","MS","34.926974","-89.33214","-6","1"
+"38643","Lambert","MS","34.179708","-90.27846","-6","1"
+"38644","Lula","MS","34.449792","-90.47061","-6","1"
+"38645","Lyon","MS","34.237759","-90.48669","-6","1"
+"38646","Marks","MS","34.261893","-90.27443","-6","1"
+"38647","Michigan City","MS","34.975571","-89.25982","-6","1"
+"38649","Mount Pleasant","MS","34.962714","-89.54023","-6","1"
+"38650","Myrtle","MS","34.536153","-89.13829","-6","1"
+"38651","Nesbit","MS","34.893254","-89.97629","-6","1"
+"38652","New Albany","MS","34.489085","-88.99973","-6","1"
+"38654","Olive Branch","MS","34.954106","-89.83743","-6","1"
+"38655","Oxford","MS","34.345016","-89.50735","-6","1"
+"38658","Pope","MS","34.181071","-89.90638","-6","1"
+"38659","Potts Camp","MS","34.643828","-89.33776","-6","1"
+"38661","Red Banks","MS","34.878143","-89.57295","-6","1"
+"38663","Ripley","MS","34.739023","-88.92629","-6","1"
+"38664","Robinsonville","MS","34.818548","-90.29479","-6","1"
+"38665","Sarah","MS","34.578092","-90.1805","-6","1"
+"38666","Sardis","MS","34.418338","-89.90517","-6","1"
+"38668","Senatobia","MS","34.607602","-89.94635","-6","1"
+"38669","Sherard","MS","34.18658","-90.71753","-6","1"
+"38670","Sledge","MS","34.417393","-90.27615","-6","1"
+"38671","Southaven","MS","34.96848","-89.99793","-6","1"
+"38672","Southaven","MS","34.943945","-89.92279","-6","1"
+"38673","Taylor","MS","34.279282","-89.601","-6","1"
+"38674","Tiplersville","MS","34.884396","-88.89784","-6","1"
+"38675","Tula","MS","34.358201","-89.483865","-6","1"
+"38676","Tunica","MS","34.687733","-90.36723","-6","1"
+"38677","University","MS","34.366302","-89.53721","-6","1"
+"38679","Victoria","MS","34.870804","-89.64082","-6","1"
+"38680","Walls","MS","34.961576","-90.12315","-6","1"
+"38683","Walnut","MS","34.937606","-88.85572","-6","1"
+"38685","Waterford","MS","34.549354","-89.61445","-6","1"
+"38686","Walls","MS","34.875277","-89.991991","-6","1"
+"38695","Water Valley","MS","34.164116","-89.625197","-6","1"
+"38701","Greenville","MS","33.380388","-91.05187","-6","1"
+"38702","Greenville","MS","33.425792","-90.994597","-6","1"
+"38703","Greenville","MS","33.442801","-91.02984","-6","1"
+"38704","Greenville","MS","33.253401","-90.918503","-6","1"
+"38720","Alligator","MS","34.127564","-90.73281","-6","1"
+"38721","Anguilla","MS","32.977692","-90.79251","-6","1"
+"38722","Arcola","MS","33.260748","-90.85022","-6","1"
+"38723","Avon","MS","33.229713","-91.04781","-6","1"
+"38725","Benoit","MS","33.628285","-91.0273","-6","1"
+"38726","Beulah","MS","33.780092","-90.9791","-6","1"
+"38730","Boyle","MS","33.701986","-90.76402","-6","1"
+"38731","Chatham","MS","33.085379","-91.088255","-6","1"
+"38732","Cleveland","MS","33.749149","-90.71329","-6","1"
+"38733","Cleveland","MS","33.624024","-90.819547","-6","1"
+"38736","Doddsville","MS","33.65327","-90.49849","-6","1"
+"38737","Drew","MS","33.865068","-90.52395","-6","1"
+"38738","Parchman","MS","33.922146","-90.54366","-6","1"
+"38739","Dublin","MS","34.060111","-90.50275","-6","1"
+"38740","Duncan","MS","34.033462","-90.78544","-6","1"
+"38744","Glen Allan","MS","33.028345","-91.05179","-6","1"
+"38745","Grace","MS","32.984306","-90.94339","-6","1"
+"38746","Gunnison","MS","34.036412","-90.87715","-6","1"
+"38748","Hollandale","MS","33.145438","-90.85634","-6","1"
+"38749","Holly Ridge","MS","33.628715","-90.607457","-6","1"
+"38751","Indianola","MS","33.45139","-90.65824","-6","1"
+"38753","Inverness","MS","33.344368","-90.58537","-6","1"
+"38754","Isola","MS","33.231628","-90.58586","-6","1"
+"38756","Leland","MS","33.407212","-90.87866","-6","1"
+"38758","Mattson","MS","34.095627","-90.51041","-6","1"
+"38759","Merigold","MS","33.822471","-90.72406","-6","1"
+"38760","Metcalfe","MS","33.454082","-90.99667","-6","1"
+"38761","Moorhead","MS","33.44504","-90.49719","-6","1"
+"38762","Mound Bayou","MS","33.887043","-90.73549","-6","1"
+"38763","Nitta Yuma","MS","33.031698","-90.88397","-6","1"
+"38764","Pace","MS","33.796844","-90.85561","-6","1"
+"38765","Panther Burn","MS","33.063312","-90.88093","-6","1"
+"38767","Rena Lara","MS","34.13452","-90.7836","-6","1"
+"38768","Rome","MS","33.965488","-90.52646","-6","1"
+"38769","Rosedale","MS","33.850803","-90.9695","-6","1"
+"38771","Ruleville","MS","33.732774","-90.53427","-6","1"
+"38772","Scott","MS","33.569415","-91.0742","-6","1"
+"38773","Shaw","MS","33.613093","-90.77527","-6","1"
+"38774","Shelby","MS","33.947701","-90.76417","-6","1"
+"38776","Stoneville","MS","33.409614","-90.910404","-6","1"
+"38778","Sunflower","MS","33.555234","-90.51367","-6","1"
+"38780","Wayside","MS","33.272695","-90.995399","-6","1"
+"38781","Winstonville","MS","33.887774","-90.737149","-6","1"
+"38782","Winterville","MS","33.269118","-90.957291","-6","1"
+"38801","Tupelo","MS","34.23615","-88.75665","-6","1"
+"38802","Tupelo","MS","34.234527","-88.767127","-6","1"
+"38803","Tupelo","MS","34.187638","-88.77852","-6","1"
+"38804","Tupelo","MS","34.272374","-88.6822","-6","1"
+"38820","Algoma","MS","34.171543","-89.032791","-6","1"
+"38821","Amory","MS","33.988235","-88.46783","-6","1"
+"38824","Baldwyn","MS","34.511249","-88.63051","-6","1"
+"38825","Becker","MS","33.869763","-88.462173","-6","1"
+"38826","Belden","MS","34.306239","-88.81668","-6","1"
+"38827","Belmont","MS","34.513163","-88.2092","-6","1"
+"38828","Blue Springs","MS","34.413143","-88.87292","-6","1"
+"38829","Booneville","MS","34.653448","-88.53751","-6","1"
+"38833","Burnsville","MS","34.835384","-88.32784","-6","1"
+"38834","Corinth","MS","34.928325","-88.52856","-6","1"
+"38835","Corinth","MS","34.920451","-88.521772","-6","1"
+"38838","Dennis","MS","34.552421","-88.25935","-6","1"
+"38839","Derma","MS","33.856165","-89.303214","-6","1"
+"38841","Ecru","MS","34.344618","-89.02908","-6","1"
+"38843","Fulton","MS","34.265985","-88.38409","-6","1"
+"38844","Gattman","MS","33.885239","-88.24591","-6","1"
+"38846","Glen","MS","34.851034","-88.39868","-6","1"
+"38847","Golden","MS","34.428899","-88.22647","-6","1"
+"38848","Greenwood Springs","MS","33.924023","-88.29002","-6","1"
+"38849","Guntown","MS","34.443919","-88.67217","-6","1"
+"38850","Houlka","MS","34.04281","-89.02557","-6","1"
+"38851","Houston","MS","33.904246","-88.9671","-6","1"
+"38852","Iuka","AL","34.803864","-88.10205","-6","1"
+"38854","McCondy","MS","33.906827","-88.955351","-6","1"
+"38855","Mantachie","MS","34.325456","-88.49376","-6","1"
+"38856","Marietta","MS","34.481995","-88.45205","-6","1"
+"38857","Mooreville","MS","34.280996","-88.57745","-6","1"
+"38858","Nettleton","MS","34.082553","-88.58797","-6","1"
+"38859","New Site","MS","34.530559","-88.36794","-6","1"
+"38860","Okolona","MS","33.976464","-88.76008","-6","1"
+"38862","Plantersville","MS","34.179513","-88.63454","-6","1"
+"38863","Pontotoc","MS","34.236312","-89.00425","-6","1"
+"38864","Randolph","MS","34.134456","-89.20879","-6","1"
+"38865","Rienzi","MS","34.774486","-88.57746","-6","1"
+"38866","Saltillo","MS","34.360547","-88.68079","-6","1"
+"38868","Shannon","MS","34.122101","-88.72967","-6","1"
+"38869","Sherman","MS","34.359456","-88.83873","-6","1"
+"38870","Smithville","MS","34.065563","-88.36577","-6","1"
+"38871","Thaxton","MS","34.324644","-89.20057","-6","1"
+"38873","Tishomingo","MS","34.652269","-88.23581","-6","1"
+"38874","Toccopola","MS","34.248527","-89.2448","-6","1"
+"38875","Trebloc","MS","33.906827","-88.955351","-6","1"
+"38876","Tremont","MS","34.22634","-88.23179","-6","1"
+"38877","Van Vleet","MS","33.987089","-88.898807","-6","1"
+"38878","Vardaman","MS","33.879148","-89.18351","-6","1"
+"38879","Verona","MS","34.188301","-88.72093","-6","1"
+"38880","Wheeler","MS","34.57971","-88.60817","-6","1"
+"38901","Grenada","MS","33.77132","-89.80301","-6","1"
+"38902","Grenada","MS","33.824113","-89.794687","-6","1"
+"38912","Avalon","MS","33.65497","-90.053958","-6","1"
+"38913","Banner","MS","34.115816","-89.39765","-6","1"
+"38914","Big Creek","MS","33.859554","-89.43745","-6","1"
+"38915","Bruce","MS","34.005229","-89.36375","-6","1"
+"38916","Calhoun City","MS","33.839389","-89.32561","-6","1"
+"38917","Carrollton","MS","33.534708","-89.9363","-6","1"
+"38920","Cascilla","MS","33.875369","-90.10215","-6","1"
+"38921","Charleston","MS","33.974998","-90.12046","-6","1"
+"38922","Coffeeville","MS","33.936248","-89.64228","-6","1"
+"38923","Coila","MS","33.368238","-89.99776","-6","1"
+"38924","Cruger","MS","33.309896","-90.21172","-6","1"
+"38925","Duck Hill","MS","33.645396","-89.65893","-6","1"
+"38926","Elliott","MS","33.689476","-89.758302","-6","1"
+"38927","Enid","MS","34.135098","-90.01821","-6","1"
+"38928","Glendora","MS","33.857538","-90.30001","-6","1"
+"38929","Gore Springs","MS","33.748508","-89.54482","-6","1"
+"38930","Greenwood","MS","33.528734","-90.17663","-6","1"
+"38935","Greenwood","MS","33.523355","-90.27757","-6","1"
+"38940","Holcomb","MS","33.742886","-89.99349","-6","1"
+"38941","Itta Bena","MS","33.492412","-90.3243","-6","1"
+"38943","McCarley","MS","33.523907","-89.84901","-6","1"
+"38944","Minter City","MS","33.763479","-90.32393","-6","1"
+"38945","Money","MS","33.650681","-90.196909","-6","1"
+"38946","Morgan City","MS","33.359299","-90.3527","-6","1"
+"38947","North Carrollton","MS","33.517885","-89.92185","-6","1"
+"38948","Oakland","MS","34.082634","-89.89819","-6","1"
+"38949","Paris","MS","34.171462","-89.44452","-6","1"
+"38950","Philipp","MS","33.753716","-90.18159","-6","1"
+"38951","Pittsboro","MS","33.968398","-89.30308","-6","1"
+"38952","Schlater","MS","33.63788","-90.33746","-6","1"
+"38953","Scobey","MS","33.910734","-89.93012","-6","1"
+"38954","Sidon","MS","33.417028","-90.21318","-6","1"
+"38955","Slate Spring","MS","33.743871","-89.375281","-6","1"
+"38957","Sumner","MS","33.972212","-90.35668","-6","1"
+"38958","Swan Lake","MS","33.929206","-90.188462","-6","1"
+"38959","Swiftown","MS","33.304241","-90.42665","-6","1"
+"38960","Tie Plant","MS","33.787157","-89.821941","-6","1"
+"38961","Tillatoba","MS","33.973722","-89.88636","-6","1"
+"38962","Tippo","MS","33.90263","-90.16305","-6","1"
+"38963","Tutwiler","MS","34.015686","-90.39034","-6","1"
+"38964","Vance","MS","34.087461","-90.39276","-6","1"
+"38965","Water Valley","MS","34.148775","-89.62882","-6","1"
+"38966","Webb","MS","33.934418","-90.34434","-6","1"
+"38967","Winona","MS","33.481491","-89.73155","-6","1"
+"39038","Belzoni","MS","33.165359","-90.50127","-6","1"
+"39039","Benton","MS","32.832943","-90.21951","-6","1"
+"39040","Bentonia","MS","32.639989","-90.40856","-6","1"
+"39041","Bolton","MS","32.39336","-90.47024","-6","1"
+"39042","Brandon","MS","32.237742","-89.93514","-6","1"
+"39043","Brandon","MS","32.269041","-89.987491","-6","1"
+"39044","Braxton","MS","32.01965","-89.9742","-6","1"
+"39045","Camden","MS","32.791408","-89.82958","-6","1"
+"39046","Canton","MS","32.618475","-90.01041","-6","1"
+"39047","Brandon","MS","32.39705","-89.98466","-6","1"
+"39048","Bentonia","MS","32.667612","-90.39157","-6","1"
+"39051","Carthage","MS","32.785139","-89.50644","-6","1"
+"39054","Cary","MS","32.804592","-90.92611","-6","1"
+"39056","Clinton","MS","32.347295","-90.33224","-6","1"
+"39057","Conehatta","MS","32.486525","-89.28431","-6","1"
+"39058","Clinton","MS","32.311287","-90.397157","-6","1"
+"39059","Crystal Springs","MS","31.985052","-90.3633","-6","1"
+"39060","Clinton","MS","32.350688","-90.26954","-6","1"
+"39061","Delta City","MS","33.075557","-90.84298","-6","1"
+"39062","D Lo","MS","31.985048","-89.89986","-6","1"
+"39063","Durant","MS","33.102777","-89.87579","-6","1"
+"39066","Edwards","MS","32.295098","-90.60286","-6","1"
+"39067","Ethel","MS","33.127907","-89.46704","-6","1"
+"39069","Fayette","MS","31.707145","-91.05349","-6","1"
+"39071","Flora","MS","32.560845","-90.31338","-6","1"
+"39072","Pocahontas","MS","32.311287","-90.397157","-6","1"
+"39073","Florence","MS","32.125628","-90.10964","-6","1"
+"39074","Forest","MS","32.379693","-89.46552","-6","1"
+"39077","Gallman","MS","31.928751","-90.392603","-6","1"
+"39078","Georgetown","MS","31.869093","-90.17798","-6","1"
+"39079","Goodman","MS","32.940348","-89.89824","-6","1"
+"39080","Harperville","MS","32.492533","-89.494585","-6","1"
+"39081","Harriston","MS","31.739958","-91.050948","-6","1"
+"39082","Harrisville","MS","31.946357","-90.13324","-6","1"
+"39083","Hazlehurst","MS","31.841281","-90.42995","-6","1"
+"39086","Hermanville","MS","31.983753","-90.79058","-6","1"
+"39087","Hillsboro","MS","32.470606","-89.517069","-6","1"
+"39088","Holly Bluff","MS","32.753234","-90.73846","-6","1"
+"39090","Kosciusko","MS","33.038079","-89.56318","-6","1"
+"39092","Lake","MS","32.330717","-89.33827","-6","1"
+"39094","Lena","MS","32.595179","-89.6311","-6","1"
+"39095","Lexington","MS","33.114291","-90.08221","-6","1"
+"39096","Lorman","MS","31.825143","-91.07877","-6","1"
+"39097","Louise","MS","32.984428","-90.58503","-6","1"
+"39098","Ludlow","MS","32.56195","-89.70928","-6","1"
+"39107","McAdams","MS","33.025946","-89.68374","-6","1"
+"39108","McCool","MS","33.169445","-89.33038","-6","1"
+"39109","Madden","MS","32.671826","-89.3324","-6","1"
+"39110","Madison","MS","32.484979","-90.11552","-6","1"
+"39111","Magee","MS","31.880229","-89.72086","-6","1"
+"39112","Sanatorium","MS","31.891839","-89.77926","-6","1"
+"39113","Mayersville","MS","32.905763","-91.04272","-6","1"
+"39114","Mendenhall","MS","31.948527","-89.84256","-6","1"
+"39115","Midnight","MS","33.078256","-90.60068","-6","1"
+"39116","Mize","MS","31.881155","-89.55099","-6","1"
+"39117","Morton","MS","32.313881","-89.66509","-6","1"
+"39119","Mount Olive","MS","31.757725","-89.65851","-6","1"
+"39120","Natchez","MS","31.535545","-91.35434","-6","1"
+"39121","Natchez","MS","31.470602","-91.404404","-6","1"
+"39122","Natchez","MS","31.470602","-91.404404","-6","1"
+"39130","Madison","MS","32.642448","-90.090683","-6","1"
+"39140","Newhebron","MS","31.738817","-89.97045","-6","1"
+"39144","Pattison","MS","31.834496","-90.80341","-6","1"
+"39145","Pelahatchie","MS","32.335063","-89.80491","-6","1"
+"39146","Pickens","MS","32.877746","-89.97586","-6","1"
+"39148","Piney Woods","MS","32.057964","-89.99117","-6","1"
+"39149","Pinola","MS","31.852006","-89.99076","-6","1"
+"39150","Port Gibson","MS","31.970308","-90.97911","-6","1"
+"39151","Puckett","MS","32.08065","-89.776","-6","1"
+"39152","Pulaski","MS","32.220895","-89.57038","-6","1"
+"39153","Raleigh","MS","32.035356","-89.49748","-6","1"
+"39154","Raymond","MS","32.230592","-90.45709","-6","1"
+"39156","Redwood","MS","32.524981","-90.779","-6","1"
+"39157","Ridgeland","MS","32.420814","-90.13134","-6","1"
+"39158","Ridgeland","MS","32.642448","-90.090683","-6","1"
+"39159","Rolling Fork","MS","32.811181","-90.97713","-6","1"
+"39160","Sallis","MS","33.002813","-89.75296","-6","1"
+"39161","Sandhill","MS","32.503522","-89.87039","-6","1"
+"39162","Satartia","MS","32.629834","-90.64376","-6","1"
+"39163","Sharon","MS","32.642448","-90.090683","-6","1"
+"39165","Sibley","MS","31.470602","-91.404404","-6","1"
+"39166","Silver City","MS","33.062845","-90.50034","-6","1"
+"39167","Star","MS","32.096124","-90.061508","-6","1"
+"39168","Taylorsville","MS","31.816868","-89.41533","-6","1"
+"39169","Tchula","MS","33.136434","-90.27065","-6","1"
+"39170","Terry","MS","32.119511","-90.32859","-6","1"
+"39171","Thomastown","MS","32.753923","-89.52414","-6","1"
+"39173","Tinsley","MS","32.762751","-90.36285","-6","1"
+"39174","Tougaloo","MS","32.398142","-90.16072","-6","1"
+"39175","Utica","MS","32.105647","-90.61749","-6","1"
+"39176","Vaiden","MS","33.317882","-89.733","-6","1"
+"39177","Valley Park","MS","32.641205","-90.82835","-6","1"
+"39179","Vaughan","MS","32.806703","-90.08908","-6","1"
+"39180","Vicksburg","MS","32.292761","-90.87184","-6","1"
+"39181","Vicksburg","MS","32.348565","-90.864199","-6","1"
+"39182","Vicksburg","MS","32.348565","-90.864199","-6","1"
+"39183","Vicksburg","MS","32.386653","-90.84485","-6","1"
+"39189","Walnut Grove","MS","32.601899","-89.42078","-6","1"
+"39190","Washington","MS","31.470602","-91.404404","-6","1"
+"39191","Wesson","MS","31.714881","-90.39667","-6","1"
+"39192","West","MS","33.194928","-89.76284","-6","1"
+"39193","Whitfield","MS","32.234775","-90.07263","-6","1"
+"39194","Yazoo City","MS","32.855811","-90.4497","-6","1"
+"39201","Jackson","MS","32.292396","-90.18328","-6","1"
+"39202","Jackson","MS","32.313595","-90.17688","-6","1"
+"39203","Jackson","MS","32.308695","-90.19915","-6","1"
+"39204","Jackson","MS","32.284829","-90.22778","-6","1"
+"39205","Jackson","MS","32.311287","-90.397157","-6","1"
+"39206","Jackson","MS","32.365794","-90.17182","-6","1"
+"39207","Jackson","MS","32.311287","-90.397157","-6","1"
+"39208","Jackson","MS","32.280746","-90.10708","-6","1"
+"39209","Jackson","MS","32.325512","-90.25709","-6","1"
+"39210","Jackson","MS","32.325012","-90.17902","-6","1"
+"39211","Jackson","MS","32.370544","-90.1297","-6","1"
+"39212","Jackson","MS","32.234627","-90.26331","-6","1"
+"39213","Jackson","MS","32.356489","-90.2106","-6","1"
+"39215","Jackson","MS","32.311287","-90.397157","-6","1"
+"39216","Jackson","MS","32.334738","-90.16933","-6","1"
+"39217","Jackson","MS","32.297396","-90.208088","-6","1"
+"39218","Jackson","MS","32.230408","-90.16213","-6","1"
+"39219","Jackson","MS","32.252147","-90.214865","-6","1"
+"39225","Jackson","MS","32.311287","-90.397157","-6","1"
+"39232","Jackson","MS","32.311287","-90.397157","-6","1"
+"39235","Jackson","MS","32.311287","-90.397157","-6","1"
+"39236","Jackson","MS","32.311287","-90.397157","-6","1"
+"39250","Jackson","MS","32.311287","-90.397157","-6","1"
+"39269","Jackson","MS","32.300996","-90.18859","-6","1"
+"39271","Jackson","MS","32.311287","-90.397157","-6","1"
+"39272","Jackson","MS","32.311287","-90.397157","-6","1"
+"39282","Jackson","MS","32.311287","-90.397157","-6","1"
+"39283","Jackson","MS","32.311287","-90.397157","-6","1"
+"39284","Jackson","MS","32.311287","-90.397157","-6","1"
+"39286","Jackson","MS","32.311287","-90.397157","-6","1"
+"39288","Jackson","MS","32.313127","-89.799625","-6","1"
+"39289","Jackson","MS","32.311287","-90.397157","-6","1"
+"39296","Jackson","MS","32.311287","-90.397157","-6","1"
+"39298","Jackson","MS","32.319905","-89.992257","-6","1"
+"39301","Meridian","MS","32.339004","-88.6596","-6","1"
+"39302","Meridian","MS","32.431958","-88.641888","-6","1"
+"39303","Meridian","MS","32.401233","-88.652279","-6","1"
+"39304","Meridian","MS","32.420847","-88.646016","-6","1"
+"39305","Meridian","MS","32.439945","-88.70918","-6","1"
+"39307","Meridian","MS","32.358891","-88.7494","-6","1"
+"39309","Meridian","MS","32.337389","-88.726474","-6","1"
+"39320","Bailey","MS","32.535472","-88.72639","-6","1"
+"39322","Buckatunna","MS","31.574589","-88.53326","-6","1"
+"39323","Chunky","MS","32.315069","-88.91687","-6","1"
+"39324","Clara","MS","31.593682","-88.704829","-6","1"
+"39325","Collinsville","MS","32.553716","-88.86736","-6","1"
+"39326","Daleville","MS","32.578591","-88.66152","-6","1"
+"39327","Decatur","MS","32.444821","-89.11703","-6","1"
+"39328","De Kalb","MS","32.744445","-88.69959","-6","1"
+"39330","Enterprise","MS","32.170432","-88.83866","-6","1"
+"39332","Hickory","MS","32.314553","-89.01461","-6","1"
+"39335","Lauderdale","MS","32.517145","-88.51801","-6","1"
+"39336","Lawrence","MS","32.307815","-89.26169","-6","1"
+"39337","Little Rock","MS","32.527955","-88.9952","-6","1"
+"39338","Louin","MS","32.108768","-89.23675","-6","1"
+"39339","Louisville","MS","33.109635","-89.02849","-6","1"
+"39341","Macon","MS","33.115598","-88.58159","-6","1"
+"39342","Marion","MS","32.336743","-88.616297","-6","1"
+"39345","Newton","MS","32.317298","-89.14483","-6","1"
+"39346","Noxapater","MS","32.957794","-89.0821","-6","1"
+"39347","Pachuta","MS","32.042598","-88.91588","-6","1"
+"39348","Paulding","MS","32.026165","-89.03762","-6","1"
+"39350","Philadelphia","MS","32.776368","-89.12788","-6","1"
+"39352","Porterville","MS","32.678923","-88.49952","-6","1"
+"39354","Preston","MS","32.873605","-88.84028","-6","1"
+"39355","Quitman","MS","32.057969","-88.67069","-6","1"
+"39356","Rose Hill","MS","32.154808","-89.03624","-6","1"
+"39357","Louisville","MS","33.11415","-89.053844","-6","1"
+"39358","Scooba","MS","32.838485","-88.48707","-6","1"
+"39359","Sebastopol","MS","32.568112","-89.33891","-6","1"
+"39360","Shubuta","MS","31.863493","-88.74923","-6","1"
+"39361","Shuqualak","MS","32.985613","-88.57464","-6","1"
+"39362","State Line","MS","31.415048","-88.531","-6","1"
+"39363","Stonewall","MS","32.134826","-88.78589","-6","1"
+"39364","Toomsuba","MS","32.420314","-88.52234","-6","1"
+"39365","Union","MS","32.588341","-89.13047","-6","1"
+"39366","Vossburg","MS","31.931474","-88.922","-6","1"
+"39367","Waynesboro","MS","31.688901","-88.65623","-6","1"
+"39401","Hattiesburg","MS","31.285508","-89.2799","-6","1"
+"39402","Hattiesburg","MS","31.325437","-89.37926","-6","1"
+"39403","Hattiesburg","MS","31.356642","-89.382415","-6","1"
+"39404","Hattiesburg","MS","31.172142","-89.294772","-6","1"
+"39406","Hattiesburg","MS","31.172142","-89.294772","-6","1"
+"39407","Hattiesburg","MS","31.172142","-89.294772","-6","1"
+"39421","Bassfield","MS","31.490798","-89.72655","-6","1"
+"39422","Bay Springs","MS","31.969813","-89.27645","-6","1"
+"39423","Beaumont","MS","31.176725","-88.91223","-6","1"
+"39425","Brooklyn","MS","31.059327","-89.09164","-6","1"
+"39426","Carriere","MS","30.641521","-89.65929","-6","1"
+"39427","Carson","MS","31.49616","-89.83579","-6","1"
+"39428","Collins","MS","31.651487","-89.56525","-6","1"
+"39429","Columbia","MS","31.255242","-89.79264","-6","1"
+"39436","Eastabuchie","MS","31.436305","-89.29464","-6","1"
+"39437","Ellisville","MS","31.588327","-89.21431","-6","1"
+"39439","Heidelberg","MS","31.86883","-89.00323","-6","1"
+"39440","Laurel","MS","31.701492","-89.1393","-6","1"
+"39441","Laurel","MS","31.727664","-89.075482","-6","1"
+"39442","Laurel","MS","31.682254","-89.040622","-6","1"
+"39443","Laurel","MS","31.719947","-89.11948","-6","1"
+"39451","Leakesville","MS","31.162188","-88.60093","-6","1"
+"39452","Lucedale","MS","30.873353","-88.58869","-6","1"
+"39455","Lumberton","MS","31.035015","-89.49561","-6","1"
+"39456","McLain","MS","31.072789","-88.80915","-6","1"
+"39457","McNeill","MS","30.666936","-89.673392","-6","1"
+"39459","Moselle","MS","31.496211","-89.30503","-6","1"
+"39460","Moss","MS","32.013235","-89.11656","-6","1"
+"39461","Neely","MS","31.176281","-88.72248","-6","1"
+"39462","New Augusta","MS","31.215709","-89.04494","-6","1"
+"39463","Nicholson","MS","30.563724","-89.557751","-6","1"
+"39464","Ovett","MS","31.487531","-89.05842","-6","1"
+"39465","Petal","MS","31.358823","-89.2279","-6","1"
+"39466","Picayune","MS","30.52798","-89.66611","-6","1"
+"39470","Poplarville","MS","30.810936","-89.56435","-6","1"
+"39474","Prentiss","MS","31.605946","-89.86086","-6","1"
+"39475","Purvis","MS","31.165903","-89.41323","-6","1"
+"39476","Richton","MS","31.355717","-88.85881","-6","1"
+"39477","Sandersville","MS","31.788517","-89.03379","-6","1"
+"39478","Sandy Hook","MS","31.054236","-89.85553","-6","1"
+"39479","Seminary","MS","31.543388","-89.4648","-6","1"
+"39480","Soso","MS","31.726898","-89.30528","-6","1"
+"39481","Stringer","MS","31.857399","-89.2469","-6","1"
+"39482","Sumrall","MS","31.376358","-89.58558","-6","1"
+"39483","Foxworth","MS","31.218509","-89.90761","-6","1"
+"39501","Gulfport","MS","30.380597","-89.09626","-6","1"
+"39502","Gulfport","MS","30.415795","-89.068448","-6","1"
+"39503","Gulfport","MS","30.461786","-89.10381","-6","1"
+"39505","Gulfport","MS","30.415795","-89.068448","-6","1"
+"39506","Gulfport","MS","30.415795","-89.068448","-6","1"
+"39507","Gulfport","MS","30.397044","-89.03998","-6","1"
+"39520","Bay Saint Louis","MS","30.304327","-89.40705","-6","1"
+"39521","Bay Saint Louis","MS","30.403156","-89.49821","-6","1"
+"39522","Stennis Space Center","MS","30.403156","-89.49821","-6","1"
+"39525","Diamondhead","MS","30.382544","-89.36958","-6","1"
+"39529","Stennis Space Center","MS","30.403156","-89.49821","-6","1"
+"39530","Biloxi","MS","30.399148","-88.88917","-6","1"
+"39531","Biloxi","MS","30.405831","-88.96219","-6","1"
+"39532","Biloxi","MS","30.462388","-88.93293","-6","1"
+"39533","Biloxi","MS","30.415795","-89.068448","-6","1"
+"39534","Biloxi","MS","30.415795","-89.068448","-6","1"
+"39535","Biloxi","MS","30.415795","-89.068448","-6","1"
+"39540","D'Iberville","MS","30.444267","-88.899207","-6","1"
+"39552","Escatawpa","MS","30.441072","-88.634482","-6","1"
+"39553","Gautier","MS","30.400599","-88.65092","-6","1"
+"39555","Hurley","MS","30.71325","-88.519743","-6","1"
+"39556","Kiln","MS","30.429334","-89.43471","-6","1"
+"39558","Lakeshore","MS","30.239124","-89.459526","-6","1"
+"39560","Long Beach","MS","30.356147","-89.16346","-6","1"
+"39561","McHenry","MS","30.704034","-89.15395","-6","1"
+"39562","Moss Point","MS","30.522009","-88.50312","-6","1"
+"39563","Moss Point","MS","30.410999","-88.52514","-6","1"
+"39564","Ocean Springs","MS","30.403286","-88.77565","-6","1"
+"39565","Ocean Springs","MS","30.566715","-88.76018","-6","1"
+"39566","Ocean Springs","MS","30.441072","-88.634482","-6","1"
+"39567","Pascagoula","MS","30.362203","-88.5469","-6","1"
+"39568","Pascagoula","MS","30.441072","-88.634482","-6","1"
+"39569","Pascagoula","MS","30.441072","-88.634482","-6","1"
+"39571","Pass Christian","MS","30.371623","-89.27038","-6","1"
+"39572","Pearlington","MS","30.249994","-89.60493","-6","1"
+"39573","Perkinston","MS","30.710795","-89.09325","-6","1"
+"39574","Saucier","MS","30.600244","-89.11948","-6","1"
+"39576","Waveland","MS","30.289646","-89.38349","-6","1"
+"39577","Wiggins","MS","30.94336","-89.17912","-6","1"
+"39579","Pearlington","MS","30.258204","-89.602572","-6","1"
+"39581","Pascagoula","MS","30.36298","-88.52901","-6","1"
+"39595","Pascagoula","MS","30.441072","-88.634482","-6","1"
+"39601","Brookhaven","MS","31.574319","-90.45029","-6","1"
+"39602","Brookhaven","MS","31.533354","-90.490661","-6","1"
+"39603","Brookhaven","MS","31.612287","-90.446702","-6","1"
+"39629","Bogue Chitto","MS","31.441613","-90.45281","-6","1"
+"39630","Bude","MS","31.463533","-90.84522","-6","1"
+"39631","Centreville","MS","31.078189","-91.07723","-6","1"
+"39632","Chatawa","MS","31.059186","-90.46706","-6","1"
+"39633","Crosby","MS","31.296257","-91.12921","-6","1"
+"39635","Fernwood","MS","31.186981","-90.44989","-6","1"
+"39638","Gloster","MS","31.206278","-90.9959","-6","1"
+"39641","Jayess","MS","31.363848","-90.17457","-6","1"
+"39643","Kokomo","MS","31.231448","-90.02263","-6","1"
+"39645","Liberty","MS","31.148177","-90.79859","-6","1"
+"39647","McCall Creek","MS","31.509919","-90.69788","-6","1"
+"39648","Mccomb","MS","31.225598","-90.43327","-6","1"
+"39649","Mccomb","MS","31.17494","-90.403987","-6","1"
+"39652","Magnolia","MS","31.117097","-90.45287","-6","1"
+"39653","Meadville","MS","31.461337","-90.89208","-6","1"
+"39654","Monticello","MS","31.544331","-90.1213","-6","1"
+"39656","Oak Vale","MS","31.458217","-89.93268","-6","1"
+"39657","Osyka","MS","31.028259","-90.4588","-6","1"
+"39660","McComb","MS","31.245067","-90.506861","-6","1"
+"39661","Roxie","MS","31.487982","-91.08403","-6","1"
+"39662","Ruth","MS","31.40227","-90.26002","-6","1"
+"39663","Silver Creek","MS","31.590797","-90.00583","-6","1"
+"39664","Smithdale","MS","31.328058","-90.67792","-6","1"
+"39665","Sontag","MS","31.643751","-90.20776","-6","1"
+"39666","Summit","MS","31.292262","-90.45228","-6","1"
+"39667","Tylertown","MS","31.131018","-90.12856","-6","1"
+"39668","Union Church","MS","31.668442","-90.76317","-6","1"
+"39669","Woodville","MS","31.120979","-91.35511","-6","1"
+"39701","Columbus","MS","33.492107","-88.43746","-6","1"
+"39702","Columbus","MS","33.463004","-88.35574","-6","1"
+"39703","Columbus","MS","33.484147","-88.283998","-6","1"
+"39704","Columbus","MS","33.69048","-88.33097","-6","1"
+"39705","Columbus","MS","33.581599","-88.43297","-6","1"
+"39710","Columbus","MS","33.51633","-88.460083","-6","1"
+"39730","Aberdeen","MS","33.833689","-88.55463","-6","1"
+"39731","Brooksville","MS","33.230508","-88.57968","-6","1"
+"39735","Ackerman","MS","33.371974","-89.17616","-6","1"
+"39736","Artesia","MS","33.415448","-88.64745","-6","1"
+"39737","Bellefontaine","MS","33.648956","-89.334234","-6","1"
+"39739","Brooksville","MS","33.243098","-88.60228","-6","1"
+"39740","Caledonia","MS","33.752213","-88.30989","-6","1"
+"39741","Cedarbluff","MS","33.67341","-88.87957","-6","1"
+"39743","Crawford","MS","33.313523","-88.62721","-6","1"
+"39744","Eupora","MS","33.577688","-89.3028","-6","1"
+"39745","French Camp","MS","33.312695","-89.41628","-6","1"
+"39746","Hamilton","MS","33.743856","-88.42703","-6","1"
+"39747","Kilmichael","MS","33.413657","-89.56261","-6","1"
+"39750","Maben","MS","33.596326","-89.07609","-6","1"
+"39751","Mantee","MS","33.702318","-89.05064","-6","1"
+"39752","Mathiston","MS","33.54549","-89.13632","-6","1"
+"39753","Mayhew","MS","33.483814","-88.640881","-6","1"
+"39754","Montpelier","MS","33.659271","-88.753976","-6","1"
+"39755","Pheba","MS","33.608062","-88.9596","-6","1"
+"39756","Prairie","MS","33.786542","-88.72404","-6","1"
+"39758","Sturgis","MS","33.344664","-89.036193","-6","1"
+"39759","Starkville","MS","33.450215","-88.82383","-6","1"
+"39760","Starkville","MS","33.459924","-88.832163","-6","1"
+"39762","Mississippi State","MS","33.453349","-88.79107","-6","1"
+"39766","Steens","MS","33.615277","-88.31031","-6","1"
+"39767","Stewart","MS","33.463558","-89.46705","-6","1"
+"39769","Sturgis","MS","33.333797","-89.01361","-6","1"
+"39771","Walthall","MS","33.606148","-89.27527","-6","1"
+"39772","Weir","MS","33.321345","-89.32063","-6","1"
+"39773","West Point","MS","33.619058","-88.64686","-6","1"
+"39776","Woodland","MS","33.779165","-89.03949","-6","1"
+"39871","Flora","MS","32.540084","-90.307122","-6","1"
+"39901","Atlanta","GA","33.891251","-84.07456","-5","1"
+"39940","Laurel","MS","31.706345","-89.12119","-6","1"
+"39956","Kiln","MS","30.409245","-89.438829","-6","1"
+"40003","Bagdad","KY","38.279797","-85.03498","-5","1"
+"40004","Bardstown","KY","37.81109","-85.46164","-5","1"
+"40006","Bedford","KY","38.597624","-85.33889","-5","1"
+"40007","Bethlehem","KY","38.452451","-85.00764","-5","1"
+"40008","Bloomfield","KY","37.923734","-85.28257","-5","1"
+"40009","Bradfordsville","KY","37.477192","-85.10175","-5","1"
+"40010","Buckner","KY","38.366467","-85.45075","-5","1"
+"40011","Campbellsburg","KY","38.53445","-85.17178","-5","1"
+"40012","Chaplin","KY","37.905918","-85.21241","-5","1"
+"40013","Coxs Creek","KY","37.928563","-85.49036","-5","1"
+"40014","Crestwood","KY","38.335106","-85.4584","-5","1"
+"40018","Eastwood","KY","38.22977","-85.66304","-5","1"
+"40019","Eminence","KY","38.370336","-85.17208","-5","1"
+"40020","Fairfield","KY","37.9348","-85.38765","-5","1"
+"40022","Finchville","KY","38.147801","-85.33158","-5","1"
+"40023","Fisherville","KY","38.182772","-85.43238","-5","1"
+"40025","Glenview","KY","38.309597","-85.643359","-5","1"
+"40026","Goshen","KY","38.411964","-85.57066","-5","1"
+"40027","Harrods Creek","KY","38.329718","-85.63299","-5","1"
+"40031","La Grange","KY","38.407833","-85.38475","-5","1"
+"40032","La Grange","KY","38.40464","-85.460504","-5","1"
+"40033","Lebanon","KY","37.565894","-85.25148","-5","1"
+"40036","Lockport","KY","38.434443","-84.96898","-5","1"
+"40037","Loretto","KY","37.652712","-85.41337","-5","1"
+"40040","Mackville","KY","37.742806","-85.05564","-5","1"
+"40041","Masonic Home","KY","38.25361","-85.662215","-5","1"
+"40045","Milton","KY","38.702793","-85.37187","-5","1"
+"40046","Mount Eden","KY","38.026767","-85.1869","-5","1"
+"40047","Mount Washington","KY","38.045982","-85.55467","-5","1"
+"40048","Nazareth","KY","37.756941","-85.44671","-5","1"
+"40049","Nerinx","KY","37.660251","-85.393204","-5","1"
+"40050","New Castle","KY","38.435604","-85.17658","-5","1"
+"40051","New Haven","KY","37.656291","-85.58099","-5","1"
+"40052","New Hope","KY","37.585365","-85.50817","-5","1"
+"40053","Pewee Valley","KY","37.7604","-85.447393","-5","1"
+"40055","Pendleton","KY","38.495454","-85.33839","-5","1"
+"40056","Pewee Valley","KY","38.308109","-85.48714","-5","1"
+"40057","Pleasureville","KY","38.386916","-85.06609","-5","1"
+"40058","Port Royal","KY","38.433076","-85.17111","-5","1"
+"40059","Prospect","KY","38.350915","-85.60042","-5","1"
+"40060","Raywick","KY","37.533395","-85.43588","-5","1"
+"40061","Saint Catharine","KY","37.773962","-85.201068","-5","1"
+"40062","Saint Francis","KY","37.590699","-85.45004","-5","1"
+"40063","Saint Mary","KY","37.579519","-85.355132","-5","1"
+"40065","Shelbyville","KY","38.211511","-85.21658","-5","1"
+"40066","Shelbyville","KY","38.197268","-85.212156","-5","1"
+"40067","Simpsonville","KY","38.210818","-85.36122","-5","1"
+"40068","Smithfield","KY","38.400619","-85.27741","-5","1"
+"40069","Springfield","KY","37.702418","-85.22257","-5","1"
+"40070","Sulphur","KY","38.486325","-85.27425","-5","1"
+"40071","Taylorsville","KY","38.045406","-85.36427","-5","1"
+"40075","Turners Station","KY","38.552133","-85.101879","-5","1"
+"40076","Waddy","KY","38.122088","-85.06677","-5","1"
+"40077","Westport","KY","38.491982","-85.4722","-5","1"
+"40078","Willisburg","KY","37.840066","-85.12572","-5","1"
+"40080","Fairfield","KY","37.93388","-85.385382","-5","1"
+"40081","Crestwood","KY","38.3386","-85.492459","-5","1"
+"40104","Battletown","KY","38.087303","-86.35414","-5","1"
+"40106","Big Spring","KY","37.788538","-86.231194","-6","1"
+"40107","Boston","KY","37.768921","-85.65602","-5","1"
+"40108","Brandenburg","KY","37.973094","-86.11831","-5","1"
+"40109","Brooks","KY","38.062515","-85.73559","-5","1"
+"40110","Clermont","KY","37.93462","-85.65545","-5","1"
+"40111","Cloverport","KY","37.816771","-86.63448","-6","1"
+"40115","Custer","KY","37.753533","-86.21654","-6","1"
+"40117","Ekron","KY","37.915077","-86.14434","-5","1"
+"40118","Fairdale","KY","38.106135","-85.75362","-5","1"
+"40119","Falls Of Rough","KY","37.600179","-86.52846","-6","1"
+"40121","Fort Knox","KY","37.895491","-85.9662","-5","1"
+"40140","Garfield","KY","37.675627","-86.23001","-6","1"
+"40142","Guston","KY","37.894075","-86.20383","-5","1"
+"40143","Hardinsburg","KY","37.777083","-86.48345","-6","1"
+"40144","Harned","KY","37.750101","-86.39972","-6","1"
+"40145","Hudson","KY","37.652706","-86.3173","-6","1"
+"40146","Irvington","KY","37.88108","-86.31377","-6","1"
+"40150","Lebanon Junction","KY","37.849334","-85.73269","-5","1"
+"40152","McDaniels","KY","37.61966","-86.45078","-6","1"
+"40153","McQuady","KY","37.802295","-86.414768","-6","1"
+"40155","Muldraugh","KY","37.937825","-85.99137","-5","1"
+"40157","Payneville","KY","38.028543","-86.38511","-5","1"
+"40159","Radcliff","KY","37.723474","-85.976854","-5","1"
+"40160","Radcliff","KY","37.828459","-85.93888","-5","1"
+"40161","Rhodelia","KY","38.005963","-86.398391","-5","1"
+"40162","Rineyville","KY","37.756775","-86.00073","-5","1"
+"40164","Se Ree","KY","37.670928","-86.39204","-6","1"
+"40165","Shepherdsville","KY","37.997938","-85.69667","-5","1"
+"40170","Stephensport","KY","37.965908","-86.49255","-6","1"
+"40171","Union Star","KY","37.969766","-86.43079","-6","1"
+"40175","Vine Grove","KY","37.826822","-86.00692","-5","1"
+"40176","Webster","KY","37.934279","-86.34869","-6","1"
+"40177","West Point","KY","37.997957","-85.94452","-5","1"
+"40178","Westview","KY","37.647315","-86.40623","-6","1"
+"40179","West Point","KY","37.998628","-85.946585","-5","1"
+"40201","Louisville","KY","38.188962","-85.676819","-5","1"
+"40202","Louisville","KY","38.252854","-85.75137","-5","1"
+"40203","Louisville","KY","38.248106","-85.7665","-5","1"
+"40204","Louisville","KY","38.23862","-85.72626","-5","1"
+"40205","Louisville","KY","38.22292","-85.68326","-5","1"
+"40206","Louisville","KY","38.254671","-85.70254","-5","1"
+"40207","Louisville","KY","38.257489","-85.65134","-5","1"
+"40208","Louisville","KY","38.218764","-85.76241","-5","1"
+"40209","Louisville","KY","38.19187","-85.75298","-5","1"
+"40210","Louisville","KY","38.23067","-85.78665","-5","1"
+"40211","Louisville","KY","38.24142","-85.81181","-5","1"
+"40212","Louisville","KY","38.26632","-85.79998","-5","1"
+"40213","Louisville","KY","38.186126","-85.71304","-5","1"
+"40214","Louisville","KY","38.160936","-85.77624","-5","1"
+"40215","Louisville","KY","38.19192","-85.78405","-5","1"
+"40216","Louisville","KY","38.188886","-85.83137","-5","1"
+"40217","Louisville","KY","38.21632","-85.739","-5","1"
+"40218","Louisville","KY","38.193769","-85.65733","-5","1"
+"40219","Louisville","KY","38.141638","-85.68218","-5","1"
+"40220","Louisville","KY","38.214982","-85.62207","-5","1"
+"40221","Louisville","KY","38.188962","-85.676819","-5","1"
+"40222","Louisville","KY","38.26507","-85.61319","-5","1"
+"40223","Louisville","KY","38.258941","-85.55574","-5","1"
+"40224","Louisville","KY","38.188962","-85.676819","-5","1"
+"40225","Louisville","KY","38.188962","-85.676819","-5","1"
+"40228","Louisville","KY","38.137586","-85.62741","-5","1"
+"40229","Louisville","KY","38.085601","-85.66979","-5","1"
+"40231","Louisville","KY","38.188962","-85.676819","-5","1"
+"40232","Louisville","KY","38.188962","-85.676819","-5","1"
+"40233","Louisville","KY","38.188962","-85.676819","-5","1"
+"40241","Louisville","KY","38.305636","-85.58424","-5","1"
+"40242","Louisville","KY","38.279059","-85.59037","-5","1"
+"40243","Louisville","KY","38.237155","-85.53657","-5","1"
+"40245","Louisville","KY","38.270855","-85.48322","-5","1"
+"40250","Louisville","KY","38.188962","-85.676819","-5","1"
+"40251","Louisville","KY","38.188962","-85.676819","-5","1"
+"40252","Louisville","KY","38.188962","-85.676819","-5","1"
+"40253","Louisville","KY","38.188962","-85.676819","-5","1"
+"40255","Louisville","KY","38.188962","-85.676819","-5","1"
+"40256","Louisville","KY","38.188962","-85.676819","-5","1"
+"40257","Louisville","KY","38.188962","-85.676819","-5","1"
+"40258","Louisville","KY","38.141719","-85.86375","-5","1"
+"40259","Louisville","KY","38.188962","-85.676819","-5","1"
+"40261","Louisville","KY","38.188962","-85.676819","-5","1"
+"40266","Louisville","KY","38.188962","-85.676819","-5","1"
+"40268","Louisville","KY","38.188962","-85.676819","-5","1"
+"40269","Louisville","KY","38.188962","-85.676819","-5","1"
+"40270","Louisville","KY","38.188962","-85.676819","-5","1"
+"40272","Louisville","KY","38.096056","-85.85994","-5","1"
+"40280","Louisville","KY","38.246721","-85.685261","-5","1"
+"40281","Louisville","KY","38.188962","-85.676819","-5","1"
+"40282","Louisville","KY","38.188962","-85.676819","-5","1"
+"40283","Louisville","KY","38.188962","-85.676819","-5","1"
+"40285","Louisville","KY","38.188962","-85.676819","-5","1"
+"40287","Louisville","KY","38.188962","-85.676819","-5","1"
+"40289","Louisville","KY","38.188962","-85.676819","-5","1"
+"40290","Louisville","KY","38.188962","-85.676819","-5","1"
+"40291","Louisville","KY","38.147232","-85.59169","-5","1"
+"40292","Louisville","KY","38.188962","-85.676819","-5","1"
+"40293","Louisville","KY","38.188962","-85.676819","-5","1"
+"40294","Louisville","KY","38.188962","-85.676819","-5","1"
+"40295","Louisville","KY","38.188962","-85.676819","-5","1"
+"40296","Louisville","KY","38.188962","-85.676819","-5","1"
+"40297","Louisville","KY","38.188962","-85.676819","-5","1"
+"40298","Louisville","KY","38.188962","-85.676819","-5","1"
+"40299","Louisville","KY","38.190568","-85.55348","-5","1"
+"40310","Burgin","KY","37.754255","-84.76904","-5","1"
+"40311","Carlisle","KY","38.320944","-84.02358","-5","1"
+"40312","Clay City","KY","37.846536","-83.9343","-5","1"
+"40313","Clearfield","KY","38.156248","-83.41586","-5","1"
+"40316","Denniston","KY","37.933123","-83.52303","-5","1"
+"40317","Elliottville","KY","38.176471","-83.268234","-5","1"
+"40319","Farmers","KY","38.140258","-83.533691","-5","1"
+"40320","Ford","KY","37.968496","-84.157766","-5","1"
+"40322","Frenchburg","KY","37.937105","-83.63429","-5","1"
+"40324","Georgetown","KY","38.221179","-84.55465","-5","1"
+"40328","Gravel Switch","KY","37.561722","-85.0227","-5","1"
+"40329","Haldeman","KY","38.206706","-83.41725","-5","1"
+"40330","Harrodsburg","KY","37.773923","-84.85812","-5","1"
+"40334","Hope","KY","38.016706","-83.76639","-5","1"
+"40336","Irvine","KY","37.694764","-83.9771","-5","1"
+"40337","Jeffersonville","KY","37.9615","-83.8438","-5","1"
+"40339","Keene","KY","37.942941","-84.64418","-5","1"
+"40340","Nicholasville","KY","37.866238","-84.579491","-5","1"
+"40342","Lawrenceburg","KY","38.012479","-84.94075","-5","1"
+"40346","Means","KY","37.979941","-83.73183","-5","1"
+"40347","Midway","KY","38.153759","-84.70928","-5","1"
+"40348","Millersburg","KY","38.302495","-84.14578","-5","1"
+"40350","Moorefield","KY","38.304494","-83.87442","-5","1"
+"40351","Morehead","KY","38.19056","-83.4321","-5","1"
+"40353","Mount Sterling","KY","38.061248","-83.92964","-5","1"
+"40355","New Liberty","KY","38.606023","-84.8279","-5","1"
+"40356","Nicholasville","KY","37.883886","-84.571","-5","1"
+"40357","North Middletown","KY","38.146395","-84.107655","-5","1"
+"40358","Olympia","KY","38.057744","-83.6848","-5","1"
+"40359","Owenton","KY","38.467809","-84.81023","-5","1"
+"40360","Owingsville","KY","38.152302","-83.76603","-5","1"
+"40361","Paris","KY","38.212471","-84.23646","-5","1"
+"40362","Paris","KY","38.219407","-84.205944","-5","1"
+"40363","Perry Park","KY","38.522034","-85.00607","-5","1"
+"40366","Preston","KY","38.086673","-83.757123","-5","1"
+"40370","Sadieville","KY","38.399525","-84.53353","-5","1"
+"40371","Salt Lick","KY","38.087867","-83.61146","-5","1"
+"40372","Salvisa","KY","37.911825","-84.88657","-5","1"
+"40374","Sharpsburg","KY","38.201485","-83.91734","-5","1"
+"40376","Slade","KY","37.78422","-83.69224","-5","1"
+"40379","Stamping Ground","KY","38.29617","-84.69614","-5","1"
+"40380","Stanton","KY","37.838747","-83.8099","-5","1"
+"40383","Versailles","KY","38.042639","-84.73189","-5","1"
+"40384","Versailles","KY","38.021292","-84.745488","-5","1"
+"40385","Waco","KY","37.724497","-84.11389","-5","1"
+"40386","Versailles","KY","38.021292","-84.745488","-5","1"
+"40387","Wellington","KY","37.929101","-83.49464","-5","1"
+"40390","Wilmore","KY","37.85743","-84.66069","-5","1"
+"40391","Winchester","KY","37.98223","-84.17023","-5","1"
+"40392","Winchester","KY","37.968496","-84.157766","-5","1"
+"40402","Annville","KY","37.29409","-83.9759","-5","1"
+"40403","Berea","KY","37.575568","-84.27767","-5","1"
+"40404","Berea","KY","37.716443","-84.299699","-5","1"
+"40405","Bighill","KY","37.716443","-84.299699","-5","1"
+"40409","Brodhead","KY","37.374681","-84.41808","-5","1"
+"40410","Bryantsville","KY","37.651397","-84.546693","-5","1"
+"40419","Crab Orchard","KY","37.455879","-84.48753","-5","1"
+"40421","Dabolt","KY","37.416008","-83.993588","-5","1"
+"40422","Danville","KY","37.644426","-84.78862","-5","1"
+"40423","Danville","KY","37.624659","-84.845767","-5","1"
+"40434","Gray Hawk","KY","37.395468","-83.908492","-5","1"
+"40437","Hustonville","KY","37.431549","-84.81256","-5","1"
+"40440","Junction City","KY","37.583748","-84.80855","-5","1"
+"40442","Kings Mountain","KY","37.351449","-84.7219","-5","1"
+"40444","Lancaster","KY","37.667083","-84.59496","-5","1"
+"40445","Livingston","KY","37.302783","-84.21527","-5","1"
+"40446","Lancaster","KY","37.651397","-84.546693","-5","1"
+"40447","McKee","KY","37.457017","-84.03435","-5","1"
+"40448","McKinney","KY","37.460003","-84.75676","-5","1"
+"40452","Mitchellsburg","KY","37.603345","-84.94918","-5","1"
+"40456","Mount Vernon","KY","37.36766","-84.33233","-5","1"
+"40460","Orlando","KY","37.406069","-84.24292","-5","1"
+"40461","Paint Lick","KY","37.59483","-84.40789","-5","1"
+"40464","Parksville","KY","37.55081","-84.90009","-5","1"
+"40467","Peoples","KY","37.416008","-83.993588","-5","1"
+"40468","Perryville","KY","37.65487","-84.98037","-5","1"
+"40469","Brodhead","KY","37.40382","-84.405839","-5","1"
+"40472","Ravenna","KY","37.703394","-83.91384","-5","1"
+"40473","Renfro Valley","KY","37.345751","-84.31614","-5","1"
+"40475","Richmond","KY","37.745999","-84.28433","-5","1"
+"40476","Richmond","KY","37.716443","-84.299699","-5","1"
+"40481","Sandgap","KY","37.43424","-84.09155","-5","1"
+"40484","Stanford","KY","37.520836","-84.6735","-5","1"
+"40486","Tyner","KY","37.369321","-83.85889","-5","1"
+"40488","Waneta","KY","37.471602","-84.03936","-5","1"
+"40489","Waynesburg","KY","37.351221","-84.62099","-5","1"
+"40492","Wildie","KY","37.345751","-84.31614","-5","1"
+"40495","Winston","KY","37.709721","-84.082894","-5","1"
+"40501","Lexington","KY","38.037847","-84.61645","-5","1"
+"40502","Lexington","KY","38.017219","-84.4859","-5","1"
+"40503","Lexington","KY","38.007898","-84.53452","-5","1"
+"40504","Lexington","KY","38.039322","-84.54259","-5","1"
+"40505","Lexington","KY","38.058477","-84.46109","-5","1"
+"40506","Lexington","KY","38.028712","-84.507471","-5","1"
+"40507","Lexington","KY","38.047408","-84.49627","-5","1"
+"40508","Lexington","KY","38.051727","-84.49336","-5","1"
+"40509","Lexington","KY","38.005199","-84.40954","-5","1"
+"40510","Lexington","KY","38.064087","-84.60713","-5","1"
+"40511","Lexington","KY","38.105283","-84.50775","-5","1"
+"40512","Lexington","KY","38.028269","-84.471505","-5","1"
+"40513","Lexington","KY","38.010247","-84.58619","-5","1"
+"40514","Lexington","KY","37.984907","-84.56691","-5","1"
+"40515","Lexington","KY","37.952113","-84.45347","-5","1"
+"40516","Lexington","KY","38.071981","-84.38559","-5","1"
+"40517","Lexington","KY","37.985128","-84.48874","-5","1"
+"40522","Lexington","KY","38.028269","-84.471505","-5","1"
+"40523","Lexington","KY","38.028269","-84.471505","-5","1"
+"40524","Lexington","KY","38.028269","-84.471505","-5","1"
+"40526","Lexington","KY","38.028269","-84.471505","-5","1"
+"40533","Lexington","KY","38.028269","-84.471505","-5","1"
+"40536","Lexington","KY","38.032075","-84.508361","-5","1"
+"40544","Lexington","KY","38.028269","-84.471505","-5","1"
+"40546","Lexington","KY","38.028269","-84.471505","-5","1"
+"40550","Lexington","KY","38.028269","-84.471505","-5","1"
+"40555","Lexington","KY","38.028269","-84.471505","-5","1"
+"40574","Lexington","KY","38.028269","-84.471505","-5","1"
+"40575","Lexington","KY","38.028269","-84.471505","-5","1"
+"40576","Lexington","KY","38.028269","-84.471505","-5","1"
+"40577","Lexington","KY","38.028269","-84.471505","-5","1"
+"40578","Lexington","KY","38.028269","-84.471505","-5","1"
+"40579","Lexington","KY","38.028269","-84.471505","-5","1"
+"40580","Lexington","KY","38.028269","-84.471505","-5","1"
+"40581","Lexington","KY","38.028269","-84.471505","-5","1"
+"40582","Lexington","KY","38.028269","-84.471505","-5","1"
+"40583","Lexington","KY","38.028269","-84.471505","-5","1"
+"40584","Lexington","KY","38.028269","-84.471505","-5","1"
+"40585","Lexington","KY","38.028269","-84.471505","-5","1"
+"40586","Lexington","KY","38.028269","-84.471505","-5","1"
+"40587","Lexington","KY","38.028269","-84.471505","-5","1"
+"40588","Lexington","KY","38.028269","-84.471505","-5","1"
+"40589","Lexington","KY","38.028269","-84.471505","-5","1"
+"40590","Lexington","KY","38.028269","-84.471505","-5","1"
+"40591","Lexington","KY","38.028269","-84.471505","-5","1"
+"40592","Lexington","KY","38.028269","-84.471505","-5","1"
+"40593","Lexington","KY","38.028269","-84.471505","-5","1"
+"40594","Lexington","KY","38.028269","-84.471505","-5","1"
+"40595","Lexington","KY","38.028269","-84.471505","-5","1"
+"40596","Lexington","KY","38.028269","-84.471505","-5","1"
+"40601","Frankfort","KY","38.201649","-84.86935","-5","1"
+"40602","Frankfort","KY","38.234133","-84.874809","-5","1"
+"40603","Frankfort","KY","38.234133","-84.874809","-5","1"
+"40604","Frankfort","KY","38.234133","-84.874809","-5","1"
+"40618","Frankfort","KY","38.234133","-84.874809","-5","1"
+"40619","Frankfort","KY","38.234133","-84.874809","-5","1"
+"40620","Frankfort","KY","38.234133","-84.874809","-5","1"
+"40621","Frankfort","KY","38.234133","-84.874809","-5","1"
+"40622","Frankfort","KY","38.234133","-84.874809","-5","1"
+"40695","Middlesborough","KY","36.608426","-83.731809","-5","1"
+"40701","Corbin","KY","36.942035","-84.10685","-5","1"
+"40702","Corbin","KY","36.937426","-84.1031","-5","1"
+"40724","Bush","KY","37.152074","-84.140847","-5","1"
+"40729","East Bernstadt","KY","37.231717","-84.13026","-5","1"
+"40730","Emlyn","KY","36.705162","-84.14595","-5","1"
+"40734","Gray","KY","36.930995","-83.98146","-5","1"
+"40737","Keavy","KY","36.990797","-84.14124","-5","1"
+"40740","Lily","KY","37.015283","-84.05872","-5","1"
+"40741","London","KY","37.143828","-84.07839","-5","1"
+"40742","London","KY","37.137615","-84.115617","-5","1"
+"40743","London","KY","37.134455","-84.045746","-5","1"
+"40744","London","KY","37.060576","-84.071","-5","1"
+"40745","London","KY","37.137615","-84.115617","-5","1"
+"40746","London","KY","37.137615","-84.115617","-5","1"
+"40747","London","KY","37.137615","-84.115617","-5","1"
+"40748","London","KY","37.137615","-84.115617","-5","1"
+"40751","Marydell","KY","37.137615","-84.115617","-5","1"
+"40754","Nevisdale","KY","36.780333","-84.11678","-5","1"
+"40755","Pittsburg","KY","37.167752","-84.116614","-5","1"
+"40759","Rockholds","KY","36.817151","-84.05917","-5","1"
+"40763","Siler","KY","36.681189","-83.95156","-5","1"
+"40769","Williamsburg","KY","36.709853","-84.1508","-5","1"
+"40771","Woodbine","KY","36.888978","-84.05237","-5","1"
+"40801","Ages Brookside","KY","36.858906","-83.2528","-5","1"
+"40803","Asher","KY","37.046365","-83.42003","-5","1"
+"40806","Baxter","KY","36.872801","-83.30778","-5","1"
+"40807","Benham","KY","36.963608","-82.95015","-5","1"
+"40808","Big Laurel","KY","36.981495","-83.25264","-5","1"
+"40810","Bledsoe","KY","36.91707","-83.32399","-5","1"
+"40813","Calvin","KY","36.737835","-83.60248","-5","1"
+"40815","Cawood","KY","36.781517","-83.22904","-5","1"
+"40816","Chappell","KY","36.987495","-83.32795","-5","1"
+"40818","Coalgood","KY","36.807137","-83.26552","-5","1"
+"40819","Coldiron","KY","36.827233","-83.4645","-5","1"
+"40820","Cranks","KY","36.766134","-83.16117","-5","1"
+"40823","Cumberland","KY","36.972292","-82.99572","-5","1"
+"40824","Dayhoit","KY","36.840955","-83.37539","-5","1"
+"40826","Eolia","KY","37.048238","-82.81775","-5","1"
+"40827","Essie","KY","37.043142","-83.48892","-5","1"
+"40828","Evarts","KY","36.86772","-83.17747","-5","1"
+"40829","Grays Knob","KY","36.797447","-83.264497","-5","1"
+"40830","Gulston","KY","36.772301","-83.33415","-5","1"
+"40831","Harlan","KY","36.828285","-83.31856","-5","1"
+"40840","Helton","KY","36.949181","-83.43129","-5","1"
+"40843","Holmes Mill","KY","36.868363","-82.96607","-5","1"
+"40844","Hoskinston","KY","37.058837","-83.38533","-5","1"
+"40845","Hulen","KY","36.786271","-83.52009","-5","1"
+"40847","Kenvir","KY","36.852687","-83.15917","-5","1"
+"40849","Lejunior","KY","36.885169","-83.12461","-5","1"
+"40854","Loyall","KY","36.85107","-83.35315","-5","1"
+"40855","Lynch","KY","36.96222","-82.90522","-5","1"
+"40856","Miracle","KY","36.726258","-83.54969","-5","1"
+"40858","Mozelle","KY","37.018413","-83.39768","-5","1"
+"40862","Partridge","KY","37.004426","-82.89858","-5","1"
+"40863","Pathfork","KY","36.753043","-83.44991","-5","1"
+"40865","Putney","KY","36.901802","-83.24129","-5","1"
+"40867","Smith","KY","36.712383","-83.33711","-5","1"
+"40868","Stinnett","KY","37.11181","-83.39265","-5","1"
+"40870","Totz","KY","36.930024","-83.15467","-5","1"
+"40873","Wallins Creek","KY","36.823334","-83.41058","-5","1"
+"40874","Warbranch","KY","36.982545","-83.48003","-5","1"
+"40902","Arjay","KY","36.836208","-83.63388","-5","1"
+"40903","Artemus","KY","36.825088","-83.8385","-5","1"
+"40906","Barbourville","KY","36.853913","-83.88501","-5","1"
+"40913","Beverly","KY","36.942094","-83.53262","-5","1"
+"40914","Big Creek","KY","37.112359","-83.56789","-5","1"
+"40915","Bimble","KY","36.887081","-83.81552","-5","1"
+"40921","Bryants Store","KY","36.72179","-83.90657","-5","1"
+"40923","Cannon","KY","36.920165","-83.85699","-5","1"
+"40927","Closplint","KY","36.889259","-83.05265","-5","1"
+"40930","Dewitt","KY","36.855044","-83.739","-5","1"
+"40931","Eriline","KY","37.147687","-83.737014","-5","1"
+"40932","Fall Rock","KY","37.147687","-83.737014","-5","1"
+"40935","Flat Lick","KY","36.867971","-83.74576","-5","1"
+"40939","Fourmile","KY","36.871254","-83.829985","-5","1"
+"40940","Frakes","KY","36.607234","-83.92535","-5","1"
+"40941","Garrard","KY","37.176075","-83.66608","-5","1"
+"40943","Girdler","KY","36.947113","-83.8506","-5","1"
+"40944","Goose Rock","KY","37.147687","-83.737014","-5","1"
+"40946","Green Road","KY","36.966634","-83.83413","-5","1"
+"40949","Heidrick","KY","36.897618","-83.87252","-5","1"
+"40951","Hima","KY","37.147687","-83.737014","-5","1"
+"40953","Hinkle","KY","36.943114","-83.81984","-5","1"
+"40955","Ingram","KY","36.769184","-83.708181","-5","1"
+"40958","Kettle Island","KY","36.793291","-83.58725","-5","1"
+"40962","Manchester","KY","37.164346","-83.76674","-5","1"
+"40964","Mary Alice","KY","36.842977","-83.183446","-5","1"
+"40965","Middlesboro","KY","36.617181","-83.72186","-5","1"
+"40972","Oneida","KY","37.25398","-83.61901","-5","1"
+"40977","Pineville","KY","36.750028","-83.72023","-5","1"
+"40979","Roark","KY","37.016332","-83.51075","-5","1"
+"40981","Saul","KY","37.331259","-83.386991","-5","1"
+"40982","Scalf","KY","36.933443","-83.70088","-5","1"
+"40983","Sextons Creek","KY","37.32832","-83.7488","-5","1"
+"40988","Stoney Fork","KY","36.842522","-83.51851","-5","1"
+"40995","Trosper","KY","36.78737","-83.81508","-5","1"
+"40997","Walker","KY","36.888893","-83.66257","-5","1"
+"40999","Woollum","KY","37.005242","-83.80508","-5","1"
+"41000","Fort Mitchell","KY","39.0358","-84.546445","-5","1"
+"41001","Alexandria","KY","38.946893","-84.38652","-5","1"
+"41002","Augusta","KY","38.76189","-83.99683","-5","1"
+"41003","Berry","KY","38.535065","-84.38904","-5","1"
+"41004","Brooksville","KY","38.677837","-84.09411","-5","1"
+"41005","Burlington","KY","39.020466","-84.74158","-5","1"
+"41006","Butler","KY","38.796981","-84.33792","-5","1"
+"41007","California","KY","38.910255","-84.28194","-5","1"
+"41008","Carrollton","KY","38.663328","-85.16803","-5","1"
+"41010","Corinth","KY","38.484843","-84.61017","-5","1"
+"41011","Covington","KY","39.0752","-84.52064","-5","1"
+"41012","Covington","KY","38.944663","-84.520501","-5","1"
+"41014","Covington","KY","39.067811","-84.5039","-5","1"
+"41015","Latonia","KY","39.013062","-84.49419","-5","1"
+"41016","Covington","KY","39.087593","-84.55057","-5","1"
+"41017","Ft Mitchell","KY","39.036361","-84.56801","-5","1"
+"41018","Erlanger","KY","39.013755","-84.60229","-5","1"
+"41019","Covington","KY","38.944663","-84.520501","-5","1"
+"41022","Florence","KY","38.962372","-84.747789","-5","1"
+"41030","Crittenden","KY","38.788439","-84.602","-5","1"
+"41031","Cynthiana","KY","38.397678","-84.2939","-5","1"
+"41033","De Mossville","KY","38.773111","-84.44889","-5","1"
+"41034","Dover","KY","38.730747","-83.88762","-5","1"
+"41035","Dry Ridge","KY","38.691006","-84.6418","-5","1"
+"41037","Elizaville","KY","38.3481","-83.718626","-5","1"
+"41039","Ewing","KY","38.424954","-83.86286","-5","1"
+"41040","Falmouth","KY","38.656527","-84.32811","-5","1"
+"41041","Flemingsburg","KY","38.418131","-83.72497","-5","1"
+"41042","Florence","KY","38.983853","-84.64401","-5","1"
+"41043","Foster","KY","38.765448","-84.16998","-5","1"
+"41044","Germantown","KY","38.63785","-83.96651","-5","1"
+"41045","Ghent","KY","38.724439","-85.05007","-5","1"
+"41046","Glencoe","KY","38.742296","-84.81223","-5","1"
+"41048","Hebron","KY","39.0805","-84.68754","-5","1"
+"41049","Hillsboro","KY","38.286314","-83.6512","-5","1"
+"41051","Independence","KY","38.941953","-84.54902","-5","1"
+"41052","Jonesville","KY","38.6622","-84.77495","-5","1"
+"41053","Kenton","KY","38.944663","-84.520501","-5","1"
+"41054","Mason","KY","38.593226","-84.578552","-5","1"
+"41055","Mayslick","KY","38.52217","-83.85894","-5","1"
+"41056","Maysville","KY","38.624534","-83.76561","-5","1"
+"41059","Melbourne","KY","39.022732","-84.36575","-5","1"
+"41061","Milford","KY","38.688556","-84.070074","-5","1"
+"41062","Minerva","KY","38.719573","-83.910276","-5","1"
+"41063","Morning View","KY","38.842166","-84.48802","-5","1"
+"41064","Mount Olivet","KY","38.508638","-84.05145","-5","1"
+"41065","Muses Mills","KY","38.3481","-83.718626","-5","1"
+"41071","Newport","KY","39.08347","-84.48681","-5","1"
+"41072","Newport","KY","38.963761","-84.368926","-5","1"
+"41073","Bellevue","KY","39.103011","-84.47987","-5","1"
+"41074","Dayton","KY","39.10941","-84.46986","-5","1"
+"41075","Fort Thomas","KY","39.076011","-84.45127","-5","1"
+"41076","Newport","KY","39.019185","-84.44204","-5","1"
+"41080","Petersburg","KY","39.062761","-84.85236","-5","1"
+"41081","Plummers Landing","KY","38.3481","-83.718626","-5","1"
+"41083","Sanders","KY","38.666588","-84.96756","-5","1"
+"41085","Silver Grove","KY","39.034293","-84.39156","-5","1"
+"41086","Sparta","KY","38.709838","-84.88807","-5","1"
+"41091","Union","KY","38.930285","-84.71603","-5","1"
+"41092","Verona","KY","38.815335","-84.68485","-5","1"
+"41093","Wallingford","KY","38.37106","-83.57103","-5","1"
+"41094","Walton","KY","38.87872","-84.62558","-5","1"
+"41095","Warsaw","KY","38.775686","-84.89756","-5","1"
+"41096","Washington","KY","38.61225","-83.808021","-5","1"
+"41097","Williamstown","KY","38.628866","-84.5679","-5","1"
+"41098","Worthville","KY","38.60395","-85.03388","-5","1"
+"41099","Newport","KY","38.963761","-84.368926","-5","1"
+"41101","Ashland","KY","38.473961","-82.64532","-5","1"
+"41102","Ashland","KY","38.439526","-82.6932","-5","1"
+"41105","Ashland","KY","38.370285","-82.694757","-5","1"
+"41114","Ashland","KY","38.370285","-82.694757","-5","1"
+"41121","Argillite","KY","38.456608","-82.82615","-5","1"
+"41124","Blaine","KY","38.028476","-82.84781","-5","1"
+"41127","Camp Dix","KY","38.602881","-83.361625","-5","1"
+"41128","Carter","KY","38.433912","-83.133597","-5","1"
+"41129","Catlettsburg","KY","38.360669","-82.61836","-5","1"
+"41132","Denton","KY","38.251159","-82.83496","-5","1"
+"41135","Emerson","KY","38.365096","-83.27206","-5","1"
+"41137","Firebrick","KY","38.688142","-83.04838","-5","1"
+"41139","Flatwoods","KY","38.52032","-82.72175","-5","1"
+"41141","Garrison","KY","38.570194","-83.14301","-5","1"
+"41142","Grahn","KY","38.282767","-83.0727","-5","1"
+"41143","Grayson","KY","38.323106","-82.94997","-5","1"
+"41144","Greenup","KY","38.552472","-82.86514","-5","1"
+"41146","Hitchins","KY","38.272476","-82.90494","-5","1"
+"41149","Isonville","KY","38.061324","-83.05005","-5","1"
+"41150","Jacobs","KY","38.225087","-83.242129","-5","1"
+"41156","Lloyd","KY","38.565211","-82.916586","-5","1"
+"41159","Martha","KY","38.019104","-82.9507","-5","1"
+"41160","Mazie","KY","38.074113","-82.744663","-5","1"
+"41163","Grayson","KY","38.338445","-82.939541","-5","1"
+"41164","Olive Hill","KY","38.292177","-83.18381","-5","1"
+"41166","Quincy","KY","38.630683","-83.11739","-5","1"
+"41168","Rush","KY","38.298546","-82.77714","-5","1"
+"41169","Russell","KY","38.538456","-82.70856","-5","1"
+"41170","Saint Paul","KY","38.68177","-83.0695","-5","1"
+"41171","Sandy Hook","KY","38.089097","-83.09554","-5","1"
+"41173","Soldier","KY","38.262029","-83.28472","-5","1"
+"41174","South Portsmouth","KY","38.71293","-83.02353","-5","1"
+"41175","South Shore","KY","38.676695","-82.9686","-5","1"
+"41179","Vanceburg","KY","38.530915","-83.38506","-5","1"
+"41180","Webbville","KY","38.132937","-82.85098","-5","1"
+"41181","Willard","KY","38.204459","-82.907615","-5","1"
+"41183","Worthington","KY","38.54912","-82.73508","-5","1"
+"41189","Tollesboro","KY","38.546281","-83.55909","-5","1"
+"41201","Adams","KY","38.076051","-82.73975","-5","1"
+"41203","Beauty","KY","37.846064","-82.44835","-5","1"
+"41204","Boons Camp","KY","37.81711","-82.68897","-5","1"
+"41214","Debord","KY","37.775385","-82.57034","-5","1"
+"41215","Denver","KY","37.771963","-82.865092","-5","1"
+"41216","East Point","KY","37.756007","-82.81931","-5","1"
+"41219","Flatgap","KY","37.933492","-82.90279","-5","1"
+"41222","Hagerhill","KY","37.780917","-82.82744","-5","1"
+"41224","Inez","KY","37.866327","-82.52903","-5","1"
+"41226","Keaton","KY","37.992794","-82.94551","-5","1"
+"41228","Leander","KY","37.752473","-82.87484","-5","1"
+"41230","Louisa","KY","38.071237","-82.64062","-5","1"
+"41231","Lovely","KY","37.810757","-82.39411","-5","1"
+"41232","Lowmansville","KY","37.916701","-82.73746","-5","1"
+"41234","Meally","KY","37.795418","-82.7337","-5","1"
+"41238","Oil Springs","KY","37.841448","-82.94106","-5","1"
+"41240","Paintsville","KY","37.823275","-82.78167","-5","1"
+"41250","Pilgrim","KY","37.758445","-82.48919","-5","1"
+"41254","River","KY","37.887278","-82.73688","-5","1"
+"41255","Sitka","KY","37.916221","-82.83962","-5","1"
+"41256","Staffordsville","KY","37.832617","-82.86299","-5","1"
+"41257","Stambaugh","KY","37.940709","-82.81233","-5","1"
+"41260","Thelma","KY","37.831324","-82.76039","-5","1"
+"41262","Tomahawk","KY","37.855873","-82.62091","-5","1"
+"41263","Tutor Key","KY","37.8583","-82.7598","-5","1"
+"41264","Ulysses","KY","37.935529","-82.68331","-5","1"
+"41265","Van Lear","KY","37.761356","-82.72165","-5","1"
+"41267","Warfield","KY","37.855146","-82.41666","-5","1"
+"41268","West Van Lear","KY","37.789291","-82.78437","-5","1"
+"41271","Williamsport","KY","37.831277","-82.726407","-5","1"
+"41274","Wittensville","KY","37.86388","-82.80914","-5","1"
+"41301","Campton","KY","37.716311","-83.51835","-5","1"
+"41307","Athol","KY","37.515013","-83.26432","-5","1"
+"41310","Bays","KY","37.640938","-83.24466","-5","1"
+"41311","Beattyville","KY","37.578547","-83.70348","-5","1"
+"41313","Bethany","KY","37.740503","-83.475446","-5","1"
+"41314","Booneville","KY","37.430777","-83.66771","-5","1"
+"41317","Clayhole","KY","37.461944","-83.18256","-5","1"
+"41332","Hazel Green","KY","37.797688","-83.36866","-5","1"
+"41333","Heidelberg","KY","37.556255","-83.776253","-5","1"
+"41338","Island City","KY","37.398617","-83.704908","-5","1"
+"41339","Jackson","KY","37.533559","-83.34547","-5","1"
+"41342","Lee City","KY","37.740503","-83.475446","-5","1"
+"41344","Lerose","KY","37.502641","-83.62117","-5","1"
+"41347","Lone","KY","37.54418","-83.600784","-5","1"
+"41348","Lost Creek","KY","37.426337","-83.29911","-5","1"
+"41351","Mistletoe","KY","37.398617","-83.704908","-5","1"
+"41352","Mize","KY","37.914002","-83.233761","-5","1"
+"41360","Pine Ridge","KY","37.791388","-83.64971","-5","1"
+"41362","Primrose","KY","37.60332","-83.713974","-5","1"
+"41364","Ricetown","KY","37.382832","-83.62327","-5","1"
+"41365","Rogers","KY","37.711278","-83.63647","-5","1"
+"41366","Rousseau","KY","37.593059","-83.287774","-5","1"
+"41367","Rowdy","KY","37.383285","-83.2404","-5","1"
+"41368","Saint Helens","KY","37.611684","-83.64341","-5","1"
+"41377","Talbert","KY","37.416002","-83.44991","-5","1"
+"41385","Vancleve","KY","37.635723","-83.35077","-5","1"
+"41386","Vincent","KY","37.473347","-83.81722","-5","1"
+"41390","Whick","KY","37.424083","-83.37595","-5","1"
+"41397","Zoe","KY","37.643659","-83.67763","-5","1"
+"41408","Cannel City","KY","37.792272","-83.28137","-5","1"
+"41410","Cisco","KY","37.690636","-83.074592","-5","1"
+"41413","Crockett","KY","37.970507","-83.125202","-5","1"
+"41419","Edna","KY","37.690636","-83.074592","-5","1"
+"41421","Elkfork","KY","37.997666","-83.16103","-5","1"
+"41422","Elsie","KY","37.690636","-83.074592","-5","1"
+"41425","Ezel","KY","37.891486","-83.44413","-5","1"
+"41426","Falcon","KY","37.784924","-82.99783","-5","1"
+"41433","Gapville","KY","37.690636","-83.074592","-5","1"
+"41444","Ivyton","KY","37.690636","-83.074592","-5","1"
+"41451","Malone","KY","37.914002","-83.233761","-5","1"
+"41459","Ophir","KY","37.914002","-83.233761","-5","1"
+"41463","Salyersville","KY","37.745824","-83.073603","-5","1"
+"41464","Royalton","KY","37.65026","-82.94544","-5","1"
+"41465","Salyersville","KY","37.736751","-83.08652","-5","1"
+"41472","West Liberty","KY","37.932283","-83.23821","-5","1"
+"41477","Wrigley","KY","37.914002","-83.233761","-5","1"
+"41501","Pikeville","KY","37.478169","-82.5189","-5","1"
+"41502","Pikeville","KY","37.481637","-82.550507","-5","1"
+"41503","South Williamson","KY","37.67059","-82.28465","-5","1"
+"41512","Ashcamp","KY","37.254188","-82.47961","-5","1"
+"41513","Belcher","KY","37.357536","-82.3631","-5","1"
+"41514","Belfry","KY","37.672296","-82.30442","-5","1"
+"41517","Burdine","KY","37.184477","-82.61109","-5","1"
+"41519","Canada","KY","37.60512","-82.31477","-5","1"
+"41520","Dorton","KY","37.279027","-82.57732","-5","1"
+"41522","Elkhorn City","KY","37.300397","-82.39516","-5","1"
+"41524","Fedscreek","KY","37.424071","-82.23762","-5","1"
+"41526","Fords Branch","KY","37.437194","-82.518527","-5","1"
+"41527","Forest Hills","KY","37.641773","-82.27793","-5","1"
+"41528","Freeburn","KY","37.561944","-82.13471","-5","1"
+"41531","Hardy","KY","37.599893","-82.23349","-5","1"
+"41534","Hellier","KY","37.2701","-82.48553","-5","1"
+"41535","Huddy","KY","37.598267","-82.27611","-5","1"
+"41537","Jenkins","KY","37.192483","-82.6235","-5","1"
+"41538","Jonancy","KY","37.314335","-82.59506","-5","1"
+"41539","Kimper","KY","37.504315","-82.32797","-5","1"
+"41540","Lick Creek","KY","37.396574","-82.33349","-5","1"
+"41542","Lookout","KY","37.314848","-82.464979","-5","1"
+"41543","McAndrews","KY","37.553553","-82.28283","-5","1"
+"41544","McCarr","KY","37.59865","-82.16836","-5","1"
+"41546","McVeigh","KY","37.550374","-82.25703","-5","1"
+"41547","Majestic","KY","37.544224","-82.06488","-5","1"
+"41548","Mouthcard","KY","37.369612","-82.23523","-5","1"
+"41549","Myra","KY","37.293386","-82.60019","-5","1"
+"41553","Phelps","KY","37.506174","-82.15907","-5","1"
+"41554","Phyllis","KY","37.445906","-82.32708","-5","1"
+"41555","Pinsonfork","KY","37.52976","-82.26665","-5","1"
+"41557","Raccoon","KY","37.514166","-82.43625","-5","1"
+"41558","Ransom","KY","37.533643","-82.21145","-5","1"
+"41559","Regina","KY","37.364548","-82.40573","-5","1"
+"41560","Robinson Creek","KY","37.389786","-82.55812","-5","1"
+"41561","Rockhouse","KY","37.33162","-82.462574","-5","1"
+"41562","Shelbiana","KY","37.416995","-82.4571","-5","1"
+"41563","Shelby Gap","KY","37.216465","-82.54639","-5","1"
+"41564","Sidney","KY","37.610331","-82.36125","-5","1"
+"41566","Steele","KY","37.417254","-82.18823","-5","1"
+"41567","Stone","KY","37.560929","-82.28796","-5","1"
+"41568","Stopover","KY","37.49947","-82.05643","-5","1"
+"41569","Toler","KY","37.633524","-82.25408","-5","1"
+"41571","Varney","KY","37.625031","-82.38704","-5","1"
+"41572","Virgie","KY","37.322411","-82.61598","-5","1"
+"41601","Allen","KY","37.611434","-82.72503","-5","1"
+"41602","Auxier","KY","37.73696","-82.74012","-5","1"
+"41603","Banner","KY","37.601078","-82.69496","-5","1"
+"41604","Beaver","KY","37.370358","-82.66944","-5","1"
+"41605","Betsy Layne","KY","37.554631","-82.63174","-5","1"
+"41606","Bevinsville","KY","37.362943","-82.73277","-5","1"
+"41607","Blue River","KY","37.617197","-82.85634","-5","1"
+"41612","Bypro","KY","37.358509","-82.7207","-5","1"
+"41615","Dana","KY","37.550496","-82.6933","-5","1"
+"41616","David","KY","37.587133","-82.87272","-5","1"
+"41619","Drift","KY","37.496608","-82.75942","-5","1"
+"41621","Dwale","KY","37.623492","-82.72417","-5","1"
+"41622","Eastern","KY","37.514748","-82.81097","-5","1"
+"41630","Garrett","KY","37.470216","-82.8409","-5","1"
+"41631","Grethel","KY","37.479754","-82.64922","-5","1"
+"41632","Gunlock","KY","37.555846","-82.94995","-5","1"
+"41635","Harold","KY","37.509291","-82.63494","-5","1"
+"41636","Hi Hat","KY","37.398774","-82.73257","-5","1"
+"41640","Hueysville","KY","37.493888","-82.94192","-5","1"
+"41642","Ivel","KY","37.587011","-82.66028","-5","1"
+"41643","Lackey","KY","37.470999","-82.829405","-5","1"
+"41645","Langley","KY","37.544465","-82.80178","-5","1"
+"41647","McDowell","KY","37.449076","-82.7264","-5","1"
+"41649","Martin","KY","37.568873","-82.75937","-5","1"
+"41650","Melvin","KY","37.351125","-82.69298","-5","1"
+"41651","Minnie","KY","37.465744","-82.75492","-5","1"
+"41653","Prestonsburg","KY","37.667872","-82.75876","-5","1"
+"41655","Printer","KY","37.511126","-82.72053","-5","1"
+"41659","Stanville","KY","37.569845","-82.62562","-5","1"
+"41660","Teaberry","KY","37.428801","-82.64374","-5","1"
+"41663","Tram","KY","37.568942","-82.64774","-5","1"
+"41666","Wayland","KY","37.446983","-82.80852","-5","1"
+"41667","Weeksbury","KY","37.322234","-82.69699","-5","1"
+"41668","West Prestonsburg","KY","37.670986","-82.760975","-5","1"
+"41669","Wheelwright","KY","37.331465","-82.71906","-5","1"
+"41701","Hazard","KY","37.274854","-83.19061","-5","1"
+"41702","Hazard","KY","37.320076","-83.206495","-5","1"
+"41705","Fort Thomas","KY","39.08359","-84.450912","-5","1"
+"41712","Ary","KY","37.373384","-83.15186","-5","1"
+"41713","Avawam","KY","37.22539","-83.273609","-5","1"
+"41714","Bear Branch","KY","37.163342","-83.51527","-5","1"
+"41719","Bonnyman","KY","37.295365","-83.25414","-5","1"
+"41721","Buckhorn","KY","37.325318","-83.49048","-5","1"
+"41722","Bulan","KY","37.369312","-83.1156","-5","1"
+"41723","Busy","KY","37.257714","-83.31253","-5","1"
+"41725","Carrie","KY","37.33195","-83.02976","-5","1"
+"41727","Chavies","KY","37.350689","-83.34049","-5","1"
+"41729","Combs","KY","37.266633","-83.21226","-5","1"
+"41730","Confluence","KY","37.263348","-83.39943","-5","1"
+"41731","Cornettsville","KY","37.115385","-83.08501","-5","1"
+"41735","Delphia","KY","37.029744","-83.08919","-5","1"
+"41736","Dice","KY","37.370521","-83.23714","-5","1"
+"41739","Dwarf","KY","37.348289","-83.11137","-5","1"
+"41740","Emmalena","KY","37.348377","-83.04938","-5","1"
+"41743","Fisty","KY","37.30636","-83.090441","-5","1"
+"41745","Gays Creek","KY","37.328336","-83.4399","-5","1"
+"41746","Happy","KY","37.204045","-83.09845","-5","1"
+"41747","Hardburly","KY","37.300202","-83.122477","-5","1"
+"41749","Hyden","KY","37.17621","-83.38301","-5","1"
+"41751","Jeff","KY","37.207333","-83.13361","-5","1"
+"41754","Krypton","KY","37.31629","-83.33267","-5","1"
+"41759","Sassafras","KY","37.229381","-83.03409","-5","1"
+"41760","Scuddy","KY","37.205562","-83.08055","-5","1"
+"41762","Sizerock","KY","37.223635","-83.50599","-5","1"
+"41763","Slemp","KY","37.04877","-83.13904","-5","1"
+"41764","Smilax","KY","37.113248","-83.24326","-5","1"
+"41766","Thousandsticks","KY","37.187088","-83.44978","-5","1"
+"41772","Vest","KY","37.393894","-83.02313","-5","1"
+"41773","Vicco","KY","37.221636","-83.05627","-5","1"
+"41774","Viper","KY","37.158397","-83.13673","-5","1"
+"41775","Wendover","KY","37.10014","-83.34647","-5","1"
+"41776","Wooton","KY","37.167173","-83.2852","-5","1"
+"41777","Yeaddiss","KY","37.065439","-83.22479","-5","1"
+"41778","Yerkes","KY","37.279297","-83.3187","-5","1"
+"41804","Blackey","KY","37.141017","-82.99081","-5","1"
+"41810","Cromona","KY","37.185228","-82.69447","-5","1"
+"41812","Deane","KY","37.241284","-82.75013","-5","1"
+"41815","Ermine","KY","37.150537","-82.79468","-5","1"
+"41817","Garner","KY","37.36778","-82.91535","-5","1"
+"41819","Gordon","KY","36.98586","-83.06497","-5","1"
+"41821","Hallie","KY","37.088069","-82.99728","-5","1"
+"41822","Hindman","KY","37.333551","-82.97212","-5","1"
+"41824","Isom","KY","37.194426","-82.88714","-5","1"
+"41825","Jackhorn","KY","37.215305","-82.70468","-5","1"
+"41826","Jeremiah","KY","37.164562","-82.93047","-5","1"
+"41828","Kite","KY","37.303276","-82.77851","-5","1"
+"41831","Leburn","KY","37.387358","-82.95633","-5","1"
+"41832","Letcher","KY","37.148006","-82.95634","-5","1"
+"41833","Linefork","KY","37.021403","-82.98159","-5","1"
+"41834","Littcarr","KY","37.270358","-82.9403","-5","1"
+"41835","McRoberts","KY","37.205961","-82.67347","-5","1"
+"41836","Mallie","KY","37.245041","-82.8955","-5","1"
+"41837","Mayking","KY","37.135518","-82.74606","-5","1"
+"41838","Millstone","KY","37.168682","-82.75036","-5","1"
+"41839","Mousie","KY","37.420362","-82.87543","-5","1"
+"41840","Neon","KY","37.195448","-82.71232","-5","1"
+"41843","Pine Top","KY","37.273854","-82.86011","-5","1"
+"41844","Pippa Passes","KY","37.334629","-82.87549","-5","1"
+"41845","Premium","KY","37.123583","-82.93216","-5","1"
+"41847","Redfox","KY","37.21583","-82.95449","-5","1"
+"41848","Roxana","KY","37.110216","-82.94073","-5","1"
+"41849","Seco","KY","37.172969","-82.72934","-5","1"
+"41855","Thornton","KY","37.156856","-82.76167","-5","1"
+"41858","Whitesburg","KY","37.130559","-82.83185","-5","1"
+"41859","Dema","KY","37.392257","-82.78204","-5","1"
+"41861","Raven","KY","37.386051","-82.83138","-5","1"
+"41862","Topmost","KY","37.357624","-82.79564","-5","1"
+"42001","Paducah","KY","37.066543","-88.65687","-6","1"
+"42002","Paducah","KY","37.085511","-88.71247","-6","1"
+"42003","Paducah","KY","37.044233","-88.59046","-6","1"
+"42011","Fredonia","KY","37.220735","-88.061294","-6","1"
+"42020","Almo","KY","36.697107","-88.29836","-6","1"
+"42021","Arlington","KY","36.796741","-88.997","-6","1"
+"42022","Bandana","KY","37.149003","-88.94252","-6","1"
+"42023","Bardwell","KY","36.881954","-88.98347","-6","1"
+"42024","Barlow","KY","37.071352","-89.04326","-6","1"
+"42025","Benton","KY","36.854812","-88.33515","-6","1"
+"42027","Boaz","KY","36.92516","-88.63778","-6","1"
+"42028","Burna","KY","37.24122","-88.33829","-6","1"
+"42029","Calvert City","KY","37.013505","-88.37269","-6","1"
+"42031","Clinton","KY","36.678217","-88.97559","-6","1"
+"42032","Columbus","KY","36.755242","-89.10667","-6","1"
+"42033","Crayne","KY","37.336533","-88.079607","-6","1"
+"42035","Cunningham","KY","36.911107","-88.84412","-6","1"
+"42036","Dexter","KY","36.731901","-88.24594","-6","1"
+"42037","Dycusburg","KY","37.157866","-88.183598","-6","1"
+"42038","Eddyville","KY","37.051386","-88.03613","-6","1"
+"42039","Fancy Farm","KY","36.800353","-88.83224","-6","1"
+"42040","Farmington","KY","36.614839","-88.5005","-6","1"
+"42041","Fulton","KY","36.532059","-88.89132","-6","1"
+"42044","Gilbertsville","KY","36.97877","-88.28273","-6","1"
+"42045","Grand Rivers","KY","37.031683","-88.24498","-6","1"
+"42046","Hamlin","KY","36.6033","-88.092285","-6","1"
+"42047","Hampton","KY","37.2948","-88.41026","-6","1"
+"42048","Hardin","KY","36.765893","-88.26527","-6","1"
+"42049","Hazel","KY","36.511681","-88.32543","-6","1"
+"42050","Hickman","KY","36.558598","-89.19789","-6","1"
+"42051","Hickory","KY","36.852344","-88.63769","-6","1"
+"42053","Kevil","KY","37.107447","-88.86061","-6","1"
+"42054","Kirksey","KY","36.716315","-88.44499","-6","1"
+"42055","Kuttawa","KY","37.058356","-88.14097","-6","1"
+"42056","La Center","KY","37.08716","-88.97616","-6","1"
+"42058","Ledbetter","KY","37.054715","-88.48043","-6","1"
+"42060","Lovelaceville","KY","36.968906","-88.82817","-6","1"
+"42061","Lowes","KY","36.885527","-88.77469","-6","1"
+"42063","Lynnville","KY","36.723872","-88.652009","-6","1"
+"42064","Marion","KY","37.331602","-88.06997","-6","1"
+"42066","Mayfield","KY","36.733761","-88.63449","-6","1"
+"42069","Melber","KY","36.921462","-88.75871","-6","1"
+"42070","Milburn","KY","36.863147","-88.995991","-6","1"
+"42071","Murray","KY","36.617443","-88.28746","-6","1"
+"42076","New Concord","KY","36.540753","-88.06837","-6","1"
+"42078","Salem","KY","37.282124","-88.24568","-6","1"
+"42079","Sedalia","KY","36.574074","-88.56359","-6","1"
+"42081","Smithland","KY","37.217493","-88.40884","-6","1"
+"42082","Symsonia","KY","36.922652","-88.5104","-6","1"
+"42083","Tiline","KY","37.150978","-88.29191","-6","1"
+"42084","Tolu","KY","37.433695","-88.24498","-6","1"
+"42085","Water Valley","KY","36.578907","-88.82074","-6","1"
+"42086","West Paducah","KY","37.089948","-88.7597","-6","1"
+"42087","Wickliffe","KY","36.96575","-89.0324","-6","1"
+"42088","Wingo","KY","36.627427","-88.74845","-6","1"
+"42101","Bowling Green","KY","37.010643","-86.46145","-6","1"
+"42102","Bowling Green","KY","36.922292","-86.387046","-6","1"
+"42103","Bowling Green","KY","36.969761","-86.38247","-6","1"
+"42104","Bowling Green","KY","36.930527","-86.44751","-6","1"
+"42109","Bowling Green","KY","36.961988","-86.450786","-6","1"
+"42120","Adolphus","KY","36.661883","-86.25964","-6","1"
+"42122","Alvaton","KY","36.86316","-86.35202","-6","1"
+"42123","Austin","KY","36.820727","-86.00112","-6","1"
+"42124","Beaumont","KY","36.857666","-85.649583","-6","1"
+"42127","Cave City","KY","37.131203","-85.94633","-6","1"
+"42128","Drake","KY","36.983441","-86.394012","-6","1"
+"42129","Edmonton","KY","36.988613","-85.58534","-6","1"
+"42130","Eighty Eight","KY","36.91297","-85.775282","-6","1"
+"42131","Etoile","KY","36.82928","-85.90806","-6","1"
+"42133","Fountain Run","KY","36.721319","-85.96139","-6","1"
+"42134","Franklin","KY","36.718074","-86.58202","-6","1"
+"42135","Franklin","KY","36.758166","-86.581957","-6","1"
+"42140","Gamaliel","KY","36.655006","-85.80866","-6","1"
+"42141","Glasgow","KY","36.970776","-85.91232","-6","1"
+"42142","Glasgow","KY","36.946326","-85.957797","-6","1"
+"42150","Halfway","KY","36.782131","-86.184088","-6","1"
+"42151","Hestand","KY","36.63667","-85.55275","-6","1"
+"42152","Hiseville","KY","37.098753","-85.816472","-6","1"
+"42153","Holland","KY","36.665767","-86.04006","-6","1"
+"42154","Knob Lick","KY","37.066581","-85.73482","-6","1"
+"42156","Lucas","KY","36.840503","-85.995572","-6","1"
+"42157","Mount Hermon","KY","36.778567","-85.81772","-6","1"
+"42159","Oakland","KY","37.016847","-86.25187","-6","1"
+"42160","Park City","KY","37.0896","-86.06474","-6","1"
+"42163","Rocky Hill","KY","37.09425","-86.143188","-6","1"
+"42164","Scottsville","KY","36.767969","-86.1813","-6","1"
+"42166","Summer Shade","KY","36.86322","-85.71774","-6","1"
+"42167","Tompkinsville","KY","36.712179","-85.67567","-6","1"
+"42170","Woodburn","KY","36.832502","-86.554","-6","1"
+"42171","Smiths Grove","KY","37.046968","-86.17181","-6","1"
+"42201","Aberdeen","KY","37.279564","-86.670181","-6","1"
+"42202","Adairville","KY","36.681441","-86.85365","-6","1"
+"42203","Allegre","KY","36.929243","-87.219328","-6","1"
+"42204","Allensville","KY","36.70996","-87.07105","-6","1"
+"42206","Auburn","KY","36.881837","-86.71983","-6","1"
+"42207","Bee Spring","KY","37.293315","-86.26557","-6","1"
+"42209","Brooklyn","KY","37.197491","-86.67216","-6","1"
+"42210","Brownsville","KY","37.215448","-86.29013","-6","1"
+"42211","Cadiz","KY","36.846471","-87.86409","-6","1"
+"42214","Center","KY","37.143908","-85.66945","-6","1"
+"42215","Cerulean","KY","36.983293","-87.68273","-6","1"
+"42216","Clifty","KY","37.004492","-87.152148","-6","1"
+"42217","Crofton","KY","37.04413","-87.48219","-6","1"
+"42219","Dunbar","KY","37.170909","-86.767822","-6","1"
+"42220","Elkton","KY","36.887716","-87.18526","-6","1"
+"42221","Fairview","KY","36.898071","-87.496529","-6","1"
+"42223","Fort Campbell","KY","36.654943","-87.46188","-6","1"
+"42232","Gracey","KY","36.847924","-87.6579","-6","1"
+"42234","Guthrie","KY","36.673268","-87.18089","-6","1"
+"42235","Hadley","KY","36.983441","-86.394012","-6","1"
+"42236","Herndon","KY","36.705024","-87.59935","-6","1"
+"42240","Hopkinsville","KY","36.866845","-87.47617","-6","1"
+"42241","Hopkinsville","KY","36.898071","-87.496529","-6","1"
+"42251","Huntsville","KY","37.157967","-86.885846","-6","1"
+"42252","Jetson","KY","37.248326","-86.509271","-6","1"
+"42253","Science Hill","KY","37.17925","-84.633915","-5","1"
+"42254","La Fayette","KY","36.657405","-87.65633","-6","1"
+"42256","Lewisburg","KY","37.020366","-86.94284","-6","1"
+"42257","Lindseyville","KY","37.237211","-86.299361","-6","1"
+"42259","Mammoth Cave","KY","37.274689","-86.19818","-6","1"
+"42261","Morgantown","KY","37.219254","-86.67988","-6","1"
+"42262","Oak Grove","KY","36.664334","-87.42789","-6","1"
+"42265","Olmstead","KY","36.752802","-87.02003","-6","1"
+"42266","Pembroke","KY","36.780906","-87.34305","-6","1"
+"42267","Provo","KY","37.229645","-86.804803","-6","1"
+"42270","Richardsville","KY","36.983441","-86.394012","-6","1"
+"42273","Rochester","KY","37.196636","-86.87625","-6","1"
+"42274","Rockfield","KY","36.931416","-86.62507","-6","1"
+"42275","Roundhill","KY","37.223167","-86.44062","-6","1"
+"42276","Russellville","KY","36.860612","-86.88171","-6","1"
+"42280","Sharon Grove","KY","36.953559","-87.09887","-6","1"
+"42283","South Union","KY","36.869206","-86.663225","-6","1"
+"42285","Sweeden","KY","37.273726","-86.27499","-6","1"
+"42286","Trenton","KY","36.727378","-87.26971","-6","1"
+"42287","Welchs Creek","KY","37.311676","-86.52913","-6","1"
+"42288","Woodbury","KY","37.197491","-86.67216","-6","1"
+"42301","Owensboro","KY","37.753347","-87.17419","-6","1"
+"42302","Owensboro","KY","37.745491","-87.112823","-6","1"
+"42303","Owensboro","KY","37.758568","-87.08714","-6","1"
+"42304","Owensboro","KY","37.745491","-87.112823","-6","1"
+"42320","Beaver Dam","KY","37.377266","-86.88364","-6","1"
+"42321","Beech Creek","KY","37.177839","-87.05761","-6","1"
+"42322","Beech Grove","KY","37.615062","-87.406866","-6","1"
+"42323","Beechmont","KY","37.172261","-87.03677","-6","1"
+"42324","Belton","KY","37.150125","-87.00657","-6","1"
+"42325","Bremen","KY","37.333802","-87.26807","-6","1"
+"42326","Browder","KY","37.198074","-87.01403","-6","1"
+"42327","Calhoun","KY","37.575772","-87.29499","-6","1"
+"42328","Centertown","KY","37.410099","-87.03433","-6","1"
+"42330","Central City","KY","37.299591","-87.12992","-6","1"
+"42332","Cleaton","KY","37.251296","-87.09071","-6","1"
+"42333","Cromwell","KY","37.349023","-86.76565","-6","1"
+"42334","Curdsville","KY","37.745491","-87.112823","-6","1"
+"42337","Drakesboro","KY","37.227223","-87.01349","-6","1"
+"42338","Dundee","KY","37.559872","-86.77254","-6","1"
+"42339","Dunmor","KY","37.094139","-86.9746","-6","1"
+"42343","Fordsville","KY","37.655016","-86.69303","-6","1"
+"42344","Graham","KY","37.240117","-87.29396","-6","1"
+"42345","Greenville","KY","37.166299","-87.18333","-6","1"
+"42347","Hartford","KY","37.471839","-86.9063","-6","1"
+"42348","Hawesville","KY","37.882498","-86.76297","-6","1"
+"42349","Horse Branch","KY","37.433703","-86.66952","-6","1"
+"42350","Island","KY","37.456942","-87.17107","-6","1"
+"42351","Lewisport","KY","37.918157","-86.89243","-6","1"
+"42352","Livermore","KY","37.502836","-87.11162","-6","1"
+"42354","McHenry","KY","37.3799","-86.9258","-6","1"
+"42355","Maceo","KY","37.86975","-86.99535","-6","1"
+"42356","Maple Mount","KY","37.693229","-87.323841","-6","1"
+"42361","Olaton","KY","37.517388","-86.6846","-6","1"
+"42364","Pellville","KY","37.827235","-86.804814","-6","1"
+"42365","Penrod","KY","37.114594","-87.00175","-6","1"
+"42366","Philpot","KY","37.729714","-86.92838","-6","1"
+"42367","Powderly","KY","37.242948","-87.154898","-6","1"
+"42368","Reynolds Station","KY","37.710929","-86.75487","-6","1"
+"42369","Rockport","KY","37.337926","-86.99685","-6","1"
+"42370","Rosine","KY","37.448681","-86.74121","-6","1"
+"42371","Rumsey","KY","37.508047","-87.29293","-6","1"
+"42372","Sacramento","KY","37.41277","-87.28063","-6","1"
+"42374","South Carrollton","KY","37.33976","-87.14514","-6","1"
+"42375","Stanley","KY","37.745491","-87.112823","-6","1"
+"42376","Utica","KY","37.598406","-87.09113","-6","1"
+"42377","West Louisville","KY","37.745491","-87.112823","-6","1"
+"42378","Whitesville","KY","37.666515","-86.86454","-6","1"
+"42400","Morganfield","KY","37.784577","-87.72406","-6","1"
+"42402","Baskett","KY","37.778911","-87.60124","-6","1"
+"42403","Blackford","KY","37.448198","-87.93391","-6","1"
+"42404","Clay","KY","37.481719","-87.8394","-6","1"
+"42406","Corydon","KY","37.743264","-87.73173","-6","1"
+"42408","Dawson Springs","KY","37.183465","-87.68413","-6","1"
+"42409","Dixon","KY","37.52165","-87.69701","-6","1"
+"42410","Earlington","KY","37.275896","-87.51498","-6","1"
+"42411","Fredonia","KY","37.216778","-88.01438","-6","1"
+"42413","Hanson","KY","37.425687","-87.495","-6","1"
+"42419","Henderson","KY","37.807173","-87.599052","-6","1"
+"42420","Henderson","KY","37.825094","-87.56055","-6","1"
+"42431","Madisonville","KY","37.330791","-87.50378","-6","1"
+"42436","Manitou","KY","37.458645","-87.54828","-6","1"
+"42437","Morganfield","KY","37.67416","-87.90199","-6","1"
+"42440","Mortons Gap","KY","37.238785","-87.46986","-6","1"
+"42441","Nebo","KY","37.36327","-87.65307","-6","1"
+"42442","Nortonville","KY","37.178627","-87.46702","-6","1"
+"42444","Poole","KY","37.641689","-87.63786","-6","1"
+"42445","Princeton","KY","37.12596","-87.87429","-6","1"
+"42450","Providence","KY","37.396445","-87.76428","-6","1"
+"42451","Reed","KY","37.859415","-87.37005","-6","1"
+"42452","Robards","KY","37.674669","-87.54291","-6","1"
+"42453","Saint Charles","KY","37.143686","-87.59662","-6","1"
+"42455","Sebree","KY","37.600857","-87.52635","-6","1"
+"42456","Slaughters","KY","37.514424","-87.49975","-6","1"
+"42457","Smith Mills","KY","37.801347","-87.76586","-6","1"
+"42458","Spottsville","KY","37.860142","-87.41866","-6","1"
+"42459","Sturgis","KY","37.558719","-87.99632","-6","1"
+"42460","Sullivan","KY","37.493997","-87.932773","-6","1"
+"42461","Uniontown","KY","37.771573","-87.91614","-6","1"
+"42462","Waverly","KY","37.729871","-87.81891","-6","1"
+"42463","Wheatcroft","KY","37.488169","-87.8631","-6","1"
+"42464","White Plains","KY","37.168568","-87.37879","-6","1"
+"42501","Somerset","KY","37.075624","-84.54437","-5","1"
+"42502","Somerset","KY","37.09325","-84.427729","-5","1"
+"42503","Somerset","KY","37.112274","-84.588","-5","1"
+"42516","Bethelridge","KY","37.191504","-84.79832","-5","1"
+"42518","Bronston","KY","36.94593","-84.63278","-5","1"
+"42519","Burnside","KY","36.965123","-84.55458","-5","1"
+"42528","Dunnville","KY","37.180186","-85.02396","-5","1"
+"42533","Ferguson","KY","37.067452","-84.60301","-5","1"
+"42539","Liberty","KY","37.305705","-84.94589","-5","1"
+"42541","Middleburg","KY","37.3677","-84.80732","-5","1"
+"42544","Nancy","KY","37.029286","-84.81365","-5","1"
+"42553","Science Hill","KY","37.177577","-84.65481","-5","1"
+"42558","Tateville","KY","36.94919","-84.581482","-5","1"
+"42564","West Somerset","KY","37.111433","-84.592898","-5","1"
+"42565","Windsor","KY","37.144759","-84.89524","-5","1"
+"42566","Yosemite","KY","37.303038","-84.77674","-5","1"
+"42567","Eubank","KY","37.250746","-84.61781","-5","1"
+"42602","Albany","KY","36.72024","-85.13539","-6","1"
+"42603","Alpha","KY","36.7703","-85.01043","-6","1"
+"42629","Jamestown","KY","36.946642","-85.09981","-6","1"
+"42631","Marshes Siding","KY","36.762748","-84.51036","-5","1"
+"42632","Mill Springs","KY","36.932769","-84.7757","-5","1"
+"42633","Monticello","KY","36.801922","-84.82841","-5","1"
+"42634","Parkers Lake","KY","36.881682","-84.42143","-5","1"
+"42635","Pine Knot","KY","36.663153","-84.41611","-5","1"
+"42637","Monticello","KY","36.843563","-84.841004","-5","1"
+"42638","Revelo","KY","36.673236","-84.47095","-5","1"
+"42642","Russell Springs","KY","37.05401","-85.06142","-6","1"
+"42647","Stearns","KY","36.710692","-84.55416","-5","1"
+"42649","Strunk","KY","36.631706","-84.42183","-5","1"
+"42653","Whitley City","KY","36.772507","-84.47785","-5","1"
+"42701","Elizabethtown","KY","37.704287","-85.86403","-5","1"
+"42702","Elizabethtown","KY","37.723474","-85.976854","-5","1"
+"42711","Bakerton","KY","36.898169","-85.31056","-6","1"
+"42712","Big Clifty","KY","37.581023","-86.15642","-5","1"
+"42713","Bonnieville","KY","37.381189","-85.88175","-6","1"
+"42715","Breeding","KY","36.954911","-85.39553","-6","1"
+"42716","Buffalo","KY","37.47534","-85.60987","-5","1"
+"42717","Burkesville","KY","36.765985","-85.39971","-6","1"
+"42718","Campbellsville","KY","37.372314","-85.3549","-5","1"
+"42719","Campbellsville","KY","37.337936","-85.330374","-5","1"
+"42720","Cane Valley","KY","37.121145","-85.370926","-6","1"
+"42721","Caneyville","KY","37.413211","-86.49884","-6","1"
+"42722","Canmer","KY","37.271372","-85.72639","-6","1"
+"42724","Cecilia","KY","37.668721","-86.02527","-5","1"
+"42726","Clarkson","KY","37.429456","-86.16448","-6","1"
+"42728","Columbia","KY","37.123196","-85.27561","-6","1"
+"42729","Cub Run","KY","37.304661","-86.12987","-6","1"
+"42731","Dubre","KY","36.8395","-85.55526","-6","1"
+"42732","Eastview","KY","37.606543","-86.10413","-5","1"
+"42733","Elk Horn","KY","37.353227","-85.1628","-5","1"
+"42735","Fairplay","KY","37.045089","-85.29683","-6","1"
+"42740","Glendale","KY","37.59641","-85.92294","-5","1"
+"42741","Glens Fork","KY","36.98182","-85.22988","-6","1"
+"42742","Gradyville","KY","37.098391","-85.50199","-6","1"
+"42743","Greensburg","KY","37.234802","-85.51436","-6","1"
+"42746","Hardyville","KY","37.199656","-85.73469","-6","1"
+"42748","Hodgenville","KY","37.566527","-85.71452","-5","1"
+"42749","Horse Cave","KY","37.176738","-85.88288","-6","1"
+"42753","Knifley","KY","37.242258","-85.20271","-6","1"
+"42754","Leitchfield","KY","37.479797","-86.30731","-6","1"
+"42755","Leitchfield","KY","37.471943","-86.343941","-6","1"
+"42757","Magnolia","KY","37.415382","-85.71597","-6","1"
+"42758","Mannsville","KY","37.360392","-85.198031","-5","1"
+"42759","Marrowbone","KY","36.824961","-85.50481","-6","1"
+"42761","Milltown","KY","37.113189","-85.44177","-6","1"
+"42762","Millwood","KY","37.443289","-86.40531","-6","1"
+"42764","Mount Sherman","KY","37.463961","-85.639231","-5","1"
+"42765","Munfordville","KY","37.291869","-85.90786","-6","1"
+"42776","Sonora","KY","37.52025","-85.8807","-5","1"
+"42782","Summersville","KY","37.349798","-85.64536","-6","1"
+"42783","Summit","KY","37.567134","-86.085259","-5","1"
+"42784","Upton","KY","37.456599","-85.90164","-5","1"
+"42786","Waterview","KY","36.819839","-85.462435","-6","1"
+"42788","White Mills","KY","37.55125","-86.03115","-5","1"
+"43001","Alexandria","OH","40.091576","-82.61225","-5","1"
+"43002","Amlin","OH","40.05991","-83.18299","-5","1"
+"43003","Ashley","OH","40.40994","-82.96124","-5","1"
+"43004","Blacklick","OH","39.998073","-82.8052","-5","1"
+"43005","Bladensburg","OH","40.285043","-82.28218","-5","1"
+"43006","Brinkhaven","OH","40.471139","-82.16947","-5","1"
+"43007","Broadway","OH","40.340633","-83.416306","-5","1"
+"43008","Buckeye Lake","OH","39.93398","-82.47932","-5","1"
+"43009","Cable","OH","40.175413","-83.64579","-5","1"
+"43010","Catawba","OH","40.000364","-83.62142","-5","1"
+"43011","Centerburg","OH","40.304121","-82.68029","-5","1"
+"43013","Croton","OH","40.235446","-82.69054","-5","1"
+"43014","Danville","OH","40.470806","-82.26422","-5","1"
+"43015","Delaware","OH","40.295925","-83.06968","-5","1"
+"43016","Dublin","OH","40.089811","-83.13983","-5","1"
+"43017","Dublin","OH","40.109478","-83.12713","-5","1"
+"43018","Etna","OH","39.956994","-82.68307","-5","1"
+"43019","Fredericktown","OH","40.493191","-82.56998","-5","1"
+"43021","Galena","OH","40.202298","-82.89437","-5","1"
+"43022","Gambier","OH","40.351781","-82.35543","-5","1"
+"43023","Granville","OH","40.070985","-82.52134","-5","1"
+"43025","Hebron","OH","39.958869","-82.49882","-5","1"
+"43026","Hilliard","OH","40.021665","-83.14762","-5","1"
+"43027","Homer","OH","40.132821","-82.561556","-5","1"
+"43028","Howard","OH","40.42065","-82.31485","-5","1"
+"43029","Irwin","OH","40.108356","-83.44868","-5","1"
+"43030","Jacksontown","OH","39.968846","-82.430017","-5","1"
+"43031","Johnstown","OH","40.151979","-82.66944","-5","1"
+"43032","Kilbourne","OH","40.328773","-82.95824","-5","1"
+"43033","Kirkersville","OH","39.960661","-82.59613","-5","1"
+"43035","Lewis Center","OH","40.173636","-82.99675","-5","1"
+"43036","Magnetic Springs","OH","40.353133","-83.26289","-5","1"
+"43037","Martinsburg","OH","40.27453","-82.34436","-5","1"
+"43040","Marysville","OH","40.255973","-83.36391","-5","1"
+"43041","Marysville","OH","40.306924","-83.360645","-5","1"
+"43044","Mechanicsburg","OH","40.052907","-83.57223","-5","1"
+"43045","Milford Center","OH","40.179696","-83.44266","-5","1"
+"43046","Millersport","OH","39.900063","-82.53696","-5","1"
+"43047","Mingo","OH","40.204914","-83.646581","-5","1"
+"43048","Mount Liberty","OH","40.406113","-82.465777","-5","1"
+"43050","Mount Vernon","OH","40.385636","-82.48254","-5","1"
+"43054","New Albany","OH","40.080252","-82.82462","-5","1"
+"43055","Newark","OH","40.079115","-82.40054","-5","1"
+"43056","Heath","OH","40.017096","-82.34322","-5","1"
+"43058","Newark","OH","40.095148","-82.482659","-5","1"
+"43060","North Lewisburg","OH","40.223286","-83.56172","-5","1"
+"43061","Ostrander","OH","40.285343","-83.20426","-5","1"
+"43062","Pataskala","OH","39.994001","-82.67652","-5","1"
+"43064","Plain City","OH","40.103133","-83.26825","-5","1"
+"43065","Powell","OH","40.155515","-83.08415","-5","1"
+"43066","Radnor","OH","40.400799","-83.15216","-5","1"
+"43067","Raymond","OH","40.355958","-83.46681","-5","1"
+"43068","Reynoldsburg","OH","39.956384","-82.7961","-5","1"
+"43070","Rosewood","OH","40.217799","-83.96044","-5","1"
+"43071","Saint Louisville","OH","40.173402","-82.36653","-5","1"
+"43072","Saint Paris","OH","40.123455","-83.95416","-5","1"
+"43073","Summit Station","OH","39.996516","-82.754034","-5","1"
+"43074","Sunbury","OH","40.270926","-82.84501","-5","1"
+"43076","Thornville","OH","39.909915","-82.41013","-5","1"
+"43077","Unionville Center","OH","40.136336","-83.3415","-5","1"
+"43078","Urbana","OH","40.112531","-83.76633","-5","1"
+"43080","Utica","OH","40.242377","-82.42775","-5","1"
+"43081","Westerville","OH","40.109513","-82.91606","-5","1"
+"43082","Westerville","OH","40.14852","-82.91278","-5","1"
+"43083","Westville","OH","40.102185","-83.83786","-5","1"
+"43084","Woodstock","OH","40.145952","-83.52488","-5","1"
+"43085","Columbus","OH","40.097796","-83.02076","-5","1"
+"43086","Westerville","OH","39.969036","-83.011389","-5","1"
+"43093","Newark","OH","40.095148","-82.482659","-5","1"
+"43098","Hebron","OH","40.095148","-82.482659","-5","1"
+"43101","Adelphi","OH","39.466041","-82.7457","-5","1"
+"43102","Amanda","OH","39.651028","-82.76098","-5","1"
+"43103","Ashville","OH","39.720751","-82.94842","-5","1"
+"43105","Baltimore","OH","39.860353","-82.61356","-5","1"
+"43106","Bloomingburg","OH","39.624916","-83.40267","-5","1"
+"43107","Bremen","OH","39.703126","-82.41937","-5","1"
+"43109","Brice","OH","39.916574","-82.83218","-5","1"
+"43110","Canal Winchester","OH","39.854413","-82.80872","-5","1"
+"43111","Carbon Hill","OH","39.501342","-82.24434","-5","1"
+"43112","Carroll","OH","39.803993","-82.70953","-5","1"
+"43113","Circleville","OH","39.598236","-82.94285","-5","1"
+"43115","Clarksburg","OH","39.501913","-83.17383","-5","1"
+"43116","Commercial Point","OH","39.768502","-83.06007","-5","1"
+"43117","Derby","OH","39.773025","-83.199472","-5","1"
+"43119","Galloway","OH","39.939871","-83.1667","-5","1"
+"43123","Grove City","OH","39.88628","-83.07989","-5","1"
+"43125","Groveport","OH","39.852363","-82.89589","-5","1"
+"43126","Harrisburg","OH","39.810093","-83.17085","-5","1"
+"43127","Haydenville","OH","39.482096","-82.32798","-5","1"
+"43128","Jeffersonville","OH","39.651917","-83.57236","-5","1"
+"43130","Lancaster","OH","39.712887","-82.61216","-5","1"
+"43135","Laurelville","OH","39.473379","-82.71076","-5","1"
+"43136","Lithopolis","OH","39.802655","-82.80802","-5","1"
+"43137","Lockbourne","OH","39.818249","-82.98115","-5","1"
+"43138","Logan","OH","39.530972","-82.40801","-5","1"
+"43140","London","OH","39.892676","-83.43643","-5","1"
+"43142","Milledgeville","OH","39.593121","-83.5876","-5","1"
+"43143","Mount Sterling","OH","39.710455","-83.28776","-5","1"
+"43144","Murray City","OH","39.513028","-82.1665","-5","1"
+"43145","New Holland","OH","39.555409","-83.26409","-5","1"
+"43146","Orient","OH","39.786202","-83.1469","-5","1"
+"43147","Pickerington","OH","39.904288","-82.756","-5","1"
+"43148","Pleasantville","OH","39.816577","-82.50791","-5","1"
+"43149","Rockbridge","OH","39.545786","-82.57704","-5","1"
+"43150","Rushville","OH","39.778306","-82.41455","-5","1"
+"43151","Sedalia","OH","39.732474","-83.47587","-5","1"
+"43152","South Bloomingville","OH","39.387214","-82.62314","-5","1"
+"43153","South Solon","OH","39.721965","-83.58093","-5","1"
+"43154","Stoutsville","OH","39.605605","-82.82656","-5","1"
+"43155","Sugar Grove","OH","39.630003","-82.51459","-5","1"
+"43156","Tarlton","OH","39.554697","-82.77917","-5","1"
+"43157","Thurston","OH","39.843864","-82.54555","-5","1"
+"43158","Union Furnace","OH","39.460218","-82.3572","-5","1"
+"43160","Washington Court House","OH","39.533002","-83.43905","-5","1"
+"43162","West Jefferson","OH","39.939528","-83.28912","-5","1"
+"43163","West Rushville","OH","39.7631","-82.447024","-5","1"
+"43164","Williamsport","OH","39.590417","-83.11298","-5","1"
+"43187","Pickerington","OH","39.882017","-82.739875","-5","1"
+"43199","Groveport","OH","39.969036","-83.011389","-5","1"
+"43201","Columbus","OH","39.990764","-83.00117","-5","1"
+"43202","Columbus","OH","40.018814","-83.00894","-5","1"
+"43203","Columbus","OH","39.9718","-82.9688","-5","1"
+"43204","Columbus","OH","39.958496","-83.08231","-5","1"
+"43205","Columbus","OH","39.957265","-82.96587","-5","1"
+"43206","Columbus","OH","39.944564","-82.98085","-5","1"
+"43207","Columbus","OH","39.897695","-82.96969","-5","1"
+"43209","Columbus","OH","39.958564","-82.92824","-5","1"
+"43210","Columbus","OH","40.003681","-83.02148","-5","1"
+"43211","Columbus","OH","40.012714","-82.97127","-5","1"
+"43212","Columbus","OH","39.988114","-83.04268","-5","1"
+"43213","Columbus","OH","39.966814","-82.87413","-5","1"
+"43214","Columbus","OH","40.053063","-83.01881","-5","1"
+"43215","Columbus","OH","39.965131","-83.00431","-5","1"
+"43216","Columbus","OH","39.969036","-83.011389","-5","1"
+"43217","Columbus","OH","39.824831","-82.94384","-5","1"
+"43218","Columbus","OH","39.969036","-83.011389","-5","1"
+"43219","Columbus","OH","40.002514","-82.92589","-5","1"
+"43220","Columbus","OH","40.047273","-83.06986","-5","1"
+"43221","Columbus","OH","40.02063","-83.07655","-5","1"
+"43222","Columbus","OH","39.958664","-83.02856","-5","1"
+"43223","Columbus","OH","39.935263","-83.04558","-5","1"
+"43224","Columbus","OH","40.039914","-82.96772","-5","1"
+"43226","Columbus","OH","39.969036","-83.011389","-5","1"
+"43227","Columbus","OH","39.944231","-82.89063","-5","1"
+"43228","Columbus","OH","39.954363","-83.123","-5","1"
+"43229","Columbus","OH","40.085313","-82.97326","-5","1"
+"43230","Columbus","OH","40.039963","-82.87855","-5","1"
+"43231","Columbus","OH","40.076042","-82.94064","-5","1"
+"43232","Columbus","OH","39.924213","-82.86563","-5","1"
+"43234","Columbus","OH","39.969036","-83.011389","-5","1"
+"43235","Columbus","OH","40.099204","-83.05567","-5","1"
+"43236","Columbus","OH","40.135711","-83.007626","-5","1"
+"43240","Columbus","OH","40.146873","-82.98178","-5","1"
+"43251","Columbus","OH","39.969036","-83.011389","-5","1"
+"43260","Columbus","OH","39.969036","-83.011389","-5","1"
+"43265","Columbus","OH","39.969036","-83.011389","-5","1"
+"43266","Columbus","OH","39.969036","-83.011389","-5","1"
+"43268","Columbus","OH","39.969036","-83.011389","-5","1"
+"43270","Columbus","OH","39.969036","-83.011389","-5","1"
+"43271","Columbus","OH","39.969036","-83.011389","-5","1"
+"43272","Columbus","OH","39.969036","-83.011389","-5","1"
+"43279","Columbus","OH","39.969036","-83.011389","-5","1"
+"43284","Columbus","OH","39.969036","-83.011389","-5","1"
+"43287","Columbus","OH","39.969036","-83.011389","-5","1"
+"43291","Columbus","OH","39.969036","-83.011389","-5","1"
+"43299","Columbus","OH","39.969036","-83.011389","-5","1"
+"43301","Marion","OH","40.616604","-83.069296","-5","1"
+"43302","Marion","OH","40.589747","-83.12173","-5","1"
+"43306","Marion","OH","40.56941","-83.139341","-5","1"
+"43307","Marion","OH","40.56941","-83.139341","-5","1"
+"43310","Belle Center","OH","40.518081","-83.78052","-5","1"
+"43311","Bellefontaine","OH","40.365923","-83.75816","-5","1"
+"43314","Caledonia","OH","40.642604","-82.96158","-5","1"
+"43315","Cardington","OH","40.490756","-82.87312","-5","1"
+"43316","Carey","OH","40.954293","-83.38068","-5","1"
+"43317","Chesterville","OH","40.479649","-82.68356","-5","1"
+"43318","De Graff","OH","40.314099","-83.91041","-5","1"
+"43319","East Liberty","OH","40.307923","-83.56924","-5","1"
+"43320","Edison","OH","40.583666","-82.88443","-5","1"
+"43321","Fulton","OH","40.46242","-82.82831","-5","1"
+"43322","Green Camp","OH","40.531614","-83.20937","-5","1"
+"43323","Harpster","OH","40.730593","-83.24454","-5","1"
+"43324","Huntsville","OH","40.460862","-83.83774","-5","1"
+"43325","Iberia","OH","40.60796","-82.872954","-5","1"
+"43326","Kenton","OH","40.642266","-83.60577","-5","1"
+"43330","Kirby","OH","40.813023","-83.419606","-5","1"
+"43331","Lakeview","OH","40.507868","-83.90705","-5","1"
+"43332","La Rue","OH","40.585905","-83.3828","-5","1"
+"43333","Lewistown","OH","40.436172","-83.92528","-5","1"
+"43334","Marengo","OH","40.399648","-82.80783","-5","1"
+"43335","Martel","OH","40.668497","-82.909984","-5","1"
+"43336","Middleburg","OH","40.293691","-83.5827","-5","1"
+"43337","Morral","OH","40.687548","-83.22944","-5","1"
+"43338","Mount Gilead","OH","40.555366","-82.77273","-5","1"
+"43340","Mount Victory","OH","40.547039","-83.49204","-5","1"
+"43341","New Bloomington","OH","40.587559","-83.31254","-5","1"
+"43342","Prospect","OH","40.470755","-83.18305","-5","1"
+"43343","Quincy","OH","40.308916","-83.97325","-5","1"
+"43344","Richwood","OH","40.430758","-83.32103","-5","1"
+"43345","Ridgeway","OH","40.513261","-83.57736","-5","1"
+"43346","Roundhead","OH","40.573227","-83.846199","-5","1"
+"43347","Rushsylvania","OH","40.470605","-83.66538","-5","1"
+"43348","Russells Point","OH","40.469231","-83.88554","-5","1"
+"43349","Shauck","OH","40.614239","-82.661938","-5","1"
+"43350","Sparta","OH","40.394773","-82.69952","-5","1"
+"43351","Upper Sandusky","OH","40.82732","-83.29921","-5","1"
+"43355","Ridgeville","OH","41.438281","-84.254241","-5","1"
+"43356","Waldo","OH","40.461613","-83.05047","-5","1"
+"43357","West Liberty","OH","40.254824","-83.751","-5","1"
+"43358","West Mansfield","OH","40.413252","-83.53853","-5","1"
+"43359","Wharton","OH","40.863848","-83.45714","-5","1"
+"43360","Zanesfield","OH","40.327984","-83.66884","-5","1"
+"43381","Stokes","OH","40.498069","-83.921517","-5","1"
+"43400","Danbury","OH","41.532003","-82.797419","-5","1"
+"43402","Bowling Green","OH","41.388519","-83.65795","-5","1"
+"43403","Bowling Green","OH","41.39235","-83.648996","-5","1"
+"43406","Bradner","OH","41.328037","-83.43802","-5","1"
+"43407","Burgoon","OH","41.277969","-83.24578","-5","1"
+"43408","Clay Center","OH","41.565049","-83.363","-5","1"
+"43410","Clyde","OH","41.304387","-82.96925","-5","1"
+"43412","Curtice","OH","41.63678","-83.30724","-5","1"
+"43413","Cygnet","OH","41.240054","-83.64985","-5","1"
+"43414","Dunbridge","OH","41.39235","-83.648996","-5","1"
+"43416","Elmore","OH","41.477061","-83.28361","-5","1"
+"43420","Fremont","OH","41.35307","-83.11217","-5","1"
+"43430","Genoa","OH","41.523309","-83.37072","-5","1"
+"43431","Gibsonburg","OH","41.390878","-83.32313","-5","1"
+"43432","Graytown","OH","41.553383","-83.25597","-5","1"
+"43433","Gypsum","OH","41.503759","-82.87084","-5","1"
+"43434","Harbor View","OH","41.645699","-83.620233","-5","1"
+"43435","Helena","OH","41.333956","-83.30333","-5","1"
+"43436","Isle Saint George","OH","41.715332","-82.822697","-5","1"
+"43437","Jerry City","OH","41.252306","-83.60464","-5","1"
+"43438","Kelleys Island","OH","41.601343","-82.69744","-5","1"
+"43439","Lacarne","OH","41.51751","-83.04293","-5","1"
+"43440","Lakeside Marblehead","OH","41.533186","-82.75881","-5","1"
+"43441","Lemoyne","OH","41.536132","-83.45938","-5","1"
+"43442","Lindsey","OH","41.425328","-83.2253","-5","1"
+"43443","Luckey","OH","41.455078","-83.47735","-5","1"
+"43445","Martin","OH","41.596682","-83.28985","-5","1"
+"43446","Middle Bass","OH","41.683477","-82.804677","-5","1"
+"43447","Millbury","OH","41.5678","-83.433","-5","1"
+"43449","Oak Harbor","OH","41.53446","-83.13569","-5","1"
+"43450","Pemberville","OH","41.4031","-83.47664","-5","1"
+"43451","Portage","OH","41.318285","-83.62835","-5","1"
+"43452","Port Clinton","OH","41.512855","-82.92948","-5","1"
+"43456","Put In Bay","OH","41.671574","-82.81278","-5","1"
+"43457","Risingsun","OH","41.269279","-83.43171","-5","1"
+"43458","Rocky Ridge","OH","41.532215","-83.21026","-5","1"
+"43460","Rossford","OH","41.603797","-83.5619","-5","1"
+"43462","Rudolph","OH","41.28447","-83.69515","-5","1"
+"43463","Stony Ridge","OH","41.509051","-83.508531","-5","1"
+"43464","Vickery","OH","41.404156","-82.92509","-5","1"
+"43465","Walbridge","OH","41.57725","-83.49795","-5","1"
+"43466","Wayne","OH","41.28953","-83.50215","-5","1"
+"43467","West Millgrove","OH","41.245763","-83.48948","-5","1"
+"43468","Williston","OH","41.602898","-83.33988","-5","1"
+"43469","Woodville","OH","41.455129","-83.36565","-5","1"
+"43501","Alvordton","OH","41.673094","-84.44711","-5","1"
+"43502","Archbold","OH","41.529231","-84.30866","-5","1"
+"43504","Berkey","OH","41.697701","-83.83446","-5","1"
+"43505","Blakeslee","OH","41.523945","-84.730275","-5","1"
+"43506","Bryan","OH","41.471569","-84.55459","-5","1"
+"43510","Colton","OH","41.419878","-84.013674","-5","1"
+"43511","Custar","OH","41.26256","-83.82917","-5","1"
+"43512","Defiance","OH","41.29037","-84.36539","-5","1"
+"43515","Delta","OH","41.585627","-84.00778","-5","1"
+"43516","Deshler","OH","41.211032","-83.89827","-5","1"
+"43517","Edgerton","OH","41.441679","-84.73356","-5","1"
+"43518","Edon","OH","41.572443","-84.75333","-5","1"
+"43519","Evansport","OH","41.422158","-84.396619","-5","1"
+"43520","Farmer","OH","41.39066","-84.631322","-5","1"
+"43521","Fayette","OH","41.66143","-84.29732","-5","1"
+"43522","Grand Rapids","OH","41.427352","-83.84944","-5","1"
+"43523","Grelton","OH","41.341081","-84.000532","-5","1"
+"43524","Hamler","OH","41.229001","-84.03567","-5","1"
+"43525","Haskins","OH","41.466185","-83.70725","-5","1"
+"43526","Hicksville","OH","41.30569","-84.74496","-5","1"
+"43527","Holgate","OH","41.253169","-84.14754","-5","1"
+"43528","Holland","OH","41.626651","-83.73047","-5","1"
+"43529","Hoytville","OH","41.190401","-83.78249","-5","1"
+"43530","Jewell","OH","41.325764","-84.279306","-5","1"
+"43531","Kunkle","OH","41.635979","-84.49453","-5","1"
+"43532","Liberty Center","OH","41.450082","-83.97563","-5","1"
+"43533","Lyons","OH","41.696808","-84.07558","-5","1"
+"43534","McClure","OH","41.368743","-83.93422","-5","1"
+"43535","Malinta","OH","41.315943","-84.03021","-5","1"
+"43536","Mark Center","OH","41.299247","-84.63748","-5","1"
+"43537","Maumee","OH","41.576992","-83.672","-5","1"
+"43538","Monclova","OH","41.597362","-83.806053","-5","1"
+"43540","Metamora","OH","41.702622","-83.93725","-5","1"
+"43541","Milton Center","OH","41.301347","-83.82923","-5","1"
+"43542","Monclova","OH","41.577428","-83.76396","-5","1"
+"43543","Montpelier","OH","41.609365","-84.62292","-5","1"
+"43545","Napoleon","OH","41.388278","-84.12511","-5","1"
+"43547","Neapolis","OH","41.491702","-83.87108","-5","1"
+"43548","New Bavaria","OH","41.190188","-84.17549","-5","1"
+"43549","Ney","OH","41.380047","-84.51313","-5","1"
+"43550","Okolona","OH","41.326664","-84.111701","-5","1"
+"43551","Perrysburg","OH","41.540724","-83.58904","-5","1"
+"43552","Perrysburg","OH","41.39235","-83.648996","-5","1"
+"43553","Pettisville","OH","41.531159","-84.22716","-5","1"
+"43554","Pioneer","OH","41.65973","-84.56225","-5","1"
+"43555","Ridgeville Corners","OH","41.437905","-84.255","-5","1"
+"43556","Sherwood","OH","41.298409","-84.55885","-5","1"
+"43557","Stryker","OH","41.491112","-84.40709","-5","1"
+"43558","Swanton","OH","41.585948","-83.87384","-5","1"
+"43560","Sylvania","OH","41.706383","-83.7102","-5","1"
+"43565","Tontogany","OH","41.419152","-83.74024","-5","1"
+"43566","Waterville","OH","41.501902","-83.73685","-5","1"
+"43567","Wauseon","OH","41.5615","-84.15574","-5","1"
+"43569","Weston","OH","41.349205","-83.78953","-5","1"
+"43570","West Unity","OH","41.586794","-84.43574","-5","1"
+"43571","Whitehouse","OH","41.517402","-83.81063","-5","1"
+"43579","Tiffin","OH","41.425554","-84.395196","-5","1"
+"43601","Toledo","OH","41.720684","-83.569359","-5","1"
+"43602","Toledo","OH","41.646649","-83.54935","-5","1"
+"43603","Toledo","OH","41.686778","-83.43943","-5","1"
+"43604","Toledo","OH","41.658109","-83.52774","-5","1"
+"43605","Toledo","OH","41.642549","-83.5104","-5","1"
+"43606","Toledo","OH","41.671761","-83.6064","-5","1"
+"43607","Toledo","OH","41.65","-83.59783","-5","1"
+"43608","Toledo","OH","41.678248","-83.53257","-5","1"
+"43609","Toledo","OH","41.63105","-83.57313","-5","1"
+"43610","Toledo","OH","41.676299","-83.55996","-5","1"
+"43611","Toledo","OH","41.703379","-83.49003","-5","1"
+"43612","Toledo","OH","41.706048","-83.5577","-5","1"
+"43613","Toledo","OH","41.703899","-83.605","-5","1"
+"43614","Toledo","OH","41.60135","-83.62611","-5","1"
+"43615","Toledo","OH","41.6522","-83.67037","-5","1"
+"43616","Oregon","OH","41.646398","-83.46933","-5","1"
+"43617","Toledo","OH","41.667361","-83.71609","-5","1"
+"43618","Oregon","OH","41.676897","-83.39972","-5","1"
+"43619","Northwood","OH","41.607416","-83.48322","-5","1"
+"43620","Toledo","OH","41.665849","-83.55218","-5","1"
+"43623","Toledo","OH","41.707649","-83.64363","-5","1"
+"43624","Toledo","OH","41.657099","-83.54525","-5","1"
+"43628","Howard","OH","40.44652","-82.329486","-5","1"
+"43635","Toledo","OH","41.686778","-83.43943","-5","1"
+"43652","Toledo","OH","41.686778","-83.43943","-5","1"
+"43653","Toledo","OH","41.686778","-83.43943","-5","1"
+"43654","Toledo","OH","41.686778","-83.43943","-5","1"
+"43655","Toledo","OH","41.686778","-83.43943","-5","1"
+"43656","Toledo","OH","41.678167","-83.497155","-5","1"
+"43657","Toledo","OH","41.686778","-83.43943","-5","1"
+"43659","Toledo","OH","41.686778","-83.43943","-5","1"
+"43660","Toledo","OH","41.654649","-83.532883","-5","1"
+"43661","Toledo","OH","41.678167","-83.497155","-5","1"
+"43666","Toledo","OH","41.678167","-83.497155","-5","1"
+"43667","Toledo","OH","41.686778","-83.43943","-5","1"
+"43681","Toledo","OH","41.686778","-83.43943","-5","1"
+"43682","Toledo","OH","41.686778","-83.43943","-5","1"
+"43697","Toledo","OH","41.686778","-83.43943","-5","1"
+"43699","Toledo","OH","41.653788","-83.658937","-5","1"
+"43701","Zanesville","OH","39.949377","-82.00492","-5","1"
+"43702","Zanesville","OH","39.961236","-81.962539","-5","1"
+"43704","Columbus","OH","39.991729","-83.082262","-5","1"
+"43708","Wayne","OH","39.922656","-81.433818","-5","1"
+"43711","Ava","OH","39.827556","-81.554854","-5","1"
+"43713","Barnesville","OH","39.989191","-81.17197","-5","1"
+"43716","Beallsville","OH","39.841646","-81.02104","-5","1"
+"43717","Belle Valley","OH","39.789241","-81.55483","-5","1"
+"43718","Belmont","OH","40.028171","-81.00679","-5","1"
+"43719","Bethesda","OH","40.009383","-81.0763","-5","1"
+"43720","Blue Rock","OH","39.806956","-81.88179","-5","1"
+"43721","Brownsville","OH","39.946713","-82.25642","-5","1"
+"43722","Buffalo","OH","39.917012","-81.51947","-5","1"
+"43723","Byesville","OH","39.968985","-81.54108","-5","1"
+"43724","Caldwell","OH","39.741629","-81.52512","-5","1"
+"43725","Cambridge","OH","40.025859","-81.59243","-5","1"
+"43727","Chandlersville","OH","39.873402","-81.81724","-5","1"
+"43728","Chesterhill","OH","39.484626","-81.89613","-5","1"
+"43730","Corning","OH","39.617263","-82.09325","-5","1"
+"43731","Crooksville","OH","39.742354","-82.09349","-5","1"
+"43732","Cumberland","OH","39.85261","-81.64922","-5","1"
+"43733","Derwent","OH","39.923616","-81.542965","-5","1"
+"43734","Duncan Falls","OH","39.876997","-81.90909","-5","1"
+"43735","East Fultonham","OH","39.851515","-82.12173","-5","1"
+"43736","Fairview","OH","40.064971","-81.255793","-5","1"
+"43738","Fultonham","OH","39.855355","-82.14178","-5","1"
+"43739","Glenford","OH","39.905157","-82.28507","-5","1"
+"43740","Gratiot","OH","39.950857","-82.21842","-5","1"
+"43741","Wayne","OH","39.884291","-81.106797","-5","1"
+"43746","Hopewell","OH","39.966135","-82.18376","-5","1"
+"43747","Jerusalem","OH","39.862128","-81.11139","-5","1"
+"43748","Junction City","OH","39.710863","-82.30228","-5","1"
+"43749","Kimbolton","OH","40.157301","-81.55736","-5","1"
+"43750","Kipling","OH","39.994467","-81.500579","-5","1"
+"43752","Laings","OH","39.717086","-81.009999","-5","1"
+"43754","Lewisville","OH","39.76607","-81.24357","-5","1"
+"43755","Lore City","OH","40.041068","-81.44635","-5","1"
+"43756","McConnelsville","OH","39.675911","-81.79548","-5","1"
+"43757","Malaga","OH","39.859373","-81.151604","-5","1"
+"43758","Malta","OH","39.621481","-81.91737","-5","1"
+"43759","Morristown","OH","40.011338","-80.970135","-5","1"
+"43760","Mount Perry","OH","39.888751","-82.19224","-5","1"
+"43761","Moxahala","OH","39.740299","-82.248369","-5","1"
+"43762","New Concord","OH","40.018953","-81.73657","-5","1"
+"43764","New Lexington","OH","39.717824","-82.19823","-5","1"
+"43766","New Straitsville","OH","39.588854","-82.25279","-5","1"
+"43767","Norwich","OH","39.990948","-81.80629","-5","1"
+"43768","Old Washington","OH","40.038503","-81.44232","-5","1"
+"43771","Philo","OH","39.842048","-81.93264","-5","1"
+"43772","Pleasant City","OH","39.895548","-81.53483","-5","1"
+"43773","Quaker City","OH","39.991056","-81.28517","-5","1"
+"43777","Roseville","OH","39.814025","-82.07808","-5","1"
+"43778","Salesville","OH","39.995987","-81.36641","-5","1"
+"43779","Sarahsville","OH","39.803205","-81.43368","-5","1"
+"43780","Senecaville","OH","39.930047","-81.44256","-5","1"
+"43782","Shawnee","OH","39.608984","-82.22225","-5","1"
+"43783","Somerset","OH","39.801679","-82.29166","-5","1"
+"43786","Stafford","OH","39.711168","-81.275824","-5","1"
+"43787","Stockport","OH","39.536415","-81.80009","-5","1"
+"43788","Summerfield","OH","39.799978","-81.33548","-5","1"
+"43789","Sycamore Valley","OH","39.654386","-81.240732","-5","1"
+"43791","White Cottage","OH","39.855474","-82.11492","-5","1"
+"43793","Woodsfield","OH","39.742066","-81.09908","-5","1"
+"43799","Center","OH","39.816891","-81.485315","-5","1"
+"43802","Adamsville","OH","40.090643","-81.86556","-5","1"
+"43803","Bakersville","OH","40.357237","-81.643638","-5","1"
+"43804","Baltic","OH","40.449531","-81.72309","-5","1"
+"43805","Blissfield","OH","40.398274","-81.968787","-5","1"
+"43811","Conesville","OH","40.180136","-81.90422","-5","1"
+"43812","Coshocton","OH","40.270198","-81.86761","-5","1"
+"43821","Dresden","OH","40.130754","-82.01637","-5","1"
+"43822","Frazeysburg","OH","40.161484","-82.16324","-5","1"
+"43824","Fresno","OH","40.357857","-81.75288","-5","1"
+"43828","Keene","OH","40.351271","-81.873607","-5","1"
+"43830","Nashport","OH","40.063886","-82.15977","-5","1"
+"43832","Newcomerstown","OH","40.277376","-81.59662","-5","1"
+"43836","Plainfield","OH","40.200382","-81.720675","-5","1"
+"43837","Port Washington","OH","40.314481","-81.49751","-5","1"
+"43840","Stone Creek","OH","40.406106","-81.58374","-5","1"
+"43842","Trinway","OH","40.140472","-82.01079","-5","1"
+"43843","Walhonding","OH","40.3479","-82.17789","-5","1"
+"43844","Warsaw","OH","40.33503","-82.04314","-5","1"
+"43845","West Lafayette","OH","40.268019","-81.74213","-5","1"
+"43901","Adena","OH","40.223285","-80.87017","-5","1"
+"43902","Alledonia","OH","39.890564","-80.9766","-5","1"
+"43903","Amsterdam","OH","40.469171","-80.93363","-5","1"
+"43905","Barton","OH","40.105279","-80.84292","-5","1"
+"43906","Bellaire","OH","40.01558","-80.76343","-5","1"
+"43907","Cadiz","OH","40.258447","-81.00415","-5","1"
+"43908","Bergholz","OH","40.518045","-80.88733","-5","1"
+"43909","Blaine","OH","40.067767","-80.81836","-5","1"
+"43910","Bloomingdale","OH","40.361891","-80.81953","-5","1"
+"43912","Bridgeport","OH","40.074284","-80.77447","-5","1"
+"43913","Brilliant","OH","40.26212","-80.6356","-5","1"
+"43914","Cameron","OH","39.768134","-80.94455","-5","1"
+"43915","Clarington","OH","39.759825","-80.88695","-5","1"
+"43916","Colerain","OH","40.122351","-80.814948","-5","1"
+"43917","Dillonvale","OH","40.212067","-80.78094","-5","1"
+"43920","East Liverpool","OH","40.641545","-80.57469","-5","1"
+"43924","Noble","OH","39.764709","-81.537215","-5","1"
+"43925","East Springfield","OH","40.450257","-80.86015","-5","1"
+"43926","Empire","OH","40.510729","-80.62344","-5","1"
+"43927","Fairpoint","OH","40.11761","-80.93763","-5","1"
+"43928","Glencoe","OH","40.008421","-80.88913","-5","1"
+"43930","Hammondsville","OH","40.566375","-80.76929","-5","1"
+"43931","Hannibal","OH","39.676317","-80.891369","-5","1"
+"43932","Irondale","OH","40.561512","-80.71859","-5","1"
+"43933","Jacobsburg","OH","39.938218","-80.89033","-5","1"
+"43934","Lansing","OH","40.076176","-80.78926","-5","1"
+"43935","Martins Ferry","OH","40.103877","-80.73327","-5","1"
+"43937","Maynard","OH","40.130167","-80.877264","-5","1"
+"43938","Mingo Junction","OH","40.318569","-80.64172","-5","1"
+"43939","Mount Pleasant","OH","40.176109","-80.79979","-5","1"
+"43940","Neffs","OH","40.027491","-80.81606","-5","1"
+"43941","Piney Fork","OH","40.263948","-80.835767","-5","1"
+"43942","Powhatan Point","OH","39.861984","-80.82023","-5","1"
+"43943","Rayland","OH","40.211142","-80.72596","-5","1"
+"43944","Richmond","OH","40.43273","-80.76692","-5","1"
+"43945","Salineville","OH","40.624307","-80.83872","-5","1"
+"43946","Sardis","OH","39.646462","-80.96151","-5","1"
+"43947","Shadyside","OH","39.964553","-80.76013","-5","1"
+"43948","Smithfield","OH","40.269741","-80.78137","-5","1"
+"43950","Saint Clairsville","OH","40.086725","-80.90826","-5","1"
+"43951","Lafferty","OH","40.109149","-81.01773","-5","1"
+"43952","Steubenville","OH","40.371185","-80.63426","-5","1"
+"43953","Steubenville","OH","40.369467","-80.70251","-5","1"
+"43960","Richland","OH","40.012984","-80.859104","-5","1"
+"43961","Stratton","OH","40.523054","-80.6294","-5","1"
+"43962","Summitville","OH","40.679857","-80.88595","-5","1"
+"43963","Tiltonsville","OH","40.170721","-80.69768","-5","1"
+"43964","Toronto","OH","40.465183","-80.62364","-5","1"
+"43966","Unionport","OH","40.360979","-80.839519","-5","1"
+"43967","Warnock","OH","40.022806","-80.94093","-5","1"
+"43968","Wellsville","OH","40.621521","-80.66843","-5","1"
+"43970","Wolf Run","OH","40.46947","-80.889206","-5","1"
+"43971","Yorkville","OH","40.152615","-80.70789","-5","1"
+"43972","Bannock","OH","40.099277","-80.97601","-5","1"
+"43973","Freeport","OH","40.189812","-81.27506","-5","1"
+"43974","Harrisville","OH","40.18182","-80.88695","-5","1"
+"43976","Hopedale","OH","40.352364","-80.90465","-5","1"
+"43977","Flushing","OH","40.147388","-81.11291","-5","1"
+"43981","New Athens","OH","40.184401","-80.99519","-5","1"
+"43983","Piedmont","OH","40.147075","-81.20232","-5","1"
+"43984","New Rumley","OH","40.29649","-81.102502","-5","1"
+"43985","Holloway","OH","40.011338","-80.970135","-5","1"
+"43986","Jewett","OH","40.374942","-80.99193","-5","1"
+"43988","Scio","OH","40.405788","-81.10432","-5","1"
+"43989","Short Creek","OH","40.29649","-81.102502","-5","1"
+"44001","Amherst","OH","41.386533","-82.23419","-5","1"
+"44003","Andover","OH","41.611348","-80.5622","-5","1"
+"44004","Ashtabula","OH","41.871212","-80.79178","-5","1"
+"44005","Ashtabula","OH","41.730146","-80.955313","-5","1"
+"44010","Austinburg","OH","41.758952","-80.86289","-5","1"
+"44011","Avon","OH","41.450538","-82.02167","-5","1"
+"44012","Avon Lake","OH","41.501595","-82.0063","-5","1"
+"44017","Berea","OH","41.36995","-81.86259","-5","1"
+"44021","Burton","OH","41.442863","-81.14404","-5","1"
+"44022","Chagrin Falls","OH","41.43932","-81.39232","-5","1"
+"44023","Chagrin Falls","OH","41.392171","-81.32748","-5","1"
+"44024","Chardon","OH","41.574171","-81.19473","-5","1"
+"44026","Chesterland","OH","41.526301","-81.33683","-5","1"
+"44028","Columbia Station","OH","41.316001","-81.93433","-5","1"
+"44030","Conneaut","OH","41.934916","-80.57923","-5","1"
+"44032","Dorset","OH","41.676362","-80.6686","-5","1"
+"44033","East Claridon","OH","41.53335","-81.111175","-5","1"
+"44035","Elyria","OH","41.369846","-82.10874","-5","1"
+"44036","Elyria","OH","41.401494","-82.077068","-5","1"
+"44039","North Ridgeville","OH","41.389546","-82.0046","-5","1"
+"44040","Gates Mills","OH","41.532584","-81.41052","-5","1"
+"44041","Geneva","OH","41.802618","-80.94645","-5","1"
+"44044","Grafton","OH","41.275919","-82.05315","-5","1"
+"44045","Grand River","OH","41.742693","-81.282125","-5","1"
+"44046","Huntsburg","OH","41.541756","-81.08063","-5","1"
+"44047","Jefferson","OH","41.728451","-80.74507","-5","1"
+"44048","Kingsville","OH","41.866806","-80.64962","-5","1"
+"44049","Kipton","OH","41.267051","-82.3047","-5","1"
+"44050","Lagrange","OH","41.259352","-82.13542","-5","1"
+"44052","Lorain","OH","41.459218","-82.1691","-5","1"
+"44053","Lorain","OH","41.431875","-82.20658","-5","1"
+"44054","Sheffield Lake","OH","41.48054","-82.09914","-5","1"
+"44055","Lorain","OH","41.435642","-82.13689","-5","1"
+"44056","Macedonia","OH","41.321189","-81.50135","-5","1"
+"44057","Madison","OH","41.80063","-81.06021","-5","1"
+"44060","Mentor","OH","41.688162","-81.33378","-5","1"
+"44061","Mentor","OH","41.910676","-81.249027","-5","1"
+"44062","Middlefield","OH","41.462346","-81.03666","-5","1"
+"44064","Montville","OH","41.61391","-81.05515","-5","1"
+"44065","Newbury","OH","41.469908","-81.24579","-5","1"
+"44067","Northfield","OH","41.319704","-81.54119","-5","1"
+"44068","North Kingsville","OH","41.904594","-80.685034","-5","1"
+"44070","North Olmsted","OH","41.415097","-81.91436","-5","1"
+"44072","Novelty","OH","41.478469","-81.33635","-5","1"
+"44073","Novelty","OH","41.837043","-80.955545","-5","1"
+"44074","Oberlin","OH","41.2863","-82.21935","-5","1"
+"44076","Orwell","OH","41.535437","-80.83514","-5","1"
+"44077","Painesville","OH","41.716094","-81.2396","-5","1"
+"44080","Parkman","OH","41.372452","-81.06617","-5","1"
+"44081","Perry","OH","41.767394","-81.14287","-5","1"
+"44082","Pierpont","OH","41.759503","-80.56995","-5","1"
+"44084","Rock Creek","OH","41.659739","-80.86635","-5","1"
+"44085","Rome","OH","41.6128","-80.83579","-5","1"
+"44086","Thompson","OH","41.674336","-81.05753","-5","1"
+"44087","Twinsburg","OH","41.314655","-81.44441","-5","1"
+"44088","Unionville","OH","41.783323","-81.003385","-5","1"
+"44089","Vermilion","OH","41.407845","-82.3648","-5","1"
+"44090","Wellington","OH","41.147116","-82.24031","-5","1"
+"44092","Wickliffe","OH","41.603581","-81.47087","-5","1"
+"44093","Williamsfield","OH","41.52563","-80.58076","-5","1"
+"44094","Willoughby","OH","41.625886","-81.39929","-5","1"
+"44095","Eastlake","OH","41.653796","-81.44614","-5","1"
+"44096","Willoughby","OH","41.910676","-81.249027","-5","1"
+"44097","Eastlake","OH","41.910676","-81.249027","-5","1"
+"44099","Windsor","OH","41.539985","-80.96688","-5","1"
+"44101","Cleveland","OH","41.523401","-81.599648","-5","1"
+"44102","Cleveland","OH","41.473451","-81.7358","-5","1"
+"44103","Cleveland","OH","41.513801","-81.64287","-5","1"
+"44104","Cleveland","OH","41.484001","-81.62702","-5","1"
+"44105","Cleveland","OH","41.450602","-81.62216","-5","1"
+"44106","Cleveland","OH","41.507751","-81.60883","-5","1"
+"44107","Lakewood","OH","41.480881","-81.80036","-5","1"
+"44108","Cleveland","OH","41.53715","-81.60905","-5","1"
+"44109","Cleveland","OH","41.448951","-81.70342","-5","1"
+"44110","Cleveland","OH","41.562781","-81.57273","-5","1"
+"44111","Cleveland","OH","41.459399","-81.78174","-5","1"
+"44112","Cleveland","OH","41.534101","-81.57558","-5","1"
+"44113","Cleveland","OH","41.484688","-81.70125","-5","1"
+"44114","Cleveland","OH","41.50988","-81.6753","-5","1"
+"44115","Cleveland","OH","41.493501","-81.67125","-5","1"
+"44116","Rocky River","OH","41.475297","-81.84575","-5","1"
+"44117","Euclid","OH","41.570344","-81.52726","-5","1"
+"44118","Cleveland","OH","41.499202","-81.55434","-5","1"
+"44119","Cleveland","OH","41.586749","-81.54584","-5","1"
+"44120","Cleveland","OH","41.472352","-81.58211","-5","1"
+"44121","Cleveland","OH","41.526151","-81.53309","-5","1"
+"44122","Beachwood","OH","41.472881","-81.52209","-5","1"
+"44123","Euclid","OH","41.602498","-81.52357","-5","1"
+"44124","Cleveland","OH","41.513752","-81.47281","-5","1"
+"44125","Cleveland","OH","41.414403","-81.60793","-5","1"
+"44126","Cleveland","OH","41.441697","-81.85738","-5","1"
+"44127","Cleveland","OH","41.469951","-81.65009","-5","1"
+"44128","Cleveland","OH","41.441153","-81.55179","-5","1"
+"44129","Cleveland","OH","41.397701","-81.73575","-5","1"
+"44130","Cleveland","OH","41.378051","-81.77945","-5","1"
+"44131","Independence","OH","41.391753","-81.65816","-5","1"
+"44132","Euclid","OH","41.608298","-81.50041","-5","1"
+"44133","North Royalton","OH","41.313758","-81.74204","-5","1"
+"44134","Cleveland","OH","41.393852","-81.70507","-5","1"
+"44135","Cleveland","OH","41.432149","-81.80467","-5","1"
+"44136","Strongsville","OH","41.312752","-81.83197","-5","1"
+"44137","Maple Heights","OH","41.412653","-81.56067","-5","1"
+"44138","Olmsted Falls","OH","41.373949","-81.91507","-5","1"
+"44139","Solon","OH","41.388387","-81.44365","-5","1"
+"44140","Bay Village","OH","41.484193","-81.92658","-5","1"
+"44141","Brecksville","OH","41.307688","-81.61835","-5","1"
+"44142","Brookpark","OH","41.40035","-81.82055","-5","1"
+"44143","Cleveland","OH","41.550318","-81.48175","-5","1"
+"44144","Cleveland","OH","41.437018","-81.73488","-5","1"
+"44145","Westlake","OH","41.454439","-81.92865","-5","1"
+"44146","Bedford","OH","41.389371","-81.52709","-5","1"
+"44147","Broadview Heights","OH","41.321827","-81.67659","-5","1"
+"44149","Brunswick","OH","41.316784","-81.854005","-5","1"
+"44168","Dalton","OH","40.80066","-81.699683","-5","1"
+"44177","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44178","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44179","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44181","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44184","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44185","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44186","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44188","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44189","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44190","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44191","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44192","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44193","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44194","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44195","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44197","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44198","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44199","Cleveland","OH","41.685744","-81.672797","-5","1"
+"44201","Atwater","OH","41.020057","-81.20037","-5","1"
+"44202","Aurora","OH","41.320612","-81.36352","-5","1"
+"44203","Barberton","OH","41.017522","-81.61616","-5","1"
+"44210","Bath","OH","41.128705","-81.53999","-5","1"
+"44211","Brady Lake","OH","41.169816","-81.312416","-5","1"
+"44212","Brunswick","OH","41.244051","-81.82836","-5","1"
+"44214","Burbank","OH","40.965423","-82.00032","-5","1"
+"44215","Chippewa Lake","OH","41.069151","-81.90358","-5","1"
+"44216","Clinton","OH","40.936655","-81.5981","-5","1"
+"44217","Creston","OH","40.976892","-81.90624","-5","1"
+"44221","Cuyahoga Falls","OH","41.141456","-81.47928","-5","1"
+"44222","Cuyahoga Falls","OH","41.128705","-81.53999","-5","1"
+"44223","Cuyahoga Falls","OH","41.1486","-81.51241","-5","1"
+"44224","Stow","OH","41.174256","-81.43744","-5","1"
+"44230","Doylestown","OH","40.964111","-81.68961","-5","1"
+"44231","Garrettsville","OH","41.295898","-81.08057","-5","1"
+"44232","Green","OH","40.932506","-81.461987","-5","1"
+"44233","Hinckley","OH","41.233479","-81.73475","-5","1"
+"44234","Hiram","OH","41.337187","-81.16699","-5","1"
+"44235","Homerville","OH","41.028815","-82.11496","-5","1"
+"44236","Hudson","OH","41.248795","-81.44679","-5","1"
+"44237","Hudson","OH","41.128705","-81.53999","-5","1"
+"44238","Hudson","OH","41.128705","-81.53999","-5","1"
+"44240","Kent","OH","41.148756","-81.35302","-5","1"
+"44241","Streetsboro","OH","41.249405","-81.34404","-5","1"
+"44242","Kent","OH","41.170006","-81.196615","-5","1"
+"44243","Kent","OH","41.146862","-81.3388","-5","1"
+"44250","Lakemore","OH","41.020256","-81.4359","-5","1"
+"44251","Westfield Center","OH","41.029639","-81.93146","-5","1"
+"44253","Litchfield","OH","41.161459","-82.03333","-5","1"
+"44254","Lodi","OH","41.039394","-82.0137","-5","1"
+"44255","Mantua","OH","41.286755","-81.22911","-5","1"
+"44256","Medina","OH","41.139849","-81.85646","-5","1"
+"44258","Medina","OH","41.127594","-81.841079","-5","1"
+"44260","Mogadore","OH","41.043123","-81.36518","-5","1"
+"44262","Munroe Falls","OH","41.138806","-81.43787","-5","1"
+"44264","Peninsula","OH","41.234388","-81.55114","-5","1"
+"44265","Randolph","OH","41.010907","-81.297727","-5","1"
+"44266","Ravenna","OH","41.159224","-81.23143","-5","1"
+"44270","Rittman","OH","40.971727","-81.77938","-5","1"
+"44272","Rootstown","OH","41.09464","-81.19784","-5","1"
+"44273","Seville","OH","41.022387","-81.8775","-5","1"
+"44274","Sharon Center","OH","41.09924","-81.734329","-5","1"
+"44275","Spencer","OH","41.101909","-82.10234","-5","1"
+"44276","Sterling","OH","40.951253","-81.82651","-5","1"
+"44278","Tallmadge","OH","41.093156","-81.42692","-5","1"
+"44280","Valley City","OH","41.230745","-81.92477","-5","1"
+"44281","Wadsworth","OH","41.037664","-81.73368","-5","1"
+"44282","Wadsworth","OH","41.132725","-81.929185","-5","1"
+"44285","Wayland","OH","41.159706","-81.070017","-5","1"
+"44286","Richfield","OH","41.233722","-81.63222","-5","1"
+"44287","West Salem","OH","40.957955","-82.12114","-5","1"
+"44288","Windham","OH","41.242864","-81.07101","-5","1"
+"44301","Akron","OH","41.043955","-81.51919","-5","1"
+"44302","Akron","OH","41.089405","-81.53973","-5","1"
+"44303","Akron","OH","41.103205","-81.53625","-5","1"
+"44304","Akron","OH","41.081788","-81.50745","-5","1"
+"44305","Akron","OH","41.073606","-81.46278","-5","1"
+"44306","Akron","OH","41.046055","-81.49039","-5","1"
+"44307","Akron","OH","41.069605","-81.54591","-5","1"
+"44308","Akron","OH","41.081755","-81.51813","-5","1"
+"44309","Akron","OH","41.096205","-81.512338","-5","1"
+"44310","Akron","OH","41.107655","-81.50091","-5","1"
+"44311","Akron","OH","41.063055","-81.51906","-5","1"
+"44312","Akron","OH","41.034156","-81.43944","-5","1"
+"44313","Akron","OH","41.123588","-81.57129","-5","1"
+"44314","Akron","OH","41.040155","-81.55914","-5","1"
+"44315","Akron","OH","41.027977","-81.463238","-5","1"
+"44316","Akron","OH","41.067506","-81.484686","-5","1"
+"44317","Akron","OH","41.052455","-81.529139","-5","1"
+"44319","Akron","OH","40.990922","-81.52953","-5","1"
+"44320","Akron","OH","41.083155","-81.57022","-5","1"
+"44321","Akron","OH","41.102587","-81.65092","-5","1"
+"44322","Akron","OH","41.043496","-81.58536","-5","1"
+"44325","Akron","OH","41.076425","-81.51026","-5","1"
+"44326","Akron","OH","41.172713","-81.472701","-5","1"
+"44328","Akron","OH","41.075955","-81.520588","-5","1"
+"44331","Paint","OH","40.683695","-81.674717","-5","1"
+"44333","Akron","OH","41.144661","-81.61948","-5","1"
+"44334","Akron","OH","41.128705","-81.53999","-5","1"
+"44372","Akron","OH","41.128705","-81.53999","-5","1"
+"44393","Akron","OH","41.128705","-81.53999","-5","1"
+"44396","Akron","OH","41.128705","-81.53999","-5","1"
+"44397","Akron","OH","41.071603","-81.525556","-5","1"
+"44398","Akron","OH","41.128705","-81.53999","-5","1"
+"44399","Akron","OH","41.128705","-81.53999","-5","1"
+"44401","Berlin Center","OH","41.031141","-80.95058","-5","1"
+"44402","Bristolville","OH","41.385826","-80.87487","-5","1"
+"44403","Brookfield","OH","41.239987","-80.58346","-5","1"
+"44404","Burghill","OH","41.340211","-80.536","-5","1"
+"44405","Campbell","OH","41.078058","-80.59243","-5","1"
+"44406","Canfield","OH","41.029666","-80.76396","-5","1"
+"44408","Columbiana","OH","40.884299","-80.68652","-5","1"
+"44410","Cortland","OH","41.333312","-80.7264","-5","1"
+"44411","Deerfield","OH","41.024608","-81.05025","-5","1"
+"44412","Diamond","OH","41.099351","-81.00605","-5","1"
+"44413","East Palestine","OH","40.838456","-80.54601","-5","1"
+"44415","Elkton","OH","40.76304","-80.704245","-5","1"
+"44416","Ellsworth","OH","41.017082","-80.802854","-5","1"
+"44417","Farmdale","OH","41.428487","-80.65551","-5","1"
+"44418","Fowler","OH","41.304391","-80.60358","-5","1"
+"44420","Girard","OH","41.160758","-80.693","-5","1"
+"44422","Greenford","OH","41.017082","-80.802854","-5","1"
+"44423","Hanoverton","OH","40.75105","-80.91009","-5","1"
+"44424","Hartford","OH","41.309096","-80.584681","-5","1"
+"44425","Hubbard","OH","41.166743","-80.57733","-5","1"
+"44427","Kensington","OH","40.723803","-80.94874","-5","1"
+"44428","Kinsman","OH","41.443358","-80.58862","-5","1"
+"44429","Lake Milton","OH","41.100329","-80.9853","-5","1"
+"44430","Leavittsburg","OH","41.24168","-80.88588","-5","1"
+"44431","Leetonia","OH","40.864494","-80.75848","-5","1"
+"44432","Lisbon","OH","40.757793","-80.7642","-5","1"
+"44436","Lowellville","OH","41.046606","-80.54145","-5","1"
+"44437","McDonald","OH","41.159574","-80.73083","-5","1"
+"44438","Masury","OH","41.22832","-80.53175","-5","1"
+"44439","Mesopotamia","OH","41.459359","-80.942716","-5","1"
+"44440","Mineral Ridge","OH","41.146334","-80.77271","-5","1"
+"44441","Negley","OH","40.776151","-80.54967","-5","1"
+"44442","New Middletown","OH","40.966908","-80.55862","-5","1"
+"44443","New Springfield","OH","40.917556","-80.60039","-5","1"
+"44444","Newton Falls","OH","41.188981","-80.96964","-5","1"
+"44445","New Waterford","OH","40.842848","-80.61956","-5","1"
+"44446","Niles","OH","41.186257","-80.75297","-5","1"
+"44449","North Benton","OH","40.992991","-81.02595","-5","1"
+"44450","North Bloomfield","OH","41.449052","-80.81921","-5","1"
+"44451","North Jackson","OH","41.090089","-80.86736","-5","1"
+"44452","North Lima","OH","40.951859","-80.6549","-5","1"
+"44453","Orangeville","OH","41.32519","-80.533572","-5","1"
+"44454","Petersburg","OH","40.910669","-80.53069","-5","1"
+"44455","Rogers","OH","40.787331","-80.61034","-5","1"
+"44460","Salem","OH","40.898658","-80.86094","-5","1"
+"44470","Southington","OH","41.294453","-80.9552","-5","1"
+"44471","Struthers","OH","41.051255","-80.59512","-5","1"
+"44473","Vienna","OH","41.236248","-80.66265","-5","1"
+"44481","Warren","OH","41.205342","-80.85756","-5","1"
+"44482","Warren","OH","41.317424","-80.761269","-5","1"
+"44483","Warren","OH","41.252748","-80.80773","-5","1"
+"44484","Warren","OH","41.226957","-80.76475","-5","1"
+"44485","Warren","OH","41.237856","-80.84356","-5","1"
+"44486","Warren","OH","41.317424","-80.761269","-5","1"
+"44487","Warren","OH","41.317424","-80.761269","-5","1"
+"44488","Warren","OH","41.317424","-80.761269","-5","1"
+"44490","Washingtonville","OH","40.899731","-80.76333","-5","1"
+"44491","West Farmington","OH","41.369527","-80.96327","-5","1"
+"44492","West Point","OH","40.709282","-80.70141","-5","1"
+"44493","Winona","OH","40.828584","-80.896714","-5","1"
+"44501","Youngstown","OH","41.017082","-80.802854","-5","1"
+"44502","Youngstown","OH","41.086279","-80.64563","-5","1"
+"44503","Youngstown","OH","41.100296","-80.64962","-5","1"
+"44504","Youngstown","OH","41.123757","-80.65481","-5","1"
+"44505","Youngstown","OH","41.122524","-80.62043","-5","1"
+"44506","Youngstown","OH","41.095658","-80.62652","-5","1"
+"44507","Youngstown","OH","41.074508","-80.65562","-5","1"
+"44509","Youngstown","OH","41.106249","-80.69471","-5","1"
+"44510","Youngstown","OH","41.120507","-80.66811","-5","1"
+"44511","Youngstown","OH","41.069158","-80.69134","-5","1"
+"44512","Youngstown","OH","41.032675","-80.66467","-5","1"
+"44513","Youngstown","OH","41.017082","-80.802854","-5","1"
+"44514","Youngstown","OH","41.016159","-80.61549","-5","1"
+"44515","Youngstown","OH","41.099008","-80.74545","-5","1"
+"44555","Youngstown","OH","41.103858","-80.643646","-5","1"
+"44598","Youngstown","OH","41.017082","-80.802854","-5","1"
+"44599","Youngstown","OH","41.017082","-80.802854","-5","1"
+"44601","Alliance","OH","40.917908","-81.11641","-5","1"
+"44606","Apple Creek","OH","40.739199","-81.80457","-5","1"
+"44607","Augusta","OH","40.686028","-81.02187","-5","1"
+"44608","Beach City","OH","40.65151","-81.58475","-5","1"
+"44609","Beloit","OH","40.898618","-80.99304","-5","1"
+"44610","Berlin","OH","40.561587","-81.7981","-5","1"
+"44611","Big Prairie","OH","40.635332","-82.08743","-5","1"
+"44612","Bolivar","OH","40.643724","-81.45442","-5","1"
+"44613","Brewster","OH","40.712109","-81.59859","-5","1"
+"44614","Canal Fulton","OH","40.886688","-81.58327","-5","1"
+"44615","Carrollton","OH","40.568568","-81.08187","-5","1"
+"44617","Charm","OH","40.507088","-81.782872","-5","1"
+"44618","Dalton","OH","40.787827","-81.68623","-5","1"
+"44619","Damascus","OH","40.901738","-80.95723","-5","1"
+"44620","Dellroy","OH","40.571372","-81.21163","-5","1"
+"44621","Dennison","OH","40.410604","-81.31633","-5","1"
+"44622","Dover","OH","40.537509","-81.48791","-5","1"
+"44624","Dundee","OH","40.600062","-81.65174","-5","1"
+"44625","East Rochester","OH","40.758473","-81.00795","-5","1"
+"44626","East Sparta","OH","40.695377","-81.38102","-5","1"
+"44627","Fredericksburg","OH","40.671036","-81.84927","-5","1"
+"44628","Glenmont","OH","40.527648","-82.14312","-5","1"
+"44629","Gnadenhutten","OH","40.359172","-81.4351","-5","1"
+"44630","Greentown","OH","40.929507","-81.400134","-5","1"
+"44631","Harlem Springs","OH","40.521924","-81.003619","-5","1"
+"44632","Hartville","OH","40.96289","-81.32814","-5","1"
+"44633","Holmesville","OH","40.630191","-81.93057","-5","1"
+"44634","Homeworth","OH","40.832092","-81.0573","-5","1"
+"44636","Kidron","OH","40.738387","-81.742811","-5","1"
+"44637","Killbuck","OH","40.485312","-82.01209","-5","1"
+"44638","Lakeville","OH","40.657511","-82.13584","-5","1"
+"44639","Leesville","OH","40.547688","-81.243498","-5","1"
+"44640","Limaville","OH","40.983308","-81.14682","-5","1"
+"44641","Louisville","OH","40.843685","-81.26298","-5","1"
+"44643","Magnolia","OH","40.646529","-81.30882","-5","1"
+"44644","Malvern","OH","40.68357","-81.17453","-5","1"
+"44645","Marshallville","OH","40.909535","-81.71764","-5","1"
+"44646","Massillon","OH","40.805131","-81.50101","-5","1"
+"44647","Massillon","OH","40.793924","-81.55252","-5","1"
+"44648","Massillon","OH","40.811809","-81.368284","-5","1"
+"44650","Maximo","OH","40.874558","-81.173873","-5","1"
+"44651","Mechanicstown","OH","40.623637","-80.96214","-5","1"
+"44652","Middlebranch","OH","40.895057","-81.326195","-5","1"
+"44653","Midvale","OH","40.433496","-81.3731","-5","1"
+"44654","Millersburg","OH","40.542339","-81.87856","-5","1"
+"44656","Mineral City","OH","40.569177","-81.3359","-5","1"
+"44657","Minerva","OH","40.733459","-81.09148","-5","1"
+"44659","Mount Eaton","OH","40.694887","-81.70227","-5","1"
+"44660","Mount Hope","OH","40.622284","-81.782532","-5","1"
+"44661","Nashville","OH","40.596018","-82.11317","-5","1"
+"44662","Navarre","OH","40.722891","-81.54071","-5","1"
+"44663","New Philadelphia","OH","40.477187","-81.44439","-5","1"
+"44665","North Georgetown","OH","40.843563","-80.979435","-5","1"
+"44666","North Lawrence","OH","40.840256","-81.62724","-5","1"
+"44667","Orrville","OH","40.835059","-81.77006","-5","1"
+"44669","Paris","OH","40.798758","-81.16037","-5","1"
+"44670","Robertsville","OH","40.76291","-81.19054","-5","1"
+"44671","Sandyville","OH","40.641188","-81.36885","-5","1"
+"44672","Sebring","OH","40.922608","-81.02632","-5","1"
+"44675","Sherrodsville","OH","40.506928","-81.24133","-5","1"
+"44676","Shreve","OH","40.687973","-82.02563","-5","1"
+"44677","Smithville","OH","40.865194","-81.85967","-5","1"
+"44678","Somerdale","OH","40.565209","-81.35014","-5","1"
+"44679","Stillwater","OH","40.440407","-81.488516","-5","1"
+"44680","Strasburg","OH","40.59712","-81.53098","-5","1"
+"44681","Sugarcreek","OH","40.503332","-81.64879","-5","1"
+"44682","Tuscarawas","OH","40.397916","-81.40527","-5","1"
+"44683","Uhrichsville","OH","40.373604","-81.34146","-5","1"
+"44684","Walnut Creek","OH","40.561693","-81.677906","-5","1"
+"44685","Uniontown","OH","40.961206","-81.42516","-5","1"
+"44687","Walnut Creek","OH","40.551575","-81.728416","-5","1"
+"44688","Waynesburg","OH","40.67926","-81.26003","-5","1"
+"44689","Wilmot","OH","40.655909","-81.63929","-5","1"
+"44690","Winesburg","OH","40.616646","-81.6953","-5","1"
+"44691","Wooster","OH","40.800086","-81.95726","-5","1"
+"44692","Tuscarawas","OH","40.398664","-81.40088","-5","1"
+"44693","Deersville","OH","40.308212","-81.18752","-5","1"
+"44695","Bowerston","OH","40.433246","-81.18764","-5","1"
+"44697","Zoar","OH","40.612253","-81.42168","-5","1"
+"44699","Tippecanoe","OH","40.283493","-81.28215","-5","1"
+"44701","Canton","OH","40.782408","-81.371185","-5","1"
+"44702","Canton","OH","40.798859","-81.37499","-5","1"
+"44703","Canton","OH","40.809108","-81.3809","-5","1"
+"44704","Canton","OH","40.799358","-81.3564","-5","1"
+"44705","Canton","OH","40.821858","-81.34253","-5","1"
+"44706","Canton","OH","40.776858","-81.40593","-5","1"
+"44707","Canton","OH","40.784158","-81.36566","-5","1"
+"44708","Canton","OH","40.810931","-81.42142","-5","1"
+"44709","Canton","OH","40.836508","-81.38548","-5","1"
+"44710","Canton","OH","40.791108","-81.41672","-5","1"
+"44711","Canton","OH","40.811809","-81.368284","-5","1"
+"44712","Canton","OH","40.811809","-81.368284","-5","1"
+"44714","Canton","OH","40.827659","-81.36029","-5","1"
+"44718","Canton","OH","40.850683","-81.43773","-5","1"
+"44720","Canton","OH","40.888408","-81.41066","-5","1"
+"44721","Canton","OH","40.886297","-81.33145","-5","1"
+"44730","Canton","OH","40.769763","-81.2707","-5","1"
+"44735","Canton","OH","40.811809","-81.368284","-5","1"
+"44750","Canton","OH","40.784646","-81.418943","-5","1"
+"44760","Canton","OH","40.853958","-81.42778","-5","1"
+"44767","Canton","OH","40.895721","-81.424552","-5","1"
+"44798","Canton","OH","40.811809","-81.368284","-5","1"
+"44799","Canton","OH","40.811809","-81.368284","-5","1"
+"44801","Adrian","OH","41.090712","-83.365404","-5","1"
+"44802","Alvada","OH","41.053889","-83.41412","-5","1"
+"44803","Amsden","OH","41.037511","-82.910552","-5","1"
+"44804","Arcadia","OH","41.117339","-83.52652","-5","1"
+"44805","Ashland","OH","40.867016","-82.31514","-5","1"
+"44807","Attica","OH","41.069216","-82.87708","-5","1"
+"44809","Bascom","OH","41.132988","-83.28328","-5","1"
+"44811","Bellevue","OH","41.257163","-82.84296","-5","1"
+"44813","Bellville","OH","40.606221","-82.52073","-5","1"
+"44814","Berlin Heights","OH","41.323499","-82.4692","-5","1"
+"44815","Bettsville","OH","41.244095","-83.23348","-5","1"
+"44816","Birmingham","OH","41.331398","-82.35278","-5","1"
+"44817","Bloomdale","OH","41.193747","-83.54226","-5","1"
+"44818","Bloomville","OH","41.00811","-82.99772","-5","1"
+"44820","Bucyrus","OH","40.815179","-82.97091","-5","1"
+"44822","Butler","OH","40.561377","-82.41237","-5","1"
+"44824","Castalia","OH","41.393507","-82.80569","-5","1"
+"44825","Chatfield","OH","40.952927","-82.94232","-5","1"
+"44826","Collins","OH","41.227648","-82.48061","-5","1"
+"44827","Crestline","OH","40.795521","-82.74991","-5","1"
+"44828","Flat Rock","OH","41.234403","-82.86059","-5","1"
+"44830","Fostoria","OH","41.164209","-83.41054","-5","1"
+"44833","Galion","OH","40.720869","-82.797","-5","1"
+"44836","Green Springs","OH","41.249374","-83.05827","-5","1"
+"44837","Greenwich","OH","41.020433","-82.50097","-5","1"
+"44838","Hayesville","OH","40.773052","-82.26175","-5","1"
+"44839","Huron","OH","41.388534","-82.5568","-5","1"
+"44840","Jeromesville","OH","40.801432","-82.18712","-5","1"
+"44841","Kansas","OH","41.249535","-83.2966","-5","1"
+"44842","Loudonville","OH","40.639849","-82.2246","-5","1"
+"44843","Lucas","OH","40.701792","-82.41177","-5","1"
+"44844","McCutchenville","OH","40.990406","-83.26087","-5","1"
+"44845","Melmore","OH","41.024204","-83.109783","-5","1"
+"44846","Milan","OH","41.306205","-82.60611","-5","1"
+"44847","Monroeville","OH","41.238863","-82.70909","-5","1"
+"44848","Nankin","OH","40.920617","-82.281695","-5","1"
+"44849","Nevada","OH","40.815261","-83.13144","-5","1"
+"44850","New Haven","OH","41.034683","-82.68056","-5","1"
+"44851","New London","OH","41.098478","-82.40483","-5","1"
+"44853","New Riegel","OH","41.057873","-83.29505","-5","1"
+"44854","New Washington","OH","40.954399","-82.85436","-5","1"
+"44855","North Fairfield","OH","41.100202","-82.60887","-5","1"
+"44856","North Robinson","OH","40.792804","-82.85759","-5","1"
+"44857","Norwalk","OH","41.236357","-82.60185","-5","1"
+"44858","Norwalk","OH","41.261375","-82.589042","-5","1"
+"44859","Nova","OH","41.019566","-82.33622","-5","1"
+"44860","Oceola","OH","40.845335","-83.09269","-5","1"
+"44861","Old Fort","OH","41.240649","-83.15","-5","1"
+"44862","Ontario","OH","40.772874","-82.532057","-5","1"
+"44864","Perrysville","OH","40.66496","-82.31994","-5","1"
+"44865","Plymouth","OH","40.99388","-82.67743","-5","1"
+"44866","Polk","OH","40.906577","-82.18985","-5","1"
+"44867","Republic","OH","41.140139","-82.99802","-5","1"
+"44870","Sandusky","OH","41.42646","-82.71083","-5","1"
+"44871","Sandusky","OH","41.49181","-82.647824","-5","1"
+"44874","Savannah","OH","40.963743","-82.36547","-5","1"
+"44875","Shelby","OH","40.888988","-82.65598","-5","1"
+"44878","Shiloh","OH","40.949737","-82.52995","-5","1"
+"44880","Sullivan","OH","41.038842","-82.21779","-5","1"
+"44881","Sulphur Springs","OH","40.868645","-82.875027","-5","1"
+"44882","Sycamore","OH","40.953556","-83.14177","-5","1"
+"44883","Tiffin","OH","41.12071","-83.17658","-5","1"
+"44887","Tiro","OH","40.90261","-82.78885","-5","1"
+"44888","Willard","OH","41.141541","-82.588928","-5","1"
+"44889","Wakeman","OH","41.24323","-82.38848","-5","1"
+"44890","Willard","OH","41.073672","-82.72435","-5","1"
+"44901","Mansfield","OH","40.850833","-82.511369","-5","1"
+"44902","Mansfield","OH","40.759156","-82.51118","-5","1"
+"44903","Mansfield","OH","40.766589","-82.51869","-5","1"
+"44904","Mansfield","OH","40.678208","-82.58207","-5","1"
+"44905","Mansfield","OH","40.773556","-82.47612","-5","1"
+"44906","Mansfield","OH","40.766056","-82.56749","-5","1"
+"44907","Mansfield","OH","40.733243","-82.51975","-5","1"
+"44999","Mansfield","OH","40.772874","-82.532057","-5","1"
+"45000","North Bend","OH","39.147991","-84.739682","-5","1"
+"45001","Addyston","OH","39.137818","-84.7079","-5","1"
+"45002","Cleves","OH","39.180358","-84.73783","-5","1"
+"45003","College Corner","OH","39.575126","-84.7905","-5","1"
+"45004","Collinsville","OH","39.440956","-84.575746","-5","1"
+"45005","Franklin","OH","39.550241","-84.3087","-5","1"
+"45010","Catawba","OH","39.999367","-83.619892","-5","1"
+"45011","Hamilton","OH","39.404856","-84.52271","-5","1"
+"45012","Hamilton","OH","39.440956","-84.575746","-5","1"
+"45013","Hamilton","OH","39.409188","-84.60321","-5","1"
+"45014","Fairfield","OH","39.330356","-84.55277","-5","1"
+"45015","Hamilton","OH","39.367106","-84.55053","-5","1"
+"45018","Fairfield","OH","39.440956","-84.575746","-5","1"
+"45020","Hamilton","OH","39.440956","-84.575746","-5","1"
+"45023","Hamilton","OH","39.440956","-84.575746","-5","1"
+"45025","Hamilton","OH","39.440956","-84.575746","-5","1"
+"45026","Hamilton","OH","39.440956","-84.575746","-5","1"
+"45030","Harrison","OH","39.257936","-84.77001","-5","1"
+"45032","Harveysburg","OH","39.499635","-84.00579","-5","1"
+"45033","Hooven","OH","39.177002","-84.76337","-5","1"
+"45034","Kings Mills","OH","39.359268","-84.24898","-5","1"
+"45036","Lebanon","OH","39.440152","-84.22175","-5","1"
+"45039","Maineville","OH","39.317735","-84.24728","-5","1"
+"45040","Mason","OH","39.344258","-84.3152","-5","1"
+"45041","Miamitown","OH","39.213282","-84.70421","-5","1"
+"45042","Middletown","OH","39.534907","-84.39324","-5","1"
+"45043","Middletown","OH","39.440956","-84.575746","-5","1"
+"45044","Middletown","OH","39.482957","-84.38393","-5","1"
+"45050","Monroe","OH","39.441008","-84.36582","-5","1"
+"45051","Mount Saint Joseph","OH","39.09646","-84.643096","-5","1"
+"45052","North Bend","OH","39.155158","-84.77789","-5","1"
+"45053","Okeana","OH","39.352687","-84.78591","-5","1"
+"45054","Oregonia","OH","39.44415","-84.06299","-5","1"
+"45055","Overpeck","OH","39.451806","-84.515245","-5","1"
+"45056","Oxford","OH","39.498751","-84.7407","-5","1"
+"45061","Ross","OH","39.31235","-84.64828","-5","1"
+"45062","Seven Mile","OH","39.480856","-84.55382","-5","1"
+"45063","Shandon","OH","39.325805","-84.712099","-5","1"
+"45064","Somerville","OH","39.562415","-84.6169","-5","1"
+"45065","South Lebanon","OH","39.371242","-84.21132","-5","1"
+"45066","Springboro","OH","39.557096","-84.22688","-5","1"
+"45067","Trenton","OH","39.482307","-84.46429","-5","1"
+"45068","Waynesville","OH","39.525562","-84.06923","-5","1"
+"45069","West Chester","OH","39.343757","-84.40249","-5","1"
+"45070","West Elkton","OH","39.588878","-84.55562","-5","1"
+"45071","West Chester","OH","39.440956","-84.575746","-5","1"
+"45073","Monroe","OH","39.440956","-84.575746","-5","1"
+"45099","Monroe","OH","39.440956","-84.575746","-5","1"
+"45101","Aberdeen","OH","38.671655","-83.75693","-5","1"
+"45102","Amelia","OH","39.023067","-84.2099","-5","1"
+"45103","Batavia","OH","39.082894","-84.15319","-5","1"
+"45105","Bentonville","OH","38.749779","-83.612574","-5","1"
+"45106","Bethel","OH","38.956484","-84.08093","-5","1"
+"45107","Blanchester","OH","39.293634","-83.97584","-5","1"
+"45110","Buford","OH","39.074262","-83.848414","-5","1"
+"45111","Camp Dennison","OH","39.195516","-84.29093","-5","1"
+"45112","Chilo","OH","38.792686","-84.1386","-5","1"
+"45113","Clarksville","OH","39.397066","-83.98239","-5","1"
+"45114","Cuba","OH","39.362778","-83.86432","-5","1"
+"45115","Decatur","OH","38.815056","-83.7039","-5","1"
+"45118","Fayetteville","OH","39.184985","-83.95045","-5","1"
+"45119","Feesburg","OH","38.880632","-84.00874","-5","1"
+"45120","Felicity","OH","38.821032","-84.09805","-5","1"
+"45121","Georgetown","OH","38.87752","-83.90215","-5","1"
+"45122","Goshen","OH","39.222264","-84.11831","-5","1"
+"45123","Greenfield","OH","39.343559","-83.39748","-5","1"
+"45125","Union","OH","39.104387","-84.232422","-5","1"
+"45127","Columbia","OH","39.137761","-84.35214","-5","1"
+"45130","Hamersville","OH","38.914118","-83.99496","-5","1"
+"45131","Higginsport","OH","38.789585","-83.96705","-5","1"
+"45132","Highland","OH","39.344299","-83.59926","-5","1"
+"45133","Hillsboro","OH","39.162917","-83.5802","-5","1"
+"45135","Leesburg","OH","39.34446","-83.54825","-5","1"
+"45138","Lees Creek","OH","39.416747","-83.647583","-5","1"
+"45140","Loveland","OH","39.258653","-84.2651","-5","1"
+"45142","Lynchburg","OH","39.213112","-83.80743","-5","1"
+"45144","Manchester","OH","38.690566","-83.61925","-5","1"
+"45145","Marathon","OH","39.145698","-84.007023","-5","1"
+"45146","Martinsville","OH","39.32006","-83.79841","-5","1"
+"45147","Miamiville","OH","39.213739","-84.300232","-5","1"
+"45148","Midland","OH","39.290475","-83.88767","-5","1"
+"45150","Milford","OH","39.168818","-84.24995","-5","1"
+"45152","Morrow","OH","39.350319","-84.11606","-5","1"
+"45153","Moscow","OH","38.8702","-84.2025","-5","1"
+"45154","Mount Orab","OH","39.046589","-83.92245","-5","1"
+"45155","Mowrystown","OH","39.038055","-83.74936","-5","1"
+"45156","Neville","OH","38.810072","-84.21176","-5","1"
+"45157","New Richmond","OH","38.957385","-84.24755","-5","1"
+"45158","Newtonsville","OH","39.18779","-84.078313","-5","1"
+"45159","New Vienna","OH","39.326987","-83.68731","-5","1"
+"45160","Owensville","OH","39.121637","-84.13927","-5","1"
+"45162","Pleasant Plain","OH","39.276492","-84.08817","-5","1"
+"45164","Port William","OH","39.553045","-83.78346","-5","1"
+"45165","Greenfield","OH","39.198813","-83.607858","-5","1"
+"45166","Reesville","OH","39.480543","-83.677197","-5","1"
+"45167","Ripley","OH","38.763305","-83.8075","-5","1"
+"45168","Russellville","OH","38.850094","-83.77254","-5","1"
+"45169","Sabina","OH","39.507106","-83.6505","-5","1"
+"45171","Sardinia","OH","38.985368","-83.78542","-5","1"
+"45172","Sinking Spring","OH","39.074266","-83.38713","-5","1"
+"45174","Terrace Park","OH","39.161061","-84.30808","-5","1"
+"45176","Williamsburg","OH","39.081436","-84.02906","-5","1"
+"45177","Wilmington","OH","39.463476","-83.84446","-5","1"
+"45201","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45202","Cincinnati","OH","39.10441","-84.50774","-5","1"
+"45203","Cincinnati","OH","39.104127","-84.53067","-5","1"
+"45204","Cincinnati","OH","39.093345","-84.56428","-5","1"
+"45205","Cincinnati","OH","39.11071","-84.57438","-5","1"
+"45206","Cincinnati","OH","39.127527","-84.48832","-5","1"
+"45207","Cincinnati","OH","39.142246","-84.46983","-5","1"
+"45208","Cincinnati","OH","39.13786","-84.43426","-5","1"
+"45209","Cincinnati","OH","39.15406","-84.43086","-5","1"
+"45210","Cincinnati","OH","39.11226","-84.51439","-5","1"
+"45211","Cincinnati","OH","39.154159","-84.60527","-5","1"
+"45212","Cincinnati","OH","39.160693","-84.4545","-5","1"
+"45213","Cincinnati","OH","39.180893","-84.41881","-5","1"
+"45214","Cincinnati","OH","39.12056","-84.53575","-5","1"
+"45215","Cincinnati","OH","39.228859","-84.45707","-5","1"
+"45216","Cincinnati","OH","39.197109","-84.47991","-5","1"
+"45217","Cincinnati","OH","39.166948","-84.49514","-5","1"
+"45218","Cincinnati","OH","39.264791","-84.5175","-5","1"
+"45219","Cincinnati","OH","39.12721","-84.50988","-5","1"
+"45220","Cincinnati","OH","39.14426","-84.51986","-5","1"
+"45221","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45222","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45223","Cincinnati","OH","39.161859","-84.54259","-5","1"
+"45224","Cincinnati","OH","39.204959","-84.53734","-5","1"
+"45225","Cincinnati","OH","39.13741","-84.54112","-5","1"
+"45226","Cincinnati","OH","39.114911","-84.42526","-5","1"
+"45227","Cincinnati","OH","39.15201","-84.38348","-5","1"
+"45228","Cincinnati","OH","39.070561","-84.417891","-5","1"
+"45229","Cincinnati","OH","39.152093","-84.48899","-5","1"
+"45230","Cincinnati","OH","39.078368","-84.38865","-5","1"
+"45231","Cincinnati","OH","39.242608","-84.5453","-5","1"
+"45232","Cincinnati","OH","39.173409","-84.51295","-5","1"
+"45233","Cincinnati","OH","39.117065","-84.67173","-5","1"
+"45234","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45235","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45236","Cincinnati","OH","39.205109","-84.39512","-5","1"
+"45237","Cincinnati","OH","39.188859","-84.45798","-5","1"
+"45238","Cincinnati","OH","39.112169","-84.60849","-5","1"
+"45239","Cincinnati","OH","39.207558","-84.57299","-5","1"
+"45240","Cincinnati","OH","39.284806","-84.52941","-5","1"
+"45241","Cincinnati","OH","39.276271","-84.39324","-5","1"
+"45242","Cincinnati","OH","39.242559","-84.36042","-5","1"
+"45243","Cincinnati","OH","39.18466","-84.36014","-5","1"
+"45244","Cincinnati","OH","39.119161","-84.33389","-5","1"
+"45245","Cincinnati","OH","39.075329","-84.27311","-5","1"
+"45246","Cincinnati","OH","39.288558","-84.47383","-5","1"
+"45247","Cincinnati","OH","39.209208","-84.64363","-5","1"
+"45248","Cincinnati","OH","39.160159","-84.65042","-5","1"
+"45249","Cincinnati","OH","39.278295","-84.33049","-5","1"
+"45250","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45251","Cincinnati","OH","39.258124","-84.58733","-5","1"
+"45252","Cincinnati","OH","39.282824","-84.62514","-5","1"
+"45253","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45254","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45255","Cincinnati","OH","39.066112","-84.32227","-5","1"
+"45258","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45262","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45263","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45264","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45267","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45268","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45269","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45270","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45271","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45273","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45274","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45275","Cincinnati","OH","38.946921","-83.862877","-5","1"
+"45277","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45296","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45298","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45299","Cincinnati","OH","39.262158","-84.509268","-5","1"
+"45301","Alpha","OH","39.711173","-84.02323","-5","1"
+"45302","Anna","OH","40.40476","-84.19578","-5","1"
+"45303","Ansonia","OH","40.215278","-84.6477","-5","1"
+"45304","Arcanum","OH","39.990909","-84.53709","-5","1"
+"45305","Bellbrook","OH","39.640059","-84.0855","-5","1"
+"45306","Botkins","OH","40.464571","-84.18763","-5","1"
+"45307","Bowersville","OH","39.580198","-83.72363","-5","1"
+"45308","Bradford","OH","40.128652","-84.4433","-5","1"
+"45309","Brookville","OH","39.844538","-84.41774","-5","1"
+"45310","Burkettsville","OH","40.352158","-84.6448","-5","1"
+"45311","Camden","OH","39.629735","-84.67557","-5","1"
+"45312","Casstown","OH","40.0659","-84.08219","-5","1"
+"45314","Cedarville","OH","39.744577","-83.79697","-5","1"
+"45315","Clayton","OH","39.853674","-84.34125","-5","1"
+"45316","Clifton","OH","39.796992","-83.82609","-5","1"
+"45317","Conover","OH","40.170605","-84.02446","-5","1"
+"45318","Covington","OH","40.123474","-84.35433","-5","1"
+"45319","Donnelsville","OH","39.918936","-83.944909","-5","1"
+"45320","Eaton","OH","39.739353","-84.65393","-5","1"
+"45321","Eldorado","OH","39.888717","-84.67216","-5","1"
+"45322","Englewood","OH","39.877745","-84.30999","-5","1"
+"45323","Enon","OH","39.867259","-83.93512","-5","1"
+"45324","Fairborn","OH","39.808909","-84.01972","-5","1"
+"45325","Farmersville","OH","39.685116","-84.42307","-5","1"
+"45326","Fletcher","OH","40.144131","-84.10429","-5","1"
+"45327","Germantown","OH","39.628806","-84.37873","-5","1"
+"45328","Gettysburg","OH","40.112545","-84.49314","-5","1"
+"45329","Gordon","OH","40.135426","-84.619129","-5","1"
+"45330","Gratis","OH","39.647494","-84.52749","-5","1"
+"45331","Greenville","OH","40.094141","-84.63574","-5","1"
+"45332","Hollansburg","OH","39.998881","-84.79165","-5","1"
+"45333","Houston","OH","40.260111","-84.33611","-5","1"
+"45334","Jackson Center","OH","40.446467","-84.04389","-5","1"
+"45335","Jamestown","OH","39.62434","-83.74587","-5","1"
+"45336","Kettlersville","OH","40.438744","-84.26309","-5","1"
+"45337","Laura","OH","39.981075","-84.42201","-5","1"
+"45338","Lewisburg","OH","39.849859","-84.54428","-5","1"
+"45339","Ludlow Falls","OH","40.008648","-84.34143","-5","1"
+"45340","Maplewood","OH","40.372607","-84.05113","-5","1"
+"45341","Medway","OH","39.880826","-84.02364","-5","1"
+"45342","Miamisburg","OH","39.631525","-84.27074","-5","1"
+"45343","Miamisburg","OH","39.750471","-84.268593","-5","1"
+"45344","New Carlisle","OH","39.939925","-84.01992","-5","1"
+"45345","New Lebanon","OH","39.743766","-84.39256","-5","1"
+"45346","New Madison","OH","39.971929","-84.70471","-5","1"
+"45347","New Paris","OH","39.876255","-84.77788","-5","1"
+"45348","New Weston","OH","40.332705","-84.65016","-5","1"
+"45349","North Hampton","OH","39.990945","-83.94049","-5","1"
+"45350","North Star","OH","40.135426","-84.619129","-5","1"
+"45351","Osgood","OH","40.339356","-84.49597","-5","1"
+"45352","Palestine","OH","40.050308","-84.74442","-5","1"
+"45353","Pemberton","OH","40.294031","-84.03271","-5","1"
+"45354","Phillipsburg","OH","39.904603","-84.40163","-5","1"
+"45356","Piqua","OH","40.156514","-84.24213","-5","1"
+"45358","Pitsburg","OH","39.986011","-84.48651","-5","1"
+"45359","Pleasant Hill","OH","40.053483","-84.35202","-5","1"
+"45360","Port Jefferson","OH","40.330423","-84.09097","-5","1"
+"45361","Potsdam","OH","39.963492","-84.414484","-5","1"
+"45362","Rossburg","OH","40.28577","-84.63891","-5","1"
+"45363","Russia","OH","40.233304","-84.40459","-5","1"
+"45365","Sidney","OH","40.284855","-84.15974","-5","1"
+"45367","Sidney","OH","40.333611","-84.218308","-5","1"
+"45368","South Charleston","OH","39.840367","-83.65813","-5","1"
+"45369","South Vienna","OH","39.942716","-83.60235","-5","1"
+"45370","Spring Valley","OH","39.600367","-84.02586","-5","1"
+"45371","Tipp City","OH","39.954239","-84.17685","-5","1"
+"45372","Tremont City","OH","40.013871","-83.83325","-5","1"
+"45373","Troy","OH","40.036525","-84.20629","-5","1"
+"45374","Troy","OH","40.03997","-84.229799","-5","1"
+"45377","Vandalia","OH","39.889356","-84.2051","-5","1"
+"45378","Verona","OH","39.903161","-84.48822","-5","1"
+"45380","Versailles","OH","40.231735","-84.49935","-5","1"
+"45381","West Alexandria","OH","39.730506","-84.53052","-5","1"
+"45382","West Manchester","OH","39.903258","-84.62255","-5","1"
+"45383","West Milton","OH","39.958117","-84.33335","-5","1"
+"45384","Wilberforce","OH","39.712772","-83.88014","-5","1"
+"45385","Xenia","OH","39.682836","-83.92144","-5","1"
+"45387","Yellow Springs","OH","39.797227","-83.89239","-5","1"
+"45388","Yorkshire","OH","40.328535","-84.47938","-5","1"
+"45389","Christiansburg","OH","40.055737","-84.02525","-5","1"
+"45390","Union City","OH","40.20451","-84.78292","-5","1"
+"45401","Dayton","OH","39.750471","-84.268593","-5","1"
+"45402","Dayton","OH","39.757758","-84.18848","-5","1"
+"45403","Dayton","OH","39.762708","-84.15294","-5","1"
+"45404","Dayton","OH","39.783258","-84.16342","-5","1"
+"45405","Dayton","OH","39.788458","-84.21111","-5","1"
+"45406","Dayton","OH","39.784108","-84.23841","-5","1"
+"45407","Dayton","OH","39.760058","-84.22011","-5","1"
+"45408","Dayton","OH","39.741558","-84.22362","-5","1"
+"45409","Dayton","OH","39.725705","-84.18927","-5","1"
+"45410","Dayton","OH","39.748309","-84.15893","-5","1"
+"45412","Dayton","OH","39.750471","-84.268593","-5","1"
+"45413","Dayton","OH","39.750471","-84.268593","-5","1"
+"45414","Dayton","OH","39.820807","-84.19381","-5","1"
+"45415","Dayton","OH","39.837256","-84.26016","-5","1"
+"45416","Dayton","OH","39.805207","-84.25804","-5","1"
+"45417","Dayton","OH","39.753108","-84.24715","-5","1"
+"45418","Dayton","OH","39.716161","-84.2734","-5","1"
+"45419","Dayton","OH","39.713309","-84.16523","-5","1"
+"45420","Dayton","OH","39.723909","-84.13453","-5","1"
+"45422","Dayton","OH","39.758058","-84.20009","-5","1"
+"45423","Dayton","OH","39.750471","-84.268593","-5","1"
+"45424","Dayton","OH","39.840308","-84.12227","-5","1"
+"45426","Dayton","OH","39.802606","-84.30196","-5","1"
+"45427","Dayton","OH","39.755758","-84.27867","-5","1"
+"45428","Dayton","OH","39.746656","-84.259292","-5","1"
+"45429","Dayton","OH","39.687459","-84.15595","-5","1"
+"45430","Dayton","OH","39.710787","-84.08192","-5","1"
+"45431","Dayton","OH","39.765259","-84.10262","-5","1"
+"45432","Dayton","OH","39.74035","-84.09306","-5","1"
+"45433","Dayton","OH","39.813743","-84.05898","-5","1"
+"45434","Dayton","OH","39.719092","-84.03808","-5","1"
+"45435","Dayton","OH","39.750471","-84.268593","-5","1"
+"45437","Dayton","OH","39.750471","-84.268593","-5","1"
+"45439","Dayton","OH","39.695702","-84.21688","-5","1"
+"45440","Dayton","OH","39.674192","-84.11029","-5","1"
+"45441","Dayton","OH","39.750471","-84.268593","-5","1"
+"45448","Dayton","OH","39.750471","-84.268593","-5","1"
+"45449","Dayton","OH","39.664226","-84.24201","-5","1"
+"45454","Dayton","OH","39.750471","-84.268593","-5","1"
+"45458","Dayton","OH","39.60828","-84.16413","-5","1"
+"45459","Dayton","OH","39.644609","-84.16931","-5","1"
+"45463","Dayton","OH","39.750471","-84.268593","-5","1"
+"45469","Dayton","OH","39.740509","-84.178939","-5","1"
+"45470","Dayton","OH","39.750471","-84.268593","-5","1"
+"45475","Dayton","OH","39.750471","-84.268593","-5","1"
+"45479","Dayton","OH","39.734409","-84.194389","-5","1"
+"45481","Dayton","OH","39.750471","-84.268593","-5","1"
+"45482","Dayton","OH","39.750471","-84.268593","-5","1"
+"45490","Dayton","OH","39.750471","-84.268593","-5","1"
+"45501","Springfield","OH","39.927059","-83.813228","-5","1"
+"45502","Springfield","OH","39.926617","-83.8128","-5","1"
+"45503","Springfield","OH","39.94831","-83.78205","-5","1"
+"45504","Springfield","OH","39.941827","-83.83702","-5","1"
+"45505","Springfield","OH","39.91086","-83.78579","-5","1"
+"45506","Springfield","OH","39.910109","-83.83243","-5","1"
+"45553","West Union","OH","38.782131","-83.558044","-5","1"
+"45601","Chillicothe","OH","39.33046","-82.97228","-5","1"
+"45612","Bainbridge","OH","39.228796","-83.28641","-5","1"
+"45613","Beaver","OH","39.015223","-82.84927","-5","1"
+"45614","Bidwell","OH","38.919179","-82.29337","-5","1"
+"45616","Blue Creek","OH","38.789223","-83.3192","-5","1"
+"45617","Bourneville","OH","39.280388","-83.158991","-5","1"
+"45618","Cherry Fork","OH","38.892198","-83.621787","-5","1"
+"45619","Chesapeake","OH","38.448563","-82.44553","-5","1"
+"45620","Cheshire","OH","38.943285","-82.13589","-5","1"
+"45621","Coalton","OH","39.111094","-82.61105","-5","1"
+"45622","Creola","OH","39.364574","-82.4959","-5","1"
+"45623","Crown City","OH","38.630633","-82.2697","-5","1"
+"45624","Cynthiana","OH","39.172214","-83.34842","-5","1"
+"45628","Frankfort","OH","39.390231","-83.19363","-5","1"
+"45629","Franklin Furnace","OH","38.653909","-82.82535","-5","1"
+"45630","Friendship","OH","38.793335","-82.96046","-5","1"
+"45631","Gallipolis","OH","38.825478","-82.22755","-5","1"
+"45633","Hallsville","OH","39.46557","-82.747853","-5","1"
+"45634","Hamden","OH","39.171012","-82.50017","-5","1"
+"45636","Haverhill","OH","38.592446","-82.828817","-5","1"
+"45638","Ironton","OH","38.535109","-82.6737","-5","1"
+"45640","Jackson","OH","39.034226","-82.63678","-5","1"
+"45641","Morgan","OH","38.967813","-82.220469","-5","1"
+"45642","Jasper","OH","39.047577","-83.05382","-5","1"
+"45643","Kerr","OH","38.86833","-82.256185","-5","1"
+"45644","Kingston","OH","39.459353","-82.87777","-5","1"
+"45645","Kitts Hill","OH","38.557052","-82.53744","-5","1"
+"45646","Latham","OH","39.086218","-83.31764","-5","1"
+"45647","Londonderry","OH","39.282411","-82.76457","-5","1"
+"45648","Lucasville","OH","38.911803","-82.98836","-5","1"
+"45650","Lynx","OH","38.746506","-83.40878","-5","1"
+"45651","McArthur","OH","39.267049","-82.46415","-5","1"
+"45652","McDermott","OH","38.833053","-83.07498","-5","1"
+"45653","Minford","OH","38.877777","-82.84096","-5","1"
+"45654","New Plymouth","OH","39.376504","-82.39503","-5","1"
+"45656","Oak Hill","OH","38.879935","-82.58332","-5","1"
+"45657","Otway","OH","38.866354","-83.22028","-5","1"
+"45658","Patriot","OH","38.766082","-82.41638","-5","1"
+"45659","Pedro","OH","38.67484","-82.61865","-5","1"
+"45660","Peebles","OH","38.987596","-83.37752","-5","1"
+"45661","Piketon","OH","39.046079","-83.06459","-5","1"
+"45662","Portsmouth","OH","38.762824","-82.94294","-5","1"
+"45663","West Portsmouth","OH","38.743244","-83.05954","-5","1"
+"45669","Proctorville","OH","38.468003","-82.35457","-5","1"
+"45670","Wilkesville","OH","39.118117","-82.381351","-5","1"
+"45671","Rarden","OH","38.947693","-83.24361","-5","1"
+"45672","Ray","OH","39.208053","-82.69077","-5","1"
+"45673","Richmond Dale","OH","39.204151","-82.81378","-5","1"
+"45674","Rio Grande","OH","38.881743","-82.38091","-5","1"
+"45675","Rock Camp","OH","38.536685","-82.532715","-5","1"
+"45677","Scioto Furnace","OH","38.794115","-82.755455","-5","1"
+"45678","Scottown","OH","38.615111","-82.38004","-5","1"
+"45679","Seaman","OH","38.95352","-83.57108","-5","1"
+"45680","South Point","OH","38.438617","-82.55774","-5","1"
+"45681","South Salem","OH","39.308063","-83.25664","-5","1"
+"45682","South Webster","OH","38.816072","-82.71455","-5","1"
+"45683","Stockdale","OH","38.955485","-82.858402","-5","1"
+"45684","Stout","OH","38.664532","-83.29759","-5","1"
+"45685","Thurman","OH","38.915013","-82.45326","-5","1"
+"45686","Vinton","OH","38.99754","-82.36215","-5","1"
+"45687","Wakefield","OH","39.072829","-83.085764","-5","1"
+"45688","Waterloo","OH","38.734463","-82.52163","-5","1"
+"45690","Waverly","OH","39.123071","-83.0009","-5","1"
+"45692","Wellston","OH","39.117212","-82.54811","-5","1"
+"45693","West Union","OH","38.795145","-83.54335","-5","1"
+"45694","Wheelersburg","OH","38.729816","-82.8004","-5","1"
+"45695","Wilkesville","OH","39.137773","-82.36543","-5","1"
+"45696","Willow Wood","OH","38.592851","-82.46212","-5","1"
+"45697","Winchester","OH","38.939364","-83.67195","-5","1"
+"45698","Zaleski","OH","39.282728","-82.39623","-5","1"
+"45699","Lucasville","OH","38.793335","-82.96046","-5","1"
+"45701","Athens","OH","39.322847","-82.09728","-5","1"
+"45710","Albany","OH","39.202517","-82.21421","-5","1"
+"45711","Amesville","OH","39.429095","-81.94337","-5","1"
+"45712","Barlow","OH","39.40032","-81.66209","-5","1"
+"45713","Bartlett","OH","39.419647","-81.8164","-5","1"
+"45714","Belpre","OH","39.297622","-81.5958","-5","1"
+"45715","Beverly","OH","39.58849","-81.62932","-5","1"
+"45716","Buchtel","OH","39.462005","-82.18021","-5","1"
+"45717","Carbondale","OH","39.368235","-82.010132","-5","1"
+"45719","Chauncey","OH","39.4001","-82.12856","-5","1"
+"45720","Chester","OH","39.085629","-81.921443","-5","1"
+"45721","Coal Run","OH","39.430738","-81.44512","-5","1"
+"45723","Coolville","OH","39.22241","-81.81945","-5","1"
+"45724","Cutler","OH","39.363901","-81.78854","-5","1"
+"45727","Dexter City","OH","39.649854","-81.47113","-5","1"
+"45729","Fleming","OH","39.420916","-81.5936","-5","1"
+"45732","Glouster","OH","39.506243","-82.0779","-5","1"
+"45734","Graysville","OH","39.628144","-81.19164","-5","1"
+"45735","Guysville","OH","39.262298","-81.92977","-5","1"
+"45739","Hockingport","OH","39.197888","-81.744573","-5","1"
+"45740","Jacksonville","OH","39.475889","-82.07959","-5","1"
+"45741","Langsville","OH","39.07348","-82.244","-5","1"
+"45742","Little Hocking","OH","39.273206","-81.70889","-5","1"
+"45743","Long Bottom","OH","39.077704","-81.84506","-5","1"
+"45744","Lowell","OH","39.533021","-81.50986","-5","1"
+"45745","Lower Salem","OH","39.611675","-81.34495","-5","1"
+"45746","Macksburg","OH","39.627217","-81.45532","-5","1"
+"45750","Marietta","OH","39.426551","-81.44373","-5","1"
+"45757","Dexter City","OH","39.65828","-81.470771","-5","1"
+"45760","Middleport","OH","39.006757","-82.08208","-5","1"
+"45761","Millfield","OH","39.431016","-82.09986","-5","1"
+"45764","Nelsonville","OH","39.450463","-82.22975","-5","1"
+"45766","New Marshfield","OH","39.32502","-82.2586","-5","1"
+"45767","New Matamoras","OH","39.524674","-81.12031","-5","1"
+"45768","Newport","OH","39.397077","-81.25508","-5","1"
+"45769","Pomeroy","OH","39.092281","-82.028","-5","1"
+"45770","Portland","OH","38.988699","-81.8019","-5","1"
+"45771","Racine","OH","38.978044","-81.91206","-5","1"
+"45772","Reedsville","OH","39.143542","-81.83724","-5","1"
+"45773","Reno","OH","39.471663","-81.28018","-5","1"
+"45775","Rutland","OH","39.089885","-82.16773","-5","1"
+"45776","Shade","OH","39.191685","-82.01828","-5","1"
+"45777","Sharpsburg","OH","39.368235","-82.010132","-5","1"
+"45778","Stewart","OH","39.341224","-81.88561","-5","1"
+"45779","Syracuse","OH","38.999757","-81.97282","-5","1"
+"45780","The Plains","OH","39.370636","-82.13406","-5","1"
+"45781","Torch","OH","39.368235","-82.010132","-5","1"
+"45782","Trimble","OH","39.483798","-82.07788","-5","1"
+"45783","Tuppers Plains","OH","39.168349","-81.842313","-5","1"
+"45784","Vincent","OH","39.389346","-81.68122","-5","1"
+"45786","Waterford","OH","39.526685","-81.66109","-5","1"
+"45787","Watertown","OH","39.430738","-81.44512","-5","1"
+"45788","Whipple","OH","39.5103","-81.37669","-5","1"
+"45789","Wingett Run","OH","39.551002","-81.256","-5","1"
+"45801","Lima","OH","40.759451","-84.08458","-5","1"
+"45802","Lima","OH","40.781785","-84.138566","-5","1"
+"45804","Lima","OH","40.72255","-84.08979","-5","1"
+"45805","Lima","OH","40.739517","-84.14468","-5","1"
+"45806","Lima","OH","40.668448","-84.1331","-5","1"
+"45807","Lima","OH","40.7953","-84.16573","-5","1"
+"45808","Beaverdam","OH","40.832363","-83.97343","-5","1"
+"45809","Gomer","OH","40.844554","-84.18324","-5","1"
+"45810","Ada","OH","40.774039","-83.81821","-5","1"
+"45812","Alger","OH","40.696862","-83.8231","-5","1"
+"45813","Antwerp","OH","41.18312","-84.73533","-5","1"
+"45814","Arlington","OH","40.892253","-83.64338","-5","1"
+"45815","Belmore","OH","41.153855","-83.941281","-5","1"
+"45816","Benton Ridge","OH","41.00433","-83.79265","-5","1"
+"45817","Bluffton","OH","40.886803","-83.89259","-5","1"
+"45819","Buckland","OH","40.623695","-84.26087","-5","1"
+"45820","Cairo","OH","40.831339","-84.08602","-5","1"
+"45821","Cecil","OH","41.230816","-84.57771","-5","1"
+"45822","Celina","OH","40.542778","-84.58232","-5","1"
+"45826","Chickasaw","OH","40.428177","-84.633484","-5","1"
+"45827","Cloverdale","OH","41.009008","-84.30617","-5","1"
+"45828","Coldwater","OH","40.480128","-84.64678","-5","1"
+"45829","Crane","OH","41.163632","-84.612173","-5","1"
+"45830","Columbus Grove","OH","40.900986","-84.06783","-5","1"
+"45831","Continental","OH","41.103903","-84.25371","-5","1"
+"45832","Convoy","OH","40.929839","-84.73138","-5","1"
+"45833","Delphos","OH","40.841409","-84.34178","-5","1"
+"45835","Dola","OH","40.768846","-83.70007","-5","1"
+"45836","Dunkirk","OH","40.790676","-83.63856","-5","1"
+"45837","Dupont","OH","41.054934","-84.30075","-5","1"
+"45838","Elgin","OH","40.740456","-84.47602","-5","1"
+"45839","Findlay","OH","40.993263","-83.650714","-5","1"
+"45840","Findlay","OH","41.037325","-83.64576","-5","1"
+"45841","Jenera","OH","40.881217","-83.73199","-5","1"
+"45843","Forest","OH","40.782854","-83.52862","-5","1"
+"45844","Fort Jennings","OH","40.914909","-84.28717","-5","1"
+"45845","Fort Loramie","OH","40.338583","-84.38348","-5","1"
+"45846","Fort Recovery","OH","40.409441","-84.75912","-5","1"
+"45848","Glandorf","OH","41.096421","-84.112031","-5","1"
+"45849","Grover Hill","OH","41.012","-84.46683","-5","1"
+"45850","Harrod","OH","40.713499","-83.93098","-5","1"
+"45851","Haviland","OH","41.030911","-84.60213","-5","1"
+"45853","Kalida","OH","40.983471","-84.20027","-5","1"
+"45854","Lafayette","OH","40.758211","-83.949934","-5","1"
+"45855","Latty","OH","41.088144","-84.58332","-5","1"
+"45856","Leipsic","OH","41.112413","-83.99136","-5","1"
+"45858","McComb","OH","41.106245","-83.80463","-5","1"
+"45859","McGuffey","OH","40.691866","-83.78457","-5","1"
+"45860","Maria Stein","OH","40.400409","-84.51744","-5","1"
+"45861","Melrose","OH","41.090714","-84.41948","-5","1"
+"45862","Mendon","OH","40.669102","-84.52245","-5","1"
+"45863","Middle Point","OH","40.892251","-84.45548","-5","1"
+"45864","Miller City","OH","41.103776","-84.131541","-5","1"
+"45865","Minster","OH","40.391924","-84.37211","-5","1"
+"45866","Montezuma","OH","40.488771","-84.54783","-5","1"
+"45867","Mount Blanchard","OH","40.903089","-83.54591","-5","1"
+"45868","Mount Cory","OH","40.958861","-83.8356","-5","1"
+"45869","New Bremen","OH","40.452556","-84.38731","-5","1"
+"45870","New Hampshire","OH","40.555807","-83.95347","-5","1"
+"45871","New Knoxville","OH","40.491725","-84.31129","-5","1"
+"45872","North Baltimore","OH","41.18394","-83.67053","-5","1"
+"45873","Oakwood","OH","41.107804","-84.39098","-5","1"
+"45874","Ohio City","OH","40.780889","-84.65726","-5","1"
+"45875","Ottawa","OH","41.020852","-84.04649","-5","1"
+"45876","Ottoville","OH","40.931687","-84.33877","-5","1"
+"45877","Pandora","OH","40.945888","-83.9514","-5","1"
+"45879","Paulding","OH","41.137873","-84.56377","-5","1"
+"45880","Payne","OH","41.072614","-84.7317","-5","1"
+"45881","Rawson","OH","40.954985","-83.78216","-5","1"
+"45882","Rockford","OH","40.682303","-84.67806","-5","1"
+"45883","Saint Henry","OH","40.413734","-84.6325","-5","1"
+"45884","Saint Johns","OH","40.520289","-84.16797","-5","1"
+"45885","Saint Marys","OH","40.550005","-84.39308","-5","1"
+"45886","Scott","OH","40.9871","-84.6073","-5","1"
+"45887","Spencerville","OH","40.711394","-84.35509","-5","1"
+"45888","Uniopolis","OH","40.601985","-84.08653","-5","1"
+"45889","Van Buren","OH","41.14062","-83.64464","-5","1"
+"45890","Vanlue","OH","40.973064","-83.48845","-5","1"
+"45891","Van Wert","OH","40.874092","-84.57871","-5","1"
+"45893","Vaughnsville","OH","40.882077","-84.148028","-5","1"
+"45894","Venedocia","OH","40.755619","-84.48041","-5","1"
+"45895","Wapakoneta","OH","40.56914","-84.17288","-5","1"
+"45896","Waynesfield","OH","40.593532","-83.94417","-5","1"
+"45897","Williamstown","OH","40.834233","-83.65288","-5","1"
+"45898","Willshire","OH","40.74011","-84.77607","-5","1"
+"45899","Wren","OH","40.799531","-84.77422","-5","1"
+"45944","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"45999","Cincinnati","OH","39.166759","-84.53822","-5","1"
+"46001","Alexandria","IN","40.257082","-85.673","-5","0"
+"46011","Anderson","IN","40.112913","-85.737","-5","0"
+"46012","Anderson","IN","40.132892","-85.65097","-5","0"
+"46013","Anderson","IN","40.061092","-85.67672","-5","0"
+"46014","Anderson","IN","40.161733","-85.719659","-5","0"
+"46015","Anderson","IN","40.093792","-85.657825","-5","0"
+"46016","Anderson","IN","40.098641","-85.68452","-5","0"
+"46017","Anderson","IN","40.096343","-85.60147","-5","0"
+"46018","Anderson","IN","40.161733","-85.719659","-5","0"
+"46030","Arcadia","IN","40.17449","-86.01736","-5","0"
+"46031","Atlanta","IN","40.211166","-86.02304","-5","0"
+"46032","Carmel","IN","39.970241","-86.15416","-5","0"
+"46033","Carmel","IN","39.973731","-86.08875","-5","0"
+"46034","Cicero","IN","40.127019","-86.03121","-5","0"
+"46035","Colfax","IN","40.1915","-86.67137","-5","0"
+"46036","Elwood","IN","40.279375","-85.83761","-5","0"
+"46038","Fishers","IN","39.95645","-86.00872","-5","0"
+"46039","Forest","IN","40.366648","-86.30867","-5","0"
+"46040","Fortville","IN","39.93549","-85.84047","-5","0"
+"46041","Frankfort","IN","40.290615","-86.5028","-5","0"
+"46044","Frankton","IN","40.221208","-85.77612","-5","0"
+"46045","Goldsmith","IN","40.289779","-86.15004","-5","0"
+"46046","Hillisburg","IN","40.304473","-86.469044","-5","0"
+"46047","Hobbs","IN","40.284101","-85.94676","-5","0"
+"46048","Ingalls","IN","39.95634","-85.80252","-5","0"
+"46049","Kempton","IN","40.292007","-86.22757","-5","0"
+"46050","Kirklin","IN","40.196061","-86.35846","-5","0"
+"46051","Lapel","IN","40.065589","-85.84631","-5","0"
+"46052","Lebanon","IN","40.047966","-86.46592","-5","0"
+"46055","McCordsville","IN","39.898378","-85.9159","-5","0"
+"46056","Markleville","IN","39.974904","-85.61733","-5","0"
+"46057","Michigantown","IN","40.333772","-86.38161","-5","0"
+"46058","Mulberry","IN","40.349135","-86.66424","-5","0"
+"46060","Noblesville","IN","40.050109","-85.99815","-5","0"
+"46061","Noblesville","IN","40.072462","-86.052285","-5","0"
+"46063","Orestes","IN","40.27046","-85.72871","-5","0"
+"46064","Pendleton","IN","39.997694","-85.75075","-5","0"
+"46065","Rossville","IN","40.427919","-86.61059","-5","0"
+"46067","Sedalia","IN","40.304473","-86.469044","-5","0"
+"46068","Sharpsville","IN","40.378829","-86.09362","-5","0"
+"46069","Sheridan","IN","40.134736","-86.21885","-5","0"
+"46070","Summitville","IN","40.340749","-85.64679","-5","0"
+"46071","Thorntown","IN","40.126304","-86.60268","-5","0"
+"46072","Tipton","IN","40.284041","-86.04681","-5","0"
+"46074","Westfield","IN","40.041325","-86.15262","-5","0"
+"46075","Whitestown","IN","40.007024","-86.34405","-5","0"
+"46076","Windfall","IN","40.363776","-85.95074","-5","0"
+"46077","Zionsville","IN","39.960858","-86.28252","-5","0"
+"46082","Carmel","IN","40.072462","-86.052285","-5","0"
+"46102","Advance","IN","39.996577","-86.61928","-5","0"
+"46103","Amo","IN","39.688673","-86.61409","-5","0"
+"46104","Arlington","IN","39.649096","-85.60213","-5","0"
+"46105","Bainbridge","IN","39.761986","-86.80492","-5","0"
+"46106","Bargersville","IN","39.514024","-86.18812","-5","0"
+"46107","Beech Grove","IN","39.718744","-86.09375","-5","0"
+"46110","Boggstown","IN","39.56578","-85.92481","-5","0"
+"46111","Brooklyn","IN","39.538087","-86.36991","-5","0"
+"46112","Brownsburg","IN","39.84952","-86.38739","-5","0"
+"46113","Camby","IN","39.631344","-86.31273","-5","0"
+"46114","Cartersburg","IN","39.762448","-86.510386","-5","0"
+"46115","Carthage","IN","39.740158","-85.57101","-5","0"
+"46117","Charlottesville","IN","39.805933","-85.61514","-5","0"
+"46118","Clayton","IN","39.65983","-86.53196","-5","0"
+"46120","Cloverdale","IN","39.513388","-86.79169","-5","0"
+"46121","Coatesville","IN","39.679883","-86.67849","-5","0"
+"46122","Danville","IN","39.761211","-86.52344","-5","0"
+"46123","Avon","IN","39.764436","-86.39699","-5","0"
+"46124","Edinburgh","IN","39.366507","-85.9864","-5","0"
+"46125","Eminence","IN","39.522181","-86.64102","-5","0"
+"46126","Fairland","IN","39.61753","-85.88003","-5","0"
+"46127","Falmouth","IN","39.717457","-85.32737","-5","0"
+"46128","Fillmore","IN","39.674879","-86.75256","-5","0"
+"46129","Finly","IN","39.821516","-85.765169","-5","0"
+"46130","Fountaintown","IN","39.680058","-85.83363","-5","0"
+"46131","Franklin","IN","39.482105","-86.05043","-5","0"
+"46133","Glenwood","IN","39.609926","-85.28428","-5","0"
+"46135","Greencastle","IN","39.652374","-86.87361","-5","0"
+"46140","Greenfield","IN","39.799143","-85.78446","-5","0"
+"46142","Greenwood","IN","39.62068","-86.15126","-5","0"
+"46143","Greenwood","IN","39.601649","-86.12734","-5","0"
+"46144","Gwynneville","IN","39.661964","-85.64945","-5","0"
+"46145","Greenwood","IN","39.597444","-86.088914","-5","0"
+"46146","Homer","IN","39.619923","-85.46554","-5","0"
+"46147","Jamestown","IN","39.96354","-86.61733","-5","0"
+"46148","Knightstown","IN","39.803168","-85.51553","-5","0"
+"46149","Lizton","IN","39.885033","-86.54978","-5","0"
+"46150","Manilla","IN","39.563815","-85.61239","-5","0"
+"46151","Martinsville","IN","39.442774","-86.41337","-5","0"
+"46154","Maxwell","IN","39.856763","-85.768357","-5","0"
+"46155","Mays","IN","39.743346","-85.43035","-5","0"
+"46156","Milroy","IN","39.484598","-85.47698","-5","0"
+"46157","Monrovia","IN","39.561003","-86.53591","-5","0"
+"46158","Mooresville","IN","39.588545","-86.37431","-5","0"
+"46160","Morgantown","IN","39.351269","-86.26806","-5","0"
+"46161","Morristown","IN","39.67083","-85.69786","-5","0"
+"46162","Needham","IN","39.542985","-85.95928","-5","0"
+"46163","New Palestine","IN","39.726811","-85.89726","-5","0"
+"46164","Nineveh","IN","39.324091","-86.11397","-5","0"
+"46165","North Salem","IN","39.852098","-86.64494","-5","0"
+"46166","Paragon","IN","39.416815","-86.58507","-5","0"
+"46167","Pittsboro","IN","39.872255","-86.46335","-5","0"
+"46168","Plainfield","IN","39.69775","-86.39589","-5","0"
+"46170","Putnamville","IN","39.668441","-86.828402","-5","0"
+"46171","Reelsville","IN","39.525112","-86.95994","-5","0"
+"46172","Roachdale","IN","39.842523","-86.83174","-5","0"
+"46173","Rushville","IN","39.614803","-85.43834","-5","0"
+"46175","Russellville","IN","39.837161","-86.98612","-5","0"
+"46176","Shelbyville","IN","39.523797","-85.77208","-5","0"
+"46180","Stilesville","IN","39.612844","-86.63017","-5","0"
+"46181","Trafalgar","IN","39.396833","-86.16098","-5","0"
+"46182","Waldron","IN","39.457143","-85.67065","-5","0"
+"46183","West Newton","IN","39.648251","-86.28509","-5","0"
+"46184","Whiteland","IN","39.557799","-86.08543","-5","0"
+"46186","Wilkinson","IN","39.894667","-85.62657","-5","0"
+"46201","Indianapolis","IN","39.775125","-86.10839","-5","0"
+"46202","Indianapolis","IN","39.782842","-86.15673","-5","0"
+"46203","Indianapolis","IN","39.742593","-86.11766","-5","0"
+"46204","Indianapolis","IN","39.771743","-86.15598","-5","0"
+"46205","Indianapolis","IN","39.824858","-86.13817","-5","0"
+"46206","Indianapolis","IN","39.761293","-86.161336","-5","0"
+"46207","Indianapolis","IN","39.767293","-86.160616","-5","0"
+"46208","Indianapolis","IN","39.820708","-86.1713","-5","0"
+"46209","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46211","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46214","Indianapolis","IN","39.792993","-86.28575","-5","0"
+"46216","Indianapolis","IN","39.857639","-86.00948","-5","0"
+"46217","Indianapolis","IN","39.668795","-86.1833","-5","0"
+"46218","Indianapolis","IN","39.805841","-86.10175","-5","0"
+"46219","Indianapolis","IN","39.78001","-86.04889","-5","0"
+"46220","Indianapolis","IN","39.866913","-86.12323","-5","0"
+"46221","Indianapolis","IN","39.719444","-86.22183","-5","0"
+"46222","Indianapolis","IN","39.786793","-86.21093","-5","0"
+"46223","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46224","Indianapolis","IN","39.795593","-86.25409","-5","0"
+"46225","Indianapolis","IN","39.746993","-86.15903","-5","0"
+"46226","Indianapolis","IN","39.83729","-86.05378","-5","0"
+"46227","Indianapolis","IN","39.678495","-86.12973","-5","0"
+"46228","Indianapolis","IN","39.849474","-86.20448","-5","0"
+"46229","Indianapolis","IN","39.795025","-85.97356","-5","0"
+"46230","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46231","Indianapolis","IN","39.71962","-86.33121","-5","0"
+"46234","Indianapolis","IN","39.797622","-86.32493","-5","0"
+"46235","Indianapolis","IN","39.835369","-85.98635","-5","0"
+"46236","Indianapolis","IN","39.888225","-85.97041","-5","0"
+"46237","Indianapolis","IN","39.67859","-86.08634","-5","0"
+"46239","Indianapolis","IN","39.732943","-85.99903","-5","0"
+"46240","Indianapolis","IN","39.902039","-86.12948","-5","0"
+"46241","Indianapolis","IN","39.736844","-86.25214","-5","0"
+"46242","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46243","Washington","IN","39.779741","-86.332995","-5","0"
+"46244","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46247","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46249","Indianapolis","IN","39.858989","-86.006082","-5","0"
+"46250","Indianapolis","IN","39.905689","-86.06733","-5","0"
+"46251","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46253","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46254","Indianapolis","IN","39.844024","-86.26464","-5","0"
+"46255","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46256","Indianapolis","IN","39.907838","-86.01405","-5","0"
+"46259","Indianapolis","IN","39.651145","-85.98073","-5","0"
+"46260","Indianapolis","IN","39.898107","-86.18232","-5","0"
+"46266","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46268","Indianapolis","IN","39.897548","-86.22546","-5","0"
+"46274","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46275","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46277","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46278","Indianapolis","IN","39.89792","-86.28619","-5","0"
+"46280","Indianapolis","IN","39.939102","-86.13831","-5","0"
+"46282","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46283","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46285","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46290","Indianapolis","IN","39.934949","-86.16262","-5","0"
+"46291","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46295","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46298","Indianapolis","IN","39.779492","-86.132837","-5","0"
+"46301","Beverly Shores","IN","41.687414","-86.9797","-6","1"
+"46302","Boone Grove","IN","41.354186","-87.130431","-6","1"
+"46303","Cedar Lake","IN","41.36959","-87.44849","-6","1"
+"46304","Chesterton","IN","41.616263","-87.05883","-6","1"
+"46305","Granger","IN","41.74486","-86.177059","-5","0"
+"46307","Crown Point","IN","41.418873","-87.34298","-6","1"
+"46308","Crown Point","IN","41.461543","-87.372779","-6","1"
+"46310","Demotte","IN","41.179017","-87.24265","-6","1"
+"46311","Dyer","IN","41.491377","-87.51022","-6","1"
+"46312","East Chicago","IN","41.639735","-87.46084","-6","1"
+"46319","Griffith","IN","41.527235","-87.42458","-6","1"
+"46320","Hammond","IN","41.610035","-87.50574","-6","1"
+"46321","Munster","IN","41.551457","-87.50143","-6","1"
+"46322","Highland","IN","41.549851","-87.45806","-6","1"
+"46323","Hammond","IN","41.587718","-87.45528","-6","1"
+"46324","Hammond","IN","41.583535","-87.50391","-6","1"
+"46325","Hammond","IN","41.461543","-87.372779","-6","1"
+"46327","Hammond","IN","41.634385","-87.50911","-6","1"
+"46332","Washington","IN","39.77127","-86.373314","-5","0"
+"46340","Hanna","IN","41.397147","-86.76103","-6","1"
+"46341","Hebron","IN","41.32374","-87.20898","-6","1"
+"46342","Hobart","IN","41.533786","-87.26403","-6","1"
+"46345","Kingsbury","IN","41.526628","-86.70041","-6","1"
+"46346","Kingsford Heights","IN","41.479757","-86.6925","-6","1"
+"46347","Kouts","IN","41.305178","-87.01522","-6","1"
+"46348","La Crosse","IN","41.316401","-86.87244","-6","1"
+"46349","Lake Village","IN","41.111996","-87.43686","-6","1"
+"46350","La Porte","IN","41.605749","-86.71983","-6","1"
+"46352","La Porte","IN","41.498992","-86.709883","-6","1"
+"46355","Leroy","IN","41.359415","-87.27081","-6","1"
+"46356","Lowell","IN","41.269789","-87.41353","-6","1"
+"46360","Michigan City","IN","41.707539","-86.87902","-6","1"
+"46361","Michigan City","IN","41.70354","-86.915077","-6","1"
+"46365","Mill Creek","IN","41.598294","-86.53889","-6","1"
+"46366","North Judson","IN","41.212184","-86.77019","-5","0"
+"46368","Portage","IN","41.58327","-87.18154","-6","1"
+"46369","Russiaville","IN","40.41663","-86.26679","-5","0"
+"46371","Rolling Prairie","IN","41.677087","-86.60481","-6","1"
+"46372","Roselawn","IN","41.143358","-87.322049","-6","1"
+"46373","Saint John","IN","41.44862","-87.47404","-6","1"
+"46374","San Pierre","IN","41.204744","-86.90009","-5","0"
+"46375","Schererville","IN","41.492085","-87.4519","-6","1"
+"46376","Schneider","IN","41.176325","-87.46426","-6","1"
+"46377","Shelby","IN","41.191665","-87.34695","-6","1"
+"46379","Sumava Resorts","IN","41.167119","-87.43781","-6","1"
+"46380","Tefft","IN","41.194816","-86.968614","-6","1"
+"46381","Thayer","IN","41.170584","-87.33142","-6","1"
+"46382","Union Mills","IN","41.479916","-86.77328","-6","1"
+"46383","Valparaiso","IN","41.47339","-87.03165","-6","1"
+"46384","Valparaiso","IN","41.490545","-87.076094","-6","1"
+"46385","Valparaiso","IN","41.484652","-87.11269","-6","1"
+"46386","Porter","IN","41.428873","-87.170527","-6","1"
+"46390","Wanatah","IN","41.420078","-86.88131","-6","1"
+"46391","Westville","IN","41.550192","-86.91068","-6","1"
+"46392","Wheatfield","IN","41.186662","-87.05359","-6","1"
+"46393","Wheeler","IN","41.510333","-87.17829","-6","1"
+"46394","Whiting","IN","41.679185","-87.50015","-6","1"
+"46401","Gary","IN","41.590686","-87.319937","-6","1"
+"46402","Gary","IN","41.601086","-87.33681","-6","1"
+"46403","Gary","IN","41.604654","-87.25695","-6","1"
+"46404","Gary","IN","41.588636","-87.37271","-6","1"
+"46405","Lake Station","IN","41.570086","-87.26447","-6","1"
+"46406","Gary","IN","41.589135","-87.40962","-6","1"
+"46407","Gary","IN","41.580469","-87.33646","-6","1"
+"46408","Gary","IN","41.542536","-87.3581","-6","1"
+"46409","Gary","IN","41.544736","-87.32716","-6","1"
+"46410","Merrillville","IN","41.487369","-87.34024","-6","1"
+"46411","Merrillville","IN","41.461543","-87.372779","-6","1"
+"46415","Burlington","IN","40.479112","-86.397372","-5","0"
+"46501","Argos","IN","41.224036","-86.24521","-5","0"
+"46502","Atwood","IN","41.259773","-85.97379","-5","0"
+"46504","Bourbon","IN","41.301049","-86.1114","-5","0"
+"46506","Bremen","IN","41.450744","-86.1692","-5","0"
+"46507","Bristol","IN","41.725061","-85.81792","-5","0"
+"46508","Burket","IN","41.154441","-85.96915","-5","0"
+"46510","Claypool","IN","41.12274","-85.88733","-5","0"
+"46511","Culver","IN","41.218388","-86.42163","-5","0"
+"46513","Donaldson","IN","41.361567","-86.44545","-5","0"
+"46514","Elkhart","IN","41.707616","-85.97605","-5","0"
+"46515","Elkhart","IN","41.641449","-85.938348","-5","0"
+"46516","Elkhart","IN","41.676899","-85.96044","-5","0"
+"46517","Elkhart","IN","41.646499","-85.96923","-5","0"
+"46518","Madison","IN","39.580105","-86.308673","-5","0"
+"46524","Etna Green","IN","41.291767","-86.03216","-5","0"
+"46526","Goshen","IN","41.567559","-85.84885","-5","0"
+"46527","Goshen","IN","41.597739","-85.858076","-5","0"
+"46528","Goshen","IN","41.600649","-85.81902","-5","0"
+"46530","Granger","IN","41.741872","-86.13717","-5","0"
+"46531","Grovertown","IN","41.356991","-86.50975","-5","0"
+"46532","Hamlet","IN","41.411513","-86.61127","-5","0"
+"46534","Knox","IN","41.282822","-86.61613","-5","0"
+"46535","Granger","IN","41.720636","-86.192003","-5","0"
+"46536","Lakeville","IN","41.519839","-86.2795","-5","0"
+"46537","Lapaz","IN","41.458188","-86.3076","-5","0"
+"46538","Leesburg","IN","41.323642","-85.78997","-5","0"
+"46539","Mentone","IN","41.168118","-86.01203","-5","0"
+"46540","Middlebury","IN","41.685374","-85.69409","-5","0"
+"46542","Milford","IN","41.408621","-85.86531","-5","0"
+"46543","Millersburg","IN","41.525634","-85.68403","-5","0"
+"46544","Mishawaka","IN","41.650672","-86.16002","-5","0"
+"46545","Mishawaka","IN","41.681487","-86.16811","-5","0"
+"46546","Mishawaka","IN","41.688432","-86.196485","-5","0"
+"46550","Nappanee","IN","41.444183","-85.99829","-5","0"
+"46552","New Carlisle","IN","41.708183","-86.50412","-5","0"
+"46553","New Paris","IN","41.48922","-85.84083","-5","0"
+"46554","North Liberty","IN","41.547845","-86.42047","-5","0"
+"46555","North Webster","IN","41.328153","-85.6852","-5","0"
+"46556","Notre Dame","IN","41.701415","-86.24498","-5","0"
+"46561","Osceola","IN","41.672698","-86.07877","-5","0"
+"46562","Pierceton","IN","41.213756","-85.70397","-5","0"
+"46563","Plymouth","IN","41.347159","-86.32023","-5","0"
+"46565","Shipshewana","IN","41.696334","-85.58665","-5","0"
+"46566","Sidney","IN","41.105868","-85.74168","-5","0"
+"46567","Syracuse","IN","41.411075","-85.736","-5","0"
+"46570","Tippecanoe","IN","41.208493","-86.12107","-5","0"
+"46571","Topeka","IN","41.565561","-85.54707","-5","0"
+"46572","Tyner","IN","41.325513","-86.260569","-5","0"
+"46573","Wakarusa","IN","41.538432","-86.04261","-5","0"
+"46574","Walkerton","IN","41.472858","-86.49379","-5","0"
+"46580","Warsaw","IN","41.2281","-85.85778","-5","0"
+"46581","Warsaw","IN","41.239365","-85.864267","-5","0"
+"46582","Warsaw","IN","41.281518","-85.81927","-5","0"
+"46590","Winona Lake","IN","41.22163","-85.81795","-5","0"
+"46595","Wyatt","IN","41.526405","-86.17013","-5","0"
+"46601","South Bend","IN","41.671197","-86.25253","-5","0"
+"46604","South Bend","IN","41.664198","-86.221805","-5","0"
+"46612","South Bend","IN","41.628483","-86.234589","-5","0"
+"46613","South Bend","IN","41.654547","-86.25043","-5","0"
+"46614","South Bend","IN","41.626588","-86.24804","-5","0"
+"46615","South Bend","IN","41.671848","-86.21105","-5","0"
+"46616","South Bend","IN","41.69248","-86.26514","-5","0"
+"46617","South Bend","IN","41.684504","-86.23576","-5","0"
+"46619","South Bend","IN","41.667797","-86.31341","-5","0"
+"46620","South Bend","IN","41.596769","-86.292991","-5","0"
+"46624","South Bend","IN","41.733223","-86.283278","-5","0"
+"46626","South Bend","IN","41.677397","-86.252506","-5","0"
+"46628","South Bend","IN","41.700776","-86.30357","-5","0"
+"46629","South Bend","IN","41.672543","-86.27329","-5","0"
+"46634","South Bend","IN","41.596769","-86.292991","-5","0"
+"46635","South Bend","IN","41.708505","-86.20906","-5","0"
+"46637","South Bend","IN","41.73104","-86.24391","-5","0"
+"46660","South Bend","IN","41.596769","-86.292991","-5","0"
+"46671","Topeka","IN","41.532773","-85.539454","-5","0"
+"46680","South Bend","IN","41.596769","-86.292991","-5","0"
+"46692","Noble","IN","40.752777","-85.744328","-5","0"
+"46696","Franklin","IN","41.156891","-86.604952","-5","0"
+"46699","South Bend","IN","41.596769","-86.292991","-5","0"
+"46701","Albion","IN","41.361895","-85.43989","-5","0"
+"46702","Andrews","IN","40.838891","-85.62014","-5","0"
+"46703","Angola","IN","41.656798","-85.0223","-5","0"
+"46704","Arcola","IN","41.103797","-85.292474","-5","0"
+"46705","Ashley","IN","41.523914","-85.06155","-5","0"
+"46706","Auburn","IN","41.352638","-85.04792","-5","0"
+"46710","Avilla","IN","41.353742","-85.24367","-5","0"
+"46711","Berne","IN","40.660174","-84.94244","-5","0"
+"46713","Bippus","IN","40.829196","-85.489198","-5","0"
+"46714","Bluffton","IN","40.728816","-85.16565","-5","0"
+"46720","Brimfield","IN","41.395275","-85.423462","-5","0"
+"46721","Butler","IN","41.424095","-84.8726","-5","0"
+"46723","Churubusco","IN","41.238825","-85.32693","-5","0"
+"46725","Columbia City","IN","41.166034","-85.48313","-5","0"
+"46730","Corunna","IN","41.44551","-85.15149","-5","0"
+"46731","Craigville","IN","40.793562","-85.0974","-5","0"
+"46732","Cromwell","IN","41.386918","-85.63924","-5","0"
+"46733","Decatur","IN","40.831351","-84.93704","-5","0"
+"46737","Fremont","IN","41.724694","-84.95619","-5","0"
+"46738","Garrett","IN","41.334204","-85.13569","-5","0"
+"46740","Geneva","IN","40.599769","-84.96856","-5","0"
+"46741","Grabill","IN","41.202549","-84.93811","-5","0"
+"46742","Hamilton","IN","41.544911","-84.89154","-5","0"
+"46743","Harlan","IN","41.215338","-84.85575","-5","0"
+"46745","Hoagland","IN","40.954897","-85.00759","-5","0"
+"46746","Howe","IN","41.722976","-85.39367","-5","0"
+"46747","Hudson","IN","41.556391","-85.15428","-5","0"
+"46748","Huntertown","IN","41.243248","-85.16711","-5","0"
+"46750","Huntington","IN","40.872261","-85.49061","-5","0"
+"46755","Kendallville","IN","41.449897","-85.26765","-5","0"
+"46759","Keystone","IN","40.598916","-85.17871","-5","0"
+"46760","Kimmell","IN","41.359626","-85.56204","-5","0"
+"46761","Lagrange","IN","41.634457","-85.35825","-5","0"
+"46763","Laotto","IN","41.28867","-85.22236","-5","0"
+"46764","Larwill","IN","41.209244","-85.6322","-5","0"
+"46765","Leo","IN","41.219699","-85.02486","-5","0"
+"46766","Liberty Center","IN","40.708804","-85.29184","-5","0"
+"46767","Ligonier","IN","41.464213","-85.59288","-5","0"
+"46768","Plainfield","IN","39.712549","-86.370409","-5","0"
+"46769","Linn Grove","IN","40.74532","-84.937926","-5","0"
+"46770","Markle","IN","40.852768","-85.30702","-5","0"
+"46771","Mongo","IN","41.665489","-85.267567","-5","0"
+"46772","Monroe","IN","40.736015","-84.92161","-5","0"
+"46773","Monroeville","IN","40.988714","-84.87284","-5","0"
+"46774","New Haven","IN","41.081548","-84.98664","-5","0"
+"46776","Orland","IN","41.732206","-85.16794","-5","0"
+"46777","Ossian","IN","40.880397","-85.15936","-5","0"
+"46778","Petroleum","IN","40.611419","-85.152604","-5","0"
+"46779","Pleasant Lake","IN","41.578442","-85.03134","-5","0"
+"46780","Pleasant Mills","IN","40.74532","-84.937926","-5","0"
+"46781","Poneto","IN","40.641626","-85.24984","-5","0"
+"46782","Preble","IN","40.83204","-85.005402","-5","0"
+"46783","Roanoke","IN","40.967646","-85.34315","-5","0"
+"46784","Rome City","IN","41.493637","-85.37745","-5","0"
+"46785","Saint Joe","IN","41.317967","-84.89306","-5","0"
+"46786","South Milford","IN","41.536899","-85.319241","-5","0"
+"46787","South Whitley","IN","41.080236","-85.62796","-5","0"
+"46788","Spencerville","IN","41.267553","-84.93525","-5","0"
+"46789","Stroh","IN","41.583493","-85.199186","-5","0"
+"46791","Uniondale","IN","40.830096","-85.24399","-5","0"
+"46792","Warren","IN","40.683261","-85.43218","-5","0"
+"46793","Waterloo","IN","41.441775","-85.01837","-5","0"
+"46794","Wawaka","IN","41.462326","-85.45882","-5","0"
+"46795","Wolcottville","IN","41.551546","-85.35463","-5","0"
+"46796","Wolflake","IN","41.336115","-85.500246","-5","0"
+"46797","Woodburn","IN","41.129274","-84.86982","-5","0"
+"46798","Yoder","IN","40.942397","-85.23342","-5","0"
+"46799","Zanesville","IN","40.916397","-85.28232","-5","0"
+"46801","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46802","Fort Wayne","IN","41.071681","-85.15101","-5","0"
+"46803","Fort Wayne","IN","41.070498","-85.10706","-5","0"
+"46804","Fort Wayne","IN","41.054247","-85.23878","-5","0"
+"46805","Fort Wayne","IN","41.098248","-85.12061","-5","0"
+"46806","Fort Wayne","IN","41.048148","-85.11114","-5","0"
+"46807","Fort Wayne","IN","41.046848","-85.14481","-5","0"
+"46808","Fort Wayne","IN","41.094348","-85.16151","-5","0"
+"46809","Fort Wayne","IN","41.023147","-85.1826","-5","0"
+"46814","Fort Wayne","IN","41.044502","-85.30984","-5","0"
+"46815","Fort Wayne","IN","41.105691","-85.06509","-5","0"
+"46816","Fort Wayne","IN","41.006281","-85.0692","-5","0"
+"46818","Fort Wayne","IN","41.148298","-85.22159","-5","0"
+"46819","Fort Wayne","IN","40.993914","-85.14262","-5","0"
+"46825","Fort Wayne","IN","41.150677","-85.12181","-5","0"
+"46835","Fort Wayne","IN","41.138599","-85.05941","-5","0"
+"46845","Fort Wayne","IN","41.200465","-85.10219","-5","0"
+"46848","Huntertown","IN","41.221366","-85.172053","-5","0"
+"46850","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46851","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46852","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46853","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46854","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46855","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46856","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46857","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46858","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46859","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46860","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46861","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46862","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46863","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46864","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46865","Fort Wayne","IN","41.126298","-85.090669","-5","0"
+"46866","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46867","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46868","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46869","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46885","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46891","Fort Wayne","IN","41.018247","-85.148284","-5","0"
+"46895","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46896","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46897","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46898","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46899","Fort Wayne","IN","41.093763","-85.070713","-5","0"
+"46901","Kokomo","IN","40.501576","-86.14677","-5","0"
+"46902","Kokomo","IN","40.450623","-86.12127","-5","0"
+"46903","Kokomo","IN","40.469625","-86.11894","-5","0"
+"46904","Kokomo","IN","40.469625","-86.11894","-5","0"
+"46910","Akron","IN","41.040643","-86.03829","-5","0"
+"46911","Amboy","IN","40.614885","-85.93863","-5","0"
+"46912","Athens","IN","41.040988","-86.206925","-5","0"
+"46913","Bringhurst","IN","40.507086","-86.50127","-5","0"
+"46914","Bunker Hill","IN","40.646736","-86.09952","-5","0"
+"46915","Burlington","IN","40.495181","-86.394248","-5","0"
+"46916","Burrows","IN","40.584272","-86.573952","-5","0"
+"46917","Camden","IN","40.626913","-86.475","-5","0"
+"46919","Converse","IN","40.580773","-85.86648","-5","0"
+"46920","Cutler","IN","40.472125","-86.47781","-5","0"
+"46921","Deedsville","IN","40.911001","-86.10052","-5","0"
+"46922","Delong","IN","41.040988","-86.206925","-5","0"
+"46923","Delphi","IN","40.597574","-86.65297","-5","0"
+"46926","Denver","IN","40.873913","-86.06339","-5","0"
+"46928","Fairmount","IN","40.412026","-85.65476","-5","0"
+"46929","Flora","IN","40.542108","-86.497","-5","0"
+"46930","Fowlerton","IN","40.409668","-85.57179","-5","0"
+"46931","Fulton","IN","40.947157","-86.26393","-5","0"
+"46932","Galveston","IN","40.593036","-86.23191","-5","0"
+"46933","Gas City","IN","40.48684","-85.60772","-5","0"
+"46935","Grass Creek","IN","41.040988","-86.206925","-5","0"
+"46936","Greentown","IN","40.482338","-85.94279","-5","0"
+"46937","Hemlock","IN","40.418662","-86.018139","-5","0"
+"46938","Jonesboro","IN","40.468157","-85.63456","-5","0"
+"46939","Kewanna","IN","41.007625","-86.4016","-5","0"
+"46940","La Fontaine","IN","40.680911","-85.72135","-5","0"
+"46941","Lagro","IN","40.832028","-85.70333","-5","0"
+"46942","Lake Cicott","IN","40.736111","-86.37341","-5","0"
+"46943","Laketon","IN","40.974439","-85.83873","-5","0"
+"46945","Leiters Ford","IN","41.040988","-86.206925","-5","0"
+"46946","Liberty Mills","IN","41.035728","-85.73528","-5","0"
+"46947","Logansport","IN","40.754787","-86.36684","-5","0"
+"46950","Lucerne","IN","40.882776","-86.38446","-5","0"
+"46951","Macy","IN","40.952117","-86.1172","-5","0"
+"46952","Marion","IN","40.58119","-85.66324","-5","0"
+"46953","Marion","IN","40.53089","-85.65922","-5","0"
+"46957","Matthews","IN","40.387885","-85.49905","-5","0"
+"46958","Mexico","IN","40.820851","-86.11735","-5","0"
+"46959","Miami","IN","40.614644","-86.10749","-5","0"
+"46960","Monterey","IN","41.159868","-86.50246","-5","0"
+"46961","New Waverly","IN","40.765286","-86.1918","-5","0"
+"46962","North Manchester","IN","40.996628","-85.7758","-5","0"
+"46965","Oakford","IN","40.412741","-86.101484","-5","0"
+"46966","Harrison","IN","41.046274","-86.563025","-5","0"
+"46967","Onward","IN","40.694298","-86.204238","-5","0"
+"46968","Ora","IN","41.172438","-86.55239","-5","0"
+"46970","Peru","IN","40.753091","-86.07185","-5","0"
+"46971","Grissom AFB","IN","40.780955","-86.016441","-5","0"
+"46974","Roann","IN","40.935304","-85.92906","-5","0"
+"46975","Rochester","IN","41.073678","-86.23521","-5","0"
+"46977","Rockfield","IN","40.584272","-86.573952","-5","0"
+"46978","Royal Center","IN","40.860779","-86.50183","-5","0"
+"46979","Russiaville","IN","40.427588","-86.26918","-5","0"
+"46980","Servia","IN","40.848927","-85.792501","-5","0"
+"46982","Silver Lake","IN","41.054969","-85.90441","-5","0"
+"46984","Somerset","IN","40.671369","-85.828846","-5","0"
+"46985","Star City","IN","40.950873","-86.57394","-5","0"
+"46986","Swayzee","IN","40.504346","-85.82678","-5","0"
+"46987","Sweetser","IN","40.569731","-85.76697","-5","0"
+"46988","Twelve Mile","IN","40.870115","-86.23359","-5","0"
+"46989","Upland","IN","40.457599","-85.49089","-5","0"
+"46990","Urbana","IN","40.898561","-85.7457","-5","0"
+"46991","Van Buren","IN","40.620755","-85.50548","-5","0"
+"46992","Wabash","IN","40.795068","-85.82953","-5","0"
+"46994","Walton","IN","40.668348","-86.24943","-5","0"
+"46995","West Middleton","IN","40.442117","-86.215482","-5","0"
+"46996","Winamac","IN","41.048063","-86.64799","-5","0"
+"46998","Young America","IN","40.569059","-86.34952","-5","0"
+"47001","Aurora","IN","39.060204","-84.93094","-5","0"
+"47003","West College Corner","IN","39.567147","-84.82042","-5","0"
+"47006","Batesville","IN","39.291624","-85.21961","-5","0"
+"47010","Bath","IN","39.518217","-84.82728","-5","0"
+"47011","Bennington","IN","38.848761","-85.07263","-5","0"
+"47012","Brookville","IN","39.43115","-84.99568","-5","0"
+"47016","Cedar Grove","IN","39.37427","-84.91113","-5","0"
+"47017","Cross Plains","IN","38.93049","-85.19406","-5","0"
+"47018","Dillsboro","IN","38.992471","-85.06601","-5","0"
+"47019","East Enterprise","IN","38.881346","-84.94437","-5","0"
+"47020","Florence","IN","38.813326","-84.94113","-5","0"
+"47021","Friendship","IN","38.966859","-85.1453","-5","0"
+"47022","Guilford","IN","39.206203","-84.94922","-5","0"
+"47023","Holton","IN","39.07308","-85.38747","-5","0"
+"47024","Laurel","IN","39.491509","-85.19242","-5","0"
+"47025","Lawrenceburg","IN","39.129059","-84.85887","-5","0"
+"47030","Metamora","IN","39.428752","-85.13141","-5","0"
+"47031","Milan","IN","39.126201","-85.14049","-5","0"
+"47032","Moores Hill","IN","39.075691","-85.06057","-5","0"
+"47033","Morris","IN","39.281429","-85.1739","-5","0"
+"47034","Napoleon","IN","39.205405","-85.32865","-5","0"
+"47035","New Trenton","IN","39.310292","-84.90196","-5","0"
+"47036","Oldenburg","IN","39.382381","-85.24073","-5","0"
+"47037","Osgood","IN","39.1548","-85.30949","-5","0"
+"47038","Patriot","IN","38.855749","-84.83861","-5","0"
+"47039","Pierceville","IN","39.111625","-85.255114","-5","0"
+"47040","Rising Sun","IN","38.944426","-84.91227","-5","0"
+"47041","Sunman","IN","39.240684","-85.08587","-5","0"
+"47042","Versailles","IN","39.035173","-85.26017","-5","0"
+"47043","Vevay","IN","38.788449","-85.06618","-5","0"
+"47045","Jefferson","IN","38.77905","-84.99462","-5","0"
+"47048","Bloomington","IN","39.155801","-86.516419","-5","0"
+"47060","West Harrison","IN","39.288178","-84.87774","-5","0"
+"47070","Lovett","IN","38.897246","-85.726384","-5","0"
+"47093","Jefferson","IN","38.762649","-85.041244","-5","0"
+"47102","Austin","IN","38.749542","-85.80264","-5","0"
+"47104","Bethlehem","IN","38.539899","-85.421753","-5","1"
+"47106","Borden","IN","38.457573","-85.91774","-5","1"
+"47107","Bradford","IN","38.190314","-86.115257","-5","1"
+"47108","Campbellsburg","IN","38.648032","-86.26288","-5","0"
+"47110","Central","IN","38.096971","-86.172327","-5","1"
+"47111","Charlestown","IN","38.453813","-85.65443","-5","1"
+"47112","Corydon","IN","38.208144","-86.12978","-5","1"
+"47114","Crandall","IN","38.287227","-86.06805","-5","1"
+"47115","Depauw","IN","38.350106","-86.22652","-5","1"
+"47116","Eckerty","IN","38.328419","-86.61356","-5","0"
+"47117","Elizabeth","IN","38.12173","-85.97453","-5","1"
+"47118","English","IN","38.311323","-86.47439","-5","0"
+"47119","Floyds Knobs","IN","38.345815","-85.89095","-5","1"
+"47120","Fredericksburg","IN","38.435326","-86.18702","-5","0"
+"47122","Georgetown","IN","38.300674","-85.96698","-5","1"
+"47123","Grantsburg","IN","38.284524","-86.46103","-5","0"
+"47124","Greenville","IN","38.363632","-85.99239","-5","1"
+"47125","Hardinsburg","IN","38.461255","-86.2983","-5","0"
+"47126","Henryville","IN","38.544777","-85.7737","-5","1"
+"47128","Madison","IN","38.557243","-86.261089","-5","0"
+"47129","Clarksville","IN","38.303945","-85.76787","-5","1"
+"47130","Jeffersonville","IN","38.309105","-85.72035","-5","1"
+"47131","Jeffersonville","IN","38.437021","-85.704973","-5","1"
+"47132","Jeffersonville","IN","38.286819","-85.732062","-5","1"
+"47133","Jeffersonville","IN","38.286819","-85.732062","-5","1"
+"47134","Jeffersonville","IN","38.286819","-85.732062","-5","1"
+"47135","Laconia","IN","38.038838","-86.07212","-5","1"
+"47136","Lanesville","IN","38.237852","-85.96834","-5","1"
+"47137","Leavenworth","IN","38.200101","-86.36988","-5","0"
+"47138","Lexington","IN","38.678365","-85.6097","-5","0"
+"47139","Little York","IN","38.700523","-85.90405","-5","0"
+"47140","Marengo","IN","38.37482","-86.35313","-5","0"
+"47141","Marysville","IN","38.543388","-85.60373","-5","1"
+"47142","Mauckport","IN","38.079482","-86.23083","-5","1"
+"47143","Memphis","IN","38.473919","-85.76702","-5","1"
+"47144","Jeffersonville","IN","38.286819","-85.732062","-5","1"
+"47145","Milltown","IN","38.344403","-86.29997","-5","0"
+"47146","Mount Saint Francis","IN","38.298486","-85.896961","-5","1"
+"47147","Nabb","IN","38.591735","-85.53195","-5","1"
+"47150","New Albany","IN","38.30382","-85.82522","-5","1"
+"47151","New Albany","IN","38.298486","-85.896961","-5","1"
+"47160","New Middletown","IN","38.165541","-86.05223","-5","1"
+"47161","New Salisbury","IN","38.312878","-86.09478","-5","1"
+"47162","New Washington","IN","38.548693","-85.49124","-5","1"
+"47163","Otisco","IN","38.544512","-85.66831","-5","1"
+"47164","Palmyra","IN","38.410145","-86.09643","-5","1"
+"47165","Pekin","IN","38.49903","-86.01293","-5","0"
+"47166","Ramsey","IN","38.313345","-86.16656","-5","1"
+"47167","Salem","IN","38.605039","-86.08928","-5","0"
+"47169","Washington","IN","38.609733","-86.055202","-5","0"
+"47170","Scottsburg","IN","38.684426","-85.80304","-5","0"
+"47172","Sellersburg","IN","38.387722","-85.75936","-5","1"
+"47174","Sulphur","IN","38.210303","-86.46657","-5","0"
+"47175","Taswell","IN","38.355935","-86.55656","-5","0"
+"47177","Underwood","IN","38.603451","-85.76711","-5","1"
+"47190","Jeffersonville","IN","38.437021","-85.704973","-5","1"
+"47199","Jeffersonville","IN","38.286819","-85.732062","-5","1"
+"47201","Columbus","IN","39.185341","-85.9456","-5","0"
+"47202","Columbus","IN","39.192972","-85.885168","-5","0"
+"47203","Columbus","IN","39.232235","-85.86356","-5","0"
+"47220","Brownstown","IN","38.876537","-86.04252","-5","0"
+"47223","Butlerville","IN","39.049336","-85.49272","-5","0"
+"47224","Canaan","IN","38.896209","-85.21936","-5","0"
+"47225","Clarksburg","IN","39.424072","-85.347677","-5","0"
+"47226","Clifford","IN","39.28249","-85.86852","-5","0"
+"47227","Commiskey","IN","38.872926","-85.64367","-5","0"
+"47228","Cortland","IN","38.974458","-85.962761","-5","0"
+"47229","Crothersville","IN","38.802486","-85.84894","-5","0"
+"47230","Deputy","IN","38.802781","-85.62922","-5","0"
+"47231","Dupont","IN","38.8937","-85.5097","-5","0"
+"47232","Elizabethtown","IN","39.129171","-85.8013","-5","0"
+"47234","Flat Rock","IN","39.370375","-85.78008","-5","0"
+"47235","Freetown","IN","38.982358","-86.13561","-5","0"
+"47236","Grammer","IN","39.152228","-85.726135","-5","0"
+"47240","Greensburg","IN","39.333248","-85.47579","-5","0"
+"47241","Bedford","IN","38.873216","-86.518002","-5","0"
+"47243","Hanover","IN","38.699654","-85.47234","-5","0"
+"47244","Hartsville","IN","39.246458","-85.70234","-5","0"
+"47245","Hayden","IN","39.001301","-85.619906","-5","0"
+"47246","Hope","IN","39.297144","-85.76741","-5","0"
+"47247","Jonesville","IN","39.0601","-85.88879","-5","0"
+"47249","Kurtz","IN","38.897974","-86.056681","-5","0"
+"47250","Madison","IN","38.787175","-85.38031","-5","0"
+"47256","North Vernon","IN","39.037187","-85.617307","-5","0"
+"47257","North Vernon","IN","39.005651","-85.611994","-5","0"
+"47260","Medora","IN","38.846345","-86.18327","-5","0"
+"47261","Millhousen","IN","39.292004","-85.491788","-5","0"
+"47262","Nebraska","IN","39.001301","-85.619906","-5","0"
+"47263","New Point","IN","39.308947","-85.33006","-5","0"
+"47264","Norman","IN","38.962997","-86.27469","-5","0"
+"47265","North Vernon","IN","39.011225","-85.63325","-5","0"
+"47270","Paris Crossing","IN","38.838706","-85.71245","-5","0"
+"47272","Saint Paul","IN","39.419641","-85.62782","-5","0"
+"47273","Scipio","IN","39.085027","-85.7316","-5","0"
+"47274","Seymour","IN","38.958688","-85.89917","-5","0"
+"47280","Taylorsville","IN","39.296605","-85.95025","-5","0"
+"47281","Vallonia","IN","38.805185","-86.09283","-5","0"
+"47282","Vernon","IN","38.982269","-85.60914","-5","0"
+"47283","Westport","IN","39.171916","-85.58067","-5","0"
+"47288","Cayuga","IN","39.952253","-87.453249","-5","0"
+"47302","Muncie","IN","40.164393","-85.38114","-5","0"
+"47303","Muncie","IN","40.221103","-85.37602","-5","0"
+"47304","Muncie","IN","40.215398","-85.43636","-5","0"
+"47305","Muncie","IN","40.192293","-85.38494","-5","0"
+"47306","Muncie","IN","40.202293","-85.408221","-5","0"
+"47307","Muncie","IN","40.162093","-85.442772","-5","0"
+"47308","Muncie","IN","40.227938","-85.396685","-5","0"
+"47317","Kennard","IN","39.902534","-85.520201","-5","0"
+"47320","Albany","IN","40.290747","-85.25293","-5","0"
+"47322","Bentonville","IN","39.656994","-85.167996","-5","0"
+"47324","Boston","IN","39.757864","-84.848442","-5","0"
+"47325","Brownsville","IN","39.685481","-85.02454","-5","0"
+"47326","Bryant","IN","40.548194","-84.96724","-5","0"
+"47327","Cambridge City","IN","39.816703","-85.17784","-5","0"
+"47330","Centerville","IN","39.802089","-85.00994","-5","0"
+"47331","Connersville","IN","39.644794","-85.14929","-5","0"
+"47334","Daleville","IN","40.117139","-85.54205","-5","0"
+"47335","Dublin","IN","39.812688","-85.204359","-5","0"
+"47336","Dunkirk","IN","40.38509","-85.2115","-5","0"
+"47337","Dunreith","IN","39.802917","-85.43806","-5","0"
+"47338","Eaton","IN","40.339779","-85.34956","-5","0"
+"47339","Economy","IN","39.97566","-85.10107","-5","0"
+"47340","Farmland","IN","40.184743","-85.13","-5","0"
+"47341","Fountain City","IN","39.963113","-84.9142","-5","0"
+"47342","Gaston","IN","40.320458","-85.50656","-5","0"
+"47344","Greensboro","IN","39.876764","-85.46546","-5","0"
+"47345","Greens Fork","IN","39.883711","-85.04618","-5","0"
+"47346","Hagerstown","IN","39.918857","-85.16333","-5","0"
+"47348","Hartford City","IN","40.449883","-85.36442","-5","0"
+"47351","Kennard","IN","39.904323","-85.5198","-5","0"
+"47352","Lewisville","IN","39.802646","-85.35541","-5","0"
+"47353","Liberty","IN","39.622812","-84.92284","-5","0"
+"47354","Losantville","IN","40.043267","-85.20909","-5","0"
+"47355","Lynn","IN","40.042138","-84.93926","-5","0"
+"47356","Middletown","IN","40.035904","-85.52036","-5","0"
+"47357","Milton","IN","39.773709","-85.14847","-5","0"
+"47358","Modoc","IN","40.043409","-85.11692","-5","0"
+"47359","Montpelier","IN","40.550511","-85.28118","-5","0"
+"47360","Mooreland","IN","40.00296","-85.25831","-5","0"
+"47361","Mount Summit","IN","40.004196","-85.38641","-5","0"
+"47362","New Castle","IN","39.92698","-85.3697","-5","0"
+"47366","New Lisbon","IN","39.931785","-85.398625","-5","0"
+"47367","Oakville","IN","40.079197","-85.389978","-5","0"
+"47368","Parker City","IN","40.187403","-85.20421","-5","0"
+"47369","Pennville","IN","40.495879","-85.14637","-5","0"
+"47370","Pershing","IN","39.861314","-85.147437","-5","0"
+"47371","Portland","IN","40.419489","-84.96936","-5","0"
+"47373","Redkey","IN","40.34703","-85.15474","-5","0"
+"47374","Richmond","IN","39.831061","-84.89067","-5","0"
+"47375","Richmond","IN","39.860417","-85.015983","-5","0"
+"47380","Ridgeville","IN","40.285505","-85.02063","-5","0"
+"47381","Salamonia","IN","40.382778","-84.86603","-5","0"
+"47382","Saratoga","IN","40.236181","-84.91901","-5","0"
+"47383","Selma","IN","40.168528","-85.2698","-5","0"
+"47384","Shirley","IN","39.90952","-85.56716","-5","0"
+"47385","Spiceland","IN","39.832904","-85.44117","-5","0"
+"47386","Springport","IN","40.058307","-85.38566","-5","0"
+"47387","Straughn","IN","39.838735","-85.28409","-5","0"
+"47388","Sulphur Springs","IN","40.005999","-85.44341","-5","0"
+"47390","Union City","IN","40.212425","-84.83422","-5","0"
+"47392","Webster","IN","39.903236","-84.94334","-5","0"
+"47393","Williamsburg","IN","39.953627","-84.99542","-5","0"
+"47394","Winchester","IN","40.173141","-84.97922","-5","0"
+"47395","Lynn","IN","40.05085","-84.938878","-5","0"
+"47396","Yorktown","IN","40.186603","-85.5056","-5","0"
+"47398","Hartford City","IN","40.461432","-85.377969","-5","0"
+"47401","Bloomington","IN","39.131576","-86.49743","-5","0"
+"47402","Bloomington","IN","39.173234","-86.501543","-5","0"
+"47403","Bloomington","IN","39.121719","-86.57409","-5","0"
+"47404","Bloomington","IN","39.188246","-86.56779","-5","0"
+"47405","Bloomington","IN","39.173447","-86.515145","-5","0"
+"47406","Bloomington","IN","39.173597","-86.51676","-5","0"
+"47407","Bloomington","IN","39.173234","-86.501543","-5","0"
+"47408","Bloomington","IN","39.183164","-86.50293","-5","0"
+"47412","Evansville","IN","37.975102","-87.626938","-6","1"
+"47420","Avoca","IN","38.912898","-86.55097","-5","0"
+"47421","Bedford","IN","38.865549","-86.46897","-5","0"
+"47424","Bloomfield","IN","39.021657","-86.90202","-5","0"
+"47426","Clear Creek","IN","39.173234","-86.501543","-5","0"
+"47427","Coal City","IN","39.232338","-87.03271","-5","0"
+"47429","Ellettsville","IN","39.245995","-86.62275","-5","0"
+"47430","Fort Ritner","IN","38.773826","-86.28146","-5","0"
+"47431","Freedom","IN","39.235092","-86.88719","-5","0"
+"47432","French Lick","IN","38.507726","-86.62922","-5","0"
+"47433","Gosport","IN","39.355692","-86.66247","-5","0"
+"47434","Harrodsburg","IN","39.012984","-86.545732","-5","0"
+"47435","Helmsburg","IN","39.196272","-86.230212","-5","0"
+"47436","Heltonville","IN","38.978916","-86.4169","-5","0"
+"47437","Huron","IN","38.722153","-86.670987","-5","0"
+"47438","Jasonville","IN","39.160126","-87.19961","-5","0"
+"47439","Koleen","IN","39.037144","-86.961577","-5","0"
+"47441","Linton","IN","39.039636","-87.16987","-5","0"
+"47443","Lyons","IN","38.96555","-87.09917","-5","0"
+"47445","Midland","IN","39.125078","-87.19332","-5","0"
+"47446","Mitchell","IN","38.733355","-86.49319","-5","0"
+"47448","Nashville","IN","39.199357","-86.2395","-5","0"
+"47449","Newberry","IN","38.926709","-87.0031","-5","0"
+"47451","Oolitic","IN","38.896413","-86.52474","-5","0"
+"47452","Orleans","IN","38.647931","-86.43438","-5","0"
+"47453","Owensburg","IN","38.924067","-86.74308","-5","0"
+"47454","Paoli","IN","38.533167","-86.48362","-5","0"
+"47455","Patricksburg","IN","39.311243","-86.95343","-5","0"
+"47456","Quincy","IN","39.448838","-86.73117","-5","0"
+"47457","Scotland","IN","39.037144","-86.961577","-5","0"
+"47458","Smithville","IN","39.173234","-86.501543","-5","0"
+"47459","Solsberry","IN","39.110903","-86.74855","-5","0"
+"47460","Spencer","IN","39.290029","-86.77844","-5","0"
+"47462","Springville","IN","38.967187","-86.63699","-5","0"
+"47463","Stanford","IN","39.085896","-86.6689","-5","0"
+"47464","Stinesville","IN","39.298595","-86.6512","-5","0"
+"47465","Switz City","IN","39.039348","-87.04871","-5","0"
+"47467","Tunnelton","IN","38.768275","-86.34441","-5","0"
+"47468","Unionville","IN","39.251349","-86.3935","-5","0"
+"47469","West Baden Springs","IN","38.584248","-86.61296","-5","0"
+"47470","Williams","IN","38.845709","-86.68869","-5","0"
+"47471","Worthington","IN","39.123925","-86.9845","-5","0"
+"47485","Lewis","IN","39.191057","-87.231182","-5","0"
+"47488","Hamblen","IN","39.246268","-86.163826","-5","0"
+"47490","Bloomington","IN","39.173234","-86.501543","-5","0"
+"47501","Washington","IN","38.658196","-87.17619","-5","0"
+"47512","Bicknell","IN","38.777038","-87.31447","-5","0"
+"47513","Birdseye","IN","38.316017","-86.70118","-5","0"
+"47514","Branchville","IN","38.137325","-86.58477","-5","0"
+"47515","Bristow","IN","38.184046","-86.71714","-5","0"
+"47516","Bruceville","IN","38.762261","-87.4228","-5","0"
+"47519","Cannelburg","IN","38.619866","-86.98761","-5","0"
+"47520","Cannelton","IN","37.934311","-86.67821","-5","0"
+"47521","Celestine","IN","38.387935","-86.74717","-5","0"
+"47522","Crane","IN","38.893458","-86.8507","-5","0"
+"47523","Dale","IN","38.170876","-86.99889","-6","1"
+"47524","Decker","IN","38.507039","-87.55539","-5","0"
+"47525","Derby","IN","38.031757","-86.55613","-5","0"
+"47527","Dubois","IN","38.473956","-86.77777","-5","0"
+"47528","Edwardsport","IN","38.824546","-87.25186","-5","0"
+"47529","Elnora","IN","38.869876","-87.08288","-5","0"
+"47531","Evanston","IN","38.056909","-86.82196","-6","1"
+"47532","Ferdinand","IN","38.22309","-86.86155","-5","0"
+"47535","Freelandville","IN","38.867886","-87.30865","-5","0"
+"47536","Fulda","IN","38.112396","-86.83649","-6","1"
+"47537","Gentryville","IN","38.099889","-87.04073","-6","1"
+"47541","Holland","IN","38.241887","-87.04145","-5","0"
+"47542","Huntingburg","IN","38.302272","-86.96864","-5","0"
+"47545","Ireland","IN","38.413906","-87.0006","-5","0"
+"47546","Jasper","IN","38.408794","-86.93876","-5","0"
+"47547","Jasper","IN","38.364749","-86.876173","-5","0"
+"47549","Jasper","IN","38.364749","-86.876173","-5","0"
+"47550","Lamar","IN","38.077016","-86.92258","-6","1"
+"47551","Leopold","IN","38.127871","-86.558","-5","0"
+"47552","Lincoln City","IN","38.118547","-86.99567","-6","1"
+"47553","Loogootee","IN","38.702827","-86.89775","-5","0"
+"47556","Mariah Hill","IN","38.16644","-86.917205","-6","1"
+"47557","Monroe City","IN","38.588354","-87.34174","-5","0"
+"47558","Montgomery","IN","38.660051","-87.04626","-5","0"
+"47561","Oaktown","IN","38.864563","-87.44554","-5","0"
+"47562","Odon","IN","38.837695","-86.98512","-5","0"
+"47564","Otwell","IN","38.470473","-87.09905","-5","0"
+"47567","Petersburg","IN","38.477037","-87.30217","-5","0"
+"47568","Plainville","IN","38.791938","-87.13975","-5","0"
+"47573","Ragsdale","IN","38.744136","-87.321357","-5","0"
+"47574","Rome","IN","37.934212","-86.56537","-5","0"
+"47575","Saint Anthony","IN","38.313717","-86.81523","-5","0"
+"47576","Saint Croix","IN","38.19297","-86.60853","-5","0"
+"47577","Saint Meinrad","IN","38.160168","-86.80978","-6","1"
+"47578","Sandborn","IN","38.892783","-87.1913","-5","0"
+"47579","Santa Claus","IN","38.115573","-86.91993","-6","1"
+"47580","Schnellville","IN","38.345103","-86.75914","-5","0"
+"47581","Shoals","IN","38.663011","-86.77554","-5","0"
+"47584","Spurgeon","IN","38.248608","-87.24115","-5","0"
+"47585","Stendal","IN","38.267827","-87.14299","-5","0"
+"47586","Tell City","IN","37.971622","-86.73903","-5","0"
+"47588","Troy","IN","38.012451","-86.79698","-6","1"
+"47590","Velpen","IN","38.356658","-87.10155","-5","0"
+"47591","Vincennes","IN","38.668827","-87.50791","-5","0"
+"47596","Westphalia","IN","38.862609","-87.2247","-5","0"
+"47597","Wheatland","IN","38.652821","-87.30088","-5","0"
+"47598","Winslow","IN","38.384501","-87.20987","-5","0"
+"47601","Boonville","IN","38.05732","-87.26579","-6","1"
+"47610","Chandler","IN","38.047188","-87.39041","-6","1"
+"47611","Chrisney","IN","38.022045","-87.05408","-6","1"
+"47612","Cynthiana","IN","38.190517","-87.7024","-6","1"
+"47613","Elberfeld","IN","38.170645","-87.42886","-6","1"
+"47614","Folsomville","IN","38.130034","-87.163636","-6","1"
+"47615","Grandview","IN","37.965531","-86.95436","-6","1"
+"47616","Griffin","IN","38.218814","-87.92435","-6","1"
+"47617","Hatfield","IN","37.903557","-87.249886","-6","1"
+"47618","Inglefield","IN","37.997128","-87.574963","-6","1"
+"47619","Lynnville","IN","38.199662","-87.31132","-6","1"
+"47620","Mount Vernon","IN","37.940511","-87.88918","-6","1"
+"47625","North Vernon","IN","39.00249","-85.625718","-5","0"
+"47629","Newburgh","IN","38.06242","-87.245214","-6","1"
+"47630","Newburgh","IN","37.958873","-87.37998","-6","1"
+"47631","New Harmony","IN","38.117974","-87.91918","-6","1"
+"47633","Poseyville","IN","38.168191","-87.78113","-6","1"
+"47634","Richland","IN","37.93889","-87.19167","-6","1"
+"47635","Rockport","IN","37.883451","-87.09771","-6","1"
+"47637","Tennyson","IN","38.132339","-87.14259","-6","1"
+"47638","Wadesville","IN","38.081681","-87.78055","-6","1"
+"47639","Haubstadt","IN","38.187983","-87.5658","-6","1"
+"47640","Hazleton","IN","38.484278","-87.5039","-6","1"
+"47647","Buckskin","IN","38.215226","-87.42319","-6","1"
+"47648","Fort Branch","IN","38.240456","-87.56035","-6","1"
+"47649","Francisco","IN","38.343295","-87.44275","-6","1"
+"47654","Mackey","IN","38.25312","-87.39205","-6","1"
+"47660","Oakland City","IN","38.323439","-87.34145","-6","1"
+"47665","Owensville","IN","38.287411","-87.72954","-6","1"
+"47666","Patoka","IN","38.411923","-87.58462","-6","1"
+"47667","Owensville","IN","38.27312","-87.692037","-6","1"
+"47670","Princeton","IN","38.34841","-87.57478","-6","1"
+"47671","Oxford","IN","40.519221","-87.255079","-5","0"
+"47672","Cynthiana","IN","38.187432","-87.716121","-6","1"
+"47683","Somerville","IN","38.278452","-87.37714","-6","1"
+"47701","Evansville","IN","37.997128","-87.574963","-6","1"
+"47702","Evansville","IN","37.997128","-87.574963","-6","1"
+"47703","Evansville","IN","37.997128","-87.574963","-6","1"
+"47704","Evansville","IN","37.997128","-87.574963","-6","1"
+"47705","Evansville","IN","37.997128","-87.574963","-6","1"
+"47706","Evansville","IN","37.997128","-87.574963","-6","1"
+"47708","Evansville","IN","37.974642","-87.57349","-6","1"
+"47710","Evansville","IN","37.999542","-87.57621","-6","1"
+"47711","Evansville","IN","38.000442","-87.54178","-6","1"
+"47712","Evansville","IN","37.966292","-87.63664","-6","1"
+"47713","Evansville","IN","37.962542","-87.55796","-6","1"
+"47714","Evansville","IN","37.959092","-87.52468","-6","1"
+"47715","Evansville","IN","37.975476","-87.47506","-6","1"
+"47716","Evansville","IN","37.997128","-87.574963","-6","1"
+"47718","Jackson","IN","38.420839","-86.570962","-5","0"
+"47719","Evansville","IN","37.997128","-87.574963","-6","1"
+"47720","Evansville","IN","38.045951","-87.62723","-6","1"
+"47721","Evansville","IN","37.978035","-87.600791","-6","1"
+"47722","Evansville","IN","37.970192","-87.542014","-6","1"
+"47724","Evansville","IN","37.997128","-87.574963","-6","1"
+"47725","Evansville","IN","38.096771","-87.52112","-6","1"
+"47727","Evansville","IN","38.031942","-87.538915","-6","1"
+"47728","Evansville","IN","37.997128","-87.574963","-6","1"
+"47729","Scott","IN","38.110995","-87.527249","-6","1"
+"47730","Evansville","IN","37.997128","-87.574963","-6","1"
+"47731","Evansville","IN","37.997128","-87.574963","-6","1"
+"47732","Evansville","IN","37.997128","-87.574963","-6","1"
+"47733","Evansville","IN","37.997128","-87.574963","-6","1"
+"47734","Evansville","IN","37.997128","-87.574963","-6","1"
+"47735","Evansville","IN","37.997128","-87.574963","-6","1"
+"47736","Evansville","IN","37.997128","-87.574963","-6","1"
+"47737","Evansville","IN","37.997128","-87.574963","-6","1"
+"47739","Evansville","IN","37.997128","-87.574963","-6","1"
+"47740","Evansville","IN","37.997128","-87.574963","-6","1"
+"47741","Evansville","IN","37.997128","-87.574963","-6","1"
+"47744","Evansville","IN","37.977492","-87.597316","-6","1"
+"47747","Evansville","IN","37.997128","-87.574963","-6","1"
+"47750","Evansville","IN","37.962292","-87.505512","-6","1"
+"47765","New Market","IN","39.952416","-86.922974","-5","0"
+"47801","Terre Haute","IN","39.433602","-87.410094","-5","0"
+"47802","Terre Haute","IN","39.393237","-87.3977","-5","0"
+"47803","Terre Haute","IN","39.46706","-87.34452","-5","0"
+"47804","Terre Haute","IN","39.495436","-87.39209","-5","0"
+"47805","Terre Haute","IN","39.535285","-87.35222","-5","0"
+"47807","Terre Haute","IN","39.470986","-87.39996","-5","0"
+"47808","Terre Haute","IN","39.433602","-87.410094","-5","0"
+"47809","Terre Haute","IN","39.470986","-87.41107","-5","0"
+"47811","Terre Haute","IN","39.433602","-87.410094","-5","0"
+"47812","Terre Haute","IN","39.433602","-87.410094","-5","0"
+"47813","Terre Haute","IN","39.433602","-87.410094","-5","0"
+"47814","Terre Haute","IN","39.433602","-87.410094","-5","0"
+"47830","Bellmore","IN","39.779078","-87.221819","-5","0"
+"47831","Blanford","IN","39.877847","-87.443566","-5","0"
+"47832","Bloomingdale","IN","39.869467","-87.24589","-5","0"
+"47833","Bowling Green","IN","39.360169","-86.99353","-5","0"
+"47834","Brazil","IN","39.52503","-87.12738","-5","0"
+"47836","Bridgeton","IN","39.647929","-87.17529","-5","0"
+"47837","Carbon","IN","39.625607","-87.11502","-5","0"
+"47838","Carlisle","IN","38.957093","-87.3793","-5","0"
+"47840","Centerpoint","IN","39.406161","-87.06899","-5","0"
+"47841","Clay City","IN","39.282127","-87.11557","-5","0"
+"47842","Clinton","IN","39.66851","-87.43577","-5","0"
+"47845","Coalmont","IN","39.387544","-87.090363","-5","0"
+"47846","Cory","IN","39.377883","-87.20462","-5","0"
+"47847","Dana","IN","39.830942","-87.47013","-5","0"
+"47848","Dugger","IN","39.065547","-87.25714","-5","0"
+"47849","Fairbanks","IN","39.193884","-87.5449","-5","0"
+"47850","Farmersburg","IN","39.25182","-87.40974","-5","0"
+"47851","Fontanet","IN","39.573663","-87.24536","-5","0"
+"47852","Graysville","IN","39.080474","-87.449558","-5","0"
+"47853","Harmony","IN","39.536856","-87.0721","-5","0"
+"47854","Hillsdale","IN","39.819742","-87.41458","-5","0"
+"47855","Hymera","IN","39.185497","-87.29997","-5","0"
+"47856","Judson","IN","39.813543","-87.13635","-5","0"
+"47857","Knightsville","IN","39.526913","-87.086882","-5","0"
+"47858","Lewis","IN","39.255569","-87.23587","-5","0"
+"47859","Marshall","IN","39.865058","-87.17504","-5","0"
+"47860","Mecca","IN","39.725201","-87.33149","-5","0"
+"47861","Merom","IN","39.061837","-87.56655","-5","0"
+"47862","Montezuma","IN","39.783738","-87.35609","-5","0"
+"47863","New Goshen","IN","39.580862","-87.46293","-5","0"
+"47864","New Lebanon","IN","39.041245","-87.475747","-5","0"
+"47865","Paxton","IN","39.020687","-87.39149","-5","0"
+"47866","Pimento","IN","39.293977","-87.30983","-5","0"
+"47868","Poland","IN","39.414547","-86.90202","-5","0"
+"47869","Prairie Creek","IN","39.433602","-87.410094","-5","0"
+"47870","Prairieton","IN","39.371187","-87.475871","-5","0"
+"47871","Riley","IN","39.388638","-87.301367","-5","0"
+"47872","Rockville","IN","39.758142","-87.1754","-5","0"
+"47874","Rosedale","IN","39.625041","-87.27765","-5","0"
+"47875","Saint Bernice","IN","39.877847","-87.443566","-5","0"
+"47876","Saint Mary Of The Woods","IN","39.505935","-87.46156","-5","0"
+"47878","Seelyville","IN","39.492838","-87.266549","-5","0"
+"47879","Shelburn","IN","39.182707","-87.38029","-5","0"
+"47880","Shepardsville","IN","39.600636","-87.419569","-5","0"
+"47881","Staunton","IN","39.487119","-87.18939","-5","0"
+"47882","Sullivan","IN","39.090479","-87.40667","-5","0"
+"47884","Universal","IN","39.622536","-87.45451","-5","0"
+"47885","West Terre Haute","IN","39.508235","-87.46511","-5","0"
+"47895","Helt","IN","39.714267","-87.524376","-5","0"
+"47901","Lafayette","IN","40.418585","-86.88975","-5","0"
+"47902","Lafayette","IN","40.388656","-86.894908","-5","0"
+"47903","Lafayette","IN","40.304402","-86.824468","-5","0"
+"47904","Lafayette","IN","40.428735","-86.8768","-5","0"
+"47905","Lafayette","IN","40.41836","-86.81847","-5","0"
+"47906","West Lafayette","IN","40.461012","-86.93664","-5","0"
+"47907","West Lafayette","IN","40.424923","-86.916215","-5","0"
+"47909","Lafayette","IN","40.35589","-86.88972","-5","0"
+"47916","Alamo","IN","39.983709","-87.05507","-5","0"
+"47917","Ambia","IN","40.469643","-87.50098","-5","0"
+"47918","Attica","IN","40.294316","-87.21957","-5","0"
+"47920","Battle Ground","IN","40.543522","-86.81628","-5","0"
+"47921","Boswell","IN","40.506071","-87.36849","-5","0"
+"47922","Brook","IN","40.8685","-87.35899","-6","1"
+"47923","Brookston","IN","40.605","-86.8894","-5","0"
+"47924","Buck Creek","IN","40.487219","-86.76381","-5","0"
+"47925","Buffalo","IN","40.882284","-86.74363","-5","0"
+"47926","Burnettsville","IN","40.767098","-86.59362","-5","0"
+"47928","Cayuga","IN","39.946144","-87.46611","-5","0"
+"47929","Chalmers","IN","40.671905","-86.89189","-5","0"
+"47930","Clarks Hill","IN","40.247657","-86.72533","-5","0"
+"47932","Covington","IN","40.133867","-87.40081","-5","0"
+"47933","Crawfordsville","IN","40.034554","-86.89143","-5","0"
+"47934","Crawfordsville","IN","40.040014","-86.893614","-5","0"
+"47935","Crawfordsville","IN","40.040014","-86.893614","-5","0"
+"47936","Crawfordsville","IN","40.040014","-86.893614","-5","0"
+"47937","Crawfordsville","IN","40.040014","-86.893614","-5","0"
+"47938","Crawfordsville","IN","40.040014","-86.893614","-5","0"
+"47939","Crawfordsville","IN","40.040014","-86.893614","-5","0"
+"47940","Darlington","IN","40.118998","-86.76265","-5","0"
+"47941","Dayton","IN","40.375691","-86.76703","-5","0"
+"47942","Earl Park","IN","40.692374","-87.4346","-5","0"
+"47943","Fair Oaks","IN","41.074738","-87.26193","-6","1"
+"47944","Fowler","IN","40.617152","-87.32659","-5","0"
+"47946","Francesville","IN","40.986799","-86.87659","-5","0"
+"47948","Goodland","IN","40.773474","-87.28615","-6","1"
+"47949","Hillsboro","IN","40.072123","-87.13698","-5","0"
+"47950","Idaville","IN","40.794442","-86.65353","-5","0"
+"47951","Kentland","IN","40.77759","-87.44607","-6","1"
+"47952","Kingman","IN","39.968437","-87.29994","-5","0"
+"47954","Ladoga","IN","39.903358","-86.80388","-5","0"
+"47955","Linden","IN","40.19705","-86.88781","-5","0"
+"47957","Medaryville","IN","41.083487","-86.87605","-5","0"
+"47958","Mellott","IN","40.163921","-87.14796","-5","0"
+"47959","Monon","IN","40.860496","-86.88963","-5","0"
+"47960","Monticello","IN","40.777036","-86.75982","-5","0"
+"47962","Montmorenci","IN","40.473159","-87.027571","-5","0"
+"47963","Morocco","IN","40.960029","-87.44715","-6","1"
+"47964","Mount Ayr","IN","40.952608","-87.29837","-6","1"
+"47965","New Market","IN","39.950948","-86.92076","-5","0"
+"47966","Newport","IN","39.885739","-87.4078","-5","0"
+"47967","New Richmond","IN","40.192176","-86.98346","-5","0"
+"47968","New Ross","IN","39.961958","-86.73576","-5","0"
+"47969","Newtown","IN","40.205056","-87.15089","-5","0"
+"47970","Otterbein","IN","40.480675","-87.10907","-5","0"
+"47971","Oxford","IN","40.520834","-87.2444","-5","0"
+"47974","Perrysville","IN","40.043359","-87.4655","-5","0"
+"47975","Pine Village","IN","40.448708","-87.25568","-5","0"
+"47976","Earl Park","IN","40.606301","-87.310042","-5","0"
+"47977","Remington","IN","40.763755","-87.15306","-6","1"
+"47978","Rensselaer","IN","40.962747","-87.13684","-6","1"
+"47980","Reynolds","IN","40.753293","-86.88769","-5","0"
+"47981","Romney","IN","40.246558","-86.91652","-5","0"
+"47982","State Line","IN","40.196628","-87.5271","-5","0"
+"47983","Stockwell","IN","40.285727","-86.77511","-5","0"
+"47984","Talbot","IN","40.606301","-87.310042","-5","0"
+"47986","Templeton","IN","40.512643","-87.20706","-5","0"
+"47987","Veedersburg","IN","40.118561","-87.23646","-5","0"
+"47988","Wallace","IN","39.986538","-87.147674","-5","0"
+"47989","Waveland","IN","39.881586","-87.04635","-5","0"
+"47990","Waynetown","IN","40.071792","-87.06369","-5","0"
+"47991","West Lebanon","IN","40.277121","-87.413","-5","0"
+"47992","Westpoint","IN","40.319429","-87.04867","-5","0"
+"47993","Williamsport","IN","40.300013","-87.38396","-5","0"
+"47994","Wingate","IN","40.170546","-87.06795","-5","0"
+"47995","Wolcott","IN","40.758188","-87.03629","-5","0"
+"47996","West Lafayette","IN","40.388656","-86.894908","-5","0"
+"47997","Yeoman","IN","40.667985","-86.7225","-5","0"
+"48001","Algonac","MI","42.631359","-82.554","-5","1"
+"48002","Allenton","MI","42.938385","-82.91582","-5","1"
+"48003","Almont","MI","42.931178","-83.04585","-5","1"
+"48004","Anchorville","MI","42.824095","-82.66522","-5","1"
+"48005","Armada","MI","42.842554","-82.91471","-5","1"
+"48006","Avoca","MI","43.062285","-82.69327","-5","1"
+"48007","Troy","MI","42.606088","-83.297593","-5","1"
+"48009","Birmingham","MI","42.544084","-83.21527","-5","1"
+"48012","Birmingham","MI","42.604425","-83.292382","-5","1"
+"48014","Capac","MI","43.01185","-82.93255","-5","1"
+"48015","Center Line","MI","42.479137","-83.02449","-5","1"
+"48017","Clawson","MI","42.535534","-83.15112","-5","1"
+"48019","Rose","MI","42.755627","-83.612581","-5","1"
+"48021","Eastpointe","MI","42.466086","-82.94641","-5","1"
+"48022","Emmett","MI","43.013805","-82.79404","-5","1"
+"48023","Fair Haven","MI","42.693915","-82.66859","-5","1"
+"48025","Franklin","MI","42.524134","-83.25454","-5","1"
+"48026","Fraser","MI","42.536402","-82.95044","-5","1"
+"48027","Goodells","MI","42.952553","-82.68571","-5","1"
+"48028","Harsens Island","MI","42.563129","-82.62325","-5","1"
+"48030","Hazel Park","MI","42.459022","-83.09819","-5","1"
+"48032","Jeddo","MI","43.125531","-82.59617","-5","1"
+"48034","Southfield","MI","42.474234","-83.29078","-5","1"
+"48035","Clinton Township","MI","42.554134","-82.90786","-5","1"
+"48036","Clinton Township","MI","42.587117","-82.89837","-5","1"
+"48037","Southfield","MI","42.567543","-83.149978","-5","1"
+"48038","Clinton Township","MI","42.603172","-82.94459","-5","1"
+"48039","Marine City","MI","42.710445","-82.50811","-5","1"
+"48040","Marysville","MI","42.910198","-82.47973","-5","1"
+"48041","Memphis","MI","42.93281","-82.80345","-5","1"
+"48042","Macomb","MI","42.68347","-82.92958","-5","1"
+"48043","Mount Clemens","MI","42.596784","-82.88031","-5","1"
+"48044","Macomb","MI","42.650265","-82.93416","-5","1"
+"48045","Harrison Township","MI","42.582961","-82.83063","-5","1"
+"48046","Mount Clemens","MI","42.672322","-82.903065","-5","1"
+"48047","New Baltimore","MI","42.670932","-82.77754","-5","1"
+"48048","New Haven","MI","42.739751","-82.79758","-5","1"
+"48049","North Street","MI","43.03154","-82.59251","-5","1"
+"48050","New Haven","MI","42.786198","-82.8092","-5","1"
+"48051","New Baltimore","MI","42.682081","-82.83068","-5","1"
+"48054","East China","MI","42.769956","-82.52595","-5","1"
+"48059","Fort Gratiot","MI","43.088742","-82.48614","-5","1"
+"48060","Port Huron","MI","42.978974","-82.44402","-5","1"
+"48061","Port Huron","MI","42.824095","-82.66522","-5","1"
+"48062","Richmond","MI","42.829226","-82.77538","-5","1"
+"48063","Columbus","MI","42.85452","-82.68244","-5","1"
+"48064","Casco","MI","42.773535","-82.67684","-5","1"
+"48065","Romeo","MI","42.826805","-83.02963","-5","1"
+"48066","Roseville","MI","42.503285","-82.93851","-5","1"
+"48067","Royal Oak","MI","42.488735","-83.13752","-5","1"
+"48068","Royal Oak","MI","42.660091","-83.3863","-5","1"
+"48069","Pleasant Ridge","MI","42.472235","-83.14051","-5","1"
+"48070","Huntington Woods","MI","42.482585","-83.16812","-5","1"
+"48071","Madison Heights","MI","42.501385","-83.10474","-5","1"
+"48072","Berkley","MI","42.497035","-83.18532","-5","1"
+"48073","Royal Oak","MI","42.518635","-83.16357","-5","1"
+"48074","Smiths Creek","MI","42.948521","-82.57049","-5","1"
+"48075","Southfield","MI","42.465275","-83.2264","-5","1"
+"48076","Southfield","MI","42.499335","-83.22829","-5","1"
+"48079","Saint Clair","MI","42.833034","-82.50425","-5","1"
+"48080","Saint Clair Shores","MI","42.462036","-82.90232","-5","1"
+"48081","Saint Clair Shores","MI","42.497736","-82.89979","-5","1"
+"48082","Saint Clair Shores","MI","42.526965","-82.88809","-5","1"
+"48083","Troy","MI","42.556943","-83.11506","-5","1"
+"48084","Troy","MI","42.563505","-83.18405","-5","1"
+"48085","Troy","MI","42.597323","-83.116567","-5","1"
+"48086","Southfield","MI","42.660091","-83.3863","-5","1"
+"48088","Warren","MI","42.516851","-82.982757","-5","1"
+"48089","Warren","MI","42.467086","-82.99866","-5","1"
+"48090","Warren","MI","42.672322","-82.903065","-5","1"
+"48091","Warren","MI","42.465886","-83.056","-5","1"
+"48092","Warren","MI","42.511293","-83.0597","-5","1"
+"48093","Warren","MI","42.514885","-82.99768","-5","1"
+"48094","Washington","MI","42.727731","-83.03847","-5","1"
+"48095","Washington","MI","42.779239","-83.02605","-5","1"
+"48096","Ray","MI","42.753378","-82.91658","-5","1"
+"48097","Yale","MI","43.131709","-82.81411","-5","1"
+"48098","Troy","MI","42.599133","-83.15235","-5","1"
+"48099","Troy","MI","42.587643","-83.173666","-5","1"
+"48101","Allen Park","MI","42.254788","-83.21027","-5","1"
+"48103","Ann Arbor","MI","42.280887","-83.79147","-5","1"
+"48104","Ann Arbor","MI","42.266805","-83.72297","-5","1"
+"48105","Ann Arbor","MI","42.307288","-83.70443","-5","1"
+"48106","Ann Arbor","MI","42.253502","-83.836571","-5","1"
+"48107","Ann Arbor","MI","42.253502","-83.836571","-5","1"
+"48108","Ann Arbor","MI","42.232807","-83.72671","-5","1"
+"48109","Ann Arbor","MI","42.291637","-83.71831","-5","1"
+"48110","Azalia","MI","42.008164","-83.664277","-5","1"
+"48111","Belleville","MI","42.194865","-83.49083","-5","1"
+"48112","Belleville","MI","42.239933","-83.150823","-5","1"
+"48113","Ann Arbor","MI","42.253502","-83.836571","-5","1"
+"48114","Brighton","MI","42.566097","-83.75725","-5","1"
+"48115","Bridgewater","MI","42.160216","-83.911693","-5","1"
+"48116","Brighton","MI","42.509476","-83.77718","-5","1"
+"48117","Carleton","MI","42.05589","-83.40605","-5","1"
+"48118","Chelsea","MI","42.316922","-84.03445","-5","1"
+"48120","Dearborn","MI","42.306288","-83.15863","-5","1"
+"48121","Dearborn","MI","42.239933","-83.150823","-5","1"
+"48122","Melvindale","MI","42.281638","-83.18188","-5","1"
+"48123","Dearborn","MI","42.239933","-83.150823","-5","1"
+"48124","Dearborn","MI","42.294987","-83.25049","-5","1"
+"48125","Dearborn Heights","MI","42.277388","-83.25987","-5","1"
+"48126","Dearborn","MI","42.333787","-83.18179","-5","1"
+"48127","Dearborn Heights","MI","42.335687","-83.28332","-5","1"
+"48128","Dearborn","MI","42.320237","-83.26872","-5","1"
+"48130","Dexter","MI","42.344837","-83.89907","-5","1"
+"48131","Dundee","MI","41.965806","-83.67133","-5","1"
+"48133","Erie","MI","41.777302","-83.49818","-5","1"
+"48134","Flat Rock","MI","42.107026","-83.28711","-5","1"
+"48135","Garden City","MI","42.324338","-83.3382","-5","1"
+"48136","Garden City","MI","42.239933","-83.150823","-5","1"
+"48137","Gregory","MI","42.445724","-84.06078","-5","1"
+"48138","Grosse Ile","MI","42.130091","-83.16017","-5","1"
+"48139","Hamburg","MI","42.449117","-83.80332","-5","1"
+"48140","Ida","MI","41.876895","-83.58184","-5","1"
+"48141","Inkster","MI","42.292582","-83.31414","-5","1"
+"48143","Lakeland","MI","42.454366","-83.83372","-5","1"
+"48144","Lambertville","MI","41.754298","-83.63047","-5","1"
+"48145","La Salle","MI","41.846349","-83.44652","-5","1"
+"48146","Lincoln Park","MI","42.243488","-83.18097","-5","1"
+"48150","Livonia","MI","42.365936","-83.36513","-5","1"
+"48151","Livonia","MI","42.239933","-83.150823","-5","1"
+"48152","Livonia","MI","42.427835","-83.36299","-5","1"
+"48153","Livonia","MI","42.239933","-83.150823","-5","1"
+"48154","Livonia","MI","42.396194","-83.37161","-5","1"
+"48157","Luna Pier","MI","41.811196","-83.44141","-5","1"
+"48158","Manchester","MI","42.14784","-84.03123","-5","1"
+"48159","Maybee","MI","42.01968","-83.54756","-5","1"
+"48160","Milan","MI","42.081363","-83.68414","-5","1"
+"48161","Monroe","MI","41.904793","-83.41669","-5","1"
+"48162","Monroe","MI","41.940898","-83.38515","-5","1"
+"48164","New Boston","MI","42.128069","-83.38785","-5","1"
+"48165","New Hudson","MI","42.501401","-83.62916","-5","1"
+"48166","Newport","MI","41.988228","-83.29818","-5","1"
+"48167","Northville","MI","42.425506","-83.48945","-5","1"
+"48168","South Monroe","MI","41.885451","-83.418524","-5","1"
+"48169","Pinckney","MI","42.455063","-83.93425","-5","1"
+"48170","Plymouth","MI","42.370837","-83.4856","-5","1"
+"48173","Rockwood","MI","42.073793","-83.21575","-5","1"
+"48174","Romulus","MI","42.212372","-83.37223","-5","1"
+"48175","Salem","MI","42.405636","-83.578088","-5","1"
+"48176","Saline","MI","42.16489","-83.78387","-5","1"
+"48177","Samaria","MI","41.807647","-83.579334","-5","1"
+"48178","South Lyon","MI","42.45644","-83.66673","-5","1"
+"48179","South Rockwood","MI","42.049534","-83.26128","-5","1"
+"48180","Taylor","MI","42.231788","-83.26481","-5","1"
+"48182","Temperance","MI","41.773203","-83.57793","-5","1"
+"48183","Trenton","MI","42.137071","-83.21446","-5","1"
+"48184","Wayne","MI","42.276688","-83.3786","-5","1"
+"48185","Westland","MI","42.335937","-83.378","-5","1"
+"48186","Westland","MI","42.293787","-83.37464","-5","1"
+"48187","Canton","MI","42.33087","-83.47575","-5","1"
+"48188","Canton","MI","42.289354","-83.47401","-5","1"
+"48189","Whitmore Lake","MI","42.422746","-83.78009","-5","1"
+"48190","Whittaker","MI","42.134658","-83.59684","-5","1"
+"48191","Willis","MI","42.121345","-83.57071","-5","1"
+"48192","Wyandotte","MI","42.199989","-83.17402","-5","1"
+"48195","Southgate","MI","42.205289","-83.19812","-5","1"
+"48197","Ypsilanti","MI","42.223482","-83.63316","-5","1"
+"48198","Ypsilanti","MI","42.247039","-83.58215","-5","1"
+"48201","Detroit","MI","42.343787","-83.05879","-5","1"
+"48202","Detroit","MI","42.375237","-83.07837","-5","1"
+"48203","Highland Park","MI","42.421936","-83.09981","-5","1"
+"48204","Detroit","MI","42.365337","-83.14254","-5","1"
+"48205","Detroit","MI","42.433703","-82.98068","-5","1"
+"48206","Detroit","MI","42.375787","-83.10849","-5","1"
+"48207","Detroit","MI","42.352837","-83.02449","-5","1"
+"48208","Detroit","MI","42.348937","-83.08994","-5","1"
+"48209","Detroit","MI","42.307088","-83.11467","-5","1"
+"48210","Detroit","MI","42.338137","-83.12785","-5","1"
+"48211","Detroit","MI","42.379019","-83.04483","-5","1"
+"48212","Hamtramck","MI","42.410037","-83.05826","-5","1"
+"48213","Detroit","MI","42.395904","-82.99632","-5","1"
+"48214","Detroit","MI","42.368137","-82.99314","-5","1"
+"48215","Detroit","MI","42.378287","-82.95243","-5","1"
+"48216","Detroit","MI","42.328338","-83.07805","-5","1"
+"48217","Detroit","MI","42.277738","-83.1552","-5","1"
+"48218","River Rouge","MI","42.269288","-83.13676","-5","1"
+"48219","Detroit","MI","42.425236","-83.24902","-5","1"
+"48220","Ferndale","MI","42.460986","-83.13398","-5","1"
+"48221","Detroit","MI","42.426786","-83.14969","-5","1"
+"48222","Detroit","MI","42.239933","-83.150823","-5","1"
+"48223","Detroit","MI","42.394586","-83.24422","-5","1"
+"48224","Detroit","MI","42.410487","-82.94348","-5","1"
+"48225","Harper Woods","MI","42.438186","-82.9283","-5","1"
+"48226","Detroit","MI","42.331821","-83.04888","-5","1"
+"48227","Detroit","MI","42.388786","-83.1918","-5","1"
+"48228","Detroit","MI","42.355437","-83.21722","-5","1"
+"48229","Ecorse","MI","42.250505","-83.14829","-5","1"
+"48230","Grosse Pointe","MI","42.386087","-82.92426","-5","1"
+"48231","Detroit","MI","42.239933","-83.150823","-5","1"
+"48232","Detroit","MI","42.239933","-83.150823","-5","1"
+"48233","Detroit","MI","42.239933","-83.150823","-5","1"
+"48234","Detroit","MI","42.432686","-83.04422","-5","1"
+"48235","Detroit","MI","42.427636","-83.19547","-5","1"
+"48236","Grosse Pointe","MI","42.425836","-82.90003","-5","1"
+"48237","Oak Park","MI","42.467235","-83.17952","-5","1"
+"48238","Detroit","MI","42.396736","-83.14152","-5","1"
+"48239","Redford","MI","42.379436","-83.29105","-5","1"
+"48240","Redford","MI","42.426285","-83.30197","-5","1"
+"48242","Detroit","MI","42.20649","-83.35297","-5","1"
+"48243","Detroit","MI","42.239933","-83.150823","-5","1"
+"48244","Detroit","MI","42.239933","-83.150823","-5","1"
+"48246","Independence","MI","42.712944","-83.348152","-5","1"
+"48254","Detroit","MI","42.239933","-83.150823","-5","1"
+"48255","Detroit","MI","42.239933","-83.150823","-5","1"
+"48258","Detroit","MI","42.239933","-83.150823","-5","1"
+"48260","Detroit","MI","42.239933","-83.150823","-5","1"
+"48264","Detroit","MI","42.239933","-83.150823","-5","1"
+"48265","Detroit","MI","42.239933","-83.150823","-5","1"
+"48266","Detroit","MI","42.239933","-83.150823","-5","1"
+"48267","Detroit","MI","42.239933","-83.150823","-5","1"
+"48268","Detroit","MI","42.239933","-83.150823","-5","1"
+"48269","Detroit","MI","42.239933","-83.150823","-5","1"
+"48272","Detroit","MI","42.239933","-83.150823","-5","1"
+"48274","Detroit","MI","42.239933","-83.150823","-5","1"
+"48275","Detroit","MI","42.239933","-83.150823","-5","1"
+"48277","Detroit","MI","42.239933","-83.150823","-5","1"
+"48278","Detroit","MI","42.239933","-83.150823","-5","1"
+"48279","Detroit","MI","42.239933","-83.150823","-5","1"
+"48288","Detroit","MI","42.239933","-83.150823","-5","1"
+"48295","Detroit","MI","42.239933","-83.150823","-5","1"
+"48297","Detroit","MI","42.239933","-83.150823","-5","1"
+"48299","Detroit","MI","42.239933","-83.150823","-5","1"
+"48301","Bloomfield Hills","MI","42.546445","-83.28083","-5","1"
+"48302","Bloomfield Hills","MI","42.5863","-83.29705","-5","1"
+"48303","Bloomfield Hills","MI","42.660091","-83.3863","-5","1"
+"48304","Bloomfield Hills","MI","42.586677","-83.22956","-5","1"
+"48305","Clinton","MI","42.569278","-82.911243","-5","1"
+"48306","Rochester","MI","42.708151","-83.16584","-5","1"
+"48307","Rochester","MI","42.662293","-83.12781","-5","1"
+"48308","Rochester","MI","42.638533","-83.131426","-5","1"
+"48309","Rochester","MI","42.662732","-83.18111","-5","1"
+"48310","Sterling Heights","MI","42.563644","-83.07158","-5","1"
+"48311","Sterling Heights","MI","42.672322","-82.903065","-5","1"
+"48312","Sterling Heights","MI","42.558151","-83.00446","-5","1"
+"48313","Sterling Heights","MI","42.598734","-82.99938","-5","1"
+"48314","Sterling Heights","MI","42.609789","-83.04844","-5","1"
+"48315","Utica","MI","42.662902","-82.99392","-5","1"
+"48316","Utica","MI","42.689632","-83.06154","-5","1"
+"48317","Utica","MI","42.639777","-83.04255","-5","1"
+"48318","Utica","MI","42.672322","-82.903065","-5","1"
+"48320","Keego Harbor","MI","42.611783","-83.33757","-5","1"
+"48321","Auburn Hills","MI","42.660091","-83.3863","-5","1"
+"48322","West Bloomfield","MI","42.541268","-83.37551","-5","1"
+"48323","West Bloomfield","MI","42.572442","-83.37159","-5","1"
+"48324","West Bloomfield","MI","42.595233","-83.39974","-5","1"
+"48325","West Bloomfield","MI","42.660091","-83.3863","-5","1"
+"48326","Auburn Hills","MI","42.661129","-83.24571","-5","1"
+"48327","Waterford","MI","42.642764","-83.40273","-5","1"
+"48328","Waterford","MI","42.642302","-83.35133","-5","1"
+"48329","Waterford","MI","42.68828","-83.38967","-5","1"
+"48330","Drayton Plains","MI","42.675435","-83.363697","-5","1"
+"48331","Farmington","MI","42.508809","-83.40875","-5","1"
+"48332","Farmington","MI","42.660091","-83.3863","-5","1"
+"48333","Farmington","MI","42.660091","-83.3863","-5","1"
+"48334","Farmington","MI","42.5065","-83.35363","-5","1"
+"48335","Farmington","MI","42.465142","-83.39853","-5","1"
+"48336","Farmington","MI","42.458502","-83.3464","-5","1"
+"48340","Pontiac","MI","42.668532","-83.29585","-5","1"
+"48341","Pontiac","MI","42.626947","-83.30243","-5","1"
+"48342","Pontiac","MI","42.644581","-83.28211","-5","1"
+"48343","Pontiac","MI","42.660091","-83.3863","-5","1"
+"48346","Clarkston","MI","42.720966","-83.4044","-5","1"
+"48347","Clarkston","MI","42.660091","-83.3863","-5","1"
+"48348","Clarkston","MI","42.768373","-83.37805","-5","1"
+"48350","Davisburg","MI","42.747677","-83.52283","-5","1"
+"48353","Hartland","MI","42.644709","-83.71792","-5","1"
+"48356","Highland","MI","42.66415","-83.58982","-5","1"
+"48357","Highland","MI","42.656281","-83.63297","-5","1"
+"48359","Lake Orion","MI","42.722932","-83.28537","-5","1"
+"48360","Lake Orion","MI","42.74628","-83.2612","-5","1"
+"48361","Lake Orion","MI","42.660091","-83.3863","-5","1"
+"48362","Lake Orion","MI","42.783379","-83.2471","-5","1"
+"48363","Oakland","MI","42.765582","-83.17281","-5","1"
+"48366","Lakeville","MI","42.803277","-83.18412","-5","1"
+"48367","Leonard","MI","42.838438","-83.14416","-5","1"
+"48370","Oxford","MI","42.820082","-83.20932","-5","1"
+"48371","Oxford","MI","42.823968","-83.27921","-5","1"
+"48374","Novi","MI","42.467945","-83.51766","-5","1"
+"48375","Novi","MI","42.462734","-83.45865","-5","1"
+"48376","Novi","MI","42.470984","-83.474785","-5","1"
+"48377","Novi","MI","42.511766","-83.47314","-5","1"
+"48380","Milford","MI","42.586597","-83.66826","-5","1"
+"48381","Milford","MI","42.571402","-83.59318","-5","1"
+"48382","Commerce Township","MI","42.593035","-83.48997","-5","1"
+"48383","White Lake","MI","42.657361","-83.54529","-5","1"
+"48386","White Lake","MI","42.642431","-83.47193","-5","1"
+"48387","Union Lake","MI","42.7253","-83.311605","-5","1"
+"48390","Walled Lake","MI","42.549483","-83.47969","-5","1"
+"48391","Walled Lake","MI","42.660091","-83.3863","-5","1"
+"48393","Wixom","MI","42.532251","-83.53378","-5","1"
+"48396","Wixom","MI","42.523233","-83.537887","-5","1"
+"48397","Warren","MI","42.491736","-83.040222","-5","1"
+"48398","Clawson","MI","42.660091","-83.3863","-5","1"
+"48401","Applegate","MI","43.357999","-82.65433","-5","1"
+"48410","Argyle","MI","43.558856","-82.945483","-5","1"
+"48411","Atlas","MI","42.940019","-83.536923","-5","1"
+"48412","Attica","MI","43.053648","-83.16651","-5","1"
+"48413","Bad Axe","MI","43.803691","-83.00181","-5","1"
+"48414","Bancroft","MI","42.869478","-84.0761","-5","1"
+"48415","Birch Run","MI","43.268788","-83.79486","-5","1"
+"48416","Brown City","MI","43.214645","-82.98356","-5","1"
+"48417","Burt","MI","43.262162","-83.93995","-5","1"
+"48418","Byron","MI","42.816358","-83.95884","-5","1"
+"48419","Carsonville","MI","43.420791","-82.6415","-5","1"
+"48420","Clio","MI","43.176375","-83.726","-5","1"
+"48421","Columbiaville","MI","43.154173","-83.3933","-5","1"
+"48422","Croswell","MI","43.263998","-82.64573","-5","1"
+"48423","Davison","MI","43.029526","-83.5218","-5","1"
+"48426","Decker","MI","43.50461","-83.06289","-5","1"
+"48427","Deckerville","MI","43.519997","-82.71234","-5","1"
+"48428","Dryden","MI","42.936145","-83.13471","-5","1"
+"48429","Durand","MI","42.918766","-83.99148","-5","1"
+"48430","Fenton","MI","42.78459","-83.74074","-5","1"
+"48432","Filion","MI","43.89867","-83.01232","-5","1"
+"48433","Flushing","MI","43.072177","-83.84883","-5","1"
+"48434","Forestville","MI","43.66139","-82.60984","-5","1"
+"48435","Fostoria","MI","43.239123","-83.36195","-5","1"
+"48436","Gaines","MI","42.870299","-83.89144","-5","1"
+"48437","Genesee","MI","43.111009","-83.62016","-5","1"
+"48438","Goodrich","MI","42.911611","-83.48421","-5","1"
+"48439","Grand Blanc","MI","42.925677","-83.63585","-5","1"
+"48440","Hadley","MI","42.952899","-83.40536","-5","1"
+"48441","Harbor Beach","MI","43.812371","-82.69274","-5","1"
+"48442","Holly","MI","42.800191","-83.5968","-5","1"
+"48444","Imlay City","MI","43.038967","-83.06067","-5","1"
+"48445","Kinde","MI","43.952534","-83.02017","-5","1"
+"48446","Lapeer","MI","43.048777","-83.33073","-5","1"
+"48448","Sciota","MI","42.955783","-84.300929","-5","1"
+"48449","Lennon","MI","42.988946","-83.94468","-5","1"
+"48450","Lexington","MI","43.243891","-82.52701","-5","1"
+"48451","Linden","MI","42.800911","-83.81366","-5","1"
+"48453","Marlette","MI","43.336126","-83.03213","-5","1"
+"48454","Melvin","MI","43.198014","-82.82558","-5","1"
+"48455","Metamora","MI","42.938891","-83.29409","-5","1"
+"48456","Minden City","MI","43.660079","-82.74685","-5","1"
+"48457","Montrose","MI","43.182851","-83.89507","-5","1"
+"48458","Mount Morris","MI","43.116959","-83.69025","-5","1"
+"48460","New Lothrop","MI","43.131102","-83.98443","-5","1"
+"48461","North Branch","MI","43.210744","-83.20549","-5","1"
+"48462","Ortonville","MI","42.84391","-83.43109","-5","1"
+"48463","Otisville","MI","43.167457","-83.52542","-5","1"
+"48464","Otter Lake","MI","43.219132","-83.42227","-5","1"
+"48465","Palms","MI","43.618879","-82.6874","-5","1"
+"48466","Peck","MI","43.264205","-82.81674","-5","1"
+"48467","Port Austin","MI","44.023181","-83.00241","-5","1"
+"48468","Port Hope","MI","43.938529","-82.77514","-5","1"
+"48469","Port Sanilac","MI","43.452038","-82.54948","-5","1"
+"48470","Ruth","MI","43.736207","-82.75005","-5","1"
+"48471","Sandusky","MI","43.418054","-82.83687","-5","1"
+"48472","Snover","MI","43.512287","-82.9635","-5","1"
+"48473","Swartz Creek","MI","42.950128","-83.82612","-5","1"
+"48475","Ubly","MI","43.673699","-82.9257","-5","1"
+"48476","Vernon","MI","42.939379","-84.03166","-5","1"
+"48501","Flint","MI","42.965926","-83.780835","-5","1"
+"48502","Flint","MI","43.014077","-83.69012","-5","1"
+"48503","Flint","MI","43.011227","-83.69291","-5","1"
+"48504","Flint","MI","43.043627","-83.73126","-5","1"
+"48505","Flint","MI","43.062076","-83.69728","-5","1"
+"48506","Flint","MI","43.047826","-83.64688","-5","1"
+"48507","Flint","MI","42.973263","-83.70142","-5","1"
+"48509","Burton","MI","43.020176","-83.60433","-5","1"
+"48519","Burton","MI","42.984777","-83.61155","-5","1"
+"48529","Burton","MI","42.972477","-83.67085","-5","1"
+"48531","Flint","MI","43.002","-83.692507","-5","1"
+"48532","Flint","MI","43.005477","-83.76098","-5","1"
+"48550","Flint","MI","43.034927","-83.688706","-5","1"
+"48551","Flint","MI","42.978995","-83.713124","-5","1"
+"48552","Flint","MI","42.977895","-83.713074","-5","1"
+"48553","Flint","MI","42.973627","-83.720306","-5","1"
+"48554","Flint","MI","42.972244","-83.79463","-5","1"
+"48555","Flint","MI","43.011277","-83.710756","-5","1"
+"48556","Flint","MI","43.032677","-83.646255","-5","1"
+"48557","Flint","MI","43.080578","-83.783675","-5","1"
+"48559","Flint","MI","43.002","-83.692507","-5","1"
+"48563","Markey","MI","44.407339","-84.695963","-5","1"
+"48567","Flint","MI","42.993102","-83.655654","-5","1"
+"48601","Saginaw","MI","43.413975","-83.91427","-5","1"
+"48602","Saginaw","MI","43.423925","-83.97142","-5","1"
+"48603","Saginaw","MI","43.441975","-84.01177","-5","1"
+"48604","Saginaw","MI","43.473075","-83.94479","-5","1"
+"48605","Saginaw","MI","43.458776","-84.051827","-5","1"
+"48606","Saginaw","MI","43.348535","-84.032612","-5","1"
+"48607","Saginaw","MI","43.431375","-83.93267","-5","1"
+"48608","Saginaw","MI","43.348535","-84.032612","-5","1"
+"48609","Saginaw","MI","43.40153","-84.09438","-5","1"
+"48610","Alger","MI","44.142282","-84.14497","-5","1"
+"48611","Auburn","MI","43.617796","-84.07918","-5","1"
+"48612","Beaverton","MI","43.87787","-84.42078","-5","1"
+"48613","Bentley","MI","43.93724","-84.12889","-5","1"
+"48614","Brant","MI","43.25118","-84.29816","-5","1"
+"48615","Breckenridge","MI","43.422568","-84.47433","-5","1"
+"48616","Chesaning","MI","43.190239","-84.11987","-5","1"
+"48617","Clare","MI","43.828266","-84.74219","-5","1"
+"48618","Coleman","MI","43.747084","-84.55669","-5","1"
+"48619","Comins","MI","44.825431","-84.04695","-5","1"
+"48620","Edenville","MI","43.807728","-84.37785","-5","1"
+"48621","Fairview","MI","44.718279","-83.98795","-5","1"
+"48622","Farwell","MI","43.840787","-84.86734","-5","1"
+"48623","Freeland","MI","43.518309","-84.1337","-5","1"
+"48624","Gladwin","MI","44.041529","-84.46503","-5","1"
+"48625","Harrison","MI","44.052759","-84.83959","-5","1"
+"48626","Hemlock","MI","43.416335","-84.22384","-5","1"
+"48627","Higgins Lake","MI","44.462149","-84.747","-5","1"
+"48628","Hope","MI","43.807162","-84.33789","-5","1"
+"48629","Houghton Lake","MI","44.305812","-84.75589","-5","1"
+"48630","Houghton Lake Heights","MI","44.327064","-84.77405","-5","1"
+"48631","Kawkawlin","MI","43.67579","-83.97973","-5","1"
+"48632","Lake","MI","43.864435","-85.00864","-5","1"
+"48633","Lake George","MI","43.959478","-84.93861","-5","1"
+"48634","Linwood","MI","43.748816","-84.01217","-5","1"
+"48635","Lupton","MI","44.399711","-83.99444","-5","1"
+"48636","Luzerne","MI","44.616344","-84.27784","-5","1"
+"48637","Merrill","MI","43.410627","-84.33926","-5","1"
+"48640","Midland","MI","43.605457","-84.27234","-5","1"
+"48641","Midland","MI","43.538252","-84.387753","-5","1"
+"48642","Midland","MI","43.652404","-84.21671","-5","1"
+"48647","Mio","MI","44.654024","-84.10388","-5","1"
+"48649","Oakley","MI","43.150386","-84.1976","-5","1"
+"48650","Pinconning","MI","43.851276","-83.97901","-5","1"
+"48651","Prudenville","MI","44.258616","-84.646","-5","1"
+"48652","Rhodes","MI","43.862479","-84.19641","-5","1"
+"48653","Roscommon","MI","44.484145","-84.66089","-5","1"
+"48654","Rose City","MI","44.468977","-84.19608","-5","1"
+"48655","Saint Charles","MI","43.297082","-84.14652","-5","1"
+"48656","Saint Helen","MI","44.360384","-84.43815","-5","1"
+"48657","Sanford","MI","43.69784","-84.39169","-5","1"
+"48658","Standish","MI","43.985129","-83.93628","-5","1"
+"48659","Sterling","MI","44.080925","-84.02506","-5","1"
+"48661","West Branch","MI","44.288158","-84.21162","-5","1"
+"48662","Wheeler","MI","43.400958","-84.41672","-5","1"
+"48663","Saginaw","MI","43.467315","-83.975475","-5","1"
+"48667","Midland","MI","43.647297","-84.387331","-5","1"
+"48670","Midland","MI","43.637471","-84.256758","-5","1"
+"48674","Midland","MI","43.612884","-84.197125","-5","1"
+"48686","Midland","MI","43.647297","-84.387331","-5","1"
+"48701","Akron","MI","43.587817","-83.53468","-5","1"
+"48703","Au Gres","MI","44.06434","-83.65821","-5","1"
+"48705","Barton City","MI","44.708179","-83.63681","-5","1"
+"48706","Bay City","MI","43.607523","-83.9162","-5","1"
+"48707","Bay City","MI","43.737798","-83.933337","-5","1"
+"48708","Bay City","MI","43.583323","-83.87869","-5","1"
+"48710","University Center","MI","43.556574","-83.994328","-5","1"
+"48720","Bay Port","MI","43.831509","-83.34887","-5","1"
+"48721","Black River","MI","44.79652","-83.32907","-5","1"
+"48722","Bridgeport","MI","43.346632","-83.84636","-5","1"
+"48723","Caro","MI","43.490117","-83.3881","-5","1"
+"48724","Carrollton","MI","43.460075","-83.92772","-5","1"
+"48725","Caseville","MI","43.944466","-83.23974","-5","1"
+"48726","Cass City","MI","43.604819","-83.17889","-5","1"
+"48727","Clifford","MI","43.314176","-83.18115","-5","1"
+"48728","Curran","MI","44.746486","-83.83882","-5","1"
+"48729","Deford","MI","43.492259","-83.17874","-5","1"
+"48730","East Tawas","MI","44.335904","-83.48516","-5","1"
+"48731","Elkton","MI","43.83014","-83.16143","-5","1"
+"48732","Essexville","MI","43.605861","-83.81298","-5","1"
+"48733","Fairgrove","MI","43.542822","-83.61267","-5","1"
+"48734","Frankenmuth","MI","43.340413","-83.74123","-5","1"
+"48735","Gagetown","MI","43.664593","-83.26005","-5","1"
+"48736","Gilford","MI","43.49442","-83.624431","-5","1"
+"48737","Glennie","MI","44.54684","-83.70977","-5","1"
+"48738","Greenbush","MI","44.563997","-83.32459","-5","1"
+"48739","Hale","MI","44.379147","-83.83539","-5","1"
+"48740","Harrisville","MI","44.663477","-83.3516","-5","1"
+"48741","Kingston","MI","43.410781","-83.17248","-5","1"
+"48742","Lincoln","MI","44.725546","-83.43887","-5","1"
+"48743","Long Lake","MI","44.442563","-83.87538","-5","1"
+"48744","Mayville","MI","43.34896","-83.35883","-5","1"
+"48745","Mikado","MI","44.580133","-83.49441","-5","1"
+"48746","Millington","MI","43.274498","-83.53822","-5","1"
+"48747","Munger","MI","43.519522","-83.76529","-5","1"
+"48748","National City","MI","44.328794","-83.66579","-5","1"
+"48749","Omer","MI","44.046475","-83.87572","-5","1"
+"48750","Oscoda","MI","44.447318","-83.41927","-5","1"
+"48754","Owendale","MI","43.736747","-83.24746","-5","1"
+"48755","Pigeon","MI","43.85672","-83.28557","-5","1"
+"48756","Prescott","MI","44.206123","-83.99306","-5","1"
+"48757","Reese","MI","43.462775","-83.68564","-5","1"
+"48758","Richville","MI","43.407321","-83.676156","-5","1"
+"48759","Sebewaing","MI","43.737971","-83.43007","-5","1"
+"48760","Silverwood","MI","43.331961","-83.25403","-5","1"
+"48761","South Branch","MI","44.54106","-83.91915","-5","1"
+"48762","Spruce","MI","44.821813","-83.50181","-5","1"
+"48763","Tawas City","MI","44.250144","-83.55805","-5","1"
+"48764","Tawas City","MI","44.266549","-83.519166","-5","1"
+"48765","Turner","MI","44.147192","-83.73723","-5","1"
+"48766","Twining","MI","44.127342","-83.84369","-5","1"
+"48767","Unionville","MI","43.645608","-83.46527","-5","1"
+"48768","Vassar","MI","43.370434","-83.57917","-5","1"
+"48769","Tuscola","MI","43.327048","-83.657355","-5","1"
+"48770","Whittemore","MI","44.246004","-83.81849","-5","1"
+"48787","Frankenmuth","MI","43.334958","-83.749418","-5","1"
+"48801","Alma","MI","43.377113","-84.66256","-5","1"
+"48802","Alma","MI","43.389262","-84.666661","-5","1"
+"48803","Troy","MI","42.581148","-83.09901","-5","1"
+"48804","Mount Pleasant","MI","43.640574","-84.847417","-5","1"
+"48805","Okemos","MI","42.599184","-84.371973","-5","1"
+"48806","Ashley","MI","43.179346","-84.50765","-5","1"
+"48807","Bannister","MI","43.145475","-84.41579","-5","1"
+"48808","Bath","MI","42.821233","-84.46099","-5","1"
+"48809","Belding","MI","43.085313","-85.24478","-5","1"
+"48811","Carson City","MI","43.184647","-84.84871","-5","1"
+"48812","Cedar Lake","MI","43.413761","-84.975271","-5","1"
+"48813","Charlotte","MI","42.580076","-84.8228","-5","1"
+"48815","Clarksville","MI","42.841491","-85.25046","-5","1"
+"48816","Cohoctah","MI","42.757633","-83.938967","-5","1"
+"48817","Corunna","MI","43.000193","-84.0634","-5","1"
+"48818","Crystal","MI","43.272279","-84.90913","-5","1"
+"48819","Dansville","MI","42.552218","-84.27674","-5","1"
+"48820","Dewitt","MI","42.842438","-84.58612","-5","1"
+"48821","Dimondale","MI","42.645985","-84.64772","-5","1"
+"48822","Eagle","MI","42.8288","-84.76379","-5","1"
+"48823","East Lansing","MI","42.747922","-84.47143","-5","1"
+"48824","East Lansing","MI","42.725884","-84.4792","-5","1"
+"48825","East Lansing","MI","42.723784","-84.464775","-5","1"
+"48826","East Lansing","MI","42.599184","-84.371973","-5","1"
+"48827","Eaton Rapids","MI","42.507093","-84.6579","-5","1"
+"48829","Edmore","MI","43.404412","-85.03033","-5","1"
+"48830","Elm Hall","MI","43.362879","-84.83662","-5","1"
+"48831","Elsie","MI","43.098253","-84.37722","-5","1"
+"48832","Elwell","MI","43.411924","-84.77657","-5","1"
+"48833","Eureka","MI","42.944209","-84.600723","-5","1"
+"48834","Fenwick","MI","43.141649","-85.04948","-5","1"
+"48835","Fowler","MI","43.011103","-84.74589","-5","1"
+"48836","Fowlerville","MI","42.666646","-84.07542","-5","1"
+"48837","Grand Ledge","MI","42.749774","-84.7503","-5","1"
+"48838","Greenville","MI","43.1791","-85.26533","-5","1"
+"48840","Haslett","MI","42.760217","-84.39027","-5","1"
+"48841","Henderson","MI","43.104499","-84.23568","-5","1"
+"48842","Holt","MI","42.639235","-84.52702","-5","1"
+"48843","Howell","MI","42.612243","-83.91835","-5","1"
+"48844","Howell","MI","42.603479","-83.911173","-5","1"
+"48845","Hubbardston","MI","43.096466","-84.84627","-5","1"
+"48846","Ionia","MI","42.981932","-85.06679","-5","1"
+"48847","Ithaca","MI","43.269967","-84.59181","-5","1"
+"48848","Laingsburg","MI","42.884921","-84.3569","-5","1"
+"48849","Lake Odessa","MI","42.788151","-85.13565","-5","1"
+"48850","Lakeview","MI","43.447625","-85.25628","-5","1"
+"48851","Lyons","MI","42.962965","-84.94611","-5","1"
+"48852","Mcbrides","MI","43.355304","-85.04326","-5","1"
+"48853","Maple Rapids","MI","43.102399","-84.69278","-5","1"
+"48854","Mason","MI","42.582902","-84.44738","-5","1"
+"48855","Howell","MI","42.678059","-83.915592","-5","1"
+"48856","Middleton","MI","43.197414","-84.73336","-5","1"
+"48857","Morrice","MI","42.845703","-84.16581","-5","1"
+"48858","Mount Pleasant","MI","43.60616","-84.78306","-5","1"
+"48859","Mount Pleasant","MI","43.564736","-84.847297","-5","1"
+"48860","Muir","MI","43.026842","-84.92633","-5","1"
+"48861","Mulliken","MI","42.733673","-84.92575","-5","1"
+"48862","North Star","MI","43.356518","-84.497138","-5","1"
+"48863","Oak Grove","MI","42.603479","-83.911173","-5","1"
+"48864","Okemos","MI","42.702128","-84.41946","-5","1"
+"48865","Orleans","MI","43.090038","-85.11754","-5","1"
+"48866","Ovid","MI","42.997636","-84.37643","-5","1"
+"48867","Owosso","MI","42.99605","-84.17896","-5","1"
+"48870","Palo","MI","43.113587","-85.007665","-5","1"
+"48871","Perrinton","MI","43.160914","-84.68397","-5","1"
+"48872","Perry","MI","42.807435","-84.22291","-5","1"
+"48873","Pewamo","MI","42.987795","-84.84263","-5","1"
+"48874","Pompeii","MI","43.184467","-84.6032","-5","1"
+"48875","Portland","MI","42.864338","-84.91289","-5","1"
+"48876","Potterville","MI","42.640719","-84.73826","-5","1"
+"48877","Riverdale","MI","43.403224","-84.84062","-5","1"
+"48878","Rosebush","MI","43.713365","-84.77731","-5","1"
+"48879","Saint Johns","MI","42.998998","-84.57704","-5","1"
+"48880","Saint Louis","MI","43.422397","-84.60041","-5","1"
+"48881","Saranac","MI","42.929829","-85.20938","-5","1"
+"48882","Shaftsburg","MI","42.803973","-84.295949","-5","1"
+"48883","Shepherd","MI","43.534764","-84.68228","-5","1"
+"48884","Sheridan","MI","43.21107","-85.04772","-5","1"
+"48885","Sidney","MI","43.247555","-85.16587","-5","1"
+"48886","Six Lakes","MI","43.426703","-85.14998","-5","1"
+"48887","Smyrna","MI","42.944929","-85.074665","-5","1"
+"48888","Stanton","MI","43.297366","-85.10506","-5","1"
+"48889","Sumner","MI","43.293977","-84.79415","-5","1"
+"48890","Sunfield","MI","42.759217","-84.98054","-5","1"
+"48891","Vestaburg","MI","43.402185","-84.92216","-5","1"
+"48892","Webberville","MI","42.643684","-84.17011","-5","1"
+"48893","Weidman","MI","43.662482","-84.98244","-5","1"
+"48894","Westphalia","MI","42.928735","-84.7996","-5","1"
+"48895","Williamston","MI","42.68669","-84.27844","-5","1"
+"48896","Winn","MI","43.523617","-84.90307","-5","1"
+"48897","Woodland","MI","42.705285","-85.12449","-5","1"
+"48901","Lansing","MI","42.599184","-84.371973","-5","1"
+"48906","Lansing","MI","42.764167","-84.56153","-5","1"
+"48907","Lansing","MI","42.596071","-84.838206","-5","1"
+"48908","Lansing","MI","42.596071","-84.838206","-5","1"
+"48909","Lansing","MI","42.599184","-84.371973","-5","1"
+"48910","Lansing","MI","42.704435","-84.54915","-5","1"
+"48911","Lansing","MI","42.677335","-84.56913","-5","1"
+"48912","Lansing","MI","42.734434","-84.52497","-5","1"
+"48913","Lansing","MI","42.599184","-84.371973","-5","1"
+"48915","Lansing","MI","42.737701","-84.57106","-5","1"
+"48916","Lansing","MI","42.599184","-84.371973","-5","1"
+"48917","Lansing","MI","42.735535","-84.62698","-5","1"
+"48918","Lansing","MI","42.599184","-84.371973","-5","1"
+"48919","Lansing","MI","42.728585","-84.551728","-5","1"
+"48921","Lansing","MI","42.723735","-84.555629","-5","1"
+"48922","Lansing","MI","42.732535","-84.558679","-5","1"
+"48924","Lansing","MI","42.599184","-84.371973","-5","1"
+"48929","Lansing","MI","42.732535","-84.558679","-5","1"
+"48930","Lansing","MI","42.732535","-84.558679","-5","1"
+"48933","Lansing","MI","42.731885","-84.55492","-5","1"
+"48937","Lansing","MI","42.748734","-84.559029","-5","1"
+"48950","Lansing","MI","42.599184","-84.371973","-5","1"
+"48956","Lansing","MI","42.732535","-84.558679","-5","1"
+"48980","Lansing","MI","42.599184","-84.371973","-5","1"
+"49001","Kalamazoo","MI","42.278891","-85.55107","-5","1"
+"49002","Portage","MI","42.210792","-85.55958","-5","1"
+"49003","Kalamazoo","MI","42.245412","-85.529858","-5","1"
+"49004","Kalamazoo","MI","42.330089","-85.56635","-5","1"
+"49005","Kalamazoo","MI","42.323045","-85.493232","-5","1"
+"49006","Kalamazoo","MI","42.295005","-85.62247","-5","1"
+"49007","Kalamazoo","MI","42.29714","-85.58573","-5","1"
+"49008","Kalamazoo","MI","42.26549","-85.61098","-5","1"
+"49009","Kalamazoo","MI","42.272538","-85.69255","-5","1"
+"49010","Allegan","MI","42.531244","-85.87438","-5","1"
+"49011","Athens","MI","42.089314","-85.23333","-5","1"
+"49012","Augusta","MI","42.347289","-85.35242","-5","1"
+"49013","Bangor","MI","42.308798","-86.12201","-5","1"
+"49014","Battle Creek","MI","42.311089","-85.13845","-5","1"
+"49015","Battle Creek","MI","42.30244","-85.22294","-5","1"
+"49016","Battle Creek","MI","42.34381","-85.29136","-5","1"
+"49017","Battle Creek","MI","42.35714","-85.20257","-5","1"
+"49018","Battle Creek","MI","42.246402","-85.004511","-5","1"
+"49019","Kalamazoo","MI","42.245412","-85.529858","-5","1"
+"49020","Bedford","MI","42.246402","-85.004511","-5","1"
+"49021","Bellevue","MI","42.447038","-85.04264","-5","1"
+"49022","Benton Harbor","MI","42.10809","-86.41801","-5","1"
+"49023","Benton Harbor","MI","42.001551","-86.715294","-5","1"
+"49024","Portage","MI","42.216541","-85.61773","-5","1"
+"49026","Bloomingdale","MI","42.371729","-85.9679","-5","1"
+"49027","Breedsville","MI","42.345815","-86.0795","-5","1"
+"49028","Bronson","MI","41.850631","-85.18987","-5","1"
+"49029","Burlington","MI","42.142445","-85.09728","-5","1"
+"49030","Burr Oak","MI","41.854639","-85.32984","-5","1"
+"49031","Cassopolis","MI","41.907837","-85.98937","-5","1"
+"49032","Centreville","MI","41.924331","-85.51068","-5","1"
+"49033","Ceresco","MI","42.239592","-85.09307","-5","1"
+"49034","Climax","MI","42.239393","-85.33499","-5","1"
+"49035","Cloverdale","MI","42.595121","-85.308555","-5","1"
+"49036","Coldwater","MI","41.912776","-85.0142","-5","1"
+"49038","Coloma","MI","42.209307","-86.3337","-5","1"
+"49039","Hagar Shores","MI","42.224757","-86.372276","-5","1"
+"49040","Colon","MI","41.960856","-85.33059","-5","1"
+"49041","Comstock","MI","42.245412","-85.529858","-5","1"
+"49042","Constantine","MI","41.847413","-85.66411","-5","1"
+"49043","Covert","MI","42.296105","-86.26647","-5","1"
+"49045","Decatur","MI","42.105719","-85.99417","-5","1"
+"49046","Delton","MI","42.504149","-85.39257","-5","1"
+"49047","Dowagiac","MI","42.004729","-86.1208","-5","1"
+"49048","Kalamazoo","MI","42.292335","-85.525359","-5","1"
+"49050","Dowling","MI","42.504137","-85.24582","-5","1"
+"49051","East Leroy","MI","42.184303","-85.24228","-5","1"
+"49052","Fulton","MI","42.111949","-85.31673","-5","1"
+"49053","Galesburg","MI","42.289991","-85.41657","-5","1"
+"49055","Gobles","MI","42.37346","-85.85725","-5","1"
+"49056","Grand Junction","MI","42.395965","-86.0545","-5","1"
+"49057","Hartford","MI","42.19923","-86.16943","-5","1"
+"49058","Hastings","MI","42.64275","-85.29296","-5","1"
+"49060","Hickory Corners","MI","42.424387","-85.4055","-5","1"
+"49061","Jones","MI","41.878312","-85.81527","-5","1"
+"49062","Kendall","MI","42.36175","-85.814072","-5","1"
+"49063","Lacota","MI","42.393586","-86.209904","-5","1"
+"49064","Lawrence","MI","42.215357","-86.04822","-5","1"
+"49065","Lawton","MI","42.144087","-85.84205","-5","1"
+"49066","Leonidas","MI","42.037422","-85.35683","-5","1"
+"49067","Marcellus","MI","42.026876","-85.8033","-5","1"
+"49068","Marshall","MI","42.277837","-84.94869","-5","1"
+"49069","Marshall","MI","42.204494","-84.949919","-5","1"
+"49070","Martin","MI","42.540492","-85.63686","-5","1"
+"49071","Mattawan","MI","42.234417","-85.7807","-5","1"
+"49072","Mendon","MI","42.005815","-85.46428","-5","1"
+"49073","Nashville","MI","42.588988","-85.124","-5","1"
+"49074","Nazareth","MI","42.245412","-85.529858","-5","1"
+"49075","Nottawa","MI","41.916374","-85.45029","-5","1"
+"49076","Olivet","MI","42.439324","-84.91041","-5","1"
+"49077","Oshtemo","MI","42.245412","-85.529858","-5","1"
+"49078","Otsego","MI","42.459989","-85.71069","-5","1"
+"49079","Paw Paw","MI","42.22514","-85.90002","-5","1"
+"49080","Plainwell","MI","42.462935","-85.61256","-5","1"
+"49081","Portage","MI","42.171777","-85.617824","-5","1"
+"49082","Quincy","MI","41.943472","-84.87559","-5","1"
+"49083","Richland","MI","42.379689","-85.45022","-5","1"
+"49084","Riverside","MI","42.178035","-86.38557","-5","1"
+"49085","Saint Joseph","MI","42.074435","-86.47935","-5","1"
+"49087","Schoolcraft","MI","42.117421","-85.67594","-5","1"
+"49088","Scotts","MI","42.187577","-85.42621","-5","1"
+"49089","Sherwood","MI","42.010485","-85.23198","-5","1"
+"49090","South Haven","MI","42.403593","-86.24912","-5","1"
+"49091","Sturgis","MI","41.822244","-85.43234","-5","1"
+"49092","Tekonsha","MI","42.09724","-84.97543","-5","1"
+"49093","Three Rivers","MI","41.958306","-85.63829","-5","1"
+"49094","Union City","MI","42.06137","-85.11971","-5","1"
+"49095","Vandalia","MI","41.916613","-85.89022","-5","1"
+"49096","Vermontville","MI","42.63222","-85.01188","-5","1"
+"49097","Vicksburg","MI","42.117028","-85.5073","-5","1"
+"49098","Watervliet","MI","42.186679","-86.25718","-5","1"
+"49099","White Pigeon","MI","41.792628","-85.67233","-5","1"
+"49101","Baroda","MI","41.944869","-86.48827","-5","1"
+"49102","Berrien Center","MI","41.949244","-86.26909","-5","1"
+"49103","Berrien Springs","MI","41.944691","-86.34979","-5","1"
+"49104","Berrien Springs","MI","42.001551","-86.715294","-5","1"
+"49106","Bridgman","MI","41.94263","-86.55586","-5","1"
+"49107","Buchanan","MI","41.830012","-86.38349","-5","1"
+"49111","Eau Claire","MI","42.022092","-86.29071","-5","1"
+"49112","Edwardsburg","MI","41.797792","-86.02616","-5","1"
+"49113","Galien","MI","41.801264","-86.50367","-5","1"
+"49115","Harbert","MI","41.876483","-86.63715","-5","1"
+"49116","Lakeside","MI","41.848782","-86.67044","-5","1"
+"49117","New Buffalo","MI","41.784691","-86.75519","-5","1"
+"49119","New Troy","MI","41.875968","-86.54919","-5","1"
+"49120","Niles","MI","41.828055","-86.23981","-5","1"
+"49121","Niles","MI","42.001551","-86.715294","-5","1"
+"49125","Sawyer","MI","41.890521","-86.59362","-5","1"
+"49126","Sodus","MI","42.036334","-86.37416","-5","1"
+"49127","Stevensville","MI","42.015092","-86.51351","-5","1"
+"49128","Three Oaks","MI","41.820452","-86.61984","-5","1"
+"49129","Union Pier","MI","41.827718","-86.69237","-5","1"
+"49130","Union","MI","41.787096","-85.83605","-5","1"
+"49137","Lyndon","MI","42.424092","-84.102395","-5","1"
+"49157","Richland","MI","44.21551","-85.298079","-5","1"
+"49169","Dickson","MI","44.30476","-86.015026","-5","1"
+"49201","Jackson","MI","42.252268","-84.38842","-5","1"
+"49202","Jackson","MI","42.262135","-84.41052","-5","1"
+"49203","Jackson","MI","42.227536","-84.40913","-5","1"
+"49204","Jackson","MI","42.252847","-84.213755","-5","1"
+"49220","Addison","MI","41.992765","-84.3329","-5","1"
+"49221","Adrian","MI","41.900927","-84.04585","-5","1"
+"49224","Albion","MI","42.261257","-84.75151","-5","1"
+"49226","Bloomingdale","MI","42.379469","-85.976841","-5","1"
+"49227","Allen","MI","41.956743","-84.76598","-5","1"
+"49228","Blissfield","MI","41.821595","-83.87435","-5","1"
+"49229","Britton","MI","41.991654","-83.82631","-5","1"
+"49230","Brooklyn","MI","42.089891","-84.22768","-5","1"
+"49232","Camden","MI","41.731009","-84.65993","-5","1"
+"49233","Cement City","MI","42.071196","-84.3494","-5","1"
+"49234","Clarklake","MI","42.121774","-84.36382","-5","1"
+"49235","Clayton","MI","41.853441","-84.20769","-5","1"
+"49236","Clinton","MI","42.067837","-83.95779","-5","1"
+"49237","Concord","MI","42.177223","-84.651","-5","1"
+"49238","Deerfield","MI","41.910884","-83.78699","-5","1"
+"49239","Frontier","MI","41.782499","-84.604662","-5","1"
+"49240","Grass Lake","MI","42.284771","-84.18971","-5","1"
+"49241","Hanover","MI","42.107907","-84.60334","-5","1"
+"49242","Hillsdale","MI","41.89958","-84.62624","-5","1"
+"49245","Homer","MI","42.147222","-84.80789","-5","1"
+"49246","Horton","MI","42.118019","-84.49338","-5","1"
+"49247","Hudson","MI","41.857385","-84.34907","-5","1"
+"49248","Jasper","MI","41.766891","-84.01395","-5","1"
+"49249","Jerome","MI","42.048979","-84.4396","-5","1"
+"49250","Jonesville","MI","42.018585","-84.64548","-5","1"
+"49251","Leslie","MI","42.464769","-84.41116","-5","1"
+"49252","Litchfield","MI","42.034427","-84.77046","-5","1"
+"49253","Manitou Beach","MI","41.974999","-84.27972","-5","1"
+"49254","Michigan Center","MI","42.230336","-84.32597","-5","1"
+"49255","Montgomery","MI","41.776287","-84.8376","-5","1"
+"49256","Morenci","MI","41.746349","-84.21557","-5","1"
+"49257","Moscow","MI","42.054795","-84.503905","-5","1"
+"49258","Mosherville","MI","41.884795","-84.593491","-5","1"
+"49259","Munith","MI","42.371819","-84.25886","-5","1"
+"49261","Napoleon","MI","42.164338","-84.24575","-5","1"
+"49262","North Adams","MI","41.963683","-84.46824","-5","1"
+"49263","Norvell","MI","42.158739","-84.18274","-5","1"
+"49264","Onondaga","MI","42.443387","-84.56022","-5","1"
+"49265","Onsted","MI","42.020199","-84.16796","-5","1"
+"49266","Osseo","MI","41.844894","-84.55244","-5","1"
+"49267","Ottawa Lake","MI","41.757599","-83.70951","-5","1"
+"49268","Palmyra","MI","41.869086","-83.93858","-5","1"
+"49269","Parma","MI","42.285987","-84.59305","-5","1"
+"49270","Petersburg","MI","41.886364","-83.69556","-5","1"
+"49271","Pittsford","MI","41.832213","-84.45404","-5","1"
+"49272","Pleasant Lake","MI","42.398355","-84.34471","-5","1"
+"49274","Reading","MI","41.843254","-84.75263","-5","1"
+"49275","Ridgeway","MI","41.988026","-83.865674","-5","1"
+"49276","Riga","MI","41.798043","-83.79433","-5","1"
+"49277","Rives Junction","MI","42.395023","-84.46144","-5","1"
+"49278","Rollin","MI","41.912292","-84.32652","-5","1"
+"49279","Sand Creek","MI","41.791959","-84.10866","-5","1"
+"49280","Seneca","MI","41.79583","-84.186608","-5","1"
+"49281","Somerset","MI","42.050744","-84.37762","-5","1"
+"49282","Somerset Center","MI","42.050628","-84.39902","-5","1"
+"49283","Spring Arbor","MI","42.203838","-84.55243","-5","1"
+"49284","Springport","MI","42.38806","-84.70868","-5","1"
+"49285","Stockbridge","MI","42.458785","-84.19374","-5","1"
+"49286","Tecumseh","MI","42.012268","-83.93878","-5","1"
+"49287","Tipton","MI","42.035005","-84.09154","-5","1"
+"49288","Waldron","MI","41.733173","-84.44772","-5","1"
+"49289","Weston","MI","41.770793","-84.09996","-5","1"
+"49301","Ada","MI","42.97252","-85.47798","-5","1"
+"49302","Alto","MI","42.834137","-85.41889","-5","1"
+"49303","Bailey","MI","43.271422","-85.84023","-5","1"
+"49304","Baldwin","MI","43.895264","-85.88157","-5","1"
+"49305","Barryton","MI","43.747406","-85.16304","-5","1"
+"49306","Belmont","MI","43.078615","-85.59318","-5","1"
+"49307","Big Rapids","MI","43.697651","-85.47815","-5","1"
+"49309","Bitely","MI","43.747881","-85.86094","-5","1"
+"49310","Blanchard","MI","43.523037","-85.04876","-5","1"
+"49311","Bradley","MI","42.633006","-85.643043","-5","1"
+"49312","Brohman","MI","43.693086","-85.81962","-5","1"
+"49314","Burnips","MI","42.731193","-85.840372","-5","1"
+"49315","Byron Center","MI","42.802932","-85.72542","-5","1"
+"49316","Caledonia","MI","42.794914","-85.55091","-5","1"
+"49317","Cannonsburg","MI","43.071201","-85.480856","-5","1"
+"49318","Casnovia","MI","43.22724","-85.82054","-5","1"
+"49319","Cedar Springs","MI","43.224155","-85.54811","-5","1"
+"49320","Chippewa Lake","MI","43.755335","-85.278303","-5","1"
+"49321","Comstock Park","MI","43.059661","-85.67384","-5","1"
+"49322","Coral","MI","43.368957","-85.37282","-5","1"
+"49323","Dorr","MI","42.721597","-85.77879","-5","1"
+"49325","Freeport","MI","42.763599","-85.31026","-5","1"
+"49326","Gowen","MI","43.244538","-85.34217","-5","1"
+"49327","Grant","MI","43.34022","-85.82566","-5","1"
+"49328","Hopkins","MI","42.634199","-85.75809","-5","1"
+"49329","Howard City","MI","43.405689","-85.47744","-5","1"
+"49330","Kent City","MI","43.231933","-85.73768","-5","1"
+"49331","Lowell","MI","42.944838","-85.34928","-5","1"
+"49332","Mecosta","MI","43.623053","-85.25883","-5","1"
+"49333","Middleville","MI","42.689437","-85.46466","-5","1"
+"49335","Moline","MI","42.739942","-85.66543","-5","1"
+"49336","Morley","MI","43.494361","-85.43184","-5","1"
+"49337","Newaygo","MI","43.430588","-85.73515","-5","1"
+"49338","Paris","MI","43.764906","-85.57223","-5","1"
+"49339","Pierson","MI","43.335474","-85.49536","-5","1"
+"49340","Remus","MI","43.617313","-85.09604","-5","1"
+"49341","Rockford","MI","43.117214","-85.5189","-5","1"
+"49342","Rodney","MI","43.696188","-85.30996","-5","1"
+"49343","Sand Lake","MI","43.291089","-85.50812","-5","1"
+"49344","Shelbyville","MI","42.588087","-85.5824","-5","1"
+"49345","Sparta","MI","43.161106","-85.69952","-5","1"
+"49346","Stanwood","MI","43.587286","-85.37833","-5","1"
+"49347","Trufant","MI","43.3157","-85.35285","-5","1"
+"49348","Wayland","MI","42.681969","-85.62761","-5","1"
+"49349","White Cloud","MI","43.57219","-85.76662","-5","1"
+"49351","Rockford","MI","43.031413","-85.550267","-5","1"
+"49355","Ada","MI","43.031413","-85.550267","-5","1"
+"49356","Ada","MI","43.031413","-85.550267","-5","1"
+"49357","Ada","MI","43.031413","-85.550267","-5","1"
+"49368","Slagle","MI","44.321979","-85.713857","-5","1"
+"49394","Lincoln","MI","43.60034","-85.82081","-5","1"
+"49401","Allendale","MI","42.973667","-85.9318","-5","1"
+"49402","Branch","MI","43.930995","-86.05421","-5","1"
+"49403","Conklin","MI","43.125652","-85.84983","-5","1"
+"49404","Coopersville","MI","43.06507","-85.94516","-5","1"
+"49405","Custer","MI","43.907681","-86.19014","-5","1"
+"49406","Douglas","MI","42.643315","-86.20404","-5","1"
+"49408","Fennville","MI","42.575519","-86.12461","-5","1"
+"49409","Ferrysburg","MI","43.080865","-86.215413","-5","1"
+"49410","Fountain","MI","44.016249","-86.14028","-5","1"
+"49411","Free Soil","MI","44.100701","-86.2662","-5","1"
+"49412","Fremont","MI","43.464943","-85.95005","-5","1"
+"49413","Fremont","MI","43.554311","-85.800884","-5","1"
+"49415","Fruitport","MI","43.135994","-86.13348","-5","1"
+"49416","Glenn","MI","42.630533","-86.072032","-5","1"
+"49417","Grand Haven","MI","43.04117","-86.19013","-5","1"
+"49418","Grandville","MI","42.891709","-85.76466","-5","1"
+"49419","Hamilton","MI","42.679762","-85.98996","-5","1"
+"49420","Hart","MI","43.708002","-86.30604","-5","1"
+"49421","Hesperia","MI","43.595939","-86.0865","-5","1"
+"49422","Holland","MI","42.985596","-86.444751","-5","1"
+"49423","Holland","MI","42.765918","-86.10544","-5","1"
+"49424","Holland","MI","42.823232","-86.12726","-5","1"
+"49425","Holton","MI","43.443787","-86.10895","-5","1"
+"49426","Hudsonville","MI","42.873302","-85.87861","-5","1"
+"49427","Jamestown","MI","42.826676","-85.844378","-5","1"
+"49428","Jenison","MI","42.904275","-85.82314","-5","1"
+"49429","Jenison","MI","42.985596","-86.444751","-5","1"
+"49430","Lamont","MI","43.010337","-85.89754","-5","1"
+"49431","Ludington","MI","43.967306","-86.43044","-5","1"
+"49434","Macatawa","MI","42.768619","-86.20597","-5","1"
+"49435","Marne","MI","43.032323","-85.83015","-5","1"
+"49436","Mears","MI","43.678258","-86.46576","-5","1"
+"49437","Montague","MI","43.436692","-86.37093","-5","1"
+"49440","Muskegon","MI","43.234014","-86.25131","-5","1"
+"49441","Muskegon","MI","43.199364","-86.2668","-5","1"
+"49442","Muskegon","MI","43.232615","-86.1955","-5","1"
+"49443","Muskegon","MI","43.295493","-86.468853","-5","1"
+"49444","Muskegon","MI","43.198048","-86.22774","-5","1"
+"49445","Muskegon","MI","43.278021","-86.2682","-5","1"
+"49446","New Era","MI","43.551783","-86.40265","-5","1"
+"49448","Nunica","MI","43.091183","-86.07346","-5","1"
+"49449","Pentwater","MI","43.791699","-86.40276","-5","1"
+"49450","Pullman","MI","42.484769","-86.07944","-5","1"
+"49451","Ravenna","MI","43.200998","-85.96376","-5","1"
+"49452","Rothbury","MI","43.520576","-86.27335","-5","1"
+"49453","Saugatuck","MI","42.668174","-86.18724","-5","1"
+"49454","Scottville","MI","43.946244","-86.28427","-5","1"
+"49455","Shelby","MI","43.607628","-86.37004","-5","1"
+"49456","Spring Lake","MI","43.08767","-86.19345","-5","1"
+"49457","Twin Lake","MI","43.360182","-86.18835","-5","1"
+"49458","Walhalla","MI","43.945299","-86.11684","-5","1"
+"49459","Walkerville","MI","43.733491","-86.11462","-5","1"
+"49460","West Olive","MI","42.935483","-86.14141","-5","1"
+"49461","Whitehall","MI","43.389775","-86.34028","-5","1"
+"49463","Wabaningo","MI","43.295493","-86.468853","-5","1"
+"49464","Zeeland","MI","42.829252","-85.99621","-5","1"
+"49468","Grandville","MI","43.031413","-85.550267","-5","1"
+"49501","Grand Rapids","MI","42.984226","-85.629101","-5","1"
+"49502","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49503","Grand Rapids","MI","42.964176","-85.65885","-5","1"
+"49504","Grand Rapids","MI","42.977925","-85.69733","-5","1"
+"49505","Grand Rapids","MI","43.000076","-85.64785","-5","1"
+"49506","Grand Rapids","MI","42.945727","-85.61899","-5","1"
+"49507","Grand Rapids","MI","42.933077","-85.65435","-5","1"
+"49508","Grand Rapids","MI","42.876661","-85.62856","-5","1"
+"49509","Grand Rapids","MI","42.905877","-85.70392","-5","1"
+"49510","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49512","Grand Rapids","MI","42.888821","-85.5616","-5","1"
+"49514","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49515","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49516","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49518","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49523","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49525","Grand Rapids","MI","43.022199","-85.61168","-5","1"
+"49530","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49544","Grand Rapids","MI","42.999561","-85.75371","-5","1"
+"49546","Grand Rapids","MI","42.927801","-85.54582","-5","1"
+"49548","Grand Rapids","MI","42.868228","-85.66391","-5","1"
+"49550","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49555","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49560","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49564","Glen Arbor","MI","44.933988","-85.950661","-5","1"
+"49565","Newkirk","MI","44.115429","-85.78338","-5","1"
+"49582","Colfax","MI","44.544624","-85.832785","-5","1"
+"49588","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49590","Whitewater","MI","44.851771","-85.394202","-5","1"
+"49599","Grand Rapids","MI","43.031413","-85.550267","-5","1"
+"49601","Cadillac","MI","44.243788","-85.46006","-5","1"
+"49610","Acme","MI","44.789382","-85.488449","-5","1"
+"49611","Alba","MI","44.976915","-84.97282","-5","1"
+"49612","Alden","MI","44.877741","-85.24163","-5","1"
+"49613","Arcadia","MI","44.494139","-86.21509","-5","1"
+"49614","Bear Lake","MI","44.433903","-86.12625","-5","1"
+"49615","Bellaire","MI","44.970267","-85.21448","-5","1"
+"49616","Benzonia","MI","44.592766","-86.08323","-5","1"
+"49617","Beulah","MI","44.643593","-86.04382","-5","1"
+"49618","Boon","MI","44.306885","-85.60119","-5","1"
+"49619","Brethren","MI","44.306548","-86.00977","-5","1"
+"49620","Buckley","MI","44.516368","-85.68623","-5","1"
+"49621","Cedar","MI","44.872464","-85.78716","-5","1"
+"49622","Central Lake","MI","45.074263","-85.26929","-5","1"
+"49623","Chase","MI","43.889404","-85.67131","-5","1"
+"49625","Copemish","MI","44.44905","-85.88908","-5","1"
+"49626","Eastlake","MI","44.245509","-86.29477","-5","1"
+"49627","Eastport","MI","45.107683","-85.36212","-5","1"
+"49628","Elberta","MI","44.617592","-86.22663","-5","1"
+"49629","Elk Rapids","MI","44.900873","-85.40671","-5","1"
+"49630","Empire","MI","44.845213","-86.02479","-5","1"
+"49631","Evart","MI","43.893894","-85.26394","-5","1"
+"49632","Falmouth","MI","44.233529","-84.97463","-5","1"
+"49633","Fife Lake","MI","44.555245","-85.22931","-5","1"
+"49634","Filer City","MI","44.215959","-86.29048","-5","1"
+"49635","Frankfort","MI","44.631","-86.21484","-5","1"
+"49636","Glen Arbor","MI","44.884904","-85.98588","-5","1"
+"49637","Grawn","MI","44.647716","-85.70649","-5","1"
+"49638","Harrietta","MI","44.30192","-85.75597","-5","1"
+"49639","Hersey","MI","43.84716","-85.40908","-5","1"
+"49640","Honor","MI","44.701761","-86.05033","-5","1"
+"49642","Idlewild","MI","43.880898","-85.78999","-5","1"
+"49643","Interlochen","MI","44.634131","-85.8079","-5","1"
+"49644","Irons","MI","44.105814","-85.92846","-5","1"
+"49645","Kaleva","MI","44.371587","-86.0122","-5","1"
+"49646","Kalkaska","MI","44.743834","-85.08986","-5","1"
+"49647","Paradise","MI","44.515487","-85.527652","-5","1"
+"49648","Kewadin","MI","45.000254","-85.3651","-5","1"
+"49649","Kingsley","MI","44.561602","-85.52611","-5","1"
+"49650","Lake Ann","MI","44.725887","-85.85676","-5","1"
+"49651","Lake City","MI","44.382889","-85.14305","-5","1"
+"49652","Yates","MI","43.867421","-85.772312","-5","1"
+"49653","Lake Leelanau","MI","44.975051","-85.72325","-5","1"
+"49654","Leland","MI","45.023384","-85.75697","-5","1"
+"49655","Leroy","MI","44.023714","-85.44877","-5","1"
+"49656","Luther","MI","44.05505","-85.69759","-5","1"
+"49657","McBain","MI","44.204505","-85.1771","-5","1"
+"49659","Mancelona","MI","44.905437","-85.03401","-5","1"
+"49660","Manistee","MI","44.234322","-86.27234","-5","1"
+"49663","Manton","MI","44.426913","-85.37836","-5","1"
+"49664","Maple City","MI","44.888566","-85.89914","-5","1"
+"49665","Marion","MI","44.095357","-85.11843","-5","1"
+"49666","Mayfield","MI","44.635328","-85.5614","-5","1"
+"49667","Merritt","MI","44.335387","-84.91649","-5","1"
+"49668","Mesick","MI","44.405334","-85.71981","-5","1"
+"49670","Northport","MI","45.107479","-85.62347","-5","1"
+"49673","Old Mission","MI","44.955872","-85.490005","-5","1"
+"49674","Omena","MI","45.066568","-85.597374","-5","1"
+"49675","Onekama","MI","44.365757","-86.21149","-5","1"
+"49676","Rapid City","MI","44.829056","-85.27959","-5","1"
+"49677","Reed City","MI","43.906666","-85.5155","-5","1"
+"49679","Sears","MI","43.878924","-85.15802","-5","1"
+"49680","South Boardman","MI","44.654872","-85.26096","-5","1"
+"49682","Suttons Bay","MI","44.993085","-85.63635","-5","1"
+"49683","Thompsonville","MI","44.531456","-85.9334","-5","1"
+"49684","Traverse City","MI","44.74136","-85.67316","-5","1"
+"49685","Traverse City","MI","44.816178","-85.575147","-5","1"
+"49686","Traverse City","MI","44.735559","-85.54511","-5","1"
+"49688","Tustin","MI","44.117243","-85.43612","-5","1"
+"49689","Wellston","MI","44.209541","-85.9109","-5","1"
+"49690","Williamsburg","MI","44.774285","-85.41696","-5","1"
+"49695","Custer","MI","44.918887","-85.131606","-5","1"
+"49696","Traverse City","MI","44.816178","-85.575147","-5","1"
+"49701","Mackinaw City","MI","45.773926","-84.72714","-5","1"
+"49705","Afton","MI","45.355074","-84.47898","-5","1"
+"49706","Alanson","MI","45.431122","-84.77654","-5","1"
+"49707","Alpena","MI","45.08583","-83.46411","-5","1"
+"49709","Atlanta","MI","45.016358","-84.14518","-5","1"
+"49710","Barbeau","MI","46.274091","-84.17164","-5","1"
+"49711","Bay Shore","MI","45.523425","-85.332038","-5","1"
+"49712","Boyne City","MI","45.215511","-85.00995","-5","1"
+"49713","Boyne Falls","MI","45.206973","-84.86185","-5","1"
+"49715","Brimley","MI","46.411782","-84.66502","-5","1"
+"49716","Brutus","MI","45.515594","-84.72353","-5","1"
+"49717","Burt Lake","MI","45.430705","-84.691207","-5","1"
+"49718","Carp Lake","MI","45.714093","-84.79969","-5","1"
+"49719","Cedarville","MI","45.998074","-84.32615","-5","1"
+"49720","Charlevoix","MI","45.294169","-85.24516","-5","1"
+"49721","Cheboygan","MI","45.589694","-84.4625","-5","1"
+"49722","Conway","MI","45.416693","-84.86646","-5","1"
+"49723","Cross Village","MI","45.625353","-85.041872","-5","1"
+"49724","Dafter","MI","46.33614","-84.43525","-5","1"
+"49725","De Tour Village","MI","45.992931","-83.98087","-5","1"
+"49726","Drummond Island","MI","45.994672","-83.75198","-5","1"
+"49727","East Jordan","MI","45.1379","-85.12252","-5","1"
+"49728","Eckerman","MI","46.355548","-84.99249","-5","1"
+"49729","Ellsworth","MI","45.160264","-85.26699","-5","1"
+"49730","Elmira","MI","45.039542","-84.86774","-5","1"
+"49732","Forest","MI","45.354266","-84.301497","-5","1"
+"49733","Frederic","MI","44.809476","-84.71727","-5","1"
+"49734","Gaylord","MI","45.028411","-84.612207","-5","1"
+"49735","Gaylord","MI","44.989608","-84.67492","-5","1"
+"49736","Goetzville","MI","46.064734","-84.15477","-5","1"
+"49737","Good Hart","MI","45.580183","-85.113678","-5","1"
+"49738","Grayling","MI","44.683274","-84.6253","-5","1"
+"49739","Grayling","MI","44.682996","-84.610441","-5","1"
+"49740","Harbor Springs","MI","45.502308","-84.99025","-5","1"
+"49743","Hawks","MI","45.282088","-83.93526","-5","1"
+"49744","Herron","MI","44.993111","-83.65723","-5","1"
+"49745","Hessel","MI","46.01207","-84.45048","-5","1"
+"49746","Hillman","MI","45.068394","-83.96071","-5","1"
+"49747","Hubbard Lake","MI","44.827421","-83.61368","-5","1"
+"49748","Hulbert","MI","46.340461","-85.16591","-5","1"
+"49749","Indian River","MI","45.418813","-84.59578","-5","1"
+"49750","Lewiston","MI","44.884763","-84.35977","-5","1"
+"49751","Johannesburg","MI","44.963659","-84.43175","-5","1"
+"49752","Kinross","MI","46.250359","-84.48228","-5","1"
+"49753","Lachine","MI","44.99718","-83.7918","-5","1"
+"49755","Levering","MI","45.631602","-84.79103","-5","1"
+"49756","Lewiston","MI","44.839929","-84.30787","-5","1"
+"49757","Mackinac Island","MI","45.856777","-84.62643","-5","1"
+"49758","Greenwood","MI","44.682965","-84.287698","-5","1"
+"49759","Millersburg","MI","45.433394","-84.09811","-5","1"
+"49760","Moran","MI","46.048831","-84.94734","-5","1"
+"49761","Mullett Lake","MI","45.563799","-84.52405","-5","1"
+"49762","Naubinway","MI","46.142357","-85.29284","-5","1"
+"49764","Oden","MI","45.423768","-84.82611","-5","1"
+"49765","Onaway","MI","45.354463","-84.23956","-5","1"
+"49766","Ossineke","MI","44.920907","-83.45125","-5","1"
+"49768","Paradise","MI","46.659548","-85.09913","-5","1"
+"49769","Pellston","MI","45.567787","-84.81464","-5","1"
+"49770","Petoskey","MI","45.360111","-84.93774","-5","1"
+"49774","Pickford","MI","46.165132","-84.33219","-5","1"
+"49775","Pointe Aux Pins","MI","45.758378","-84.46507","-5","1"
+"49776","Posen","MI","45.248956","-83.69012","-5","1"
+"49777","Presque Isle","MI","45.311011","-83.49878","-5","1"
+"49778","Brimley","MI","46.410777","-84.336519","-5","1"
+"49779","Rogers City","MI","45.413252","-83.83626","-5","1"
+"49780","Rudyard","MI","46.204512","-84.73671","-5","1"
+"49781","Saint Ignace","MI","45.923952","-84.7255","-5","1"
+"49782","Beaver Island","MI","45.739114","-85.55339","-5","1"
+"49783","Sault Sainte Marie","MI","46.460895","-84.32485","-5","1"
+"49784","Kincheloe","MI","46.410777","-84.336519","-5","1"
+"49785","Kincheloe","MI","46.181451","-84.405367","-5","1"
+"49786","Kincheloe","MI","46.410777","-84.336519","-5","1"
+"49788","Kincheloe","MI","46.267303","-84.45633","-5","1"
+"49790","Strongs","MI","46.387377","-84.966792","-5","1"
+"49791","Topinabee","MI","45.48586","-84.59227","-5","1"
+"49792","Tower","MI","45.354677","-84.30074","-5","1"
+"49793","Trout Lake","MI","46.199197","-85.05287","-5","1"
+"49795","Vanderbilt","MI","45.169729","-84.60248","-5","1"
+"49796","Walloon Lake","MI","45.269001","-84.9475","-5","1"
+"49797","Waters","MI","44.870234","-84.659847","-5","1"
+"49799","Wolverine","MI","45.268255","-84.60141","-5","1"
+"49801","Iron Mountain","MI","45.87178","-87.99717","-6","1"
+"49802","Kingsford","MI","45.800687","-88.08323","-6","1"
+"49805","Allouez","MI","47.322703","-88.40806","-5","1"
+"49806","Au Train","MI","46.436663","-86.88541","-5","1"
+"49807","Bark River","MI","45.770006","-87.34617","-6","1"
+"49808","Big Bay","MI","46.650313","-87.86241","-5","1"
+"49812","Carney","MI","45.59232","-87.50316","-6","1"
+"49813","Cedar River","MI","45.435313","-87.37679","-6","1"
+"49814","Champion","MI","46.501074","-87.92354","-5","1"
+"49815","Channing","MI","46.186913","-88.04546","-6","1"
+"49816","Chatham","MI","46.323845","-86.90766","-5","1"
+"49817","Cooks","MI","45.921508","-86.45869","-5","1"
+"49818","Cornell","MI","45.936883","-87.26197","-5","1"
+"49819","Arnold","MI","46.604141","-87.614805","-5","1"
+"49820","Curtis","MI","46.191702","-85.72148","-5","1"
+"49821","Daggett","MI","45.521574","-87.61977","-6","1"
+"49822","Deerton","MI","46.470986","-87.06843","-5","1"
+"49825","Eben Junction","MI","46.364487","-86.98096","-5","1"
+"49826","Rumely","MI","46.364395","-86.99621","-5","1"
+"49827","Engadine","MI","46.156073","-85.57069","-5","1"
+"49829","Escanaba","MI","45.751671","-87.08951","-5","1"
+"49831","Felch","MI","45.994849","-87.81615","-6","1"
+"49833","Little Lake","MI","46.291233","-87.33355","-5","1"
+"49834","Foster City","MI","45.947706","-87.77089","-6","1"
+"49835","Garden","MI","45.769159","-86.55894","-5","1"
+"49836","Germfask","MI","46.180416","-85.90176","-5","1"
+"49837","Gladstone","MI","45.847136","-87.04529","-5","1"
+"49838","Gould City","MI","46.095949","-85.71737","-5","1"
+"49839","Grand Marais","MI","46.655567","-85.95837","-5","1"
+"49840","Gulliver","MI","46.000666","-85.9963","-5","1"
+"49841","Gwinn","MI","46.299186","-87.43312","-5","1"
+"49845","Harris","MI","45.692178","-87.351342","-6","1"
+"49847","Hermansville","MI","45.709804","-87.61054","-6","1"
+"49848","Ingalls","MI","45.376503","-87.63243","-6","1"
+"49849","Ishpeming","MI","46.458207","-87.72709","-5","1"
+"49852","Loretto","MI","45.781167","-87.81759","-6","1"
+"49853","McMillan","MI","46.301265","-85.72321","-5","1"
+"49854","Manistique","MI","46.042121","-86.33946","-5","1"
+"49855","Marquette","MI","46.554402","-87.42223","-5","1"
+"49858","Menominee","MI","45.1431","-87.60897","-6","1"
+"49861","Michigamme","MI","46.54081","-88.14742","-5","1"
+"49862","Munising","MI","46.37503","-86.70615","-5","1"
+"49863","Nadeau","MI","45.610678","-87.55411","-6","1"
+"49864","Nahma","MI","45.840744","-86.66216","-5","1"
+"49865","National Mine","MI","46.604141","-87.614805","-5","1"
+"49866","Negaunee","MI","46.517192","-87.58245","-5","1"
+"49868","Newberry","MI","46.434201","-85.54758","-5","1"
+"49869","Wells","MI","46.07199","-87.533429","-5","1"
+"49870","Norway","MI","45.792399","-87.90824","-6","1"
+"49871","Palmer","MI","46.440274","-87.58988","-5","1"
+"49872","Perkins","MI","45.987113","-87.0742","-5","1"
+"49873","Perronville","MI","45.889823","-87.50716","-6","1"
+"49874","Powers","MI","45.693128","-87.50966","-6","1"
+"49876","Quinnesec","MI","45.80007","-87.99141","-6","1"
+"49877","Ralph","MI","46.108829","-87.78294","-6","1"
+"49878","Rapid River","MI","45.926298","-86.90898","-5","1"
+"49879","Republic","MI","46.345957","-88.01972","-5","1"
+"49880","Rock","MI","46.086125","-87.20146","-5","1"
+"49881","Sagola","MI","46.085875","-87.99607","-6","1"
+"49883","Seney","MI","46.460628","-85.98878","-5","1"
+"49884","Shingleton","MI","46.399545","-86.43315","-5","1"
+"49885","Skandia","MI","46.356104","-87.25211","-5","1"
+"49886","Spalding","MI","45.695551","-87.50457","-6","1"
+"49887","Stephenson","MI","45.417184","-87.6281","-6","1"
+"49891","Trenary","MI","46.229173","-87.01715","-5","1"
+"49892","Vulcan","MI","45.755894","-87.78838","-6","1"
+"49893","Wallace","MI","45.314014","-87.63114","-6","1"
+"49894","Wells","MI","45.778066","-87.07647","-5","1"
+"49895","Wetmore","MI","46.191294","-86.64901","-5","1"
+"49896","Wilson","MI","45.685664","-87.37748","-6","1"
+"49901","Ahmeek","MI","47.297841","-88.39491","-5","1"
+"49902","Alpha","MI","46.045407","-88.37681","-6","1"
+"49903","Amasa","MI","46.234686","-88.45043","-6","1"
+"49905","Atlantic Mine","MI","47.101109","-88.71833","-5","1"
+"49908","Baraga","MI","46.795417","-88.52645","-5","1"
+"49910","Bergland","MI","46.576653","-89.57618","-5","1"
+"49911","Bessemer","MI","46.480948","-90.05138","-6","1"
+"49912","Bruce Crossing","MI","46.46077","-89.15645","-5","1"
+"49913","Calumet","MI","47.239083","-88.46121","-5","1"
+"49915","Caspian","MI","46.063428","-88.62738","-6","1"
+"49916","Chassell","MI","47.010896","-88.54077","-5","1"
+"49917","Copper City","MI","47.283086","-88.38434","-5","1"
+"49918","Copper Harbor","MI","47.467597","-87.88212","-5","1"
+"49919","Covington","MI","46.559834","-88.52201","-5","1"
+"49920","Crystal Falls","MI","46.12624","-88.35677","-6","1"
+"49921","Dodgeville","MI","47.093922","-88.57894","-5","1"
+"49922","Dollar Bay","MI","47.122751","-88.4818","-5","1"
+"49924","Houghton","MI","47.414054","-88.297959","-5","1"
+"49925","Ewen","MI","46.555946","-89.34434","-5","1"
+"49927","Gaastra","MI","46.056611","-88.59396","-6","1"
+"49929","Greenland","MI","46.780926","-89.09762","-5","1"
+"49930","Hancock","MI","47.145007","-88.57829","-5","1"
+"49931","Houghton","MI","47.11929","-88.57259","-5","1"
+"49934","Hubbell","MI","47.170691","-88.43396","-5","1"
+"49935","Iron River","MI","46.108022","-88.70073","-6","1"
+"49938","Ironwood","MI","46.47351","-90.15732","-6","1"
+"49942","Kearsarge","MI","47.269659","-88.41589","-5","1"
+"49943","Iron River","MI","46.421861","-88.879139","-5","1"
+"49945","Lake Linden","MI","47.17583","-88.32904","-5","1"
+"49946","Lanse","MI","46.766303","-88.37867","-5","1"
+"49947","Marenisco","MI","46.420235","-89.66518","-6","1"
+"49948","Mass City","MI","46.730077","-89.02038","-5","1"
+"49950","Mohawk","MI","47.400603","-88.14768","-5","1"
+"49952","Nisula","MI","46.7596","-88.84928","-5","1"
+"49953","Ontonagon","MI","46.846455","-89.35119","-5","1"
+"49955","Painesdale","MI","47.034828","-88.6719","-5","1"
+"49958","Pelkie","MI","46.830728","-88.65751","-5","1"
+"49959","Ramsay","MI","46.470746","-89.99603","-6","1"
+"49960","Rockland","MI","46.739853","-89.18126","-5","1"
+"49961","Sidnaw","MI","46.469552","-88.73659","-5","1"
+"49962","Skanee","MI","46.877","-88.17166","-5","1"
+"49963","South Range","MI","47.069257","-88.63936","-5","1"
+"49964","Stambaugh","MI","46.081472","-88.62806","-6","1"
+"49965","Toivola","MI","47.001469","-88.88179","-5","1"
+"49967","Trout Creek","MI","46.459705","-89.0028","-5","1"
+"49968","Wakefield","MI","46.466645","-89.91876","-6","1"
+"49969","Watersmeet","MI","46.258959","-89.26594","-6","1"
+"49970","Watton","MI","46.53227","-88.60459","-5","1"
+"49971","White Pine","MI","46.754237","-89.57925","-5","1"
+"49974","Pickford","MI","46.158139","-84.361116","-5","1"
+"49990","Alpha","MI","46.045288","-88.375199","-6","1"
+"50001","Ackworth","IA","41.363615","-93.41494","-6","1"
+"50002","Adair","IA","41.507565","-94.64805","-6","1"
+"50003","Adel","IA","41.612628","-94.03587","-6","1"
+"50005","Albion","IA","42.116477","-93.00357","-6","1"
+"50006","Alden","IA","42.50767","-93.40082","-6","1"
+"50007","Alleman","IA","41.804875","-93.60475","-6","1"
+"50008","Allerton","IA","40.688451","-93.37907","-6","1"
+"50009","Altoona","IA","41.644716","-93.46641","-6","1"
+"50010","Ames","IA","42.02933","-93.60966","-6","1"
+"50011","Ames","IA","42.035998","-93.465172","-6","1"
+"50012","Ames","IA","42.023557","-93.648465","-6","1"
+"50013","Ames","IA","42.023535","-93.640818","-6","1"
+"50014","Ames","IA","42.033235","-93.66741","-6","1"
+"50015","Ankeny","IA","41.672687","-93.572173","-6","1"
+"50020","Anita","IA","41.445635","-94.75806","-6","1"
+"50021","Ankeny","IA","41.725288","-93.60475","-6","1"
+"50022","Atlantic","IA","41.410484","-95.00852","-6","1"
+"50025","Audubon","IA","41.741295","-94.92781","-6","1"
+"50026","Bagley","IA","41.853498","-94.43912","-6","1"
+"50027","Barnes City","IA","41.472488","-92.46899","-6","1"
+"50028","Baxter","IA","41.820644","-93.14743","-6","1"
+"50029","Bayard","IA","41.845871","-94.55588","-6","1"
+"50031","Beaver","IA","42.038746","-94.143566","-6","1"
+"50032","Berwick","IA","41.666513","-93.53916","-6","1"
+"50033","Bevington","IA","41.360357","-93.79219","-6","1"
+"50034","Blairsburg","IA","42.490439","-93.64187","-6","1"
+"50035","Bondurant","IA","41.704455","-93.46171","-6","1"
+"50036","Boone","IA","42.074515","-93.87437","-6","1"
+"50037","Boone","IA","42.036552","-93.931686","-6","1"
+"50038","Booneville","IA","41.519724","-93.90483","-6","1"
+"50039","Bouton","IA","41.830156","-94.01444","-6","1"
+"50040","Boxholm","IA","42.174905","-94.10552","-6","1"
+"50041","Bradford","IA","42.632923","-93.2459","-6","1"
+"50042","Brayton","IA","41.534416","-94.90323","-6","1"
+"50043","Buckeye","IA","42.417866","-93.375544","-6","1"
+"50044","Bussey","IA","41.202354","-92.88621","-6","1"
+"50046","Cambridge","IA","41.89949","-93.5311","-6","1"
+"50047","Carlisle","IA","41.491089","-93.48058","-6","1"
+"50048","Casey","IA","41.514342","-94.52139","-6","1"
+"50049","Chariton","IA","41.02891","-93.29857","-6","1"
+"50050","Churdan","IA","42.16372","-94.50771","-6","1"
+"50051","Clemons","IA","42.13644","-93.14222","-6","1"
+"50052","Clio","IA","40.639737","-93.45615","-6","1"
+"50054","Colfax","IA","41.682808","-93.23591","-6","1"
+"50055","Collins","IA","41.880967","-93.29691","-6","1"
+"50056","Colo","IA","42.011477","-93.31293","-6","1"
+"50057","Columbia","IA","41.185045","-93.1683","-6","1"
+"50058","Coon Rapids","IA","41.87131","-94.6884","-6","1"
+"50059","Cooper","IA","41.919495","-94.34518","-6","1"
+"50060","Corydon","IA","40.756632","-93.31527","-6","1"
+"50061","Cumming","IA","41.491203","-93.78537","-6","1"
+"50062","Dallas","IA","41.23022","-93.23904","-6","1"
+"50063","Dallas Center","IA","41.687847","-93.94852","-6","1"
+"50064","Dana","IA","42.114858","-94.23112","-6","1"
+"50065","Davis City","IA","40.623677","-93.80106","-6","1"
+"50066","Dawson","IA","41.827287","-94.21237","-6","1"
+"50067","Decatur","IA","40.734072","-93.85169","-6","1"
+"50068","Derby","IA","40.937432","-93.45659","-6","1"
+"50069","De Soto","IA","41.53106","-94.00842","-6","1"
+"50070","Dexter","IA","41.488275","-94.23785","-6","1"
+"50071","Dows","IA","42.653654","-93.50761","-6","1"
+"50072","Earlham","IA","41.468077","-94.12488","-6","1"
+"50073","Elkhart","IA","41.792118","-93.52595","-6","1"
+"50074","Ellston","IA","40.852515","-94.07546","-6","1"
+"50075","Ellsworth","IA","42.325266","-93.56507","-6","1"
+"50076","Exira","IA","41.592497","-94.87032","-6","1"
+"50078","Ferguson","IA","41.93746","-92.865","-6","1"
+"50101","Galt","IA","42.682176","-93.61472","-6","1"
+"50102","Garden City","IA","42.24489","-93.39783","-6","1"
+"50103","Garden Grove","IA","40.801638","-93.60711","-6","1"
+"50104","Gibson","IA","41.472819","-92.3841","-6","1"
+"50105","Gilbert","IA","42.110624","-93.64504","-6","1"
+"50106","Gilman","IA","41.87955","-92.79387","-6","1"
+"50107","Grand Junction","IA","42.036623","-94.21948","-6","1"
+"50108","Grand River","IA","40.834902","-93.95414","-6","1"
+"50109","Granger","IA","41.759988","-93.81486","-6","1"
+"50110","Gray","IA","41.84115","-94.9812","-6","1"
+"50111","Grimes","IA","41.67822","-93.7935","-6","1"
+"50112","Grinnell","IA","41.736434","-92.72123","-6","1"
+"50115","Guthrie Center","IA","41.690084","-94.52602","-6","1"
+"50116","Hamilton","IA","41.17969","-92.94775","-6","1"
+"50117","Hamlin","IA","41.671777","-94.84924","-6","1"
+"50118","Hartford","IA","41.457014","-93.39078","-6","1"
+"50119","Harvey","IA","41.313748","-92.93875","-6","1"
+"50120","Haverhill","IA","41.940175","-92.96979","-6","1"
+"50122","Hubbard","IA","42.30884","-93.31162","-6","1"
+"50123","Humeston","IA","40.854525","-93.49863","-6","1"
+"50124","Huxley","IA","41.893335","-93.59844","-6","1"
+"50125","Indianola","IA","41.354068","-93.57506","-6","1"
+"50126","Iowa Falls","IA","42.515426","-93.26217","-6","1"
+"50127","Ira","IA","41.777174","-93.21383","-6","1"
+"50128","Jamaica","IA","41.855913","-94.29981","-6","1"
+"50129","Jefferson","IA","42.017677","-94.37939","-6","1"
+"50130","Jewell","IA","42.302683","-93.65232","-6","1"
+"50131","Johnston","IA","41.674757","-93.71865","-6","1"
+"50132","Kamrar","IA","42.393155","-93.70867","-6","1"
+"50133","Kellerton","IA","40.70332","-94.08143","-6","1"
+"50134","Kelley","IA","41.949947","-93.6648","-6","1"
+"50135","Kellogg","IA","41.736358","-92.89481","-6","1"
+"50136","Keswick","IA","41.463624","-92.26841","-6","1"
+"50137","Killduff","IA","41.607887","-92.90573","-6","1"
+"50138","Knoxville","IA","41.307595","-93.10226","-6","1"
+"50139","Lacona","IA","41.182964","-93.36927","-6","1"
+"50140","Lamoni","IA","40.630919","-93.94857","-6","1"
+"50141","Laurel","IA","41.88053","-92.95464","-6","1"
+"50142","Le Grand","IA","42.00533","-92.77525","-6","1"
+"50143","Leighton","IA","41.324195","-92.80631","-6","1"
+"50144","Leon","IA","40.736802","-93.74273","-6","1"
+"50145","Liberty Center","IA","41.203946","-93.50069","-6","1"
+"50146","Linden","IA","41.668493","-94.26066","-6","1"
+"50147","Lineville","IA","40.60243","-93.52778","-6","1"
+"50148","Liscomb","IA","42.187863","-93.00381","-6","1"
+"50149","Lorimor","IA","41.137674","-94.08042","-6","1"
+"50150","Lovilia","IA","41.120845","-92.93572","-6","1"
+"50151","Lucas","IA","41.06058","-93.49076","-6","1"
+"50152","Luther","IA","41.967091","-93.82106","-6","1"
+"50153","Lynnville","IA","41.573516","-92.79458","-6","1"
+"50154","McCallsburg","IA","42.168307","-93.39718","-6","1"
+"50155","Macksburg","IA","41.210955","-94.18994","-6","1"
+"50156","Madrid","IA","41.877415","-93.79925","-6","1"
+"50157","Malcom","IA","41.7388","-92.56155","-6","1"
+"50158","Marshalltown","IA","42.042506","-92.90646","-6","1"
+"50160","Martensdale","IA","41.373193","-93.74093","-6","1"
+"50161","Maxwell","IA","41.86625","-93.40134","-6","1"
+"50162","Melbourne","IA","41.939663","-93.07114","-6","1"
+"50163","Melcher","IA","41.242194","-93.173193","-6","1"
+"50164","Menlo","IA","41.504978","-94.4065","-6","1"
+"50165","Millerton","IA","40.847504","-93.30502","-6","1"
+"50166","Milo","IA","41.283703","-93.41399","-6","1"
+"50167","Minburn","IA","41.750745","-94.04659","-6","1"
+"50168","Mingo","IA","41.780089","-93.26916","-6","1"
+"50169","Mitchellville","IA","41.661112","-93.35327","-6","1"
+"50170","Monroe","IA","41.528347","-93.10517","-6","1"
+"50171","Montezuma","IA","41.581309","-92.53946","-6","1"
+"50173","Montour","IA","41.980296","-92.711","-6","1"
+"50174","Murray","IA","41.039527","-93.95498","-6","1"
+"50177","Grinnell","IA","41.685742","-92.532032","-6","1"
+"50197","Knoxville","IA","41.334549","-93.099205","-6","1"
+"50198","Knoxville","IA","41.334549","-93.099205","-6","1"
+"50201","Nevada","IA","42.026021","-93.4484","-6","1"
+"50206","New Providence","IA","42.250902","-93.2007","-6","1"
+"50207","New Sharon","IA","41.445018","-92.64823","-6","1"
+"50208","Newton","IA","41.702148","-93.04467","-6","1"
+"50210","New Virginia","IA","41.193148","-93.71388","-6","1"
+"50211","Norwalk","IA","41.470726","-93.68225","-6","1"
+"50212","Ogden","IA","42.045766","-94.0443","-6","1"
+"50213","Osceola","IA","41.031309","-93.77004","-6","1"
+"50214","Otley","IA","41.456325","-93.0738","-6","1"
+"50216","Panora","IA","41.701873","-94.36488","-6","1"
+"50217","Paton","IA","42.17191","-94.25943","-6","1"
+"50218","Patterson","IA","41.348815","-93.88068","-6","1"
+"50219","Pella","IA","41.411394","-92.91126","-6","1"
+"50220","Perry","IA","41.846679","-94.10961","-6","1"
+"50222","Peru","IA","41.223389","-93.94309","-6","1"
+"50223","Pilot Mound","IA","42.162453","-94.01728","-6","1"
+"50225","Pleasantville","IA","41.381537","-93.27056","-6","1"
+"50226","Polk City","IA","41.782755","-93.71405","-6","1"
+"50227","Popejoy","IA","42.594986","-93.42826","-6","1"
+"50228","Prairie City","IA","41.584485","-93.24161","-6","1"
+"50229","Prole","IA","41.381146","-93.77547","-6","1"
+"50230","Radcliffe","IA","42.303222","-93.45343","-6","1"
+"50231","Randall","IA","42.237408","-93.60253","-6","1"
+"50232","Reasnor","IA","41.557079","-92.97056","-6","1"
+"50233","Redfield","IA","41.604233","-94.20931","-6","1"
+"50234","Rhodes","IA","41.89347","-93.1813","-6","1"
+"50235","Rippey","IA","41.931753","-94.20565","-6","1"
+"50236","Roland","IA","42.168363","-93.49432","-6","1"
+"50237","Runnells","IA","41.536205","-93.38182","-6","1"
+"50238","Russell","IA","40.962051","-93.18373","-6","1"
+"50239","Saint Anthony","IA","42.135419","-93.2024","-6","1"
+"50240","Saint Charles","IA","41.304096","-93.79728","-6","1"
+"50241","Saint Marys","IA","41.308451","-93.73157","-6","1"
+"50242","Searsboro","IA","41.56512","-92.69484","-6","1"
+"50243","Sheldahl","IA","41.864393","-93.69541","-6","1"
+"50244","Slater","IA","41.871283","-93.67508","-6","1"
+"50246","Stanhope","IA","42.281552","-93.7952","-6","1"
+"50247","State Center","IA","42.010415","-93.16827","-6","1"
+"50248","Story City","IA","42.186442","-93.59867","-6","1"
+"50249","Stratford","IA","42.280223","-93.90657","-6","1"
+"50250","Stuart","IA","41.500086","-94.32731","-6","1"
+"50251","Sully","IA","41.5714","-92.85941","-6","1"
+"50252","Swan","IA","41.449489","-93.31782","-6","1"
+"50254","Thayer","IA","40.99355","-94.07635","-6","1"
+"50255","Thornburg","IA","41.336267","-92.178366","-6","1"
+"50256","Tracy","IA","41.277693","-92.903","-6","1"
+"50257","Truro","IA","41.204733","-93.84553","-6","1"
+"50258","Union","IA","42.232454","-93.07833","-6","1"
+"50259","Gifford","IA","42.383133","-93.250567","-6","1"
+"50261","Van Meter","IA","41.490848","-93.94509","-6","1"
+"50262","Van Wert","IA","40.857503","-93.79945","-6","1"
+"50263","Waukee","IA","41.601516","-93.86151","-6","1"
+"50264","Weldon","IA","40.89222","-93.70988","-6","1"
+"50265","West Des Moines","IA","41.570916","-93.73568","-6","1"
+"50266","West Des Moines","IA","41.581181","-93.78287","-6","1"
+"50268","What Cheer","IA","41.403794","-92.3541","-6","1"
+"50269","Whitten","IA","42.261478","-93.00738","-6","1"
+"50271","Williams","IA","42.486287","-93.54644","-6","1"
+"50272","Williamson","IA","41.08869","-93.25821","-6","1"
+"50273","Winterset","IA","41.332618","-94.03802","-6","1"
+"50274","Wiota","IA","41.394625","-94.86276","-6","1"
+"50275","Woodburn","IA","41.01619","-93.59181","-6","1"
+"50276","Woodward","IA","41.855315","-93.92795","-6","1"
+"50277","Yale","IA","41.779131","-94.35418","-6","1"
+"50278","Zearing","IA","42.158866","-93.29673","-6","1"
+"50294","Stratford","IA","42.266846","-93.927086","-6","1"
+"50301","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50302","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50303","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50304","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50305","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50306","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50307","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50308","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50309","Des Moines","IA","41.585939","-93.62004","-6","1"
+"50310","Des Moines","IA","41.625988","-93.67403","-6","1"
+"50311","Des Moines","IA","41.601189","-93.68076","-6","1"
+"50312","Des Moines","IA","41.587039","-93.67356","-6","1"
+"50313","Des Moines","IA","41.637638","-93.61636","-6","1"
+"50314","Des Moines","IA","41.602989","-93.63237","-6","1"
+"50315","Des Moines","IA","41.545089","-93.61904","-6","1"
+"50316","Des Moines","IA","41.606339","-93.59829","-6","1"
+"50317","Des Moines","IA","41.606939","-93.54829","-6","1"
+"50318","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50319","Des Moines","IA","41.592089","-93.603967","-6","1"
+"50320","Des Moines","IA","41.537059","-93.58072","-6","1"
+"50321","Des Moines","IA","41.542789","-93.66189","-6","1"
+"50322","Urbandale","IA","41.630521","-93.7238","-6","1"
+"50323","Urbandale","IA","41.625788","-93.80235","-6","1"
+"50325","Clive","IA","41.60787","-93.78093","-6","1"
+"50327","Pleasant Hill","IA","41.587818","-93.505751","-6","1"
+"50328","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50329","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50330","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50331","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50332","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50333","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50334","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50335","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50336","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50338","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50339","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50340","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50347","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50350","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50359","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50360","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50361","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50362","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50363","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50364","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50367","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50368","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50369","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50380","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50381","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50391","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50392","Des Moines","IA","41.587839","-93.627368","-6","1"
+"50393","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50394","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50395","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50396","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50397","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50398","West Des Moines","IA","41.594543","-93.785502","-6","1"
+"50401","Mason City","IA","43.153969","-93.20037","-6","1"
+"50402","Mason City","IA","43.081604","-93.260879","-6","1"
+"50405","Lake Mills","IA","43.418395","-93.525253","-6","1"
+"50420","Alexander","IA","42.811536","-93.46844","-6","1"
+"50421","Belmond","IA","42.842616","-93.6187","-6","1"
+"50423","Britt","IA","43.104076","-93.8041","-6","1"
+"50424","Buffalo Center","IA","43.392145","-93.94282","-6","1"
+"50426","Carpenter","IA","43.414156","-93.01693","-6","1"
+"50427","Chapin","IA","42.834852","-93.222587","-6","1"
+"50428","Clear Lake","IA","43.1375","-93.38463","-6","1"
+"50430","Corwith","IA","42.985613","-93.96138","-6","1"
+"50431","Coulter","IA","42.735305","-93.37056","-6","1"
+"50432","Crystal Lake","IA","43.222661","-93.7909","-6","1"
+"50433","Dougherty","IA","42.922595","-93.04392","-6","1"
+"50434","Fertile","IA","43.260087","-93.43553","-6","1"
+"50435","Floyd","IA","43.157144","-92.76056","-6","1"
+"50436","Forest City","IA","43.259165","-93.65625","-6","1"
+"50438","Garner","IA","43.102343","-93.61033","-6","1"
+"50439","Goodell","IA","42.930305","-93.62645","-6","1"
+"50440","Grafton","IA","43.329416","-93.07297","-6","1"
+"50441","Hampton","IA","42.743106","-93.21518","-6","1"
+"50444","Hanlontown","IA","43.287532","-93.3836","-6","1"
+"50446","Joice","IA","43.343138","-93.45694","-6","1"
+"50447","Kanawha","IA","42.926804","-93.80821","-6","1"
+"50448","Kensett","IA","43.349766","-93.22573","-6","1"
+"50449","Klemme","IA","43.002473","-93.58292","-6","1"
+"50450","Lake Mills","IA","43.418877","-93.52078","-6","1"
+"50451","Lakota","IA","43.379814","-94.09044","-6","1"
+"50452","Latimer","IA","42.77929","-93.36842","-6","1"
+"50453","Leland","IA","43.363881","-93.6468","-6","1"
+"50454","Little Cedar","IA","43.38301","-92.7293","-6","1"
+"50455","McIntire","IA","43.450496","-92.64331","-6","1"
+"50456","Manly","IA","43.289041","-93.20838","-6","1"
+"50457","Meservey","IA","42.916174","-93.48318","-6","1"
+"50458","Nora Springs","IA","43.147661","-93.00519","-6","1"
+"50459","Northwood","IA","43.444448","-93.24015","-6","1"
+"50460","Orchard","IA","43.220043","-92.72237","-6","1"
+"50461","Osage","IA","43.290536","-92.82115","-6","1"
+"50464","Plymouth","IA","43.248524","-93.09976","-6","1"
+"50465","Rake","IA","43.484445","-93.91817","-6","1"
+"50466","Riceville","IA","43.376582","-92.54755","-6","1"
+"50467","Rock Falls","IA","43.206593","-93.08574","-6","1"
+"50468","Rockford","IA","43.048973","-92.95458","-6","1"
+"50469","Rockwell","IA","42.994932","-93.20192","-6","1"
+"50470","Rowan","IA","42.7402","-93.55338","-6","1"
+"50471","Rudd","IA","43.148134","-92.88759","-6","1"
+"50472","Saint Ansgar","IA","43.402708","-92.93841","-6","1"
+"50473","Scarville","IA","43.46592","-93.66671","-6","1"
+"50475","Sheffield","IA","42.88516","-93.22082","-6","1"
+"50476","Stacyville","IA","43.441028","-92.77702","-6","1"
+"50477","Swaledale","IA","42.97779","-93.32768","-6","1"
+"50478","Thompson","IA","43.385425","-93.77734","-6","1"
+"50479","Thornton","IA","42.939528","-93.39301","-6","1"
+"50480","Titonka","IA","43.242739","-94.04333","-6","1"
+"50481","Toeterville","IA","43.356439","-92.788967","-6","1"
+"50482","Ventura","IA","43.124246","-93.48259","-6","1"
+"50483","Wesley","IA","43.104175","-93.99988","-6","1"
+"50484","Woden","IA","43.236648","-93.92137","-6","1"
+"50501","Fort Dodge","IA","42.499242","-94.18256","-6","1"
+"50510","Albert City","IA","42.768165","-94.97033","-6","1"
+"50511","Algona","IA","43.0739","-94.22602","-6","1"
+"50514","Armstrong","IA","43.398596","-94.47223","-6","1"
+"50515","Ayrshire","IA","43.023296","-94.85188","-6","1"
+"50516","Badger","IA","42.624944","-94.13904","-6","1"
+"50517","Bancroft","IA","43.295639","-94.22578","-6","1"
+"50518","Barnum","IA","42.523953","-94.35401","-6","1"
+"50519","Bode","IA","42.884723","-94.27644","-6","1"
+"50520","Bradgate","IA","42.802568","-94.41955","-6","1"
+"50521","Burnside","IA","42.346859","-94.10732","-6","1"
+"50522","Burt","IA","43.192938","-94.19512","-6","1"
+"50523","Callender","IA","42.36534","-94.29779","-6","1"
+"50524","Clare","IA","42.603391","-94.36129","-6","1"
+"50525","Clarion","IA","42.738313","-93.7385","-6","1"
+"50526","Clarion","IA","42.733001","-93.73523","-6","1"
+"50527","Curlew","IA","42.973868","-94.78269","-6","1"
+"50528","Cylinder","IA","43.117331","-94.54767","-6","1"
+"50529","Dakota City","IA","42.720708","-94.20185","-6","1"
+"50530","Dayton","IA","42.26594","-94.0518","-6","1"
+"50531","Dolliver","IA","43.465883","-94.61632","-6","1"
+"50532","Duncombe","IA","42.456733","-93.99814","-6","1"
+"50533","Eagle Grove","IA","42.659143","-93.90684","-6","1"
+"50535","Early","IA","42.453686","-95.16395","-6","1"
+"50536","Emmetsburg","IA","43.115156","-94.6931","-6","1"
+"50538","Farnhamville","IA","42.279123","-94.41373","-6","1"
+"50539","Fenton","IA","43.225165","-94.42583","-6","1"
+"50540","Fonda","IA","42.58816","-94.84192","-6","1"
+"50541","Gilmore City","IA","42.71032","-94.45293","-6","1"
+"50542","Goldfield","IA","42.764886","-93.94113","-6","1"
+"50543","Gowrie","IA","42.269537","-94.29539","-6","1"
+"50544","Harcourt","IA","42.259002","-94.17666","-6","1"
+"50545","Hardy","IA","42.818996","-94.07424","-6","1"
+"50546","Havelock","IA","42.836636","-94.70587","-6","1"
+"50548","Humboldt","IA","42.720313","-94.22517","-6","1"
+"50551","Jolley","IA","42.475817","-94.7321","-6","1"
+"50552","Knierim","IA","42.455148","-94.45652","-6","1"
+"50554","Laurens","IA","42.844055","-94.84275","-6","1"
+"50556","Ledyard","IA","43.448529","-94.19697","-6","1"
+"50557","Lehigh","IA","42.358466","-94.05829","-6","1"
+"50558","Livermore","IA","42.872099","-94.17339","-6","1"
+"50559","Lone Rock","IA","43.204803","-94.31526","-6","1"
+"50560","Lu Verne","IA","42.947984","-94.10845","-6","1"
+"50561","Lytton","IA","42.417882","-94.85098","-6","1"
+"50562","Mallard","IA","42.949884","-94.66372","-6","1"
+"50563","Manson","IA","42.52503","-94.53628","-6","1"
+"50565","Marathon","IA","42.855822","-95.00245","-6","1"
+"50566","Moorland","IA","42.437122","-94.3214","-6","1"
+"50567","Nemaha","IA","42.527637","-95.10125","-6","1"
+"50568","Newell","IA","42.612476","-95.00006","-6","1"
+"50569","Otho","IA","42.417893","-94.1494","-6","1"
+"50570","Ottosen","IA","42.899575","-94.37557","-6","1"
+"50571","Palmer","IA","42.638478","-94.58979","-6","1"
+"50573","Plover","IA","42.878058","-94.624","-6","1"
+"50574","Pocahontas","IA","42.724938","-94.68365","-6","1"
+"50575","Pomeroy","IA","42.55602","-94.68307","-6","1"
+"50576","Rembrandt","IA","42.814277","-95.18071","-6","1"
+"50577","Renwick","IA","42.846831","-93.98159","-6","1"
+"50578","Ringsted","IA","43.291538","-94.54121","-6","1"
+"50579","Rockwell City","IA","42.395906","-94.63294","-6","1"
+"50581","Rolfe","IA","42.842111","-94.53114","-6","1"
+"50582","Rutland","IA","42.778791","-94.29535","-6","1"
+"50583","Sac City","IA","42.43142","-94.99323","-6","1"
+"50585","Sioux Rapids","IA","42.907223","-95.14315","-6","1"
+"50586","Somers","IA","42.402475","-94.4351","-6","1"
+"50587","Rinard","IA","42.339118","-94.488618","-6","1"
+"50588","Storm Lake","IA","42.646924","-95.1807","-6","1"
+"50590","Swea City","IA","43.392985","-94.31496","-6","1"
+"50591","Thor","IA","42.684486","-94.05446","-6","1"
+"50592","Truesdale","IA","42.728665","-95.18303","-6","1"
+"50593","Varina","IA","42.658595","-94.90006","-6","1"
+"50594","Vincent","IA","42.587704","-94.02502","-6","1"
+"50595","Webster City","IA","42.464579","-93.82056","-6","1"
+"50597","West Bend","IA","42.97944","-94.46472","-6","1"
+"50598","Whittemore","IA","43.077787","-94.41061","-6","1"
+"50599","Woolstock","IA","42.579038","-93.80387","-6","1"
+"50601","Ackley","IA","42.563333","-93.04954","-6","1"
+"50602","Allison","IA","42.74806","-92.80277","-6","1"
+"50603","Alta Vista","IA","43.191256","-92.46546","-6","1"
+"50604","Aplington","IA","42.606337","-92.8988","-6","1"
+"50605","Aredale","IA","42.834044","-93.0135","-6","1"
+"50606","Arlington","IA","42.752057","-91.67149","-6","1"
+"50607","Aurora","IA","42.616399","-91.73262","-6","1"
+"50608","Austinville","IA","42.58243","-92.95988","-6","1"
+"50609","Beaman","IA","42.226183","-92.81015","-6","1"
+"50611","Bristow","IA","42.805321","-92.91579","-6","1"
+"50612","Buckingham","IA","42.275046","-92.39722","-6","1"
+"50613","Cedar Falls","IA","42.527184","-92.45609","-6","1"
+"50614","Cedar Falls","IA","42.469768","-92.309475","-6","1"
+"50616","Charles City","IA","43.072978","-92.66719","-6","1"
+"50619","Clarksville","IA","42.788967","-92.66584","-6","1"
+"50620","Colwell","IA","43.110765","-92.744821","-6","1"
+"50621","Conrad","IA","42.238432","-92.90748","-6","1"
+"50622","Denver","IA","42.671132","-92.33825","-6","1"
+"50623","Dewar","IA","42.526943","-92.21802","-6","1"
+"50624","Dike","IA","42.463161","-92.66183","-6","1"
+"50625","Dumont","IA","42.754361","-92.9751","-6","1"
+"50626","Dunkerton","IA","42.576054","-92.16575","-6","1"
+"50627","Eldora","IA","42.357549","-93.0975","-6","1"
+"50628","Elma","IA","43.26232","-92.41457","-6","1"
+"50629","Fairbank","IA","42.640202","-92.06988","-6","1"
+"50630","Fredericksburg","IA","42.963377","-92.20768","-6","1"
+"50631","Frederika","IA","42.882349","-92.30477","-6","1"
+"50632","Garwin","IA","42.079127","-92.70805","-6","1"
+"50633","Geneva","IA","42.671214","-93.13215","-6","1"
+"50634","Gilbertville","IA","42.417252","-92.21396","-6","1"
+"50635","Gladbrook","IA","42.190943","-92.70755","-6","1"
+"50636","Greene","IA","42.891377","-92.80848","-6","1"
+"50638","Grundy Center","IA","42.361095","-92.78015","-6","1"
+"50641","Hazleton","IA","42.605576","-91.91229","-6","1"
+"50642","Holland","IA","42.43442","-92.79802","-6","1"
+"50643","Hudson","IA","42.377311","-92.46513","-6","1"
+"50644","Independence","IA","42.470191","-91.89268","-6","1"
+"50645","Ionia","IA","43.031136","-92.46149","-6","1"
+"50647","Janesville","IA","42.646089","-92.473","-6","1"
+"50648","Jesup","IA","42.453206","-92.09319","-6","1"
+"50649","Kesley","IA","42.662282","-92.91099","-6","1"
+"50650","Lamont","IA","42.612267","-91.6572","-6","1"
+"50651","La Porte City","IA","42.325098","-92.19383","-6","1"
+"50652","Lincoln","IA","42.263223","-92.69186","-6","1"
+"50653","Marble Rock","IA","42.966003","-92.87985","-6","1"
+"50654","Masonville","IA","42.440131","-91.60941","-6","1"
+"50655","Maynard","IA","42.774435","-91.88645","-6","1"
+"50657","Morrison","IA","42.343304","-92.673819","-6","1"
+"50658","Nashua","IA","42.953461","-92.53473","-6","1"
+"50659","New Hampton","IA","43.072094","-92.32323","-6","1"
+"50660","New Hartford","IA","42.568395","-92.62664","-6","1"
+"50661","North Washington","IA","43.117425","-92.414422","-6","1"
+"50662","Oelwein","IA","42.682886","-91.92182","-6","1"
+"50664","Oran","IA","42.862275","-91.843639","-6","1"
+"50665","Parkersburg","IA","42.576102","-92.78183","-6","1"
+"50666","Plainfield","IA","42.855231","-92.50295","-6","1"
+"50667","Raymond","IA","42.468387","-92.21818","-6","1"
+"50668","Readlyn","IA","42.693119","-92.22915","-6","1"
+"50669","Reinbeck","IA","42.329448","-92.60686","-6","1"
+"50670","Shell Rock","IA","42.710399","-92.59746","-6","1"
+"50671","Stanley","IA","42.643265","-91.81038","-6","1"
+"50672","Steamboat Rock","IA","42.410168","-93.06747","-6","1"
+"50673","Stout","IA","42.527131","-92.71138","-6","1"
+"50674","Sumner","IA","42.846877","-92.11188","-6","1"
+"50675","Traer","IA","42.193577","-92.4828","-6","1"
+"50676","Tripoli","IA","42.807994","-92.26368","-6","1"
+"50677","Waverly","IA","42.741016","-92.45984","-6","1"
+"50680","Wellsburg","IA","42.451112","-92.91453","-6","1"
+"50681","Westgate","IA","42.778924","-92.00735","-6","1"
+"50682","Winthrop","IA","42.459398","-91.71229","-6","1"
+"50701","Waterloo","IA","42.473536","-92.36382","-6","1"
+"50702","Waterloo","IA","42.475886","-92.33578","-6","1"
+"50703","Waterloo","IA","42.513636","-92.32418","-6","1"
+"50704","Waterloo","IA","42.469768","-92.309475","-6","1"
+"50706","Waterloo","IA","42.407588","-92.26657","-6","1"
+"50707","Evansdale","IA","42.477887","-92.28275","-6","1"
+"50799","Waterloo","IA","42.469768","-92.309475","-6","1"
+"50801","Creston","IA","41.070905","-94.38448","-6","1"
+"50830","Afton","IA","41.029408","-94.21128","-6","1"
+"50831","Arispe","IA","40.931394","-94.219334","-6","1"
+"50833","Bedford","IA","40.671295","-94.71131","-6","1"
+"50835","Benton","IA","40.69705","-94.33067","-6","1"
+"50836","Blockton","IA","40.621398","-94.47619","-6","1"
+"50837","Bridgewater","IA","41.237084","-94.68361","-6","1"
+"50839","Carbon","IA","41.048733","-94.823088","-6","1"
+"50840","Clearfield","IA","40.796387","-94.47102","-6","1"
+"50841","Corning","IA","41.002701","-94.76142","-6","1"
+"50842","Cromwell","IA","41.039762","-94.461622","-6","1"
+"50843","Cumberland","IA","41.242612","-94.9015","-6","1"
+"50845","Diagonal","IA","40.814077","-94.33601","-6","1"
+"50846","Fontanelle","IA","41.307029","-94.55679","-6","1"
+"50847","Grant","IA","41.142185","-94.98414","-6","1"
+"50848","Gravity","IA","40.780854","-94.7643","-6","1"
+"50849","Greenfield","IA","41.308843","-94.42424","-6","1"
+"50851","Lenox","IA","40.909175","-94.52311","-6","1"
+"50853","Massena","IA","41.247145","-94.77195","-6","1"
+"50854","Mount Ayr","IA","40.700115","-94.22607","-6","1"
+"50857","Nodaway","IA","40.944133","-94.87537","-6","1"
+"50858","Orient","IA","41.20657","-94.41573","-6","1"
+"50859","Prescott","IA","41.053745","-94.59728","-6","1"
+"50860","Redding","IA","40.618619","-94.33102","-6","1"
+"50861","Shannon City","IA","40.905544","-94.27107","-6","1"
+"50862","Sharpsburg","IA","40.80692","-94.64762","-6","1"
+"50863","Tingley","IA","40.857182","-94.19272","-6","1"
+"50864","Villisca","IA","40.960481","-94.99017","-6","1"
+"50936","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50940","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50947","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50950","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50980","Des Moines","IA","41.672687","-93.572173","-6","1"
+"50981","Des Moines","IA","41.672687","-93.572173","-6","1"
+"51001","Akron","IA","42.819093","-96.48967","-6","1"
+"51002","Alta","IA","42.687676","-95.3188","-6","1"
+"51003","Alton","IA","42.983011","-95.99636","-6","1"
+"51004","Anthon","IA","42.378152","-95.90784","-6","1"
+"51005","Aurelia","IA","42.710831","-95.43137","-6","1"
+"51006","Battle Creek","IA","42.316288","-95.61045","-6","1"
+"51007","Bronson","IA","42.403236","-96.1881","-6","1"
+"51008","Brunsville","IA","42.809286","-96.2687","-6","1"
+"51009","Calumet","IA","42.9552","-95.570082","-6","1"
+"51010","Castana","IA","42.075717","-95.91108","-6","1"
+"51011","Chatsworth","IA","42.916772","-96.51603","-6","1"
+"51012","Cherokee","IA","42.754004","-95.54919","-6","1"
+"51014","Cleghorn","IA","42.759208","-95.71139","-6","1"
+"51015","Climbing Hill","IA","42.345024","-96.087523","-6","1"
+"51016","Correctionville","IA","42.471378","-95.80529","-6","1"
+"51017","Craig","IA","42.896225","-96.309509","-6","1"
+"51018","Cushing","IA","42.462159","-95.67654","-6","1"
+"51019","Danbury","IA","42.276668","-95.71998","-6","1"
+"51020","Galva","IA","42.511431","-95.4187","-6","1"
+"51022","Granville","IA","42.974759","-95.86981","-6","1"
+"51023","Hawarden","IA","43.005927","-96.4709","-6","1"
+"51024","Hinton","IA","42.609657","-96.23855","-6","1"
+"51025","Holstein","IA","42.496494","-95.55529","-6","1"
+"51026","Hornick","IA","42.250507","-96.08298","-6","1"
+"51027","Ireton","IA","42.971195","-96.32512","-6","1"
+"51028","Kingsley","IA","42.596358","-95.98619","-6","1"
+"51029","Larrabee","IA","42.876589","-95.54106","-6","1"
+"51030","Lawton","IA","42.497015","-96.18789","-6","1"
+"51031","Le Mars","IA","42.79728","-96.17167","-6","1"
+"51033","Linn Grove","IA","42.907563","-95.25334","-6","1"
+"51034","Mapleton","IA","42.165283","-95.79109","-6","1"
+"51035","Marcus","IA","42.793354","-95.7903","-6","1"
+"51036","Maurice","IA","42.969595","-96.18713","-6","1"
+"51037","Meriden","IA","42.821249","-95.62735","-6","1"
+"51038","Merrill","IA","42.714106","-96.30291","-6","1"
+"51039","Moville","IA","42.474905","-96.05563","-6","1"
+"51040","Onawa","IA","42.027176","-96.11875","-6","1"
+"51041","Orange City","IA","43.015685","-96.06156","-6","1"
+"51044","Oto","IA","42.29688","-95.91104","-6","1"
+"51045","Oyens","IA","42.820632","-96.05654","-6","1"
+"51046","Paullina","IA","42.976116","-95.65772","-6","1"
+"51047","Peterson","IA","42.934345","-95.34343","-6","1"
+"51048","Pierson","IA","42.571699","-95.85556","-6","1"
+"51049","Quimby","IA","42.626822","-95.61438","-6","1"
+"51050","Remsen","IA","42.786134","-95.9482","-6","1"
+"51051","Rodney","IA","42.20486","-95.95294","-6","1"
+"51052","Salix","IA","42.307882","-96.28232","-6","1"
+"51053","Schaller","IA","42.498879","-95.28976","-6","1"
+"51054","Sergeant Bluff","IA","42.38556","-96.34194","-6","1"
+"51055","Sloan","IA","42.221763","-96.24606","-6","1"
+"51056","Smithland","IA","42.23092","-95.94724","-6","1"
+"51057","Struble","IA","42.837641","-96.178616","-6","1"
+"51058","Sutherland","IA","42.996361","-95.4558","-6","1"
+"51059","Turin","IA","42.036864","-95.9662","-6","1"
+"51060","Ute","IA","42.0477","-95.70185","-6","1"
+"51061","Washta","IA","42.576775","-95.71945","-6","1"
+"51062","Westfield","IA","42.725792","-96.53712","-6","1"
+"51063","Whiting","IA","42.137272","-96.16648","-6","1"
+"51101","Sioux City","IA","42.493559","-96.39562","-6","1"
+"51102","Sioux City","IA","42.368406","-96.317951","-6","1"
+"51103","Sioux City","IA","42.505387","-96.4293","-6","1"
+"51104","Sioux City","IA","42.524145","-96.40292","-6","1"
+"51105","Sioux City","IA","42.505046","-96.38003","-6","1"
+"51106","Sioux City","IA","42.466292","-96.35291","-6","1"
+"51107","Bronson","IA","42.411155","-96.210839","-6","1"
+"51108","Sioux City","IA","42.554944","-96.36139","-6","1"
+"51109","Sioux City","IA","42.528033","-96.47647","-6","1"
+"51111","Sioux City","IA","42.406357","-96.37617","-6","1"
+"51201","Sheldon","IA","43.184994","-95.85888","-6","1"
+"51230","Alvord","IA","43.352016","-96.30802","-6","1"
+"51231","Archer","IA","43.091483","-95.73297","-6","1"
+"51232","Ashton","IA","43.306169","-95.7969","-6","1"
+"51234","Boyden","IA","43.19528","-96.01511","-6","1"
+"51235","Doon","IA","43.291936","-96.22202","-6","1"
+"51237","George","IA","43.332554","-96.00036","-6","1"
+"51238","Hospers","IA","43.072732","-95.89855","-6","1"
+"51239","Hull","IA","43.192342","-96.15012","-6","1"
+"51240","Inwood","IA","43.30957","-96.45816","-6","1"
+"51241","Larchwood","IA","43.451905","-96.44319","-6","1"
+"51242","Lester","IA","43.43813","-96.33334","-6","1"
+"51243","Little Rock","IA","43.443704","-95.88832","-6","1"
+"51244","Matlock","IA","43.242958","-95.93448","-6","1"
+"51245","Primghar","IA","43.086954","-95.61476","-6","1"
+"51246","Rock Rapids","IA","43.430275","-96.1663","-6","1"
+"51247","Rock Valley","IA","43.192619","-96.32412","-6","1"
+"51248","Sanborn","IA","43.189668","-95.65409","-6","1"
+"51249","Sibley","IA","43.406831","-95.73876","-6","1"
+"51250","Sioux Center","IA","43.075142","-96.19039","-6","1"
+"51301","Spencer","IA","43.150381","-95.14466","-6","1"
+"51330","Allendorf","IA","43.415305","-95.643435","-6","1"
+"51331","Arnolds Park","IA","43.364496","-95.12861","-6","1"
+"51333","Dickens","IA","43.133063","-95.00965","-6","1"
+"51334","Estherville","IA","43.401328","-94.81524","-6","1"
+"51338","Everly","IA","43.193363","-95.31854","-6","1"
+"51340","Fostoria","IA","43.082426","-95.151095","-6","1"
+"51341","Gillett Grove","IA","43.014514","-95.03657","-6","1"
+"51342","Graettinger","IA","43.239934","-94.74138","-6","1"
+"51343","Greenville","IA","43.003251","-95.12714","-6","1"
+"51344","Gruver","IA","43.393113","-94.70471","-6","1"
+"51345","Harris","IA","43.407616","-95.43752","-6","1"
+"51346","Hartley","IA","43.183038","-95.46787","-6","1"
+"51347","Lake Park","IA","43.437775","-95.31637","-6","1"
+"51349","May City","IA","43.320149","-95.47513","-6","1"
+"51350","Melvin","IA","43.30288","-95.59597","-6","1"
+"51351","Milford","IA","43.33158","-95.16337","-6","1"
+"51354","Ocheyedan","IA","43.413538","-95.53675","-6","1"
+"51355","Okoboji","IA","43.38762","-95.13802","-6","1"
+"51357","Royal","IA","43.057948","-95.27482","-6","1"
+"51358","Ruthven","IA","43.133294","-94.90006","-6","1"
+"51360","Spirit Lake","IA","43.428983","-95.10892","-6","1"
+"51363","Superior","IA","43.432156","-94.94569","-6","1"
+"51364","Terril","IA","43.303488","-94.96903","-6","1"
+"51365","Wallingford","IA","43.309573","-94.74784","-6","1"
+"51366","Webb","IA","42.951621","-95.01145","-6","1"
+"51401","Carroll","IA","42.066399","-94.86786","-6","1"
+"51430","Arcadia","IA","42.09809","-95.02441","-6","1"
+"51431","Arthur","IA","42.345965","-95.35615","-6","1"
+"51432","Aspinwall","IA","41.911924","-95.135602","-6","1"
+"51433","Auburn","IA","42.279474","-94.88642","-6","1"
+"51436","Breda","IA","42.186982","-95.00487","-6","1"
+"51439","Charter Oak","IA","42.08255","-95.57938","-6","1"
+"51440","Dedham","IA","41.913691","-94.81453","-6","1"
+"51441","Deloit","IA","42.113042","-95.31482","-6","1"
+"51442","Denison","IA","42.019336","-95.35379","-6","1"
+"51443","Glidden","IA","42.096445","-94.71141","-6","1"
+"51444","Halbur","IA","42.005206","-94.97547","-6","1"
+"51445","Ida Grove","IA","42.332677","-95.46823","-6","1"
+"51446","Irwin","IA","41.785808","-95.20173","-6","1"
+"51447","Kirkman","IA","41.7196","-95.19538","-6","1"
+"51448","Kiron","IA","42.204515","-95.30928","-6","1"
+"51449","Lake City","IA","42.266805","-94.73571","-6","1"
+"51450","Lake View","IA","42.302091","-95.03061","-6","1"
+"51451","Lanesboro","IA","42.184035","-94.69246","-6","1"
+"51452","Lidderdale","IA","42.126994","-94.78449","-6","1"
+"51453","Lohrville","IA","42.27586","-94.54041","-6","1"
+"51454","Manilla","IA","41.885538","-95.22158","-6","1"
+"51455","Manning","IA","41.913633","-95.06939","-6","1"
+"51458","Odebolt","IA","42.315531","-95.23551","-6","1"
+"51459","Ralston","IA","42.040772","-94.63292","-6","1"
+"51460","Ricketts","IA","42.130428","-95.574593","-6","1"
+"51461","Schleswig","IA","42.172338","-95.44924","-6","1"
+"51462","Scranton","IA","42.022139","-94.56409","-6","1"
+"51463","Templeton","IA","41.910011","-94.92775","-6","1"
+"51465","Vail","IA","42.072884","-95.20261","-6","1"
+"51466","Wall Lake","IA","42.256867","-95.09307","-6","1"
+"51467","Westside","IA","42.072073","-95.10711","-6","1"
+"51496","Templeton","IA","41.916027","-94.944563","-6","1"
+"51501","Council Bluffs","IA","41.251631","-95.87447","-6","1"
+"51502","Council Bluffs","IA","41.269884","-95.79752","-6","1"
+"51503","Council Bluffs","IA","41.2544","-95.79062","-6","1"
+"51510","Carter Lake","IA","41.292647","-95.91398","-6","1"
+"51515","Griswold","IA","41.233503","-95.135861","-6","1"
+"51520","Arion","IA","41.952624","-95.45818","-6","1"
+"51521","Avoca","IA","41.48079","-95.33881","-6","1"
+"51523","Blencoe","IA","41.9134","-96.085","-6","1"
+"51525","Carson","IA","41.231387","-95.4044","-6","1"
+"51526","Crescent","IA","41.362096","-95.87321","-6","1"
+"51527","Defiance","IA","41.828495","-95.34363","-6","1"
+"51528","Dow City","IA","41.927255","-95.49821","-6","1"
+"51529","Dunlap","IA","41.856963","-95.61754","-6","1"
+"51530","Earling","IA","41.77364","-95.42761","-6","1"
+"51531","Elk Horn","IA","41.596716","-95.0716","-6","1"
+"51532","Elliott","IA","41.140956","-95.13004","-6","1"
+"51533","Emerson","IA","41.029684","-95.38295","-6","1"
+"51534","Glenwood","IA","41.039679","-95.73092","-6","1"
+"51535","Griswold","IA","41.232047","-95.13871","-6","1"
+"51536","Hancock","IA","41.388872","-95.36782","-6","1"
+"51537","Harlan","IA","41.638566","-95.29692","-6","1"
+"51540","Hastings","IA","41.020978","-95.49852","-6","1"
+"51541","Henderson","IA","41.137694","-95.39897","-6","1"
+"51542","Honey Creek","IA","41.427994","-95.84004","-6","1"
+"51543","Kimballton","IA","41.6485","-95.08334","-6","1"
+"51544","Lewis","IA","41.313817","-95.10424","-6","1"
+"51545","Little Sioux","IA","41.812797","-96.03218","-6","1"
+"51546","Logan","IA","41.64252","-95.78134","-6","1"
+"51547","Kirkman","IA","41.77","-95.644264","-6","1"
+"51548","McClelland","IA","41.307465","-95.62675","-6","1"
+"51549","Macedonia","IA","41.182061","-95.44357","-6","1"
+"51550","Magnolia","IA","41.695375","-95.87353","-6","1"
+"51551","Malvern","IA","40.998667","-95.58941","-6","1"
+"51552","Marne","IA","41.470605","-95.11291","-6","1"
+"51553","Minden","IA","41.425925","-95.5461","-6","1"
+"51554","Mineola","IA","41.142148","-95.69205","-6","1"
+"51555","Missouri Valley","IA","41.557887","-95.90651","-6","1"
+"51556","Modale","IA","41.64243","-96.02872","-6","1"
+"51557","Mondamin","IA","41.739005","-95.99657","-6","1"
+"51558","Moorhead","IA","41.911376","-95.86092","-6","1"
+"51559","Neola","IA","41.455142","-95.64792","-6","1"
+"51560","Oakland","IA","41.320647","-95.39748","-6","1"
+"51561","Pacific Junction","IA","41.022849","-95.80303","-6","1"
+"51562","Panama","IA","41.725547","-95.49415","-6","1"
+"51563","Persia","IA","41.568945","-95.58503","-6","1"
+"51564","Pisgah","IA","41.816224","-95.90556","-6","1"
+"51565","Portsmouth","IA","41.650114","-95.52275","-6","1"
+"51566","Red Oak","IA","41.006437","-95.22603","-6","1"
+"51570","Shelby","IA","41.52279","-95.46501","-6","1"
+"51571","Silver City","IA","41.123653","-95.62225","-6","1"
+"51572","Soldier","IA","41.987483","-95.78317","-6","1"
+"51573","Stanton","IA","40.979256","-95.09722","-6","1"
+"51574","Tennant","IA","41.595686","-95.44193","-6","1"
+"51575","Treynor","IA","41.231146","-95.61155","-6","1"
+"51576","Underwood","IA","41.388244","-95.68777","-6","1"
+"51577","Walnut","IA","41.470851","-95.20256","-6","1"
+"51578","Westphalia","IA","41.719352","-95.3958","-6","1"
+"51579","Woodbine","IA","41.743335","-95.71117","-6","1"
+"51591","Red Oak","IA","41.030256","-95.156205","-6","1"
+"51593","Harlan","IA","41.332943","-95.587197","-6","1"
+"51601","Shenandoah","IA","40.750107","-95.36514","-6","1"
+"51602","Shenandoah","IA","40.738309","-95.149305","-6","1"
+"51603","Shenandoah","IA","40.738309","-95.149305","-6","1"
+"51630","Blanchard","IA","40.588924","-95.21254","-6","1"
+"51631","Braddyville","IA","40.615698","-95.00942","-6","1"
+"51632","Clarinda","IA","40.738639","-95.03595","-6","1"
+"51636","Coin","IA","40.671163","-95.21698","-6","1"
+"51637","College Springs","IA","40.616696","-95.11568","-6","1"
+"51638","Essex","IA","40.822954","-95.27007","-6","1"
+"51639","Farragut","IA","40.707376","-95.47445","-6","1"
+"51640","Hamburg","IA","40.622159","-95.66736","-6","1"
+"51645","Imogene","IA","40.884496","-95.42637","-6","1"
+"51646","New Market","IA","40.732886","-94.88772","-6","1"
+"51647","Northboro","IA","40.599361","-95.36419","-6","1"
+"51648","Percival","IA","40.741715","-95.7976","-6","1"
+"51649","Randolph","IA","40.865993","-95.54687","-6","1"
+"51650","Riverton","IA","40.679816","-95.56494","-6","1"
+"51651","Shambaugh","IA","40.65747","-95.024969","-6","1"
+"51652","Sidney","IA","40.76261","-95.60679","-6","1"
+"51653","Tabor","IA","40.886487","-95.67001","-6","1"
+"51654","Thurman","IA","40.836473","-95.76463","-6","1"
+"51656","Yorktown","IA","40.737446","-95.156217","-6","1"
+"52001","Dubuque","IA","42.515252","-90.6794","-6","1"
+"52002","Dubuque","IA","42.50963","-90.75329","-6","1"
+"52003","Dubuque","IA","42.460604","-90.68576","-6","1"
+"52004","Dubuque","IA","42.484861","-90.804116","-6","1"
+"52030","Andrew","IA","42.154059","-90.59176","-6","1"
+"52031","Bellevue","IA","42.250445","-90.47115","-6","1"
+"52032","Bernard","IA","42.273028","-90.81319","-6","1"
+"52033","Cascade","IA","42.29025","-90.99759","-6","1"
+"52035","Colesburg","IA","42.662381","-91.18541","-6","1"
+"52036","Delaware","IA","42.473959","-91.34228","-6","1"
+"52037","Delmar","IA","41.967074","-90.63216","-6","1"
+"52038","Dundee","IA","42.585197","-91.55268","-6","1"
+"52039","Durango","IA","42.558403","-90.86042","-6","1"
+"52040","Dyersville","IA","42.490907","-91.12842","-6","1"
+"52041","Earlville","IA","42.491416","-91.26333","-6","1"
+"52042","Edgewood","IA","42.678463","-91.3618","-6","1"
+"52043","Elkader","IA","42.855022","-91.40882","-6","1"
+"52044","Elkport","IA","42.748558","-91.32445","-6","1"
+"52045","Epworth","IA","42.451496","-90.92851","-6","1"
+"52046","Farley","IA","42.442226","-91.00932","-6","1"
+"52047","Farmersburg","IA","42.959691","-91.35552","-6","1"
+"52048","Garber","IA","42.738079","-91.25078","-6","1"
+"52049","Garnavillo","IA","42.886672","-91.19866","-6","1"
+"52050","Greeley","IA","42.603334","-91.34528","-6","1"
+"52052","Guttenberg","IA","42.765031","-91.11376","-6","1"
+"52053","Holy Cross","IA","42.631604","-90.96492","-6","1"
+"52054","La Motte","IA","42.28911","-90.6341","-6","1"
+"52055","Littleport","IA","42.862739","-91.252459","-6","1"
+"52056","Luxemburg","IA","42.60483","-91.07654","-6","1"
+"52057","Manchester","IA","42.484297","-91.45231","-6","1"
+"52060","Maquoketa","IA","42.087769","-90.67352","-6","1"
+"52064","Miles","IA","42.092925","-90.3107","-6","1"
+"52065","New Vienna","IA","42.559621","-91.10572","-6","1"
+"52066","North Buena Vista","IA","42.682337","-90.95239","-6","1"
+"52068","Peosta","IA","42.431983","-90.816","-6","1"
+"52069","Preston","IA","42.051619","-90.40762","-6","1"
+"52070","Sabula","IA","42.071239","-90.20261","-6","1"
+"52071","Saint Donatus","IA","42.36059","-90.53879","-6","1"
+"52072","Saint Olaf","IA","42.927724","-91.38723","-6","1"
+"52073","Sherrill","IA","42.640962","-90.82532","-6","1"
+"52074","Spragueville","IA","42.124141","-90.4557","-6","1"
+"52075","Springbrook","IA","42.161997","-90.47987","-6","1"
+"52076","Strawberry Point","IA","42.697689","-91.51505","-6","1"
+"52077","Volga","IA","42.815385","-91.55738","-6","1"
+"52078","Worthington","IA","42.398112","-91.12294","-6","1"
+"52079","Zwingle","IA","42.286954","-90.71627","-6","1"
+"52099","Dubuque","IA","42.484861","-90.804116","-6","1"
+"52101","Decorah","IA","43.345879","-91.77187","-6","1"
+"52131","Burr Oak","IA","43.47865","-91.765621","-6","1"
+"52132","Calmar","IA","43.194235","-91.89585","-6","1"
+"52133","Castalia","IA","43.119538","-91.66528","-6","1"
+"52134","Chester","IA","43.468995","-92.40092","-6","1"
+"52135","Clermont","IA","43.00106","-91.66064","-6","1"
+"52136","Cresco","IA","43.382021","-92.10263","-6","1"
+"52140","Dorchester","IA","43.442183","-91.53338","-6","1"
+"52141","Elgin","IA","42.935873","-91.62785","-6","1"
+"52142","Fayette","IA","42.834286","-91.79794","-6","1"
+"52144","Fort Atkinson","IA","43.141414","-91.94764","-6","1"
+"52146","Harpers Ferry","IA","43.195154","-91.16405","-6","1"
+"52147","Hawkeye","IA","42.960176","-91.95858","-6","1"
+"52149","Highlandville","IA","43.463765","-91.689862","-6","1"
+"52151","Lansing","IA","43.358764","-91.25436","-6","1"
+"52154","Lawler","IA","43.1101","-92.15576","-6","1"
+"52155","Lime Springs","IA","43.419137","-92.28859","-6","1"
+"52156","Luana","IA","43.051922","-91.45842","-6","1"
+"52157","McGregor","IA","43.019203","-91.20377","-6","1"
+"52158","Marquette","IA","43.042838","-91.18417","-6","1"
+"52159","Monona","IA","43.061204","-91.37925","-6","1"
+"52160","New Albin","IA","43.48058","-91.30746","-6","1"
+"52161","Ossian","IA","43.130438","-91.74913","-6","1"
+"52162","Postville","IA","43.104035","-91.5526","-6","1"
+"52163","Protivin","IA","43.21661","-92.09219","-6","1"
+"52164","Randalia","IA","42.839782","-91.88949","-6","1"
+"52165","Ridgeway","IA","43.308213","-91.97807","-6","1"
+"52166","Saint Lucas","IA","43.069086","-91.92847","-6","1"
+"52168","Spillville","IA","43.203977","-91.95204","-6","1"
+"52169","Wadena","IA","42.845037","-91.65943","-6","1"
+"52170","Waterville","IA","43.212565","-91.29941","-6","1"
+"52171","Waucoma","IA","43.068101","-92.05255","-6","1"
+"52172","Waukon","IA","43.265791","-91.47755","-6","1"
+"52175","West Union","IA","42.983744","-91.81803","-6","1"
+"52201","Ainsworth","IA","41.320371","-91.54755","-6","1"
+"52202","Alburnett","IA","42.158477","-91.63859","-6","1"
+"52203","Amana","IA","41.808301","-91.87512","-6","1"
+"52204","Amana","IA","41.686351","-92.063603","-6","1"
+"52205","Anamosa","IA","42.106972","-91.27531","-6","1"
+"52206","Atkins","IA","41.993799","-91.86755","-6","1"
+"52207","Baldwin","IA","42.088117","-90.83793","-6","1"
+"52208","Belle Plaine","IA","41.887989","-92.2727","-6","1"
+"52209","Blairstown","IA","41.911228","-92.08549","-6","1"
+"52210","Brandon","IA","42.32437","-92.0019","-6","1"
+"52211","Brooklyn","IA","41.753372","-92.45012","-6","1"
+"52212","Center Junction","IA","42.115943","-91.09397","-6","1"
+"52213","Center Point","IA","42.193727","-91.7792","-6","1"
+"52214","Central City","IA","42.198823","-91.5075","-6","1"
+"52215","Chelsea","IA","41.914489","-92.39359","-6","1"
+"52216","Clarence","IA","41.888182","-91.04567","-6","1"
+"52217","Clutier","IA","42.080758","-92.40188","-6","1"
+"52218","Coggon","IA","42.291075","-91.54024","-6","1"
+"52219","Prairieburg","IA","42.235999","-91.42313","-6","1"
+"52220","Conroy","IA","41.728994","-91.99748","-6","1"
+"52221","Guernsey","IA","41.640716","-92.33182","-6","1"
+"52222","Deep River","IA","41.575609","-92.34104","-6","1"
+"52223","Delhi","IA","42.424914","-91.33937","-6","1"
+"52224","Dysart","IA","42.162873","-92.30485","-6","1"
+"52225","Elberon","IA","42.011889","-92.32398","-6","1"
+"52226","Elwood","IA","41.992936","-90.7392","-6","1"
+"52227","Ely","IA","41.89239","-91.5666","-6","1"
+"52228","Fairfax","IA","41.912296","-91.78792","-6","1"
+"52229","Garrison","IA","42.145175","-92.1509","-6","1"
+"52231","Harper","IA","41.358606","-92.06066","-6","1"
+"52232","Hartwick","IA","41.809975","-92.32815","-6","1"
+"52233","Hiawatha","IA","42.044409","-91.68102","-6","1"
+"52235","Hills","IA","41.55464","-91.53532","-6","1"
+"52236","Homestead","IA","41.732868","-91.87587","-6","1"
+"52237","Hopkinton","IA","42.346132","-91.24208","-6","1"
+"52239","Tama","IA","41.961726","-92.570891","-6","1"
+"52240","Iowa City","IA","41.649867","-91.52019","-6","1"
+"52241","Coralville","IA","41.688215","-91.58676","-6","1"
+"52242","Iowa City","IA","41.662116","-91.54143","-6","1"
+"52243","Iowa City","IA","41.642657","-91.599974","-6","1"
+"52244","Iowa City","IA","41.572682","-91.661901","-6","1"
+"52245","Iowa City","IA","41.662083","-91.50834","-6","1"
+"52246","Iowa City","IA","41.650916","-91.56058","-6","1"
+"52247","Kalona","IA","41.503882","-91.70969","-6","1"
+"52248","Keota","IA","41.341027","-91.94174","-6","1"
+"52249","Keystone","IA","42.005883","-92.19669","-6","1"
+"52251","Ladora","IA","41.741215","-92.19199","-6","1"
+"52252","Langworthy","IA","42.191979","-91.225836","-6","1"
+"52253","Lisbon","IA","41.909156","-91.36209","-6","1"
+"52254","Lost Nation","IA","41.950398","-90.8085","-6","1"
+"52255","Lowden","IA","41.86521","-90.94316","-6","1"
+"52257","Luzerne","IA","41.913959","-92.17163","-6","1"
+"52301","Marengo","IA","41.790216","-92.07684","-6","1"
+"52302","Marion","IA","42.042648","-91.58262","-6","1"
+"52305","Martelle","IA","42.018441","-91.35217","-6","1"
+"52306","Mechanicsville","IA","41.900204","-91.25428","-6","1"
+"52307","Middle Amana","IA","41.790988","-91.91522","-6","1"
+"52308","Millersburg","IA","41.572665","-92.15933","-6","1"
+"52309","Monmouth","IA","42.109395","-90.8869","-6","1"
+"52310","Monticello","IA","42.221176","-91.19335","-6","1"
+"52312","Morley","IA","42.006556","-91.24671","-6","1"
+"52313","Mount Auburn","IA","42.259239","-92.10136","-6","1"
+"52314","Mount Vernon","IA","41.929178","-91.43684","-6","1"
+"52315","Newhall","IA","41.995899","-91.96896","-6","1"
+"52316","North English","IA","41.527681","-92.09326","-6","1"
+"52317","North Liberty","IA","41.755771","-91.61238","-6","1"
+"52318","Norway","IA","41.900443","-91.90704","-6","1"
+"52319","Oakdale","IA","41.642657","-91.599974","-6","1"
+"52320","Olin","IA","42.003337","-91.14736","-6","1"
+"52321","Onslow","IA","42.134893","-91.00372","-6","1"
+"52322","Oxford","IA","41.6896","-91.76183","-6","1"
+"52323","Oxford Junction","IA","41.983923","-90.95702","-6","1"
+"52324","Palo","IA","42.065474","-91.8005","-6","1"
+"52325","Parnell","IA","41.597014","-91.91805","-6","1"
+"52326","Quasqueton","IA","42.394662","-91.75917","-6","1"
+"52327","Riverside","IA","41.483058","-91.56899","-6","1"
+"52328","Robins","IA","42.073765","-91.66287","-6","1"
+"52329","Rowley","IA","42.349458","-91.84325","-6","1"
+"52330","Ryan","IA","42.338694","-91.49604","-6","1"
+"52332","Shellsburg","IA","42.093056","-91.88379","-6","1"
+"52333","Solon","IA","41.809993","-91.50849","-6","1"
+"52334","South Amana","IA","41.736497","-91.94243","-6","1"
+"52335","South English","IA","41.449599","-92.05579","-6","1"
+"52336","Springville","IA","42.0626","-91.44072","-6","1"
+"52337","Stanwood","IA","41.888096","-91.14794","-6","1"
+"52338","Swisher","IA","41.840184","-91.68552","-6","1"
+"52339","Tama","IA","41.95277","-92.58225","-6","1"
+"52340","Tiffin","IA","41.710231","-91.66955","-6","1"
+"52341","Toddville","IA","42.112232","-91.72605","-6","1"
+"52342","Toledo","IA","42.02524","-92.57177","-6","1"
+"52344","Troy Mills","IA","42.079415","-91.599215","-6","1"
+"52345","Urbana","IA","42.222388","-91.87908","-6","1"
+"52346","Van Horne","IA","42.010556","-92.08308","-6","1"
+"52347","Victor","IA","41.715992","-92.29288","-6","1"
+"52348","Vining","IA","41.990295","-92.38059","-6","1"
+"52349","Vinton","IA","42.172481","-92.01595","-6","1"
+"52350","Viola","IA","42.091217","-91.385047","-6","1"
+"52351","Walford","IA","41.876767","-91.83532","-6","1"
+"52352","Walker","IA","42.290421","-91.77461","-6","1"
+"52353","Washington","IA","41.300042","-91.69743","-6","1"
+"52354","Watkins","IA","41.90889","-91.9818","-6","1"
+"52355","Webster","IA","41.459739","-92.17863","-6","1"
+"52356","Wellman","IA","41.478896","-91.85354","-6","1"
+"52358","West Branch","IA","41.680696","-91.33428","-6","1"
+"52359","West Chester","IA","41.356493","-91.81527","-6","1"
+"52361","Williamsburg","IA","41.651571","-92.01394","-6","1"
+"52362","Wyoming","IA","42.054649","-91.00591","-6","1"
+"52401","Cedar Rapids","IA","41.97545","-91.65912","-6","1"
+"52402","Cedar Rapids","IA","42.021016","-91.65231","-6","1"
+"52403","Cedar Rapids","IA","41.982201","-91.61409","-6","1"
+"52404","Cedar Rapids","IA","41.947335","-91.68819","-6","1"
+"52405","Cedar Rapids","IA","41.980283","-91.70835","-6","1"
+"52406","Cedar Rapids","IA","42.287191","-91.777472","-6","1"
+"52407","Cedar Rapids","IA","42.079415","-91.599215","-6","1"
+"52408","Cedar Rapids","IA","42.079415","-91.599215","-6","1"
+"52409","Cedar Rapids","IA","42.079415","-91.599215","-6","1"
+"52410","Cedar Rapids","IA","42.079415","-91.599215","-6","1"
+"52411","Cedar Rapids","IA","42.049941","-91.72511","-6","1"
+"52497","Cedar Rapids","IA","42.079415","-91.599215","-6","1"
+"52498","Cedar Rapids","IA","42.079415","-91.599215","-6","1"
+"52499","Cedar Rapids","IA","42.079415","-91.599215","-6","1"
+"52501","Ottumwa","IA","41.023872","-92.41741","-6","1"
+"52530","Agency","IA","40.995466","-92.30407","-6","1"
+"52531","Albia","IA","41.026796","-92.7984","-6","1"
+"52533","Batavia","IA","41.0255","-92.15955","-6","1"
+"52534","Beacon","IA","41.273646","-92.68082","-6","1"
+"52535","Birmingham","IA","40.86112","-91.97867","-6","1"
+"52536","Blakesburg","IA","40.947787","-92.62879","-6","1"
+"52537","Bloomfield","IA","40.73045","-92.44441","-6","1"
+"52538","West Grove","IA","40.745286","-92.408679","-6","1"
+"52540","Brighton","IA","41.153462","-91.82082","-6","1"
+"52542","Cantril","IA","40.649744","-92.0662","-6","1"
+"52543","Cedar","IA","41.218744","-92.51977","-6","1"
+"52544","Centerville","IA","40.730159","-92.88994","-6","1"
+"52548","Chillicothe","IA","41.085573","-92.52863","-6","1"
+"52549","Cincinnati","IA","40.616347","-92.92738","-6","1"
+"52550","Delta","IA","41.330967","-92.34521","-6","1"
+"52551","Douds","IA","40.798007","-92.13296","-6","1"
+"52552","Drakesville","IA","40.837112","-92.56458","-6","1"
+"52553","Eddyville","IA","41.151537","-92.64227","-6","1"
+"52554","Eldon","IA","40.919465","-92.22521","-6","1"
+"52555","Exline","IA","40.648624","-92.83592","-6","1"
+"52556","Fairfield","IA","41.017736","-91.95","-6","1"
+"52557","Fairfield","IA","41.016566","-91.96821","-6","1"
+"52560","Floris","IA","40.852256","-92.24785","-6","1"
+"52561","Fremont","IA","41.214824","-92.43864","-6","1"
+"52562","Hayesville","IA","41.26457","-92.24888","-6","1"
+"52563","Hedrick","IA","41.17196","-92.28491","-6","1"
+"52565","Keosauqua","IA","40.747997","-91.96126","-6","1"
+"52566","Kirkville","IA","41.14579","-92.49948","-6","1"
+"52567","Libertyville","IA","40.946765","-92.07173","-6","1"
+"52568","Martinsburg","IA","41.178396","-92.25004","-6","1"
+"52569","Melrose","IA","40.948022","-93.02537","-6","1"
+"52570","Milton","IA","40.679958","-92.162","-6","1"
+"52571","Moravia","IA","40.86655","-92.84446","-6","1"
+"52572","Moulton","IA","40.679322","-92.68369","-6","1"
+"52573","Mount Sterling","IA","40.620468","-91.93352","-6","1"
+"52574","Mystic","IA","40.797559","-92.96436","-6","1"
+"52576","Ollie","IA","41.201922","-92.1148","-6","1"
+"52577","Oskaloosa","IA","41.281669","-92.65534","-6","1"
+"52580","Packwood","IA","41.130669","-92.09695","-6","1"
+"52581","Plano","IA","40.792046","-93.04963","-6","1"
+"52583","Promise City","IA","40.801913","-93.14736","-6","1"
+"52584","Pulaski","IA","40.66442","-92.24541","-6","1"
+"52585","Richland","IA","41.194129","-91.98027","-6","1"
+"52586","Rose Hill","IA","41.339202","-92.46875","-6","1"
+"52588","Selma","IA","40.873769","-92.13113","-6","1"
+"52590","Seymour","IA","40.673728","-93.1281","-6","1"
+"52591","Sigourney","IA","41.328837","-92.19641","-6","1"
+"52593","Udell","IA","40.777917","-92.73565","-6","1"
+"52594","Unionville","IA","40.833045","-92.6867","-6","1"
+"52595","University Park","IA","41.286619","-92.61893","-6","1"
+"52601","Burlington","IA","40.814207","-91.11911","-6","1"
+"52619","Argyle","IA","40.542869","-91.57544","-6","1"
+"52620","Bonaparte","IA","40.697875","-91.8051","-6","1"
+"52621","Crawfordsville","IA","41.209047","-91.53273","-6","1"
+"52623","Danville","IA","40.865859","-91.33459","-6","1"
+"52624","Denmark","IA","40.741062","-91.33664","-6","1"
+"52625","Donnellson","IA","40.675175","-91.57393","-6","1"
+"52626","Farmington","IA","40.655336","-91.72385","-6","1"
+"52627","Fort Madison","IA","40.637694","-91.33866","-6","1"
+"52630","Hillsboro","IA","40.823716","-91.74754","-6","1"
+"52631","Houghton","IA","40.784287","-91.60716","-6","1"
+"52632","Keokuk","IA","40.409641","-91.40001","-6","1"
+"52635","Lockridge","IA","40.991682","-91.75175","-6","1"
+"52637","Mediapolis","IA","41.008896","-91.13674","-6","1"
+"52638","Middletown","IA","40.828014","-91.25499","-6","1"
+"52639","Montrose","IA","40.547399","-91.43864","-6","1"
+"52640","Morning Sun","IA","41.09739","-91.27859","-6","1"
+"52641","Mount Pleasant","IA","40.974026","-91.57195","-6","1"
+"52642","Rome","IA","40.977395","-91.692312","-6","1"
+"52644","Mount Union","IA","41.038005","-91.39992","-6","1"
+"52645","New London","IA","40.920995","-91.39965","-6","1"
+"52646","Oakville","IA","41.069373","-91.01429","-6","1"
+"52647","Olds","IA","41.133346","-91.54559","-6","1"
+"52648","Pilot Grove","IA","40.594704","-91.415648","-6","1"
+"52649","Salem","IA","40.848485","-91.61691","-6","1"
+"52650","Sperry","IA","40.952014","-91.16545","-6","1"
+"52651","Stockport","IA","40.87657","-91.81242","-6","1"
+"52652","Swedesburg","IA","41.103879","-91.54664","-6","1"
+"52653","Wapello","IA","41.171534","-91.17035","-6","1"
+"52654","Wayland","IA","41.141336","-91.66882","-6","1"
+"52655","West Burlington","IA","40.830534","-91.17849","-6","1"
+"52656","West Point","IA","40.719775","-91.47271","-6","1"
+"52657","Saint Paul","IA","40.758742","-91.478305","-6","1"
+"52658","Wever","IA","40.707554","-91.23415","-6","1"
+"52659","Winfield","IA","41.126832","-91.44152","-6","1"
+"52660","Yarmouth","IA","40.980185","-91.29172","-6","1"
+"52701","Andover","IA","41.978834","-90.25171","-6","1"
+"52706","Blue Grass","IA","41.509085","-90.754327","-6","1"
+"52720","Atalissa","IA","41.578393","-91.15931","-6","1"
+"52721","Bennett","IA","41.749701","-90.96586","-6","1"
+"52722","Bettendorf","IA","41.551883","-90.48975","-6","1"
+"52726","Blue Grass","IA","41.498603","-90.77596","-6","1"
+"52727","Bryant","IA","41.96264","-90.32975","-6","1"
+"52728","Buffalo","IA","41.456515","-90.73252","-6","1"
+"52729","Calamus","IA","41.823151","-90.75572","-6","1"
+"52730","Camanche","IA","41.780515","-90.28869","-6","1"
+"52731","Charlotte","IA","41.963196","-90.47705","-6","1"
+"52732","Clinton","IA","41.861633","-90.21539","-6","1"
+"52733","Clinton","IA","41.880619","-90.519519","-6","1"
+"52736","Clinton","IA","41.880619","-90.519519","-6","1"
+"52737","Columbus City","IA","41.259329","-91.37449","-6","1"
+"52738","Columbus Junction","IA","41.265956","-91.3677","-6","1"
+"52739","Conesville","IA","41.378166","-91.36693","-6","1"
+"52742","De Witt","IA","41.825848","-90.52951","-6","1"
+"52745","Dixon","IA","41.73542","-90.77717","-6","1"
+"52746","Donahue","IA","41.712643","-90.68748","-6","1"
+"52747","Durant","IA","41.603249","-90.91015","-6","1"
+"52748","Eldridge","IA","41.659064","-90.56866","-6","1"
+"52749","Fruitland","IA","41.355531","-91.12994","-6","1"
+"52750","Goose Lake","IA","41.926933","-90.41181","-6","1"
+"52751","Grand Mound","IA","41.836317","-90.67008","-6","1"
+"52752","Grandview","IA","41.277239","-91.18897","-6","1"
+"52753","Le Claire","IA","41.609382","-90.35986","-6","1"
+"52754","Letts","IA","41.349983","-91.24664","-6","1"
+"52755","Lone Tree","IA","41.476534","-91.43307","-6","1"
+"52756","Long Grove","IA","41.732418","-90.53286","-6","1"
+"52757","Low Moor","IA","41.801711","-90.35223","-6","1"
+"52758","McCausland","IA","41.744689","-90.44392","-6","1"
+"52759","Montpelier","IA","41.462494","-90.808767","-6","1"
+"52760","Moscow","IA","41.57371","-91.08369","-6","1"
+"52761","Muscatine","IL","41.413372","-91.00612","-6","1"
+"52765","New Liberty","IA","41.720483","-90.86944","-6","1"
+"52766","Nichols","IA","41.473955","-91.31035","-6","1"
+"52767","Pleasant Valley","IA","41.56823","-90.4191","-6","1"
+"52768","Princeton","IA","41.677679","-90.37338","-6","1"
+"52769","Stockton","IA","41.594283","-90.8469","-6","1"
+"52771","Teeds Grove","IA","41.999113","-90.218704","-6","1"
+"52772","Tipton","IA","41.750868","-91.13361","-6","1"
+"52773","Walcott","IA","41.617234","-90.75849","-6","1"
+"52774","Welton","IA","41.907575","-90.59624","-6","1"
+"52776","West Liberty","IA","41.573818","-91.26586","-6","1"
+"52777","Wheatland","IA","41.843587","-90.86097","-6","1"
+"52778","Wilton","IA","41.604559","-91.00644","-6","1"
+"52801","Davenport","IA","41.522832","-90.57503","-6","1"
+"52802","Davenport","IA","41.513182","-90.61672","-6","1"
+"52803","Davenport","IA","41.538582","-90.56223","-6","1"
+"52804","Davenport","IA","41.546931","-90.61964","-6","1"
+"52805","Davenport","IA","41.613034","-90.606284","-6","1"
+"52806","Davenport","IA","41.574581","-90.60303","-6","1"
+"52807","Davenport","IA","41.565433","-90.53924","-6","1"
+"52808","Davenport","IA","41.613034","-90.606284","-6","1"
+"52809","Davenport","IA","41.613034","-90.606284","-6","1"
+"52820","Tennyson","WI","42.689339","-90.682257","-6","1"
+"53001","Adell","WI","43.61014","-88.03047","-6","1"
+"53002","Allenton","WI","43.461969","-88.36432","-6","1"
+"53003","Ashippun","WI","43.211067","-88.51649","-6","1"
+"53004","Belgium","WI","43.498943","-87.86211","-6","1"
+"53005","Brookfield","WI","43.060872","-88.09478","-6","1"
+"53006","Brownsville","WI","43.623996","-88.51089","-6","1"
+"53007","Butler","WI","43.10836","-88.06893","-6","1"
+"53008","Brookfield","WI","43.018696","-88.302997","-6","1"
+"53009","Byron","WI","43.76983","-88.494357","-6","1"
+"53010","Campbellsport","WI","43.602787","-88.2653","-6","1"
+"53011","Cascade","WI","43.657079","-88.08008","-6","1"
+"53012","Cedarburg","WI","43.305412","-87.99794","-6","1"
+"53013","Cedar Grove","WI","43.575272","-87.84597","-6","1"
+"53014","Chilton","WI","44.033215","-88.17626","-6","1"
+"53015","Cleveland","WI","43.914168","-87.76689","-6","1"
+"53016","Clyman","WI","43.313002","-88.71989","-6","1"
+"53017","Colgate","WI","43.199526","-88.26177","-6","1"
+"53018","Delafield","WI","43.05348","-88.39844","-6","1"
+"53019","Eden","WI","43.699527","-88.32233","-6","1"
+"53020","Elkhart Lake","WI","43.85255","-88.01085","-6","1"
+"53021","Fredonia","WI","43.483263","-87.98908","-6","1"
+"53022","Germantown","WI","43.219155","-88.12043","-6","1"
+"53023","Glenbeulah","WI","43.777582","-88.10103","-6","1"
+"53024","Grafton","WI","43.32546","-87.94573","-6","1"
+"53026","Greenbush","WI","43.718294","-87.618716","-6","1"
+"53027","Hartford","WI","43.313361","-88.37332","-6","1"
+"53029","Hartland","WI","43.132743","-88.34737","-6","1"
+"53031","Hingham","WI","43.639395","-87.915705","-6","1"
+"53032","Horicon","WI","43.446666","-88.62795","-6","1"
+"53033","Hubertus","WI","43.233282","-88.2396","-6","1"
+"53034","Hustisford","WI","43.345528","-88.60135","-6","1"
+"53035","Iron Ridge","WI","43.395861","-88.53606","-6","1"
+"53036","Ixonia","WI","43.178685","-88.5739","-6","1"
+"53037","Jackson","WI","43.322213","-88.17011","-6","1"
+"53038","Johnson Creek","WI","43.075784","-88.77595","-6","1"
+"53039","Juneau","WI","43.378828","-88.70876","-6","1"
+"53040","Kewaskum","WI","43.52413","-88.19215","-6","1"
+"53042","Kiel","WI","43.924095","-88.00285","-6","1"
+"53044","Kohler","WI","43.740794","-87.78303","-6","1"
+"53045","Brookfield","WI","43.055315","-88.1503","-6","1"
+"53046","Lannon","WI","43.153447","-88.16124","-6","1"
+"53047","Lebanon","WI","43.257364","-88.62873","-6","1"
+"53048","Lomira","WI","43.584926","-88.44594","-6","1"
+"53049","Malone","WI","43.887372","-88.28802","-6","1"
+"53050","Mayville","WI","43.499518","-88.53911","-6","1"
+"53051","Menomonee Falls","WI","43.151183","-88.11034","-6","1"
+"53052","Menomonee Falls","WI","43.018696","-88.302997","-6","1"
+"53056","Merton","WI","43.146023","-88.30975","-6","1"
+"53057","Mount Calvary","WI","43.80576","-88.25436","-6","1"
+"53058","Nashotah","WI","43.108775","-88.40276","-6","1"
+"53059","Neosho","WI","43.289159","-88.52623","-6","1"
+"53060","Newburg","WI","43.433807","-88.062338","-6","1"
+"53061","New Holstein","WI","43.949961","-88.09962","-6","1"
+"53062","New Holstein","WI","44.067942","-88.223131","-6","1"
+"53063","Newton","WI","43.97207","-87.7766","-6","1"
+"53064","North Lake","WI","43.018696","-88.302997","-6","1"
+"53065","Oakfield","WI","43.689915","-88.56586","-6","1"
+"53066","Oconomowoc","WI","43.108241","-88.48935","-6","1"
+"53069","Okauchee","WI","43.114118","-88.43771","-6","1"
+"53070","Oostburg","WI","43.622793","-87.80364","-6","1"
+"53072","Pewaukee","WI","43.076953","-88.268","-6","1"
+"53073","Plymouth","WI","43.758674","-87.98005","-6","1"
+"53074","Port Washington","WI","43.40181","-87.88001","-6","1"
+"53075","Random Lake","WI","43.564477","-87.99094","-6","1"
+"53076","Richfield","WI","43.265289","-88.20144","-6","1"
+"53078","Rubicon","WI","43.3182","-88.45169","-6","1"
+"53079","Saint Cloud","WI","43.808108","-88.18164","-6","1"
+"53080","Saukville","WI","43.394676","-87.95887","-6","1"
+"53081","Sheboygan","WI","43.736145","-87.72893","-6","1"
+"53082","Sheboygan","WI","43.718294","-87.618716","-6","1"
+"53083","Sheboygan","WI","43.797567","-87.75664","-6","1"
+"53085","Sheboygan Falls","WI","43.731685","-87.83406","-6","1"
+"53086","Slinger","WI","43.33278","-88.27907","-6","1"
+"53088","Stockbridge","WI","44.075128","-88.30106","-6","1"
+"53089","Sussex","WI","43.14004","-88.22641","-6","1"
+"53090","West Bend","WI","43.446623","-88.17879","-6","1"
+"53091","Theresa","WI","43.502688","-88.43299","-6","1"
+"53092","Thiensville","WI","43.223907","-87.95085","-6","1"
+"53093","Waldo","WI","43.665399","-87.94735","-6","1"
+"53094","Watertown","WI","43.170606","-88.73058","-6","1"
+"53095","West Bend","WI","43.40328","-88.18026","-6","1"
+"53097","Mequon","WI","43.234506","-88.00914","-6","1"
+"53098","Watertown","WI","43.231506","-88.70634","-6","1"
+"53099","Woodland","WI","43.414202","-88.704914","-6","1"
+"53101","Bassett","WI","42.58098","-87.662878","-6","1"
+"53102","Benet Lake","WI","42.500141","-88.079983","-6","1"
+"53103","Big Bend","WI","42.886982","-88.20955","-6","1"
+"53104","Bristol","WI","42.551693","-88.04908","-6","1"
+"53105","Burlington","WI","42.662671","-88.28132","-6","1"
+"53108","Caledonia","WI","42.825711","-87.94293","-6","1"
+"53109","Camp Lake","WI","42.535968","-88.144386","-6","1"
+"53110","Cudahy","WI","42.948416","-87.86101","-6","1"
+"53114","Darien","WI","42.60027","-88.74978","-6","1"
+"53115","Delavan","WI","42.63427","-88.6383","-6","1"
+"53118","Dousman","WI","42.991622","-88.47085","-6","1"
+"53119","Eagle","WI","42.881035","-88.47117","-6","1"
+"53120","East Troy","WI","42.797775","-88.40435","-6","1"
+"53121","Elkhorn","WI","42.711105","-88.54214","-6","1"
+"53122","Elm Grove","WI","43.050762","-88.0842","-6","1"
+"53125","Fontana","WI","42.546003","-88.56234","-6","1"
+"53126","Franksville","WI","42.778642","-87.96609","-6","1"
+"53127","Genesee Depot","WI","42.960098","-88.374455","-6","1"
+"53128","Genoa City","WI","42.526028","-88.33443","-6","1"
+"53129","Greendale","WI","42.937448","-87.99839","-6","1"
+"53130","Hales Corners","WI","42.941264","-88.05121","-6","1"
+"53132","Franklin","WI","42.896145","-88.00891","-6","1"
+"53134","Walworth","WI","42.560001","-88.594815","-6","1"
+"53137","Helenville","WI","43.000999","-88.66382","-6","1"
+"53138","Honey Creek","WI","42.66749","-88.541721","-6","1"
+"53139","Kansasville","WI","42.691937","-88.12599","-6","1"
+"53140","Kenosha","WI","42.60217","-87.82979","-6","1"
+"53141","Kenosha","WI","42.58098","-87.662878","-6","1"
+"53142","Kenosha","WI","42.559823","-87.87878","-6","1"
+"53143","Kenosha","WI","42.56427","-87.83043","-6","1"
+"53144","Kenosha","WI","42.601842","-87.87617","-6","1"
+"53146","New Berlin","WI","42.973663","-88.15414","-6","1"
+"53147","Lake Geneva","WI","42.587613","-88.45828","-6","1"
+"53148","Lyons","WI","42.649557","-88.35965","-6","1"
+"53149","Mukwonago","WI","42.872477","-88.34409","-6","1"
+"53150","Muskego","WI","42.901235","-88.12464","-6","1"
+"53151","New Berlin","WI","42.980163","-88.09438","-6","1"
+"53152","New Munster","WI","42.574616","-88.232632","-6","1"
+"53153","North Prairie","WI","42.935259","-88.40501","-6","1"
+"53154","Oak Creek","WI","42.884347","-87.8992","-6","1"
+"53156","Palmyra","WI","42.879242","-88.58987","-6","1"
+"53157","Pell Lake","WI","42.540048","-88.358167","-6","1"
+"53158","Pleasant Prairie","WI","42.529075","-87.87201","-6","1"
+"53159","Powers Lake","WI","42.555695","-88.296914","-6","1"
+"53167","Rochester","WI","42.742629","-88.22308","-6","1"
+"53168","Salem","WI","42.573081","-88.12444","-6","1"
+"53170","Silver Lake","WI","42.550263","-88.17065","-6","1"
+"53171","Somers","WI","42.642298","-87.903161","-6","1"
+"53172","South Milwaukee","WI","42.909816","-87.86395","-6","1"
+"53176","Springfield","WI","42.642223","-88.41179","-6","1"
+"53177","Sturtevant","WI","42.699169","-87.91692","-6","1"
+"53178","Sullivan","WI","43.015999","-88.59572","-6","1"
+"53179","Trevor","WI","42.515668","-88.13454","-6","1"
+"53181","Twin Lakes","WI","42.515596","-88.25761","-6","1"
+"53182","Union Grove","WI","42.696322","-88.04658","-6","1"
+"53183","Wales","WI","43.002534","-88.37771","-6","1"
+"53184","Walworth","WI","42.532636","-88.59862","-6","1"
+"53185","Waterford","WI","42.798555","-88.19409","-6","1"
+"53186","Waukesha","WI","43.015289","-88.20924","-6","1"
+"53187","Waukesha","WI","43.018696","-88.302997","-6","1"
+"53188","Waukesha","WI","43.020762","-88.26852","-6","1"
+"53189","Waukesha","WI","42.967394","-88.264","-6","1"
+"53190","Whitewater","WI","42.818747","-88.73279","-6","1"
+"53191","Williams Bay","WI","42.573162","-88.54021","-6","1"
+"53192","Wilmot","WI","42.511818","-88.18285","-6","1"
+"53194","Woodworth","WI","42.58098","-87.662878","-6","1"
+"53195","Zenda","WI","42.512403","-88.48262","-6","1"
+"53197","Walworth","WI","42.566752","-88.56557","-6","1"
+"53201","Milwaukee","WI","43.011264","-87.958409","-6","1"
+"53202","Milwaukee","WI","43.046213","-87.9005","-6","1"
+"53203","Milwaukee","WI","43.037963","-87.91548","-6","1"
+"53204","Milwaukee","WI","43.017414","-87.92625","-6","1"
+"53205","Milwaukee","WI","43.053763","-87.93473","-6","1"
+"53206","Milwaukee","WI","43.076179","-87.93476","-6","1"
+"53207","Milwaukee","WI","42.985465","-87.89998","-6","1"
+"53208","Milwaukee","WI","43.047863","-87.96618","-6","1"
+"53209","Milwaukee","WI","43.11941","-87.94727","-6","1"
+"53210","Milwaukee","WI","43.068962","-87.97423","-6","1"
+"53211","Milwaukee","WI","43.083012","-87.8859","-6","1"
+"53212","Milwaukee","WI","43.072062","-87.9103","-6","1"
+"53213","Milwaukee","WI","43.049012","-88.00012","-6","1"
+"53214","Milwaukee","WI","43.020363","-88.01273","-6","1"
+"53215","Milwaukee","WI","42.999364","-87.94343","-6","1"
+"53216","Milwaukee","WI","43.086711","-87.9749","-6","1"
+"53217","Milwaukee","WI","43.14351","-87.90894","-6","1"
+"53218","Milwaukee","WI","43.11096","-87.99436","-6","1"
+"53219","Milwaukee","WI","42.996614","-87.99213","-6","1"
+"53220","Milwaukee","WI","42.969115","-87.99141","-6","1"
+"53221","Milwaukee","WI","42.953915","-87.9457","-6","1"
+"53222","Milwaukee","WI","43.083261","-88.02823","-6","1"
+"53223","Milwaukee","WI","43.163692","-87.98717","-6","1"
+"53224","Milwaukee","WI","43.153865","-88.04032","-6","1"
+"53225","Milwaukee","WI","43.11576","-88.04121","-6","1"
+"53226","Milwaukee","WI","43.048545","-88.04239","-6","1"
+"53227","Milwaukee","WI","42.997647","-88.03717","-6","1"
+"53228","Milwaukee","WI","42.966681","-88.03798","-6","1"
+"53233","Milwaukee","WI","43.037313","-87.93373","-6","1"
+"53234","Milwaukee","WI","43.017412","-87.569664","-6","1"
+"53235","Saint Francis","WI","42.971156","-87.87452","-6","1"
+"53237","Milwaukee","WI","43.017412","-87.569664","-6","1"
+"53245","Eaton","WI","44.056094","-87.985595","-6","1"
+"53259","Milwaukee","WI","43.038663","-87.913934","-6","1"
+"53263","Milwaukee","WI","43.074583","-88.06044","-6","1"
+"53267","Milwaukee","WI","43.044013","-87.909834","-6","1"
+"53268","Milwaukee","WI","43.038513","-87.909584","-6","1"
+"53270","Milwaukee","WI","43.038763","-87.903634","-6","1"
+"53274","Milwaukee","WI","43.017412","-87.569664","-6","1"
+"53277","Milwaukee","WI","43.038863","-87.902384","-6","1"
+"53278","Milwaukee","WI","43.038863","-87.902384","-6","1"
+"53280","Milwaukee","WI","43.040963","-87.957786","-6","1"
+"53281","Milwaukee","WI","43.040963","-87.957786","-6","1"
+"53284","Milwaukee","WI","43.017412","-87.569664","-6","1"
+"53285","Milwaukee","WI","43.017412","-87.569664","-6","1"
+"53288","Milwaukee","WI","43.040613","-87.909784","-6","1"
+"53290","Milwaukee","WI","43.037263","-87.914034","-6","1"
+"53293","Milwaukee","WI","43.040813","-87.919135","-6","1"
+"53295","Milwaukee","WI","43.017412","-87.569664","-6","1"
+"53401","Racine","WI","42.727153","-87.675979","-6","1"
+"53402","Racine","WI","42.767286","-87.79747","-6","1"
+"53403","Racine","WI","42.704519","-87.80062","-6","1"
+"53404","Racine","WI","42.743169","-87.80534","-6","1"
+"53405","Racine","WI","42.714369","-87.82424","-6","1"
+"53406","Racine","WI","42.730807","-87.85827","-6","1"
+"53407","Racine","WI","42.731224","-87.782818","-6","1"
+"53408","Racine","WI","42.727153","-87.675979","-6","1"
+"53449","Jefferson","WI","42.999481","-88.782526","-6","1"
+"53490","Racine","WI","42.727153","-87.675979","-6","1"
+"53501","Afton","WI","42.605454","-89.070448","-6","1"
+"53502","Albany","WI","42.71815","-89.44315","-6","1"
+"53503","Arena","WI","43.150122","-89.92545","-6","1"
+"53504","Argyle","WI","42.698173","-89.85736","-6","1"
+"53505","Avalon","WI","42.642661","-88.82547","-6","1"
+"53506","Avoca","WI","43.15498","-90.28594","-6","1"
+"53507","Barneveld","WI","43.008697","-89.90117","-6","1"
+"53508","Belleville","WI","42.865397","-89.55461","-6","1"
+"53510","Belmont","WI","42.729814","-90.31984","-6","1"
+"53511","Beloit","WI","42.526464","-89.04291","-6","1"
+"53512","Beloit","WI","42.669779","-89.072779","-6","1"
+"53515","Black Earth","WI","43.131939","-89.7438","-6","1"
+"53516","Blanchardville","WI","42.802663","-89.85943","-6","1"
+"53517","Blue Mounds","WI","43.031138","-89.83672","-6","1"
+"53518","Blue River","WI","43.23854","-90.59683","-6","1"
+"53520","Brodhead","WI","42.613107","-89.37364","-6","1"
+"53521","Brooklyn","WI","42.839241","-89.40088","-6","1"
+"53522","Browntown","WI","42.552731","-89.79624","-6","1"
+"53523","Cambridge","WI","42.99273","-89.02274","-6","1"
+"53525","Clinton","WI","42.551253","-88.85412","-6","1"
+"53526","Cobb","WI","42.970855","-90.33452","-6","1"
+"53527","Cottage Grove","WI","43.073751","-89.1967","-6","1"
+"53528","Cross Plains","WI","43.116408","-89.64371","-6","1"
+"53529","Dane","WI","43.228109","-89.53605","-6","1"
+"53530","Darlington","WI","42.686745","-90.10983","-6","1"
+"53531","Deerfield","WI","43.055415","-89.09349","-6","1"
+"53532","De Forest","WI","43.240098","-89.33659","-6","1"
+"53533","Dodgeville","WI","42.974296","-90.14404","-6","1"
+"53534","Edgerton","WI","42.841688","-89.07223","-6","1"
+"53535","Edmund","WI","43.011323","-90.133932","-6","1"
+"53536","Evansville","WI","42.772516","-89.2802","-6","1"
+"53537","Footville","WI","42.668944","-89.20998","-6","1"
+"53538","Fort Atkinson","WI","42.924942","-88.84813","-6","1"
+"53540","Gotham","WI","43.222854","-90.2935","-6","1"
+"53541","Gratiot","WI","42.572413","-90.02605","-6","1"
+"53542","Hanover","WI","42.632325","-89.15942","-6","1"
+"53543","Highland","WI","43.043206","-90.35954","-6","1"
+"53544","Hollandale","WI","42.878192","-89.92864","-6","1"
+"53545","Janesville","WI","42.69146","-89.04277","-6","1"
+"53546","Janesville","WI","42.666761","-88.99528","-6","1"
+"53547","Janesville","WI","42.729359","-89.030111","-6","1"
+"53549","Jefferson","WI","42.993905","-88.79321","-6","1"
+"53550","Juda","WI","42.567333","-89.49397","-6","1"
+"53551","Lake Mills","WI","43.082761","-88.90838","-6","1"
+"53553","Linden","WI","42.92239","-90.28554","-6","1"
+"53554","Livingston","WI","42.906219","-90.42574","-6","1"
+"53555","Lodi","WI","43.325153","-89.56074","-6","1"
+"53556","Lone Rock","WI","43.213963","-90.23909","-6","1"
+"53557","Lowell","WI","43.339823","-88.79719","-6","1"
+"53558","McFarland","WI","43.015498","-89.28954","-6","1"
+"53559","Marshall","WI","43.172619","-89.07464","-6","1"
+"53560","Mazomanie","WI","43.177861","-89.78012","-6","1"
+"53561","Merrimac","WI","43.37262","-89.69418","-6","1"
+"53562","Middleton","WI","43.103711","-89.51106","-6","1"
+"53563","Milton","WI","42.778497","-88.95595","-6","1"
+"53565","Mineral Point","WI","42.852038","-90.1745","-6","1"
+"53566","Monroe","WI","42.603462","-89.64037","-6","1"
+"53569","Montfort","WI","42.989241","-90.43855","-6","1"
+"53570","Monticello","WI","42.745346","-89.61455","-6","1"
+"53571","Morrisonville","WI","43.277409","-89.35853","-6","1"
+"53572","Mount Horeb","WI","42.985255","-89.73647","-6","1"
+"53573","Muscoda","WI","43.1914","-90.45655","-6","1"
+"53574","New Glarus","WI","42.81636","-89.64075","-6","1"
+"53575","Oregon","WI","42.929208","-89.38478","-6","1"
+"53576","Orfordville","WI","42.635236","-89.24268","-6","1"
+"53577","Plain","WI","43.302123","-90.07619","-6","1"
+"53578","Prairie Du Sac","WI","43.318318","-89.74928","-6","1"
+"53579","Reeseville","WI","43.296299","-88.86721","-6","1"
+"53580","Rewey","WI","42.85044","-90.37608","-6","1"
+"53581","Richland Center","WI","43.361048","-90.40776","-6","1"
+"53582","Ridgeway","WI","43.020516","-89.97928","-6","1"
+"53583","Sauk City","WI","43.267183","-89.76912","-6","1"
+"53584","Sextonville","WI","43.279435","-90.287566","-6","1"
+"53585","Sharon","WI","42.518695","-88.7226","-6","1"
+"53586","Shullsburg","WI","42.5744","-90.23935","-6","1"
+"53587","South Wayne","WI","42.584521","-89.9026","-6","1"
+"53588","Spring Green","WI","43.174503","-90.07267","-6","1"
+"53589","Stoughton","WI","42.926473","-89.22432","-6","1"
+"53590","Sun Prairie","WI","43.189953","-89.2253","-6","1"
+"53591","Sun Prairie","WI","43.06956","-89.423861","-6","1"
+"53593","Verona","WI","42.988593","-89.55543","-6","1"
+"53594","Waterloo","WI","43.18584","-88.97553","-6","1"
+"53595","Dodgeville","WI","42.976078","-90.141299","-6","1"
+"53596","Sun Prairie","WI","43.192403","-89.26288","-6","1"
+"53597","Waunakee","WI","43.182873","-89.45408","-6","1"
+"53598","Windsor","WI","43.21352","-89.34203","-6","1"
+"53599","Woodford","WI","42.649309","-89.862202","-6","1"
+"53648","Salem","WI","42.547163","-88.079487","-6","1"
+"53698","Union Center","WI","43.680522","-90.26952","-6","1"
+"53701","Madison","WI","43.06956","-89.423861","-6","1"
+"53702","Madison","WI","43.06956","-89.423861","-6","1"
+"53703","Madison","WI","43.078646","-89.37727","-6","1"
+"53704","Madison","WI","43.121416","-89.34968","-6","1"
+"53705","Madison","WI","43.073395","-89.45049","-6","1"
+"53706","Madison","WI","43.074296","-89.40774","-6","1"
+"53707","Madison","WI","43.06956","-89.423861","-6","1"
+"53708","Madison","WI","43.06956","-89.423861","-6","1"
+"53709","Madison","WI","43.06956","-89.423861","-6","1"
+"53710","Madison","WI","43.06956","-89.423861","-6","1"
+"53711","Madison","WI","43.036696","-89.44499","-6","1"
+"53713","Madison","WI","43.037647","-89.39154","-6","1"
+"53714","Madison","WI","43.099861","-89.31786","-6","1"
+"53715","Madison","WI","43.061546","-89.40024","-6","1"
+"53716","Madison","WI","43.065621","-89.32085","-6","1"
+"53717","Madison","WI","43.072994","-89.51992","-6","1"
+"53718","Madison","WI","43.095178","-89.2704","-6","1"
+"53719","Madison","WI","43.029497","-89.50531","-6","1"
+"53725","Madison","WI","43.06956","-89.423861","-6","1"
+"53726","Madison","WI","43.06956","-89.423861","-6","1"
+"53744","Madison","WI","43.06956","-89.423861","-6","1"
+"53777","Madison","WI","43.06956","-89.423861","-6","1"
+"53778","Madison","WI","43.06956","-89.423861","-6","1"
+"53779","Madison","WI","43.098202","-89.324196","-6","1"
+"53780","Madison","WI","43.06956","-89.423861","-6","1"
+"53782","Madison","WI","43.06956","-89.423861","-6","1"
+"53783","Madison","WI","43.15955","-89.285235","-6","1"
+"53784","Madison","WI","43.048908","-89.338447","-6","1"
+"53785","Madison","WI","43.06956","-89.423861","-6","1"
+"53786","Madison","WI","43.06956","-89.423861","-6","1"
+"53787","Madison","WI","43.06956","-89.423861","-6","1"
+"53788","Madison","WI","43.076691","-89.37632","-6","1"
+"53789","Madison","WI","43.06956","-89.423861","-6","1"
+"53790","Madison","WI","43.06956","-89.423861","-6","1"
+"53791","Madison","WI","43.06956","-89.423861","-6","1"
+"53792","Madison","WI","43.06956","-89.423861","-6","1"
+"53793","Madison","WI","43.06956","-89.423861","-6","1"
+"53794","Madison","WI","43.06956","-89.423861","-6","1"
+"53801","Bagley","WI","42.922835","-91.09378","-6","1"
+"53802","Beetown","WI","42.873625","-90.936354","-6","1"
+"53803","Benton","WI","42.563769","-90.36783","-6","1"
+"53804","Bloomington","WI","42.873162","-90.91222","-6","1"
+"53805","Boscobel","WI","43.136963","-90.69831","-6","1"
+"53806","Cassville","WI","42.734625","-90.95124","-6","1"
+"53807","Cuba City","WI","42.607138","-90.44812","-6","1"
+"53808","Dickeyville","WI","42.627951","-90.5939","-6","1"
+"53809","Fennimore","WI","42.98995","-90.63483","-6","1"
+"53810","Glen Haven","WI","42.818053","-90.9931","-6","1"
+"53811","Hazel Green","WI","42.532592","-90.49997","-6","1"
+"53812","Kieler","WI","42.859325","-90.791337","-6","1"
+"53813","Lancaster","WI","42.847591","-90.70167","-6","1"
+"53816","Mount Hope","WI","42.996023","-90.85263","-6","1"
+"53817","Patch Grove","WI","42.941786","-90.97564","-6","1"
+"53818","Platteville","WI","42.743948","-90.48625","-6","1"
+"53820","Potosi","WI","42.695285","-90.69309","-6","1"
+"53821","Prairie Du Chien","WI","43.036566","-91.11838","-6","1"
+"53824","Sinsinawa","WI","42.859325","-90.791337","-6","1"
+"53825","Stitzer","WI","42.928048","-90.56703","-6","1"
+"53826","Wauzeka","WI","43.124756","-90.90828","-6","1"
+"53827","Woodman","WI","43.063729","-90.82292","-6","1"
+"53886","New Diggings","WI","42.522232","-90.340446","-6","1"
+"53901","Portage","WI","43.549851","-89.47101","-6","1"
+"53910","Adams","WI","43.908737","-89.80722","-6","1"
+"53911","Arlington","WI","43.321005","-89.36681","-6","1"
+"53913","Baraboo","WI","43.483503","-89.74753","-6","1"
+"53916","Beaver Dam","WI","43.456814","-88.84058","-6","1"
+"53917","Beaver Dam","WI","43.414202","-88.704914","-6","1"
+"53919","Brandon","WI","43.734566","-88.78585","-6","1"
+"53920","Briggsville","WI","43.660412","-89.59309","-6","1"
+"53922","Burnett","WI","43.518602","-88.71347","-6","1"
+"53923","Cambria","WI","43.559975","-89.13762","-6","1"
+"53924","Cazenovia","WI","43.503482","-90.26902","-6","1"
+"53925","Columbus","WI","43.340383","-89.04091","-6","1"
+"53926","Dalton","WI","43.664224","-89.19684","-6","1"
+"53927","Dellwood","WI","43.95546","-89.941771","-6","1"
+"53928","Doylestown","WI","43.426936","-89.14912","-6","1"
+"53929","Elroy","WI","43.752732","-90.2853","-6","1"
+"53930","Endeavor","WI","43.691602","-89.48924","-6","1"
+"53931","Fairwater","WI","43.740108","-88.86812","-6","1"
+"53932","Fall River","WI","43.407179","-89.05837","-6","1"
+"53933","Fox Lake","WI","43.566325","-88.90158","-6","1"
+"53934","Friendship","WI","43.967604","-89.85287","-6","1"
+"53935","Friesland","WI","43.588986","-89.06787","-6","1"
+"53936","Grand Marsh","WI","43.868852","-89.70736","-6","1"
+"53937","Hillpoint","WI","43.378638","-90.15726","-6","1"
+"53939","Kingston","WI","43.693508","-89.12856","-6","1"
+"53940","Lake Delton","WI","43.589593","-89.79306","-6","1"
+"53941","La Valle","WI","43.579867","-90.13608","-6","1"
+"53942","Lime Ridge","WI","43.468211","-90.161478","-6","1"
+"53943","Loganville","WI","43.401354","-90.04308","-6","1"
+"53944","Lyndon Station","WI","43.705113","-89.89911","-6","1"
+"53946","Markesan","WI","43.727646","-89.02574","-6","1"
+"53947","Marquette","WI","43.747501","-89.1405","-6","1"
+"53948","Mauston","WI","43.783534","-90.0566","-6","1"
+"53949","Montello","WI","43.792518","-89.34061","-6","1"
+"53950","New Lisbon","WI","43.90147","-90.13777","-6","1"
+"53951","North Freedom","WI","43.393526","-89.84489","-6","1"
+"53952","Oxford","WI","43.776098","-89.60323","-6","1"
+"53953","Packwaukee","WI","43.765621","-89.45736","-6","1"
+"53954","Pardeeville","WI","43.522529","-89.32342","-6","1"
+"53955","Poynette","WI","43.404191","-89.4171","-6","1"
+"53956","Randolph","WI","43.544491","-89.01137","-6","1"
+"53957","Randolph","WI","43.535249","-89.006845","-6","1"
+"53958","Reedsburg","WI","43.393767","-89.95589","-6","1"
+"53959","Reedsburg","WI","43.53414","-89.99183","-6","1"
+"53960","Rio","WI","43.442214","-89.24134","-6","1"
+"53961","Rock Springs","WI","43.469055","-89.93827","-6","1"
+"53962","Union Center","WI","43.685137","-90.26578","-6","1"
+"53963","Waupun","WI","43.633781","-88.7351","-6","1"
+"53964","Westfield","WI","43.907282","-89.49412","-6","1"
+"53965","Wisconsin Dells","WI","43.645603","-89.78104","-6","1"
+"53968","Wonewoc","WI","43.648089","-90.24377","-6","1"
+"53969","Wyocena","WI","43.49534","-89.30897","-6","1"
+"53981","Willow","WI","43.412658","-90.274101","-6","1"
+"53995","Poynette","WI","43.39269","-89.404154","-6","1"
+"54001","Amery","WI","45.326339","-92.37857","-6","1"
+"54002","Baldwin","WI","44.96915","-92.37326","-6","1"
+"54003","Beldenville","WI","44.782907","-92.44657","-6","1"
+"54004","Clayton","WI","45.319095","-92.13016","-6","1"
+"54005","Clear Lake","WI","45.237727","-92.22901","-6","1"
+"54006","Cushing","WI","45.586187","-92.64165","-6","1"
+"54007","Deer Park","WI","45.189667","-92.37018","-6","1"
+"54009","Dresser","WI","45.351585","-92.60246","-6","1"
+"54010","East Ellsworth","WI","44.734759","-92.465532","-6","1"
+"54011","Ellsworth","WI","44.718955","-92.46651","-6","1"
+"54012","Emerald","WI","45.115377","-92.28686","-6","1"
+"54013","Glenwood City","WI","45.06461","-92.18504","-6","1"
+"54014","Hager City","WI","44.626915","-92.548","-6","1"
+"54015","Hammond","WI","44.957487","-92.44589","-6","1"
+"54016","Hudson","WI","44.978518","-92.71996","-6","1"
+"54017","New Richmond","WI","45.122052","-92.53691","-6","1"
+"54020","Osceola","WI","45.299735","-92.64222","-6","1"
+"54021","Prescott","WI","44.752662","-92.77958","-6","1"
+"54022","River Falls","WI","44.854636","-92.61729","-6","1"
+"54023","Roberts","WI","44.970887","-92.5478","-6","1"
+"54024","Saint Croix Falls","WI","45.469339","-92.62088","-6","1"
+"54025","Somerset","WI","45.142151","-92.6819","-6","1"
+"54026","Star Prairie","WI","45.221875","-92.53507","-6","1"
+"54027","Wilson","WI","44.938989","-92.18637","-6","1"
+"54028","Woodville","WI","44.944206","-92.27961","-6","1"
+"54034","Forest","WI","43.690997","-90.478904","-6","1"
+"54035","Fond du Lac","WI","43.747687","-88.418643","-6","1"
+"54052","Kickapoo","WI","43.489717","-90.712433","-6","1"
+"54061","New London","WI","44.393405","-88.72588","-6","1"
+"54082","Saint Joseph","WI","45.068411","-92.74248","-6","1"
+"54101","Abrams","WI","44.788898","-88.04535","-6","1"
+"54102","Amberg","WI","45.503625","-88.08108","-6","1"
+"54103","Armstrong Creek","WI","45.655708","-88.48292","-6","1"
+"54104","Athelstane","WI","45.428789","-88.25278","-6","1"
+"54106","Black Creek","WI","44.472424","-88.45746","-6","1"
+"54107","Bonduel","WI","44.710588","-88.45159","-6","1"
+"54110","Brillion","WI","44.179504","-88.07449","-6","1"
+"54111","Cecil","WI","44.826617","-88.4018","-6","1"
+"54112","Coleman","WI","45.054842","-88.0547","-6","1"
+"54113","Combined Locks","WI","44.264904","-88.312","-6","1"
+"54114","Crivitz","WI","45.245131","-88.1504","-6","1"
+"54115","De Pere","WI","44.42042","-88.07896","-6","1"
+"54119","Dunbar","WI","45.613142","-88.17458","-6","1"
+"54120","Fence","WI","45.755118","-88.43264","-6","1"
+"54121","Florence","WI","45.873589","-88.27342","-6","1"
+"54123","Forest Junction","WI","44.205239","-88.15899","-6","1"
+"54124","Gillett","WI","44.904959","-88.37822","-6","1"
+"54125","Goodman","WI","45.634252","-88.33667","-6","1"
+"54126","Greenleaf","WI","44.291766","-88.05059","-6","1"
+"54127","Green Valley","WI","44.795823","-88.26895","-6","1"
+"54128","Gresham","WI","44.860223","-88.79585","-6","1"
+"54129","Hilbert","WI","44.131149","-88.19443","-6","1"
+"54130","Kaukauna","WI","44.293197","-88.25922","-6","1"
+"54131","Freedom","WI","44.416326","-88.464873","-6","1"
+"54135","Keshena","WI","44.901909","-88.59535","-6","1"
+"54136","Kimberly","WI","44.268387","-88.33656","-6","1"
+"54137","Krakow","WI","44.76022","-88.25467","-6","1"
+"54138","Lakewood","WI","45.312629","-88.47583","-6","1"
+"54139","Lena","WI","44.943923","-88.06843","-6","1"
+"54140","Little Chute","WI","44.286637","-88.31001","-6","1"
+"54141","Little Suamico","WI","44.728341","-88.00712","-6","1"
+"54143","Marinette","WI","45.092448","-87.64929","-6","1"
+"54149","Mountain","WI","45.204046","-88.51121","-6","1"
+"54150","Neopit","WI","44.984514","-88.85947","-6","1"
+"54151","Niagara","WI","45.732689","-87.96996","-6","1"
+"54152","Nichols","WI","44.565437","-88.46717","-6","1"
+"54153","Oconto","WI","44.886571","-87.89935","-6","1"
+"54154","Oconto Falls","WI","44.86802","-88.16446","-6","1"
+"54155","Oneida","WI","44.52284","-88.18008","-6","1"
+"54156","Pembine","WI","45.595032","-87.95018","-6","1"
+"54157","Peshtigo","WI","45.057605","-87.77449","-6","1"
+"54159","Porterfield","WI","45.207353","-87.80061","-6","1"
+"54160","Potter","WI","44.1196","-88.09784","-6","1"
+"54161","Pound","WI","45.116325","-88.16811","-6","1"
+"54162","Pulaski","WI","44.65711","-88.24208","-6","1"
+"54165","Seymour","WI","44.51523","-88.31075","-6","1"
+"54166","Shawano","WI","44.779241","-88.60636","-6","1"
+"54169","Sherwood","WI","44.173538","-88.27525","-6","1"
+"54170","Shiocton","WI","44.506022","-88.56461","-6","1"
+"54171","Sobieski","WI","44.718335","-88.10117","-6","1"
+"54173","Suamico","WI","44.640367","-88.03732","-6","1"
+"54174","Suring","WI","45.047766","-88.37913","-6","1"
+"54175","Townsend","WI","45.30942","-88.61753","-6","1"
+"54177","Wausaukee","WI","45.370117","-87.87769","-6","1"
+"54180","Wrightstown","WI","44.325856","-88.16205","-6","1"
+"54182","Zachow","WI","44.731453","-88.369842","-6","1"
+"54201","Algoma","WI","44.613604","-87.46502","-6","1"
+"54202","Baileys Harbor","WI","45.059668","-87.13196","-6","1"
+"54203","Branch","WI","44.109853","-87.483874","-6","1"
+"54204","Brussels","WI","44.753401","-87.64628","-6","1"
+"54205","Casco","WI","44.58906","-87.62271","-6","1"
+"54206","Kossuth","WI","44.237283","-87.801108","-6","1"
+"54207","Collins","WI","44.086144","-87.98331","-6","1"
+"54208","Denmark","WI","44.358527","-87.79747","-6","1"
+"54209","Egg Harbor","WI","45.027668","-87.28234","-6","1"
+"54210","Ellison Bay","WI","45.271782","-87.04561","-6","1"
+"54211","Ephraim","WI","45.158078","-87.16796","-6","1"
+"54212","Fish Creek","WI","45.146473","-87.24154","-6","1"
+"54213","Forestville","WI","44.693392","-87.51197","-6","1"
+"54214","Francis Creek","WI","44.200758","-87.71974","-6","1"
+"54215","Kellnersville","WI","44.224851","-87.79943","-6","1"
+"54216","Kewaunee","WI","44.456022","-87.54429","-6","1"
+"54217","Luxemburg","WI","44.55681","-87.71413","-6","1"
+"54220","Manitowoc","WI","44.096194","-87.68919","-6","1"
+"54221","Manitowoc","WI","44.132295","-87.599031","-6","1"
+"54226","Maplewood","WI","45.059713","-87.006012","-6","1"
+"54227","Maribel","WI","44.27809","-87.79026","-6","1"
+"54228","Mishicot","WI","44.257289","-87.64866","-6","1"
+"54229","New Franken","WI","44.559995","-87.81553","-6","1"
+"54230","Reedsville","WI","44.142939","-87.9131","-6","1"
+"54232","Saint Nazianz","WI","44.008575","-87.92456","-6","1"
+"54234","Sister Bay","WI","45.186528","-87.11618","-6","1"
+"54235","Sturgeon Bay","WI","44.844133","-87.38044","-6","1"
+"54240","Tisch Mills","WI","44.326784","-87.62239","-6","1"
+"54241","Two Rivers","WI","44.174245","-87.58613","-6","1"
+"54242","Ludington","WI","44.829002","-91.210194","-6","1"
+"54245","Valders","WI","44.037618","-87.90026","-6","1"
+"54246","Washington Island","WI","45.365984","-86.89946","-6","1"
+"54247","Whitelaw","WI","44.19011","-87.79109","-6","1"
+"54301","Green Bay","WI","44.489059","-88.01674","-6","1"
+"54302","Green Bay","WI","44.505782","-87.97947","-6","1"
+"54303","Green Bay","WI","44.530892","-88.04482","-6","1"
+"54304","Green Bay","WI","44.499346","-88.06318","-6","1"
+"54305","Green Bay","WI","44.460064","-88.007382","-6","1"
+"54306","Green Bay","WI","44.460064","-88.007382","-6","1"
+"54307","Green Bay","WI","44.460064","-88.007382","-6","1"
+"54308","Green Bay","WI","44.459509","-87.805912","-6","1"
+"54310","Liberty Grove","WI","45.210664","-87.041244","-6","1"
+"54311","Green Bay","WI","44.485243","-87.92232","-6","1"
+"54313","Green Bay","WI","44.564261","-88.10326","-6","1"
+"54324","Green Bay","WI","44.460064","-88.007382","-6","1"
+"54337","Bone Lake","WI","45.610429","-92.324516","-6","1"
+"54344","Green Bay","WI","44.42504","-88.111252","-6","1"
+"54353","Georgetown","WI","45.54142","-92.398168","-6","1"
+"54383","Wascott","WI","46.18508","-91.959307","-6","1"
+"54401","Wausau","WI","44.958382","-89.6693","-6","1"
+"54402","Wausau","WI","44.900936","-89.7701","-6","1"
+"54403","Wausau","WI","44.976118","-89.59209","-6","1"
+"54404","Marshfield","WI","44.466554","-90.02136","-6","1"
+"54405","Abbotsford","WI","44.950905","-90.30486","-6","1"
+"54406","Amherst","WI","44.421111","-89.30618","-6","1"
+"54407","Amherst Junction","WI","44.513056","-89.30422","-6","1"
+"54408","Aniwa","WI","45.03324","-89.28376","-6","1"
+"54409","Antigo","WI","45.121666","-89.13388","-6","1"
+"54410","Arpin","WI","44.536298","-90.04317","-6","1"
+"54411","Athens","WI","45.040345","-90.01829","-6","1"
+"54412","Auburndale","WI","44.662975","-89.9943","-6","1"
+"54413","Babcock","WI","44.283542","-90.12791","-6","1"
+"54414","Birnamwood","WI","44.95258","-89.16252","-6","1"
+"54415","Blenker","WI","44.619128","-89.918563","-6","1"
+"54416","Bowler","WI","44.879391","-88.95511","-6","1"
+"54417","Brokaw","WI","45.025111","-89.64609","-6","1"
+"54418","Bryant","WI","45.221567","-88.96427","-6","1"
+"54419","Chelsea","WI","45.222391","-90.329035","-6","1"
+"54420","Chili","WI","44.619487","-90.36605","-6","1"
+"54421","Colby","WI","44.903","-90.30657","-6","1"
+"54422","Curtiss","WI","44.984128","-90.44176","-6","1"
+"54423","Custer","WI","44.585504","-89.42139","-6","1"
+"54424","Deerbrook","WI","45.28142","-89.20118","-6","1"
+"54425","Dorchester","WI","45.006072","-90.33146","-6","1"
+"54426","Edgar","WI","44.907131","-89.9777","-6","1"
+"54427","Eland","WI","44.834167","-89.23917","-6","1"
+"54428","Elcho","WI","45.440199","-89.13837","-6","1"
+"54429","Elderon","WI","44.780171","-89.247809","-6","1"
+"54430","Elton","WI","45.138072","-88.88498","-6","1"
+"54431","Little Black","WI","45.116388","-90.352237","-6","1"
+"54432","Galloway","WI","44.900936","-89.7701","-6","1"
+"54433","Gilman","WI","45.186932","-90.81846","-6","1"
+"54434","Jump River","WI","45.206757","-90.484132","-6","1"
+"54435","Gleason","WI","45.372921","-89.43748","-6","1"
+"54436","Granton","WI","44.557846","-90.44622","-6","1"
+"54437","Greenwood","WI","44.775105","-90.62639","-6","1"
+"54439","Hannibal","WI","45.206757","-90.484132","-6","1"
+"54440","Hatley","WI","44.830734","-89.37414","-6","1"
+"54441","Hewitt","WI","44.645158","-90.10523","-6","1"
+"54442","Irma","WI","45.345991","-89.67087","-6","1"
+"54443","Junction City","WI","44.612879","-89.74163","-6","1"
+"54444","Kempster","WI","45.249382","-89.032136","-6","1"
+"54446","Loyal","WI","44.758265","-90.48248","-6","1"
+"54447","Lublin","WI","45.077541","-90.7324","-6","1"
+"54448","Marathon","WI","44.935076","-89.83699","-6","1"
+"54449","Marshfield","WI","44.656686","-90.18152","-6","1"
+"54450","Mattoon","WI","45.006232","-89.047379","-6","1"
+"54451","Medford","WI","45.171131","-90.40527","-6","1"
+"54452","Merrill","WI","45.181311","-89.70469","-6","1"
+"54454","Milladore","WI","44.620203","-89.87223","-6","1"
+"54455","Mosinee","WI","44.787003","-89.69066","-6","1"
+"54456","Neillsville","WI","44.553719","-90.61457","-6","1"
+"54457","Nekoosa","WI","44.260056","-89.88239","-6","1"
+"54458","Nelsonville","WI","44.490241","-89.310944","-6","1"
+"54459","Ogema","WI","45.434426","-90.26806","-6","1"
+"54460","Owen","WI","44.945107","-90.53973","-6","1"
+"54462","Pearson","WI","45.392118","-89.0051","-6","1"
+"54463","Pelican Lake","WI","45.516138","-89.17824","-6","1"
+"54464","Phlox","WI","45.249382","-89.032136","-6","1"
+"54465","Pickerel","WI","45.393536","-88.88706","-6","1"
+"54466","Pittsville","WI","44.404914","-90.24246","-6","1"
+"54467","Plover","WI","44.452277","-89.54399","-6","1"
+"54469","Port Edwards","WI","44.348816","-89.86368","-6","1"
+"54470","Rib Lake","WI","45.297753","-90.16658","-6","1"
+"54471","Ringle","WI","44.918707","-89.44139","-6","1"
+"54472","Marshfield","WI","44.466554","-90.02136","-6","1"
+"54473","Rosholt","WI","44.641554","-89.33596","-6","1"
+"54474","Rothschild","WI","44.885168","-89.61922","-6","1"
+"54475","Rudolph","WI","44.484001","-89.79403","-6","1"
+"54476","Schofield","WI","44.903194","-89.57937","-6","1"
+"54479","Spencer","WI","44.764411","-90.33179","-6","1"
+"54480","Stetsonville","WI","45.064903","-90.29794","-6","1"
+"54481","Stevens Point","WI","44.524054","-89.55621","-6","1"
+"54484","Stratford","WI","44.793747","-90.06026","-6","1"
+"54485","Summit Lake","WI","45.381803","-89.20073","-6","1"
+"54486","Tigerton","WI","44.734445","-89.04525","-6","1"
+"54487","Tomahawk","WI","45.510639","-89.73162","-6","1"
+"54488","Unity","WI","44.844939","-90.32891","-6","1"
+"54489","Vesper","WI","44.456798","-89.99623","-6","1"
+"54490","Westboro","WI","45.321034","-90.40218","-6","1"
+"54491","White Lake","WI","45.211554","-88.74259","-6","1"
+"54492","Stevens Point","WI","44.509433","-89.528584","-6","1"
+"54493","Willard","WI","44.729524","-90.79351","-6","1"
+"54494","Wisconsin Rapids","WI","44.373468","-89.78761","-6","1"
+"54495","Wisconsin Rapids","WI","44.376507","-89.90771","-6","1"
+"54498","Withee","WI","45.034443","-90.63063","-6","1"
+"54499","Wittenberg","WI","44.797279","-89.18442","-6","1"
+"54501","Rhinelander","WI","45.64672","-89.39408","-6","1"
+"54511","Argonne","WI","45.69606","-88.81274","-6","1"
+"54512","Boulder Junction","WI","46.083178","-89.66605","-6","1"
+"54513","Brantwood","WI","45.54608","-90.13535","-6","1"
+"54514","Butternut","WI","46.024995","-90.44778","-6","1"
+"54515","Catawba","WI","45.536545","-90.50935","-6","1"
+"54517","Clam Lake","WI","46.136639","-90.93065","-6","1"
+"54519","Conover","WI","46.040996","-89.28591","-6","1"
+"54520","Crandon","WI","45.522208","-88.9105","-6","1"
+"54521","Eagle River","WI","45.922669","-89.24825","-6","1"
+"54524","Fifield","WI","45.85263","-90.41709","-6","1"
+"54525","Gile","WI","46.429932","-90.22247","-6","1"
+"54526","Glen Flora","WI","45.500701","-90.85944","-6","1"
+"54527","Glidden","WI","46.119661","-90.64288","-6","1"
+"54529","Harshaw","WI","45.707456","-89.68877","-6","1"
+"54530","Hawkins","WI","45.549336","-90.73047","-6","1"
+"54531","Hazelhurst","WI","45.754415","-89.79791","-6","1"
+"54532","Heafford Junction","WI","45.337678","-89.735524","-6","1"
+"54534","Hurley","WI","46.40553","-90.21811","-6","1"
+"54536","Iron Belt","WI","46.346699","-90.33543","-6","1"
+"54537","Kennan","WI","45.527003","-90.61228","-6","1"
+"54538","Lac Du Flambeau","WI","45.964667","-89.90731","-6","1"
+"54539","Lake Tomahawk","WI","45.811923","-89.57988","-6","1"
+"54540","Land O Lakes","WI","46.149936","-89.36592","-6","1"
+"54541","Laona","WI","45.55375","-88.6624","-6","1"
+"54542","Long Lake","WI","45.920035","-88.68929","-6","1"
+"54543","McNaughton","WI","45.731478","-89.52525","-6","1"
+"54545","Manitowish Waters","WI","46.122746","-89.83996","-6","1"
+"54546","Mellen","WI","46.273618","-90.70102","-6","1"
+"54547","Mercer","WI","46.183572","-90.05754","-6","1"
+"54548","Minocqua","WI","45.869921","-89.79346","-6","1"
+"54550","Montreal","WI","46.410758","-90.25072","-6","1"
+"54551","Presque Isle","WI","46.187253","-89.769399","-6","1"
+"54552","Park Falls","WI","45.927783","-90.34311","-6","1"
+"54554","Phelps","WI","46.056677","-89.08234","-6","1"
+"54555","Phillips","WI","45.716124","-90.40013","-6","1"
+"54556","Prentice","WI","45.549425","-90.31571","-6","1"
+"54557","Presque Isle","WI","46.221041","-89.73707","-6","1"
+"54558","Saint Germain","WI","45.914371","-89.4897","-6","1"
+"54559","Saxon","WI","46.495575","-90.45101","-6","1"
+"54560","Sayner","WI","45.995755","-89.52565","-6","1"
+"54561","Star Lake","WI","46.058408","-89.4516","-6","1"
+"54562","Three Lakes","WI","45.815926","-89.10942","-6","1"
+"54563","Tony","WI","45.477056","-90.98354","-6","1"
+"54564","Tripoli","WI","45.63298","-89.96658","-6","1"
+"54565","Upson","WI","46.309371","-90.4354","-6","1"
+"54566","Wabeno","WI","45.432682","-88.67339","-6","1"
+"54568","Woodruff","WI","45.924341","-89.68496","-6","1"
+"54601","La Crosse","WI","43.797116","-91.21141","-6","1"
+"54602","La Crosse","WI","43.907739","-91.167621","-6","1"
+"54603","La Crosse","WI","43.848665","-91.24922","-6","1"
+"54610","Alma","WI","44.362741","-91.85287","-6","1"
+"54611","Alma Center","WI","44.44202","-90.93859","-6","1"
+"54612","Arcadia","WI","44.253423","-91.48885","-6","1"
+"54613","Arkdale","WI","44.061018","-89.90838","-6","1"
+"54614","Bangor","WI","43.894741","-90.97441","-6","1"
+"54615","Black River Falls","WI","44.277231","-90.80066","-6","1"
+"54616","Blair","WI","44.293183","-91.23075","-6","1"
+"54618","Camp Douglas","WI","43.95685","-90.29445","-6","1"
+"54619","Cashton","WI","43.749142","-90.78473","-6","1"
+"54620","Cataract","WI","44.087601","-90.842289","-6","1"
+"54621","Chaseburg","WI","43.659389","-91.08195","-6","1"
+"54622","Cochrane","WI","44.248179","-91.83124","-6","1"
+"54623","Coon Valley","WI","43.713575","-91.02348","-6","1"
+"54624","De Soto","WI","43.433893","-91.15949","-6","1"
+"54625","Dodge","WI","44.130528","-91.52601","-6","1"
+"54626","Eastman","WI","43.217285","-91.05946","-6","1"
+"54627","Ettrick","WI","44.168986","-91.25737","-6","1"
+"54628","Ferryville","WI","43.373139","-91.0025","-6","1"
+"54629","Fountain City","WI","44.13288","-91.67722","-6","1"
+"54630","Galesville","WI","44.087366","-91.35965","-6","1"
+"54631","Gays Mills","WI","43.291992","-90.83048","-6","1"
+"54632","Genoa","WI","43.559832","-91.16957","-6","1"
+"54634","Hillsboro","WI","43.610055","-90.40896","-6","1"
+"54635","Hixton","WI","44.400995","-91.04608","-6","1"
+"54636","Holmen","WI","43.978816","-91.2512","-6","1"
+"54637","Hustler","WI","43.880649","-90.27423","-6","1"
+"54638","Kendall","WI","43.795422","-90.37609","-6","1"
+"54639","La Farge","WI","43.610629","-90.62108","-6","1"
+"54640","Lynxville","WI","43.246161","-91.05429","-6","1"
+"54641","Mather","WI","43.94521","-90.049489","-6","1"
+"54642","Melrose","WI","44.15175","-91.04558","-6","1"
+"54643","Millston","WI","44.186869","-90.635831","-6","1"
+"54644","Mindoro","WI","44.029269","-91.06484","-6","1"
+"54645","Mount Sterling","WI","43.31493","-90.9287","-6","1"
+"54646","Necedah","WI","44.057528","-90.07117","-6","1"
+"54648","Norwalk","WI","43.836783","-90.62066","-6","1"
+"54649","Oakdale","WI","43.971514","-90.361161","-6","1"
+"54650","Onalaska","WI","43.899664","-91.22963","-6","1"
+"54651","Ontario","WI","43.740893","-90.56934","-6","1"
+"54652","Readstown","WI","43.454264","-90.76116","-6","1"
+"54653","Rockland","WI","43.869244","-90.91873","-6","1"
+"54654","Seneca","WI","43.265154","-90.959","-6","1"
+"54655","Soldiers Grove","WI","43.388055","-90.76632","-6","1"
+"54656","Sparta","WI","43.96977","-90.80796","-6","1"
+"54657","Steuben","WI","43.194284","-90.8911","-6","1"
+"54658","Stoddard","WI","43.68804","-91.19665","-6","1"
+"54659","Taylor","WI","44.309131","-91.11676","-6","1"
+"54660","Tomah","WI","43.984412","-90.48416","-6","1"
+"54661","Trempealeau","WI","44.026843","-91.4513","-6","1"
+"54662","Tunnel City","WI","44.003084","-90.562005","-6","1"
+"54664","Viola","WI","43.502238","-90.65131","-6","1"
+"54665","Viroqua","WI","43.543934","-90.89904","-6","1"
+"54666","Warrens","WI","44.134587","-90.43289","-6","1"
+"54667","Westby","WI","43.656393","-90.85562","-6","1"
+"54669","West Salem","WI","43.903949","-91.08847","-6","1"
+"54670","Wilton","WI","43.833159","-90.49044","-6","1"
+"54699","West Salem","WI","43.900433","-91.071758","-6","1"
+"54701","Eau Claire","WI","44.780427","-91.48065","-6","1"
+"54702","Eau Claire","WI","44.726626","-91.285931","-6","1"
+"54703","Eau Claire","WI","44.82961","-91.50521","-6","1"
+"54720","Altoona","WI","44.80416","-91.43963","-6","1"
+"54721","Arkansaw","WI","44.62411","-92.07828","-6","1"
+"54722","Augusta","WI","44.699923","-91.12509","-6","1"
+"54723","Bay City","WI","44.608838","-92.44607","-6","1"
+"54724","Bloomer","WI","45.101683","-91.48415","-6","1"
+"54725","Boyceville","WI","45.062111","-92.02641","-6","1"
+"54726","Boyd","WI","44.946486","-91.02282","-6","1"
+"54727","Cadott","WI","44.963809","-91.16181","-6","1"
+"54728","Chetek","WI","45.312195","-91.64173","-6","1"
+"54729","Chippewa Falls","WI","44.932711","-91.38877","-6","1"
+"54730","Colfax","WI","45.012181","-91.73021","-6","1"
+"54731","Conrath","WI","45.36469","-91.04968","-6","1"
+"54732","Cornell","WI","45.155211","-91.17005","-6","1"
+"54733","Dallas","WI","45.275752","-91.85084","-6","1"
+"54734","Downing","WI","45.086186","-92.12453","-6","1"
+"54735","Downsville","WI","44.946496","-91.90344","-6","1"
+"54736","Durand","WI","44.613891","-91.92402","-6","1"
+"54737","Eau Galle","WI","44.718959","-91.99704","-6","1"
+"54738","Eleva","WI","44.586469","-91.48873","-6","1"
+"54739","Elk Mound","WI","44.872678","-91.69231","-6","1"
+"54740","Elmwood","WI","44.763269","-92.1517","-6","1"
+"54741","Fairchild","WI","44.601345","-90.98854","-6","1"
+"54742","Fall Creek","WI","44.763678","-91.29172","-6","1"
+"54743","Gilmanton","WI","44.311074","-91.806396","-6","1"
+"54744","Hillsdale","WI","45.319786","-91.881754","-6","1"
+"54745","Holcombe","WI","45.253108","-91.1559","-6","1"
+"54746","Humbird","WI","44.550251","-90.89542","-6","1"
+"54747","Independence","WI","44.38161","-91.47913","-6","1"
+"54748","Jim Falls","WI","45.074725","-91.2563","-6","1"
+"54749","Knapp","WI","44.949207","-92.08073","-6","1"
+"54750","Maiden Rock","WI","44.615442","-92.30798","-6","1"
+"54751","Menomonie","WI","44.86877","-91.92915","-6","1"
+"54754","Merrillan","WI","44.434537","-90.79473","-6","1"
+"54755","Mondovi","WI","44.584633","-91.68767","-6","1"
+"54756","Nelson","WI","44.451724","-91.95785","-6","1"
+"54757","New Auburn","WI","45.235611","-91.52127","-6","1"
+"54758","Osseo","WI","44.555876","-91.21713","-6","1"
+"54759","Pepin","WI","44.478326","-92.14053","-6","1"
+"54760","Pigeon Falls","WI","44.424662","-91.20833","-6","1"
+"54761","Plum City","WI","44.624559","-92.17732","-6","1"
+"54762","Prairie Farm","WI","45.24647","-91.99273","-6","1"
+"54763","Ridgeland","WI","45.186997","-91.88073","-6","1"
+"54764","Rock Falls","WI","44.946496","-91.90344","-6","1"
+"54765","Sand Creek","WI","45.142866","-91.699794","-6","1"
+"54766","Sheldon","WI","45.323865","-90.89376","-6","1"
+"54767","Spring Valley","WI","44.833746","-92.25937","-6","1"
+"54768","Stanley","WI","44.963528","-90.93012","-6","1"
+"54769","Stockholm","WI","44.530201","-92.23721","-6","1"
+"54770","Strum","WI","44.545046","-91.38753","-6","1"
+"54771","Thorp","WI","44.95298","-90.79784","-6","1"
+"54772","Wheeler","WI","45.084813","-91.89724","-6","1"
+"54773","Whitehall","WI","44.377781","-91.30948","-6","1"
+"54774","Chippewa Falls","WI","45.07413","-91.294397","-6","1"
+"54801","Spooner","WI","45.850775","-91.94361","-6","1"
+"54805","Almena","WI","45.418325","-92.02914","-6","1"
+"54806","Ashland","WI","46.577191","-90.89707","-6","1"
+"54810","Balsam Lake","WI","45.455304","-92.40153","-6","1"
+"54812","Barron","WI","45.39701","-91.86337","-6","1"
+"54813","Barronett","WI","45.646145","-92.01923","-6","1"
+"54814","Bayfield","WI","46.856701","-90.85401","-6","1"
+"54816","Benoit","WI","46.682796","-91.143254","-6","1"
+"54817","Birchwood","WI","45.661506","-91.54526","-6","1"
+"54818","Brill","WI","45.423409","-91.848206","-6","1"
+"54819","Bruce","WI","45.45273","-91.29437","-6","1"
+"54820","Brule","WI","46.588243","-91.55208","-6","1"
+"54821","Cable","WI","46.213138","-91.13997","-6","1"
+"54822","Cameron","WI","45.401622","-91.72727","-6","1"
+"54824","Centuria","WI","45.454867","-92.52701","-6","1"
+"54826","Comstock","WI","45.505963","-92.17646","-6","1"
+"54827","Cornucopia","WI","46.802909","-91.10944","-6","1"
+"54828","Couderay","WI","45.858431","-91.25765","-6","1"
+"54829","Cumberland","WI","45.552434","-92.05004","-6","1"
+"54830","Danbury","WI","46.036193","-92.21802","-6","1"
+"54832","Drummond","WI","46.326236","-91.29643","-6","1"
+"54834","Edgewater","WI","45.742668","-91.47648","-6","1"
+"54835","Exeland","WI","45.671767","-91.23317","-6","1"
+"54836","Foxboro","WI","46.449996","-92.21831","-6","1"
+"54837","Frederic","WI","45.679878","-92.42153","-6","1"
+"54838","Gordon","WI","46.233591","-91.81795","-6","1"
+"54839","Grand View","WI","46.360155","-91.14425","-6","1"
+"54840","Grantsburg","WI","45.75118","-92.67182","-6","1"
+"54841","Haugen","WI","45.612444","-91.77624","-6","1"
+"54842","Hawthorne","WI","46.513247","-91.84824","-6","1"
+"54843","Hayward","WI","46.005082","-91.35255","-6","1"
+"54844","Herbster","WI","46.765166","-91.21312","-6","1"
+"54845","Hertel","WI","45.811685","-92.13692","-6","1"
+"54846","High Bridge","WI","46.372151","-90.74865","-6","1"
+"54847","Iron River","WI","46.553351","-91.37996","-6","1"
+"54848","Ladysmith","WI","45.477445","-91.105","-6","1"
+"54849","Lake Nebagamon","WI","46.476428","-91.67634","-6","1"
+"54850","La Pointe","WI","46.799835","-90.73209","-6","1"
+"54851","Lewis","WI","45.468941","-92.521938","-6","1"
+"54853","Luck","WI","45.577963","-92.45652","-6","1"
+"54854","Maple","WI","46.626518","-91.6952","-6","1"
+"54855","Marengo","WI","46.396053","-90.81506","-6","1"
+"54856","Mason","WI","46.433167","-91.10883","-6","1"
+"54857","Mikana","WI","45.591546","-91.60046","-6","1"
+"54858","Milltown","WI","45.52624","-92.46971","-6","1"
+"54859","Minong","WI","46.127976","-91.84389","-6","1"
+"54861","Odanah","WI","46.599122","-90.65361","-6","1"
+"54862","Ojibwa","WI","45.766112","-91.13603","-6","1"
+"54863","Stanley","WI","45.458812","-91.712017","-6","1"
+"54864","Poplar","WI","46.587809","-91.8074","-6","1"
+"54865","Port Wing","WI","46.757192","-91.39611","-6","1"
+"54867","Radisson","WI","45.767489","-91.22193","-6","1"
+"54868","Rice Lake","WI","45.517226","-91.72638","-6","1"
+"54870","Sarona","WI","45.714265","-91.77498","-6","1"
+"54871","Shell Lake","WI","45.750367","-91.99048","-6","1"
+"54872","Siren","WI","45.780793","-92.39152","-6","1"
+"54873","Solon Springs","WI","46.354613","-91.71166","-6","1"
+"54874","South Range","WI","46.58521","-91.95129","-6","1"
+"54875","Springbrook","WI","45.947509","-91.67526","-6","1"
+"54876","Stone Lake","WI","45.842713","-91.47902","-6","1"
+"54880","Superior","WI","46.684273","-92.09474","-6","1"
+"54886","Winter","WI","45.882227","-90.967711","-6","1"
+"54888","Trego","WI","45.967422","-91.87907","-6","1"
+"54889","Turtle Lake","WI","45.407855","-92.15619","-6","1"
+"54890","Wascott","WI","46.525129","-91.921631","-6","1"
+"54891","Washburn","WI","46.69297","-90.93744","-6","1"
+"54893","Webster","WI","45.870441","-92.29416","-6","1"
+"54895","Weyerhaeuser","WI","45.422669","-91.42678","-6","1"
+"54896","Winter","WI","45.843581","-90.94323","-6","1"
+"54901","Oshkosh","WI","44.043984","-88.53528","-6","1"
+"54902","Oshkosh","WI","43.988616","-88.54699","-6","1"
+"54903","Oshkosh","WI","44.06858","-88.644873","-6","1"
+"54904","Oshkosh","WI","44.018871","-88.61324","-6","1"
+"54906","Oshkosh","WI","44.06858","-88.644873","-6","1"
+"54909","Almond","WI","44.28018","-89.36002","-6","1"
+"54911","Appleton","WI","44.276986","-88.39445","-6","1"
+"54912","Appleton","WI","44.416326","-88.464873","-6","1"
+"54913","Appleton","WI","44.322836","-88.40492","-6","1"
+"54914","Appleton","WI","44.267411","-88.4383","-6","1"
+"54915","Appleton","WI","44.244753","-88.37783","-6","1"
+"54919","Appleton","WI","44.416326","-88.464873","-6","1"
+"54921","Bancroft","WI","44.307561","-89.54673","-6","1"
+"54922","Bear Creek","WI","44.538848","-88.74381","-6","1"
+"54923","Berlin","WI","43.978561","-88.95413","-6","1"
+"54926","Big Falls","WI","44.617819","-89.016622","-6","1"
+"54927","Butte Des Morts","WI","44.101044","-88.65531","-6","1"
+"54928","Caroline","WI","44.732083","-88.88507","-6","1"
+"54929","Clintonville","WI","44.63605","-88.74673","-6","1"
+"54930","Coloma","WI","44.025668","-89.52124","-6","1"
+"54931","Dale","WI","44.416326","-88.464873","-6","1"
+"54932","Eldorado","WI","43.830749","-88.6258","-6","1"
+"54933","Embarrass","WI","44.666988","-88.70686","-6","1"
+"54934","Eureka","WI","44.00443","-88.84108","-6","1"
+"54935","Fond Du Lac","WI","43.769889","-88.4281","-6","1"
+"54936","Fond Du Lac","WI","43.740559","-88.522984","-6","1"
+"54937","Fond Du Lac","WI","43.785391","-88.48704","-6","1"
+"54940","Fremont","WI","44.237843","-88.84998","-6","1"
+"54941","Green Lake","WI","43.841808","-88.97443","-6","1"
+"54942","Greenville","WI","44.29382","-88.53557","-6","1"
+"54943","Hancock","WI","44.122177","-89.57305","-6","1"
+"54944","Hortonville","WI","44.333183","-88.6167","-6","1"
+"54945","Iola","WI","44.558941","-89.13383","-6","1"
+"54946","King","WI","44.336537","-89.146258","-6","1"
+"54947","Larsen","WI","44.191271","-88.68846","-6","1"
+"54948","Leopolis","WI","44.779838","-88.87123","-6","1"
+"54949","Manawa","WI","44.472791","-88.91625","-6","1"
+"54950","Marion","WI","44.669461","-88.89693","-6","1"
+"54951","Medina","WI","44.416326","-88.464873","-6","1"
+"54952","Menasha","WI","44.212448","-88.40959","-6","1"
+"54956","Neenah","WI","44.180085","-88.48273","-6","1"
+"54957","Neenah","WI","44.198944","-88.678863","-6","1"
+"54960","Neshkoro","WI","43.959371","-89.22575","-6","1"
+"54961","New London","WI","44.394143","-88.75521","-6","1"
+"54962","Ogdensburg","WI","44.481372","-89.03101","-6","1"
+"54963","Omro","WI","44.042594","-88.7627","-6","1"
+"54964","Pickett","WI","43.923141","-88.72654","-6","1"
+"54965","Pine River","WI","44.167646","-89.04218","-6","1"
+"54966","Plainfield","WI","44.220945","-89.51227","-6","1"
+"54967","Poy Sippi","WI","44.13777","-88.99443","-6","1"
+"54968","Princeton","WI","43.842646","-89.13955","-6","1"
+"54969","Readfield","WI","44.269991","-88.775457","-6","1"
+"54970","Redgranite","WI","44.057375","-89.09788","-6","1"
+"54971","Ripon","WI","43.849309","-88.84494","-6","1"
+"54974","Rosendale","WI","43.797693","-88.66261","-6","1"
+"54975","Royalton","WI","44.461926","-88.915027","-6","1"
+"54976","Saxeville","WI","44.176716","-89.11271","-6","1"
+"54977","Scandinavia","WI","44.454684","-89.15371","-6","1"
+"54978","Tilleda","WI","44.805167","-88.9006","-6","1"
+"54979","Van Dyne","WI","43.877109","-88.52573","-6","1"
+"54980","Waukau","WI","43.987186","-88.77247","-6","1"
+"54981","Waupaca","WI","44.331217","-89.11499","-6","1"
+"54982","Wautoma","WI","44.064068","-89.29417","-6","1"
+"54983","Weyauwega","WI","44.319005","-88.9404","-6","1"
+"54984","Wild Rose","WI","44.186455","-89.20231","-6","1"
+"54985","Winnebago","WI","44.075084","-88.51758","-6","1"
+"54986","Winneconne","WI","44.110806","-88.73155","-6","1"
+"54990","Iola","WI","44.461926","-88.915027","-6","1"
+"55001","Afton","MN","44.903133","-92.81904","-6","1"
+"55002","Almelund","MN","45.513447","-92.894239","-6","1"
+"55003","Bayport","MN","45.017767","-92.78039","-6","1"
+"55005","Bethel","MN","45.395494","-93.23584","-6","1"
+"55006","Braham","MN","45.722","-93.19781","-6","1"
+"55007","Brook Park","MN","45.955831","-93.1044","-6","1"
+"55008","Cambridge","MN","45.566735","-93.24381","-6","1"
+"55009","Cannon Falls","MN","44.493575","-92.89402","-6","1"
+"55010","Castle Rock","MN","44.544465","-93.15353","-6","1"
+"55011","Cedar","MN","45.335128","-93.27434","-6","1"
+"55012","Center City","MN","45.41766","-92.80597","-6","1"
+"55013","Chisago City","MN","45.365164","-92.88864","-6","1"
+"55014","Circle Pines","MN","45.153516","-93.14463","-6","1"
+"55016","Cottage Grove","MN","44.830966","-92.93739","-6","1"
+"55017","Dalbo","MN","45.677366","-93.42013","-6","1"
+"55018","Dennison","MN","44.422975","-93.00089","-6","1"
+"55019","Dundas","MN","44.415567","-93.23269","-6","1"
+"55020","Elko","MN","44.571365","-93.36011","-6","1"
+"55021","Faribault","MN","44.29478","-93.28732","-6","1"
+"55024","Farmington","MN","44.649263","-93.15222","-6","1"
+"55025","Forest Lake","MN","45.272117","-92.9911","-6","1"
+"55026","Frontenac","MN","44.523212","-92.33216","-6","1"
+"55027","Goodhue","MN","44.408846","-92.63312","-6","1"
+"55029","Grandy","MN","45.642235","-93.201107","-6","1"
+"55030","Grasston","MN","45.842603","-93.11924","-6","1"
+"55031","Hampton","MN","44.607553","-92.98548","-6","1"
+"55032","Harris","MN","45.586488","-93.01179","-6","1"
+"55033","Hastings","MN","44.726517","-92.86147","-6","1"
+"55036","Henriette","MN","45.871294","-93.11852","-6","1"
+"55037","Hinckley","MN","46.008128","-92.79349","-6","1"
+"55038","Hugo","MN","45.161267","-92.99596","-6","1"
+"55040","Isanti","MN","45.470239","-93.27947","-6","1"
+"55041","Lake City","MN","44.42278","-92.2948","-6","1"
+"55042","Lake Elmo","MN","44.999023","-92.90939","-6","1"
+"55043","Lakeland","MN","44.9316","-92.77001","-6","1"
+"55044","Lakeville","MN","44.669564","-93.26654","-6","1"
+"55045","Lindstrom","MN","45.387281","-92.83551","-6","1"
+"55046","Lonsdale","MN","44.464394","-93.42243","-6","1"
+"55047","Marine On Saint Croix","MN","45.195606","-92.81649","-6","1"
+"55049","Medford","MN","44.172277","-93.23924","-6","1"
+"55051","Mora","MN","45.897003","-93.29452","-6","1"
+"55052","Morristown","MN","44.232811","-93.43992","-6","1"
+"55053","Nerstrand","MN","44.338132","-93.05543","-6","1"
+"55054","New Market","MN","44.571056","-93.354267","-6","1"
+"55055","Newport","MN","44.871166","-93.00187","-6","1"
+"55056","North Branch","MN","45.509818","-92.97816","-6","1"
+"55057","Northfield","MN","44.459969","-93.16623","-6","1"
+"55060","Owatonna","MN","44.07393","-93.22716","-6","1"
+"55063","Pine City","MN","45.824236","-92.95813","-6","1"
+"55065","Randolph","MN","44.534866","-93.02959","-6","1"
+"55066","Red Wing","MN","44.539036","-92.53637","-6","1"
+"55067","Rock Creek","MN","46.074687","-92.718004","-6","1"
+"55068","Rosemount","MN","44.732105","-93.13437","-6","1"
+"55069","Rush City","MN","45.690784","-92.96843","-6","1"
+"55070","Saint Francis","MN","45.395912","-93.37005","-6","1"
+"55071","Saint Paul Park","MN","44.835366","-92.99254","-6","1"
+"55072","Sandstone","MN","46.131798","-92.71377","-6","1"
+"55073","Scandia","MN","45.275771","-92.83001","-6","1"
+"55074","Shafer","MN","45.381784","-92.7278","-6","1"
+"55075","South Saint Paul","MN","44.887966","-93.04546","-6","1"
+"55076","Inver Grove Heights","MN","44.844833","-93.03528","-6","1"
+"55077","Inver Grove Heights","MN","44.825391","-93.06893","-6","1"
+"55078","Stacy","MN","45.513447","-92.894239","-6","1"
+"55079","Stacy","MN","45.403157","-93.02829","-6","1"
+"55080","Stanchfield","MN","45.651767","-93.21439","-6","1"
+"55082","Stillwater","MN","45.054551","-92.82581","-6","1"
+"55083","Stillwater","MN","45.021016","-92.983726","-6","1"
+"55084","Taylors Falls","MN","45.424065","-92.68321","-6","1"
+"55085","Vermillion","MN","44.674317","-92.96823","-6","1"
+"55087","Warsaw","MN","44.247889","-93.39305","-6","1"
+"55088","Webster","MN","44.541055","-93.38713","-6","1"
+"55089","Welch","MN","44.586242","-92.70293","-6","1"
+"55090","Willernie","MN","45.054666","-92.95703","-6","1"
+"55092","Wyoming","MN","45.329115","-93.06834","-6","1"
+"55101","Saint Paul","MN","44.964852","-93.08397","-6","1"
+"55102","Saint Paul","MN","44.935315","-93.12049","-6","1"
+"55103","Saint Paul","MN","44.964115","-93.12261","-6","1"
+"55104","Saint Paul","MN","44.953665","-93.15922","-6","1"
+"55105","Saint Paul","MN","44.934465","-93.16554","-6","1"
+"55106","Saint Paul","MN","44.967565","-93.05001","-6","1"
+"55107","Saint Paul","MN","44.928315","-93.08876","-6","1"
+"55108","Saint Paul","MN","44.982515","-93.17489","-6","1"
+"55109","Saint Paul","MN","45.010632","-93.01845","-6","1"
+"55110","Saint Paul","MN","45.081266","-93.01146","-6","1"
+"55111","Saint Paul","MN","44.882838","-93.200671","-6","1"
+"55112","Saint Paul","MN","45.076365","-93.19335","-6","1"
+"55113","Saint Paul","MN","45.011215","-93.15536","-6","1"
+"55114","Saint Paul","MN","44.964815","-93.19581","-6","1"
+"55115","Saint Paul","MN","45.060048","-92.95762","-6","1"
+"55116","Saint Paul","MN","44.913815","-93.17459","-6","1"
+"55117","Saint Paul","MN","44.989065","-93.10666","-6","1"
+"55118","Saint Paul","MN","44.903165","-93.10026","-6","1"
+"55119","Saint Paul","MN","44.957315","-93.00616","-6","1"
+"55120","Saint Paul","MN","44.873398","-93.14538","-6","1"
+"55121","Saint Paul","MN","44.844965","-93.14431","-6","1"
+"55122","Saint Paul","MN","44.804548","-93.19871","-6","1"
+"55123","Saint Paul","MN","44.804048","-93.13378","-6","1"
+"55124","Saint Paul","MN","44.743963","-93.20624","-6","1"
+"55125","Saint Paul","MN","44.921982","-92.94234","-6","1"
+"55126","Saint Paul","MN","45.085643","-93.1353","-6","1"
+"55127","Saint Paul","MN","45.076708","-93.0828","-6","1"
+"55128","Saint Paul","MN","44.985792","-92.96532","-6","1"
+"55129","Saint Paul","MN","44.896938","-92.90241","-6","1"
+"55133","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55144","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55145","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55146","Saint Paul","MN","44.942656","-93.082793","-6","1"
+"55150","Mendota","MN","44.884265","-93.16415","-6","1"
+"55155","Saint Paul","MN","44.952165","-93.095518","-6","1"
+"55161","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55164","Saint Paul","MN","44.990915","-93.106593","-6","1"
+"55165","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55166","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55168","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55169","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55170","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55171","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55172","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55175","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55177","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55182","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55184","Duluth","MN","46.837172","-92.202829","-6","1"
+"55187","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55188","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55189","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55190","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55191","Saint Paul","MN","45.005902","-93.105869","-6","1"
+"55272","Kroschel","MN","46.147161","-93.084687","-6","1"
+"55301","Albertville","MN","45.237867","-93.66261","-6","1"
+"55302","Annandale","MN","45.246631","-94.11692","-6","1"
+"55303","Anoka","MN","45.247509","-93.418","-6","1"
+"55304","Andover","MN","45.254715","-93.28652","-6","1"
+"55305","Hopkins","MN","44.953763","-93.43346","-6","1"
+"55306","Burnsville","MN","44.732569","-93.28909","-6","1"
+"55307","Arlington","MN","44.613278","-94.10728","-6","1"
+"55308","Becker","MN","45.426203","-93.85017","-6","1"
+"55309","Big Lake","MN","45.358004","-93.74294","-6","1"
+"55310","Bird Island","MN","44.761856","-94.8845","-6","1"
+"55311","Osseo","MN","45.102133","-93.48757","-6","1"
+"55312","Brownton","MN","44.723259","-94.33922","-6","1"
+"55313","Buffalo","MN","45.175558","-93.85441","-6","1"
+"55314","Buffalo Lake","MN","44.751001","-94.60782","-6","1"
+"55315","Carver","MN","44.736595","-93.65619","-6","1"
+"55316","Champlin","MN","45.170714","-93.38452","-6","1"
+"55317","Chanhassen","MN","44.866236","-93.54487","-6","1"
+"55318","Chaska","MN","44.809954","-93.6105","-6","1"
+"55319","Clear Lake","MN","45.470068","-93.92956","-6","1"
+"55320","Clearwater","MN","45.387625","-94.0599","-6","1"
+"55321","Cokato","MN","45.085142","-94.18748","-6","1"
+"55322","Cologne","MN","44.768762","-93.77839","-6","1"
+"55323","Crystal Bay","MN","45.015914","-93.47188","-6","1"
+"55324","Darwin","MN","45.057766","-94.40368","-6","1"
+"55325","Dassel","MN","45.091115","-94.31758","-6","1"
+"55327","Dayton","MN","45.217054","-93.47612","-6","1"
+"55328","Delano","MN","45.032489","-93.79591","-6","1"
+"55329","Eden Valley","MN","45.321197","-94.56778","-6","1"
+"55330","Elk River","MN","45.317152","-93.58117","-6","1"
+"55331","Excelsior","MN","44.901368","-93.58278","-6","1"
+"55332","Fairfax","MN","44.529702","-94.71718","-6","1"
+"55333","Franklin","MN","44.541889","-94.8735","-6","1"
+"55334","Gaylord","MN","44.542729","-94.21773","-6","1"
+"55335","Gibbon","MN","44.527707","-94.53092","-6","1"
+"55336","Glencoe","MN","44.773886","-94.17294","-6","1"
+"55337","Burnsville","MN","44.770297","-93.27302","-6","1"
+"55338","Green Isle","MN","44.670908","-94.01337","-6","1"
+"55339","Hamburg","MN","44.730662","-93.9577","-6","1"
+"55340","Hamel","MN","45.07343","-93.56455","-6","1"
+"55341","Hanover","MN","45.15546","-93.66369","-6","1"
+"55342","Hector","MN","44.74323","-94.72447","-6","1"
+"55343","Hopkins","MN","44.921599","-93.40857","-6","1"
+"55344","Eden Prairie","MN","44.867013","-93.42557","-6","1"
+"55345","Minnetonka","MN","44.915413","-93.48443","-6","1"
+"55346","Eden Prairie","MN","44.880435","-93.4869","-6","1"
+"55347","Eden Prairie","MN","44.831413","-93.46031","-6","1"
+"55348","Maple Plain","MN","44.848263","-93.398727","-6","1"
+"55349","Howard Lake","MN","45.064272","-94.07175","-6","1"
+"55350","Hutchinson","MN","44.896255","-94.38604","-6","1"
+"55352","Jordan","MN","44.657463","-93.6133","-6","1"
+"55353","Kimball","MN","45.328802","-94.32528","-6","1"
+"55354","Lester Prairie","MN","44.881515","-94.05846","-6","1"
+"55355","Litchfield","MN","45.104473","-94.52868","-6","1"
+"55356","Long Lake","MN","44.985463","-93.58388","-6","1"
+"55357","Loretto","MN","45.088013","-93.65053","-6","1"
+"55358","Maple Lake","MN","45.244744","-94.00289","-6","1"
+"55359","Maple Plain","MN","45.002212","-93.69319","-6","1"
+"55360","Mayer","MN","44.909362","-93.89981","-6","1"
+"55361","Minnetonka Beach","MN","44.940212","-93.592735","-6","1"
+"55362","Monticello","MN","45.301337","-93.80774","-6","1"
+"55363","Montrose","MN","45.046143","-93.92085","-6","1"
+"55364","Mound","MN","44.933712","-93.66038","-6","1"
+"55365","Monticello","MN","45.200875","-93.888099","-6","1"
+"55366","New Auburn","MN","44.673454","-94.229311","-6","1"
+"55367","New Germany","MN","44.886776","-93.97154","-6","1"
+"55368","Norwood","MN","44.756883","-93.91666","-6","1"
+"55369","Osseo","MN","45.120764","-93.43183","-6","1"
+"55370","Plato","MN","44.787651","-94.04714","-6","1"
+"55371","Princeton","MN","45.576431","-93.57644","-6","1"
+"55372","Prior Lake","MN","44.704646","-93.42139","-6","1"
+"55373","Rockford","MN","45.087513","-93.73548","-6","1"
+"55374","Rogers","MN","45.197646","-93.57104","-6","1"
+"55375","Saint Bonifacius","MN","44.906512","-93.7439","-6","1"
+"55376","Saint Michael","MN","45.20382","-93.67618","-6","1"
+"55377","Santiago","MN","45.540181","-93.815434","-6","1"
+"55378","Savage","MN","44.761796","-93.3722","-6","1"
+"55379","Shakopee","MN","44.776138","-93.52556","-6","1"
+"55380","Silver Creek","MN","45.315823","-93.979766","-6","1"
+"55381","Silver Lake","MN","44.904987","-94.18802","-6","1"
+"55382","South Haven","MN","45.299358","-94.19821","-6","1"
+"55383","Norwood","MN","44.805487","-93.766524","-6","1"
+"55384","Spring Park","MN","44.936423","-93.62868","-6","1"
+"55385","Stewart","MN","44.724926","-94.49346","-6","1"
+"55386","Victoria","MN","44.858595","-93.66341","-6","1"
+"55387","Waconia","MN","44.849912","-93.78514","-6","1"
+"55388","Watertown","MN","44.955136","-93.84467","-6","1"
+"55389","Watkins","MN","45.291986","-94.43811","-6","1"
+"55390","Waverly","MN","45.066811","-93.97836","-6","1"
+"55391","Wayzata","MN","44.963063","-93.52912","-6","1"
+"55392","Navarre","MN","45.015914","-93.47188","-6","1"
+"55393","Maple Plain","MN","45.200875","-93.888099","-6","1"
+"55394","Young America","MN","44.805487","-93.766524","-6","1"
+"55395","Winsted","MN","44.960829","-94.05525","-6","1"
+"55396","Winthrop","MN","44.536882","-94.36811","-6","1"
+"55397","Young America","MN","44.801162","-93.92368","-6","1"
+"55398","Zimmerman","MN","45.455085","-93.57873","-6","1"
+"55399","Young America","MN","44.805487","-93.766524","-6","1"
+"55401","Minneapolis","MN","44.984615","-93.27137","-6","1"
+"55402","Minneapolis","MN","44.975565","-93.27053","-6","1"
+"55403","Minneapolis","MN","44.971765","-93.28557","-6","1"
+"55404","Minneapolis","MN","44.963365","-93.26179","-6","1"
+"55405","Minneapolis","MN","44.971798","-93.30273","-6","1"
+"55406","Minneapolis","MN","44.938615","-93.22082","-6","1"
+"55407","Minneapolis","MN","44.934915","-93.25424","-6","1"
+"55408","Minneapolis","MN","44.947515","-93.28742","-6","1"
+"55409","Minneapolis","MN","44.924115","-93.28362","-6","1"
+"55410","Minneapolis","MN","44.911564","-93.31947","-6","1"
+"55411","Minneapolis","MN","44.999165","-93.29823","-6","1"
+"55412","Minneapolis","MN","45.027715","-93.30337","-6","1"
+"55413","Minneapolis","MN","44.997665","-93.24927","-6","1"
+"55414","Minneapolis","MN","44.980379","-93.23003","-6","1"
+"55415","Minneapolis","MN","44.973415","-93.25941","-6","1"
+"55416","Minneapolis","MN","44.946664","-93.34215","-6","1"
+"55417","Minneapolis","MN","44.905365","-93.23662","-6","1"
+"55418","Minneapolis","MN","45.019315","-93.24304","-6","1"
+"55419","Minneapolis","MN","44.902414","-93.29012","-6","1"
+"55420","Minneapolis","MN","44.837964","-93.27657","-6","1"
+"55421","Minneapolis","MN","45.050434","-93.25007","-6","1"
+"55422","Minneapolis","MN","45.014764","-93.33965","-6","1"
+"55423","Minneapolis","MN","44.877164","-93.28124","-6","1"
+"55424","Minneapolis","MN","44.904414","-93.34045","-6","1"
+"55425","Minneapolis","MN","44.846765","-93.2449","-6","1"
+"55426","Minneapolis","MN","44.952064","-93.37795","-6","1"
+"55427","Minneapolis","MN","45.006764","-93.38223","-6","1"
+"55428","Minneapolis","MN","45.059997","-93.37702","-6","1"
+"55429","Minneapolis","MN","45.064714","-93.34155","-6","1"
+"55430","Minneapolis","MN","45.059265","-93.29977","-6","1"
+"55431","Minneapolis","MN","44.829564","-93.30982","-6","1"
+"55432","Minneapolis","MN","45.095674","-93.25336","-6","1"
+"55433","Minneapolis","MN","45.163848","-93.3195","-6","1"
+"55434","Minneapolis","MN","45.164248","-93.2531","-6","1"
+"55435","Minneapolis","MN","44.875614","-93.33487","-6","1"
+"55436","Minneapolis","MN","44.903864","-93.37056","-6","1"
+"55437","Minneapolis","MN","44.822764","-93.34422","-6","1"
+"55438","Minneapolis","MN","44.8257","-93.38212","-6","1"
+"55439","Minneapolis","MN","44.875997","-93.37021","-6","1"
+"55440","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55441","Minneapolis","MN","45.001997","-93.42421","-6","1"
+"55442","Minneapolis","MN","45.046701","-93.42892","-6","1"
+"55443","Minneapolis","MN","45.108581","-93.33988","-6","1"
+"55444","Minneapolis","MN","45.106065","-93.30461","-6","1"
+"55445","Minneapolis","MN","45.112742","-93.3789","-6","1"
+"55446","Minneapolis","MN","45.039312","-93.47988","-6","1"
+"55447","Minneapolis","MN","45.003363","-93.49262","-6","1"
+"55448","Minneapolis","MN","45.186232","-93.29635","-6","1"
+"55449","Minneapolis","MN","45.168287","-93.20001","-6","1"
+"55450","Minneapolis","MN","44.882365","-93.20847","-6","1"
+"55454","Minneapolis","MN","44.969465","-93.24327","-6","1"
+"55455","Minneapolis","MN","44.971965","-93.23588","-6","1"
+"55458","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55459","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55460","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55468","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55470","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55472","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55473","Minneapolis","MN","44.805487","-93.766524","-6","1"
+"55474","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55478","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55479","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55480","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55483","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55484","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55485","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55486","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55487","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55488","Minneapolis","MN","45.015914","-93.47188","-6","1"
+"55530","Elk River","MN","45.281604","-93.546333","-6","1"
+"55550","Young America","MN","44.805487","-93.766524","-6","1"
+"55551","Young America","MN","44.805487","-93.766524","-6","1"
+"55552","Young America","MN","44.805487","-93.766524","-6","1"
+"55553","Young America","MN","44.805487","-93.766524","-6","1"
+"55554","Norwood","MN","44.805487","-93.766524","-6","1"
+"55555","Young America","MN","44.805487","-93.766524","-6","1"
+"55556","Young America","MN","44.805487","-93.766524","-6","1"
+"55557","Young America","MN","44.805487","-93.766524","-6","1"
+"55558","Young America","MN","44.805487","-93.766524","-6","1"
+"55559","Young America","MN","44.805487","-93.766524","-6","1"
+"55560","Young America","MN","44.805487","-93.766524","-6","1"
+"55561","Monticello","MN","44.805487","-93.766524","-6","1"
+"55562","Young America","MN","44.805487","-93.766524","-6","1"
+"55563","Monticello","MN","44.805487","-93.766524","-6","1"
+"55564","Young America","MN","44.805487","-93.766524","-6","1"
+"55565","Monticello","MN","45.200875","-93.888099","-6","1"
+"55566","Young America","MN","44.805487","-93.766524","-6","1"
+"55567","Young America","MN","44.805487","-93.766524","-6","1"
+"55568","Young America","MN","44.805487","-93.766524","-6","1"
+"55569","Osseo","MN","45.015914","-93.47188","-6","1"
+"55570","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55571","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55572","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55573","Young America","MN","45.015914","-93.47188","-6","1"
+"55574","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55575","Howard Lake","MN","45.015914","-93.47188","-6","1"
+"55576","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55577","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55578","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55579","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55580","Monticello","MN","45.200875","-93.888099","-6","1"
+"55581","Monticello","MN","45.200875","-93.888099","-6","1"
+"55582","Monticello","MN","45.200875","-93.888099","-6","1"
+"55583","Norwood","MN","44.805487","-93.766524","-6","1"
+"55584","Monticello","MN","45.200875","-93.888099","-6","1"
+"55585","Monticello","MN","45.200875","-93.888099","-6","1"
+"55586","Monticello","MN","45.200875","-93.888099","-6","1"
+"55587","Monticello","MN","45.200875","-93.888099","-6","1"
+"55588","Monticello","MN","44.989512","-93.880245","-6","1"
+"55589","Monticello","MN","45.200875","-93.888099","-6","1"
+"55590","Monticello","MN","45.200875","-93.888099","-6","1"
+"55591","Monticello","MN","45.200875","-93.888099","-6","1"
+"55592","Maple Plain","MN","45.200875","-93.888099","-6","1"
+"55593","Maple Plain","MN","45.015914","-93.47188","-6","1"
+"55594","Young America","MN","44.805487","-93.766524","-6","1"
+"55595","Loretto","MN","45.015914","-93.47188","-6","1"
+"55596","Loretto","MN","45.015914","-93.47188","-6","1"
+"55597","Loretto","MN","45.015914","-93.47188","-6","1"
+"55598","Loretto","MN","45.015914","-93.47188","-6","1"
+"55599","Loretto","MN","45.015914","-93.47188","-6","1"
+"55601","Beaver Bay","MN","47.258584","-91.29977","-6","1"
+"55602","Brimson","MN","47.309443","-91.87839","-6","1"
+"55603","Finland","MN","47.502703","-91.20122","-6","1"
+"55604","Grand Marais","MN","47.939037","-90.54659","-6","1"
+"55605","Grand Portage","MN","47.967442","-89.73735","-6","1"
+"55606","Hovland","MN","47.940908","-90.01705","-6","1"
+"55607","Isabella","MN","47.664633","-91.52953","-6","1"
+"55608","Rosemount","MN","44.741484","-93.113155","-6","1"
+"55609","Knife River","MN","46.94939","-91.78525","-6","1"
+"55612","Lutsen","MN","47.757804","-90.63836","-6","1"
+"55613","Schroeder","MN","47.651374","-90.95917","-6","1"
+"55614","Silver Bay","MN","47.314743","-91.25765","-6","1"
+"55615","Tofte","MN","47.677189","-90.81276","-6","1"
+"55616","Two Harbors","MN","47.077723","-91.66464","-6","1"
+"55676","Barnum","MN","46.471964","-92.687947","-6","1"
+"55701","Adolph","MN","47.640367","-92.442797","-6","1"
+"55702","Alborn","MN","46.956644","-92.63972","-6","1"
+"55703","Angora","MN","47.764569","-92.76689","-6","1"
+"55704","Askov","MN","46.22572","-92.76706","-6","1"
+"55705","Aurora","MN","47.45225","-92.24109","-6","1"
+"55706","Babbitt","MN","47.688083","-91.91856","-6","1"
+"55707","Barnum","MN","46.533977","-92.62697","-6","1"
+"55708","Biwabik","MN","47.533314","-92.34084","-6","1"
+"55709","Bovey","MN","47.372262","-93.38998","-6","1"
+"55710","Britt","MN","47.655096","-92.66189","-6","1"
+"55711","Brookston","MN","46.870672","-92.65082","-6","1"
+"55712","Bruno","MN","46.275431","-92.57886","-6","1"
+"55713","Buhl","MN","47.49307","-92.77783","-6","1"
+"55715","Buhl","MN","47.494762","-92.780293","-6","1"
+"55716","Calumet","MN","47.32211","-93.27581","-6","1"
+"55717","Canyon","MN","47.058166","-92.46078","-6","1"
+"55718","Carlton","MN","46.649697","-92.48477","-6","1"
+"55719","Chisholm","MN","47.509833","-92.87637","-6","1"
+"55720","Cloquet","MN","46.727077","-92.48612","-6","1"
+"55721","Cohasset","MN","47.247648","-93.66491","-6","1"
+"55722","Coleraine","MN","47.285247","-93.43112","-6","1"
+"55723","Cook","MN","47.854987","-92.77077","-6","1"
+"55724","Cotton","MN","47.172574","-92.41048","-6","1"
+"55725","Crane Lake","MN","48.262021","-92.61519","-6","1"
+"55726","Cromwell","MN","46.667284","-92.87081","-6","1"
+"55728","Bigfork","MN","47.757041","-93.64059","-6","1"
+"55730","Grand Rapids","MN","47.087782","-93.921429","-6","1"
+"55731","Ely","MN","47.913365","-91.91712","-6","1"
+"55732","Embarrass","MN","47.624206","-92.23909","-6","1"
+"55733","Esko","MN","46.708371","-92.36434","-6","1"
+"55734","Eveleth","MN","47.4211","-92.51331","-6","1"
+"55735","Finlayson","MN","46.250308","-93.04462","-6","1"
+"55736","Floodwood","MN","46.929033","-92.90614","-6","1"
+"55738","Forbes","MN","47.296271","-92.65485","-6","1"
+"55741","Gilbert","MN","47.4741","-92.40533","-6","1"
+"55742","Goodland","MN","47.169979","-93.13179","-6","1"
+"55744","Grand Rapids","MN","47.243062","-93.52599","-6","1"
+"55745","Grand Rapids","MN","47.087782","-93.921429","-6","1"
+"55746","Hibbing","MN","47.413817","-92.94228","-6","1"
+"55747","Hibbing","MN","47.640367","-92.442797","-6","1"
+"55748","Hill City","MN","46.956138","-93.60042","-6","1"
+"55749","Holyoke","MN","46.463827","-92.40766","-6","1"
+"55750","Hoyt Lakes","MN","47.517269","-92.0706","-6","1"
+"55751","Iron","MN","47.405699","-92.63067","-6","1"
+"55752","Jacobson","MN","46.974237","-93.2632","-6","1"
+"55753","Keewatin","MN","47.39654","-93.07651","-6","1"
+"55756","Kerrick","MN","46.374991","-92.59795","-6","1"
+"55757","Kettle River","MN","46.512349","-92.92803","-6","1"
+"55758","Kinney","MN","47.511214","-92.74026","-6","1"
+"55760","Mcgregor","MN","46.67746","-93.28391","-6","1"
+"55761","McKinley","MN","47.512426","-92.409999","-6","1"
+"55763","Makinen","MN","47.310374","-92.20091","-6","1"
+"55764","Marble","MN","47.319362","-93.30077","-6","1"
+"55765","Meadowlands","MN","47.086392","-92.75843","-6","1"
+"55766","Melrude","MN","47.249626","-92.412343","-6","1"
+"55767","Moose Lake","MN","46.44429","-92.7699","-6","1"
+"55768","Mountain Iron","MN","47.502878","-92.66548","-6","1"
+"55769","Nashwauk","MN","47.406731","-93.1645","-6","1"
+"55771","Orr","MN","48.098627","-92.80495","-6","1"
+"55772","Nett Lake","MN","48.081686","-93.083438","-6","1"
+"55775","Pengilly","MN","47.30797","-93.20693","-6","1"
+"55777","Virginia","MN","47.640367","-92.442797","-6","1"
+"55778","Clark","MN","46.626514","-93.133317","-6","1"
+"55779","Saginaw","MN","46.908416","-92.44913","-6","1"
+"55780","Sawyer","MN","46.670691","-92.69235","-6","1"
+"55781","Side Lake","MN","47.672765","-93.05481","-6","1"
+"55782","Soudan","MN","47.813694","-92.23977","-6","1"
+"55783","Sturgeon Lake","MN","46.379971","-92.82748","-6","1"
+"55784","Swan River","MN","47.061875","-93.20456","-6","1"
+"55785","Swatara","MN","46.878205","-93.70721","-6","1"
+"55786","Taconite","MN","47.314189","-93.38487","-6","1"
+"55787","Tamarack","MN","46.679313","-93.13241","-6","1"
+"55790","Tower","MN","47.825059","-92.3247","-6","1"
+"55791","Twig","MN","47.640367","-92.442797","-6","1"
+"55792","Virginia","MN","47.527383","-92.53371","-6","1"
+"55793","Warba","MN","47.116453","-93.26881","-6","1"
+"55795","Willow River","MN","46.317812","-92.84315","-6","1"
+"55796","Winton","MN","47.930468","-91.79943","-6","1"
+"55797","Wrenshall","MN","46.534005","-92.41983","-6","1"
+"55798","Wright","MN","46.723028","-92.96594","-6","1"
+"55801","Duluth","MN","47.005566","-92.001934","-6","1"
+"55802","Duluth","MN","46.774593","-92.09206","-6","1"
+"55803","Duluth","MN","46.972432","-92.10105","-6","1"
+"55804","Duluth","MN","46.86242","-91.98342","-6","1"
+"55805","Duluth","MN","46.798339","-92.09568","-6","1"
+"55806","Duluth","MN","46.770773","-92.12718","-6","1"
+"55807","Duluth","MN","46.738841","-92.16969","-6","1"
+"55808","Duluth","MN","46.674141","-92.2276","-6","1"
+"55810","Duluth","MN","46.753414","-92.24355","-6","1"
+"55811","Duluth","MN","46.821489","-92.18242","-6","1"
+"55812","Duluth","MN","46.809438","-92.07319","-6","1"
+"55814","Duluth","MN","47.640367","-92.442797","-6","1"
+"55815","Duluth","MN","47.640367","-92.442797","-6","1"
+"55816","Duluth","MN","47.640367","-92.442797","-6","1"
+"55901","Rochester","MN","44.048931","-92.49459","-6","1"
+"55902","Rochester","MN","43.991846","-92.49166","-6","1"
+"55903","Rochester","MN","43.996613","-92.540929","-6","1"
+"55904","Rochester","MN","43.988708","-92.42937","-6","1"
+"55905","Rochester","MN","44.022513","-92.466826","-6","1"
+"55906","Rochester","MN","44.064733","-92.44427","-6","1"
+"55909","Adams","MN","43.564175","-92.72645","-6","1"
+"55910","Altura","MN","44.128262","-91.95965","-6","1"
+"55912","Austin","MN","43.671988","-92.97908","-6","1"
+"55917","Blooming Prairie","MN","43.88481","-93.07546","-6","1"
+"55918","Brownsdale","MN","43.743087","-92.86434","-6","1"
+"55919","Brownsville","MN","43.664102","-91.29057","-6","1"
+"55920","Byron","MN","44.024835","-92.6388","-6","1"
+"55921","Caledonia","MN","43.630012","-91.48667","-6","1"
+"55922","Canton","MN","43.569417","-91.90736","-6","1"
+"55923","Chatfield","MN","43.84113","-92.1606","-6","1"
+"55924","Claremont","MN","44.035716","-93.01627","-6","1"
+"55925","Dakota","MN","43.910929","-91.39015","-6","1"
+"55926","Dexter","MN","43.731945","-92.70852","-6","1"
+"55927","Dodge Center","MN","44.026272","-92.86903","-6","1"
+"55929","Dover","MN","43.975269","-92.14213","-6","1"
+"55931","Eitzen","MN","43.511822","-91.46635","-6","1"
+"55932","Elgin","MN","44.135053","-92.28314","-6","1"
+"55933","Elkton","MN","43.65099","-92.70596","-6","1"
+"55934","Eyota","MN","44.006609","-92.24856","-6","1"
+"55935","Fountain","MN","43.74676","-92.12889","-6","1"
+"55936","Grand Meadow","MN","43.715085","-92.57812","-6","1"
+"55939","Harmony","MN","43.55123","-92.04994","-6","1"
+"55940","Hayfield","MN","43.885028","-92.80894","-6","1"
+"55941","Hokah","MN","43.756567","-91.36126","-6","1"
+"55942","Homer","MN","44.019989","-91.68187","-6","1"
+"55943","Houston","MN","43.769776","-91.57534","-6","1"
+"55944","Kasson","MN","44.035512","-92.75013","-6","1"
+"55945","Kellogg","MN","44.273406","-92.04934","-6","1"
+"55946","Kenyon","MN","44.268145","-92.9651","-6","1"
+"55947","La Crescent","MN","43.829382","-91.33919","-6","1"
+"55949","Lanesboro","MN","43.70844","-91.95965","-6","1"
+"55950","Lansing","MN","43.743278","-92.96929","-6","1"
+"55951","Le Roy","MN","43.525845","-92.51616","-6","1"
+"55952","Lewiston","MN","43.959148","-91.84932","-6","1"
+"55953","Lyle","MN","43.519177","-92.96466","-6","1"
+"55954","Mabel","IA","43.498082","-91.89429","-6","1"
+"55955","Mantorville","MN","44.068344","-92.75616","-6","1"
+"55956","Mazeppa","MN","44.272368","-92.53501","-6","1"
+"55957","Millville","MN","44.244633","-92.29074","-6","1"
+"55959","Minnesota City","MN","44.093056","-91.74422","-6","1"
+"55960","Oronoco","MN","44.152623","-92.53706","-6","1"
+"55961","Ostrander","MN","43.6122","-92.46452","-6","1"
+"55962","Peterson","MN","43.762272","-91.8453","-6","1"
+"55963","Pine Island","MN","44.196932","-92.65482","-6","1"
+"55964","Plainview","MN","44.164431","-92.17048","-6","1"
+"55965","Preston","MN","43.646355","-92.12329","-6","1"
+"55967","Racine","MN","43.786802","-92.50425","-6","1"
+"55968","Reads Landing","MN","44.340826","-92.282467","-6","1"
+"55969","Rollingstone","MN","44.079021","-91.84612","-6","1"
+"55970","Rose Creek","MN","43.599507","-92.83756","-6","1"
+"55971","Rushford","MN","43.80784","-91.75117","-6","1"
+"55972","Saint Charles","MN","43.977555","-92.06276","-6","1"
+"55973","Sargeant","MN","43.797677","-92.7799","-6","1"
+"55974","Spring Grove","MN","43.57279","-91.65004","-6","1"
+"55975","Spring Valley","MN","43.686356","-92.37242","-6","1"
+"55976","Stewartville","MN","43.862105","-92.49849","-6","1"
+"55977","Taopi","MN","43.550714","-92.65902","-6","1"
+"55978","West Albany","MN","44.301714","-92.178277","-6","1"
+"55979","Utica","MN","43.93422","-91.95325","-6","1"
+"55981","Wabasha","MN","44.374261","-92.04204","-6","1"
+"55982","Waltham","MN","43.82009","-92.87749","-6","1"
+"55983","Wanamingo","MN","44.285672","-92.79816","-6","1"
+"55985","West Concord","MN","44.157166","-92.89357","-6","1"
+"55987","Winona","MN","44.033867","-91.65106","-6","1"
+"55988","Stockton","MN","44.025446","-91.77304","-6","1"
+"55990","Wykoff","MN","43.714071","-92.26493","-6","1"
+"55991","Zumbro Falls","MN","44.24431","-92.41336","-6","1"
+"55992","Zumbrota","MN","44.297157","-92.68312","-6","1"
+"56001","Mankato","MN","44.15644","-93.99388","-6","1"
+"56002","Mankato","MN","44.056047","-94.069828","-6","1"
+"56003","Mankato","MN","44.184909","-94.04244","-6","1"
+"56006","Mankato","MN","44.056047","-94.069828","-6","1"
+"56007","Albert Lea","MN","43.652042","-93.36916","-6","1"
+"56009","Alden","MN","43.667207","-93.55598","-6","1"
+"56010","Amboy","MN","43.899907","-94.20634","-6","1"
+"56011","Belle Plaine","MN","44.616113","-93.76906","-6","1"
+"56013","Blue Earth","MN","43.630763","-94.10129","-6","1"
+"56014","Bricelyn","MN","43.589604","-93.81676","-6","1"
+"56016","Clarks Grove","MN","43.764506","-93.33357","-6","1"
+"56017","Cleveland","MN","44.304948","-93.80077","-6","1"
+"56019","Comfrey","MN","44.11754","-94.88998","-6","1"
+"56020","Conger","MN","43.613686","-93.53072","-6","1"
+"56021","Courtland","MN","44.277333","-94.31424","-6","1"
+"56022","Darfur","MN","44.049908","-94.83877","-6","1"
+"56023","Delavan","MN","43.782104","-94.01341","-6","1"
+"56024","Eagle Lake","MN","44.153696","-93.86918","-6","1"
+"56025","Easton","MN","43.764111","-93.90534","-6","1"
+"56026","Ellendale","MN","43.884985","-93.2917","-6","1"
+"56027","Elmore","IA","43.482104","-94.09837","-6","1"
+"56028","Elysian","MN","44.207288","-93.68716","-6","1"
+"56029","Emmons","MN","43.516115","-93.51768","-6","1"
+"56030","Essig","MN","44.325833","-94.605226","-6","1"
+"56031","Fairmont","MN","43.646916","-94.45856","-6","1"
+"56032","Freeborn","MN","43.766208","-93.56339","-6","1"
+"56033","Frost","MN","43.579548","-93.93826","-6","1"
+"56034","Garden City","MN","44.029058","-94.18186","-6","1"
+"56035","Geneva","MN","43.819798","-93.26713","-6","1"
+"56036","Glenville","MN","43.550747","-93.21987","-6","1"
+"56037","Good Thunder","MN","44.017609","-94.05231","-6","1"
+"56039","Granada","MN","43.680519","-94.33773","-6","1"
+"56041","Hanska","MN","44.149047","-94.5238","-6","1"
+"56042","Hartland","MN","43.796535","-93.49143","-6","1"
+"56043","Hayward","MN","43.65048","-93.224","-6","1"
+"56044","Henderson","MN","44.555899","-93.95354","-6","1"
+"56045","Hollandale","MN","43.762109","-93.18959","-6","1"
+"56046","Hope","MN","43.955103","-93.274017","-6","1"
+"56047","Huntley","MN","43.738397","-94.228897","-6","1"
+"56048","Janesville","MN","44.102188","-93.71255","-6","1"
+"56050","Kasota","MN","44.28491","-93.95806","-6","1"
+"56051","Kiester","MN","43.535709","-93.71308","-6","1"
+"56052","Kilkenny","MN","44.320314","-93.57071","-6","1"
+"56054","Lafayette","MN","44.431776","-94.37742","-6","1"
+"56055","Lake Crystal","MN","44.128212","-94.23883","-6","1"
+"56056","La Salle","MN","44.070204","-94.57143","-6","1"
+"56057","Le Center","MN","44.393899","-93.72583","-6","1"
+"56058","Le Sueur","MN","44.449976","-93.90513","-6","1"
+"56060","Lewisville","MN","43.930032","-94.43935","-6","1"
+"56062","Madelia","MN","44.045998","-94.4211","-6","1"
+"56063","Madison Lake","MN","44.204121","-93.81923","-6","1"
+"56064","Manchester","MN","43.723693","-93.45161","-6","1"
+"56065","Mapleton","MN","43.931415","-93.92866","-6","1"
+"56068","Minnesota Lake","MN","43.848573","-93.81718","-6","1"
+"56069","Montgomery","MN","44.429956","-93.56982","-6","1"
+"56071","New Prague","MN","44.546463","-93.57848","-6","1"
+"56072","New Richland","MN","43.899778","-93.53178","-6","1"
+"56073","New Ulm","MN","44.308395","-94.46149","-6","1"
+"56074","Nicollet","MN","44.331757","-94.19561","-6","1"
+"56075","Northrop","MN","43.735594","-94.43584","-6","1"
+"56076","Oakland","MN","43.671266","-93.11918","-6","1"
+"56078","Pemberton","MN","44.007228","-93.77764","-6","1"
+"56080","Saint Clair","MN","44.080713","-93.85663","-6","1"
+"56081","Saint James","MN","43.986563","-94.63345","-6","1"
+"56082","Saint Peter","MN","44.337276","-93.99282","-6","1"
+"56083","Sanborn","MN","44.21838","-95.13348","-6","1"
+"56084","Searles","MN","44.302893","-94.738827","-6","1"
+"56085","Sleepy Eye","MN","44.29717","-94.73426","-6","1"
+"56087","Springfield","MN","44.239384","-94.98313","-6","1"
+"56088","Truman","MN","43.834331","-94.4436","-6","1"
+"56089","Twin Lakes","MN","43.563452","-93.42694","-6","1"
+"56090","Vernon Center","MN","43.95885","-94.22403","-6","1"
+"56091","Waldorf","MN","43.930363","-93.69492","-6","1"
+"56093","Waseca","MN","44.067673","-93.5103","-6","1"
+"56096","Waterville","MN","44.234274","-93.5884","-6","1"
+"56097","Wells","MN","43.731479","-93.71837","-6","1"
+"56098","Winnebago","MN","43.764936","-94.18016","-6","1"
+"56101","Windom","MN","43.870469","-95.13275","-6","1"
+"56110","Adrian","MN","43.626278","-95.93973","-6","1"
+"56111","Alpha","MN","43.645226","-94.8715","-6","1"
+"56113","Arco","MN","44.398668","-96.17095","-6","1"
+"56114","Avoca","MN","43.971169","-95.6128","-6","1"
+"56115","Balaton","MN","44.227802","-95.9021","-6","1"
+"56116","Beaver Creek","MN","43.621142","-96.3866","-6","1"
+"56117","Bigelow","MN","43.513198","-95.69138","-6","1"
+"56118","Bingham Lake","MN","43.936146","-95.02938","-6","1"
+"56119","Brewster","MN","43.702735","-95.46946","-6","1"
+"56120","Butterfield","MN","43.957826","-94.79571","-6","1"
+"56121","Ceylon","MN","43.535662","-94.62877","-6","1"
+"56122","Chandler","MN","43.89707","-95.95855","-6","1"
+"56123","Currie","MN","44.084381","-95.59321","-6","1"
+"56125","Dovray","MN","44.053323","-95.549899","-6","1"
+"56126","Graham Lakes","MN","43.820313","-95.523182","-6","1"
+"56127","Dunnell","MN","43.556667","-94.77432","-6","1"
+"56128","Edgerton","MN","43.89387","-96.1285","-6","1"
+"56129","Ellsworth","IA","43.495384","-95.90691","-6","1"
+"56130","Florence","MN","44.238659","-96.052227","-6","1"
+"56131","Fulda","MN","43.861532","-95.59378","-6","1"
+"56132","Garvin","MN","44.212536","-95.75998","-6","1"
+"56134","Hardwick","MN","43.783098","-96.22202","-6","1"
+"56135","Powers","MN","46.829136","-94.430518","-6","1"
+"56136","Hendricks","MN","44.512114","-96.41157","-6","1"
+"56137","Heron Lake","MN","43.826163","-95.34591","-6","1"
+"56138","Hills","MN","43.529153","-96.36669","-6","1"
+"56139","Holland","MN","44.092188","-96.18168","-6","1"
+"56140","Ihlen","MN","43.907841","-96.36802","-6","1"
+"56141","Iona","MN","43.884657","-95.77444","-6","1"
+"56142","Ivanhoe","MN","44.476959","-96.23","-6","1"
+"56143","Jackson","MN","43.625811","-95.00447","-6","1"
+"56144","Jasper","MN","43.854184","-96.39022","-6","1"
+"56145","Jeffers","MN","44.057605","-95.18517","-6","1"
+"56146","Kanaranzi","MN","43.674883","-96.252794","-6","1"
+"56147","Kenneth","MN","43.750164","-96.06591","-6","1"
+"56149","Lake Benton","MN","44.268332","-96.30822","-6","1"
+"56150","Lakefield","MN","43.649239","-95.19501","-6","1"
+"56151","Lake Wilson","MN","44.015184","-95.91403","-6","1"
+"56152","Lamberton","MN","44.227021","-95.28014","-6","1"
+"56153","Leota","MN","43.834517","-96.0186","-6","1"
+"56155","Lismore","MN","43.763442","-95.94459","-6","1"
+"56156","Luverne","MN","43.653947","-96.2303","-6","1"
+"56157","Lynd","MN","44.396043","-95.92771","-6","1"
+"56158","Magnolia","MN","43.642511","-96.06011","-6","1"
+"56159","Mountain Lake","MN","43.942515","-94.93058","-6","1"
+"56160","Odin","MN","43.847252","-94.77124","-6","1"
+"56161","Okabena","MN","43.724852","-95.32545","-6","1"
+"56162","Ormsby","MN","43.843264","-94.68446","-6","1"
+"56164","Pipestone","MN","44.020814","-96.32473","-6","1"
+"56165","Reading","MN","43.725227","-95.7032","-6","1"
+"56166","Revere","MN","44.2127","-95.3633","-6","1"
+"56167","Round Lake","MN","43.536338","-95.38554","-6","1"
+"56168","Rushmore","MN","43.608503","-95.80946","-6","1"
+"56169","Russell","MN","44.319682","-95.98835","-6","1"
+"56170","Ruthton","MN","44.17521","-96.07363","-6","1"
+"56171","Sherburn","MN","43.660847","-94.74357","-6","1"
+"56172","Slayton","MN","44.007631","-95.75803","-6","1"
+"56173","Steen","MN","43.521947","-96.24301","-6","1"
+"56174","Storden","MN","44.031366","-95.30674","-6","1"
+"56175","Tracy","MN","44.260625","-95.62371","-6","1"
+"56176","Trimont","MN","43.771341","-94.72593","-6","1"
+"56177","Trosky","MN","43.887295","-96.25132","-6","1"
+"56178","Tyler","MN","44.274909","-96.12408","-6","1"
+"56180","Walnut Grove","MN","44.249331","-95.46821","-6","1"
+"56181","Welcome","MN","43.672105","-94.61716","-6","1"
+"56183","Westbrook","MN","44.043567","-95.41116","-6","1"
+"56185","Wilmont","MN","43.783453","-95.82563","-6","1"
+"56186","Woodstock","MN","44.028354","-96.07063","-6","1"
+"56187","Worthington","MN","43.623255","-95.59604","-6","1"
+"56201","Willmar","MN","45.118846","-95.04504","-6","1"
+"56207","Alberta","MN","45.532754","-96.06453","-6","1"
+"56208","Appleton","MN","45.228278","-96.00539","-6","1"
+"56209","Atwater","MN","45.128657","-94.79069","-6","1"
+"56210","Barry","MN","45.559291","-96.558886","-6","1"
+"56211","Beardsley","MN","45.593033","-96.6879","-6","1"
+"56212","Bellingham","MN","45.140784","-96.32855","-6","1"
+"56214","Belview","MN","44.59231","-95.33465","-6","1"
+"56215","Benson","MN","45.317872","-95.57247","-6","1"
+"56216","Blomkest","MN","44.945988","-95.05923","-6","1"
+"56218","Boyd","MN","44.838823","-95.94042","-6","1"
+"56219","Browns Valley","MN","45.606998","-96.81833","-6","1"
+"56220","Canby","MN","44.725437","-96.2921","-6","1"
+"56221","Chokio","MN","45.556847","-96.1897","-6","1"
+"56222","Clara City","MN","44.974538","-95.36594","-6","1"
+"56223","Clarkfield","MN","44.761504","-95.8183","-6","1"
+"56224","Clements","MN","44.375214","-95.06695","-6","1"
+"56225","Clinton","MN","45.459383","-96.44694","-6","1"
+"56226","Clontarf","MN","45.409218","-95.69334","-6","1"
+"56227","Correll","MN","45.290863","-96.16888","-6","1"
+"56228","Cosmos","MN","44.933861","-94.67563","-6","1"
+"56229","Cottonwood","MN","44.609098","-95.70555","-6","1"
+"56230","Danube","MN","44.79129","-95.09671","-6","1"
+"56231","Danvers","MN","45.27133","-95.7711","-6","1"
+"56232","Dawson","MN","44.932368","-96.04823","-6","1"
+"56235","Donnelly","MN","45.697239","-96.01767","-6","1"
+"56236","Dumont","MN","45.664974","-96.39608","-6","1"
+"56237","Echo","MN","44.616243","-95.43173","-6","1"
+"56239","Ghent","MN","44.515475","-95.89576","-6","1"
+"56240","Graceville","MN","45.568463","-96.45916","-6","1"
+"56241","Granite Falls","MN","44.794723","-95.56737","-6","1"
+"56243","Grove City","MN","45.168724","-94.68641","-6","1"
+"56244","Hancock","MN","45.488399","-95.78157","-6","1"
+"56245","Hanley Falls","MN","44.690608","-95.65028","-6","1"
+"56246","Hawick","MN","45.34373","-94.83013","-6","1"
+"56248","Herman","MN","45.800145","-96.13895","-6","1"
+"56249","Holloway","MN","45.299531","-95.8996","-6","1"
+"56251","Kandiyohi","MN","45.133103","-94.91976","-6","1"
+"56252","Kerkhoven","MN","45.18553","-95.30198","-6","1"
+"56253","Lake Lillian","MN","44.959237","-94.88831","-6","1"
+"56255","Lucan","MN","44.397402","-95.42013","-6","1"
+"56256","Madison","MN","45.036047","-96.19573","-6","1"
+"56257","Marietta","MN","44.986761","-96.40968","-6","1"
+"56258","Marshall","MN","44.446885","-95.77281","-6","1"
+"56260","Maynard","MN","44.943885","-95.48031","-6","1"
+"56262","Milan","MN","45.113285","-95.86913","-6","1"
+"56263","Milroy","MN","44.417337","-95.54999","-6","1"
+"56264","Minneota","MN","44.58701","-95.98153","-6","1"
+"56265","Montevideo","MN","44.985313","-95.7066","-6","1"
+"56266","Morgan","MN","44.417533","-94.91902","-6","1"
+"56267","Morris","MN","45.584124","-95.9092","-6","1"
+"56270","Morton","MN","44.552749","-94.98994","-6","1"
+"56271","Murdock","MN","45.242264","-95.42422","-6","1"
+"56273","New London","MN","45.327429","-94.99921","-6","1"
+"56274","Norcross","MN","45.897971","-96.24441","-6","1"
+"56276","Odessa","MN","45.245844","-96.32641","-6","1"
+"56277","Olivia","MN","44.766441","-94.99624","-6","1"
+"56278","Ortonville","MN","45.335958","-96.40032","-6","1"
+"56279","Pennock","MN","45.200641","-95.17748","-6","1"
+"56280","Porter","MN","44.633159","-96.16532","-6","1"
+"56281","Prinsburg","MN","44.945831","-95.17628","-6","1"
+"56282","Raymond","MN","45.028945","-95.22418","-6","1"
+"56283","Redwood Falls","MN","44.540923","-95.12732","-6","1"
+"56284","Renville","MN","44.783251","-95.20682","-6","1"
+"56285","Sacred Heart","MN","44.79624","-95.35045","-6","1"
+"56286","St. Leo","MN","44.716494","-96.054791","-6","1"
+"56287","Seaforth","MN","44.475845","-95.32579","-6","1"
+"56288","Spicer","MN","45.238936","-94.95001","-6","1"
+"56289","Sunburg","MN","45.344013","-95.22335","-6","1"
+"56291","Taunton","MN","44.598116","-96.06801","-6","1"
+"56292","Vesta","MN","44.501023","-95.45228","-6","1"
+"56293","Wabasso","MN","44.403815","-95.25784","-6","1"
+"56294","Wanda","MN","44.317104","-95.21378","-6","1"
+"56295","Watson","MN","45.024344","-95.82794","-6","1"
+"56296","Wheaton","MN","45.823795","-96.47706","-6","1"
+"56297","Wood Lake","MN","44.6367","-95.55359","-6","1"
+"56301","Saint Cloud","MN","45.526066","-94.20649","-6","1"
+"56302","Saint Cloud","MN","45.49343","-94.643922","-6","1"
+"56303","Saint Cloud","MN","45.568516","-94.19251","-6","1"
+"56304","Saint Cloud","MN","45.547283","-94.11303","-6","1"
+"56307","Albany","MN","45.632455","-94.58257","-6","1"
+"56308","Alexandria","MN","45.88645","-95.38287","-6","1"
+"56309","Ashby","MN","46.080287","-95.80539","-6","1"
+"56310","Avon","MN","45.624705","-94.44973","-6","1"
+"56311","Barrett","MN","45.902998","-95.88297","-6","1"
+"56312","Belgrade","MN","45.460931","-94.96697","-6","1"
+"56313","Bock","MN","45.785883","-93.55343","-6","1"
+"56314","Bowlus","MN","45.814436","-94.42539","-6","1"
+"56315","Brandon","MN","45.968739","-95.5942","-6","1"
+"56316","Brooten","MN","45.510591","-95.13636","-6","1"
+"56317","Buckman","MN","46.061307","-94.208731","-6","1"
+"56318","Burtrum","MN","45.85303","-94.67459","-6","1"
+"56319","Carlos","MN","45.990781","-95.27033","-6","1"
+"56320","Cold Spring","MN","45.462728","-94.42511","-6","1"
+"56321","Collegeville","MN","45.578278","-94.419941","-6","1"
+"56323","Cyrus","MN","45.63381","-95.72642","-6","1"
+"56324","Dalton","MN","46.169964","-95.90465","-6","1"
+"56325","Elrosa","MN","45.562459","-94.94661","-6","1"
+"56326","Evansville","MN","46.011931","-95.68104","-6","1"
+"56327","Farwell","MN","45.778773","-95.60302","-6","1"
+"56328","Flensburg","MN","45.953535","-94.52834","-6","1"
+"56329","Foley","MN","45.695411","-93.90417","-6","1"
+"56330","Foreston","MN","45.732493","-93.73102","-6","1"
+"56331","Freeport","MN","45.67539","-94.67303","-6","1"
+"56332","Garfield","MN","45.950306","-95.50754","-6","1"
+"56333","Gilman","MN","45.691714","-94.05629","-6","1"
+"56334","Glenwood","MN","45.609555","-95.35104","-6","1"
+"56335","Greenwald","MN","45.601429","-94.85864","-6","1"
+"56336","Grey Eagle","MN","45.819474","-94.76247","-6","1"
+"56338","Hillman","MN","46.035241","-93.9153","-6","1"
+"56339","Hoffman","MN","45.825031","-95.81104","-6","1"
+"56340","Holdingford","MN","45.749908","-94.45647","-6","1"
+"56341","Holmes City","MN","45.830998","-95.541618","-6","1"
+"56342","Isle","MN","46.212757","-93.45729","-6","1"
+"56343","Kensington","MN","45.795887","-95.66742","-6","1"
+"56344","Lastrup","MN","46.061307","-94.208731","-6","1"
+"56345","Little Falls","MN","45.994029","-94.37183","-6","1"
+"56347","Long Prairie","MN","45.973572","-94.8582","-6","1"
+"56349","Lowry","MN","45.728732","-95.52504","-6","1"
+"56350","McGrath","MN","46.274325","-93.26096","-6","1"
+"56352","Melrose","MN","45.659491","-94.81417","-6","1"
+"56353","Milaca","MN","45.760191","-93.63247","-6","1"
+"56354","Miltona","MN","46.063391","-95.28168","-6","1"
+"56355","Nelson","MN","45.92084","-95.23965","-6","1"
+"56356","New Munich","MN","45.628804","-94.75466","-6","1"
+"56357","Oak Park","MN","45.699995","-93.80256","-6","1"
+"56358","Ogilvie","MN","45.831767","-93.44162","-6","1"
+"56359","Onamia","MN","46.073505","-93.66983","-6","1"
+"56360","Osakis","MN","45.884771","-95.10486","-6","1"
+"56361","Parkers Prairie","MN","46.156758","-95.33754","-6","1"
+"56362","Paynesville","MN","45.389395","-94.70519","-6","1"
+"56363","Pease","MN","45.697362","-93.646503","-6","1"
+"56364","Pierz","MN","45.996396","-94.08461","-6","1"
+"56366","Bowstring","MN","47.572516","-93.899486","-6","1"
+"56367","Rice","MN","45.745266","-94.18176","-6","1"
+"56368","Richmond","MN","45.448703","-94.52597","-6","1"
+"56369","Rockville","MN","45.470635","-94.33862","-6","1"
+"56371","Roscoe","MN","45.432316","-94.63552","-6","1"
+"56372","Saint Cloud","MN","45.52886","-94.593338","-6","1"
+"56373","Royalton","MN","45.840565","-94.26434","-6","1"
+"56374","Saint Joseph","MN","45.582653","-94.32974","-6","1"
+"56375","Saint Stephen","MN","45.702598","-94.27609","-6","1"
+"56376","Saint Martin","MN","45.498506","-94.66271","-6","1"
+"56377","Sartell","MN","45.622966","-94.20959","-6","1"
+"56378","Sauk Centre","MN","45.729898","-94.97236","-6","1"
+"56379","Sauk Rapids","MN","45.608178","-94.13838","-6","1"
+"56381","Starbuck","MN","45.578335","-95.55201","-6","1"
+"56382","Swanville","MN","45.904129","-94.62373","-6","1"
+"56384","Upsala","MN","45.80679","-94.57067","-6","1"
+"56385","Villard","MN","45.702767","-95.21433","-6","1"
+"56386","Wahkon","MN","46.114445","-93.51986","-6","1"
+"56387","Waite Park","MN","45.550378","-94.22429","-6","1"
+"56388","Mount Morris","MN","45.946528","-93.84788","-6","1"
+"56389","West Union","MN","45.799542","-95.08213","-6","1"
+"56393","Saint Cloud","MN","45.52886","-94.593338","-6","1"
+"56395","Saint Cloud","MN","45.52886","-94.593338","-6","1"
+"56396","Saint Cloud","MN","45.52886","-94.593338","-6","1"
+"56397","Saint Cloud","MN","45.52886","-94.593338","-6","1"
+"56398","Saint Cloud","MN","45.52886","-94.593338","-6","1"
+"56399","Saint Cloud","MN","45.52886","-94.593338","-6","1"
+"56401","Brainerd","MN","46.352758","-94.16289","-6","1"
+"56425","Baxter","MN","46.347175","-94.27017","-6","1"
+"56430","Ah Gwah Ching","MN","46.862332","-94.641872","-6","1"
+"56431","Aitkin","MN","46.507241","-93.66458","-6","1"
+"56432","Acton","MN","45.910946","-94.633724","-6","1"
+"56433","Akeley","MN","46.977161","-94.70512","-6","1"
+"56434","Aldrich","MN","46.376819","-94.93781","-6","1"
+"56435","Backus","MN","46.823666","-94.50471","-6","1"
+"56436","Benedict","MN","47.143679","-94.68589","-6","1"
+"56437","Bertha","MN","46.252854","-95.06222","-6","1"
+"56438","Browerville","MN","46.149276","-94.83088","-6","1"
+"56440","Clarissa","MN","46.129933","-94.95278","-6","1"
+"56441","Crosby","MN","46.528094","-93.98055","-6","1"
+"56442","Crosslake","MN","46.67066","-94.10686","-6","1"
+"56443","Cushing","MN","46.194584","-94.6196","-6","1"
+"56444","Deerwood","MN","46.438976","-93.89064","-6","1"
+"56446","Eagle Bend","MN","46.145445","-95.07071","-6","1"
+"56447","Emily","MN","46.735697","-93.94205","-6","1"
+"56448","Fifty Lakes","MN","46.747211","-94.07246","-6","1"
+"56449","Fort Ripley","MN","46.166054","-94.29254","-6","1"
+"56450","Garrison","MN","46.244818","-93.8155","-6","1"
+"56452","Hackensack","MN","46.963355","-94.4646","-6","1"
+"56453","Hewitt","MN","46.32091","-95.14567","-6","1"
+"56455","Ironton","MN","46.483523","-93.99978","-6","1"
+"56456","Jenkins","MN","46.650706","-94.33651","-6","1"
+"56458","Lake George","MN","47.206754","-94.97109","-6","1"
+"56459","Lake Hubert","MN","46.498749","-94.251926","-6","1"
+"56460","Itasca","MN","47.239049","-95.265379","-6","1"
+"56461","Laporte","MN","47.260013","-94.84475","-6","1"
+"56464","Menahga","MN","46.770167","-95.09659","-6","1"
+"56465","Merrifield","MN","46.527729","-94.11071","-6","1"
+"56466","Motley","MN","46.362398","-94.63849","-6","1"
+"56467","Nevis","MN","46.970017","-94.85013","-6","1"
+"56468","Nisswa","MN","46.501623","-94.28917","-6","1"
+"56469","Palisade","MN","46.702947","-93.5203","-6","1"
+"56470","Park Rapids","MN","46.974221","-95.06581","-6","1"
+"56472","Pequot Lakes","MN","46.602684","-94.29986","-6","1"
+"56473","Pillager","MN","46.368605","-94.4846","-6","1"
+"56474","Pine River","MN","46.718997","-94.38716","-6","1"
+"56475","Randall","MN","46.099545","-94.50864","-6","1"
+"56477","Sebeka","MN","46.630023","-95.01222","-6","1"
+"56478","Nimrod","MN","46.605266","-94.900729","-6","1"
+"56479","Staples","MN","46.380664","-94.80503","-6","1"
+"56481","Verndale","MN","46.434002","-94.95748","-6","1"
+"56482","Wadena","MN","46.447659","-95.14289","-6","1"
+"56483","Wadena","MN","46.439079","-95.137497","-6","1"
+"56484","Walker","MN","47.099774","-94.53347","-6","1"
+"56501","Detroit Lakes","MN","46.809965","-95.8518","-6","1"
+"56502","Detroit Lakes","MN","46.933961","-95.678375","-6","1"
+"56508","Lake Eunice","MN","46.732051","-95.997757","-6","1"
+"56510","Ada","MN","47.322444","-96.51915","-6","1"
+"56511","Audubon","MN","46.863375","-95.99585","-6","1"
+"56513","Baker","MN","46.723274","-96.54727","-6","1"
+"56514","Barnesville","MN","46.653912","-96.42891","-6","1"
+"56515","Battle Lake","MN","46.284496","-95.70975","-6","1"
+"56516","Bejou","MN","47.4514","-95.98766","-6","1"
+"56517","Beltrami","MN","47.55171","-96.53492","-6","1"
+"56518","Bluffton","MN","46.467905","-95.25532","-6","1"
+"56519","Borup","MN","47.158015","-96.51487","-6","1"
+"56520","Breckenridge","MN","46.27324","-96.54888","-6","1"
+"56521","Callaway","MN","47.015728","-95.87008","-6","1"
+"56522","Campbell","MN","46.130213","-96.40019","-6","1"
+"56523","Climax","MN","47.651391","-96.80408","-6","1"
+"56524","Clitherall","MN","46.235125","-95.61543","-6","1"
+"56525","Comstock","MN","46.659932","-96.74693","-6","1"
+"56527","Deer Creek","MN","46.383585","-95.31644","-6","1"
+"56528","Dent","MN","46.528138","-95.79661","-6","1"
+"56529","Dilworth","MN","46.878062","-96.70242","-6","1"
+"56531","Elbow Lake","MN","45.990556","-95.96704","-6","1"
+"56533","Elizabeth","MN","46.405807","-96.15831","-6","1"
+"56534","Erhard","MN","46.470638","-96.01013","-6","1"
+"56535","Erskine","MN","47.666426","-96.03701","-6","1"
+"56536","Felton","MN","47.050391","-96.53933","-6","1"
+"56537","Fergus Falls","MN","46.282084","-96.06798","-6","1"
+"56538","Fergus Falls","MN","46.412413","-95.713452","-6","1"
+"56540","Fertile","MN","47.557644","-96.26954","-6","1"
+"56541","Flom","MN","47.325074","-96.469194","-6","1"
+"56542","Fosston","MN","47.571567","-95.73784","-6","1"
+"56543","Foxhome","MN","46.290371","-96.33238","-6","1"
+"56544","Frazee","MN","46.742349","-95.62935","-6","1"
+"56545","Gary","MN","47.363986","-96.2396","-6","1"
+"56546","Georgetown","MN","47.10033","-96.74309","-6","1"
+"56547","Glyndon","MN","46.884481","-96.56301","-6","1"
+"56548","Halstad","MN","47.36461","-96.78265","-6","1"
+"56549","Hawley","MN","46.864977","-96.30781","-6","1"
+"56550","Hendrum","MN","47.271427","-96.76456","-6","1"
+"56551","Henning","MN","46.31855","-95.45375","-6","1"
+"56552","Hitterdal","MN","46.988379","-96.23607","-6","1"
+"56553","Kent","MN","46.434718","-96.62429","-6","1"
+"56554","Lake Park","MN","46.861527","-96.10974","-6","1"
+"56556","Mcintosh","MN","47.656231","-95.88214","-6","1"
+"56557","Mahnomen","MN","47.330624","-95.87672","-6","1"
+"56560","Moorhead","MN","46.861413","-96.75367","-6","1"
+"56561","Moorhead","MN","46.890034","-96.506156","-6","1"
+"56562","Moorhead","MN","46.890034","-96.506156","-6","1"
+"56563","Moorhead","MN","46.890034","-96.506156","-6","1"
+"56565","Nashua","MN","46.040316","-96.31772","-6","1"
+"56566","Naytahwaush","MN","47.257131","-95.61749","-6","1"
+"56567","New York Mills","MN","46.534993","-95.38106","-6","1"
+"56568","Nielsville","MN","47.53525","-96.78313","-6","1"
+"56569","Ogema","MN","47.093608","-95.84166","-6","1"
+"56570","Osage","MN","46.895156","-95.36174","-6","1"
+"56571","Ottertail","MN","46.428432","-95.559","-6","1"
+"56572","Pelican Rapids","MN","46.608461","-96.0663","-6","1"
+"56573","Perham","MN","46.607429","-95.55911","-6","1"
+"56574","Perley","MN","47.197932","-96.72953","-6","1"
+"56575","Ponsford","MN","47.042394","-95.43451","-6","1"
+"56576","Richville","MN","46.467527","-95.69675","-6","1"
+"56577","Richwood","MN","46.933961","-95.678375","-6","1"
+"56578","Rochert","MN","46.920986","-95.66842","-6","1"
+"56579","Rothsay","MN","46.459359","-96.34149","-6","1"
+"56580","Sabin","MN","46.754039","-96.63715","-6","1"
+"56581","Shelly","MN","47.457626","-96.78723","-6","1"
+"56583","Tintah","MN","46.014161","-96.40019","-6","1"
+"56584","Twin Valley","MN","47.245894","-96.24825","-6","1"
+"56585","Ulen","MN","47.087171","-96.24725","-6","1"
+"56586","Underwood","MN","46.330985","-95.84679","-6","1"
+"56587","Vergas","MN","46.64246","-95.83042","-6","1"
+"56588","Vining","MN","46.246571","-95.5305","-6","1"
+"56589","Waubun","MN","47.174775","-95.74517","-6","1"
+"56590","Wendell","MN","46.033624","-96.13988","-6","1"
+"56591","White Earth","MN","46.933961","-95.678375","-6","1"
+"56592","Winger","MN","47.530842","-96.00853","-6","1"
+"56593","Wolf Lake","MN","46.821648","-95.391968","-6","1"
+"56594","Wolverton","MN","46.565562","-96.66702","-6","1"
+"56601","Bemidji","MN","47.504496","-94.87105","-6","1"
+"56619","Bemidji","MN","47.625699","-94.822154","-6","1"
+"56621","Bagley","MN","47.436583","-95.41337","-6","1"
+"56623","Baudette","MN","48.663939","-94.54953","-6","1"
+"56626","Bena","MN","47.340327","-94.245","-6","1"
+"56627","Big Falls","MN","48.186112","-93.80726","-6","1"
+"56628","Bigfork","MN","47.667203","-93.58773","-6","1"
+"56629","Birchdale","MN","48.551313","-94.17684","-6","1"
+"56630","Blackduck","MN","47.722624","-94.5319","-6","1"
+"56631","Bowstring","MN","47.087782","-93.921429","-6","1"
+"56633","Cass Lake","MN","47.373207","-94.58834","-6","1"
+"56634","Clearbrook","MN","47.67265","-95.42809","-6","1"
+"56636","Deer River","MN","47.382872","-93.84832","-6","1"
+"56637","Talmoon","MN","47.611885","-93.83267","-6","1"
+"56639","Effie","MN","47.852874","-93.50758","-6","1"
+"56641","Federal Dam","MN","47.243893","-94.23203","-6","1"
+"56643","Fleming","MN","46.631748","-93.515456","-6","1"
+"56644","Gonvick","MN","47.755904","-95.5078","-6","1"
+"56646","Gully","MN","47.771933","-95.64403","-6","1"
+"56647","Hines","MN","47.666705","-94.61868","-6","1"
+"56649","International Falls","MN","48.579947","-93.38142","-6","1"
+"56650","Kelliher","MN","47.997931","-94.55748","-6","1"
+"56651","Lengby","MN","47.465509","-95.64614","-6","1"
+"56652","Leonard","MN","47.702771","-95.22132","-6","1"
+"56653","Littlefork","MN","48.366833","-93.56367","-6","1"
+"56654","Loman","MN","48.527572","-93.83554","-6","1"
+"56655","Longville","MN","46.975876","-94.21508","-6","1"
+"56657","Marcell","MN","47.578093","-93.62929","-6","1"
+"56658","Margie","MN","48.27888","-93.755536","-6","1"
+"56659","Max","MN","47.64542","-94.05089","-6","1"
+"56660","Mizpah","MN","47.954759","-94.20965","-6","1"
+"56661","Northome","MN","47.821937","-94.18727","-6","1"
+"56662","Outing","MN","46.850438","-93.94081","-6","1"
+"56663","Pennington","MN","47.464399","-94.44806","-6","1"
+"56666","Ponemah","MN","48.018746","-94.87594","-6","1"
+"56667","Puposky","MN","47.750406","-94.91254","-6","1"
+"56668","Ranier","MN","48.603143","-93.29771","-6","1"
+"56669","Ray","MN","48.443118","-93.14296","-6","1"
+"56670","Redby","MN","47.854118","-94.93168","-6","1"
+"56671","Redlake","MN","47.871135","-95.14362","-6","1"
+"56672","Remer","MN","47.036967","-94.02951","-6","1"
+"56673","Roosevelt","MN","48.730013","-95.09004","-6","1"
+"56676","Shevlin","MN","47.506665","-95.21527","-6","1"
+"56678","Solway","MN","47.508863","-95.11397","-6","1"
+"56679","South International Falls","MN","48.27888","-93.755536","-6","1"
+"56680","Spring Lake","MN","47.663689","-93.94631","-6","1"
+"56681","Squaw Lake","MN","47.617774","-94.24098","-6","1"
+"56682","Swift","MN","48.769244","-95.747559","-6","1"
+"56683","Tenstrike","MN","47.690018","-94.71889","-6","1"
+"56684","Trail","MN","47.855588","-95.69895","-6","1"
+"56685","Waskish","MN","48.153759","-94.51934","-6","1"
+"56686","Williams","MN","48.786139","-94.91418","-6","1"
+"56687","Wilton","MN","47.501402","-94.99344","-6","1"
+"56688","Wirt","MN","47.756467","-93.93298","-6","1"
+"56701","Thief River Falls","MN","48.118625","-96.1793","-6","1"
+"56710","Alvarado","MN","48.192532","-96.9986","-6","1"
+"56711","Angle Inlet","MN","49.342144","-95.03571","-6","1"
+"56712","Angus","MN","48.071847","-96.74918","-6","1"
+"56713","Argyle","MN","48.342579","-96.79448","-6","1"
+"56714","Badger","MN","48.795471","-96.01816","-6","1"
+"56715","Brooks","MN","47.808866","-95.97713","-6","1"
+"56716","Crookston","MN","47.761982","-96.58055","-6","1"
+"56720","Donaldson","MN","48.574128","-96.89632","-6","1"
+"56721","East Grand Forks","MN","47.956458","-96.98774","-6","1"
+"56722","Euclid","MN","47.970507","-96.66654","-6","1"
+"56723","Fisher","MN","47.826487","-96.83308","-6","1"
+"56724","Gatzke","MN","48.445999","-95.74148","-6","1"
+"56725","Goodridge","MN","48.128712","-95.82013","-6","1"
+"56726","Greenbush","MN","48.698749","-96.20637","-6","1"
+"56727","Grygla","MN","48.32162","-95.47515","-6","1"
+"56728","Hallock","MN","48.787016","-96.95434","-6","1"
+"56729","Halma","MN","48.655487","-96.59592","-6","1"
+"56731","Humboldt","MN","48.909857","-97.09566","-6","1"
+"56732","Karlstad","MN","48.565296","-96.47578","-6","1"
+"56733","Kennedy","MN","48.634961","-96.92156","-6","1"
+"56734","Lake Bronson","MN","48.732852","-96.63392","-6","1"
+"56735","Lancaster","MN","48.892011","-96.68027","-6","1"
+"56736","Mentor","MN","47.702366","-96.1539","-6","1"
+"56737","Middle River","MN","48.436061","-96.06973","-6","1"
+"56738","Newfolden","MN","48.348745","-96.32534","-6","1"
+"56740","Noyes","MN","48.771938","-96.812921","-6","1"
+"56741","Oak Island","MN","49.242285","-94.84003","-6","1"
+"56742","Oklee","MN","47.899103","-95.84846","-6","1"
+"56744","Oslo","MN","48.233942","-97.11882","-6","1"
+"56748","Plummer","MN","47.915369","-96.02739","-6","1"
+"56750","Red Lake Falls","MN","47.886448","-96.29033","-6","1"
+"56751","Roseau","MN","48.817919","-95.75167","-6","1"
+"56754","Saint Hilaire","MN","48.011365","-96.20491","-6","1"
+"56755","Saint Vincent","MN","48.954448","-97.13949","-6","1"
+"56756","Salol","MN","48.869494","-95.51436","-6","1"
+"56757","Stephen","MN","48.478075","-96.83465","-6","1"
+"56758","Strandquist","MN","48.472648","-96.5018","-6","1"
+"56759","Strathcona","MN","48.565391","-96.07014","-6","1"
+"56760","Viking","MN","48.232438","-96.44919","-6","1"
+"56761","Wannaska","MN","48.609478","-95.6602","-6","1"
+"56762","Warren","MN","48.195512","-96.74207","-6","1"
+"56763","Warroad","MN","48.890886","-95.33831","-6","1"
+"57001","Alcester","SD","42.974216","-96.63848","-6","1"
+"57002","Aurora","SD","44.287058","-96.67784","-6","1"
+"57003","Baltic","SD","43.726266","-96.74702","-6","1"
+"57004","Beresford","SD","43.069991","-96.79091","-6","1"
+"57005","Brandon","SD","43.590014","-96.58362","-6","1"
+"57006","Brookings","SD","44.305418","-96.7906","-6","1"
+"57007","Brookings","SD","44.369696","-96.790705","-6","1"
+"57010","Burbank","SD","42.819124","-96.8163","-6","1"
+"57012","Canistota","SD","43.608442","-97.25757","-6","1"
+"57013","Canton","SD","43.294672","-96.60442","-6","1"
+"57014","Centerville","SD","43.111838","-96.9563","-6","1"
+"57015","Chancellor","SD","43.410132","-96.97587","-6","1"
+"57016","Chester","SD","43.89916","-96.95926","-6","1"
+"57017","Colman","SD","44.001123","-96.81166","-6","1"
+"57018","Colton","SD","43.797629","-96.96107","-6","1"
+"57020","Crooks","SD","43.672525","-96.81757","-6","1"
+"57021","Davis","SD","43.268424","-96.99369","-6","1"
+"57022","Dell Rapids","SD","43.833265","-96.70684","-6","1"
+"57024","Egan","SD","43.997522","-96.65717","-6","1"
+"57025","Elk Point","SD","42.728534","-96.69785","-6","1"
+"57026","Elkton","SD","44.252315","-96.5166","-6","1"
+"57027","Fairview","SD","43.192357","-96.51982","-6","1"
+"57028","Flandreau","SD","44.047857","-96.58896","-6","1"
+"57029","Freeman","SD","43.335663","-97.47022","-6","1"
+"57030","Garretson","SD","43.735778","-96.54332","-6","1"
+"57031","Gayville","SD","42.886177","-97.18884","-6","1"
+"57032","Harrisburg","SD","43.424257","-96.67817","-6","1"
+"57033","Hartford","SD","43.614888","-96.95463","-6","1"
+"57034","Hudson","SD","43.134318","-96.51959","-6","1"
+"57035","Humboldt","SD","43.643112","-97.07195","-6","1"
+"57036","Hurley","SD","43.281047","-97.15149","-6","1"
+"57037","Irene","SD","43.104527","-97.24905","-6","1"
+"57038","Jefferson","SD","42.585305","-96.57657","-6","1"
+"57039","Lennox","SD","43.350093","-96.87487","-6","1"
+"57040","Lesterville","SD","43.060656","-97.58708","-6","1"
+"57041","Lyons","SD","43.723468","-96.86695","-6","1"
+"57042","Madison","SD","43.995586","-97.134","-6","1"
+"57043","Marion","SD","43.42258","-97.29026","-6","1"
+"57044","Meckling","SD","42.846853","-97.08438","-6","1"
+"57045","Menno","SD","43.214133","-97.53946","-6","1"
+"57046","Mission Hill","SD","42.945468","-97.2884","-6","1"
+"57047","Monroe","SD","43.50934","-97.21919","-6","1"
+"57048","Montrose","SD","43.734095","-97.18706","-6","1"
+"57049","North Sioux City","SD","42.524771","-96.49955","-6","1"
+"57050","Nunda","SD","44.159515","-97.00957","-6","1"
+"57051","Oldham","SD","44.219545","-97.34057","-6","1"
+"57052","Olivet","SD","43.29183","-97.7082","-6","1"
+"57053","Parker","SD","43.414257","-97.13198","-6","1"
+"57054","Ramona","SD","44.129029","-97.23971","-6","1"
+"57055","Renner","SD","43.668009","-96.73032","-6","1"
+"57056","Rowena","SD","43.521559","-96.558738","-6","1"
+"57057","Rutland","SD","44.102243","-96.95951","-6","1"
+"57058","Salem","SD","43.73161","-97.38526","-6","1"
+"57059","Scotland","SD","43.133482","-97.74525","-6","1"
+"57061","Sinai","SD","44.245062","-97.04171","-6","1"
+"57062","Springfield","SD","42.861759","-97.93431","-6","1"
+"57063","Tabor","SD","42.944651","-97.68587","-6","1"
+"57064","Tea","SD","43.450592","-96.84498","-6","1"
+"57065","Trent","SD","43.917178","-96.65524","-6","1"
+"57066","Tyndall","SD","42.991775","-97.86353","-6","1"
+"57067","Utica","SD","43.012455","-97.48749","-6","1"
+"57068","Valley Springs","SD","43.582689","-96.48692","-6","1"
+"57069","Vermillion","SD","42.812664","-96.94651","-6","1"
+"57070","Viborg","SD","43.194321","-97.13077","-6","1"
+"57071","Volga","SD","44.278584","-96.93911","-6","1"
+"57072","Volin","SD","42.989201","-97.2048","-6","1"
+"57073","Wakonda","SD","43.005861","-97.0545","-6","1"
+"57074","Ward","SD","44.156514","-96.46401","-6","1"
+"57075","Wentworth","SD","43.993676","-96.96892","-6","1"
+"57076","Winfred","SD","43.994948","-97.36611","-6","1"
+"57077","Worthing","SD","43.327859","-96.76115","-6","1"
+"57078","Yankton","SD","42.888538","-97.40958","-6","1"
+"57079","Yankton","SD","42.867556","-97.390268","-6","1"
+"57101","Sioux Falls","SD","43.546358","-96.69063","-6","1"
+"57103","Sioux Falls","SD","43.537075","-96.69527","-6","1"
+"57104","Sioux Falls","SD","43.560826","-96.7324","-6","1"
+"57105","Sioux Falls","SD","43.525226","-96.73297","-6","1"
+"57106","Sioux Falls","SD","43.514392","-96.80375","-6","1"
+"57107","Sioux Falls","SD","43.577696","-96.80101","-6","1"
+"57108","Sioux Falls","SD","43.488472","-96.72258","-6","1"
+"57109","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57110","Sioux Falls","SD","43.544375","-96.65801","-6","1"
+"57115","Buffalo Ridge","SD","43.521895","-96.868464","-6","1"
+"57117","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57118","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57188","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57189","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57192","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57193","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57194","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57195","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57196","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57197","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57198","Sioux Falls","SD","43.674582","-96.79134","-6","1"
+"57201","Watertown","SD","44.916657","-97.11346","-6","1"
+"57202","Waverly","SD","44.977634","-97.188372","-6","1"
+"57211","Cleveland","SD","44.543593","-97.358948","-6","1"
+"57212","Arlington","SD","44.377534","-97.13878","-6","1"
+"57213","Astoria","SD","44.551141","-96.51511","-6","1"
+"57214","Badger","SD","44.484691","-97.20668","-6","1"
+"57216","Big Stone City","SD","45.285323","-96.5024","-6","1"
+"57217","Bradley","SD","45.085704","-97.688","-6","1"
+"57218","Brandt","SD","44.652381","-96.5922","-6","1"
+"57219","Bristol","SD","45.278469","-97.78645","-6","1"
+"57220","Bruce","SD","44.459833","-96.91759","-6","1"
+"57221","Bryant","SD","44.588318","-97.46092","-6","1"
+"57223","Castlewood","SD","44.723825","-97.01425","-6","1"
+"57224","Claire City","SD","45.859112","-97.15011","-6","1"
+"57225","Clark","SD","44.877579","-97.74574","-6","1"
+"57226","Clear Lake","SD","44.790157","-96.69548","-6","1"
+"57227","Corona","SD","45.377288","-96.64746","-6","1"
+"57230","De Smet","SD","44.34715","-97.471509","-6","1"
+"57231","De Smet","SD","44.374289","-97.57442","-6","1"
+"57232","Eden","SD","45.631637","-97.36164","-6","1"
+"57233","Erwin","SD","44.494263","-97.42038","-6","1"
+"57234","Estelline","SD","44.587419","-96.90648","-6","1"
+"57235","Florence","SD","45.053712","-97.31065","-6","1"
+"57236","Garden City","SD","44.971494","-97.58996","-6","1"
+"57237","Gary","SD","44.797788","-96.5007","-6","1"
+"57238","Goodwin","SD","44.865062","-96.85949","-6","1"
+"57239","Grenville","SD","45.489637","-97.3198","-6","1"
+"57241","Hayti","SD","44.695445","-97.21584","-6","1"
+"57242","Hazel","SD","44.775741","-97.35251","-6","1"
+"57243","Henry","SD","44.917623","-97.43149","-6","1"
+"57244","Hetland","SD","44.416191","-97.23974","-6","1"
+"57245","Kranzburg","SD","44.889964","-96.91932","-6","1"
+"57246","Labolt","SD","45.048009","-96.66287","-6","1"
+"57247","Lake City","SD","45.725677","-97.42649","-6","1"
+"57248","Lake Norden","SD","44.578302","-97.18354","-6","1"
+"57249","Lake Preston","SD","44.355088","-97.35081","-6","1"
+"57251","Marvin","SD","45.268329","-96.9274","-6","1"
+"57252","Milbank","SD","45.215805","-96.6092","-6","1"
+"57253","Milbank","SD","45.151477","-96.839235","-6","1"
+"57255","New Effington","SD","45.859799","-96.91988","-6","1"
+"57256","Ortley","SD","45.217342","-97.19567","-6","1"
+"57257","Peever","SD","45.478644","-97.02057","-6","1"
+"57258","Raymond","SD","44.889927","-97.92375","-6","1"
+"57259","Revillo","SD","45.013469","-96.55366","-6","1"
+"57260","Rosholt","SD","45.871636","-96.7185","-6","1"
+"57261","Roslyn","SD","45.536715","-97.54435","-6","1"
+"57262","Sisseton","SD","45.667565","-97.04528","-6","1"
+"57263","South Shore","SD","45.128333","-97.03365","-6","1"
+"57264","Stockholm","SD","45.104925","-96.79467","-6","1"
+"57265","Strandburg","SD","45.014788","-96.78889","-6","1"
+"57266","Summit","SD","45.278474","-97.10544","-6","1"
+"57268","Toronto","SD","44.573144","-96.68409","-6","1"
+"57269","Twin Brooks","SD","45.227773","-96.79342","-6","1"
+"57270","Veblen","SD","45.83907","-97.37321","-6","1"
+"57271","Vienna","SD","44.736853","-97.50123","-6","1"
+"57272","Wallace","SD","45.084154","-97.47891","-6","1"
+"57273","Waubay","SD","45.369654","-97.2924","-6","1"
+"57274","Webster","SD","45.316779","-97.54052","-6","1"
+"57276","White","SD","44.428052","-96.63173","-6","1"
+"57278","Willow Lake","SD","44.623706","-97.68489","-6","1"
+"57279","Wilmot","SD","45.391241","-96.82332","-6","1"
+"57301","Mitchell","SD","43.711862","-98.03185","-6","1"
+"57309","Perry","SD","43.383541","-96.806422","-6","1"
+"57311","Alexandria","SD","43.645927","-97.76631","-6","1"
+"57312","Alpena","SD","44.195319","-98.3734","-6","1"
+"57313","Armour","SD","43.302262","-98.35489","-6","1"
+"57314","Artesian","SD","44.046328","-98.00076","-6","1"
+"57315","Avon","SD","43.006529","-98.04587","-6","1"
+"57317","Bonesteel","SD","43.104344","-98.97227","-6","1"
+"57319","Bridgewater","SD","43.548586","-97.45467","-6","1"
+"57321","Canova","SD","43.87045","-97.54046","-6","1"
+"57322","Carpenter","SD","44.638862","-97.97146","-6","1"
+"57323","Carthage","SD","44.157714","-97.7152","-6","1"
+"57324","Cavour","SD","44.305089","-98.04565","-6","1"
+"57325","Chamberlain","SD","43.781193","-99.29864","-6","1"
+"57326","Chamberlain","SD","43.71725","-99.131736","-6","1"
+"57328","Corsica","SD","43.438138","-98.44031","-6","1"
+"57329","Dante","SD","43.002628","-98.16211","-6","1"
+"57330","Delmont","SD","43.261271","-98.16163","-6","1"
+"57331","Dimock","SD","43.481227","-98.04772","-6","1"
+"57332","Emery","SD","43.565083","-97.63714","-6","1"
+"57334","Ethan","SD","43.549862","-97.99713","-6","1"
+"57335","Fairfax","SD","43.037683","-98.74998","-6","1"
+"57337","Fedora","SD","44.008344","-97.79178","-6","1"
+"57339","Fort Thompson","SD","44.074578","-99.43287","-6","1"
+"57340","Fulton","SD","43.772732","-97.8416","-6","1"
+"57341","Gann Valley","SD","44.070421","-99.01332","-6","1"
+"57342","Geddes","SD","43.257067","-98.69907","-6","1"
+"57344","Harrison","SD","43.449261","-98.61919","-6","1"
+"57345","Highmore","SD","44.601978","-99.44519","-6","1"
+"57346","Stephan","SD","44.246147","-99.45466","-6","1"
+"57347","Benton","SD","43.73319","-97.607194","-6","1"
+"57348","Hitchcock","SD","44.625453","-98.37219","-6","1"
+"57349","Howard","SD","44.025045","-97.56056","-6","1"
+"57350","Huron","SD","44.377801","-98.20936","-6","1"
+"57353","Iroquois","SD","44.391844","-97.82982","-6","1"
+"57354","Kaylor","SD","43.334069","-97.756924","-6","1"
+"57355","Kimball","SD","43.754325","-98.96882","-6","1"
+"57356","Lake Andes","SD","43.144738","-98.51408","-6","1"
+"57357","Ravinia","SD","43.136365","-98.427173","-6","1"
+"57358","Lane","SD","44.070966","-98.42594","-6","1"
+"57359","Letcher","SD","43.896226","-98.14931","-6","1"
+"57361","Marty","SD","43.007052","-98.4172","-6","1"
+"57362","Miller","SD","44.523028","-99.03397","-6","1"
+"57363","Mount Vernon","SD","43.69156","-98.2555","-6","1"
+"57364","New Holland","SD","43.429115","-98.61012","-6","1"
+"57365","Oacoma","SD","43.808858","-99.38782","-6","1"
+"57366","Parkston","SD","43.391523","-97.94713","-6","1"
+"57367","Pickstown","SD","43.062919","-98.53232","-6","1"
+"57368","Plankinton","SD","43.733471","-98.47215","-6","1"
+"57369","Platte","SD","43.435193","-98.89387","-6","1"
+"57370","Pukwana","SD","43.854809","-99.15712","-6","1"
+"57371","Ree Heights","SD","44.430739","-99.22041","-6","1"
+"57373","Saint Lawrence","SD","44.514512","-98.8941","-6","1"
+"57374","Spencer","SD","43.738472","-97.60039","-6","1"
+"57375","Stickney","SD","43.556293","-98.46986","-6","1"
+"57376","Tripp","SD","43.220164","-97.94616","-6","1"
+"57379","Virgil","SD","44.276539","-98.52872","-6","1"
+"57380","Wagner","SD","43.045048","-98.29838","-6","1"
+"57381","Wessington","SD","44.428879","-98.71147","-6","1"
+"57382","Wessington Springs","SD","44.051324","-98.63556","-6","1"
+"57383","White Lake","SD","43.69412","-98.70407","-6","1"
+"57384","Wolsey","SD","44.414842","-98.47279","-6","1"
+"57385","Woonsocket","SD","44.05448","-98.28766","-6","1"
+"57386","Yale","SD","44.492158","-97.98222","-6","1"
+"57399","Huron","SD","44.414319","-98.279548","-6","1"
+"57401","Aberdeen","SD","45.46932","-98.49646","-6","1"
+"57402","Aberdeen","SD","45.589567","-98.352014","-6","1"
+"57411","Bryant","SD","45.470676","-99.257022","-6","1"
+"57420","Akaska","SD","45.327593","-100.12424","-6","1"
+"57421","Amherst","SD","45.755146","-97.92723","-6","1"
+"57422","Andover","SD","45.418297","-97.92959","-6","1"
+"57424","Ashton","SD","45.008745","-98.52375","-6","1"
+"57426","Barnard","SD","45.727807","-98.50795","-6","1"
+"57427","Bath","SD","45.499572","-98.30102","-6","1"
+"57428","Bowdle","SD","45.459575","-99.67824","-6","1"
+"57429","Brentford","SD","45.163452","-98.319296","-6","1"
+"57430","Britton","SD","45.827391","-97.73978","-6","1"
+"57432","Claremont","SD","45.674523","-98.01846","-6","1"
+"57433","Columbia","SD","45.625285","-98.31005","-6","1"
+"57434","Conde","SD","45.175381","-98.08986","-6","1"
+"57435","Cresbard","SD","45.160833","-98.92417","-6","1"
+"57436","Doland","SD","44.863792","-98.08876","-6","1"
+"57437","Eureka","SD","45.796151","-99.62497","-6","1"
+"57438","Faulkton","SD","45.06623","-99.1345","-6","1"
+"57439","Ferney","SD","45.32904","-98.083721","-6","1"
+"57440","Frankfort","SD","44.857069","-98.27191","-6","1"
+"57441","Frederick","SD","45.834246","-98.51539","-6","1"
+"57442","Gettysburg","SD","45.007901","-100.05209","-6","1"
+"57443","Cambria","SD","45.697865","-98.317734","-6","1"
+"57445","Groton","SD","45.458312","-98.13416","-6","1"
+"57446","Hecla","SD","45.864171","-98.18814","-6","1"
+"57448","Hosmer","SD","45.593008","-99.44937","-6","1"
+"57449","Houghton","SD","45.726524","-98.21765","-6","1"
+"57450","Hoven","SD","45.253428","-99.84288","-6","1"
+"57451","Ipswich","SD","45.43694","-99.02218","-6","1"
+"57452","Java","SD","45.549059","-99.88459","-6","1"
+"57454","Langford","SD","45.612148","-97.76274","-6","1"
+"57455","Lebanon","SD","45.041882","-99.76851","-6","1"
+"57456","Leola","SD","45.743673","-98.94361","-6","1"
+"57457","Longlake","SD","45.893818","-99.15407","-6","1"
+"57460","Mansfield","SD","45.26493","-98.65019","-6","1"
+"57461","Mellette","SD","45.152388","-98.42497","-6","1"
+"57462","Mina","SD","45.425378","-98.77372","-6","1"
+"57465","Northville","SD","45.151166","-98.65671","-6","1"
+"57466","Onaka","SD","45.213867","-99.48135","-6","1"
+"57467","Orient","SD","44.84796","-99.11828","-6","1"
+"57468","Pierpont","SD","45.493324","-97.78571","-6","1"
+"57469","Redfield","SD","44.864263","-98.5409","-6","1"
+"57470","Rockham","SD","44.899458","-98.86967","-6","1"
+"57471","Roscoe","SD","45.42443","-99.3053","-6","1"
+"57472","Selby","SD","45.486222","-100.04843","-6","1"
+"57473","Seneca","SD","45.020366","-99.50178","-6","1"
+"57474","Stratford","SD","45.287179","-98.27899","-6","1"
+"57475","Tolstoy","SD","45.223419","-99.62537","-6","1"
+"57476","Tulare","SD","44.713517","-98.61569","-6","1"
+"57477","Turton","SD","45.032244","-98.14355","-6","1"
+"57479","Warner","SD","45.321875","-98.46429","-6","1"
+"57481","Westport","SD","45.663385","-98.62274","-6","1"
+"57501","Pierre","SD","44.425356","-100.29145","-6","1"
+"57520","Agar","SD","44.830961","-100.11167","-6","1"
+"57521","Belvidere","SD","43.839641","-101.26996","-7","1"
+"57522","Blunt","SD","44.500958","-99.99188","-6","1"
+"57523","Burke","SD","43.190783","-99.28191","-6","1"
+"57526","Carter","SD","43.483177","-100.19302","-6","1"
+"57528","Colome","SD","43.205207","-99.76123","-6","1"
+"57529","Dallas","SD","43.263007","-99.5615","-6","1"
+"57531","Draper","SD","43.990243","-100.52716","-6","1"
+"57532","Fort Pierre","SD","44.326157","-100.43382","-7","1"
+"57533","Gregory","SD","43.229236","-99.42096","-6","1"
+"57534","Hamill","SD","43.630273","-99.7528","-6","1"
+"57536","Harrold","SD","44.461748","-99.77535","-6","1"
+"57537","Hayes","SD","44.545795","-101.12947","-7","1"
+"57538","Herrick","SD","43.070066","-99.16628","-6","1"
+"57540","Holabird","SD","44.466602","-99.61724","-6","1"
+"57541","Ideal","SD","43.615797","-99.93186","-6","1"
+"57542","Iona","SD","43.573247","-99.48175","-6","1"
+"57543","Kadoka","SD","43.829457","-101.52963","-7","1"
+"57544","Kennebec","SD","43.908053","-99.81529","-6","1"
+"57547","Long Valley","SD","43.501449","-101.51685","-7","1"
+"57548","Lower Brule","SD","44.057302","-99.54871","-6","1"
+"57551","Martin","SD","43.223447","-101.65737","-7","1"
+"57552","Midland","SD","44.159861","-101.19002","-7","1"
+"57553","Milesville","SD","44.478744","-101.63569","-7","1"
+"57555","Mission","SD","43.233874","-100.64693","-6","1"
+"57557","Mission Ridge","SD","44.475844","-100.529517","-6","1"
+"57559","Murdo","SD","43.889878","-100.74257","-6","1"
+"57560","Norris","SD","43.493132","-101.16474","-6","1"
+"57562","Okaton","SD","43.908211","-101.00351","-6","1"
+"57563","Okreek","SD","43.360304","-100.38868","-6","1"
+"57564","Onida","SD","44.68577","-100.04014","-6","1"
+"57565","Timber Lake","SD","45.426656","-101.077412","-7","1"
+"57566","Parmelee","SD","43.321116","-101.05768","-6","1"
+"57567","Philip","SD","44.036966","-101.71251","-7","1"
+"57568","Presho","SD","43.893368","-100.0569","-6","1"
+"57569","Reliance","SD","43.839997","-99.57459","-6","1"
+"57570","Rosebud","SD","43.232817","-100.90791","-6","1"
+"57571","Saint Charles","SD","43.085296","-99.09765","-6","1"
+"57572","Saint Francis","SD","43.111157","-100.94904","-6","1"
+"57574","Tuthill","SD","43.126441","-101.3747","-7","1"
+"57576","Vivian","SD","43.934133","-100.2916","-6","1"
+"57577","Wanblee","SD","43.552017","-101.67309","-7","1"
+"57578","Wewela","SD","43.026834","-99.81844","-6","1"
+"57579","White River","SD","43.579476","-100.77982","-6","1"
+"57580","Winner","SD","43.289115","-99.97143","-6","1"
+"57584","Witten","SD","43.528885","-100.09039","-6","1"
+"57585","Wood","SD","43.557963","-100.38483","-6","1"
+"57601","Mobridge","SD","45.472087","-100.45819","-7","1"
+"57620","Bison","SD","45.454454","-102.5039","-7","1"
+"57621","Bullhead","SD","45.764511","-101.07093","-7","1"
+"57622","Cherry Creek","SD","44.617992","-101.53458","-7","1"
+"57623","Dupree","SD","45.103367","-101.63974","-7","1"
+"57625","Eagle Butte","SD","44.926725","-101.18538","-7","1"
+"57626","Faith","SD","44.947869","-102.02661","-7","1"
+"57628","Firesteel","SD","45.55964","-101.20322","-7","1"
+"57629","Glad Valley","SD","44.992051","-101.568656","-7","1"
+"57630","Glencross","SD","45.098685","-100.879214","-7","1"
+"57631","Glenham","SD","45.592102","-100.28391","-6","1"
+"57632","Herreid","SD","45.834848","-100.1001","-6","1"
+"57633","Isabel","SD","45.448377","-101.44983","-7","1"
+"57634","Keldron","SD","45.814856","-101.85821","-7","1"
+"57636","Lantry","SD","45.03794","-101.42207","-7","1"
+"57638","Lemmon","ND","46.034096","-102.11476","-7","1"
+"57639","Little Eagle","SD","45.708402","-101.154581","-7","1"
+"57640","Lodgepole","SD","45.768967","-102.70446","-7","1"
+"57641","McIntosh","SD","45.869314","-101.318","-7","1"
+"57642","McLaughlin","SD","45.796863","-100.77282","-7","1"
+"57643","Mahto","SD","45.708402","-101.154581","-7","1"
+"57644","Meadow","SD","45.402823","-102.13021","-7","1"
+"57645","Morristown","SD","45.884074","-101.7111","-7","1"
+"57646","Mound City","SD","45.700753","-100.09434","-6","1"
+"57647","Parade","SD","45.098685","-100.879214","-7","1"
+"57648","Pollock","SD","45.896895","-100.28995","-6","1"
+"57649","Prairie City","SD","45.511837","-102.85815","-7","1"
+"57650","Ralph","SD","45.849098","-103.01489","-7","1"
+"57651","Reva","SD","45.414346","-103.14501","-7","1"
+"57652","Ridgeview","SD","45.125932","-100.56202","-7","1"
+"57653","Shadehill","SD","45.690446","-102.25384","-7","1"
+"57656","Timber Lake","SD","45.354993","-101.0562","-7","1"
+"57657","Trail City","SD","45.51978","-100.88176","-7","1"
+"57658","Wakpala","SD","45.68838","-100.51908","-7","1"
+"57659","Walker","SD","45.708402","-101.154581","-7","1"
+"57660","Watauga","SD","45.831561","-101.48462","-7","1"
+"57661","Whitehorse","SD","45.198748","-100.85342","-7","1"
+"57671","McIntosh","SD","45.924062","-101.354116","-7","1"
+"57673","York","SD","44.556082","-98.928401","-6","1"
+"57683","Orange","ND","45.984316","-102.101218","-7","1"
+"57700","Rapid City","SD","44.090788","-103.284511","-7","1"
+"57701","Rapid City","SD","44.085288","-103.21335","-7","1"
+"57702","Rapid City","SD","44.052788","-103.34302","-7","1"
+"57703","Rapid City","SD","44.05164","-103.13061","-7","1"
+"57706","Ellsworth AFB","SD","44.144225","-103.08527","-7","1"
+"57708","Bethlehem","SD","44.271094","-103.420131","-7","1"
+"57709","Rapid City","SD","44.076106","-103.317149","-7","1"
+"57714","Allen","SD","43.31492","-101.92918","-7","1"
+"57716","Batesland","SD","43.134526","-102.16756","-7","1"
+"57717","Belle Fourche","SD","44.768396","-103.83095","-7","1"
+"57718","Black Hawk","SD","44.173449","-103.33329","-7","1"
+"57719","Box Elder","SD","44.122693","-103.06315","-7","1"
+"57720","Buffalo","SD","45.547869","-103.58054","-7","1"
+"57722","Buffalo Gap","SD","43.473186","-102.98607","-7","1"
+"57724","Camp Crook","SD","45.616269","-103.92593","-7","1"
+"57725","Caputa","SD","43.940637","-102.8122","-7","1"
+"57729","Creighton","SD","44.308909","-102.09713","-7","1"
+"57730","Custer","SD","43.789695","-103.63631","-7","1"
+"57732","Deadwood","SD","44.338702","-103.70916","-7","1"
+"57735","Edgemont","SD","43.424499","-103.90273","-7","1"
+"57736","Elm Springs","SD","44.338785","-102.41529","-7","1"
+"57737","Enning","SD","44.560996","-102.57677","-7","1"
+"57738","Fairburn","SD","43.682883","-103.24356","-7","1"
+"57741","Fort Meade","SD","44.40932","-103.455428","-7","1"
+"57742","Fruitdale","SD","44.65371","-103.68084","-7","1"
+"57744","Hermosa","SD","43.796169","-103.07698","-7","1"
+"57745","Hill City","SD","43.965949","-103.62797","-7","1"
+"57747","Hot Springs","SD","43.401616","-103.5051","-7","1"
+"57748","Howes","SD","44.59203","-101.98721","-7","1"
+"57750","Interior","SD","43.654636","-101.94355","-7","1"
+"57751","Keystone","SD","43.892254","-103.41721","-7","1"
+"57752","Kyle","SD","43.389365","-102.17671","-7","1"
+"57754","Lead","SD","44.312922","-103.83118","-7","1"
+"57755","Ludlow","SD","45.869257","-103.29412","-7","1"
+"57756","Manderson","SD","43.24449","-102.49502","-7","1"
+"57758","Mud Butte","SD","45.033915","-102.78168","-7","1"
+"57759","Nemo","SD","44.197255","-103.53733","-7","1"
+"57760","Newell","SD","44.854326","-103.32109","-7","1"
+"57761","New Underwood","SD","44.133058","-102.78887","-7","1"
+"57762","Nisland","SD","44.688572","-103.59186","-7","1"
+"57763","Oelrichs","SD","43.178182","-103.22927","-7","1"
+"57764","Oglala","SD","43.257154","-102.77414","-7","1"
+"57765","Opal","SD","44.939762","-102.41764","-7","1"
+"57766","Oral","SD","43.364717","-103.23035","-7","1"
+"57767","Owanka","SD","44.110334","-102.58976","-7","1"
+"57769","Piedmont","SD","44.236634","-103.33998","-7","1"
+"57770","Pine Ridge","SD","43.046493","-102.57323","-7","1"
+"57772","Porcupine","SD","43.331433","-102.38093","-7","1"
+"57773","Pringle","SD","43.609557","-103.59517","-7","1"
+"57774","Provo","SD","43.156481","-103.70735","-7","1"
+"57775","Quinn","SD","44.042842","-102.07873","-7","1"
+"57776","Redig","SD","45.578941","-103.493668","-7","1"
+"57777","Red Owl","SD","44.735001","-102.45764","-7","1"
+"57778","Rochford","SD","44.079794","-103.8513","-7","1"
+"57779","Saint Onge","SD","44.578116","-103.75465","-7","1"
+"57780","Scenic","SD","43.726261","-102.41628","-7","1"
+"57782","Smithwick","SD","43.239655","-103.527757","-7","1"
+"57783","Spearfish","SD","44.48837","-103.87853","-7","1"
+"57785","Sturgis","SD","44.409616","-103.46597","-7","1"
+"57787","Union Center","SD","44.619045","-102.76873","-7","1"
+"57788","Vale","SD","44.60302","-103.36866","-7","1"
+"57790","Wall","SD","44.018548","-102.23778","-7","1"
+"57791","Wasta","SD","44.067091","-102.47618","-7","1"
+"57792","White Owl","SD","44.562488","-102.41683","-7","1"
+"57793","Whitewood","SD","44.472475","-103.62933","-7","1"
+"57794","Wounded Knee","SD","43.138184","-102.36897","-7","1"
+"57796","Wall","SD","43.994049","-102.236971","-7","1"
+"57799","Spearfish","SD","44.492688","-103.86974","-7","1"
+"57840","Harrison","SD","44.798968","-98.200789","-6","1"
+"57841","Carlisle","SD","45.632378","-98.704197","-6","1"
+"57949","Big Sioux","SD","42.505818","-96.499259","-6","1"
+"58000","Minot","ND","48.226422","-101.274388","-6","1"
+"58001","Abercrombie","ND","46.448462","-96.73165","-6","1"
+"58002","Absaraka","ND","46.859694","-97.214587","-6","1"
+"58004","Amenia","ND","47.028291","-97.25029","-6","1"
+"58005","Argusville","ND","47.057098","-96.95043","-6","1"
+"58006","Arthur","ND","47.10167","-97.2147","-6","1"
+"58007","Ayr","ND","47.020312","-97.45571","-6","1"
+"58008","Barney","ND","46.304176","-96.99819","-6","1"
+"58009","Blanchard","ND","47.331202","-97.25077","-6","1"
+"58011","Buffalo","ND","46.920174","-97.54484","-6","1"
+"58012","Casselton","ND","46.912684","-97.18939","-6","1"
+"58013","Cayuga","ND","46.076891","-97.35562","-6","1"
+"58014","Chaffee","ND","46.775027","-97.352437","-6","1"
+"58015","Christine","ND","46.581114","-96.823","-6","1"
+"58016","Clifford","ND","47.34623","-97.46372","-6","1"
+"58017","Cogswell","ND","46.059066","-97.80989","-6","1"
+"58018","Colfax","ND","46.437401","-96.89354","-6","1"
+"58021","Davenport","ND","46.729689","-97.07941","-6","1"
+"58027","Enderlin","ND","46.630659","-97.6003","-6","1"
+"58029","Erie","ND","47.118212","-97.38881","-6","1"
+"58030","Fairmount","ND","46.043951","-96.66927","-6","1"
+"58031","Fingal","ND","46.767912","-97.67144","-6","1"
+"58032","Forman","ND","46.098941","-97.63549","-6","1"
+"58033","Fort Ransom","ND","46.449141","-97.91961","-6","1"
+"58035","Galesburg","ND","47.25098","-97.426","-6","1"
+"58036","Gardner","ND","47.15096","-96.96482","-6","1"
+"58038","Grandin","ND","47.251489","-96.98522","-6","1"
+"58039","Great Bend","ND","46.153098","-96.80909","-6","1"
+"58040","Gwinner","ND","46.214772","-97.66923","-6","1"
+"58041","Hankinson","ND","46.052141","-96.91067","-6","1"
+"58042","Harwood","ND","46.984696","-96.9327","-6","1"
+"58043","Havana","ND","45.979819","-97.57406","-6","1"
+"58045","Hillsboro","ND","47.389215","-97.05327","-6","1"
+"58046","Hope","ND","47.293363","-97.75338","-6","1"
+"58047","Horace","ND","46.724294","-96.8728","-6","1"
+"58048","Hunter","ND","47.198818","-97.21831","-6","1"
+"58049","Kathryn","ND","46.657292","-97.98732","-6","1"
+"58051","Kindred","ND","46.634764","-97.02012","-6","1"
+"58052","Leonard","ND","46.650902","-97.28313","-6","1"
+"58053","Lidgerwood","ND","46.067238","-97.18736","-6","1"
+"58054","Lisbon","ND","46.43383","-97.67678","-6","1"
+"58056","Luverne","ND","47.252754","-97.93864","-6","1"
+"58057","Mcleod","ND","46.451477","-97.24848","-6","1"
+"58058","Mantador","ND","46.167324","-96.98251","-6","1"
+"58059","Mapleton","ND","46.839654","-97.12241","-6","1"
+"58060","Milnor","ND","46.253432","-97.44507","-6","1"
+"58061","Mooreton","ND","46.27338","-96.88178","-6","1"
+"58062","Nome","ND","46.669107","-97.81842","-6","1"
+"58063","Oriska","ND","46.947243","-97.81827","-6","1"
+"58064","Page","ND","47.151891","-97.60401","-6","1"
+"58065","Pillsbury","ND","46.650741","-98.195722","-6","1"
+"58067","Rutland","ND","46.072821","-97.49872","-6","1"
+"58068","Sheldon","ND","46.564908","-97.43763","-6","1"
+"58069","Stirum","ND","46.232799","-97.85092","-6","1"
+"58071","Tower City","ND","46.930679","-97.68708","-6","1"
+"58072","Valley City","ND","46.934311","-98.02374","-6","1"
+"58074","Wahpeton","ND","46.283291","-96.917614","-6","1"
+"58075","Wahpeton","ND","46.28232","-96.68494","-6","1"
+"58076","Wahpeton","ND","46.271839","-96.608142","-6","1"
+"58077","Walcott","ND","46.533488","-96.93756","-6","1"
+"58078","West Fargo","ND","46.875367","-96.90503","-6","1"
+"58079","Wheatland","ND","46.883504","-97.35616","-6","1"
+"58081","Wyndmere","ND","46.282064","-97.13477","-6","1"
+"58102","Fargo","ND","46.900348","-96.80016","-6","1"
+"58103","Fargo","ND","46.860864","-96.81602","-6","1"
+"58104","Fargo","ND","46.812118","-96.839","-6","1"
+"58105","Fargo","ND","46.9414","-96.967371","-6","1"
+"58106","Fargo","ND","46.934596","-97.229718","-6","1"
+"58107","Fargo","ND","46.934596","-97.229718","-6","1"
+"58108","Fargo","ND","46.934596","-97.229718","-6","1"
+"58109","Fargo","ND","46.82352","-96.8148","-6","1"
+"58121","Fargo","ND","46.934596","-97.229718","-6","1"
+"58122","Fargo","ND","46.934596","-97.229718","-6","1"
+"58123","Fargo","ND","46.934596","-97.229718","-6","1"
+"58124","Fargo","ND","46.934596","-97.229718","-6","1"
+"58125","Fargo","ND","46.934596","-97.229718","-6","1"
+"58126","Fargo","ND","46.934596","-97.229718","-6","1"
+"58201","Grand Forks","ND","47.899217","-97.05896","-6","1"
+"58202","Grand Forks","ND","47.920679","-97.07228","-6","1"
+"58203","Grand Forks","ND","47.938898","-97.08401","-6","1"
+"58204","Grand Forks AFB","ND","47.943847","-97.37255","-6","1"
+"58205","Grand Forks AFB","ND","47.933481","-97.394446","-6","1"
+"58206","Grand Forks","ND","47.933481","-97.394446","-6","1"
+"58207","Grand Forks","ND","47.933481","-97.394446","-6","1"
+"58208","Grand Forks","ND","47.933481","-97.394446","-6","1"
+"58210","Adams","ND","48.391059","-98.11173","-6","1"
+"58212","Aneta","ND","47.694","-97.99703","-6","1"
+"58213","Ardoch","ND","48.204374","-97.30774","-6","1"
+"58214","Arvilla","ND","47.930777","-97.49066","-6","1"
+"58216","Bathgate","ND","48.883906","-97.4489","-6","1"
+"58218","Buxton","ND","47.592267","-97.07503","-6","1"
+"58219","Caledonia","ND","47.472415","-96.8887","-6","1"
+"58220","Cavalier","ND","48.797042","-97.69887","-6","1"
+"58222","Crystal","ND","48.62293","-97.67862","-6","1"
+"58223","Cummings","ND","47.505171","-97.05906","-6","1"
+"58224","Dahlen","ND","48.173113","-97.95766","-6","1"
+"58225","Drayton","ND","48.593133","-97.22272","-6","1"
+"58227","Edinburg","ND","48.527038","-97.90612","-6","1"
+"58228","Emerado","ND","47.882652","-97.35564","-6","1"
+"58229","Fairdale","ND","48.497876","-98.23678","-6","1"
+"58230","Finley","ND","47.475797","-97.80427","-6","1"
+"58231","Fordville","ND","48.214268","-97.82544","-6","1"
+"58233","Forest River","ND","48.228707","-97.52498","-6","1"
+"58234","Brantford","SD","47.889186","-98.125687","-6","1"
+"58235","Gilby","ND","48.084335","-97.47238","-6","1"
+"58236","Glasston","ND","48.714076","-97.44741","-6","1"
+"58237","Grafton","ND","48.415911","-97.4096","-6","1"
+"58238","Hamilton","ND","48.782885","-97.4149","-6","1"
+"58239","Hannah","ND","48.950929","-98.66921","-6","1"
+"58240","Hatton","ND","47.631","-97.48511","-6","1"
+"58241","Hensel","ND","48.710208","-97.69893","-6","1"
+"58243","Hoople","ND","48.515762","-97.66385","-6","1"
+"58244","Inkster","ND","48.144073","-97.63321","-6","1"
+"58249","Langdon","ND","48.811921","-98.31033","-6","1"
+"58250","Lankin","ND","48.288615","-98.00082","-6","1"
+"58251","Larimore","ND","47.942137","-97.67455","-6","1"
+"58254","Mcville","ND","47.765244","-98.16357","-6","1"
+"58255","Maida","ND","48.999101","-98.35241","-6","1"
+"58256","Manvel","ND","48.083218","-97.18994","-6","1"
+"58257","Mayville","ND","47.490878","-97.29392","-6","1"
+"58258","Mekinock","ND","48.008825","-97.35424","-6","1"
+"58259","Michigan","ND","48.052404","-98.12379","-6","1"
+"58260","Milton","ND","48.622954","-98.05162","-6","1"
+"58261","Minto","ND","48.288316","-97.28711","-6","1"
+"58262","Mountain","ND","48.689123","-97.86695","-6","1"
+"58265","Neche","ND","48.956342","-97.59021","-6","1"
+"58266","Niagara","ND","48.000075","-97.85041","-6","1"
+"58267","Northwood","ND","47.76354","-97.59279","-6","1"
+"58269","Osnabrock","ND","48.695247","-98.17672","-6","1"
+"58270","Park River","ND","48.39642","-97.78025","-6","1"
+"58271","Pembina","ND","48.943042","-97.27924","-6","1"
+"58272","Petersburg","ND","48.013283","-97.99298","-6","1"
+"58273","Pisek","ND","48.303376","-97.69767","-6","1"
+"58274","Portland","ND","47.491179","-97.46343","-6","1"
+"58275","Reynolds","ND","47.67933","-97.121","-6","1"
+"58276","Saint Thomas","ND","48.628551","-97.44823","-6","1"
+"58277","Sharon","ND","47.608142","-97.8179","-6","1"
+"58278","Thompson","ND","47.772417","-97.11074","-6","1"
+"58281","Wales","ND","48.855352","-98.6171","-6","1"
+"58282","Walhalla","ND","48.915739","-97.92312","-6","1"
+"58293","Farmington","ND","48.528451","-97.504912","-6","1"
+"58300","Poplar Grove","ND","48.10066","-98.984266","-6","1"
+"58301","Devils Lake","ND","48.122688","-98.87752","-6","1"
+"58310","Agate","ND","48.617378","-99.63453","-6","1"
+"58311","Alsen","ND","48.637939","-98.61192","-6","1"
+"58313","Balta","ND","48.165299","-100.0384","-6","1"
+"58316","Belcourt","ND","48.837507","-99.76388","-6","1"
+"58317","Bisbee","ND","48.628607","-99.37707","-6","1"
+"58318","Bottineau","ND","48.864955","-100.41403","-6","1"
+"58319","Bremen","ND","47.663508","-99.664406","-6","1"
+"58320","Brinsmade","ND","48.28641","-99.404705","-6","1"
+"58321","Brocket","ND","48.204745","-98.31437","-6","1"
+"58323","Calvin","ND","48.849591","-98.90525","-6","1"
+"58324","Cando","ND","48.485321","-99.2076","-6","1"
+"58325","Churchs Ferry","ND","48.272135","-99.16654","-6","1"
+"58327","Crary","ND","48.088486","-98.56277","-6","1"
+"58329","Dunseith","ND","48.855835","-100.03636","-6","1"
+"58330","Edmore","ND","48.427738","-98.52492","-6","1"
+"58331","Egeland","ND","48.65545","-99.11415","-6","1"
+"58332","Esmond","ND","48.058376","-99.77766","-6","1"
+"58333","Sykeston","ND","47.580254","-99.65457","-6","1"
+"58335","Fort Totten","ND","47.968523","-99.02831","-6","1"
+"58337","Hamberg","ND","47.587372","-99.667737","-6","1"
+"58338","Hampden","ND","48.530196","-98.641","-6","1"
+"58339","Hansboro","ND","48.900063","-99.427769","-6","1"
+"58341","Harvey","ND","47.767862","-99.84416","-6","1"
+"58343","Knox","ND","48.311156","-99.70744","-6","1"
+"58344","Lakota","ND","48.021136","-98.33502","-6","1"
+"58345","Lawton","ND","48.303578","-98.33378","-6","1"
+"58346","Leeds","ND","48.286717","-99.42675","-6","1"
+"58348","Maddock","ND","47.955217","-99.52317","-6","1"
+"58351","Minnewaukan","ND","48.100632","-99.29718","-6","1"
+"58352","Munich","ND","48.696001","-98.87272","-6","1"
+"58353","Mylo","ND","48.636915","-99.61665","-6","1"
+"58355","Nekoma","ND","48.591846","-98.36827","-6","1"
+"58356","New Rockford","ND","47.669608","-99.10553","-6","1"
+"58357","Oberon","ND","47.931081","-99.22269","-6","1"
+"58358","Fort Yates","ND","46.084899","-100.630803","-6","1"
+"58359","Orrin","ND","48.091057","-100.1644","-6","1"
+"58361","Pekin","ND","47.75436","-98.33975","-6","1"
+"58362","Penn","ND","48.223375","-99.09558","-6","1"
+"58363","Perth","ND","48.742513","-99.42744","-6","1"
+"58365","Rocklake","ND","48.84741","-99.26643","-6","1"
+"58366","Rolette","ND","48.653781","-99.91768","-6","1"
+"58367","Rolla","ND","48.855873","-99.58558","-6","1"
+"58368","Rugby","ND","48.273263","-100.00991","-6","1"
+"58369","Saint John","ND","48.937584","-99.8055","-6","1"
+"58370","Saint Michael","ND","47.994379","-98.86913","-6","1"
+"58371","Grandfield","ND","47.799663","-99.211615","-6","1"
+"58372","Sarles","ND","48.947387","-99.02227","-6","1"
+"58374","Sheyenne","ND","47.839733","-99.07241","-6","1"
+"58377","Starkweather","ND","48.478826","-98.87311","-6","1"
+"58379","Tokio","ND","47.934575","-98.82459","-6","1"
+"58380","Tolna","ND","47.836237","-98.51502","-6","1"
+"58381","Warwick","ND","47.840223","-98.74895","-6","1"
+"58382","Webster","ND","48.318106","-98.79973","-6","1"
+"58384","Willow City","ND","48.609924","-100.26587","-6","1"
+"58385","Wolford","ND","48.470278","-99.67497","-6","1"
+"58386","York","ND","48.3223","-99.59878","-6","1"
+"58401","Jamestown","ND","46.906983","-98.72826","-6","1"
+"58402","Jamestown","ND","46.97882","-98.960032","-6","1"
+"58405","Jamestown","ND","46.913344","-98.699553","-6","1"
+"58413","Ashley","ND","46.052308","-99.27476","-6","1"
+"58415","Berlin","ND","46.362812","-98.48404","-6","1"
+"58416","Binford","ND","47.555709","-98.34567","-6","1"
+"58418","Bowdon","ND","47.42157","-99.63946","-6","1"
+"58420","Buchanan","ND","47.073601","-98.85843","-6","1"
+"58421","Carrington","ND","47.450049","-99.08527","-6","1"
+"58422","Cathay","ND","47.609264","-99.42568","-6","1"
+"58423","Chaseley","ND","47.49417","-99.84212","-6","1"
+"58424","Cleveland","ND","46.888946","-99.11315","-6","1"
+"58425","Cooperstown","ND","47.446297","-98.13417","-6","1"
+"58426","Courtenay","ND","47.227781","-98.58545","-6","1"
+"58428","Dawson","ND","46.868175","-99.74913","-6","1"
+"58429","Dazey","ND","47.201159","-98.13662","-6","1"
+"58430","Denhoff","ND","47.581276","-100.27173","-6","1"
+"58431","Dickey","ND","46.522016","-98.48352","-6","1"
+"58432","Eckelson","ND","46.892518","-98.375536","-6","1"
+"58433","Edgeley","ND","46.366866","-98.72145","-6","1"
+"58436","Ellendale","ND","46.067077","-98.58044","-6","1"
+"58438","Fessenden","ND","47.652764","-99.61938","-6","1"
+"58439","Forbes","ND","46.014472","-98.83181","-6","1"
+"58440","Fredonia","ND","46.310458","-99.13151","-6","1"
+"58441","Fullerton","ND","46.163828","-98.38912","-6","1"
+"58442","Gackle","ND","46.596847","-99.1616","-6","1"
+"58443","Glenfield","ND","47.435273","-98.63842","-6","1"
+"58444","Goodrich","ND","47.480027","-100.13717","-6","1"
+"58445","Grace City","ND","47.54777","-98.80594","-6","1"
+"58448","Hannaford","ND","47.31361","-98.2122","-6","1"
+"58451","Hurdsfield","ND","47.456626","-99.9372","-6","1"
+"58452","Jessie","ND","47.456477","-98.230415","-6","1"
+"58454","Jud","ND","46.57995","-98.89748","-6","1"
+"58455","Kensal","ND","47.290251","-98.75318","-6","1"
+"58456","Kulm","ND","46.270766","-98.93292","-6","1"
+"58458","Lamoure","ND","46.367889","-98.29376","-6","1"
+"58460","Lehr","ND","46.309847","-99.32181","-6","1"
+"58461","Litchville","ND","46.654622","-98.20015","-6","1"
+"58463","Mcclusky","ND","47.483877","-100.48694","-6","1"
+"58464","Mchenry","ND","47.583586","-98.5889","-6","1"
+"58466","Marion","ND","46.611528","-98.36911","-6","1"
+"58467","Medina","ND","46.867794","-99.33125","-6","1"
+"58472","Montpelier","ND","46.638134","-98.63923","-6","1"
+"58474","Oakes","ND","46.090506","-98.11584","-6","1"
+"58475","Pettibone","ND","47.149515","-99.566","-6","1"
+"58476","Pingree","ND","47.189716","-98.97328","-6","1"
+"58477","Regan","ND","47.229815","-100.5398","-6","1"
+"58478","Robinson","ND","47.135224","-99.74552","-6","1"
+"58479","Rogers","ND","47.092093","-98.25077","-6","1"
+"58480","Sanborn","ND","46.92853","-98.25936","-6","1"
+"58481","Spiritwood","ND","46.947101","-98.4288","-6","1"
+"58482","Steele","ND","46.862714","-99.9205","-6","1"
+"58483","Streeter","ND","46.631342","-99.39898","-6","1"
+"58484","Sutton","ND","47.399657","-98.44052","-6","1"
+"58486","Sykeston","ND","47.435936","-99.40469","-6","1"
+"58487","Tappen","ND","46.856925","-99.60568","-6","1"
+"58488","Tuttle","ND","47.177348","-99.99415","-6","1"
+"58489","Venturia","ND","46.0327","-99.61847","-6","1"
+"58490","Verona","ND","46.368093","-98.06074","-6","1"
+"58492","Wimbledon","ND","47.154922","-98.43993","-6","1"
+"58494","Wing","ND","47.141711","-100.27279","-6","1"
+"58495","Wishek","ND","46.278442","-99.56198","-6","1"
+"58496","Woodworth","ND","47.153361","-99.31052","-6","1"
+"58497","Ypsilanti","ND","46.770483","-98.56496","-6","1"
+"58501","Bismarck","ND","46.83962","-100.7723","-6","1"
+"58502","Bismarck","ND","46.8887","-100.681855","-6","1"
+"58503","Bismarck","ND","46.861794","-100.78026","-6","1"
+"58504","Bismarck","ND","46.768617","-100.75381","-6","1"
+"58505","Bismarck","ND","46.82126","-100.78131","-6","1"
+"58506","Bismarck","ND","46.980475","-100.520063","-6","1"
+"58507","Bismarck","ND","46.980475","-100.520063","-6","1"
+"58520","Almont","ND","46.657221","-101.53747","-6","1"
+"58521","Baldwin","ND","47.03541","-100.71786","-6","1"
+"58523","Beulah","ND","47.229528","-101.75965","-6","1"
+"58524","Braddock","ND","46.596608","-100.09497","-6","1"
+"58528","Cannon Ball","ND","46.249361","-100.63867","-6","1"
+"58529","Carson","ND","46.320916","-101.60406","-7","1"
+"58530","Center","ND","47.133382","-101.18309","-6","1"
+"58531","Coleharbor","ND","47.575888","-101.19002","-6","1"
+"58532","Driscoll","ND","46.86485","-100.10694","-6","1"
+"58533","Elgin","ND","46.408171","-101.82853","-7","1"
+"58535","Flasher","ND","46.501898","-101.24737","-6","1"
+"58538","Fort Yates","ND","46.062798","-100.72114","-6","1"
+"58540","Garrison","ND","47.646187","-101.52739","-6","1"
+"58541","Golden Valley","ND","47.396933","-102.08106","-7","1"
+"58542","Hague","ND","46.05082","-100.03576","-6","1"
+"58544","Hazelton","ND","46.488312","-100.29283","-6","1"
+"58545","Hazen","ND","47.290543","-101.61207","-7","1"
+"58549","Kintyre","ND","46.467732","-99.93796","-6","1"
+"58552","Linton","ND","46.257466","-100.23833","-6","1"
+"58553","Mckenzie","ND","46.814568","-100.40137","-6","1"
+"58554","Mandan","ND","46.812148","-100.90891","-6","1"
+"58558","Menoken","ND","46.813571","-100.53101","-6","1"
+"58559","Mercer","ND","47.429223","-100.72662","-6","1"
+"58560","Moffit","ND","46.677294","-100.28185","-6","1"
+"58561","Napoleon","ND","46.477491","-99.71689","-6","1"
+"58562","New Leipzig","ND","46.346028","-102.0077","-7","1"
+"58563","New Salem","ND","46.909229","-101.4391","-6","1"
+"58564","Raleigh","ND","46.291855","-101.34592","-7","1"
+"58565","Riverdale","ND","47.494559","-101.37668","-6","1"
+"58566","Saint Anthony","ND","46.59174","-100.93332","-6","1"
+"58568","Selfridge","ND","46.155222","-100.94635","-6","1"
+"58569","Shields","ND","46.258711","-101.17563","-7","1"
+"58570","Solen","ND","46.421762","-100.93017","-6","1"
+"58571","Stanton","ND","47.281472","-101.37642","-7","1"
+"58572","Sterling","ND","46.885406","-100.30355","-6","1"
+"58573","Strasburg","ND","46.094998","-100.24342","-6","1"
+"58575","Turtle Lake","ND","47.543706","-100.87466","-6","1"
+"58576","Underwood","ND","47.446392","-101.15667","-6","1"
+"58577","Washburn","ND","47.302682","-101.04618","-6","1"
+"58579","Wilton","ND","47.178883","-100.76","-6","1"
+"58580","Zap","ND","47.281173","-101.9254","-7","1"
+"58581","Zeeland","ND","46.014164","-99.83606","-6","1"
+"58601","Dickinson","ND","46.878057","-102.8041","-7","1"
+"58602","Dickinson","ND","46.820185","-102.663913","-7","1"
+"58620","Amidon","ND","46.486096","-103.31682","-7","1"
+"58621","Beach","ND","47.077257","-103.93051","-7","1"
+"58622","Belfield","ND","46.922727","-103.21389","-7","1"
+"58623","Bowman","ND","46.182799","-103.40453","-7","1"
+"58625","Dodge","ND","47.252561","-102.18789","-7","1"
+"58626","Dunn Center","ND","47.346329","-102.61222","-7","1"
+"58627","Fairfield","ND","47.219032","-103.23327","-7","1"
+"58630","Gladstone","ND","46.860364","-102.56782","-7","1"
+"58631","Glen Ullin","ND","46.759443","-101.83368","-6","1"
+"58632","Golva","ND","46.713628","-103.94995","-7","1"
+"58634","Grassy Butte","ND","47.393108","-103.36899","-7","1"
+"58636","Halliday","ND","47.371929","-102.34345","-7","1"
+"58638","Hebron","ND","46.877355","-102.0497","-6","1"
+"58639","Hettinger","ND","46.043733","-102.60353","-7","1"
+"58640","Killdeer","ND","47.411564","-102.82766","-7","1"
+"58641","Lefor","ND","46.666229","-102.48549","-7","1"
+"58642","Manning","ND","47.151337","-102.82216","-7","1"
+"58643","Marmarth","ND","46.2715","-103.93203","-7","1"
+"58644","Marshall","ND","47.402085","-102.622139","-7","1"
+"58645","Medora","ND","46.92752","-103.56872","-7","1"
+"58646","Mott","ND","46.379559","-102.28758","-7","1"
+"58647","New England","ND","46.511555","-102.8735","-7","1"
+"58649","Reeder","ND","46.140764","-102.92304","-7","1"
+"58650","Regent","ND","46.405798","-102.60398","-7","1"
+"58651","Rhame","ND","46.329565","-103.68539","-7","1"
+"58652","Richardton","ND","46.891017","-102.28356","-7","1"
+"58653","Scranton","ND","46.172025","-103.09161","-7","1"
+"58654","Sentinel Butte","ND","46.85992","-103.78322","-7","1"
+"58655","South Heart","ND","46.808668","-103.03364","-7","1"
+"58656","Taylor","ND","46.975615","-102.46219","-7","1"
+"58673","Dodge","ND","47.304598","-102.203219","-7","1"
+"58701","Minot","ND","48.19983","-101.28579","-6","1"
+"58702","Minot","ND","48.336898","-101.451285","-6","1"
+"58703","Minot","ND","48.277024","-101.31942","-6","1"
+"58704","Minot AFB","ND","48.41647","-101.3274","-6","1"
+"58705","Minot AFB","ND","48.234184","-101.297161","-6","1"
+"58707","Minot","ND","48.245267","-101.301179","-6","1"
+"58710","Anamoose","ND","47.87756","-100.23677","-6","1"
+"58711","Antler","ND","48.94424","-101.28912","-6","1"
+"58712","Balfour","ND","47.985515","-100.53158","-6","1"
+"58713","Bantry","ND","48.552669","-100.63594","-6","1"
+"58716","Benedict","ND","47.82781","-101.08118","-6","1"
+"58718","Berthold","ND","48.327365","-101.81878","-6","1"
+"58721","Bowbells","ND","48.811975","-102.27362","-6","1"
+"58722","Burlington","ND","48.251187","-101.47331","-6","1"
+"58723","Butte","ND","47.785232","-100.69257","-6","1"
+"58725","Carpio","ND","48.466756","-101.70175","-6","1"
+"58727","Columbus","ND","48.844129","-102.80485","-6","1"
+"58730","Crosby","ND","48.889528","-103.32304","-6","1"
+"58731","Deering","ND","48.422289","-100.98409","-6","1"
+"58733","Des Lacs","ND","48.171782","-101.60981","-6","1"
+"58734","Donnybrook","ND","48.506446","-101.96379","-6","1"
+"58735","Douglas","ND","47.869756","-101.49673","-6","1"
+"58736","Drake","ND","47.916124","-100.38123","-6","1"
+"58737","Flaxton","ND","48.917722","-102.40401","-6","1"
+"58740","Glenburn","ND","48.485288","-101.22156","-6","1"
+"58741","Granville","ND","48.269326","-100.82468","-6","1"
+"58744","Karlsruhe","ND","48.102064","-100.61537","-6","1"
+"58746","Kenmare","ND","48.719925","-102.08301","-6","1"
+"58747","Kief","ND","47.808989","-100.51007","-6","1"
+"58748","Kramer","ND","48.687522","-100.6606","-6","1"
+"58750","Lansford","ND","48.611257","-101.4194","-6","1"
+"58752","Lignite","ND","48.845965","-102.57917","-6","1"
+"58755","Mcgregor","ND","48.632655","-102.93658","-6","1"
+"58756","Makoti","ND","47.962814","-101.81113","-6","1"
+"58757","Mandaree","ND","47.702563","-102.58745","-6","1"
+"58758","Martin","ND","47.781908","-100.10165","-6","1"
+"58759","Max","ND","47.855591","-101.26056","-6","1"
+"58760","Maxbass","ND","48.686244","-101.15787","-6","1"
+"58761","Mohall","ND","48.770684","-101.55153","-6","1"
+"58762","Newburg","ND","48.671806","-100.96154","-6","1"
+"58763","New Town","ND","47.983034","-102.54126","-6","1"
+"58764","Clay","ND","48.676056","-101.53884","-6","1"
+"58765","Noonan","ND","48.857983","-103.03833","-6","1"
+"58768","Norwich","ND","48.250987","-101.00165","-6","1"
+"58769","Palermo","ND","48.330437","-102.23239","-6","1"
+"58770","Parshall","ND","47.927133","-102.13973","-6","1"
+"58771","Plaza","ND","48.073998","-101.9763","-6","1"
+"58772","Portal","ND","48.973939","-102.60078","-6","1"
+"58773","Powers Lake","ND","48.574749","-102.65064","-6","1"
+"58775","Roseglen","ND","47.710089","-101.84406","-6","1"
+"58776","Ross","ND","48.24767","-102.62331","-6","1"
+"58778","Ruso","ND","47.783028","-100.93423","-6","1"
+"58779","Ryder","ND","47.811566","-101.86084","-6","1"
+"58781","Sawyer","ND","48.037844","-101.09637","-6","1"
+"58782","Sherwood","ND","48.944324","-101.72643","-6","1"
+"58783","Souris","ND","48.900962","-100.76402","-6","1"
+"58784","Stanley","ND","48.366981","-102.4235","-6","1"
+"58785","Surrey","ND","48.271451","-101.11174","-6","1"
+"58787","Tolley","ND","48.76715","-101.81935","-6","1"
+"58788","Towner","ND","48.363285","-100.47477","-6","1"
+"58789","Upham","ND","48.567655","-100.80621","-6","1"
+"58790","Velva","ND","48.053192","-100.93425","-6","1"
+"58792","Voltaire","ND","47.971295","-100.76841","-6","1"
+"58793","Westhope","ND","48.871815","-101.04936","-6","1"
+"58794","White Earth","ND","48.298407","-102.76645","-6","1"
+"58795","Wildrose","ND","48.64055","-103.15693","-6","1"
+"58801","Williston","ND","48.20496","-103.71908","-6","1"
+"58802","Williston","ND","48.168836","-103.614824","-6","1"
+"58830","Alamo","ND","48.586475","-103.46708","-6","1"
+"58831","Alexander","ND","47.826449","-103.65916","-6","1"
+"58832","Westby","ND","48.843926","-103.924225","-6","1"
+"58833","Ambrose","ND","48.894491","-103.51215","-6","1"
+"58835","Arnegard","ND","47.73943","-103.46564","-6","1"
+"58838","Cartwright","ND","47.83202","-103.886","-7","1"
+"58843","Epping","ND","48.278037","-103.39021","-6","1"
+"58844","Fortuna","ND","48.894636","-103.75867","-6","1"
+"58845","Grenora","ND","48.629988","-103.93903","-6","1"
+"58847","Keene","ND","47.8845","-102.90911","-6","1"
+"58849","Ray","ND","48.326813","-103.19462","-6","1"
+"58852","Tioga","ND","48.388509","-102.94589","-6","1"
+"58853","Trenton","ND","48.069085","-103.84342","-6","1"
+"58854","Watford City","ND","47.835713","-103.22565","-6","1"
+"58856","Zahl","ND","48.567291","-103.71711","-6","1"
+"58888","Garrison","ND","47.612579","-101.304214","-6","1"
+"58982","Colquhoun","ND","48.986763","-101.69363","-6","1"
+"59000","Roundup","MT","46.506905","-108.289304","-7","1"
+"59001","Absarokee","MT","45.522248","-109.48875","-7","1"
+"59002","Acton","MT","45.932174","-108.68933","-7","1"
+"59003","Ashland","MT","45.486308","-106.33169","-7","1"
+"59004","Ashland","MT","46.017965","-106.99199","-7","1"
+"59006","Ballantine","MT","45.947154","-108.0969","-7","1"
+"59007","Bearcreek","MT","45.159808","-109.14649","-7","1"
+"59008","Belfry","MT","45.103044","-109.06992","-7","1"
+"59010","Bighorn","MT","45.949226","-107.2284","-7","1"
+"59011","Big Timber","MT","45.883409","-109.91891","-7","1"
+"59012","Birney","MT","45.351247","-106.58858","-7","1"
+"59013","Boyd","MT","45.464156","-109.11927","-7","1"
+"59014","Bridger","MT","45.242325","-108.73073","-7","1"
+"59015","Broadview","MT","46.096447","-108.83134","-7","1"
+"59016","Busby","MT","45.457795","-106.97057","-7","1"
+"59018","Clyde Park","MT","45.894359","-110.61105","-7","1"
+"59019","Columbus","MT","45.602343","-109.2671","-7","1"
+"59020","Cooke City","MT","45.058868","-109.90084","-7","1"
+"59022","Crow Agency","MT","45.613564","-107.37805","-7","1"
+"59024","Custer","MT","46.095217","-107.6318","-7","1"
+"59025","Decker","MT","45.090049","-106.69221","-7","1"
+"59026","Edgar","MT","45.430445","-108.76441","-7","1"
+"59027","Emigrant","MT","45.310206","-110.8895","-7","1"
+"59028","Fishtail","MT","45.373162","-109.64134","-7","1"
+"59029","Fromberg","MT","45.391138","-108.89916","-7","1"
+"59030","Gardiner","MT","45.145353","-110.60771","-7","1"
+"59031","Garryowen","MT","45.521423","-107.42566","-7","1"
+"59032","Grass Range","MT","47.041005","-108.80868","-7","1"
+"59033","Greycliff","MT","45.734139","-109.77529","-7","1"
+"59034","Hardin","MT","45.780451","-107.63987","-7","1"
+"59035","Yellowtail","MT","45.224859","-107.98299","-7","1"
+"59036","Harlowton","MT","46.435446","-109.86994","-7","1"
+"59037","Huntley","MT","45.862261","-108.29474","-7","1"
+"59038","Hysham","MT","46.208375","-107.22415","-7","1"
+"59039","Ingomar","MT","46.69244","-107.6368","-7","1"
+"59041","Joliet","MT","45.505519","-108.92119","-7","1"
+"59043","Lame Deer","MT","45.585984","-106.63862","-7","1"
+"59044","Laurel","MT","45.665424","-108.75601","-7","1"
+"59046","Lavina","MT","46.418078","-109.03637","-7","1"
+"59047","Livingston","MT","45.674463","-110.53834","-7","1"
+"59050","Lodge Grass","MT","45.272302","-107.45873","-7","1"
+"59052","McLeod","MT","45.550177","-110.05667","-7","1"
+"59053","Martinsdale","MT","46.491523","-110.50499","-7","1"
+"59054","Melstone","MT","46.56503","-107.9138","-7","1"
+"59055","Melville","MT","46.13263","-109.89746","-7","1"
+"59057","Molt","MT","45.846359","-108.95391","-7","1"
+"59058","Mosby","MT","47.05992","-107.80028","-7","1"
+"59059","Musselshell","MT","46.455469","-108.0903","-7","1"
+"59061","Nye","MT","45.45236","-109.83681","-7","1"
+"59062","Otter","MT","45.154425","-106.13017","-7","1"
+"59063","Park City","MT","45.622948","-108.96","-7","1"
+"59064","Pompeys Pillar","MT","45.903794","-107.92181","-7","1"
+"59065","Pray","MT","45.336151","-110.75099","-7","1"
+"59066","Pryor","MT","45.353002","-108.49163","-7","1"
+"59067","Rapelje","MT","45.951002","-109.28883","-7","1"
+"59068","Red Lodge","MT","45.241761","-109.32217","-7","1"
+"59069","Reed Point","MT","45.708186","-109.54126","-7","1"
+"59070","Roberts","MT","45.352866","-109.17158","-7","1"
+"59071","Roscoe","MT","45.343978","-109.50168","-7","1"
+"59072","Roundup","MT","46.53932","-108.53775","-7","1"
+"59073","Roundup","MT","46.444224","-108.395473","-7","1"
+"59074","Ryegate","MT","46.367286","-109.27608","-7","1"
+"59075","Saint Xavier","MT","45.395656","-107.93409","-7","1"
+"59076","Sanders","MT","46.2644","-107.07438","-7","1"
+"59077","Sand Springs","MT","47.130621","-107.52697","-7","1"
+"59078","Shawmut","MT","46.383158","-109.49616","-7","1"
+"59079","Shepherd","MT","46.001031","-108.3527","-7","1"
+"59081","Silver Gate","MT","45.006307","-109.98238","-7","1"
+"59082","Springdale","MT","45.33333","-110.477384","-7","1"
+"59083","Sumatra","MT","46.017965","-106.99199","-7","1"
+"59084","Teigen","MT","47.173641","-108.281168","-7","1"
+"59085","Two Dot","MT","46.501026","-110.14681","-7","1"
+"59086","Wilsall","MT","46.075387","-110.57954","-7","1"
+"59087","Winnett","MT","47.000478","-108.29005","-7","1"
+"59088","Worden","MT","46.059495","-108.0755","-7","1"
+"59089","Wyola","MT","45.076746","-107.44633","-7","1"
+"59101","Billings","MT","45.737525","-108.48754","-7","1"
+"59102","Billings","MT","45.778852","-108.5742","-7","1"
+"59103","Billings","MT","45.978288","-108.194508","-7","1"
+"59104","Billings","MT","45.978288","-108.194508","-7","1"
+"59105","Billings","MT","45.836121","-108.46819","-7","1"
+"59106","Billings","MT","45.777818","-108.66944","-7","1"
+"59107","Billings","MT","45.825204","-108.393388","-7","1"
+"59108","Billings","MT","45.978288","-108.194508","-7","1"
+"59111","Billings","MT","45.978288","-108.194508","-7","1"
+"59112","Billings","MT","45.978288","-108.194508","-7","1"
+"59114","Billings","MT","45.978288","-108.194508","-7","1"
+"59115","Billings","MT","45.978288","-108.194508","-7","1"
+"59116","Billings","MT","45.978288","-108.194508","-7","1"
+"59117","Billings","MT","45.978288","-108.194508","-7","1"
+"59201","Wolf Point","MT","48.126066","-105.65893","-7","1"
+"59211","Antelope","MT","48.695994","-104.35503","-7","1"
+"59212","Bainville","MT","48.1154","-104.19036","-7","1"
+"59213","Brockton","MT","48.132347","-104.88114","-7","1"
+"59214","Brockway","MT","47.274624","-105.84727","-7","1"
+"59215","Circle","MT","47.520661","-105.8743","-7","1"
+"59217","Crane","MT","47.577478","-104.25806","-7","1"
+"59218","Culbertson","MT","48.132161","-104.51429","-7","1"
+"59219","Dagmar","MT","48.519946","-104.25492","-7","1"
+"59221","Fairview","MT","47.900376","-104.13403","-7","1"
+"59222","Flaxville","MT","48.739987","-105.15836","-7","1"
+"59223","Fort Peck","MT","48.006744","-106.46104","-7","1"
+"59225","Frazer","MT","48.202722","-105.96719","-7","1"
+"59226","Froid","MT","48.317939","-104.44433","-7","1"
+"59230","Glasgow","MT","48.15381","-106.69558","-7","1"
+"59231","Saint Marie","MT","48.404667","-106.53357","-7","1"
+"59240","Glentana","MT","48.330241","-106.609665","-7","1"
+"59241","Hinsdale","MT","48.39962","-107.09765","-7","1"
+"59242","Homestead","MT","48.40892","-104.70869","-7","1"
+"59243","Lambert","MT","47.71754","-104.63734","-7","1"
+"59244","Larslan","MT","48.599534","-106.33328","-7","1"
+"59245","McCabe","MT","48.280119","-104.94413","-7","1"
+"59247","Medicine Lake","MT","48.503927","-104.48487","-7","1"
+"59248","Nashua","MT","48.13336","-106.33547","-7","1"
+"59250","Opheim","MT","48.860359","-106.47675","-7","1"
+"59252","Outlook","MT","48.893223","-104.7741","-7","1"
+"59253","Peerless","MT","48.730966","-105.85564","-7","1"
+"59254","Plentywood","MT","48.77466","-104.56769","-7","1"
+"59255","Poplar","MT","48.136011","-105.16175","-7","1"
+"59256","Raymond","MT","48.694565","-104.552352","-7","1"
+"59257","Redstone","MT","48.750625","-104.96702","-7","1"
+"59258","Reserve","MT","48.591968","-104.61326","-7","1"
+"59259","Richey","MT","47.777938","-105.04227","-7","1"
+"59260","Richland","MT","48.717859","-106.07899","-7","1"
+"59261","Saco","MT","48.544159","-107.40301","-7","1"
+"59262","Savage","MT","47.463172","-104.36846","-7","1"
+"59263","Scobey","MT","48.809655","-105.45829","-7","1"
+"59270","Sidney","MT","47.683129","-104.20547","-7","1"
+"59273","Vandalia","MT","48.330241","-106.609665","-7","1"
+"59274","Vida","MT","47.859083","-105.35001","-7","1"
+"59275","Westby","MT","48.887447","-104.20951","-7","1"
+"59276","Whitetail","MT","48.897816","-105.16316","-7","1"
+"59301","Miles City","MT","46.343483","-105.81164","-7","1"
+"59311","Alzada","MT","45.189905","-104.38569","-7","1"
+"59312","Angela","MT","46.017965","-106.99199","-7","1"
+"59313","Baker","MT","46.357253","-104.25299","-7","1"
+"59314","Biddle","MT","45.078881","-105.37586","-7","1"
+"59315","Bloomfield","MT","47.441629","-104.86652","-7","1"
+"59316","Boyes","MT","45.567085","-104.539066","-7","1"
+"59317","Broadus","MT","45.385223","-105.34448","-7","1"
+"59318","Brusett","MT","47.426998","-107.44215","-7","1"
+"59319","Capitol","MT","45.567085","-104.539066","-7","1"
+"59322","Cohagen","MT","47.049949","-106.58157","-7","1"
+"59323","Colstrip","MT","45.915952","-106.65505","-7","1"
+"59324","Ekalaka","MT","45.797477","-104.47482","-7","1"
+"59326","Fallon","MT","46.810255","-105.04391","-7","1"
+"59327","Forsyth","MT","46.077231","-106.68186","-7","1"
+"59330","Glendive","MT","47.107345","-104.72683","-7","1"
+"59332","Hammond","MT","45.386374","-104.75677","-7","1"
+"59333","Hathaway","MT","46.271872","-106.21374","-7","1"
+"59336","Ismay","MT","46.429205","-104.94036","-7","1"
+"59337","Jordan","MT","47.349999","-106.95207","-7","1"
+"59338","Kinsey","MT","46.579645","-105.62183","-7","1"
+"59339","Lindsay","MT","47.253136","-105.19476","-7","1"
+"59341","Mildred","MT","46.860997","-105.345182","-7","1"
+"59343","Olive","MT","45.666174","-105.47959","-7","1"
+"59344","Plevna","MT","46.43208","-104.61063","-7","1"
+"59345","Powderville","MT","45.391078","-105.630461","-7","1"
+"59347","Rosebud","MT","46.632549","-106.39641","-7","1"
+"59348","Sonnette","MT","45.365698","-105.95632","-7","1"
+"59349","Terry","MT","46.897901","-105.46339","-7","1"
+"59351","Volborg","MT","45.942409","-105.71211","-7","1"
+"59353","Wibaux","MT","46.969132","-104.19232","-7","1"
+"59354","Willard","MT","46.127895","-104.45228","-7","1"
+"59400","Shelby","MT","48.643651","-111.745326","-7","1"
+"59401","Great Falls","MT","47.509157","-111.27408","-7","1"
+"59402","Malmstrom A F B","MT","47.510209","-111.195906","-7","1"
+"59403","Great Falls","MT","47.258392","-111.341975","-7","1"
+"59404","Great Falls","MT","47.514307","-111.34499","-7","1"
+"59405","Great Falls","MT","47.476152","-111.26909","-7","1"
+"59406","Great Falls","MT","47.619998","-111.239305","-7","1"
+"59410","Augusta","MT","47.503261","-112.48018","-7","1"
+"59411","Babb","MT","48.871429","-113.43734","-7","1"
+"59412","Belt","MT","47.351391","-110.86564","-7","1"
+"59414","Black Eagle","MT","47.526385","-111.27845","-7","1"
+"59416","Brady","MT","48.037351","-111.66825","-7","1"
+"59417","Browning","MT","48.556986","-113.0698","-7","1"
+"59418","Buffalo","MT","47.248497","-109.26308","-7","1"
+"59419","Bynum","MT","48.007556","-112.32535","-7","1"
+"59420","Carter","MT","47.834943","-110.98801","-7","1"
+"59421","Cascade","MT","47.223693","-111.70821","-7","1"
+"59422","Choteau","MT","47.840047","-112.35083","-7","1"
+"59424","Coffee Creek","MT","47.383325","-110.02055","-7","1"
+"59425","Conrad","MT","48.190331","-111.96872","-7","1"
+"59427","Cut Bank","MT","48.680309","-112.47009","-7","1"
+"59430","Denton","MT","47.316304","-109.96291","-7","1"
+"59432","Dupuyer","MT","48.177132","-112.61804","-7","1"
+"59433","Dutton","MT","47.895071","-111.77961","-7","1"
+"59434","East Glacier Park","MT","48.424793","-113.20424","-7","1"
+"59435","Ethridge","MT","48.609072","-111.731852","-7","1"
+"59436","Fairfield","MT","47.624913","-112.03006","-7","1"
+"59440","Floweree","MT","47.696452","-111.15265","-7","1"
+"59441","Forestgrove","MT","46.906403","-109.09551","-7","1"
+"59442","Fort Benton","MT","47.83055","-110.64869","-7","1"
+"59443","Fort Shaw","MT","47.547517","-111.82545","-7","1"
+"59444","Galata","MT","48.635319","-111.24083","-7","1"
+"59445","Garneill","MT","47.055715","-109.468299","-7","1"
+"59446","Geraldine","MT","47.661952","-110.1846","-7","1"
+"59447","Geyser","MT","47.268612","-110.44229","-7","1"
+"59448","Heart Butte","MT","48.309341","-112.81115","-7","1"
+"59450","Highwood","MT","47.530558","-110.57208","-7","1"
+"59451","Hilger","MT","47.468715","-109.35624","-7","1"
+"59452","Hobson","MT","46.883052","-110.09673","-7","1"
+"59453","Judith Gap","MT","46.678858","-109.64119","-7","1"
+"59454","Kevin","MT","48.744885","-111.97141","-7","1"
+"59456","Ledger","MT","48.281911","-111.30771","-7","1"
+"59457","Lewistown","MT","47.054233","-109.48065","-7","1"
+"59460","Loma","MT","48.008655","-110.47512","-7","1"
+"59461","Lothair","MT","48.609072","-111.731852","-7","1"
+"59462","Moccasin","MT","47.089167","-109.91488","-7","1"
+"59463","Monarch","MT","47.057303","-110.84279","-7","1"
+"59464","Moore","MT","46.956343","-109.7023","-7","1"
+"59465","Neihart","MT","46.926021","-110.71696","-7","1"
+"59466","Oilmont","MT","48.842195","-111.59529","-7","1"
+"59467","Pendroy","MT","48.093269","-112.30254","-7","1"
+"59468","Power","MT","47.69094","-111.63998","-7","1"
+"59469","Raynesford","MT","47.261238","-110.725","-7","1"
+"59471","Roy","MT","47.377169","-108.84397","-7","1"
+"59472","Sand Coulee","MT","47.409591","-111.13517","-7","1"
+"59473","Santa Rita","MT","48.65417","-113.126262","-7","1"
+"59474","Shelby","MT","48.479975","-111.76863","-7","1"
+"59477","Simms","MT","47.459112","-111.96711","-7","1"
+"59479","Stanford","MT","47.104848","-110.26076","-7","1"
+"59480","Stockett","MT","47.188396","-111.16349","-7","1"
+"59482","Sunburst","MT","48.881178","-111.91516","-7","1"
+"59483","Sun River","MT","47.465072","-111.79735","-7","1"
+"59484","Sweet Grass","MT","48.979905","-111.92471","-7","1"
+"59485","Ulm","MT","47.429273","-111.59357","-7","1"
+"59486","Valier","MT","48.336146","-112.31498","-7","1"
+"59487","Vaughn","MT","47.577613","-111.60477","-7","1"
+"59489","Winifred","MT","47.065531","-109.430106","-7","1"
+"59500","Havre","MT","48.555536","-109.68953","-7","1"
+"59501","Havre","MT","48.584562","-109.78365","-7","1"
+"59520","Big Sandy","MT","48.141017","-110.06828","-7","1"
+"59521","Box Elder","MT","48.321712","-109.9578","-7","1"
+"59522","Chester","MT","48.487928","-111.00381","-7","1"
+"59523","Chinook","MT","48.485856","-109.17406","-7","1"
+"59524","Dodson","MT","48.148715","-108.37109","-7","1"
+"59525","Gildford","MT","48.733088","-110.32495","-7","1"
+"59526","Harlem","MT","48.483212","-108.72208","-7","1"
+"59527","Hays","MT","48.023133","-108.69955","-7","1"
+"59528","Hingham","MT","48.555089","-110.41769","-7","1"
+"59529","Hogeland","MT","48.843446","-108.73813","-7","1"
+"59530","Inverness","MT","48.631693","-110.67384","-7","1"
+"59531","Joplin","MT","48.675352","-110.8269","-7","1"
+"59532","Kremlin","MT","48.597362","-110.077","-7","1"
+"59535","Lloyd","MT","48.031253","-109.28416","-7","1"
+"59537","Loring","MT","48.817553","-107.87318","-7","1"
+"59538","Malta","MT","48.235694","-107.80711","-7","1"
+"59540","Rudyard","MT","48.525132","-110.54993","-7","1"
+"59542","Turner","MT","48.824171","-108.44428","-7","1"
+"59544","Whitewater","MT","48.751881","-107.61505","-7","1"
+"59545","Whitlash","MT","48.962291","-111.16737","-7","1"
+"59546","Zortman","MT","47.896703","-108.54135","-7","1"
+"59547","Zurich","MT","48.607955","-109.01285","-7","1"
+"59601","Helena","MT","46.588803","-112.04193","-7","1"
+"59602","Helena","MT","46.696501","-111.96895","-7","1"
+"59604","Helena","MT","46.6672","-111.968877","-7","1"
+"59620","Helena","MT","47.184233","-112.330214","-7","1"
+"59623","Helena","MT","46.590083","-112.040173","-7","1"
+"59624","Helena","MT","46.610002","-112.062393","-7","1"
+"59625","Helena","MT","46.601832","-112.041346","-7","1"
+"59626","Helena","MT","47.184233","-112.330214","-7","1"
+"59631","Basin","MT","46.231547","-112.34456","-7","1"
+"59632","Boulder","MT","46.205729","-112.06748","-7","1"
+"59633","Canyon Creek","MT","46.818147","-112.3409","-7","1"
+"59634","Clancy","MT","46.479732","-111.97496","-7","1"
+"59635","East Helena","MT","46.578943","-111.8821","-7","1"
+"59636","Fort Harrison","MT","46.620549","-112.10446","-7","1"
+"59638","Jefferson City","MT","46.376532","-112.14074","-7","1"
+"59639","Lincoln","MT","46.973643","-112.62547","-7","1"
+"59640","Marysville","MT","46.748706","-112.30023","-7","1"
+"59641","Radersburg","MT","46.206922","-111.634364","-7","1"
+"59642","Ringling","MT","46.24656","-110.79404","-7","1"
+"59643","Toston","MT","46.186442","-111.56253","-7","1"
+"59644","Townsend","MT","46.394352","-111.44665","-7","1"
+"59645","White Sulphur Springs","MT","46.615309","-111.01063","-7","1"
+"59647","Winston","MT","46.45447","-111.650954","-7","1"
+"59648","Wolf Creek","MT","47.035168","-112.09073","-7","1"
+"59701","Butte","MT","45.996957","-112.51279","-7","1"
+"59702","Butte","MT","45.905345","-112.637705","-7","1"
+"59703","Butte","MT","45.905345","-112.637705","-7","1"
+"59707","Butte","MT","45.905345","-112.637705","-7","1"
+"59710","Alder","MT","45.125532","-112.12007","-7","1"
+"59711","Anaconda","MT","46.141686","-112.98902","-7","1"
+"59713","Avon","MT","46.650216","-112.59075","-7","1"
+"59714","Belgrade","MT","45.85291","-111.18037","-7","1"
+"59715","Bozeman","MT","45.707153","-110.9878","-7","1"
+"59716","Big Sky","MT","45.268367","-111.32651","-7","1"
+"59717","Bozeman","MT","45.627982","-110.90128","-7","1"
+"59718","Bozeman","MT","45.680811","-111.137","-7","1"
+"59719","Bozeman","MT","45.627982","-110.90128","-7","1"
+"59720","Cameron","MT","44.99257","-111.62521","-7","1"
+"59721","Cardwell","MT","45.849728","-111.86233","-7","1"
+"59722","Deer Lodge","MT","46.392658","-112.7369","-7","1"
+"59724","Dell","MT","45.149805","-112.70073","-7","1"
+"59725","Dillon","MT","45.146179","-112.77411","-7","1"
+"59727","Divide","MT","45.794048","-112.77595","-7","1"
+"59728","Elliston","MT","46.481128","-112.43358","-7","1"
+"59729","Ennis","MT","45.30767","-111.70176","-7","1"
+"59730","Gallatin Gateway","MT","45.417898","-111.19888","-7","1"
+"59731","Garrison","MT","46.565168","-112.80722","-7","1"
+"59732","Glen","MT","45.149805","-112.70073","-7","1"
+"59733","Gold Creek","MT","46.606751","-112.97866","-7","1"
+"59735","Harrison","MT","45.688676","-111.78292","-7","1"
+"59736","Jackson","MT","45.26938","-113.35533","-7","1"
+"59739","Lima","MT","44.712015","-112.25568","-7","1"
+"59740","McAllister","MT","45.462512","-111.76367","-7","1"
+"59741","Manhattan","MT","45.810687","-111.33138","-7","1"
+"59743","Melrose","MT","45.631031","-112.6757","-7","1"
+"59745","Norris","MT","45.587974","-111.60577","-7","1"
+"59746","Polaris","MT","45.534274","-113.17025","-7","1"
+"59747","Pony","MT","45.659738","-111.88987","-7","1"
+"59748","Ramsay","MT","46.025762","-112.77156","-7","1"
+"59749","Sheridan","MT","45.528809","-112.1097","-7","1"
+"59750","Butte","MT","45.946694","-112.6987","-7","1"
+"59751","Silver Star","MT","45.681898","-112.30548","-7","1"
+"59752","Three Forks","MT","45.899881","-111.53143","-7","1"
+"59754","Twin Bridges","MT","45.513742","-112.4186","-7","1"
+"59755","Virginia City","MT","45.296409","-111.94237","-7","1"
+"59756","Warm Springs","MT","46.201464","-112.76555","-7","1"
+"59758","West Yellowstone","MT","44.727561","-111.18723","-7","1"
+"59759","Whitehall","MT","45.851349","-112.1695","-7","1"
+"59760","Willow Creek","MT","45.782744","-111.634532","-7","1"
+"59761","Wisdom","MT","45.595349","-113.61624","-7","1"
+"59762","Wise River","MT","45.757767","-112.99552","-7","1"
+"59771","Bozeman","MT","45.72465","-111.123775","-7","1"
+"59772","Bozeman","MT","45.636149","-111.064676","-7","1"
+"59773","Bozeman","MT","45.627982","-110.90128","-7","1"
+"59795","Ennis","MT","45.349274","-111.735925","-7","1"
+"59798","West Yellowstone","MT","44.658614","-111.099869","-7","1"
+"59801","Missoula","MT","46.855423","-114.01229","-7","1"
+"59802","Missoula","MT","46.896821","-113.95551","-7","1"
+"59803","Missoula","MT","46.790915","-114.00439","-7","1"
+"59804","Missoula","MT","46.854974","-114.10566","-7","1"
+"59806","Missoula","MT","47.116034","-114.049824","-7","1"
+"59807","Missoula","MT","46.910342","-113.958686","-7","1"
+"59808","Missoula","MT","46.92275","-114.07639","-7","1"
+"59812","Missoula","MT","47.116034","-114.049824","-7","1"
+"59817","Four Corners","MT","45.652577","-111.190888","-7","1"
+"59820","Alberton","MT","46.971146","-114.49692","-7","1"
+"59821","Arlee","MT","47.169203","-114.05215","-7","1"
+"59823","Bonner","MT","46.900409","-113.64027","-7","1"
+"59824","Charlo","MT","47.425832","-114.17894","-7","1"
+"59825","Clinton","MT","46.716741","-113.62908","-7","1"
+"59826","Condon","MT","47.500385","-113.72687","-7","1"
+"59827","Conner","MT","45.905748","-114.07478","-7","1"
+"59828","Corvallis","MT","46.313969","-114.04819","-7","1"
+"59829","Darby","MT","45.836508","-114.20624","-7","1"
+"59830","De Borgia","MT","47.388827","-115.347934","-7","1"
+"59831","Dixon","MT","47.291275","-114.37296","-7","1"
+"59832","Drummond","MT","46.695594","-113.22547","-7","1"
+"59833","Florence","MT","46.642043","-114.07435","-7","1"
+"59834","Frenchtown","MT","47.049623","-114.25074","-7","1"
+"59835","Grantsdale","MT","46.060169","-114.040777","-7","1"
+"59836","Greenough","MT","47.015705","-113.42635","-7","1"
+"59837","Hall","MT","46.522136","-113.29281","-7","1"
+"59840","Hamilton","MT","46.214883","-114.14786","-7","1"
+"59841","Pinesdale","MT","46.336533","-114.22296","-7","1"
+"59842","Haugan","MT","47.365882","-115.49151","-7","1"
+"59843","Helmville","MT","46.878117","-112.97934","-7","1"
+"59844","Heron","MT","48.03036","-115.96844","-7","1"
+"59845","Hot Springs","MT","47.740524","-114.63534","-7","1"
+"59846","Huson","MT","47.107612","-114.44619","-7","1"
+"59847","Lolo","MT","46.752798","-114.35326","-7","1"
+"59848","Lonepine","MT","47.689156","-114.67899","-7","1"
+"59851","Milltown","MT","46.871508","-113.88196","-7","1"
+"59853","Noxon","MT","48.017227","-115.81962","-7","1"
+"59854","Ovando","MT","47.044698","-113.09214","-7","1"
+"59855","Pablo","MT","47.597618","-114.11853","-7","1"
+"59856","Paradise","MT","47.387824","-114.799","-7","1"
+"59858","Philipsburg","MT","46.293656","-113.36273","-7","1"
+"59859","Plains","MT","47.452071","-114.8171","-7","1"
+"59860","Polson","MT","47.696131","-114.16094","-7","1"
+"59863","Ravalli","MT","47.594957","-114.101443","-7","1"
+"59864","Ronan","MT","47.540256","-114.12898","-7","1"
+"59865","Saint Ignatius","MT","47.317264","-114.04402","-7","1"
+"59866","Saint Regis","MT","47.3245","-115.13788","-7","1"
+"59867","Saltese","MT","47.417172","-115.45113","-7","1"
+"59868","Seeley Lake","MT","47.222677","-113.52551","-7","1"
+"59870","Stevensville","MT","46.53135","-114.03182","-7","1"
+"59871","Sula","MT","45.887807","-113.84407","-7","1"
+"59872","Superior","MT","47.113918","-114.84507","-7","1"
+"59873","Thompson Falls","MT","47.710209","-115.23463","-7","1"
+"59874","Trout Creek","MT","47.844268","-115.60569","-7","1"
+"59875","Victor","MT","46.39449","-114.18711","-7","1"
+"59901","Kalispell","MT","48.201414","-114.32202","-7","1"
+"59902","Kalispell","MT","48.189424","-114.143531","-7","1"
+"59903","Kalispell","MT","48.22372","-114.429648","-7","1"
+"59904","Kalispell","MT","48.240382","-114.256123","-7","1"
+"59910","Big Arm","MT","47.802143","-114.30638","-7","1"
+"59911","Bigfork","MT","47.952716","-113.96215","-7","1"
+"59912","Columbia Falls","MT","48.438331","-114.23052","-7","1"
+"59913","Coram","MT","48.428564","-114.01396","-7","1"
+"59914","Dayton","MT","47.868708","-114.2778","-7","1"
+"59915","Elmo","MT","47.829886","-114.39536","-7","1"
+"59916","Essex","MT","48.249467","-113.62889","-7","1"
+"59917","Eureka","MT","48.840305","-114.99727","-7","1"
+"59918","Fortine","MT","48.75853","-114.84363","-7","1"
+"59919","Hungry Horse","MT","48.185481","-113.83078","-7","1"
+"59920","Kila","MT","48.034766","-114.49865","-7","1"
+"59921","Lake McDonald","MT","48.605472","-113.88505","-7","1"
+"59922","Lakeside","MT","48.005656","-114.24184","-7","1"
+"59923","Libby","MT","48.309374","-115.3286","-7","1"
+"59925","Marion","MT","48.080862","-114.80804","-7","1"
+"59926","Martin City","MT","48.36435","-113.98182","-7","1"
+"59927","Olney","MT","48.595224","-114.70843","-7","1"
+"59928","Polebridge","MT","48.863964","-114.42793","-7","1"
+"59929","Proctor","MT","47.923911","-114.37322","-7","1"
+"59930","Rexford","MT","48.875701","-115.27461","-7","1"
+"59931","Rollins","MT","47.911242","-114.19568","-7","1"
+"59932","Somers","MT","48.073924","-114.22384","-7","1"
+"59933","Stryker","MT","48.68464","-114.74914","-7","1"
+"59934","Trego","MT","48.611903","-114.90532","-7","1"
+"59935","Troy","MT","48.671585","-115.862","-7","1"
+"59936","West Glacier","MT","48.497774","-113.92599","-7","1"
+"59937","Whitefish","MT","48.409454","-114.43069","-7","1"
+"60001","Alden","IL","42.324761","-88.452481","-6","1"
+"60002","Antioch","IL","42.46617","-88.09995","-6","1"
+"60004","Arlington Heights","IL","42.108428","-87.97723","-6","1"
+"60005","Arlington Heights","IL","42.069327","-87.98464","-6","1"
+"60006","Arlington Heights","IL","41.811929","-87.68732","-6","1"
+"60007","Elk Grove Village","IL","42.005978","-87.99847","-6","1"
+"60008","Rolling Meadows","IL","42.07506","-88.02508","-6","1"
+"60009","Elk Grove Village","IL","41.811929","-87.68732","-6","1"
+"60010","Barrington","IL","42.160791","-88.15231","-6","1"
+"60011","Barrington","IL","42.322814","-87.610053","-6","1"
+"60012","Crystal Lake","IL","42.265643","-88.31664","-6","1"
+"60013","Cary","IL","42.217523","-88.24338","-6","1"
+"60014","Crystal Lake","IL","42.226623","-88.33066","-6","1"
+"60015","Deerfield","IL","42.169325","-87.86556","-6","1"
+"60016","Des Plaines","IL","42.047178","-87.89058","-6","1"
+"60017","Des Plaines","IL","42.028779","-87.894366","-6","1"
+"60018","Des Plaines","IL","42.008429","-87.89234","-6","1"
+"60019","Des Plaines","IL","42.024278","-87.907066","-6","1"
+"60020","Fox Lake","IL","42.409445","-88.17822","-6","1"
+"60021","Fox River Grove","IL","42.194946","-88.21676","-6","1"
+"60022","Glencoe","IL","42.130976","-87.76252","-6","1"
+"60025","Glenview","IL","42.07672","-87.81922","-6","1"
+"60026","Glenview Nas","IL","41.811929","-87.68732","-6","1"
+"60029","Golf","IL","42.056529","-87.79286","-6","1"
+"60030","Grayslake","IL","42.338955","-88.03433","-6","1"
+"60031","Gurnee","IL","42.375821","-87.93517","-6","1"
+"60033","Harvard","IL","42.424338","-88.61431","-6","1"
+"60034","Hebron","IL","42.468318","-88.43125","-6","1"
+"60035","Highland Park","IL","42.181875","-87.80956","-6","1"
+"60037","Fort Sheridan","IL","42.21196","-87.80808","-6","1"
+"60038","Palatine","IL","42.097976","-88.014072","-6","1"
+"60039","Crystal Lake","IL","42.324761","-88.452481","-6","1"
+"60040","Highwood","IL","42.205724","-87.81421","-6","1"
+"60041","Ingleside","IL","42.372721","-88.15303","-6","1"
+"60042","Island Lake","IL","42.277691","-88.20074","-6","1"
+"60043","Kenilworth","IL","42.088128","-87.716","-6","1"
+"60044","Lake Bluff","IL","42.286222","-87.86309","-6","1"
+"60045","Lake Forest","IL","42.238087","-87.86093","-6","1"
+"60046","Lake Villa","IL","42.410687","-88.05462","-6","1"
+"60047","Lake Zurich","IL","42.199957","-88.05859","-6","1"
+"60048","Libertyville","IL","42.290922","-87.95169","-6","1"
+"60049","Long Grove","IL","42.198674","-88.041875","-6","1"
+"60050","Mchenry","IL","42.348406","-88.24769","-6","1"
+"60051","Mchenry","IL","42.324761","-88.452481","-6","1"
+"60053","Morton Grove","IL","42.041999","-87.78882","-6","1"
+"60054","McHenry","IL","42.35344","-88.260692","-6","1"
+"60055","Palatine","IL","42.097976","-88.014072","-6","1"
+"60056","Mount Prospect","IL","42.065427","-87.93621","-6","1"
+"60060","Mundelein","IL","42.263623","-88.01172","-6","1"
+"60061","Vernon Hills","IL","42.229856","-87.96779","-6","1"
+"60062","Northbrook","IL","42.124576","-87.84303","-6","1"
+"60064","North Chicago","IL","42.326072","-87.85202","-6","1"
+"60065","Northbrook","IL","41.811929","-87.68732","-6","1"
+"60067","Palatine","IL","42.10979","-88.04917","-6","1"
+"60068","Park Ridge","IL","42.01183","-87.84158","-6","1"
+"60069","Lincolnshire","IL","42.188074","-87.92717","-6","1"
+"60070","Prospect Heights","IL","42.105576","-87.92816","-6","1"
+"60071","Richmond","IL","42.464639","-88.3028","-6","1"
+"60072","Ringwood","IL","42.405464","-88.30274","-6","1"
+"60073","Round Lake","IL","42.366253","-88.09647","-6","1"
+"60074","Palatine","IL","42.143819","-88.02546","-6","1"
+"60075","Russell","IL","42.322814","-87.610053","-6","1"
+"60076","Skokie","IL","42.03618","-87.7321","-6","1"
+"60077","Skokie","IL","42.033313","-87.75764","-6","1"
+"60078","Palatine","IL","41.811929","-87.68732","-6","1"
+"60079","Waukegan","IL","42.322814","-87.610053","-6","1"
+"60080","Solon Mills","IL","42.442519","-88.276047","-6","1"
+"60081","Spring Grove","IL","42.441869","-88.22167","-6","1"
+"60082","Techny","IL","42.116377","-87.812064","-6","1"
+"60083","Wadsworth","IL","42.428187","-87.92935","-6","1"
+"60084","Wauconda","IL","42.263181","-88.14328","-6","1"
+"60085","Waukegan","IL","42.361271","-87.86187","-6","1"
+"60086","North Chicago","IL","42.43335","-87.776595","-6","1"
+"60087","Waukegan","IL","42.404272","-87.86525","-6","1"
+"60088","Great Lakes","IL","42.312372","-87.85284","-6","1"
+"60089","Buffalo Grove","IL","42.167638","-87.96393","-6","1"
+"60090","Wheeling","IL","42.131526","-87.92958","-6","1"
+"60091","Wilmette","IL","42.077178","-87.72373","-6","1"
+"60092","Libertyville","IL","42.322814","-87.610053","-6","1"
+"60093","Winnetka","IL","42.104127","-87.75016","-6","1"
+"60094","Palatine","IL","41.811929","-87.68732","-6","1"
+"60095","Palatine","IL","41.811929","-87.68732","-6","1"
+"60096","Winthrop Harbor","IL","42.48067","-87.83018","-6","1"
+"60097","Wonder Lake","IL","42.384504","-88.3495","-6","1"
+"60098","Woodstock","IL","42.316121","-88.43884","-6","1"
+"60099","Zion","IL","42.451371","-87.84862","-6","1"
+"60101","Addison","IL","41.931573","-88.00222","-6","1"
+"60102","Algonquin","IL","42.17315","-88.31849","-6","1"
+"60103","Bartlett","IL","41.977477","-88.17257","-6","1"
+"60104","Bellwood","IL","41.882924","-87.87642","-6","1"
+"60105","Bensenville","IL","41.839679","-88.088716","-6","1"
+"60106","Bensenville","IL","41.956479","-87.95117","-6","1"
+"60107","Streamwood","IL","42.023977","-88.17657","-6","1"
+"60108","Bloomingdale","IL","41.94954","-88.08256","-6","1"
+"60109","Burlington","IL","42.052112","-88.54829","-6","1"
+"60110","Carpentersville","IL","42.121188","-88.27227","-6","1"
+"60111","Clare","IL","41.998231","-88.84223","-6","1"
+"60112","Cortland","IL","41.921121","-88.6899","-6","1"
+"60113","Creston","IL","41.93171","-88.96438","-6","1"
+"60114","Addison","IL","41.839679","-88.088716","-6","1"
+"60115","Dekalb","IL","41.924127","-88.74617","-6","1"
+"60116","Carol Stream","IL","41.839679","-88.088716","-6","1"
+"60117","Bloomingdale","IL","41.839679","-88.088716","-6","1"
+"60118","Dundee","IL","42.101502","-88.28891","-6","1"
+"60119","Elburn","IL","41.876506","-88.46429","-6","1"
+"60120","Elgin","IL","42.037176","-88.25922","-6","1"
+"60121","Elgin","IL","42.04133","-88.3126","-6","1"
+"60122","Elgin","IL","42.067101","-88.304994","-6","1"
+"60123","Elgin","IL","42.034776","-88.32393","-6","1"
+"60125","Carol Stream","IL","41.839679","-88.088716","-6","1"
+"60126","Elmhurst","IL","41.89103","-87.94181","-6","1"
+"60127","Milton","IL","41.878878","-88.134469","-6","1"
+"60128","Carol Stream","IL","41.839679","-88.088716","-6","1"
+"60129","Esmond","IL","42.034502","-88.97084","-6","1"
+"60130","Forest Park","IL","41.871331","-87.81235","-6","1"
+"60131","Franklin Park","IL","41.93548","-87.87468","-6","1"
+"60132","Carol Stream","IL","41.839679","-88.088716","-6","1"
+"60133","Hanover Park","IL","41.980896","-88.144475","-6","1"
+"60134","Geneva","IL","41.885728","-88.31957","-6","1"
+"60135","Genoa","IL","42.10028","-88.6906","-6","1"
+"60136","Gilberts","IL","42.099479","-88.36942","-6","1"
+"60137","Glen Ellyn","IL","41.869779","-88.06285","-6","1"
+"60138","Glen Ellyn","IL","41.839679","-88.088716","-6","1"
+"60139","Glendale Heights","IL","41.920228","-88.07891","-6","1"
+"60140","Hampshire","IL","42.086218","-88.5036","-6","1"
+"60141","Hines","IL","41.858028","-87.83865","-6","1"
+"60142","Huntley","IL","42.171973","-88.42891","-6","1"
+"60143","Itasca","IL","41.972328","-88.02196","-6","1"
+"60144","Kaneville","IL","41.936977","-88.420178","-6","1"
+"60145","Kingston","IL","42.102014","-88.76647","-6","1"
+"60146","Kirkland","IL","42.100571","-88.87665","-6","1"
+"60147","Lafox","IL","41.936977","-88.420178","-6","1"
+"60148","Lombard","IL","41.875429","-88.01723","-6","1"
+"60149","Dement","IL","41.964197","-88.951205","-6","1"
+"60150","Malta","IL","41.933061","-88.88293","-6","1"
+"60151","Maple Park","IL","41.91842","-88.57626","-6","1"
+"60152","Marengo","IL","42.242199","-88.61034","-6","1"
+"60153","Maywood","IL","41.880281","-87.84455","-6","1"
+"60154","Westchester","IL","41.851257","-87.88351","-6","1"
+"60155","Broadview","IL","41.857931","-87.85477","-6","1"
+"60156","Lake in the Hills","IL","42.185733","-88.348484","-6","1"
+"60157","Medinah","IL","41.970628","-88.05606","-6","1"
+"60159","Schaumburg","IL","41.811929","-87.68732","-6","1"
+"60160","Melrose Park","IL","41.89988","-87.85978","-6","1"
+"60161","Melrose Park","IL","41.811929","-87.68732","-6","1"
+"60162","Hillside","IL","41.872997","-87.90101","-6","1"
+"60163","Berkeley","IL","41.886794","-87.91052","-6","1"
+"60164","Melrose Park","IL","41.91823","-87.89627","-6","1"
+"60165","Stone Park","IL","41.90158","-87.88046","-6","1"
+"60168","Schaumburg","IL","41.811929","-87.68732","-6","1"
+"60170","Plato Center","IL","42.025776","-88.425931","-6","1"
+"60171","River Grove","IL","41.92583","-87.84013","-6","1"
+"60172","Roselle","IL","41.980761","-88.08704","-6","1"
+"60173","Schaumburg","IL","42.051927","-88.04814","-6","1"
+"60174","Saint Charles","IL","41.919808","-88.30498","-6","1"
+"60175","Saint Charles","IL","41.944577","-88.38326","-6","1"
+"60176","Schiller Park","IL","41.95683","-87.87193","-6","1"
+"60177","South Elgin","IL","41.99215","-88.30609","-6","1"
+"60178","Sycamore","IL","41.990505","-88.68704","-6","1"
+"60179","Hoffman Estates","IL","42.079336","-88.223655","-6","1"
+"60180","Union","IL","42.229437","-88.52606","-6","1"
+"60181","Villa Park","IL","41.880429","-87.97813","-6","1"
+"60182","Virgil","IL","41.908736","-88.59915","-6","1"
+"60183","Wasco","IL","41.936977","-88.420178","-6","1"
+"60184","Wayne","IL","41.953427","-88.25176","-6","1"
+"60185","West Chicago","IL","41.891978","-88.20502","-6","1"
+"60186","West Chicago","IL","41.839679","-88.088716","-6","1"
+"60187","Wheaton","IL","41.858279","-88.10904","-6","1"
+"60188","Carol Stream","IL","41.918578","-88.13688","-6","1"
+"60189","Wheaton","IL","41.839679","-88.088716","-6","1"
+"60190","Winfield","IL","41.875228","-88.15261","-6","1"
+"60191","Wood Dale","IL","41.962979","-87.97688","-6","1"
+"60192","Schaumburg","IL","42.065827","-88.21399","-6","1"
+"60193","Schaumburg","IL","42.01299","-88.09675","-6","1"
+"60194","Schaumburg","IL","42.037108","-88.10719","-6","1"
+"60195","Schaumburg","IL","42.067809","-88.10828","-6","1"
+"60196","Schaumburg","IL","42.056376","-88.072522","-6","1"
+"60197","Carol Stream","IL","41.839679","-88.088716","-6","1"
+"60198","Carol Stream","IL","41.839679","-88.088716","-6","1"
+"60199","Carol Stream","IL","41.839679","-88.088716","-6","1"
+"60201","Evanston","IL","42.056391","-87.69684","-6","1"
+"60202","Evanston","IL","42.030327","-87.68828","-6","1"
+"60203","Evanston","IL","42.048879","-87.7175","-6","1"
+"60204","Evanston","IL","41.811929","-87.68732","-6","1"
+"60208","Evanston","IL","42.058629","-87.684506","-6","1"
+"60209","Evanston","IL","42.04973","-87.679408","-6","1"
+"60301","Oak Park","IL","41.887981","-87.79562","-6","1"
+"60302","Oak Park","IL","41.893941","-87.78899","-6","1"
+"60303","Oak Park","IL","41.811929","-87.68732","-6","1"
+"60304","Oak Park","IL","41.87355","-87.7885","-6","1"
+"60305","River Forest","IL","41.893031","-87.81718","-6","1"
+"60330","River Forest","IL","41.882081","-87.821359","-6","1"
+"60401","Beecher","IL","41.350484","-87.62408","-6","1"
+"60402","Berwyn","IL","41.836981","-87.79095","-6","1"
+"60406","Blue Island","IL","41.656592","-87.68154","-6","1"
+"60407","Braceville","IL","41.230524","-88.25503","-6","1"
+"60408","Braidwood","IL","41.262178","-88.22307","-6","1"
+"60409","Calumet City","IL","41.614188","-87.54638","-6","1"
+"60410","Channahon","IL","41.439518","-88.20898","-6","1"
+"60411","Chicago Heights","IL","41.511307","-87.6101","-6","1"
+"60412","Chicago Heights","IL","41.811929","-87.68732","-6","1"
+"60415","Chicago Ridge","IL","41.702482","-87.77869","-6","1"
+"60416","Coal City","IL","41.292011","-88.2783","-6","1"
+"60417","Crete","IL","41.439034","-87.61173","-6","1"
+"60419","Dolton","IL","41.626839","-87.59865","-6","1"
+"60420","Dwight","IL","41.089453","-88.42783","-6","1"
+"60421","Elwood","IL","41.429681","-88.10284","-6","1"
+"60422","Flossmoor","IL","41.539384","-87.68424","-6","1"
+"60423","Frankfort","IL","41.501178","-87.83875","-6","1"
+"60424","Gardner","IL","41.174117","-88.30954","-6","1"
+"60425","Glenwood","IL","41.544584","-87.61289","-6","1"
+"60426","Harvey","IL","41.609078","-87.66264","-6","1"
+"60429","Hazel Crest","IL","41.574034","-87.67857","-6","1"
+"60430","Homewood","IL","41.556734","-87.66464","-6","1"
+"60431","Joliet","IL","41.52493","-88.19022","-6","1"
+"60432","Joliet","IL","41.533631","-88.05592","-6","1"
+"60433","Joliet","IL","41.511644","-88.05698","-6","1"
+"60434","Joliet","IL","41.52543","-88.084208","-6","1"
+"60435","Joliet","IL","41.54338","-88.11963","-6","1"
+"60436","Joliet","IL","41.50798","-88.10553","-6","1"
+"60437","Kinsman","IL","41.168761","-88.55792","-6","1"
+"60438","Lansing","IL","41.565685","-87.54819","-6","1"
+"60439","Lemont","IL","41.676028","-87.98258","-6","1"
+"60440","Bolingbrook","IL","41.703097","-88.07462","-6","1"
+"60441","Lockport","IL","41.598235","-88.02753","-6","1"
+"60442","Manhattan","IL","41.407474","-87.96883","-6","1"
+"60443","Matteson","IL","41.503468","-87.73695","-6","1"
+"60444","Mazon","IL","41.243419","-88.40325","-6","1"
+"60445","Midlothian","IL","41.631683","-87.73309","-6","1"
+"60446","Romeoville","IL","41.64273","-88.09934","-6","1"
+"60447","Minooka","IL","41.473553","-88.29167","-6","1"
+"60448","Mokena","IL","41.536782","-87.88582","-6","1"
+"60449","Monee","IL","41.422555","-87.75531","-6","1"
+"60450","Morris","IL","41.370642","-88.40749","-6","1"
+"60451","New Lenox","IL","41.509231","-87.96475","-6","1"
+"60452","Oak Forest","IL","41.605633","-87.75356","-6","1"
+"60453","Oak Lawn","IL","41.715082","-87.7546","-6","1"
+"60454","Oak Lawn","IL","41.811929","-87.68732","-6","1"
+"60455","Bridgeview","IL","41.742432","-87.80678","-6","1"
+"60456","Hometown","IL","41.730533","-87.73198","-6","1"
+"60457","Hickory Hills","IL","41.723782","-87.82825","-6","1"
+"60458","Justice","IL","41.746432","-87.83557","-6","1"
+"60459","Burbank","IL","41.744082","-87.77022","-6","1"
+"60460","Odell","IL","41.00148","-88.52981","-6","1"
+"60461","Olympia Fields","IL","41.51829","-87.69274","-6","1"
+"60462","Orland Park","IL","41.623532","-87.83542","-6","1"
+"60463","Palos Heights","IL","41.663548","-87.79148","-6","1"
+"60464","Palos Park","IL","41.664582","-87.84378","-6","1"
+"60465","Palos Hills","IL","41.699432","-87.82977","-6","1"
+"60466","Park Forest","IL","41.472934","-87.68767","-6","1"
+"60467","Orland Park","IL","41.598255","-87.89201","-6","1"
+"60468","Peotone","IL","41.331114","-87.79917","-6","1"
+"60469","Posen","IL","41.628034","-87.68694","-6","1"
+"60470","Ransom","IL","41.169068","-88.6494","-6","1"
+"60471","Richton Park","IL","41.483844","-87.72134","-6","1"
+"60472","Robbins","IL","41.642933","-87.70814","-6","1"
+"60473","South Holland","IL","41.597472","-87.59909","-6","1"
+"60474","South Wilmington","IL","41.173313","-88.27494","-6","1"
+"60475","Steger","IL","41.470084","-87.63369","-6","1"
+"60476","Thornton","IL","41.570384","-87.60839","-6","1"
+"60477","Tinley Park","IL","41.5738","-87.80389","-6","1"
+"60478","Country Club Hills","IL","41.561134","-87.72398","-6","1"
+"60479","Verona","IL","41.231718","-88.52659","-6","1"
+"60480","Willow Springs","IL","41.737616","-87.87778","-6","1"
+"60481","Wilmington","IL","41.298186","-88.1464","-6","1"
+"60482","Worth","IL","41.688827","-87.79265","-6","1"
+"60490","Bolingbrook","IL","41.684752","-88.14203","-6","1"
+"60499","Bedford Park","IL","41.811929","-87.68732","-6","1"
+"60501","Summit Argo","IL","41.784832","-87.81","-6","1"
+"60504","Aurora","IL","41.760067","-88.25218","-6","1"
+"60505","Aurora","IL","41.756129","-88.29699","-6","1"
+"60506","Aurora","IL","41.766029","-88.35254","-6","1"
+"60507","Aurora","IL","41.936977","-88.420178","-6","1"
+"60510","Batavia","IL","41.845228","-88.30995","-6","1"
+"60511","Big Rock","IL","41.75537","-88.54865","-6","1"
+"60512","Bristol","IL","41.706034","-88.41296","-6","1"
+"60513","Brookfield","IL","41.822681","-87.84753","-6","1"
+"60514","Clarendon Hills","IL","41.779533","-87.95798","-6","1"
+"60515","Downers Grove","IL","41.80348","-88.01827","-6","1"
+"60516","Downers Grove","IL","41.761463","-88.01334","-6","1"
+"60517","Woodridge","IL","41.75253","-88.04864","-6","1"
+"60518","Earlville","IL","41.599139","-88.91932","-6","1"
+"60519","Eola","IL","41.778379","-88.24268","-6","1"
+"60520","Hinckley","IL","41.776884","-88.64655","-6","1"
+"60521","Hinsdale","IL","41.772915","-87.92996","-6","1"
+"60522","Hinsdale","IL","41.839679","-88.088716","-6","1"
+"60523","Oak Brook","IL","41.837716","-87.96041","-6","1"
+"60525","La Grange","IL","41.788536","-87.87605","-6","1"
+"60526","La Grange Park","IL","41.829831","-87.8704","-6","1"
+"60527","Hinsdale","IL","41.839679","-88.088716","-6","1"
+"60530","Lee","IL","41.792378","-88.9516","-6","1"
+"60531","Leland","IL","41.620636","-88.78895","-6","1"
+"60532","Lisle","IL","41.789079","-88.08536","-6","1"
+"60534","Lyons","IL","41.812331","-87.82318","-6","1"
+"60536","Millbrook","IL","41.598631","-88.55317","-6","1"
+"60537","Millington","IL","41.56253","-88.59921","-6","1"
+"60538","Montgomery","IL","41.721886","-88.32972","-6","1"
+"60539","Mooseheart","IL","41.823478","-88.3332","-6","1"
+"60540","Naperville","IL","41.764779","-88.14579","-6","1"
+"60541","Newark","IL","41.529433","-88.53552","-6","1"
+"60542","North Aurora","IL","41.809387","-88.32931","-6","1"
+"60543","Oswego","IL","41.684896","-88.34177","-6","1"
+"60544","Plainfield","IL","41.607624","-88.19736","-6","1"
+"60545","Plano","IL","41.665654","-88.53697","-6","1"
+"60546","Riverside","IL","41.836131","-87.82163","-6","1"
+"60548","Sandwich","IL","41.645393","-88.63052","-6","1"
+"60549","Serena","IL","41.490329","-88.74998","-6","1"
+"60550","Shabbona","IL","41.769322","-88.86858","-6","1"
+"60551","Sheridan","IL","41.527585","-88.68292","-6","1"
+"60552","Somonauk","IL","41.645998","-88.69","-6","1"
+"60553","Steward","IL","41.830628","-89.01704","-6","1"
+"60554","Sugar Grove","IL","41.779939","-88.45183","-6","1"
+"60555","Warrenville","IL","41.82552","-88.19452","-6","1"
+"60556","Waterman","IL","41.768498","-88.77539","-6","1"
+"60557","Wedron","IL","41.438531","-88.76933","-6","1"
+"60558","Western Springs","IL","41.805531","-87.90103","-6","1"
+"60559","Westmont","IL","41.795358","-87.97778","-6","1"
+"60560","Yorkville","IL","41.631342","-88.43996","-6","1"
+"60561","Darien","IL","41.745623","-87.98108","-6","1"
+"60563","Naperville","IL","41.794885","-88.16188","-6","1"
+"60564","Naperville","IL","41.707118","-88.19634","-6","1"
+"60565","Naperville","IL","41.728738","-88.12824","-6","1"
+"60566","Naperville","IL","41.839679","-88.088716","-6","1"
+"60567","Naperville","IL","41.839679","-88.088716","-6","1"
+"60568","Aurora","IL","41.935616","-88.43238","-6","1"
+"60570","Hinsdale","IL","41.839679","-88.088716","-6","1"
+"60572","Aurora","IL","41.839679","-88.088716","-6","1"
+"60597","Fox Valley","IL","41.839679","-88.088716","-6","1"
+"60598","Aurora","IL","41.839679","-88.088716","-6","1"
+"60599","Fox Valley","IL","41.839679","-88.088716","-6","1"
+"60601","Chicago","IL","41.886456","-87.62325","-6","1"
+"60602","Chicago","IL","41.882937","-87.62874","-6","1"
+"60603","Chicago","IL","41.880446","-87.63014","-6","1"
+"60604","Chicago","IL","41.877589","-87.62818","-6","1"
+"60605","Chicago","IL","41.860019","-87.6187","-6","1"
+"60606","Chicago","IL","41.882582","-87.6376","-6","1"
+"60607","Chicago","IL","41.875882","-87.65114","-6","1"
+"60608","Chicago","IL","41.850532","-87.6699","-6","1"
+"60609","Chicago","IL","41.814283","-87.65282","-6","1"
+"60610","Chicago","IL","41.898582","-87.6371","-6","1"
+"60611","Chicago","IL","41.904667","-87.62504","-6","1"
+"60612","Chicago","IL","41.880682","-87.6877","-6","1"
+"60613","Chicago","IL","41.953256","-87.6629","-6","1"
+"60614","Chicago","IL","41.922682","-87.65432","-6","1"
+"60615","Chicago","IL","41.801525","-87.60215","-6","1"
+"60616","Chicago","IL","41.8474","-87.63126","-6","1"
+"60617","Chicago","IL","41.719973","-87.5557","-6","1"
+"60618","Chicago","IL","41.945681","-87.7048","-6","1"
+"60619","Chicago","IL","41.744834","-87.60444","-6","1"
+"60620","Chicago","IL","41.740483","-87.65282","-6","1"
+"60621","Chicago","IL","41.776983","-87.6404","-6","1"
+"60622","Chicago","IL","41.900332","-87.66927","-6","1"
+"60623","Chicago","IL","41.850232","-87.718","-6","1"
+"60624","Chicago","IL","41.879365","-87.72199","-6","1"
+"60625","Chicago","IL","41.971614","-87.70256","-6","1"
+"60626","Chicago","IL","42.009731","-87.66938","-6","1"
+"60628","Chicago","IL","41.695434","-87.62255","-6","1"
+"60629","Chicago","IL","41.777482","-87.71155","-6","1"
+"60630","Chicago","IL","41.971044","-87.75869","-6","1"
+"60631","Chicago","IL","41.99623","-87.81091","-6","1"
+"60632","Chicago","IL","41.809299","-87.7105","-6","1"
+"60633","Chicago","IL","41.655423","-87.55365","-6","1"
+"60634","Chicago","IL","41.944454","-87.79654","-6","1"
+"60636","Chicago","IL","41.776633","-87.66854","-6","1"
+"60637","Chicago","IL","41.779384","-87.60544","-6","1"
+"60638","Chicago","IL","41.787982","-87.7738","-6","1"
+"60639","Chicago","IL","41.921431","-87.75415","-6","1"
+"60640","Chicago","IL","41.973181","-87.6665","-6","1"
+"60641","Chicago","IL","41.946431","-87.74576","-6","1"
+"60643","Chicago","IL","41.696433","-87.65993","-6","1"
+"60644","Chicago","IL","41.881331","-87.75671","-6","1"
+"60645","Chicago","IL","42.008956","-87.69634","-6","1"
+"60646","Chicago","IL","41.995331","-87.7601","-6","1"
+"60647","Chicago","IL","41.921126","-87.70085","-6","1"
+"60648","Peotone","IL","41.335445","-87.785286","-6","1"
+"60649","Chicago","IL","41.761734","-87.57072","-6","1"
+"60650","Chicago","IL","41.818682","-87.743454","-6","1"
+"60651","Chicago","IL","41.901485","-87.74055","-6","1"
+"60652","Chicago","IL","41.7446","-87.71188","-6","1"
+"60653","Chicago","IL","41.819833","-87.61269","-6","1"
+"60654","Chicago","IL","41.888627","-87.63538","-6","1"
+"60655","Chicago","IL","41.696283","-87.69912","-6","1"
+"60656","Chicago","IL","41.97508","-87.8163","-6","1"
+"60657","Chicago","IL","41.940832","-87.65852","-6","1"
+"60659","Chicago","IL","41.991381","-87.70378","-6","1"
+"60660","Chicago","IL","41.990631","-87.6667","-6","1"
+"60661","Chicago","IL","41.882082","-87.64461","-6","1"
+"60663","Chicago","IL","41.811929","-87.68732","-6","1"
+"60664","Chicago","IL","41.811929","-87.68732","-6","1"
+"60665","Chicago","IL","41.811929","-87.68732","-6","1"
+"60666","Amf Ohare","IL","41.968029","-87.891214","-6","1"
+"60667","Chicago","IL","41.811929","-87.68732","-6","1"
+"60668","Chicago","IL","41.811929","-87.68732","-6","1"
+"60669","Chicago","IL","41.811929","-87.68732","-6","1"
+"60670","Chicago","IL","41.811929","-87.68732","-6","1"
+"60671","Chicago","IL","41.811929","-87.68732","-6","1"
+"60672","Chicago","IL","41.811929","-87.68732","-6","1"
+"60673","Chicago","IL","41.811929","-87.68732","-6","1"
+"60674","Chicago","IL","41.811929","-87.68732","-6","1"
+"60675","Chicago","IL","41.811929","-87.68732","-6","1"
+"60677","Chicago","IL","41.811929","-87.68732","-6","1"
+"60678","Chicago","IL","41.811929","-87.68732","-6","1"
+"60679","Chicago","IL","41.811929","-87.68732","-6","1"
+"60680","Chicago","IL","41.811929","-87.68732","-6","1"
+"60681","Chicago","IL","41.811929","-87.68732","-6","1"
+"60683","Chicago","IL","41.811929","-87.68732","-6","1"
+"60684","Chicago","IL","41.811929","-87.68732","-6","1"
+"60685","Chicago","IL","41.811929","-87.68732","-6","1"
+"60687","Chicago","IL","41.811929","-87.68732","-6","1"
+"60690","Chicago","IL","41.811929","-87.68732","-6","1"
+"60691","Chicago","IL","41.811929","-87.68732","-6","1"
+"60692","Chicago","IL","41.867532","-87.672553","-6","1"
+"60693","Chicago","IL","42.096428","-87.71791","-6","1"
+"60694","Chicago","IL","41.811929","-87.68732","-6","1"
+"60697","Chicago","IL","41.811929","-87.68732","-6","1"
+"60699","Chicago","IL","41.811929","-87.68732","-6","1"
+"60701","Chicago","IL","41.811929","-87.68732","-6","1"
+"60706","Harwood Heights","IL","41.96418","-87.81686","-6","1"
+"60707","Elmwood Park","IL","41.922681","-87.80805","-6","1"
+"60712","Lincolnwood","IL","42.005331","-87.73545","-6","1"
+"60714","Niles","IL","42.032379","-87.81563","-6","1"
+"60803","Alsip","IL","41.675861","-87.73189","-6","1"
+"60804","Cicero","IL","41.844382","-87.7599","-6","1"
+"60805","Evergreen Park","IL","41.719933","-87.70249","-6","1"
+"60827","Riverdale","IL","41.649717","-87.63292","-6","1"
+"60901","Kankakee","IL","41.114132","-87.86784","-6","1"
+"60902","Kankakee","IL","41.146464","-87.888971","-6","1"
+"60910","Aroma Park","IL","41.078981","-87.80536","-6","1"
+"60911","Ashkum","IL","40.883641","-87.9667","-6","1"
+"60912","Beaverville","IL","40.968579","-87.61611","-6","1"
+"60913","Bonfield","IL","41.147958","-88.06412","-6","1"
+"60914","Bourbonnais","IL","41.170442","-87.86891","-6","1"
+"60915","Bradley","IL","41.144256","-87.86239","-6","1"
+"60917","Buckingham","IL","41.04699","-88.18649","-6","1"
+"60918","Buckley","IL","40.598963","-88.03308","-6","1"
+"60919","Cabery","IL","40.987824","-88.23737","-6","1"
+"60920","Campus","IL","41.024846","-88.30797","-6","1"
+"60921","Chatsworth","IL","40.757447","-88.29306","-6","1"
+"60922","Chebanse","IL","41.005603","-87.90649","-6","1"
+"60924","Cissna Park","IL","40.565374","-87.88177","-6","1"
+"60926","Claytonville","IL","40.572516","-87.81825","-6","1"
+"60927","Clifton","IL","40.937573","-87.94105","-6","1"
+"60928","Crescent City","IL","40.766096","-87.85474","-6","1"
+"60929","Cullom","IL","40.873","-88.28676","-6","1"
+"60930","Danforth","IL","40.823527","-87.9874","-6","1"
+"60931","Donovan","IL","40.876303","-87.60159","-6","1"
+"60932","East Lynn","IL","40.465251","-87.80112","-6","1"
+"60933","Elliott","IL","40.465744","-88.26994","-6","1"
+"60934","Emington","IL","40.966528","-88.34937","-6","1"
+"60935","Essex","IL","41.17569","-88.17268","-6","1"
+"60936","Gibson City","IL","40.463079","-88.3731","-6","1"
+"60938","Gilman","IL","40.767194","-87.98929","-6","1"
+"60939","Goodwine","IL","40.748087","-87.82876","-6","1"
+"60940","Grant Park","IL","41.244016","-87.64464","-6","1"
+"60941","Herscher","IL","41.05113","-88.08957","-6","1"
+"60942","Hoopeston","IL","40.465869","-87.66766","-6","1"
+"60944","Hopkins Park","IL","41.146464","-87.888971","-6","1"
+"60945","Iroquois","IL","40.827011","-87.58356","-6","1"
+"60946","Kempton","IL","40.908942","-88.21304","-6","1"
+"60948","Loda","IL","40.526477","-88.0821","-6","1"
+"60949","Ludlow","IL","40.375602","-88.11524","-6","1"
+"60950","Manteno","IL","41.250408","-87.85125","-6","1"
+"60951","Martinton","IL","40.912916","-87.75589","-6","1"
+"60952","Melvin","IL","40.562833","-88.25053","-6","1"
+"60953","Milford","IL","40.624025","-87.69618","-6","1"
+"60954","Momence","IL","41.147918","-87.63579","-6","1"
+"60955","Onarga","IL","40.706634","-87.99624","-6","1"
+"60956","Papineau","IL","40.966993","-87.716074","-6","1"
+"60957","Paxton","IL","40.448736","-88.11405","-6","1"
+"60959","Piper City","IL","40.779834","-88.18012","-6","1"
+"60960","Rankin","IL","40.439688","-87.89016","-6","1"
+"60961","Reddick","IL","41.105629","-88.23794","-6","1"
+"60962","Roberts","IL","40.625486","-88.18667","-6","1"
+"60963","Rossville","IL","40.372447","-87.6603","-6","1"
+"60964","Saint Anne","IL","41.045785","-87.68963","-6","1"
+"60966","Sheldon","IL","40.762507","-87.57423","-6","1"
+"60967","Stockland","IL","40.613942","-87.59259","-6","1"
+"60968","Thawville","IL","40.6756","-88.10761","-6","1"
+"60969","Union Hill","IL","41.109101","-88.14732","-6","1"
+"60970","Watseka","IL","40.784447","-87.74051","-6","1"
+"60973","Wellington","IL","40.543697","-87.66475","-6","1"
+"60974","Woodland","IL","40.710295","-87.73137","-6","1"
+"61001","Apple River","IL","42.472458","-90.12098","-6","1"
+"61006","Ashton","IL","41.865034","-89.21536","-6","1"
+"61007","Baileyville","IL","42.199457","-89.59662","-6","1"
+"61008","Belvidere","IL","42.257229","-88.84755","-6","1"
+"61010","Byron","IL","42.131245","-89.26637","-6","1"
+"61011","Caledonia","IL","42.376423","-88.9325","-6","1"
+"61012","Capron","IL","42.401104","-88.74726","-6","1"
+"61013","Cedarville","IL","42.375078","-89.63382","-6","1"
+"61014","Chadwick","IL","41.97068","-89.87508","-6","1"
+"61015","Chana","IL","41.982993","-89.2128","-6","1"
+"61016","Cherry Valley","IL","42.222221","-88.9543","-6","1"
+"61017","Coleta","IL","41.902977","-89.804293","-6","1"
+"61018","Dakota","IL","42.403305","-89.55466","-6","1"
+"61019","Davis","IL","42.440374","-89.40925","-6","1"
+"61020","Davis Junction","IL","42.101928","-89.09369","-6","1"
+"61021","Dixon","IL","41.843702","-89.47636","-6","1"
+"61024","Durand","IL","42.436585","-89.30394","-6","1"
+"61025","East Dubuque","IL","42.483971","-90.58945","-6","1"
+"61027","Eleroy","IL","42.332038","-89.761171","-6","1"
+"61028","Elizabeth","IL","42.298773","-90.17778","-6","1"
+"61030","Forreston","IL","42.119619","-89.58242","-6","1"
+"61031","Franklin Grove","IL","41.84036","-89.31176","-6","1"
+"61032","Freeport","IL","42.300918","-89.63208","-6","1"
+"61036","Galena","IL","42.400744","-90.39738","-6","1"
+"61037","Galt","IL","41.788761","-89.76182","-6","1"
+"61038","Garden Prairie","IL","42.255617","-88.74344","-6","1"
+"61039","German Valley","IL","42.213851","-89.47449","-6","1"
+"61041","Hanover","IL","42.270426","-90.31077","-6","1"
+"61042","Harmon","IL","41.69339","-89.56986","-6","1"
+"61043","Holcomb","IL","42.045123","-89.313593","-6","1"
+"61044","Kent","IL","42.320303","-89.91237","-6","1"
+"61046","Lanark","IL","42.111421","-89.82436","-6","1"
+"61047","Leaf River","IL","42.139244","-89.3968","-6","1"
+"61048","Lena","IL","42.381064","-89.83062","-6","1"
+"61049","Lindenwood","IL","42.054546","-89.02456","-6","1"
+"61050","McConnell","IL","42.4447","-89.72708","-6","1"
+"61051","Milledgeville","IL","41.965904","-89.75896","-6","1"
+"61052","Monroe Center","IL","42.110548","-89.00751","-6","1"
+"61053","Mount Carroll","IL","42.1009","-89.98255","-6","1"
+"61054","Mount Morris","IL","42.046139","-89.44025","-6","1"
+"61057","Nachusa","IL","41.830896","-89.39613","-6","1"
+"61058","Nelson","IL","41.797256","-89.599529","-6","1"
+"61059","Nora","IL","42.455036","-89.94561","-6","1"
+"61060","Orangeville","IL","42.475891","-89.63404","-6","1"
+"61061","Oregon","IL","42.00663","-89.33932","-6","1"
+"61062","Pearl City","IL","42.250987","-89.83571","-6","1"
+"61063","Pecatonica","IL","42.307665","-89.34453","-6","1"
+"61064","Polo","IL","41.989386","-89.59084","-6","1"
+"61065","Poplar Grove","IL","42.364394","-88.84665","-6","1"
+"61067","Ridott","IL","42.298218","-89.47652","-6","1"
+"61068","Rochelle","IL","41.935139","-89.06891","-6","1"
+"61070","Rock City","IL","42.407384","-89.46228","-6","1"
+"61071","Rock Falls","IL","41.759473","-89.69452","-6","1"
+"61072","Rockton","IL","42.447856","-89.08485","-6","1"
+"61073","Roscoe","IL","42.419097","-89.00407","-6","1"
+"61074","Savanna","IL","42.099635","-90.12858","-6","1"
+"61075","Scales Mound","IL","42.473737","-90.25362","-6","1"
+"61076","Scioto Mills","IL","42.355422","-89.667939","-6","1"
+"61077","Seward","IL","42.236813","-89.35828","-6","1"
+"61078","Shannon","IL","42.15834","-89.73555","-6","1"
+"61079","Shirland","IL","42.325364","-89.170527","-6","1"
+"61080","South Beloit","IL","42.484835","-89.02756","-6","1"
+"61081","Sterling","IL","41.813776","-89.70537","-6","1"
+"61084","Stillman Valley","IL","42.112207","-89.18633","-6","1"
+"61085","Stockton","IL","42.350108","-90.02362","-6","1"
+"61087","Warren","IL","42.491388","-89.98979","-6","1"
+"61088","Winnebago","IL","42.271385","-89.25099","-6","1"
+"61089","Winslow","IL","42.475078","-89.81607","-6","1"
+"61091","Woosung","IL","41.905844","-89.54255","-6","1"
+"61101","Rockford","IL","42.292221","-89.12574","-6","1"
+"61102","Rockford","IL","42.25517","-89.1297","-6","1"
+"61103","Rockford","IL","42.303365","-89.08246","-6","1"
+"61104","Rockford","IL","42.25537","-89.07602","-6","1"
+"61105","Rockford","IL","42.325364","-89.170527","-6","1"
+"61106","Rockford","IL","42.325364","-89.170527","-6","1"
+"61107","Rockford","IL","42.280019","-89.03347","-6","1"
+"61108","Rockford","IL","42.254087","-89.01776","-6","1"
+"61109","Rockford","IL","42.213439","-89.05595","-6","1"
+"61110","Rockford","IL","42.325364","-89.170527","-6","1"
+"61111","Loves Park","IL","42.326227","-89.02573","-6","1"
+"61112","Rockford","IL","42.245596","-88.97586","-6","1"
+"61114","Rockford","IL","42.306666","-89.00839","-6","1"
+"61115","Machesney Park","IL","42.352539","-89.04186","-6","1"
+"61125","Rockford","IL","42.325364","-89.170527","-6","1"
+"61126","Rockford","IL","42.325364","-89.170527","-6","1"
+"61130","Loves Park","IL","42.325364","-89.170527","-6","1"
+"61131","Loves Park","IL","42.325364","-89.170527","-6","1"
+"61132","Loves Park","IL","42.325364","-89.170527","-6","1"
+"61201","Rock Island","IL","41.4903","-90.56956","-6","1"
+"61202","Rock Island","IL","41.466752","-90.58714","-6","1"
+"61204","Rock Island","IL","41.554901","-90.615975","-6","1"
+"61206","Rock Island","IL","41.554901","-90.615975","-6","1"
+"61230","Albany","IL","41.766003","-90.22322","-6","1"
+"61231","Aledo","IL","41.202461","-90.73137","-6","1"
+"61232","Andalusia","IL","41.440852","-90.71957","-6","1"
+"61233","Andover","IL","41.292977","-90.29334","-6","1"
+"61234","Annawan","IL","41.412944","-89.92236","-6","1"
+"61235","Atkinson","IL","41.409646","-90.01821","-6","1"
+"61236","Barstow","IL","41.518317","-90.35597","-6","1"
+"61237","Buffalo Prairie","IL","41.336752","-90.852226","-6","1"
+"61238","Cambridge","IL","41.286797","-90.17486","-6","1"
+"61239","Carbon Cliff","IL","41.497667","-90.39047","-6","1"
+"61240","Coal Valley","IL","41.439784","-90.428","-6","1"
+"61241","Colona","IL","41.483484","-90.34046","-6","1"
+"61242","Cordova","IL","41.697188","-90.30177","-6","1"
+"61243","Deer Grove","IL","41.610151","-89.66298","-6","1"
+"61244","East Moline","IL","41.518733","-90.41788","-6","1"
+"61250","Erie","IL","41.657803","-90.08613","-6","1"
+"61251","Fenton","IL","41.738551","-90.06922","-6","1"
+"61252","Fulton","IL","41.863049","-90.14524","-6","1"
+"61254","Geneseo","IL","41.464473","-90.15854","-6","1"
+"61256","Hampton","IL","41.554666","-90.40987","-6","1"
+"61257","Hillsdale","IL","41.590161","-90.20392","-6","1"
+"61258","Hooppole","IL","41.522044","-89.91216","-6","1"
+"61259","Illinois City","IL","41.369036","-90.9284","-6","1"
+"61260","Joy","IL","41.228561","-90.87565","-6","1"
+"61261","Lyndon","IL","41.719782","-89.92116","-6","1"
+"61262","Lynn Center","IL","41.28595","-90.36117","-6","1"
+"61263","Matherville","IL","41.260255","-90.60587","-6","1"
+"61264","Milan","IL","41.426583","-90.57639","-6","1"
+"61265","Moline","IL","41.490333","-90.50006","-6","1"
+"61266","Moline","IL","41.554901","-90.615975","-6","1"
+"61270","Morrison","IL","41.819003","-89.96623","-6","1"
+"61272","New Boston","IL","41.223984","-91.0123","-6","1"
+"61273","Orion","IL","41.357236","-90.38482","-6","1"
+"61274","Osco","IL","41.372408","-90.27031","-6","1"
+"61275","Port Byron","IL","41.599642","-90.31978","-6","1"
+"61276","Preemption","IL","41.30589","-90.5979","-6","1"
+"61277","Prophetstown","IL","41.612038","-89.93036","-6","1"
+"61278","Rapids City","IL","41.585883","-90.343228","-6","1"
+"61279","Reynolds","IL","41.31653","-90.70671","-6","1"
+"61281","Sherrard","IL","41.303101","-90.50615","-6","1"
+"61282","Silvis","IL","41.501234","-90.41404","-6","1"
+"61283","Tampico","IL","41.605825","-89.77628","-6","1"
+"61284","Taylor Ridge","IL","41.406276","-90.735","-6","1"
+"61285","Thomson","IL","41.978758","-90.09248","-6","1"
+"61299","Rock Island","IL","41.520333","-90.541585","-6","1"
+"61301","La Salle","IL","41.347117","-89.08974","-6","1"
+"61310","Amboy","IL","41.707588","-89.34371","-6","1"
+"61311","Ancona","IL","41.042878","-88.86268","-6","1"
+"61312","Arlington","IL","41.435197","-89.23432","-6","1"
+"61313","Blackstone","IL","41.064946","-88.66836","-6","1"
+"61314","Buda","IL","41.310471","-89.67662","-6","1"
+"61315","Bureau","IL","41.289819","-89.37069","-6","1"
+"61316","Cedar Point","IL","41.261853","-89.12523","-6","1"
+"61317","Cherry","IL","41.4276","-89.21243","-6","1"
+"61318","Compton","IL","41.710715","-89.07807","-6","1"
+"61319","Cornell","IL","41.011259","-88.74854","-6","1"
+"61320","Dalzell","IL","41.350864","-89.17366","-6","1"
+"61321","Dana","IL","40.963663","-88.97932","-6","1"
+"61322","Depue","IL","41.321814","-89.3086","-6","1"
+"61323","Dover","IL","41.435327","-89.39583","-6","1"
+"61324","Eldena","IL","41.770952","-89.41267","-6","1"
+"61325","Grand Ridge","IL","41.234167","-88.82807","-6","1"
+"61326","Granville","IL","41.264159","-89.23655","-6","1"
+"61327","Hennepin","IL","41.252101","-89.32451","-6","1"
+"61328","Kasbeer","IL","41.504603","-89.46289","-6","1"
+"61329","Ladd","IL","41.380259","-89.21239","-6","1"
+"61330","La Moille","IL","41.53364","-89.27691","-6","1"
+"61331","Lee Center","IL","41.747471","-89.27713","-6","1"
+"61332","Leonore","IL","41.190024","-88.98238","-6","1"
+"61333","Long Point","IL","40.990965","-88.88278","-6","1"
+"61334","Lostant","IL","41.144329","-89.08815","-6","1"
+"61335","McNabb","IL","41.168946","-89.2205","-6","1"
+"61336","Magnolia","IL","41.111077","-89.21207","-6","1"
+"61337","Malden","IL","41.427282","-89.36622","-6","1"
+"61338","Manlius","IL","41.4547","-89.66966","-6","1"
+"61340","Mark","IL","41.265597","-89.25106","-6","1"
+"61341","Marseilles","IL","41.336202","-88.69727","-6","1"
+"61342","Mendota","IL","41.543149","-89.10696","-6","1"
+"61344","Mineral","IL","41.394429","-89.84111","-6","1"
+"61345","Neponset","IL","41.280262","-89.79442","-6","1"
+"61346","New Bedford","IL","41.513879","-89.71842","-6","1"
+"61348","Oglesby","IL","41.292401","-89.05943","-6","1"
+"61349","Ohio","IL","41.543342","-89.44078","-6","1"
+"61350","Ottawa","IL","41.35263","-88.84734","-6","1"
+"61353","Paw Paw","IL","41.690735","-88.98815","-6","1"
+"61354","Peru","IL","41.330789","-89.1299","-6","1"
+"61356","Princeton","IL","41.372528","-89.44315","-6","1"
+"61358","Rutland","IL","40.986256","-89.04364","-6","1"
+"61359","Seatonville","IL","41.363772","-89.26975","-6","1"
+"61360","Seneca","IL","41.320345","-88.61017","-6","1"
+"61361","Sheffield","IL","41.400837","-89.74444","-6","1"
+"61362","Spring Valley","IL","41.332908","-89.20847","-6","1"
+"61363","Standard","IL","41.25645","-89.17901","-6","1"
+"61364","Streator","IL","41.129482","-88.83666","-6","1"
+"61367","Sublette","IL","41.638122","-89.26889","-6","1"
+"61368","Tiskilwa","IL","41.279825","-89.50492","-6","1"
+"61369","Toluca","IL","40.992084","-89.15231","-6","1"
+"61370","Tonica","IL","41.21076","-89.03886","-6","1"
+"61371","Triumph","IL","41.499089","-89.021881","-6","1"
+"61372","Troy Grove","IL","41.466102","-89.07794","-6","1"
+"61373","Utica","IL","41.37061","-89.0149","-6","1"
+"61374","Van Orin","IL","41.543813","-89.35449","-6","1"
+"61375","Varna","IL","41.037822","-89.25682","-6","1"
+"61376","Walnut","IL","41.546706","-89.60081","-6","1"
+"61377","Wenona","IL","41.057649","-89.04788","-6","1"
+"61378","West Brooklyn","IL","41.722744","-89.15601","-6","1"
+"61379","Wyanet","IL","41.369056","-89.60321","-6","1"
+"61401","Galesburg","IL","40.948073","-90.36871","-6","1"
+"61402","Galesburg","IL","40.932207","-90.214412","-6","1"
+"61410","Abingdon","IL","40.802633","-90.39766","-6","1"
+"61411","Adair","IL","40.401282","-90.50153","-6","1"
+"61412","Alexis","IL","41.067549","-90.57994","-6","1"
+"61413","Alpha","IL","41.189123","-90.36813","-6","1"
+"61414","Altona","IL","41.117342","-90.16063","-6","1"
+"61415","Avon","IL","40.661165","-90.43908","-6","1"
+"61416","Bardolph","IL","40.496817","-90.56334","-6","1"
+"61417","Berwick","IL","40.781504","-90.52901","-6","1"
+"61418","Biggsville","IL","40.854865","-90.85925","-6","1"
+"61419","Bishop Hill","IL","41.200711","-90.11832","-6","1"
+"61420","Blandinsville","IL","40.555678","-90.87087","-6","1"
+"61421","Bradford","IL","41.174037","-89.65849","-6","1"
+"61422","Bushnell","IL","40.550883","-90.51766","-6","1"
+"61423","Cameron","IL","40.889288","-90.50529","-6","1"
+"61424","Camp Grove","IL","41.073398","-89.63015","-6","1"
+"61425","Carman","IL","40.778519","-91.05902","-6","1"
+"61426","Castleton","IL","41.118359","-89.70575","-6","1"
+"61427","Cuba","IL","40.499297","-90.17764","-6","1"
+"61428","Dahinda","IL","40.952695","-90.12141","-6","1"
+"61430","East Galesburg","IL","40.94399","-90.31205","-6","1"
+"61431","Ellisville","IL","40.617275","-90.29556","-6","1"
+"61432","Fairview","IL","40.642927","-90.17174","-6","1"
+"61433","Fiatt","IL","40.449305","-90.161761","-6","1"
+"61434","Galva","IL","41.172197","-90.03901","-6","1"
+"61435","Gerlaw","IL","40.972589","-90.54835","-6","1"
+"61436","Gilson","IL","40.859964","-90.22212","-6","1"
+"61437","Gladstone","IL","40.854247","-90.96542","-6","1"
+"61438","Good Hope","IL","40.579737","-90.64691","-6","1"
+"61439","Henderson","IL","41.02572","-90.35566","-6","1"
+"61440","Industry","IL","40.324365","-90.60351","-6","1"
+"61441","Ipava","IL","40.337555","-90.30458","-6","1"
+"61442","Keithsburg","IL","41.092081","-90.92743","-6","1"
+"61443","Kewanee","IL","41.247536","-89.92848","-6","1"
+"61447","Kirkwood","IL","40.867285","-90.75759","-6","1"
+"61448","Knoxville","IL","40.910079","-90.27171","-6","1"
+"61449","La Fayette","IL","41.098764","-89.97361","-6","1"
+"61450","La Harpe","IL","40.567399","-90.97066","-6","1"
+"61451","Laura","IL","40.953365","-89.94259","-6","1"
+"61452","Littleton","IL","40.249363","-90.66845","-6","1"
+"61453","Little York","IL","41.010666","-90.75393","-6","1"
+"61454","Lomax","IL","40.685436","-91.05207","-6","1"
+"61455","Macomb","IL","40.456986","-90.6681","-6","1"
+"61457","Lee","IL","40.553989","-90.355505","-6","1"
+"61458","Maquon","IL","40.776079","-90.1938","-6","1"
+"61459","Marietta","IL","40.503305","-90.41808","-6","1"
+"61460","Media","IL","40.734056","-90.82654","-6","1"
+"61462","Monmouth","IL","40.918849","-90.64466","-6","1"
+"61465","New Windsor","IL","41.200936","-90.45631","-6","1"
+"61466","North Henderson","IL","41.100353","-90.46726","-6","1"
+"61467","Oneida","IL","41.069414","-90.24177","-6","1"
+"61468","Opheim","IL","41.254936","-90.40384","-6","1"
+"61469","Oquawka","IL","40.957929","-90.93608","-6","1"
+"61470","Prairie City","IL","40.614899","-90.47345","-6","1"
+"61471","Raritan","IL","40.696535","-90.82607","-6","1"
+"61472","Rio","IL","41.105401","-90.38717","-6","1"
+"61473","Roseville","IL","40.70595","-90.65724","-6","1"
+"61474","Saint Augustine","IL","40.740729","-90.37946","-6","1"
+"61475","Sciota","IL","40.581413","-90.7612","-6","1"
+"61476","Seaton","IL","41.095037","-90.80998","-6","1"
+"61477","Smithfield","IL","40.500643","-90.31576","-6","1"
+"61478","Smithshire","IL","40.777241","-90.76454","-6","1"
+"61479","Speer","IL","40.999497","-89.65429","-6","1"
+"61480","Stronghurst","IL","40.727428","-90.91347","-6","1"
+"61482","Table Grove","IL","40.368358","-90.42469","-6","1"
+"61483","Toulon","IL","41.09638","-89.86649","-6","1"
+"61484","Vermont","IL","40.292388","-90.42833","-6","1"
+"61485","Victoria","IL","41.025484","-90.08422","-6","1"
+"61486","Viola","IL","41.195087","-90.57923","-6","1"
+"61488","Wataga","IL","41.030951","-90.29705","-6","1"
+"61489","Williamsfield","IL","40.929497","-90.01888","-6","1"
+"61490","Woodhull","IL","41.183299","-90.27637","-6","1"
+"61491","Wyoming","IL","41.068691","-89.76033","-6","1"
+"61501","Astoria","IL","40.234249","-90.32941","-6","1"
+"61516","Benson","IL","40.850381","-89.11878","-6","1"
+"61517","Brimfield","IL","40.816162","-89.84131","-6","1"
+"61518","Brimfield","IL","40.744179","-89.718401","-6","1"
+"61519","Bryant","IL","40.466397","-90.09632","-6","1"
+"61520","Canton","IL","40.552853","-90.02794","-6","1"
+"61523","Chillicothe","IL","40.914377","-89.50654","-6","1"
+"61524","Dunfermline","IL","40.490965","-90.03285","-6","1"
+"61525","Dunlap","IL","40.849036","-89.65554","-6","1"
+"61526","Edelstein","IL","40.936244","-89.62","-6","1"
+"61528","Edwards","IL","40.776845","-89.7401","-6","1"
+"61529","Elmwood","IL","40.780415","-89.95565","-6","1"
+"61530","Eureka","IL","40.718228","-89.27153","-6","1"
+"61531","Farmington","IL","40.68847","-90.02166","-6","1"
+"61532","Forest City","IL","40.35756","-89.82389","-6","1"
+"61533","Glasford","IL","40.577778","-89.8297","-6","1"
+"61534","Green Valley","IL","40.40943","-89.65687","-6","1"
+"61535","Groveland","IL","40.590353","-89.54053","-6","1"
+"61536","Hanna City","IL","40.690205","-89.78042","-6","1"
+"61537","Henry","IL","41.113829","-89.38486","-6","1"
+"61539","Kingston Mines","IL","40.558329","-89.76891","-6","1"
+"61540","Lacon","IL","41.030697","-89.38586","-6","1"
+"61541","La Rose","IL","40.975736","-89.23943","-6","1"
+"61542","Lewistown","IL","40.39309","-90.13748","-6","1"
+"61543","Liverpool","IL","40.392048","-89.99885","-6","1"
+"61544","London Mills","IL","40.688615","-90.24422","-6","1"
+"61545","Lowpoint","IL","40.873236","-89.37082","-6","1"
+"61546","Manito","IL","40.442037","-89.78797","-6","1"
+"61547","Mapleton","IL","40.619174","-89.72628","-6","1"
+"61548","Metamora","IL","40.784412","-89.40841","-6","1"
+"61550","Morton","IL","40.613788","-89.46031","-6","1"
+"61552","Mossville","IL","40.817587","-89.56654","-6","1"
+"61553","Norris","IL","40.449305","-90.161761","-6","1"
+"61554","Pekin","IL","40.567088","-89.63382","-6","1"
+"61555","Pekin","IL","40.56071","-89.650232","-6","1"
+"61558","Pekin","IL","40.554538","-89.609951","-6","1"
+"61559","Princeville","IL","40.935608","-89.76802","-6","1"
+"61560","Putnam","IL","41.198061","-89.43131","-6","1"
+"61561","Roanoke","IL","40.795911","-89.19419","-6","1"
+"61562","Rome","IL","40.874269","-89.506695","-6","1"
+"61563","Saint David","IL","40.489747","-90.05501","-6","1"
+"61564","South Pekin","IL","40.49271","-89.65194","-6","1"
+"61565","Sparland","IL","41.036199","-89.48336","-6","1"
+"61567","Topeka","IL","40.340202","-89.90929","-6","1"
+"61568","Tremont","IL","40.513656","-89.47408","-6","1"
+"61569","Trivoli","IL","40.691022","-89.89138","-6","1"
+"61570","Washburn","IL","40.920631","-89.29547","-6","1"
+"61571","Washington","IL","40.701037","-89.44294","-6","1"
+"61572","Yates City","IL","40.796752","-90.02866","-6","1"
+"61576","Richland","IL","40.928331","-89.348163","-6","1"
+"61584","Vermont","IL","40.288318","-90.429294","-6","1"
+"61593","Garrett","IL","39.809913","-88.343237","-6","1"
+"61601","Peoria","IL","40.693137","-89.589847","-6","1"
+"61602","Peoria","IL","40.677987","-89.60864","-6","1"
+"61603","Peoria","IL","40.712887","-89.57904","-6","1"
+"61604","Peoria","IL","40.709237","-89.63633","-6","1"
+"61605","Peoria","IL","40.678037","-89.62737","-6","1"
+"61606","Peoria","IL","40.699137","-89.60972","-6","1"
+"61607","Peoria","IL","40.642049","-89.67147","-6","1"
+"61610","Creve Coeur","IL","40.643846","-89.59908","-6","1"
+"61611","East Peoria","IL","40.683387","-89.54493","-6","1"
+"61612","Peoria","IL","40.744179","-89.718401","-6","1"
+"61613","Peoria","IL","40.742537","-89.627948","-6","1"
+"61614","Peoria","IL","40.755343","-89.59799","-6","1"
+"61615","Peoria","IL","40.764368","-89.6448","-6","1"
+"61616","Peoria","IL","40.743266","-89.576628","-6","1"
+"61625","Peoria","IL","40.696287","-89.616648","-6","1"
+"61628","Peoria","IL","40.744179","-89.718401","-6","1"
+"61629","Peoria","IL","40.692037","-89.588747","-6","1"
+"61630","Peoria","IL","40.744179","-89.718401","-6","1"
+"61632","Peoria","IL","40.765301","-89.569207","-6","1"
+"61633","Peoria","IL","40.731165","-89.603081","-6","1"
+"61634","Peoria","IL","40.689637","-89.592597","-6","1"
+"61635","Peoria","IL","40.744179","-89.718401","-6","1"
+"61636","Peoria","IL","40.699937","-89.595147","-6","1"
+"61637","Peoria","IL","40.702487","-89.589797","-6","1"
+"61638","Peoria","IL","40.796887","-89.611146","-6","1"
+"61639","Peoria","IL","40.709837","-89.563646","-6","1"
+"61640","Peoria","IL","40.785653","-89.617657","-6","1"
+"61641","Peoria","IL","40.640002","-89.651987","-6","1"
+"61643","Peoria","IL","40.744179","-89.718401","-6","1"
+"61644","Peoria","IL","40.765301","-89.569207","-6","1"
+"61650","Peoria","IL","40.744179","-89.718401","-6","1"
+"61651","Peoria","IL","40.744179","-89.718401","-6","1"
+"61652","Peoria","IL","40.87671","-89.509113","-6","1"
+"61653","Peoria","IL","40.744179","-89.718401","-6","1"
+"61654","Peoria","IL","40.744179","-89.718401","-6","1"
+"61655","Peoria","IL","40.744179","-89.718401","-6","1"
+"61656","Peoria","IL","40.744179","-89.718401","-6","1"
+"61675","Carlock","IL","40.582108","-89.128871","-6","1"
+"61701","Bloomington","IL","40.477286","-88.99592","-6","1"
+"61702","Bloomington","IL","40.519236","-88.864303","-6","1"
+"61704","Bloomington","IL","40.459584","-88.96939","-6","1"
+"61709","Bloomington","IL","40.461431","-88.953015","-6","1"
+"61710","Bloomington","IL","40.477735","-88.954174","-6","1"
+"61720","Anchor","IL","40.553838","-88.5101","-6","1"
+"61721","Armington","IL","40.341123","-89.32028","-6","1"
+"61722","Arrowsmith","IL","40.434885","-88.62237","-6","1"
+"61723","Atlanta","IL","40.256893","-89.25013","-6","1"
+"61724","Bellflower","IL","40.336763","-88.52604","-6","1"
+"61725","Carlock","IL","40.600045","-89.13627","-6","1"
+"61726","Chenoa","IL","40.740106","-88.70948","-6","1"
+"61727","Clinton","IL","40.145501","-88.96776","-6","1"
+"61728","Colfax","IL","40.56944","-88.62727","-6","1"
+"61729","Congerville","IL","40.619306","-89.22353","-6","1"
+"61730","Cooksville","IL","40.537652","-88.73274","-6","1"
+"61731","Cropsey","IL","40.607615","-88.49","-6","1"
+"61732","Danvers","IL","40.528515","-89.19057","-6","1"
+"61733","Deer Creek","IL","40.615875","-89.32778","-6","1"
+"61734","Delavan","IL","40.369256","-89.54251","-6","1"
+"61735","Dewitt","IL","40.193547","-88.79575","-6","1"
+"61736","Downs","IL","40.395487","-88.8498","-6","1"
+"61737","Ellsworth","IL","40.450325","-88.72052","-6","1"
+"61738","El Paso","IL","40.731662","-89.03978","-6","1"
+"61739","Fairbury","IL","40.741158","-88.51546","-6","1"
+"61740","Flanagan","IL","40.882858","-88.85739","-6","1"
+"61741","Forrest","IL","40.756972","-88.40479","-6","1"
+"61742","Goodfield","IL","40.628105","-89.28004","-6","1"
+"61743","Graymont","IL","40.877451","-88.7778","-6","1"
+"61744","Gridley","IL","40.740729","-88.88791","-6","1"
+"61745","Heyworth","IL","40.32122","-88.97442","-6","1"
+"61747","Hopedale","IL","40.422027","-89.42614","-6","1"
+"61748","Hudson","IL","40.627948","-88.97711","-6","1"
+"61749","Kenney","IL","40.091729","-89.10358","-6","1"
+"61750","Lane","IL","40.122884","-88.85664","-6","1"
+"61751","Lawndale","IL","40.21927","-89.285172","-6","1"
+"61752","Le Roy","IL","40.345004","-88.75786","-6","1"
+"61753","Lexington","IL","40.63872","-88.7923","-6","1"
+"61754","McLean","IL","40.321811","-89.15864","-6","1"
+"61755","Mackinaw","IL","40.533634","-89.34345","-6","1"
+"61756","Maroa","IL","40.027071","-88.96715","-6","1"
+"61758","Merna","IL","40.52835","-88.84075","-6","1"
+"61759","Minier","IL","40.431577","-89.32013","-6","1"
+"61760","Minonk","IL","40.893593","-89.03266","-6","1"
+"61761","Normal","IL","40.515485","-88.98629","-6","1"
+"61764","Pontiac","IL","40.884053","-88.63376","-6","1"
+"61766","Towanda","IL","40.564323","-88.898663","-6","1"
+"61769","Saunemin","IL","40.885397","-88.39957","-6","1"
+"61770","Saybrook","IL","40.430727","-88.52548","-6","1"
+"61771","Secor","IL","40.738973","-89.13579","-6","1"
+"61772","Shirley","IL","40.399689","-89.06088","-6","1"
+"61773","Sibley","IL","40.584937","-88.38028","-6","1"
+"61774","Stanford","IL","40.426186","-89.2107","-6","1"
+"61775","Strawn","IL","40.653799","-88.39026","-6","1"
+"61776","Towanda","IL","40.574936","-88.88696","-6","1"
+"61777","Wapella","IL","40.240627","-88.96635","-6","1"
+"61778","Waynesville","IL","40.242378","-89.1087","-6","1"
+"61790","Normal","IL","40.51032","-88.99803","-6","1"
+"61791","Bloomington","IL","40.519236","-88.864303","-6","1"
+"61799","Bloomington","IL","40.488468","-88.939637","-6","1"
+"61801","Urbana","IL","40.109647","-88.21246","-6","1"
+"61802","Urbana","IL","40.121648","-88.17649","-6","1"
+"61803","Urbana","IL","40.10593","-88.224669","-6","1"
+"61810","Allerton","IL","39.909736","-87.93384","-6","1"
+"61811","Alvin","IL","40.293159","-87.61401","-6","1"
+"61812","Armstrong","IL","40.27363","-87.88919","-6","1"
+"61813","Bement","IL","39.918042","-88.56139","-6","1"
+"61814","Bismarck","IL","40.231345","-87.58163","-6","1"
+"61815","Bondville","IL","40.112616","-88.3708","-6","1"
+"61816","Broadlands","IL","39.91613","-88.00203","-6","1"
+"61817","Catlin","IL","40.059068","-87.70376","-6","1"
+"61818","Cerro Gordo","IL","39.889596","-88.72633","-6","1"
+"61819","Bryant","IL","40.466273","-90.095368","-6","1"
+"61820","Champaign","IL","40.114931","-88.24322","-6","1"
+"61821","Champaign","IL","40.108631","-88.2733","-6","1"
+"61822","Champaign","IL","40.126854","-88.29315","-6","1"
+"61824","Champaign","IL","40.139946","-88.196102","-6","1"
+"61825","Champaign","IL","40.139946","-88.196102","-6","1"
+"61826","Champaign","IL","40.113139","-88.361251","-6","1"
+"61830","Cisco","IL","40.020978","-88.72247","-6","1"
+"61831","Collison","IL","40.2159","-87.78418","-6","1"
+"61832","Danville","IL","40.133786","-87.62898","-6","1"
+"61833","Tilton","IL","40.096186","-87.64569","-6","1"
+"61834","Danville","IL","40.175463","-87.6124","-6","1"
+"61839","De Land","IL","40.139336","-88.62966","-6","1"
+"61840","Dewey","IL","40.310244","-88.30526","-6","1"
+"61841","Fairmount","IL","40.039632","-87.83052","-6","1"
+"61842","Farmer City","IL","40.251945","-88.65279","-6","1"
+"61843","Fisher","IL","40.313921","-88.3742","-6","1"
+"61844","Fithian","IL","40.126299","-87.86871","-6","1"
+"61845","Foosland","IL","40.376141","-88.4135","-6","1"
+"61846","Georgetown","IL","39.97412","-87.63138","-6","1"
+"61847","Gifford","IL","40.310063","-88.01922","-6","1"
+"61848","Henning","IL","40.306282","-87.70192","-6","1"
+"61849","Homer","IL","40.028716","-87.9576","-6","1"
+"61850","Indianola","IL","39.92804","-87.73629","-6","1"
+"61851","Ivesdale","IL","39.950391","-88.43939","-6","1"
+"61852","Longview","IL","39.901988","-88.07537","-6","1"
+"61853","Mahomet","IL","40.205916","-88.40295","-6","1"
+"61854","Mansfield","IL","40.213607","-88.5296","-6","1"
+"61855","Milmine","IL","39.919693","-88.67859","-6","1"
+"61856","Monticello","IL","40.0334","-88.57375","-6","1"
+"61857","Muncie","IL","40.11594","-87.84208","-6","1"
+"61858","Oakwood","IL","40.121098","-87.74657","-6","1"
+"61859","Ogden","IL","40.149486","-87.96347","-6","1"
+"61862","Penfield","IL","40.296282","-87.95553","-6","1"
+"61863","Pesotum","IL","39.907919","-88.27977","-6","1"
+"61864","Philo","IL","39.989282","-88.15174","-6","1"
+"61865","Potomac","IL","40.306774","-87.80716","-6","1"
+"61866","Rantoul","IL","40.307065","-88.15575","-6","1"
+"61870","Ridge Farm","IL","39.90241","-87.62722","-6","1"
+"61871","Royal","IL","40.192015","-87.97138","-6","1"
+"61872","Sadorus","IL","39.945328","-88.36389","-6","1"
+"61873","Saint Joseph","IL","40.124202","-88.03401","-6","1"
+"61874","Savoy","IL","40.061694","-88.25023","-6","1"
+"61875","Seymour","IL","40.107548","-88.42487","-6","1"
+"61876","Sidell","IL","39.907331","-87.82587","-6","1"
+"61877","Sidney","IL","40.004053","-88.07693","-6","1"
+"61878","Thomasboro","IL","40.243692","-88.17296","-6","1"
+"61880","Tolono","IL","39.981936","-88.2532","-6","1"
+"61882","Weldon","IL","40.119483","-88.75367","-6","1"
+"61883","Westville","IL","40.040115","-87.63685","-6","1"
+"61884","White Heath","IL","40.10311","-88.49744","-6","1"
+"61901","Bloomington","IL","40.810131","-88.477739","-6","1"
+"61910","Arcola","IL","39.676634","-88.30284","-6","1"
+"61911","Arthur","IL","39.704391","-88.45985","-6","1"
+"61912","Ashmore","IL","39.529566","-88.03349","-6","1"
+"61913","Atwood","IL","39.809929","-88.45309","-6","1"
+"61914","Bethany","IL","39.639487","-88.74383","-6","1"
+"61917","Brocton","IL","39.706131","-87.91691","-6","1"
+"61919","Camargo","IL","39.783794","-88.13861","-6","1"
+"61920","Charleston","IL","39.496547","-88.17348","-6","1"
+"61924","Chrisman","IL","39.786334","-87.66325","-6","1"
+"61925","Dalton City","IL","39.719012","-88.82227","-6","1"
+"61928","Gays","IL","39.45274","-88.5144","-6","1"
+"61929","Hammond","IL","39.806718","-88.6087","-6","1"
+"61930","Hindsboro","IL","39.685822","-88.11971","-6","1"
+"61931","Humboldt","IL","39.59477","-88.34792","-6","1"
+"61932","Hume","IL","39.797661","-87.87017","-6","1"
+"61933","Kansas","IL","39.556054","-87.92289","-6","1"
+"61936","La Place","IL","39.800512","-88.71835","-6","1"
+"61937","Lovington","IL","39.724744","-88.62995","-6","1"
+"61938","Mattoon","IL","39.474889","-88.37421","-6","1"
+"61940","Metcalf","IL","39.805101","-87.81014","-6","1"
+"61941","Murdock","IL","39.801562","-88.07823","-6","1"
+"61942","Newman","IL","39.802798","-87.99744","-6","1"
+"61943","Oakland","IL","39.655063","-88.01806","-6","1"
+"61944","Paris","IL","39.608494","-87.69958","-6","1"
+"61949","Redmon","IL","39.646359","-87.86014","-6","1"
+"61951","Sullivan","IL","39.582494","-88.6021","-6","1"
+"61953","Tuscola","IL","39.793493","-88.29184","-6","1"
+"61955","Vermilion","IL","39.679882","-87.750216","-6","1"
+"61956","Villa Grove","IL","39.858506","-88.15018","-6","1"
+"61957","Windsor","IL","39.434148","-88.60033","-6","1"
+"62001","Alhambra","IL","38.884434","-89.74886","-6","1"
+"62002","Alton","IL","38.906065","-90.15909","-6","1"
+"62003","Medora","IL","39.177478","-90.142329","-6","1"
+"62006","Batchtown","IL","39.079147","-90.67372","-6","1"
+"62009","Benld","IL","39.092526","-89.8029","-6","1"
+"62010","Bethalto","IL","38.912297","-90.043","-6","1"
+"62011","Bingham","IL","39.11204","-89.2134","-6","1"
+"62012","Brighton","IL","39.038752","-90.13819","-6","1"
+"62013","Brussels","IL","38.968323","-90.58121","-6","1"
+"62014","Bunker Hill","IL","39.039382","-89.94935","-6","1"
+"62015","Butler","IL","39.212833","-89.55969","-6","1"
+"62016","Carrollton","IL","39.301561","-90.41674","-6","1"
+"62017","Coffeen","IL","39.081889","-89.37787","-6","1"
+"62018","Cottage Hills","IL","38.905998","-90.08306","-6","1"
+"62019","Donnellson","IL","39.017877","-89.46415","-6","1"
+"62021","Dorsey","IL","38.976011","-89.97461","-6","1"
+"62022","Dow","IL","38.997296","-90.3405","-6","1"
+"62023","Eagarville","IL","39.110422","-89.78428","-6","1"
+"62024","East Alton","IL","38.868136","-90.08023","-6","1"
+"62025","Edwardsville","IL","38.819297","-89.9551","-6","1"
+"62026","Edwardsville","IL","38.733748","-89.94305","-6","1"
+"62027","Eldred","IL","39.241734","-90.54614","-6","1"
+"62028","Elsah","IL","38.958848","-90.35383","-6","1"
+"62030","Fidelity","IL","39.155608","-90.1649","-6","1"
+"62031","Fieldon","IL","39.103735","-90.54252","-6","1"
+"62032","Fillmore","IL","39.114972","-89.28092","-6","1"
+"62033","Gillespie","IL","39.127717","-89.8288","-6","1"
+"62034","Glen Carbon","IL","38.75592","-89.97442","-6","1"
+"62035","Godfrey","IL","38.947841","-90.2216","-6","1"
+"62036","Golden Eagle","IL","38.91384","-90.57421","-6","1"
+"62037","Grafton","IL","38.985138","-90.44563","-6","1"
+"62040","Granite City","IL","38.720938","-90.11431","-6","1"
+"62043","Brushy Mound","IL","39.213822","-89.82872","-6","1"
+"62044","Greenfield","IL","39.362285","-90.22147","-6","1"
+"62045","Hamburg","IL","39.236358","-90.71359","-6","1"
+"62046","Hamel","IL","38.889879","-89.84638","-6","1"
+"62047","Hardin","IL","39.128014","-90.6159","-6","1"
+"62048","Hartford","IL","38.833898","-90.09533","-6","1"
+"62049","Hillsboro","IL","39.146809","-89.48442","-6","1"
+"62050","Hillview","IL","39.430595","-90.54502","-6","1"
+"62051","Irving","IL","39.205747","-89.40909","-6","1"
+"62052","Jerseyville","IL","39.114762","-90.32442","-6","1"
+"62053","Kampsville","IL","39.322422","-90.64246","-6","1"
+"62054","Kane","IL","39.192501","-90.34541","-6","1"
+"62056","Litchfield","IL","39.179875","-89.65721","-6","1"
+"62058","Livingston","IL","38.967324","-89.76133","-6","1"
+"62059","Lovejoy","IL","38.6565","-90.16643","-6","1"
+"62060","Madison","IL","38.6807","-90.15411","-6","1"
+"62061","Marine","IL","38.78956","-89.77538","-6","1"
+"62062","Maryville","IL","38.726548","-89.9572","-6","1"
+"62063","Medora","IL","39.188838","-90.14654","-6","1"
+"62065","Michael","IL","39.235652","-90.62842","-6","1"
+"62067","Moro","IL","38.91973","-90.01241","-6","1"
+"62069","Mount Olive","IL","39.077557","-89.73423","-6","1"
+"62070","Mozier","IL","39.328077","-90.76896","-6","1"
+"62071","National Stock Yards","IL","38.6516","-90.163909","-6","1"
+"62074","New Douglas","IL","38.964162","-89.68226","-6","1"
+"62075","Nokomis","IL","39.299771","-89.2864","-6","1"
+"62076","Ohlman","IL","39.261791","-89.421584","-6","1"
+"62077","Panama","IL","39.031623","-89.5228","-6","1"
+"62078","Patterson","IL","39.477337","-90.48002","-6","1"
+"62079","Piasa","IL","39.115848","-90.13336","-6","1"
+"62080","Ramsey","IL","39.136284","-89.10348","-6","1"
+"62081","Rockbridge","IL","39.261499","-90.23039","-6","1"
+"62082","Roodhouse","IL","39.481469","-90.33999","-6","1"
+"62083","Rosamond","IL","39.354674","-89.19993","-6","1"
+"62084","Roxana","IL","38.8494","-90.08536","-6","1"
+"62085","Sawyerville","IL","39.078047","-89.80626","-6","1"
+"62086","Sorento","IL","38.996375","-89.57044","-6","1"
+"62087","South Roxana","IL","38.828347","-90.05894","-6","1"
+"62088","Staunton","IL","39.011612","-89.78855","-6","1"
+"62089","Taylor Springs","IL","39.130404","-89.49298","-6","1"
+"62090","Venice","IL","38.67065","-90.17052","-6","1"
+"62091","Walshville","IL","39.053344","-89.59324","-6","1"
+"62092","White Hall","IL","39.433041","-90.40655","-6","1"
+"62093","Wilsonville","IL","39.068901","-89.85425","-6","1"
+"62094","Witt","IL","39.249272","-89.35236","-6","1"
+"62095","Wood River","IL","38.860447","-90.09418","-6","1"
+"62097","Worden","IL","38.932347","-89.84608","-6","1"
+"62098","Wrights","IL","39.376153","-90.293302","-6","1"
+"62201","East Saint Louis","IL","38.62855","-90.14609","-6","1"
+"62202","East Saint Louis","IL","38.6163","-90.159059","-6","1"
+"62203","East Saint Louis","IL","38.598175","-90.07575","-6","1"
+"62204","East Saint Louis","IL","38.631383","-90.10008","-6","1"
+"62205","East Saint Louis","IL","38.6151","-90.12675","-6","1"
+"62206","East Saint Louis","IL","38.564451","-90.1628","-6","1"
+"62207","East Saint Louis","IL","38.59035","-90.13276","-6","1"
+"62208","Fairview Heights","IL","38.596199","-90.00227","-6","1"
+"62214","Addieville","IL","38.377193","-89.55998","-6","1"
+"62215","Albers","IL","38.517125","-89.60258","-6","1"
+"62216","Aviston","IL","38.607817","-89.60516","-6","1"
+"62217","Baldwin","IL","38.178395","-89.84183","-6","1"
+"62218","Bartelso","IL","38.535097","-89.46426","-6","1"
+"62219","Beckemeyer","IL","38.605187","-89.43404","-6","1"
+"62220","Belleville","IL","38.50046","-89.97654","-6","1"
+"62221","Belleville","IL","38.532311","-89.93996","-6","1"
+"62222","Belleville","IL","38.439983","-89.983521","-6","1"
+"62223","Belleville","IL","38.55615","-90.05078","-6","1"
+"62224","Mascoutah","IL","38.439983","-89.983521","-6","1"
+"62225","Scott Air Force Base","IL","38.544298","-89.85054","-6","1"
+"62226","Belleville","IL","38.53895","-90.00104","-6","1"
+"62230","Breese","IL","38.620018","-89.5305","-6","1"
+"62231","Carlyle","IL","38.623384","-89.36368","-6","1"
+"62232","Caseyville","IL","38.636749","-90.01763","-6","1"
+"62233","Chester","IL","37.921816","-89.82842","-6","1"
+"62234","Collinsville","IL","38.679282","-89.99407","-6","1"
+"62236","Columbia","IL","38.442906","-90.20775","-6","1"
+"62237","Coulterville","IL","38.188624","-89.59789","-6","1"
+"62238","Cutler","IL","38.034281","-89.54537","-6","1"
+"62239","Dupo","IL","38.526792","-90.19253","-6","1"
+"62240","East Carondelet","IL","38.535325","-90.21617","-6","1"
+"62241","Ellis Grove","IL","38.011729","-89.89007","-6","1"
+"62242","Evansville","IL","38.092615","-89.93485","-6","1"
+"62243","Freeburg","IL","38.425949","-89.90389","-6","1"
+"62244","Fults","IL","38.200113","-90.2272","-6","1"
+"62245","Germantown","IL","38.554515","-89.5631","-6","1"
+"62246","Greenville","IL","38.889355","-89.40987","-6","1"
+"62247","Hagarstown","IL","38.977111","-88.975507","-6","1"
+"62248","Hecker","IL","38.299507","-89.961825","-6","1"
+"62249","Highland","IL","38.752017","-89.67478","-6","1"
+"62250","Hoffman","IL","38.540238","-89.26294","-6","1"
+"62252","Huey","IL","38.601768","-89.291549","-6","1"
+"62253","Keyesport","IL","38.761214","-89.29128","-6","1"
+"62254","Lebanon","IL","38.601648","-89.81317","-6","1"
+"62255","Lenzburg","IL","38.303147","-89.79161","-6","1"
+"62256","Maeystown","IL","38.30426","-90.135645","-6","1"
+"62257","Marissa","IL","38.260108","-89.73627","-6","1"
+"62258","Mascoutah","IL","38.481674","-89.79432","-6","1"
+"62259","Menard","IL","38.013132","-89.899569","-6","1"
+"62260","Millstadt","IL","38.463718","-90.09831","-6","1"
+"62261","Modoc","IL","37.988745","-90.00785","-6","1"
+"62262","Mulberry Grove","IL","38.931719","-89.27132","-6","1"
+"62263","Nashville","IL","38.346578","-89.38453","-6","1"
+"62264","New Athens","IL","38.318253","-89.88852","-6","1"
+"62265","New Baden","IL","38.520285","-89.6807","-6","1"
+"62266","New Memphis","IL","38.478","-89.67869","-6","1"
+"62268","Oakdale","IL","38.271313","-89.51773","-6","1"
+"62269","O Fallon","IL","38.589849","-89.91207","-6","1"
+"62270","Dupo","IL","38.227604","-89.650381","-6","1"
+"62271","Okawville","IL","38.439574","-89.5286","-6","1"
+"62272","Percy","IL","38.006386","-89.61645","-6","1"
+"62273","Pierron","IL","38.780229","-89.5973","-6","1"
+"62274","Pinckneyville","IL","38.078231","-89.38796","-6","1"
+"62275","Pocahontas","IL","38.812744","-89.54888","-6","1"
+"62277","Prairie Du Rocher","IL","38.095119","-90.09885","-6","1"
+"62278","Red Bud","IL","38.214515","-89.98785","-6","1"
+"62279","Renault","IL","38.153322","-90.13459","-6","1"
+"62280","Rockwood","IL","37.845454","-89.66878","-6","1"
+"62281","Saint Jacob","IL","38.706847","-89.77739","-6","1"
+"62282","Saint Libory","IL","38.363228","-89.713921","-6","1"
+"62283","Shattuc","IL","38.647775","-89.20166","-6","1"
+"62284","Smithboro","IL","38.887748","-89.32248","-6","1"
+"62285","Smithton","IL","38.399148","-89.99604","-6","1"
+"62286","Sparta","IL","38.122112","-89.71168","-6","1"
+"62288","Steeleville","IL","38.002188","-89.66723","-6","1"
+"62289","Summerfield","IL","38.596948","-89.75117","-6","1"
+"62292","Tilden","IL","38.214035","-89.68346","-6","1"
+"62293","Trenton","IL","38.611798","-89.67691","-6","1"
+"62294","Troy","IL","38.725498","-89.88891","-6","1"
+"62295","Valmeyer","IL","38.299904","-90.30833","-6","1"
+"62297","Walsh","IL","38.049616","-89.80775","-6","1"
+"62298","Waterloo","IL","38.325969","-90.14606","-6","1"
+"62301","Quincy","IL","39.929597","-91.37415","-6","1"
+"62305","Quincy","IL","39.96008","-91.302633","-6","1"
+"62306","Quincy","IL","39.97863","-91.21256","-6","1"
+"62310","Adrian","IL","40.416145","-91.205805","-6","1"
+"62311","Augusta","IL","40.223837","-90.93288","-6","1"
+"62312","Barry","IL","39.704649","-91.0368","-6","1"
+"62313","Basco","IL","40.319528","-91.20483","-6","1"
+"62314","Baylis","IL","39.756139","-90.89509","-6","1"
+"62316","Bowen","IL","40.232385","-91.05746","-6","1"
+"62318","Burnside","IL","40.513153","-91.12851","-6","1"
+"62319","Camden","IL","40.147818","-90.74246","-6","1"
+"62320","Camp Point","IL","40.020397","-91.07407","-6","1"
+"62321","Carthage","IL","40.414128","-91.11577","-6","1"
+"62323","Chambersburg","IL","39.817702","-90.66923","-6","1"
+"62324","Clayton","IL","39.988988","-90.94976","-6","1"
+"62325","Coatsburg","IL","40.034398","-91.16278","-6","1"
+"62326","Colchester","IL","40.421857","-90.80333","-6","1"
+"62329","Colusa","IL","40.571353","-91.168221","-6","1"
+"62330","Dallas City","IL","40.630407","-91.15278","-6","1"
+"62334","Elvaston","IL","40.396983","-91.25029","-6","1"
+"62336","Ferris","IL","40.467994","-91.17125","-6","1"
+"62338","Fowler","IL","39.98152","-91.25754","-6","1"
+"62339","Golden","IL","40.112726","-91.02632","-6","1"
+"62340","Griggsville","IL","39.71345","-90.72045","-6","1"
+"62341","Hamilton","IL","40.402015","-91.33182","-6","1"
+"62343","Hull","IL","39.709855","-91.22914","-6","1"
+"62344","Huntsville","IL","40.18275","-90.81819","-6","1"
+"62345","Kinderhook","IL","39.700245","-91.14564","-6","1"
+"62346","La Prairie","IL","40.151799","-90.95426","-6","1"
+"62347","Liberty","IL","39.876235","-91.1106","-6","1"
+"62348","Lima","IL","40.180236","-91.37791","-6","1"
+"62349","Loraine","IL","40.160393","-91.20372","-6","1"
+"62351","Mendon","IL","40.094396","-91.26558","-6","1"
+"62352","Milton","IL","39.563599","-90.64813","-6","1"
+"62353","Mount Sterling","IL","39.983824","-90.74134","-6","1"
+"62354","Nauvoo","IL","40.531825","-91.36598","-6","1"
+"62355","Nebo","IL","39.440654","-90.77809","-6","1"
+"62356","New Canton","IL","39.599949","-91.09115","-6","1"
+"62357","New Salem","IL","39.696523","-90.84253","-6","1"
+"62358","Niota","IL","40.587769","-91.26301","-6","1"
+"62359","Paloma","IL","40.028595","-91.21286","-6","1"
+"62360","Payson","IL","39.813094","-91.25561","-6","1"
+"62361","Pearl","IL","39.469982","-90.63108","-6","1"
+"62362","Perry","IL","39.781349","-90.74617","-6","1"
+"62363","Pittsfield","IL","39.606349","-90.78642","-6","1"
+"62365","Plainville","IL","39.795818","-91.16751","-6","1"
+"62366","Pleasant Hill","IL","39.450931","-90.87779","-6","1"
+"62367","Plymouth","IL","40.304799","-90.88699","-6","1"
+"62370","Rockport","IL","39.510835","-90.99193","-6","1"
+"62373","Sutter","IL","40.240004","-91.35197","-6","1"
+"62374","Tennessee","IL","40.403553","-90.8834","-6","1"
+"62375","Timewell","IL","39.983573","-90.8842","-6","1"
+"62376","Ursa","IL","40.09625","-91.38474","-6","1"
+"62378","Versailles","IL","39.884796","-90.6289","-6","1"
+"62379","Warsaw","IL","40.314446","-91.40638","-6","1"
+"62380","West Point","IL","40.233504","-91.19727","-6","1"
+"62394","Equality","IL","37.726738","-88.372434","-6","1"
+"62401","Effingham","IL","39.123807","-88.56","-6","1"
+"62407","Summit","IL","39.148234","-88.593764","-6","1"
+"62410","Allendale","IL","38.528202","-87.72913","-6","1"
+"62411","Altamont","IL","39.062913","-88.73912","-6","1"
+"62413","Annapolis","IL","39.138761","-87.83769","-6","1"
+"62414","Beecher City","IL","39.167788","-88.8255","-6","1"
+"62415","Birds","IL","38.710336","-87.703639","-6","1"
+"62417","Bridgeport","IL","38.720425","-87.76815","-6","1"
+"62418","Brownstown","IL","39.018987","-88.96134","-6","1"
+"62419","Calhoun","IL","38.625864","-87.99407","-6","1"
+"62420","Casey","IL","39.299447","-87.99863","-6","1"
+"62421","Claremont","IL","38.755492","-87.95334","-6","1"
+"62422","Cowden","IL","39.251624","-88.86505","-6","1"
+"62423","Dennison","IL","39.452478","-87.57092","-6","1"
+"62424","Dieterich","IL","39.01077","-88.428","-6","1"
+"62425","Dundas","IL","38.830182","-88.09218","-6","1"
+"62426","Edgewood","IL","38.913064","-88.66404","-6","1"
+"62427","Flat Rock","IL","38.869453","-87.66502","-6","1"
+"62428","Greenup","IL","39.25287","-88.13528","-6","1"
+"62431","Herrick","IL","39.228594","-88.98873","-6","1"
+"62432","Hidalgo","IL","39.139262","-88.14862","-6","1"
+"62433","Hutsonville","IL","39.113033","-87.67563","-6","1"
+"62434","Ingraham","IL","38.835884","-88.33505","-6","1"
+"62435","Janesville","IL","39.374287","-88.244487","-6","1"
+"62436","Jewett","IL","39.190088","-88.2601","-6","1"
+"62438","Lakewood","IL","39.317235","-88.87876","-6","1"
+"62439","Lawrenceville","IL","38.738226","-87.65984","-6","1"
+"62440","Lerna","IL","39.393267","-88.28118","-6","1"
+"62441","Marshall","IL","39.396463","-87.69589","-6","1"
+"62442","Martinsville","IL","39.32463","-87.86922","-6","1"
+"62443","Mason","IL","38.95232","-88.62883","-6","1"
+"62444","Mode","IL","39.272317","-88.75932","-6","1"
+"62445","Montrose","IL","39.183055","-88.3404","-6","1"
+"62446","Mount Erie","IL","38.48679","-88.21636","-6","1"
+"62447","Neoga","IL","39.32205","-88.45037","-6","1"
+"62448","Newton","IL","38.974018","-88.17881","-6","1"
+"62449","Oblong","IL","39.006483","-87.90005","-6","1"
+"62450","Olney","IL","38.72456","-88.08658","-6","1"
+"62451","Palestine","IL","39.006924","-87.6117","-6","1"
+"62452","Parkersburg","IL","38.588301","-88.03692","-6","1"
+"62454","Robinson","IL","39.004728","-87.7495","-6","1"
+"62458","Saint Elmo","IL","39.042992","-88.87463","-6","1"
+"62459","Sainte Marie","IL","38.93148","-88.0252","-6","1"
+"62460","Saint Francisville","IL","38.596277","-87.65542","-6","1"
+"62461","Shumway","IL","39.194021","-88.6656","-6","1"
+"62462","Sigel","IL","39.223922","-88.47715","-6","1"
+"62463","Stewardson","IL","39.2807","-88.62403","-6","1"
+"62464","Stoy","IL","38.98981","-87.839627","-6","1"
+"62465","Strasburg","IL","39.354837","-88.63491","-6","1"
+"62466","Sumner","IL","38.732726","-87.85152","-6","1"
+"62467","Teutopolis","IL","39.125573","-88.45609","-6","1"
+"62468","Toledo","IL","39.273828","-88.25646","-6","1"
+"62469","Trilla","IL","39.35239","-88.33275","-6","1"
+"62471","Vandalia","IL","38.961799","-89.10978","-6","1"
+"62473","Watson","IL","39.012089","-88.56383","-6","1"
+"62474","Westfield","IL","39.4505","-87.99681","-6","1"
+"62475","West Liberty","IL","38.868463","-88.05466","-6","1"
+"62476","West Salem","IL","38.527107","-88.00583","-6","1"
+"62477","West Union","IL","39.229885","-87.6664","-6","1"
+"62478","West York","IL","39.175832","-87.72312","-6","1"
+"62479","Wheeler","IL","39.038732","-88.31569","-6","1"
+"62480","Willow Hill","IL","38.994595","-88.00464","-6","1"
+"62481","Yale","IL","39.122158","-88.01982","-6","1"
+"62501","Argenta","IL","39.984292","-88.81584","-6","1"
+"62510","Assumption","IL","39.530502","-89.03829","-6","1"
+"62511","Atwater","IL","39.346468","-89.73278","-6","1"
+"62512","Beason","IL","40.139482","-89.2073","-6","1"
+"62513","Blue Mound","IL","39.716269","-89.13269","-6","1"
+"62514","Boody","IL","39.759905","-89.05465","-6","1"
+"62515","Buffalo","IL","39.861289","-89.37836","-6","1"
+"62517","Bulpitt","IL","39.591537","-89.42755","-6","1"
+"62518","Chestnut","IL","40.05232","-89.18832","-6","1"
+"62519","Cornland","IL","39.936817","-89.40159","-6","1"
+"62520","Dawson","IL","39.824457","-89.45643","-6","1"
+"62521","Decatur","IL","39.828586","-88.92907","-6","1"
+"62522","Decatur","IL","39.840482","-89.00569","-6","1"
+"62523","Decatur","IL","39.844086","-88.95327","-6","1"
+"62524","Decatur","IL","39.853981","-88.981511","-6","1"
+"62525","Decatur","IL","39.853981","-88.981511","-6","1"
+"62526","Decatur","IL","39.878041","-88.95637","-6","1"
+"62527","Decatur","IL","39.853981","-88.981511","-6","1"
+"62530","Divernon","IL","39.568077","-89.65467","-6","1"
+"62531","Edinburg","IL","39.66363","-89.39224","-6","1"
+"62532","Elwin","IL","39.777583","-88.97972","-6","1"
+"62533","Farmersville","IL","39.442669","-89.64068","-6","1"
+"62534","Findlay","IL","39.529092","-88.7821","-6","1"
+"62535","Forsyth","IL","39.925806","-88.95928","-6","1"
+"62536","Glenarm","IL","39.642083","-89.65936","-6","1"
+"62537","Harristown","IL","39.867151","-89.11324","-6","1"
+"62538","Harvel","IL","39.359529","-89.52648","-6","1"
+"62539","Illiopolis","IL","39.855984","-89.2487","-6","1"
+"62540","Kincaid","IL","39.58755","-89.41265","-6","1"
+"62541","Lake Fork","IL","39.969864","-89.35051","-6","1"
+"62543","Latham","IL","39.965691","-89.15936","-6","1"
+"62544","Macon","IL","39.693983","-88.98068","-6","1"
+"62545","Mechanicsburg","IL","39.77386","-89.39012","-6","1"
+"62546","Morrisonville","IL","39.430427","-89.44719","-6","1"
+"62547","Mount Auburn","IL","39.771541","-89.24331","-6","1"
+"62548","Mount Pulaski","IL","39.993254","-89.29707","-6","1"
+"62549","Mt Zion","IL","39.777116","-88.87171","-6","1"
+"62550","Moweaqua","IL","39.617542","-89.00559","-6","1"
+"62551","Niantic","IL","39.838505","-89.15191","-6","1"
+"62552","Oakley","IL","39.869841","-88.81261","-6","1"
+"62553","Oconee","IL","39.279357","-89.10462","-6","1"
+"62554","Oreana","IL","39.93706","-88.86332","-6","1"
+"62555","Owaneco","IL","39.476356","-89.21607","-6","1"
+"62556","Palmer","IL","39.465887","-89.39095","-6","1"
+"62557","Pana","IL","39.3928","-89.08194","-6","1"
+"62558","Pawnee","IL","39.580159","-89.54402","-6","1"
+"62560","Raymond","IL","39.312686","-89.59541","-6","1"
+"62561","Riverton","IL","39.85973","-89.52972","-6","1"
+"62563","Rochester","IL","39.71984","-89.51229","-6","1"
+"62565","Shelbyville","IL","39.409126","-88.80153","-6","1"
+"62567","Stonington","IL","39.638951","-89.18982","-6","1"
+"62568","Taylorville","IL","39.548928","-89.29692","-6","1"
+"62570","Tovey","IL","39.588585","-89.44945","-6","1"
+"62571","Tower Hill","IL","39.385344","-88.95588","-6","1"
+"62572","Waggoner","IL","39.370091","-89.67132","-6","1"
+"62573","Warrensburg","IL","39.940934","-89.06707","-6","1"
+"62601","Alexander","IL","39.754308","-90.02786","-6","1"
+"62605","Emden","IL","40.300508","-89.480688","-6","1"
+"62610","Alsey","IL","39.564501","-90.43698","-6","1"
+"62611","Arenzville","IL","39.883346","-90.39332","-6","1"
+"62612","Ashland","IL","39.891861","-90.03125","-6","1"
+"62613","Athens","IL","39.982768","-89.68326","-6","1"
+"62615","Auburn","IL","39.588902","-89.75177","-6","1"
+"62616","Philadelphia","IL","39.852164","-90.143114","-6","1"
+"62617","Bath","IL","40.167991","-90.16313","-6","1"
+"62618","Beardstown","IL","40.005505","-90.42314","-6","1"
+"62621","Bluffs","IL","39.740558","-90.53937","-6","1"
+"62622","Bluff Springs","IL","39.979614","-90.352444","-6","1"
+"62623","Oakford","IL","40.104623","-89.96382","-6","1"
+"62624","Browning","IL","40.153557","-90.35255","-6","1"
+"62625","Cantrall","IL","39.909732","-89.68831","-6","1"
+"62626","Carlinville","IL","39.280289","-89.8757","-6","1"
+"62627","Chandlerville","IL","40.051603","-90.14057","-6","1"
+"62628","Chapin","IL","39.770936","-90.39307","-6","1"
+"62629","Chatham","IL","39.676558","-89.69902","-6","1"
+"62630","Chesterfield","IL","39.260146","-90.06937","-6","1"
+"62631","Concord","IL","39.817322","-90.36618","-6","1"
+"62633","Easton","IL","40.214759","-89.87721","-6","1"
+"62634","Elkhart","IL","40.02489","-89.46592","-6","1"
+"62635","Emden","IL","40.291512","-89.47436","-6","1"
+"62638","Franklin","IL","39.609647","-90.08116","-6","1"
+"62639","Frederick","IL","40.04195","-90.46831","-6","1"
+"62640","Girard","IL","39.436584","-89.8028","-6","1"
+"62642","Greenview","IL","40.087711","-89.72066","-6","1"
+"62643","Hartsburg","IL","40.247835","-89.44123","-6","1"
+"62644","Havana","IL","40.296415","-90.05163","-6","1"
+"62648","Herrin","IL","37.803216","-89.058643","-6","1"
+"62649","Hettick","IL","39.348487","-90.08365","-6","1"
+"62650","Jacksonville","IL","39.730234","-90.22941","-6","1"
+"62651","Jacksonville","IL","39.698311","-90.26153","-6","1"
+"62652","Milton","IL","39.564228","-90.651349","-6","1"
+"62655","Kilbourne","IL","40.147371","-90.00698","-6","1"
+"62656","Lincoln","IL","40.149927","-89.36746","-6","1"
+"62659","Lincoln'S New Salem","IL","40.031115","-89.786723","-6","1"
+"62660","Literberry","IL","39.858933","-90.200747","-6","1"
+"62661","Loami","IL","39.669508","-89.84805","-6","1"
+"62662","Lowder","IL","39.749457","-89.606017","-6","1"
+"62663","Manchester","IL","39.544196","-90.32677","-6","1"
+"62664","Mason City","IL","40.200537","-89.70427","-6","1"
+"62665","Meredosia","IL","39.818631","-90.55791","-6","1"
+"62666","Middletown","IL","40.088774","-89.56744","-6","1"
+"62667","Modesto","IL","39.487357","-89.99143","-6","1"
+"62668","Murrayville","IL","39.576392","-90.24769","-6","1"
+"62670","New Berlin","IL","39.735761","-89.88669","-6","1"
+"62671","New Holland","IL","40.186852","-89.56053","-6","1"
+"62672","Nilwood","IL","39.397248","-89.80769","-6","1"
+"62673","Oakford","IL","40.095009","-89.96998","-6","1"
+"62674","Palmyra","IL","39.429687","-90.01499","-6","1"
+"62675","Petersburg","IL","40.008726","-89.85029","-6","1"
+"62676","Hillyard","IL","39.128248","-89.923215","-6","1"
+"62677","Pleasant Plains","IL","39.847253","-89.88059","-6","1"
+"62681","Rushville","IL","40.134957","-90.55222","-6","1"
+"62682","San Jose","IL","40.29916","-89.60101","-6","1"
+"62683","Scottville","IL","39.260862","-89.926068","-6","1"
+"62684","Sherman","IL","39.901588","-89.58805","-6","1"
+"62685","Shipman","IL","39.14665","-90.00059","-6","1"
+"62686","Standard City","IL","39.350726","-89.78689","-6","1"
+"62688","Tallula","IL","39.944264","-89.93366","-6","1"
+"62689","Thayer","IL","39.539071","-89.761","-6","1"
+"62690","Virden","IL","39.503383","-89.76667","-6","1"
+"62691","Virginia","IL","39.952909","-90.21218","-6","1"
+"62692","Waverly","IL","39.583983","-89.9396","-6","1"
+"62693","Williamsville","IL","39.956803","-89.54209","-6","1"
+"62694","Winchester","IL","39.628929","-90.46107","-6","1"
+"62695","Woodson","IL","39.627307","-90.22101","-6","1"
+"62701","Springfield","IL","39.80095","-89.64999","-6","1"
+"62702","Springfield","IL","39.819","-89.64379","-6","1"
+"62703","Springfield","IL","39.7715","-89.63612","-6","1"
+"62704","Springfield","IL","39.7778","-89.67982","-6","1"
+"62705","Springfield","IL","39.749457","-89.606017","-6","1"
+"62706","Springfield","IL","39.79885","-89.653399","-6","1"
+"62707","Springfield","IL","39.757896","-89.66363","-6","1"
+"62708","Springfield","IL","39.806089","-89.586356","-6","1"
+"62709","Springfield","IL","39.749457","-89.606017","-6","1"
+"62713","Springfield","IL","39.749457","-89.606017","-6","1"
+"62715","Springfield","IL","39.749457","-89.606017","-6","1"
+"62716","Springfield","IL","39.848201","-89.536369","-6","1"
+"62718","Springfield","IL","39.778044","-89.646555","-6","1"
+"62719","Springfield","IL","39.749457","-89.606017","-6","1"
+"62720","Springfield","IL","39.749457","-89.606017","-6","1"
+"62721","Springfield","IL","39.749457","-89.606017","-6","1"
+"62722","Springfield","IL","39.749457","-89.606017","-6","1"
+"62723","Springfield","IL","39.749457","-89.606017","-6","1"
+"62726","Springfield","IL","39.749457","-89.606017","-6","1"
+"62736","Springfield","IL","39.749457","-89.606017","-6","1"
+"62739","Springfield","IL","39.749457","-89.606017","-6","1"
+"62746","Springfield","IL","39.749457","-89.606017","-6","1"
+"62756","Springfield","IL","39.749457","-89.606017","-6","1"
+"62757","Springfield","IL","39.749457","-89.606017","-6","1"
+"62761","Springfield","IL","39.852361","-89.541017","-6","1"
+"62762","Springfield","IL","39.749457","-89.606017","-6","1"
+"62763","Springfield","IL","39.749457","-89.606017","-6","1"
+"62764","Springfield","IL","39.749457","-89.606017","-6","1"
+"62765","Springfield","IL","39.749457","-89.606017","-6","1"
+"62766","Springfield","IL","39.749457","-89.606017","-6","1"
+"62767","Springfield","IL","39.749457","-89.606017","-6","1"
+"62769","Springfield","IL","39.749457","-89.606017","-6","1"
+"62776","Springfield","IL","39.749457","-89.606017","-6","1"
+"62777","Springfield","IL","39.749457","-89.606017","-6","1"
+"62781","Springfield","IL","39.749457","-89.606017","-6","1"
+"62786","Springfield","IL","39.749457","-89.606017","-6","1"
+"62791","Springfield","IL","39.749457","-89.606017","-6","1"
+"62792","Ullin","IL","37.277483","-89.186317","-6","1"
+"62794","Springfield","IL","39.749457","-89.606017","-6","1"
+"62796","Springfield","IL","39.749457","-89.606017","-6","1"
+"62801","Centralia","IL","38.523736","-89.1257","-6","1"
+"62803","Hoyleton","IL","38.460331","-89.30296","-6","1"
+"62805","Akin","IL","37.994296","-88.941665","-6","1"
+"62806","Albion","IL","38.375576","-88.07169","-6","1"
+"62807","Alma","IL","38.735571","-88.91864","-6","1"
+"62808","Ashley","IL","38.319427","-89.19145","-6","1"
+"62809","Barnhill","IL","38.268959","-88.34267","-6","1"
+"62810","Belle Rive","IL","38.218349","-88.73999","-6","1"
+"62811","Bellmont","IL","38.384799","-87.90949","-6","1"
+"62812","Benton","IL","38.000245","-88.92407","-6","1"
+"62814","Bluford","IL","38.362934","-88.72896","-6","1"
+"62815","Bone Gap","IL","38.452172","-87.9939","-6","1"
+"62816","Bonnie","IL","38.192726","-88.93138","-6","1"
+"62817","Broughton","IL","37.954727","-88.47128","-6","1"
+"62818","Browns","IL","38.378706","-87.97291","-6","1"
+"62819","Buckner","IL","37.980455","-89.01261","-6","1"
+"62820","Burnt Prairie","IL","38.247883","-88.22944","-6","1"
+"62821","Carmi","IL","38.087838","-88.15583","-6","1"
+"62822","Christopher","IL","37.973175","-89.05291","-6","1"
+"62823","Cisne","IL","38.51684","-88.43531","-6","1"
+"62824","Clay City","IL","38.689663","-88.35141","-6","1"
+"62825","Coello","IL","37.996241","-89.06852","-6","1"
+"62827","Crossville","IL","38.160972","-88.03291","-6","1"
+"62828","Dahlgren","IL","38.190536","-88.62439","-6","1"
+"62829","Dale","IL","37.999757","-88.50469","-6","1"
+"62830","Dix","IL","38.441538","-88.96888","-6","1"
+"62831","Du Bois","IL","38.22669","-89.20884","-6","1"
+"62832","Du Quoin","IL","38.011729","-89.24688","-6","1"
+"62833","Ellery","IL","38.361654","-88.16484","-6","1"
+"62834","Emma","IL","37.97622","-88.120182","-6","1"
+"62835","Enfield","IL","38.101667","-88.33357","-6","1"
+"62836","Ewing","IL","38.096551","-88.82763","-6","1"
+"62837","Fairfield","IL","38.374627","-88.35735","-6","1"
+"62838","Farina","IL","38.857185","-88.7591","-6","1"
+"62839","Flora","IL","38.667752","-88.48855","-6","1"
+"62840","Frankfort Heights","IL","37.994296","-88.941665","-6","1"
+"62841","Freeman Spur","IL","37.80308","-89.009201","-6","1"
+"62842","Geff","IL","38.460323","-88.37124","-6","1"
+"62843","Golden Gate","IL","38.365545","-88.19454","-6","1"
+"62844","Grayville","IL","38.257064","-88.00353","-6","1"
+"62845","Herald","IL","38.073931","-88.142657","-6","1"
+"62846","Ina","IL","38.149474","-88.89634","-6","1"
+"62847","Iola","IL","38.757302","-88.473594","-6","1"
+"62848","Irvington","IL","38.436236","-89.16184","-6","1"
+"62849","Iuka","IL","38.594744","-88.77464","-6","1"
+"62850","Johnsonville","IL","38.513119","-88.58911","-6","1"
+"62851","Keenes","IL","38.423947","-88.6692","-6","1"
+"62852","Keensburg","IL","38.351613","-87.86464","-6","1"
+"62853","Kell","IL","38.516025","-88.91954","-6","1"
+"62854","Kinmundy","IL","38.768452","-88.82814","-6","1"
+"62855","Lancaster","IL","38.403424","-87.818672","-6","1"
+"62856","Logan","IL","37.994296","-88.941665","-6","1"
+"62857","Loogootee","IL","38.911662","-88.87747","-6","1"
+"62858","Louisville","IL","38.806292","-88.48012","-6","1"
+"62859","McLeansboro","IL","38.090004","-88.53431","-6","1"
+"62860","Macedonia","IL","38.041978","-88.73257","-6","1"
+"62861","Maunie","IL","38.032574","-88.04663","-6","1"
+"62862","Mill Shoals","IL","38.219997","-88.3121","-6","1"
+"62863","Mount Carmel","IL","38.415676","-87.81077","-6","1"
+"62864","Mount Vernon","IL","38.322558","-88.90842","-6","1"
+"62865","Mulkeytown","IL","37.963264","-89.06906","-6","1"
+"62866","Nason","IL","38.16542","-88.967551","-6","1"
+"62867","New Haven","IL","37.914363","-88.12264","-6","1"
+"62868","Noble","IL","38.696562","-88.23716","-6","1"
+"62869","Norris City","IL","37.971434","-88.30419","-6","1"
+"62870","Odin","IL","38.614141","-89.04738","-6","1"
+"62871","Omaha","IL","37.877628","-88.29114","-6","1"
+"62872","Opdyke","IL","38.281485","-88.7909","-6","1"
+"62874","Orient","IL","37.921795","-88.97892","-6","1"
+"62875","Patoka","IL","38.751756","-89.09581","-6","1"
+"62876","Radom","IL","38.282464","-89.19356","-6","1"
+"62877","Richview","IL","38.388876","-89.19244","-6","1"
+"62878","Rinard","IL","38.578119","-88.49714","-6","1"
+"62879","Sailor Springs","IL","38.764802","-88.35875","-6","1"
+"62880","Saint Peter","IL","38.875494","-88.89365","-6","1"
+"62881","Salem","IL","38.623789","-88.95361","-6","1"
+"62882","Sandoval","IL","38.60823","-89.11963","-6","1"
+"62883","Scheller","IL","38.164136","-89.11908","-6","1"
+"62884","Sesser","IL","38.085829","-89.04697","-6","1"
+"62885","Shobonier","IL","38.859515","-89.054","-6","1"
+"62886","Sims","IL","38.374398","-88.53537","-6","1"
+"62887","Springerton","IL","38.185822","-88.36923","-6","1"
+"62888","Tamaroa","IL","38.127516","-89.22926","-6","1"
+"62889","Texico","IL","38.455562","-88.8232","-6","1"
+"62890","Thompsonville","IL","37.913984","-88.74922","-6","1"
+"62891","Valier","IL","38.01492","-89.04226","-6","1"
+"62892","Vernon","IL","38.804938","-89.08366","-6","1"
+"62893","Walnut Hill","IL","38.469244","-89.03707","-6","1"
+"62894","Waltonville","IL","38.212746","-89.03866","-6","1"
+"62895","Wayne City","IL","38.34239","-88.58448","-6","1"
+"62896","West Frankfort","IL","37.894496","-88.93037","-6","1"
+"62897","Whittington","IL","38.084617","-88.92096","-6","1"
+"62898","Woodlawn","IL","38.335675","-89.04867","-6","1"
+"62899","Xenia","IL","38.661358","-88.64744","-6","1"
+"62901","Carbondale","IL","37.707763","-89.19246","-6","1"
+"62902","Carbondale","IL","37.758646","-89.415831","-6","1"
+"62903","Carbondale","IL","37.758646","-89.415831","-6","1"
+"62905","Alto Pass","IL","37.571235","-89.33462","-6","1"
+"62906","Anna","IL","37.457806","-89.21408","-6","1"
+"62907","Ava","IL","37.871546","-89.50721","-6","1"
+"62908","Belknap","IL","37.308412","-88.88076","-6","1"
+"62909","Boles","IL","37.44725","-88.876792","-6","1"
+"62910","Brookport","IL","37.140282","-88.58186","-6","1"
+"62912","Buncombe","IL","37.477639","-89.02992","-6","1"
+"62913","Cache","IL","37.152775","-89.325581","-6","1"
+"62914","Cairo","IL","37.025325","-89.18974","-6","1"
+"62915","Cambria","IL","37.782057","-89.12184","-6","1"
+"62916","Campbell Hill","IL","37.933269","-89.55501","-6","1"
+"62917","Carrier Mills","IL","37.692923","-88.65284","-6","1"
+"62918","Carterville","IL","37.766029","-89.08355","-6","1"
+"62919","Cave In Rock","IL","37.495812","-88.16099","-6","1"
+"62920","Cobden","IL","37.540571","-89.25489","-6","1"
+"62921","Colp","IL","37.804876","-89.08118","-6","1"
+"62922","Creal Springs","IL","37.613705","-88.83922","-6","1"
+"62923","Cypress","IL","37.34","-89.03177","-6","1"
+"62924","De Soto","IL","37.82526","-89.20301","-6","1"
+"62926","Dongola","IL","37.363981","-89.15783","-6","1"
+"62927","Dowell","IL","37.940448","-89.24091","-6","1"
+"62928","Eddyville","IL","37.501552","-88.58141","-6","1"
+"62930","Eldorado","IL","37.822259","-88.44456","-6","1"
+"62931","Elizabethtown","IL","37.511139","-88.28284","-6","1"
+"62932","Elkville","IL","37.907619","-89.23151","-6","1"
+"62933","Energy","IL","37.774517","-89.02583","-6","1"
+"62934","Equality","IL","37.716434","-88.37184","-6","1"
+"62935","Galatia","IL","37.836537","-88.62298","-6","1"
+"62938","Golconda","IL","37.374723","-88.52571","-6","1"
+"62939","Goreville","IL","37.558235","-88.96661","-6","1"
+"62940","Gorham","IL","37.727109","-89.47618","-6","1"
+"62941","Grand Chain","IL","37.239385","-88.95184","-6","1"
+"62942","Grand Tower","IL","37.629601","-89.48077","-6","1"
+"62943","Grantsburg","IL","37.342538","-88.73381","-6","1"
+"62944","Hamletsburg","IL","37.333591","-88.561428","-6","1"
+"62946","Harrisburg","IL","37.725834","-88.54208","-6","1"
+"62947","Herod","IL","37.567779","-88.39925","-6","1"
+"62948","Herrin","IL","37.804014","-89.02702","-6","1"
+"62949","Hurst","IL","37.835684","-89.14346","-6","1"
+"62950","Jacob","IL","37.75858","-89.56055","-6","1"
+"62951","Johnston City","IL","37.820724","-88.92647","-6","1"
+"62952","Jonesboro","IL","37.42084","-89.31217","-6","1"
+"62953","Joppa","IL","37.20812","-88.84304","-6","1"
+"62954","Junction","IL","37.703552","-88.26498","-6","1"
+"62955","Karbers Ridge","IL","37.500757","-88.238292","-6","1"
+"62956","Karnak","IL","37.279433","-88.93959","-6","1"
+"62957","McClure","IL","37.305331","-89.43066","-6","1"
+"62958","Makanda","IL","37.612173","-89.17587","-6","1"
+"62959","Marion","IL","37.724504","-88.92968","-6","1"
+"62960","Metropolis","IL","37.18308","-88.73327","-6","1"
+"62961","Millcreek","IL","37.340918","-89.254203","-6","1"
+"62962","Miller City","IL","37.097546","-89.33547","-6","1"
+"62963","Mound City","IL","37.08751","-89.16532","-6","1"
+"62964","Mounds","IL","37.119739","-89.20174","-6","1"
+"62965","Muddy","IL","37.801972","-88.548695","-6","1"
+"62966","Murphysboro","IL","37.771806","-89.33971","-6","1"
+"62967","New Burnside","IL","37.582136","-88.76394","-6","1"
+"62969","Olive Branch","IL","37.159227","-89.34153","-6","1"
+"62970","Olmsted","IL","37.199769","-89.10964","-6","1"
+"62971","Oraville","IL","37.758646","-89.415831","-6","1"
+"62972","Ozark","IL","37.548762","-88.74145","-6","1"
+"62973","Perks","IL","37.311333","-89.083056","-6","1"
+"62974","Pittsburg","IL","37.780592","-88.82344","-6","1"
+"62975","Pomona","IL","37.618822","-89.3617","-6","1"
+"62976","Pulaski","IL","37.214012","-89.21039","-6","1"
+"62977","Raleigh","IL","37.844963","-88.54416","-6","1"
+"62979","Ridgway","IL","37.796784","-88.24393","-6","1"
+"62982","Rosiclare","IL","37.426076","-88.34815","-6","1"
+"62983","Royalton","IL","37.884066","-89.11128","-6","1"
+"62984","Shawneetown","IL","37.712847","-88.16553","-6","1"
+"62985","Simpson","IL","37.458878","-88.69466","-6","1"
+"62987","Stonefort","IL","37.635792","-88.67912","-6","1"
+"62988","Tamms","IL","37.240381","-89.28271","-6","1"
+"62990","Thebes","IL","37.223589","-89.42243","-6","1"
+"62991","Tunnel Hill","IL","37.540479","-88.86601","-6","1"
+"62992","Ullin","IL","37.272477","-89.17123","-6","1"
+"62993","Unity","IL","37.150263","-89.27351","-6","1"
+"62994","Vergennes","IL","37.901441","-89.33485","-6","1"
+"62995","Vienna","IL","37.422815","-88.88016","-6","1"
+"62996","Villa Ridge","IL","37.152714","-89.1632","-6","1"
+"62997","Willisville","IL","37.983687","-89.5905","-6","1"
+"62998","Wolf Lake","IL","37.508233","-89.43987","-6","1"
+"62999","Zeigler","IL","37.8974","-89.05385","-6","1"
+"63001","Allenton","MO","38.638318","-90.427118","-6","1"
+"63005","Chesterfield","MO","38.646981","-90.63155","-6","1"
+"63006","Chesterfield","MO","38.638318","-90.427118","-6","1"
+"63010","Arnold","MO","38.42727","-90.38515","-6","1"
+"63011","Ballwin","MO","38.601403","-90.55209","-6","1"
+"63012","Barnhart","MO","38.337458","-90.42316","-6","1"
+"63013","Beaufort","MO","38.415995","-91.1603","-6","1"
+"63014","Berger","MO","38.654011","-91.33928","-6","1"
+"63015","Catawissa","MO","38.401406","-90.74276","-6","1"
+"63016","Cedar Hill","MO","38.352825","-90.63595","-6","1"
+"63017","Chesterfield","MO","38.647023","-90.53918","-6","1"
+"63019","Crystal City","MO","38.226997","-90.38215","-6","1"
+"63020","De Soto","MO","38.120303","-90.55426","-6","1"
+"63021","Ballwin","MO","38.576253","-90.53117","-6","1"
+"63022","Ballwin","MO","38.638318","-90.427118","-6","1"
+"63023","Dittmer","MO","38.280328","-90.70519","-6","1"
+"63024","Ballwin","MO","38.638318","-90.427118","-6","1"
+"63025","Eureka","MO","38.494203","-90.61304","-6","1"
+"63026","Fenton","MO","38.502854","-90.46088","-6","1"
+"63028","Festus","MO","38.187767","-90.4077","-6","1"
+"63030","Fletcher","MO","38.129238","-90.74342","-6","1"
+"63031","Florissant","MO","38.8016","-90.33662","-6","1"
+"63032","Florissant","MO","38.638318","-90.427118","-6","1"
+"63033","Florissant","MO","38.79505","-90.28578","-6","1"
+"63034","Florissant","MO","38.832863","-90.29051","-6","1"
+"63036","French Village","MO","37.97861","-90.34637","-6","1"
+"63037","Gerald","MO","38.412764","-91.3246","-6","1"
+"63038","Glencoe","MO","38.578703","-90.66508","-6","1"
+"63039","Gray Summit","MO","38.499489","-90.83398","-6","1"
+"63040","Grover","MO","38.575835","-90.61878","-6","1"
+"63041","Grubville","MO","38.262811","-90.77513","-6","1"
+"63042","Hazelwood","MO","38.7785","-90.37005","-6","1"
+"63043","Maryland Heights","MO","38.725331","-90.44451","-6","1"
+"63044","Bridgeton","MO","38.757318","-90.42335","-6","1"
+"63045","Earth City","MO","38.638318","-90.427118","-6","1"
+"63047","Hematite","MO","38.194104","-90.472495","-6","1"
+"63048","Herculaneum","MO","38.261863","-90.3902","-6","1"
+"63049","High Ridge","MO","38.473921","-90.52696","-6","1"
+"63050","Hillsboro","MO","38.259946","-90.5666","-6","1"
+"63051","House Springs","MO","38.405287","-90.57059","-6","1"
+"63052","Imperial","MO","38.385265","-90.40339","-6","1"
+"63053","Kimmswick","MO","38.252726","-90.514875","-6","1"
+"63055","Labadie","MO","38.535934","-90.84698","-6","1"
+"63056","Leslie","MO","38.404826","-91.22652","-6","1"
+"63057","Liguori","MO","38.341918","-90.408223","-6","1"
+"63060","Lonedell","MO","38.247062","-90.85642","-6","1"
+"63061","Luebbering","MO","38.257711","-90.80694","-6","1"
+"63065","Mapaville","MO","38.252726","-90.514875","-6","1"
+"63066","Morse Mill","MO","38.280943","-90.652057","-6","1"
+"63068","New Haven","MO","38.558836","-91.24469","-6","1"
+"63069","Pacific","MO","38.482353","-90.73892","-6","1"
+"63070","Pevely","MO","38.279016","-90.40862","-6","1"
+"63071","Richwoods","MO","38.137345","-90.83168","-6","1"
+"63072","Robertsville","MO","38.369435","-90.81792","-6","1"
+"63073","Saint Albans","MO","38.527729","-91.017274","-6","1"
+"63074","Saint Ann","MO","38.727184","-90.38551","-6","1"
+"63077","Saint Clair","MO","38.336093","-90.98902","-6","1"
+"63079","Stanton","MO","38.274398","-91.085533","-6","1"
+"63080","Sullivan","MO","38.200244","-91.14089","-6","1"
+"63084","Union","MO","38.434806","-91.00353","-6","1"
+"63087","Valles Mines","MO","38.024849","-90.44667","-6","1"
+"63088","Valley Park","MO","38.553253","-90.49157","-6","1"
+"63089","Villa Ridge","MO","38.46292","-90.88421","-6","1"
+"63090","Washington","MO","38.535499","-91.02348","-6","1"
+"63091","Rosebud","MO","38.387446","-91.39332","-6","1"
+"63099","Fenton","MO","38.638318","-90.427118","-6","1"
+"63101","Saint Louis","MO","38.631551","-90.193","-6","1"
+"63102","Saint Louis","MO","38.6352","-90.18702","-6","1"
+"63103","Saint Louis","MO","38.631451","-90.21415","-6","1"
+"63104","Saint Louis","MO","38.610701","-90.21362","-6","1"
+"63105","Saint Louis","MO","38.645484","-90.32888","-6","1"
+"63106","Saint Louis","MO","38.644451","-90.20636","-6","1"
+"63107","Saint Louis","MO","38.6628","-90.20949","-6","1"
+"63108","Saint Louis","MO","38.646201","-90.25435","-6","1"
+"63109","Saint Louis","MO","38.586052","-90.2941","-6","1"
+"63110","Saint Louis","MO","38.622601","-90.26182","-6","1"
+"63111","Saint Louis","MO","38.559302","-90.25174","-6","1"
+"63112","Saint Louis","MO","38.661351","-90.28434","-6","1"
+"63113","Saint Louis","MO","38.656701","-90.24397","-6","1"
+"63114","Saint Louis","MO","38.702651","-90.36109","-6","1"
+"63115","Saint Louis","MO","38.676851","-90.24009","-6","1"
+"63116","Saint Louis","MO","38.580552","-90.26307","-6","1"
+"63117","Saint Louis","MO","38.628402","-90.32636","-6","1"
+"63118","Saint Louis","MO","38.594901","-90.2278","-6","1"
+"63119","Saint Louis","MO","38.590652","-90.35168","-6","1"
+"63120","Saint Louis","MO","38.691901","-90.25992","-6","1"
+"63121","Saint Louis","MO","38.706301","-90.29609","-6","1"
+"63122","Saint Louis","MO","38.582702","-90.40966","-6","1"
+"63123","Saint Louis","MO","38.549452","-90.32525","-6","1"
+"63124","Saint Louis","MO","38.645802","-90.37687","-6","1"
+"63125","Saint Louis","MO","38.524066","-90.2895","-6","1"
+"63126","Saint Louis","MO","38.552303","-90.37921","-6","1"
+"63127","Saint Louis","MO","38.53987","-90.40024","-6","1"
+"63128","Saint Louis","MO","38.500734","-90.37113","-6","1"
+"63129","Saint Louis","MO","38.469953","-90.32161","-6","1"
+"63130","Saint Louis","MO","38.663951","-90.32348","-6","1"
+"63131","Saint Louis","MO","38.618582","-90.43643","-6","1"
+"63132","Saint Louis","MO","38.675784","-90.37463","-6","1"
+"63133","Saint Louis","MO","38.679684","-90.30186","-6","1"
+"63134","Saint Louis","MO","38.738217","-90.33904","-6","1"
+"63135","Saint Louis","MO","38.74785","-90.30258","-6","1"
+"63136","Saint Louis","MO","38.73835","-90.26154","-6","1"
+"63137","Saint Louis","MO","38.748183","-90.21864","-6","1"
+"63138","Saint Louis","MO","38.787849","-90.21041","-6","1"
+"63139","Saint Louis","MO","38.610901","-90.29174","-6","1"
+"63140","Saint Louis","MO","38.73965","-90.32178","-6","1"
+"63141","Saint Louis","MO","38.662302","-90.45363","-6","1"
+"63143","Saint Louis","MO","38.612452","-90.31822","-6","1"
+"63144","Saint Louis","MO","38.619152","-90.34964","-6","1"
+"63145","Saint Louis","MO","38.638318","-90.427118","-6","1"
+"63146","Saint Louis","MO","38.688585","-90.44689","-6","1"
+"63147","Saint Louis","MO","38.692861","-90.21905","-6","1"
+"63150","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63151","Saint Louis","MO","38.638318","-90.427118","-6","1"
+"63153","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63155","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63156","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63157","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63158","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63160","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63163","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63164","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63166","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63167","Saint Louis","MO","38.638318","-90.427118","-6","1"
+"63169","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63171","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63177","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63178","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63179","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63180","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63182","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63188","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63195","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63196","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63197","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63198","Saint Louis","MO","38.638318","-90.427118","-6","1"
+"63199","Saint Louis","MO","38.6531","-90.243462","-6","1"
+"63301","Saint Charles","MO","38.808583","-90.50687","-6","1"
+"63302","Saint Charles","MO","38.581299","-90.872987","-6","1"
+"63303","Saint Charles","MO","38.762715","-90.53903","-6","1"
+"63304","Saint Charles","MO","38.72926","-90.65332","-6","1"
+"63330","Annada","MO","39.257008","-90.82317","-6","1"
+"63332","Augusta","MO","38.590155","-90.89093","-6","1"
+"63333","Bellflower","MO","39.03288","-91.32983","-6","1"
+"63334","Bowling Green","MO","39.318552","-91.18265","-6","1"
+"63336","Clarksville","MO","39.354092","-90.93137","-6","1"
+"63338","Cottleville","MO","38.750949","-90.536784","-6","1"
+"63339","Curryville","MO","39.334216","-91.37684","-6","1"
+"63341","Defiance","MO","38.68879","-90.78593","-6","1"
+"63342","Dutzow","MO","38.605967","-90.996216","-6","1"
+"63343","Elsberry","MO","39.151543","-90.8136","-6","1"
+"63344","Eolia","MO","39.239548","-91.01577","-6","1"
+"63345","Farber","MO","39.267199","-91.56669","-6","1"
+"63346","Flinthill","MO","38.750949","-90.536784","-6","1"
+"63347","Foley","MO","39.069965","-90.75875","-6","1"
+"63348","Foristell","MO","38.814432","-90.94433","-6","1"
+"63349","Hawk Point","MO","38.96624","-91.14919","-6","1"
+"63350","High Hill","MO","38.898823","-91.3682","-6","1"
+"63351","Jonesburg","MO","38.862422","-91.31284","-6","1"
+"63352","Laddonia","MO","39.249616","-91.64872","-6","1"
+"63353","Louisiana","MO","39.449012","-91.07518","-6","1"
+"63357","Marthasville","MO","38.647611","-91.09159","-6","1"
+"63359","Middletown","MO","39.151911","-91.34909","-6","1"
+"63361","Montgomery City","MO","38.973583","-91.53556","-6","1"
+"63362","Moscow Mills","MO","38.952724","-90.89199","-6","1"
+"63363","New Florence","MO","38.881628","-91.44852","-6","1"
+"63365","New Melle","MO","38.716287","-90.875127","-6","1"
+"63366","O Fallon","MO","38.786335","-90.72121","-6","1"
+"63367","Lake Saint Louis","MO","38.796601","-90.78525","-6","1"
+"63369","Old Monroe","MO","38.935776","-90.77801","-6","1"
+"63370","Olney","MO","39.085749","-91.2243","-6","1"
+"63371","Paynesville","MO","39.25597","-90.883751","-6","1"
+"63373","Portage Des Sioux","MO","38.935496","-90.3683","-6","1"
+"63375","Perryville","MO","37.73473","-89.856609","-6","1"
+"63376","Saint Peters","MO","38.778579","-90.62045","-6","1"
+"63377","Silex","MO","39.110908","-91.08017","-6","1"
+"63378","Treloar","MO","38.770187","-91.188586","-6","1"
+"63379","Troy","MO","38.991916","-90.98649","-6","1"
+"63381","Truxton","MO","38.995145","-91.2336","-6","1"
+"63382","Vandalia","MO","39.310099","-91.48862","-6","1"
+"63383","Warrenton","MO","38.818852","-91.17","-6","1"
+"63384","Wellsville","MO","39.081392","-91.56266","-6","1"
+"63385","Wentzville","MO","38.808884","-90.85922","-6","1"
+"63386","West Alton","MO","38.876781","-90.23706","-6","1"
+"63387","Whiteside","MO","39.184054","-91.02078","-6","1"
+"63388","Williamsburg","MO","38.886456","-91.76344","-6","1"
+"63389","Winfield","MO","39.00006","-90.77209","-6","1"
+"63390","Wright City","MO","38.797388","-91.03468","-6","1"
+"63401","Hannibal","MO","39.695798","-91.40084","-6","1"
+"63430","Alexandria","MO","40.381613","-91.50598","-6","1"
+"63431","Anabel","MO","39.753475","-92.3224","-6","1"
+"63432","Arbela","MO","40.497304","-91.9947","-6","1"
+"63433","Ashburn","MO","39.549602","-91.18155","-6","1"
+"63434","Bethel","MO","39.906312","-91.96806","-6","1"
+"63435","Canton","MO","40.178309","-91.57389","-6","1"
+"63436","Center","MO","39.501697","-91.5367","-6","1"
+"63437","Clarence","MO","39.742551","-92.24825","-6","1"
+"63438","Durham","MO","39.952258","-91.69953","-6","1"
+"63439","Emden","MO","39.788052","-91.85812","-6","1"
+"63440","Ewing","MO","39.98803","-91.73595","-6","1"
+"63441","Frankford","MO","39.484069","-91.32296","-6","1"
+"63442","Granger","MO","40.453333","-92.1474","-6","1"
+"63443","Hunnewell","MO","39.677082","-91.8584","-6","1"
+"63445","Kahoka","MO","40.415683","-91.71817","-6","1"
+"63446","Knox City","MO","40.14036","-92.01104","-6","1"
+"63447","La Belle","MO","40.109412","-91.91078","-6","1"
+"63448","La Grange","MO","40.044294","-91.51803","-6","1"
+"63450","Lentner","MO","39.650093","-92.14536","-6","1"
+"63451","Leonard","MO","39.922732","-92.19521","-6","1"
+"63452","Lewistown","MO","40.101973","-91.79502","-6","1"
+"63453","Luray","MO","40.489269","-91.87248","-6","1"
+"63454","Maywood","MO","39.93264","-91.63745","-6","1"
+"63456","Monroe City","MO","39.645523","-91.72967","-6","1"
+"63457","Monticello","MO","40.143679","-91.7066","-6","1"
+"63458","Newark","MO","39.98354","-91.99255","-6","1"
+"63459","New London","MO","39.584889","-91.38258","-6","1"
+"63460","Novelty","MO","40.011886","-92.20242","-6","1"
+"63461","Palmyra","MO","39.793879","-91.54631","-6","1"
+"63462","Perry","MO","39.430693","-91.68647","-6","1"
+"63463","Philadelphia","MO","39.814354","-91.74251","-6","1"
+"63464","Plevna","MO","39.972337","-92.06553","-6","1"
+"63465","Revere","MO","40.526542","-91.68075","-6","1"
+"63466","Saint Patrick","MO","40.431201","-91.685103","-6","1"
+"63467","Saverton","MO","39.650045","-91.270502","-6","1"
+"63468","Shelbina","MO","39.677131","-92.01662","-6","1"
+"63469","Shelbyville","MO","39.820466","-92.03371","-6","1"
+"63471","Taylor","MO","39.925941","-91.49636","-6","1"
+"63472","Wayland","MO","40.396289","-91.58325","-6","1"
+"63473","Williamstown","MO","40.246729","-91.77368","-6","1"
+"63474","Wyaconda","MO","40.354422","-91.91063","-6","1"
+"63477","La Belle","MO","40.114109","-91.912383","-6","1"
+"63501","Kirksville","MO","40.183335","-92.58341","-6","1"
+"63530","Atlanta","MO","39.911723","-92.46408","-6","1"
+"63531","Baring","MO","40.281881","-92.23595","-6","1"
+"63532","Bevier","MO","39.75496","-92.57057","-6","1"
+"63533","Brashear","MO","40.181653","-92.39699","-6","1"
+"63534","Callao","MO","39.7418","-92.63582","-6","1"
+"63535","Coatsville","MO","40.569026","-92.64152","-6","1"
+"63536","Downing","MO","40.486993","-92.36284","-6","1"
+"63537","Edina","MO","40.164349","-92.1671","-6","1"
+"63538","Elmer","MO","39.952779","-92.68007","-6","1"
+"63539","Ethel","MO","39.893011","-92.74503","-6","1"
+"63540","Gibbs","MO","40.096431","-92.41809","-6","1"
+"63541","Glenwood","MO","40.513638","-92.60818","-6","1"
+"63543","Gorin","MO","40.361121","-92.01979","-6","1"
+"63544","Green Castle","MO","40.244242","-92.85127","-6","1"
+"63545","Green City","MO","40.256611","-92.98277","-6","1"
+"63546","Greentop","MO","40.335091","-92.52631","-6","1"
+"63547","Hurdland","MO","40.145396","-92.30285","-6","1"
+"63548","Lancaster","MO","40.524127","-92.51071","-6","1"
+"63549","La Plata","MO","40.018881","-92.50308","-6","1"
+"63551","Livonia","MO","40.496773","-92.72414","-6","1"
+"63552","Macon","MO","39.747736","-92.46878","-6","1"
+"63555","Memphis","MO","40.469438","-92.18031","-6","1"
+"63556","Milan","MO","40.184189","-93.12043","-6","1"
+"63557","New Boston","MO","39.963355","-92.88684","-6","1"
+"63558","New Cambria","MO","39.728897","-92.74979","-6","1"
+"63559","Novinger","MO","40.228235","-92.72531","-6","1"
+"63560","Pollock","MO","40.367584","-93.11823","-6","1"
+"63561","Queen City","MO","40.410297","-92.55728","-6","1"
+"63563","Rutledge","MO","40.303327","-92.07913","-6","1"
+"63565","Unionville","MO","40.472841","-92.97298","-6","1"
+"63566","Winigan","MO","40.031642","-92.9641","-6","1"
+"63567","Worthington","MO","40.411635","-92.69113","-6","1"
+"63588","Clay","MO","36.018996","-90.159327","-6","1"
+"63601","Park Hills","MO","37.844197","-90.53","-6","1"
+"63620","Annapolis","MO","37.383001","-90.6596","-6","1"
+"63621","Arcadia","MO","37.520078","-90.61694","-6","1"
+"63622","Belgrade","MO","37.790928","-90.89305","-6","1"
+"63623","Belleview","MO","37.682669","-90.88172","-6","1"
+"63624","Bismarck","MO","37.740163","-90.63962","-6","1"
+"63625","Black","MO","37.538148","-90.96827","-6","1"
+"63626","Blackwell","MO","38.053566","-90.64229","-6","1"
+"63627","Bloomsdale","MO","38.051824","-90.25527","-6","1"
+"63628","Bonne Terre","MO","37.929597","-90.5614","-6","1"
+"63629","Bunker","MO","37.416192","-91.22224","-6","1"
+"63630","Cadet","MO","38.020743","-90.74557","-6","1"
+"63631","Caledonia","MO","37.753408","-90.78593","-6","1"
+"63632","Cascade","MO","37.119566","-90.444953","-6","1"
+"63633","Centerville","MO","37.442703","-91.02077","-6","1"
+"63636","Des Arc","MO","37.292529","-90.60432","-6","1"
+"63637","Doe Run","MO","37.73411","-90.51428","-6","1"
+"63638","Ellington","MO","37.210461","-91.00798","-6","1"
+"63640","Farmington","MO","37.779206","-90.41404","-6","1"
+"63645","Fredericktown","MO","37.54834","-90.30599","-6","1"
+"63646","Glover","MO","37.505462","-90.845047","-6","1"
+"63648","Irondale","MO","37.827126","-90.68325","-6","1"
+"63650","Ironton","MO","37.614822","-90.63284","-6","1"
+"63651","Knob Lick","MO","37.675442","-90.367713","-6","1"
+"63653","Leadwood","MO","37.863193","-90.58935","-6","1"
+"63654","Lesterville","MO","37.478054","-90.83766","-6","1"
+"63655","Marquand","MO","37.416023","-90.18886","-6","1"
+"63656","Middle Brook","MO","37.611019","-90.77656","-6","1"
+"63660","Mineral Point","MO","37.913799","-90.71264","-6","1"
+"63661","New Offenburg","MO","37.89872","-90.191972","-6","1"
+"63662","Patton","MO","37.513967","-90.02477","-6","1"
+"63663","Pilot Knob","MO","37.624572","-90.64526","-6","1"
+"63664","Potosi","MO","37.91496","-90.86797","-6","1"
+"63665","Redford","MO","37.313752","-90.84892","-6","1"
+"63666","Reynolds","MO","37.327153","-91.024337","-6","1"
+"63670","Sainte Genevieve","MO","37.91259","-90.15155","-6","1"
+"63673","Saint Mary","MO","37.833644","-89.98417","-6","1"
+"63674","Tiff","MO","38.038731","-90.65623","-6","1"
+"63675","Vulcan","MO","37.326021","-90.68542","-6","1"
+"63701","Cape Girardeau","MO","37.32564","-89.5659","-6","1"
+"63702","Cape Girardeau","MO","37.350624","-89.509405","-6","1"
+"63703","Cape Girardeau","MO","37.291432","-89.54065","-6","1"
+"63705","Cape Girardeau","MO","37.366166","-89.643941","-6","1"
+"63730","Advance","MO","37.101789","-89.91359","-6","1"
+"63732","Altenburg","MO","37.584014","-89.6032","-6","1"
+"63735","Bell City","MO","36.992718","-89.78369","-6","1"
+"63736","Benton","MO","37.093104","-89.53997","-6","1"
+"63737","Brazeau","MO","37.663253","-89.652912","-6","1"
+"63738","Brownwood","MO","37.082526","-89.95595","-6","1"
+"63739","Burfordville","MO","37.360527","-89.79907","-6","1"
+"63740","Chaffee","MO","37.182556","-89.68379","-6","1"
+"63742","Commerce","MO","37.157131","-89.44651","-6","1"
+"63743","Daisy","MO","37.522361","-89.81419","-6","1"
+"63744","Delta","MO","37.197279","-89.739429","-6","1"
+"63745","Dutchtown","MO","37.24237","-89.69768","-6","1"
+"63746","Farrar","MO","37.734776","-89.811616","-6","1"
+"63747","Friedheim","MO","37.555405","-89.80068","-6","1"
+"63748","Frohna","MO","37.671971","-89.61644","-6","1"
+"63750","Gipsy","MO","37.146953","-90.1887","-6","1"
+"63751","Glenallen","MO","37.332487","-90.08675","-6","1"
+"63752","Gordonville","MO","37.30925","-89.69889","-6","1"
+"63753","Grassy","MO","37.212218","-90.13105","-6","1"
+"63755","Jackson","MO","37.413716","-89.65428","-6","1"
+"63758","Kelso","MO","37.189843","-89.549","-6","1"
+"63760","Leopold","MO","37.247942","-89.88904","-6","1"
+"63763","McGee","MO","37.052849","-90.16705","-6","1"
+"63764","Marble Hill","MO","37.309447","-89.98127","-6","1"
+"63766","Millersville","MO","37.437077","-89.85836","-6","1"
+"63767","Morley","MO","37.043378","-89.61264","-6","1"
+"63769","Oak Ridge","MO","37.509022","-89.76337","-6","1"
+"63770","Old Appleton","MO","37.593256","-89.70949","-6","1"
+"63771","Oran","MO","37.076536","-89.67823","-6","1"
+"63772","Painton","MO","37.04613","-89.779248","-6","1"
+"63774","Perkins","MO","37.094857","-89.77451","-6","1"
+"63775","Perryville","MO","37.716811","-89.87601","-6","1"
+"63776","McBride","MO","37.734776","-89.811616","-6","1"
+"63779","Pocahontas","MO","37.500656","-89.639595","-6","1"
+"63780","Scott City","MO","37.21183","-89.52687","-6","1"
+"63781","Sedgewickville","MO","37.527341","-89.92735","-6","1"
+"63782","Sturdivant","MO","37.101911","-90.0292","-6","1"
+"63783","Uniontown","MO","37.605626","-89.6774","-6","1"
+"63784","Vanduser","MO","36.990215","-89.6911","-6","1"
+"63785","Whitewater","MO","37.265867","-89.82401","-6","1"
+"63787","Zalma","MO","37.115431","-90.10392","-6","1"
+"63801","Sikeston","MO","36.891163","-89.58355","-6","1"
+"63804","Blodgett","MO","37.005572","-89.525934","-6","1"
+"63820","Anniston","MO","36.824596","-89.32516","-6","1"
+"63821","Arbyrd","MO","36.048279","-90.23343","-6","1"
+"63822","Bernie","MO","36.662399","-90.00768","-6","1"
+"63823","Bertrand","MO","36.905584","-89.44945","-6","1"
+"63824","Blodgett","MO","37.00384","-89.52535","-6","1"
+"63825","Bloomfield","MO","36.91732","-89.93679","-6","1"
+"63826","Braggadocio","MO","36.180226","-89.84072","-6","1"
+"63827","Bragg City","MO","36.27471","-89.87346","-6","1"
+"63828","Canalou","MO","36.754415","-89.68706","-6","1"
+"63829","Cardwell","MO","36.041645","-90.29776","-6","1"
+"63830","Caruthersville","MO","36.174029","-89.67548","-6","1"
+"63832","Wyatt","MO","36.916675","-89.222096","-6","1"
+"63833","Catron","MO","36.642019","-89.73149","-6","1"
+"63834","Charleston","MO","36.915335","-89.31308","-6","1"
+"63837","Clarkton","MO","36.450404","-89.97623","-6","1"
+"63838","Conran","MO","36.603844","-89.650005","-6","1"
+"63839","Cooter","MO","36.053078","-89.81679","-6","1"
+"63840","Deering","MO","36.213318","-89.748102","-6","1"
+"63841","Dexter","MO","36.784453","-89.97428","-6","1"
+"63845","East Prairie","MO","36.74432","-89.36142","-6","1"
+"63846","Essex","MO","36.818652","-89.81622","-6","1"
+"63847","Gibson","MO","36.442124","-90.03097","-6","1"
+"63848","Gideon","MO","36.449337","-89.89562","-6","1"
+"63849","Gobler","MO","36.124101","-89.99144","-6","1"
+"63850","Grayridge","MO","36.822129","-89.7817","-6","1"
+"63851","Hayti","MO","36.235881","-89.74861","-6","1"
+"63852","Holcomb","MO","36.37451","-90.00544","-6","1"
+"63853","Holland","MO","36.058612","-89.87038","-6","1"
+"63855","Hornersville","MO","36.048254","-90.08539","-6","1"
+"63857","Kennett","MO","36.237128","-90.04866","-6","1"
+"63859","Independence","MO","36.267961","-90.031801","-6","1"
+"63860","Kewanee","MO","36.67088","-89.57338","-6","1"
+"63862","Lilbourn","MO","36.588424","-89.63377","-6","1"
+"63863","Malden","MO","36.569283","-89.97423","-6","1"
+"63866","Marston","MO","36.521724","-89.6073","-6","1"
+"63867","Matthews","MO","36.751798","-89.55184","-6","1"
+"63868","Morehouse","MO","36.845481","-89.69113","-6","1"
+"63869","New Madrid","MO","36.59793","-89.54435","-6","1"
+"63870","Parma","MO","36.611902","-89.83489","-6","1"
+"63871","Pascola","MO","36.267825","-89.822514","-6","1"
+"63872","Clay","MO","36.101239","-90.114179","-6","1"
+"63873","Portageville","MO","36.436042","-89.68851","-6","1"
+"63874","Risco","MO","36.550379","-89.81874","-6","1"
+"63875","Rives","MO","36.313319","-90.165758","-6","1"
+"63876","Senath","MO","36.131733","-90.17023","-6","1"
+"63877","Steele","MO","36.079378","-89.84896","-6","1"
+"63878","Tallapoosa","MO","36.507559","-89.81877","-6","1"
+"63879","Wardell","MO","36.349977","-89.80605","-6","1"
+"63880","Whiteoak","MO","36.330522","-90.0261","-6","1"
+"63881","Wolf Island","MO","36.779519","-89.206329","-6","1"
+"63882","Wyatt","MO","36.911648","-89.22208","-6","1"
+"63901","Poplar Bluff","MO","36.759357","-90.41689","-6","1"
+"63902","Poplar Bluff","MO","36.712451","-90.407013","-6","1"
+"63931","Briar","MO","36.66101","-90.850785","-6","1"
+"63932","Broseley","MO","36.687259","-90.23594","-6","1"
+"63933","Campbell","MO","36.509916","-90.09694","-6","1"
+"63934","Clubb","MO","37.20739","-90.38829","-6","1"
+"63935","Doniphan","MO","36.624115","-90.8615","-6","1"
+"63936","Dudley","MO","36.808827","-90.12915","-6","1"
+"63937","Ellsinore","MO","36.936583","-90.75026","-6","1"
+"63938","Fagus","MO","36.512944","-90.26609","-6","1"
+"63939","Fairdealing","MO","36.647754","-90.68117","-6","1"
+"63940","Fisk","MO","36.772841","-90.21801","-6","1"
+"63941","Fremont","MO","36.918139","-91.1528","-6","1"
+"63942","Gatewood","MO","36.546354","-91.05402","-6","1"
+"63943","Grandin","MO","36.828561","-90.81359","-6","1"
+"63944","Greenville","MO","37.068349","-90.42152","-6","1"
+"63945","Harviell","MO","36.637085","-90.52687","-6","1"
+"63947","Hiram","MO","37.19068","-90.2507","-6","1"
+"63950","Lodi","MO","37.119566","-90.444953","-6","1"
+"63951","Lowndes","MO","37.124019","-90.27247","-6","1"
+"63952","Mill Spring","MO","37.028626","-90.65619","-6","1"
+"63953","Naylor","MO","36.585908","-90.61875","-6","1"
+"63954","Neelyville","MO","36.559031","-90.48646","-6","1"
+"63955","Oxly","MO","36.604837","-90.68582","-6","1"
+"63956","Patterson","MO","37.199631","-90.52353","-6","1"
+"63957","Piedmont","MO","37.151397","-90.69685","-6","1"
+"63960","Puxico","MO","36.956662","-90.13128","-6","1"
+"63961","Qulin","MO","36.58479","-90.25221","-6","1"
+"63962","Rombauer","MO","36.712451","-90.407013","-6","1"
+"63963","Shook","MO","37.072189","-90.30884","-6","1"
+"63964","Silva","MO","37.248929","-90.42887","-6","1"
+"63965","Van Buren","MO","36.985902","-90.99852","-6","1"
+"63966","Wappapello","MO","36.947396","-90.28499","-6","1"
+"63967","Williamsville","MO","36.944333","-90.48271","-6","1"
+"64001","Alma","MO","39.10223","-93.53531","-6","1"
+"64011","Bates City","MO","38.980527","-94.07705","-6","1"
+"64012","Belton","MO","38.810856","-94.53201","-6","1"
+"64013","Blue Springs","MO","38.964518","-94.370275","-6","1"
+"64014","Blue Springs","MO","39.017559","-94.25767","-6","1"
+"64015","Blue Springs","MO","39.016612","-94.2987","-6","1"
+"64016","Buckner","MO","39.118608","-94.20783","-6","1"
+"64017","Camden","MO","39.203641","-94.03213","-6","1"
+"64018","Camden Point","MO","39.446161","-94.73858","-6","1"
+"64019","Centerview","MO","38.763144","-93.86635","-6","1"
+"64020","Concordia","MO","38.97688","-93.5895","-6","1"
+"64021","Corder","MO","39.116219","-93.63663","-6","1"
+"64022","Dover","MO","39.192552","-93.68661","-6","1"
+"64024","Excelsior Springs","MO","39.340332","-94.22601","-6","1"
+"64028","Farley","MO","39.283928","-94.830159","-6","1"
+"64029","Grain Valley","MO","39.012404","-94.21156","-6","1"
+"64030","Grandview","MO","38.883548","-94.52503","-6","1"
+"64034","Greenwood","MO","38.843576","-94.34213","-6","1"
+"64035","Hardin","MO","39.29596","-93.82164","-6","1"
+"64036","Henrietta","MO","39.214233","-93.9294","-6","1"
+"64037","Higginsville","MO","39.058604","-93.73366","-6","1"
+"64040","Holden","MO","38.712465","-93.9882","-6","1"
+"64048","Holt","MO","39.44609","-94.35335","-6","1"
+"64050","Independence","MO","39.09888","-94.41447","-6","1"
+"64051","Independence","MO","39.080369","-94.387956","-6","1"
+"64052","Independence","MO","39.076405","-94.44943","-6","1"
+"64053","Independence","MO","39.107845","-94.46556","-6","1"
+"64054","Independence","MO","39.108704","-94.44115","-6","1"
+"64055","Independence","MO","39.053255","-94.4061","-6","1"
+"64056","Independence","MO","39.115776","-94.34846","-6","1"
+"64057","Independence","MO","39.069165","-94.35087","-6","1"
+"64058","Independence","MO","39.150754","-94.34502","-6","1"
+"64060","Kearney","MO","39.365318","-94.3578","-6","1"
+"64061","Kingsville","MO","38.765972","-94.09708","-6","1"
+"64062","Lawson","MO","39.443609","-94.17063","-6","1"
+"64063","Lees Summit","MO","38.913857","-94.36397","-6","1"
+"64064","Lees Summit","MO","38.98861","-94.36474","-6","1"
+"64065","Lees Summit","MO","38.966641","-94.392885","-6","1"
+"64066","Levasy","MO","39.134657","-94.13247","-6","1"
+"64067","Lexington","MO","39.176165","-93.86963","-6","1"
+"64068","Liberty","MO","39.246179","-94.41763","-6","1"
+"64069","Liberty","MO","39.282869","-94.408998","-6","1"
+"64070","Lone Jack","MO","38.895469","-94.15315","-6","1"
+"64071","Mayview","MO","39.049517","-93.8359","-6","1"
+"64072","Missouri City","MO","39.237332","-94.29621","-6","1"
+"64073","Mosby","MO","39.314899","-94.293888","-6","1"
+"64074","Napoleon","MO","39.093759","-94.0858","-6","1"
+"64075","Oak Grove","MO","38.99535","-94.14225","-6","1"
+"64076","Odessa","MO","38.98915","-93.95373","-6","1"
+"64077","Orrick","MO","39.22471","-94.13971","-6","1"
+"64078","Peculiar","MO","38.706077","-94.46049","-6","1"
+"64079","Platte City","MO","39.356596","-94.78814","-6","1"
+"64080","Pleasant Hill","MO","38.776782","-94.26207","-6","1"
+"64081","Lees Summit","MO","38.908657","-94.40285","-6","1"
+"64082","Lees Summit","MO","38.850243","-94.3957","-6","1"
+"64083","Raymore","MO","38.803528","-94.45103","-6","1"
+"64084","Rayville","MO","39.378901","-94.07822","-6","1"
+"64085","Richmond","MO","39.311978","-93.96947","-6","1"
+"64086","Lees Summit","MO","38.92811","-94.32392","-6","1"
+"64087","Liberty","MO","39.282869","-94.408998","-6","1"
+"64088","Sibley","MO","39.15207","-94.18355","-6","1"
+"64089","Smithville","MO","39.389339","-94.56774","-6","1"
+"64090","Strasburg","MO","38.760865","-94.16376","-6","1"
+"64092","Waldron","MO","39.228875","-94.805673","-6","1"
+"64093","Warrensburg","MO","38.772117","-93.73519","-6","1"
+"64096","Waverly","MO","39.214193","-93.53825","-6","1"
+"64097","Wellington","MO","39.120155","-93.96495","-6","1"
+"64098","Weston","MO","39.445387","-94.89833","-6","1"
+"64101","Kansas City","MO","39.103037","-94.60066","-6","1"
+"64102","Kansas City","MO","39.093854","-94.60411","-6","1"
+"64105","Kansas City","MO","39.104204","-94.58868","-6","1"
+"64106","Kansas City","MO","39.103704","-94.57311","-6","1"
+"64108","Kansas City","MO","39.084554","-94.58296","-6","1"
+"64109","Kansas City","MO","39.065954","-94.56643","-6","1"
+"64110","Kansas City","MO","39.033505","-94.57286","-6","1"
+"64111","Kansas City","MO","39.056505","-94.59439","-6","1"
+"64112","Kansas City","MO","39.037605","-94.59537","-6","1"
+"64113","Kansas City","MO","39.013638","-94.59471","-6","1"
+"64114","Kansas City","MO","38.966056","-94.59641","-6","1"
+"64116","Kansas City","MO","39.14912","-94.57314","-6","1"
+"64117","Kansas City","MO","39.165253","-94.53158","-6","1"
+"64118","Kansas City","MO","39.213082","-94.57248","-6","1"
+"64119","Kansas City","MO","39.202654","-94.51816","-6","1"
+"64120","Kansas City","MO","39.125304","-94.53234","-6","1"
+"64121","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64123","Kansas City","MO","39.113604","-94.52287","-6","1"
+"64124","Kansas City","MO","39.107304","-94.53985","-6","1"
+"64125","Kansas City","MO","39.104887","-94.49541","-6","1"
+"64126","Kansas City","MO","39.092304","-94.49948","-6","1"
+"64127","Kansas City","MO","39.089704","-94.53968","-6","1"
+"64128","Kansas City","MO","39.066754","-94.5365","-6","1"
+"64129","Kansas City","MO","39.051455","-94.4966","-6","1"
+"64130","Kansas City","MO","39.034838","-94.54507","-6","1"
+"64131","Kansas City","MO","38.972473","-94.57656","-6","1"
+"64132","Kansas City","MO","38.991406","-94.551","-6","1"
+"64133","Kansas City","MO","39.013905","-94.4591","-6","1"
+"64134","Kansas City","MO","38.928206","-94.49832","-6","1"
+"64136","Kansas City","MO","39.01543","-94.39967","-6","1"
+"64137","Kansas City","MO","38.929356","-94.53932","-6","1"
+"64138","Kansas City","MO","38.969806","-94.47256","-6","1"
+"64139","Kansas City","MO","38.959277","-94.40868","-6","1"
+"64141","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64142","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64144","Kansas City","MO","39.282869","-94.408998","-6","1"
+"64145","Kansas City","MO","38.896407","-94.59666","-6","1"
+"64146","Kansas City","MO","38.899843","-94.57323","-6","1"
+"64147","Kansas City","MO","38.849841","-94.54555","-6","1"
+"64148","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64149","Kansas City","MO","38.872285","-94.46712","-6","1"
+"64150","Riverside","MO","39.174903","-94.62241","-6","1"
+"64151","Kansas City","MO","39.215652","-94.63021","-6","1"
+"64152","Kansas City","MO","39.216635","-94.69991","-6","1"
+"64153","Kansas City","MO","39.281602","-94.71439","-6","1"
+"64154","Kansas City","MO","39.261679","-94.63353","-6","1"
+"64155","Kansas City","MO","39.276828","-94.57344","-6","1"
+"64156","Kansas City","MO","39.281486","-94.51296","-6","1"
+"64157","Kansas City","MO","39.283535","-94.4705","-6","1"
+"64158","Kansas City","MO","39.230259","-94.47794","-6","1"
+"64160","Kansas City","MO","39.282869","-94.408998","-6","1"
+"64161","Kansas City","MO","39.164953","-94.4669","-6","1"
+"64163","Kansas City","MO","39.31835","-94.67635","-6","1"
+"64164","Kansas City","MO","39.335365","-94.62462","-6","1"
+"64165","Kansas City","MO","39.317974","-94.57545","-6","1"
+"64166","Kansas City","MO","39.322849","-94.50755","-6","1"
+"64167","Kansas City","MO","39.3173","-94.48655","-6","1"
+"64168","Kansas City","MO","39.343225","-94.85161","-6","1"
+"64170","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64171","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64172","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64173","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64179","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64180","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64183","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64184","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64185","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64187","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64188","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64189","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64190","Kansas City","MO","39.343225","-94.85161","-6","1"
+"64191","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64192","Kansas City","MO","38.953942","-94.5237","-6","1"
+"64193","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64194","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64195","Kansas City","MO","39.343225","-94.85161","-6","1"
+"64196","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64197","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64198","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64199","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64401","Agency","MO","39.627397","-94.72215","-6","1"
+"64402","Albany","MO","40.247423","-94.33216","-6","1"
+"64420","Allendale","MO","40.478118","-94.423294","-6","1"
+"64421","Amazonia","MO","39.90444","-94.92726","-6","1"
+"64422","Amity","MO","39.898708","-94.47948","-6","1"
+"64423","Barnard","MO","40.192991","-94.85162","-6","1"
+"64424","Bethany","MO","40.266201","-94.0304","-6","1"
+"64426","Blythedale","MO","40.528127","-93.8743","-6","1"
+"64427","Bolckow","MO","40.115496","-94.85573","-6","1"
+"64428","Burlington Junction","MO","40.44627","-95.06768","-6","1"
+"64429","Cameron","MO","39.743859","-94.23378","-6","1"
+"64430","Clarksdale","MO","39.827889","-94.56785","-6","1"
+"64431","Clearmont","MO","40.527919","-94.9968","-6","1"
+"64432","Clyde","MO","40.266289","-94.66893","-6","1"
+"64433","Conception","MO","40.242954","-94.68406","-6","1"
+"64434","Conception Junction","MO","40.264258","-94.73379","-6","1"
+"64436","Cosby","MO","39.850535","-94.69403","-6","1"
+"64437","Craig","MO","40.135643","-95.33869","-6","1"
+"64438","Darlington","MO","40.183995","-94.40163","-6","1"
+"64439","Dearborn","MO","39.527667","-94.76577","-6","1"
+"64440","De Kalb","MO","39.585185","-94.90957","-6","1"
+"64441","Denver","MO","40.386181","-94.28975","-6","1"
+"64442","Eagleville","MO","40.481133","-93.99079","-6","1"
+"64443","Easton","MO","39.742355","-94.65253","-6","1"
+"64444","Edgerton","MO","39.493351","-94.62989","-6","1"
+"64445","Elmo","MO","40.527275","-95.12039","-6","1"
+"64446","Fairfax","MO","40.321432","-95.41748","-6","1"
+"64447","Fairport","MO","39.892645","-94.404415","-6","1"
+"64448","Faucett","MO","39.599578","-94.81076","-6","1"
+"64449","Fillmore","MO","40.041181","-94.9786","-6","1"
+"64451","Forest City","MO","39.982831","-95.18778","-6","1"
+"64453","Gentry","MO","40.33816","-94.44985","-6","1"
+"64454","Gower","MO","39.61222","-94.5929","-6","1"
+"64455","Graham","MO","40.187914","-95.02142","-6","1"
+"64456","Grant City","MO","40.496954","-94.38993","-6","1"
+"64457","Guilford","MO","40.162731","-94.68236","-6","1"
+"64458","Hatfield","MO","40.527055","-94.15484","-6","1"
+"64459","Helena","MO","39.917997","-94.64152","-6","1"
+"64461","Hopkins","MO","40.521372","-94.8073","-6","1"
+"64463","King City","MO","40.057066","-94.49898","-6","1"
+"64464","Polk","MO","40.024499","-94.551058","-6","1"
+"64465","Lathrop","MO","39.535467","-94.30633","-6","1"
+"64466","Maitland","MO","40.17606","-95.08755","-6","1"
+"64467","Martinsville","MO","40.390465","-94.15285","-6","1"
+"64468","Maryville","MO","40.341716","-94.87498","-6","1"
+"64469","Maysville","MO","39.91125","-94.35231","-6","1"
+"64470","Mound City","MO","40.148933","-95.23256","-6","1"
+"64471","New Hampton","MO","40.264749","-94.19587","-6","1"
+"64473","Oregon","MO","39.986725","-95.09514","-6","1"
+"64474","Osborn","MO","39.771525","-94.38471","-6","1"
+"64475","Parnell","MO","40.43702","-94.6186","-6","1"
+"64476","Pickering","MO","40.447373","-94.84243","-6","1"
+"64477","Plattsburg","MO","39.571712","-94.4603","-6","1"
+"64478","Quitman","MO","40.287996","-95.082241","-6","1"
+"64479","Ravenwood","MO","40.351697","-94.67399","-6","1"
+"64480","Rea","MO","40.061613","-94.71818","-6","1"
+"64481","Ridgeway","MO","40.358817","-93.90776","-6","1"
+"64482","Rock Port","MO","40.437038","-95.53297","-6","1"
+"64483","Rosendale","MO","40.03722","-94.83935","-6","1"
+"64484","Rushville","MO","39.544889","-95.03076","-6","1"
+"64485","Savannah","MO","39.94728","-94.8358","-6","1"
+"64486","Sheridan","MO","40.530798","-94.62495","-6","1"
+"64487","Skidmore","MO","40.30191","-95.09462","-6","1"
+"64489","Stanberry","MO","40.218842","-94.5455","-6","1"
+"64490","Stewartsville","MO","39.74226","-94.51483","-6","1"
+"64491","Tarkio","MO","40.452497","-95.3661","-6","1"
+"64492","Trimble","MO","39.474988","-94.54614","-6","1"
+"64493","Turney","MO","39.634086","-94.31921","-6","1"
+"64494","Union Star","MO","39.981974","-94.60288","-6","1"
+"64496","Watson","MO","40.497797","-95.63121","-6","1"
+"64497","Weatherby","MO","39.933989","-94.22274","-6","1"
+"64498","Westboro","MO","40.554988","-95.34418","-6","1"
+"64499","Worth","MO","40.402118","-94.44024","-6","1"
+"64501","Saint Joseph","MO","39.766144","-94.84504","-6","1"
+"64502","Saint Joseph","MO","39.676333","-94.857364","-6","1"
+"64503","Saint Joseph","MO","39.741794","-94.83237","-6","1"
+"64504","Saint Joseph","MO","39.707694","-94.87354","-6","1"
+"64505","Saint Joseph","MO","39.812344","-94.84286","-6","1"
+"64506","Saint Joseph","MO","39.787394","-94.80941","-6","1"
+"64507","Saint Joseph","MO","39.748827","-94.80299","-6","1"
+"64508","Saint Joseph","MO","39.676333","-94.857364","-6","1"
+"64600","Blue Mound","MO","39.689033","-93.555456","-6","1"
+"64601","Chillicothe","MO","39.790132","-93.54803","-6","1"
+"64620","Altamont","MO","39.900508","-94.08876","-6","1"
+"64621","Fairview","MO","39.630482","-93.478696","-6","1"
+"64622","Bogard","MO","39.48743","-93.5483","-6","1"
+"64623","Bosworth","MO","39.470242","-93.3395","-6","1"
+"64624","Braymer","MO","39.581772","-93.79569","-6","1"
+"64625","Breckenridge","MO","39.757364","-93.80512","-6","1"
+"64628","Brookfield","MO","39.792042","-93.04973","-6","1"
+"64629","Braymer","MO","39.591141","-93.792393","-6","1"
+"64630","Browning","MO","40.037077","-93.17023","-6","1"
+"64631","Bucklin","MO","39.79373","-92.88165","-6","1"
+"64632","Cainsville","MO","40.448528","-93.77349","-6","1"
+"64633","Carrollton","MO","39.355424","-93.48123","-6","1"
+"64635","Chula","MO","39.931666","-93.45736","-6","1"
+"64636","Coffey","MO","40.109791","-93.98136","-6","1"
+"64637","Cowgill","MO","39.575445","-93.91742","-6","1"
+"64638","Dawn","MO","39.616309","-93.62076","-6","1"
+"64639","De Witt","MO","39.382255","-93.22876","-6","1"
+"64640","Gallatin","MO","39.912973","-93.96536","-6","1"
+"64641","Galt","MO","40.165088","-93.39425","-6","1"
+"64642","Gilman City","MO","40.154895","-93.8395","-6","1"
+"64643","Hale","MO","39.610631","-93.35686","-6","1"
+"64644","Hamilton","MO","39.731689","-93.99009","-6","1"
+"64645","Harris","MO","40.299574","-93.33273","-6","1"
+"64646","Humphreys","MO","40.115577","-93.31489","-6","1"
+"64647","Jameson","MO","40.036453","-93.97143","-6","1"
+"64648","Jamesport","MO","39.977935","-93.80694","-6","1"
+"64649","Kidder","MO","39.780045","-94.09563","-6","1"
+"64650","Kingston","MO","39.637805","-94.04897","-6","1"
+"64651","Laclede","MO","39.785731","-93.17676","-6","1"
+"64652","Laredo","MO","40.025913","-93.43981","-6","1"
+"64653","Linneus","MO","39.884096","-93.19234","-6","1"
+"64654","Lock Springs","MO","39.96054","-93.988865","-6","1"
+"64655","Lucerne","MO","40.448227","-93.25995","-6","1"
+"64656","Ludlow","MO","39.671985","-93.67718","-6","1"
+"64657","McFall","MO","40.130633","-94.21671","-6","1"
+"64658","Marceline","MO","39.668998","-92.92916","-6","1"
+"64659","Meadville","MO","39.78583","-93.30007","-6","1"
+"64660","Mendon","MO","39.57756","-93.09683","-6","1"
+"64661","Mercer","MO","40.522402","-93.54965","-6","1"
+"64664","Mooresville","MO","39.743993","-93.71189","-6","1"
+"64665","Mount Moriah","MO","40.30922","-93.794818","-6","1"
+"64667","Newtown","MO","40.385432","-93.33102","-6","1"
+"64668","Norborne","MO","39.344835","-93.69201","-6","1"
+"64670","Pattonsburg","MO","40.051163","-94.12713","-6","1"
+"64671","Polo","MO","39.541896","-94.05158","-6","1"
+"64672","Powersville","MO","40.542119","-93.25234","-6","1"
+"64673","Princeton","MO","40.391564","-93.58237","-6","1"
+"64674","Purdin","MO","39.958661","-93.16074","-6","1"
+"64676","Rothville","MO","39.657285","-93.07282","-6","1"
+"64677","Purdin","MO","39.869353","-93.00865","-6","1"
+"64679","Spickard","MO","40.230884","-93.56742","-6","1"
+"64680","Stet","MO","39.410971","-93.431928","-6","1"
+"64681","Sumner","MO","39.647537","-93.23128","-6","1"
+"64682","Tina","MO","39.542571","-93.46006","-6","1"
+"64683","Trenton","MO","40.07823","-93.61143","-6","1"
+"64686","Utica","MO","39.743","-93.62835","-6","1"
+"64687","Wakenda","MO","39.315544","-93.377455","-6","1"
+"64688","Wheeling","MO","39.808311","-93.37642","-6","1"
+"64689","Winston","MO","39.868966","-94.14693","-6","1"
+"64701","Harrisonville","MO","38.641509","-94.34126","-6","1"
+"64720","Adrian","MO","38.40388","-94.34512","-6","1"
+"64722","Amoret","MO","38.266148","-94.55686","-6","1"
+"64723","Amsterdam","MO","38.363183","-94.57551","-6","1"
+"64724","Appleton City","MO","38.171591","-94.02233","-6","1"
+"64725","Archie","MO","38.493639","-94.35764","-6","1"
+"64726","Blairstown","MO","38.526134","-93.93112","-6","1"
+"64728","Bronaugh","MO","37.692776","-94.50225","-6","1"
+"64730","Butler","MO","38.259528","-94.32317","-6","1"
+"64733","Chilhowee","MO","38.581879","-93.82496","-6","1"
+"64734","Cleveland","MO","38.671517","-94.57953","-6","1"
+"64735","Clinton","MO","38.364214","-93.76042","-6","1"
+"64738","Collins","MO","37.899548","-93.65335","-6","1"
+"64739","Creighton","MO","38.506491","-94.09323","-6","1"
+"64740","Deepwater","MO","38.250989","-93.7365","-6","1"
+"64741","Deerfield","MO","37.825966","-94.55673","-6","1"
+"64742","Drexel","MO","38.505786","-94.56078","-6","1"
+"64743","East Lynne","MO","38.668901","-94.22863","-6","1"
+"64744","El Dorado Springs","MO","37.853003","-94.00271","-6","1"
+"64745","Foster","MO","38.164781","-94.50955","-6","1"
+"64746","Freeman","MO","38.616741","-94.49465","-6","1"
+"64747","Garden City","MO","38.575037","-94.18376","-6","1"
+"64748","Golden City","MO","37.371365","-94.09057","-6","1"
+"64750","Harwood","MO","37.943914","-94.12773","-6","1"
+"64751","Horton","MO","37.946913","-94.42222","-6","1"
+"64752","Hume","MO","38.081874","-94.5645","-6","1"
+"64755","Jasper","MO","37.326648","-94.31032","-6","1"
+"64756","Jerico Springs","MO","37.621338","-94.01643","-6","1"
+"64759","Lamar","MO","37.507321","-94.2761","-6","1"
+"64761","Leeton","MO","38.585719","-93.68518","-6","1"
+"64762","Liberal","MO","37.555366","-94.51496","-6","1"
+"64763","Lowry City","MO","38.137769","-93.73225","-6","1"
+"64765","Metz","MO","37.849889","-94.338133","-6","1"
+"64766","Milford","MO","37.501451","-94.345591","-6","1"
+"64767","Milo","MO","37.747201","-94.22416","-6","1"
+"64769","Mindenmines","MO","37.499513","-94.57635","-6","1"
+"64770","Montrose","MO","38.277754","-93.98973","-6","1"
+"64771","Moundville","MO","37.766787","-94.45313","-6","1"
+"64772","Nevada","MO","37.838563","-94.35075","-6","1"
+"64776","Osceola","MO","38.039239","-93.67676","-6","1"
+"64777","Passaic","MO","38.251879","-94.331993","-6","1"
+"64778","Richards","MO","37.906353","-94.53424","-6","1"
+"64779","Rich Hill","MO","38.086255","-94.38241","-6","1"
+"64780","Rockville","MO","38.054666","-94.07515","-6","1"
+"64781","Roscoe","MO","37.981824","-93.80721","-6","1"
+"64783","Schell City","MO","38.005777","-94.10004","-6","1"
+"64784","Sheldon","MO","37.665823","-94.26399","-6","1"
+"64788","Urich","MO","38.429061","-94.00494","-6","1"
+"64789","Vista","MO","38.024133","-93.781478","-6","1"
+"64790","Walker","MO","37.903772","-94.21822","-6","1"
+"64801","Joplin","MO","37.09416","-94.50169","-6","1"
+"64802","Joplin","MO","37.206219","-94.335453","-6","1"
+"64803","Joplin","MO","37.206219","-94.335453","-6","1"
+"64804","Joplin","MO","37.047161","-94.51124","-6","1"
+"64810","Goodman","MO","36.739448","-94.405903","-6","1"
+"64830","Alba","MO","37.236623","-94.42087","-6","1"
+"64831","Anderson","MO","36.658583","-94.44972","-6","1"
+"64832","Asbury","MO","37.292467","-94.5856","-6","1"
+"64833","Avilla","MO","37.195692","-94.12946","-6","1"
+"64834","Carl Junction","MO","37.174256","-94.55543","-6","1"
+"64835","Carterville","MO","37.149458","-94.44019","-6","1"
+"64836","Carthage","MO","37.168985","-94.31164","-6","1"
+"64840","Diamond","MO","37.002574","-94.32419","-6","1"
+"64841","Duenweg","MO","37.081103","-94.41181","-6","1"
+"64842","Fairview","MO","36.799869","-94.10161","-6","1"
+"64843","Goodman","MO","36.734769","-94.42691","-6","1"
+"64844","Granby","MO","36.913607","-94.24731","-6","1"
+"64847","Lanagan","MO","36.61041","-94.4509","-6","1"
+"64848","La Russell","MO","37.172786","-94.00043","-6","1"
+"64849","Neck City","MO","37.256327","-94.44382","-6","1"
+"64850","Neosho","MO","36.86429","-94.39016","-6","1"
+"64853","Newtonia","MO","36.828416","-94.152072","-6","1"
+"64854","Noel","MO","36.547736","-94.47579","-6","1"
+"64855","Oronogo","MO","37.260443","-94.48079","-6","1"
+"64856","Pineville","MO","36.571849","-94.28956","-6","1"
+"64857","Purcell","MO","37.241939","-94.43498","-6","1"
+"64858","Racine","MO","36.898694","-94.52788","-6","1"
+"64859","Reeds","MO","37.146249","-94.16048","-6","1"
+"64861","Rocky Comfort","MO","36.712525","-94.14484","-6","1"
+"64862","Sarcoxie","MO","37.086771","-94.12545","-6","1"
+"64863","South West City","MO","36.530266","-94.60271","-6","1"
+"64864","Saginaw","MO","36.902332","-94.338957","-6","1"
+"64865","Seneca","MO","36.833365","-94.59415","-6","1"
+"64866","Stark City","MO","36.871373","-94.15805","-6","1"
+"64867","Stella","MO","36.73901","-94.22947","-6","1"
+"64868","Tiff City","MO","36.632573","-94.342802","-6","1"
+"64869","Waco","MO","37.206219","-94.335453","-6","1"
+"64870","Webb City","MO","37.155108","-94.47465","-6","1"
+"64873","Wentworth","MO","37.011487","-94.05116","-6","1"
+"64874","Wheaton","MO","36.760347","-94.05456","-6","1"
+"64930","Washington","MO","39.781173","-94.600647","-6","1"
+"64944","Kansas City","MO","39.035038","-94.356728","-6","1"
+"64999","Kansas City","MO","39.035038","-94.356728","-6","1"
+"65001","Argyle","MO","38.287405","-92.02352","-6","1"
+"65010","Ashland","MO","38.784123","-92.24395","-6","1"
+"65011","Barnett","MO","38.361276","-92.72167","-6","1"
+"65013","Belle","MO","38.279787","-91.74108","-6","1"
+"65014","Bland","MO","38.31417","-91.62432","-6","1"
+"65016","Bonnots Mill","MO","38.575173","-91.90722","-6","1"
+"65017","Brumley","MO","38.084663","-92.49693","-6","1"
+"65018","California","MO","38.624862","-92.56443","-6","1"
+"65020","Camdenton","MO","38.032648","-92.78269","-6","1"
+"65022","Cedar City","MO","38.599175","-92.178057","-6","1"
+"65023","Centertown","MO","38.630396","-92.39311","-6","1"
+"65024","Chamois","MO","38.633533","-91.78052","-6","1"
+"65025","Clarksburg","MO","38.662989","-92.67253","-6","1"
+"65026","Eldon","MO","38.311355","-92.58395","-6","1"
+"65031","Etterville","MO","38.223649","-92.438629","-6","1"
+"65032","Eugene","MO","38.351597","-92.3956","-6","1"
+"65034","Fortuna","MO","38.561436","-92.80171","-6","1"
+"65035","Freeburg","MO","38.341076","-91.92629","-6","1"
+"65036","Gasconade","MO","38.675775","-91.58968","-6","1"
+"65037","Gravois Mills","MO","38.232201","-92.82494","-6","1"
+"65038","Laurie","MO","38.196429","-92.867804","-6","1"
+"65039","Hartsburg","MO","38.692923","-92.28803","-6","1"
+"65040","Henley","MO","38.35222","-92.31857","-6","1"
+"65041","Hermann","MO","38.659798","-91.47293","-6","1"
+"65042","High Point","MO","38.674914","-92.610941","-6","1"
+"65043","Holts Summit","MO","38.632055","-92.11831","-6","1"
+"65046","Jamestown","MO","38.77066","-92.48206","-6","1"
+"65047","Kaiser","MO","38.14008","-92.58331","-6","1"
+"65048","Koeltztown","MO","38.364291","-92.00546","-6","1"
+"65049","Lake Ozark","MO","38.192972","-92.67262","-6","1"
+"65050","Latham","MO","38.543408","-92.69655","-6","1"
+"65051","Linn","MO","38.477953","-91.81695","-6","1"
+"65052","Linn Creek","MO","38.058473","-92.6855","-6","1"
+"65053","Lohman","MO","38.543762","-92.35461","-6","1"
+"65054","Loose Creek","MO","38.483274","-91.95135","-6","1"
+"65055","McGirk","MO","38.674914","-92.610941","-6","1"
+"65058","Meta","MO","38.280617","-92.166","-6","1"
+"65059","Mokane","MO","38.674735","-91.8776","-6","1"
+"65061","Morrison","MO","38.607257","-91.64049","-6","1"
+"65062","Mount Sterling","MO","38.493511","-91.65954","-6","1"
+"65063","New Bloomfield","MO","38.723957","-92.08132","-6","1"
+"65064","Olean","MO","38.407056","-92.48693","-6","1"
+"65065","Osage Beach","MO","38.130807","-92.66935","-6","1"
+"65066","Owensville","MO","38.33895","-91.49522","-6","1"
+"65067","Portland","MO","38.751905","-91.69826","-6","1"
+"65068","Prairie Home","MO","38.798727","-92.6068","-6","1"
+"65069","Rhineland","MO","38.748204","-91.57242","-6","1"
+"65072","Rocky Mount","MO","38.248494","-92.71511","-6","1"
+"65074","Russellville","MO","38.485815","-92.46675","-6","1"
+"65075","Saint Elizabeth","MO","38.259655","-92.25872","-6","1"
+"65076","Saint Thomas","MO","38.36528","-92.19491","-6","1"
+"65077","Steedman","MO","38.78615","-91.80921","-6","1"
+"65078","Stover","MO","38.364491","-93.00645","-6","1"
+"65079","Sunrise Beach","MO","38.156071","-92.75899","-6","1"
+"65080","Tebbetts","MO","38.634516","-91.9766","-6","1"
+"65081","Tipton","MO","38.642614","-92.79811","-6","1"
+"65082","Tuscumbia","MO","38.217129","-92.43221","-6","1"
+"65083","Ulman","MO","38.142363","-92.43502","-6","1"
+"65084","Versailles","MO","38.428609","-92.84968","-6","1"
+"65085","Westphalia","MO","38.417602","-92.02791","-6","1"
+"65101","Jefferson City","MO","38.535897","-92.13905","-6","1"
+"65102","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65103","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65104","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65105","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65106","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65107","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65108","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65109","Jefferson City","MO","38.568287","-92.25329","-6","1"
+"65110","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65111","Jefferson City","MO","38.530921","-92.249342","-6","1"
+"65201","Columbia","MO","38.926838","-92.29003","-6","1"
+"65202","Columbia","MO","39.00234","-92.30033","-6","1"
+"65203","Columbia","MO","38.925204","-92.36887","-6","1"
+"65205","Columbia","MO","39.044719","-92.349574","-6","1"
+"65211","Columbia","MO","38.903318","-92.102153","-6","1"
+"65212","Columbia","MO","38.937608","-92.33043","-6","1"
+"65215","Columbia","MO","38.953238","-92.320783","-6","1"
+"65216","Columbia","MO","38.903318","-92.102153","-6","1"
+"65217","Columbia","MO","38.903318","-92.102153","-6","1"
+"65218","Columbia","MO","38.903318","-92.102153","-6","1"
+"65230","Armstrong","MO","39.29161","-92.70579","-6","1"
+"65231","Auxvasse","MO","39.0159","-91.8983","-6","1"
+"65232","Benton City","MO","39.168227","-91.75007","-6","1"
+"65233","Boonville","MO","38.935305","-92.73932","-6","1"
+"65236","Brunswick","MO","39.436768","-93.11175","-6","1"
+"65237","Bunceton","MO","38.782638","-92.81139","-6","1"
+"65239","Cairo","MO","39.522573","-92.43041","-6","1"
+"65240","Centralia","MO","39.212252","-92.13684","-6","1"
+"65243","Clark","MO","39.278949","-92.36456","-6","1"
+"65244","Clifton Hill","MO","39.487134","-92.67946","-6","1"
+"65246","Dalton","MO","39.370265","-92.99396","-6","1"
+"65247","Excello","MO","39.626821","-92.4927","-6","1"
+"65248","Fayette","MO","39.148876","-92.67027","-6","1"
+"65250","Franklin","MO","39.024196","-92.81278","-6","1"
+"65251","Fulton","MO","38.852436","-91.95808","-6","1"
+"65254","Glasgow","MO","39.235444","-92.84612","-6","1"
+"65255","Hallsville","MO","39.104503","-92.23452","-6","1"
+"65256","Harrisburg","MO","39.137047","-92.45914","-6","1"
+"65257","Higbee","MO","39.286571","-92.53612","-6","1"
+"65258","Holliday","MO","39.516668","-92.13198","-6","1"
+"65259","Huntsville","MO","39.442539","-92.55356","-6","1"
+"65260","Jacksonville","MO","39.580455","-92.41023","-6","1"
+"65261","Keytesville","MO","39.500486","-92.9155","-6","1"
+"65262","Kingdom City","MO","38.959191","-91.92948","-6","1"
+"65263","Madison","MO","39.460422","-92.22005","-6","1"
+"65264","Martinsburg","MO","39.09551","-91.67592","-6","1"
+"65265","Mexico","MO","39.179316","-91.88404","-6","1"
+"65270","Moberly","MO","39.420353","-92.4344","-6","1"
+"65274","New Franklin","MO","39.015654","-92.68811","-6","1"
+"65275","Paris","MO","39.463743","-92.00144","-6","1"
+"65276","Pilot Grove","MO","38.849336","-92.93735","-6","1"
+"65278","Renick","MO","39.342316","-92.41251","-6","1"
+"65279","Rocheport","MO","39.014478","-92.53946","-6","1"
+"65280","Rush Hill","MO","39.213975","-91.73545","-6","1"
+"65281","Salisbury","MO","39.461414","-92.80488","-6","1"
+"65282","Santa Fe","MO","39.369471","-91.81864","-6","1"
+"65283","Stoutsville","MO","39.539711","-91.86679","-6","1"
+"65284","Sturgeon","MO","39.208685","-92.29136","-6","1"
+"65285","Thompson","MO","39.199784","-91.99901","-6","1"
+"65286","Triplett","MO","39.506878","-93.20442","-6","1"
+"65287","Wooldridge","MO","38.884926","-92.52188","-6","1"
+"65299","Mid Missouri","MO","38.903318","-92.102153","-6","1"
+"65301","Sedalia","MO","38.702964","-93.23231","-6","1"
+"65302","Sedalia","MO","38.724577","-93.281672","-6","1"
+"65305","Whiteman Air Force Base","MO","38.732758","-93.55485","-6","1"
+"65320","Arrow Rock","MO","39.070941","-92.94664","-6","1"
+"65321","Blackburn","MO","39.093236","-93.46794","-6","1"
+"65322","Blackwater","MO","38.975799","-92.96","-6","1"
+"65323","Calhoun","MO","38.459369","-93.62914","-6","1"
+"65324","Climax Springs","MO","38.151604","-92.99055","-6","1"
+"65325","Cole Camp","MO","38.451021","-93.19156","-6","1"
+"65326","Edwards","MO","38.203621","-93.14236","-6","1"
+"65327","Emma","MO","38.972563","-93.49429","-6","1"
+"65329","Florence","MO","38.609313","-92.97655","-6","1"
+"65330","Gilliam","MO","39.226389","-92.96214","-6","1"
+"65332","Green Ridge","MO","38.61917","-93.41123","-6","1"
+"65333","Houstonia","MO","38.901528","-93.32101","-6","1"
+"65334","Hughesville","MO","38.825456","-93.25182","-6","1"
+"65335","Ionia","MO","38.503623","-93.33085","-6","1"
+"65336","Knob Noster","MO","38.76699","-93.56712","-6","1"
+"65337","La Monte","MO","38.780854","-93.4275","-6","1"
+"65338","Lincoln","MO","38.34463","-93.26634","-6","1"
+"65339","Malta Bend","MO","39.180956","-93.37889","-6","1"
+"65340","Marshall","MO","39.10518","-93.18783","-6","1"
+"65344","Miami","MO","39.310853","-93.22589","-6","1"
+"65345","Mora","MO","38.55338","-93.11417","-6","1"
+"65347","Nelson","MO","38.99158","-93.04083","-6","1"
+"65348","Otterville","MO","38.708894","-92.99077","-6","1"
+"65349","Slater","MO","39.221658","-93.06252","-6","1"
+"65350","Smithton","MO","38.671012","-93.09353","-6","1"
+"65351","Sweet Springs","MO","38.982222","-93.40798","-6","1"
+"65354","Syracuse","MO","38.675515","-92.9168","-6","1"
+"65355","Warsaw","MO","38.242861","-93.36354","-6","1"
+"65360","Windsor","MO","38.525725","-93.51705","-6","1"
+"65401","Rolla","MO","37.94384","-91.77105","-6","1"
+"65402","Rolla","MO","37.963208","-91.817936","-6","1"
+"65409","Rolla","MO","37.876191","-91.777182","-6","1"
+"65432","Cuba","MO","38.062095","-91.391848","-6","1"
+"65433","Bendavis","MO","37.309426","-92.214372","-6","1"
+"65436","Beulah","MO","37.624096","-91.96543","-6","1"
+"65438","Birch Tree","MO","36.95653","-91.49134","-6","1"
+"65439","Bixby","MO","37.672965","-91.1097","-6","1"
+"65440","Boss","MO","37.615344","-91.1704","-6","1"
+"65441","Bourbon","MO","38.126316","-91.20688","-6","1"
+"65443","Brinktown","MO","38.125349","-92.08435","-6","1"
+"65444","Bucyrus","MO","37.365975","-92.07367","-6","1"
+"65446","Cherryville","MO","37.817055","-91.26828","-6","1"
+"65449","Cook Station","MO","37.85017","-91.49431","-6","1"
+"65452","Crocker","MO","37.95348","-92.26091","-6","1"
+"65453","Cuba","MO","38.092097","-91.4163","-6","1"
+"65456","Davisville","MO","37.780711","-91.19197","-6","1"
+"65457","Devils Elbow","MO","37.829068","-92.05671","-6","1"
+"65459","Dixon","MO","37.990962","-92.09833","-6","1"
+"65461","Duke","MO","37.68574","-92.04337","-6","1"
+"65462","Edgar Springs","MO","37.693916","-91.83904","-6","1"
+"65463","Eldridge","MO","37.84762","-92.7831","-6","1"
+"65464","Elk Creek","MO","37.191845","-91.91627","-6","1"
+"65466","Eminence","MO","37.165828","-91.36574","-6","1"
+"65468","Eunice","MO","37.260073","-91.79134","-6","1"
+"65470","Falcon","MO","37.532445","-92.39099","-6","1"
+"65473","Fort Leonard Wood","MO","37.737264","-92.12685","-6","1"
+"65479","Hartshorn","MO","37.353209","-91.63376","-6","1"
+"65483","Houston","MO","37.316088","-91.95471","-6","1"
+"65484","Huggins","MO","37.366219","-92.20608","-6","1"
+"65486","Iberia","MO","38.10273","-92.30496","-6","1"
+"65495","Dixon","MO","37.995489","-92.101845","-6","1"
+"65501","Jadwin","MO","37.464282","-91.54342","-6","1"
+"65529","Jerome","MO","37.926116","-91.98054","-6","1"
+"65530","Gilliam","MO","39.235169","-93.001374","-6","1"
+"65532","Lake Spring","MO","37.782433","-91.67142","-6","1"
+"65534","Laquey","MO","37.689335","-92.28363","-6","1"
+"65535","Leasburg","MO","38.091816","-91.29375","-6","1"
+"65536","Lebanon","MO","37.678528","-92.64733","-6","1"
+"65540","Lecoma","MO","37.767937","-91.75234","-6","1"
+"65541","Lenox","MO","37.622778","-91.76321","-6","1"
+"65542","Licking","MO","37.489718","-91.87351","-6","1"
+"65543","Lynchburg","MO","37.47449","-92.2971","-6","1"
+"65546","Montier","MO","37.153294","-91.337506","-6","1"
+"65548","Mountain View","MO","36.996408","-91.71697","-6","1"
+"65550","Newburg","MO","37.862197","-91.93811","-6","1"
+"65552","Plato","MO","37.545213","-92.17323","-6","1"
+"65555","Raymondville","MO","37.37815","-91.78576","-6","1"
+"65556","Richland","MO","37.828549","-92.40512","-6","1"
+"65557","Roby","MO","37.508599","-92.09108","-6","1"
+"65559","Saint James","MO","38.011872","-91.61179","-6","1"
+"65560","Salem","MO","37.630896","-91.51423","-6","1"
+"65564","Solo","MO","37.241589","-91.97203","-6","1"
+"65565","Steelville","MO","37.919808","-91.25495","-6","1"
+"65566","Viburnum","MO","37.716972","-91.13438","-6","1"
+"65567","Stoutland","MO","37.840129","-92.5161","-6","1"
+"65570","Success","MO","37.465392","-92.09651","-6","1"
+"65571","Summersville","MO","37.184223","-91.65064","-6","1"
+"65572","Swedeborg","MO","37.81186","-92.217391","-6","1"
+"65573","Teresita","MO","37.153294","-91.337506","-6","1"
+"65575","West Plains","MO","36.741969","-91.851732","-6","1"
+"65580","Vichy","MO","38.10675","-91.7742","-6","1"
+"65582","Vienna","MO","38.175146","-91.94655","-6","1"
+"65583","Waynesville","MO","37.820367","-92.19165","-6","1"
+"65584","St. Robert","MO","37.827415","-92.135741","-6","1"
+"65586","Wesco","MO","37.858464","-91.426693","-6","1"
+"65587","Waynesville","MO","37.805756","-92.22218","-6","1"
+"65588","Winona","MO","36.996441","-91.30515","-6","1"
+"65589","Yukon","MO","37.246525","-91.82976","-6","1"
+"65590","Long Lane","MO","37.61082","-92.94184","-6","1"
+"65591","Montreal","MO","37.97957","-92.59117","-6","1"
+"65601","Aldrich","MO","37.537425","-93.57069","-6","1"
+"65602","Springfield","MO","37.859361","-92.705545","-6","1"
+"65603","Arcola","MO","37.557203","-93.86589","-6","1"
+"65604","Ash Grove","MO","37.270684","-93.59815","-6","1"
+"65605","Aurora","MO","36.918018","-93.71063","-6","1"
+"65606","Alton","MO","36.679742","-91.36286","-6","1"
+"65607","Caplinger Mills","MO","37.736871","-93.842468","-6","1"
+"65608","Ava","MO","36.921199","-92.66205","-6","1"
+"65609","Bakersfield","MO","36.527558","-92.14776","-6","1"
+"65610","Billings","MO","37.042293","-93.52526","-6","1"
+"65611","Blue Eye","MO","36.54602","-93.34364","-6","1"
+"65612","Bois D Arc","MO","37.218244","-93.53629","-6","1"
+"65613","Bolivar","MO","37.616822","-93.40072","-6","1"
+"65614","Bradleyville","MO","36.734544","-92.89942","-6","1"
+"65615","Branson","MO","36.660981","-93.235798","-6","1"
+"65616","Branson","MO","36.64417","-93.25668","-6","1"
+"65617","Brighton","MO","37.436062","-93.34884","-6","1"
+"65618","Brixey","MO","36.755168","-92.38351","-6","1"
+"65619","Brookline Station","MO","37.134829","-93.38497","-6","1"
+"65620","Bruner","MO","37.020827","-92.94999","-6","1"
+"65622","Buffalo","MO","37.630577","-93.10129","-6","1"
+"65623","Butterfield","MO","36.749457","-93.90647","-6","1"
+"65624","Cape Fair","MO","36.725025","-93.50573","-6","1"
+"65625","Cassville","MO","36.681589","-93.85105","-6","1"
+"65626","Caulfield","MO","36.610463","-92.14245","-6","1"
+"65627","Cedarcreek","MO","36.569847","-93.01139","-6","1"
+"65629","Chadwick","MO","36.897807","-93.00082","-6","1"
+"65630","Chestnutridge","MO","36.829356","-93.20341","-6","1"
+"65631","Clever","MO","37.015404","-93.43738","-6","1"
+"65632","Conway","MO","37.494752","-92.83345","-6","1"
+"65633","Crane","MO","36.901929","-93.53989","-6","1"
+"65634","Cross Timbers","MO","38.015379","-93.195","-6","1"
+"65635","Dadeville","MO","37.508827","-93.70554","-6","1"
+"65636","Diggins","MO","37.277247","-92.877874","-6","1"
+"65637","Dora","MO","36.753498","-92.17819","-6","1"
+"65638","Drury","MO","36.851944","-92.33081","-6","1"
+"65640","Dunnegan","MO","37.707827","-93.5614","-6","1"
+"65641","Eagle Rock","MO","36.536324","-93.73134","-6","1"
+"65644","Elkland","MO","37.509611","-93.03846","-6","1"
+"65645","Eudora","MO","37.476695","-93.539707","-6","1"
+"65646","Everton","MO","37.339631","-93.70745","-6","1"
+"65647","Exeter","MO","36.690297","-93.98011","-6","1"
+"65648","Fair Grove","MO","37.391275","-93.16252","-6","1"
+"65649","Fair Play","MO","37.618579","-93.61158","-6","1"
+"65650","Flemington","MO","37.802535","-93.44334","-6","1"
+"65652","Fordland","MO","37.145969","-92.94888","-6","1"
+"65653","Forsyth","MO","36.706492","-93.11171","-6","1"
+"65654","Freistatt","MO","37.021147","-93.897434","-6","1"
+"65655","Gainesville","MO","36.606281","-92.43342","-6","1"
+"65656","Galena","MO","36.771898","-93.48394","-6","1"
+"65657","Garrison","MO","36.839078","-93.00809","-6","1"
+"65658","Golden","MO","36.557301","-93.64371","-6","1"
+"65659","Goodson","MO","37.746461","-93.2482","-6","1"
+"65660","Graff","MO","37.330625","-92.27211","-6","1"
+"65661","Greenfield","MO","37.439717","-93.83934","-6","1"
+"65662","Grovespring","MO","37.465808","-92.58794","-6","1"
+"65663","Half Way","MO","37.586048","-93.23617","-6","1"
+"65664","Halltown","MO","37.193688","-93.62758","-6","1"
+"65666","Hardenville","MO","36.651607","-92.442341","-6","1"
+"65667","Hartville","MO","37.302013","-92.50741","-6","1"
+"65668","Hermitage","MO","37.913567","-93.30305","-6","1"
+"65669","Highlandville","MO","36.923067","-93.30696","-6","1"
+"65672","Hollister","MO","36.600309","-93.23552","-6","1"
+"65673","Hollister","MO","36.617892","-93.216187","-6","1"
+"65674","Humansville","MO","37.793322","-93.59877","-6","1"
+"65675","Hurley","MO","36.930861","-93.49861","-6","1"
+"65676","Isabella","MO","36.569901","-92.62804","-6","1"
+"65679","Kirbyville","MO","36.603318","-93.11007","-6","1"
+"65680","Kissee Mills","MO","36.660582","-93.01608","-6","1"
+"65681","Lampe","MO","36.561455","-93.46715","-6","1"
+"65682","Lockwood","MO","37.411943","-93.96162","-6","1"
+"65684","Morris","MO","37.298292","-92.162456","-6","1"
+"65685","Louisburg","MO","37.751804","-93.16513","-6","1"
+"65686","Kimberling City","MO","36.63101","-93.43392","-6","1"
+"65688","Brandsville","MO","36.648817","-91.697596","-6","1"
+"65689","Cabool","MO","37.132577","-92.09857","-6","1"
+"65690","Couch","MO","36.58466","-91.30687","-6","1"
+"65692","Koshkonong","MO","36.602467","-91.64615","-6","1"
+"65701","McClurg","MO","36.79589","-92.77286","-6","1"
+"65702","Macomb","MO","37.073473","-92.4949","-6","1"
+"65704","Mansfield","MO","37.128682","-92.5821","-6","1"
+"65705","Marionville","MO","37.007586","-93.61839","-6","1"
+"65706","Marshfield","MO","37.330958","-92.90929","-6","1"
+"65707","Miller","MO","37.220289","-93.84181","-6","1"
+"65708","Monett","MO","36.91816","-93.91488","-6","1"
+"65710","Morrisville","MO","37.487034","-93.42709","-6","1"
+"65711","Mountain Grove","MO","37.176376","-92.27609","-6","1"
+"65712","Mount Vernon","MO","37.101742","-93.80738","-6","1"
+"65713","Niangua","MO","37.412437","-92.76311","-6","1"
+"65714","Nixa","MO","37.045593","-93.30563","-6","1"
+"65715","Noble","MO","36.733415","-92.58195","-6","1"
+"65717","Norwood","MO","37.093694","-92.41231","-6","1"
+"65720","Oldfield","MO","36.935499","-92.93715","-6","1"
+"65721","Ozark","MO","37.021086","-93.21541","-6","1"
+"65722","Phillipsburg","MO","37.582527","-92.76541","-6","1"
+"65723","Pierce City","MO","36.956471","-94.02134","-6","1"
+"65724","Pittsburg","MO","37.85245","-93.31817","-6","1"
+"65725","Pleasant Hope","MO","37.43378","-93.26457","-6","1"
+"65726","Point Lookout","MO","36.616515","-93.241839","-6","1"
+"65727","Polk","MO","37.789907","-93.27802","-6","1"
+"65728","Ponce De Leon","MO","36.87478","-93.34371","-6","1"
+"65729","Pontiac","MO","36.525433","-92.59234","-6","1"
+"65730","Powell","MO","36.618869","-94.156","-6","1"
+"65731","Powersite","MO","36.655356","-93.12274","-6","1"
+"65732","Preston","MO","37.93345","-93.17887","-6","1"
+"65733","Protem","AR","36.483329","-92.81449","-6","1"
+"65734","Purdy","MO","36.795164","-93.94164","-6","1"
+"65735","Quincy","MO","38.059763","-93.48502","-6","1"
+"65737","Reeds Spring","MO","36.693007","-93.37153","-6","1"
+"65738","Republic","MO","37.124302","-93.47407","-6","1"
+"65739","Ridgedale","MO","36.531361","-93.28199","-6","1"
+"65740","Rockaway Beach","MO","36.713014","-93.16335","-6","1"
+"65741","Rockbridge","MO","36.651607","-92.442341","-6","1"
+"65742","Rogersville","MO","37.122896","-93.0784","-6","1"
+"65744","Rueter","MO","36.614975","-92.89513","-6","1"
+"65745","Seligman","MO","36.530992","-93.95233","-6","1"
+"65746","Seymour","MO","37.157055","-92.78857","-6","1"
+"65747","Shell Knob","MO","36.587559","-93.58793","-6","1"
+"65752","South Greenfield","MO","37.343226","-93.82877","-6","1"
+"65753","Sparta","MO","37.000766","-93.07945","-6","1"
+"65754","Spokane","MO","36.850549","-93.30942","-6","1"
+"65755","Squires","MO","36.802445","-92.62563","-6","1"
+"65756","Stotts City","MO","37.103672","-93.95502","-6","1"
+"65757","Strafford","MO","37.281619","-93.10971","-6","1"
+"65759","Taneyville","MO","36.739739","-93.02965","-6","1"
+"65760","Tecumseh","MO","36.606892","-92.26753","-6","1"
+"65761","Theodosia","AR","36.489216","-92.69301","-6","1"
+"65762","Thornfield","MO","36.681335","-92.66205","-6","1"
+"65764","Tunas","MO","37.827158","-92.98423","-6","1"
+"65765","Turners","MO","37.25807","-93.343673","-6","1"
+"65766","Udall","MO","36.545211","-92.25803","-6","1"
+"65767","Urbana","MO","37.844753","-93.17456","-6","1"
+"65768","Vanzant","MO","36.919476","-92.25917","-6","1"
+"65769","Verona","MO","36.935443","-93.78328","-6","1"
+"65770","Walnut Grove","MO","37.410221","-93.54065","-6","1"
+"65771","Walnut Shade","MO","36.773538","-93.21227","-6","1"
+"65772","Washburn","MO","36.619334","-94.01825","-6","1"
+"65773","Wasola","MO","36.757025","-92.53414","-6","1"
+"65774","Weaubleau","MO","37.914579","-93.49803","-6","1"
+"65775","West Plains","MO","36.719145","-91.87408","-6","1"
+"65776","South Fork","MO","36.629135","-91.986785","-6","1"
+"65777","Moody","MO","36.524268","-91.98863","-6","1"
+"65778","Myrtle","MO","36.531635","-91.29933","-6","1"
+"65779","Wheatland","MO","37.939779","-93.38237","-6","1"
+"65781","Willard","MO","37.340995","-93.4179","-6","1"
+"65783","Windyville","MO","37.715074","-92.92425","-6","1"
+"65784","Zanoni","MO","36.695557","-92.32949","-6","1"
+"65785","Stockton","MO","37.703022","-93.80653","-6","1"
+"65786","Macks Creek","MO","37.968547","-92.9428","-6","1"
+"65787","Roach","MO","38.067095","-92.88033","-6","1"
+"65788","Peace Valley","MO","36.801103","-91.70972","-6","1"
+"65789","Pomona","MO","36.857128","-91.88978","-6","1"
+"65790","Pottersville","MO","36.679277","-92.10602","-6","1"
+"65791","Thayer","MO","36.543362","-91.52391","-6","1"
+"65793","Willow Springs","MO","36.996755","-91.95796","-6","1"
+"65801","Springfield","MO","37.25807","-93.343673","-6","1"
+"65802","Springfield","MO","37.212639","-93.31817","-6","1"
+"65803","Springfield","MO","37.257053","-93.29015","-6","1"
+"65804","Springfield","MO","37.161299","-93.2519","-6","1"
+"65805","Springfield","MO","37.25807","-93.343673","-6","1"
+"65806","Springfield","MO","37.206624","-93.29923","-6","1"
+"65807","Springfield","MO","37.168435","-93.31297","-6","1"
+"65808","Springfield","MO","37.25807","-93.343673","-6","1"
+"65809","Springfield","MO","37.167282","-93.20199","-6","1"
+"65810","Springfield","MO","37.120301","-93.31461","-6","1"
+"65814","Springfield","MO","37.25807","-93.343673","-6","1"
+"65817","Springfield","MO","37.25807","-93.343673","-6","1"
+"65890","Springfield","MO","37.25807","-93.343673","-6","1"
+"65898","Springfield","MO","37.180349","-93.295137","-6","1"
+"65899","Springfield","MO","37.181498","-93.259586","-6","1"
+"66002","Atchison","KS","39.553786","-95.13472","-6","1"
+"66006","Baldwin City","KS","38.789719","-95.21058","-6","1"
+"66007","Basehor","KS","39.145077","-94.94259","-6","1"
+"66008","Bendena","KS","39.703642","-95.18541","-6","1"
+"66010","Blue Mound","KS","38.102749","-95.0154","-6","1"
+"66012","Bonner Springs","KS","39.065703","-94.90453","-6","1"
+"66013","Bucyrus","KS","38.733271","-94.6957","-6","1"
+"66014","Centerville","KS","38.226434","-94.98779","-6","1"
+"66015","Colony","KS","38.067424","-95.40614","-6","1"
+"66016","Cummings","KS","39.47305","-95.23992","-6","1"
+"66017","Denton","KS","39.720911","-95.27417","-6","1"
+"66018","De Soto","KS","38.961396","-94.97681","-6","1"
+"66019","Clearview City","KS","38.94575","-95.00349","-6","1"
+"66020","Easton","KS","39.331919","-95.11389","-6","1"
+"66021","Edgerton","KS","38.762545","-95.00622","-6","1"
+"66023","Effingham","KS","39.521275","-95.39413","-6","1"
+"66024","Elwood","KS","39.756944","-94.87824","-6","1"
+"66025","Eudora","KS","38.917032","-95.06455","-6","1"
+"66026","Fontana","KS","38.404804","-94.85125","-6","1"
+"66027","Fort Leavenworth","KS","39.348031","-94.93177","-6","1"
+"66030","Gardner","KS","38.813839","-94.9265","-6","1"
+"66031","New Century","KS","38.824863","-94.899201","-6","1"
+"66032","Garnett","KS","38.278069","-95.25997","-6","1"
+"66033","Greeley","KS","38.368325","-95.12925","-6","1"
+"66035","Highland","KS","39.85881","-95.2569","-6","1"
+"66036","Hillsdale","KS","38.658068","-94.852061","-6","1"
+"66039","Kincaid","KS","38.088951","-95.17473","-6","1"
+"66040","La Cygne","KS","38.35152","-94.73705","-6","1"
+"66041","Lancaster","KS","39.589832","-95.31425","-6","1"
+"66042","Lane","KS","38.442448","-95.09067","-6","1"
+"66043","Lansing","KS","39.258624","-94.89859","-6","1"
+"66044","Lawrence","KS","38.983551","-95.23202","-6","1"
+"66045","Lawrence","KS","38.952526","-95.275623","-6","1"
+"66046","Lawrence","KS","38.932303","-95.22513","-6","1"
+"66047","Lawrence","KS","38.920649","-95.31219","-6","1"
+"66048","Leavenworth","KS","39.298776","-94.93555","-6","1"
+"66049","Lawrence","KS","38.97583","-95.30399","-6","1"
+"66050","Lecompton","KS","39.025994","-95.43138","-6","1"
+"66051","Olathe","KS","38.899901","-94.831991","-6","1"
+"66052","Linwood","KS","39.01201","-95.06283","-6","1"
+"66053","Louisburg","KS","38.602219","-94.68121","-6","1"
+"66054","McLouth","KS","39.201274","-95.19892","-6","1"
+"66056","Mound City","KS","38.141903","-94.82166","-6","1"
+"66058","Muscotah","KS","39.548048","-95.52321","-6","1"
+"66060","Nortonville","KS","39.415907","-95.32966","-6","1"
+"66061","Olathe","KS","38.889784","-94.85558","-6","1"
+"66062","Olathe","KS","38.860511","-94.77581","-6","1"
+"66063","Olathe","KS","38.899901","-94.831991","-6","1"
+"66064","Osawatomie","KS","38.489733","-94.96465","-6","1"
+"66066","Oskaloosa","KS","39.214825","-95.32501","-6","1"
+"66067","Ottawa","KS","38.614986","-95.27355","-6","1"
+"66070","Ozawkie","KS","39.201834","-95.44963","-6","1"
+"66071","Paola","KS","38.574804","-94.86706","-6","1"
+"66072","Parker","KS","38.328516","-94.98253","-6","1"
+"66073","Perry","KS","39.097559","-95.40163","-6","1"
+"66075","Pleasanton","KS","38.184882","-94.70142","-6","1"
+"66076","Pomona","KS","38.612869","-95.44709","-6","1"
+"66077","Potter","KS","39.423964","-95.1287","-6","1"
+"66078","Princeton","KS","38.49159","-95.26646","-6","1"
+"66079","Rantoul","KS","38.542788","-95.1232","-6","1"
+"66080","Richmond","KS","38.398831","-95.2668","-6","1"
+"66081","Wolf River","KS","39.773145","-95.233817","-6","1"
+"66083","Spring Hill","KS","38.736692","-94.83362","-6","1"
+"66085","Stilwell","KS","38.798648","-94.65527","-6","1"
+"66086","Tonganoxie","KS","39.112379","-95.08112","-6","1"
+"66087","Troy","KS","39.79684","-95.12869","-6","1"
+"66088","Valley Falls","KS","39.339975","-95.45781","-6","1"
+"66090","Wathena","KS","39.774356","-94.95873","-6","1"
+"66091","Welda","KS","38.185196","-95.33705","-6","1"
+"66092","Wellsville","KS","38.698415","-95.10414","-6","1"
+"66093","Westphalia","KS","38.21086","-95.50973","-6","1"
+"66094","White Cloud","KS","39.959033","-95.34005","-6","1"
+"66095","Williamsburg","KS","38.455968","-95.44342","-6","1"
+"66097","Winchester","KS","39.328743","-95.24608","-6","1"
+"66101","Kansas City","KS","39.118054","-94.62568","-6","1"
+"66102","Kansas City","KS","39.112204","-94.66643","-6","1"
+"66103","Kansas City","KS","39.059254","-94.62453","-6","1"
+"66104","Kansas City","KS","39.137003","-94.67203","-6","1"
+"66105","Kansas City","KS","39.084954","-94.63125","-6","1"
+"66106","Kansas City","KS","39.066732","-94.68872","-6","1"
+"66109","Kansas City","KS","39.156275","-94.80033","-6","1"
+"66110","Kansas City","KS","39.096551","-94.749538","-6","1"
+"66111","Kansas City","KS","39.076554","-94.79019","-6","1"
+"66112","Kansas City","KS","39.117009","-94.76614","-6","1"
+"66113","Edwardsville","KS","39.073539","-94.723271","-6","1"
+"66115","Kansas City","KS","39.141419","-94.61878","-6","1"
+"66117","Kansas City","KS","39.096551","-94.749538","-6","1"
+"66118","Kansas City","KS","39.105854","-94.61329","-6","1"
+"66119","Kansas City","KS","39.096551","-94.749538","-6","1"
+"66145","Centralia","KS","39.718697","-96.129009","-6","1"
+"66151","Morrill","KS","39.914389","-95.734523","-6","1"
+"66160","Kansas City","KS","39.096551","-94.749538","-6","1"
+"66201","Shawnee Mission","KS","39.007755","-94.679486","-6","1"
+"66202","Shawnee Mission","KS","39.023105","-94.66658","-6","1"
+"66203","Shawnee Mission","KS","39.020405","-94.70583","-6","1"
+"66204","Shawnee Mission","KS","38.992255","-94.67528","-6","1"
+"66205","Shawnee Mission","KS","39.030172","-94.63097","-6","1"
+"66206","Shawnee Mission","KS","38.959256","-94.62223","-6","1"
+"66207","Shawnee Mission","KS","38.957396","-94.64691","-6","1"
+"66208","Shawnee Mission","KS","38.999505","-94.63102","-6","1"
+"66209","Shawnee Mission","KS","38.900535","-94.63248","-6","1"
+"66210","Shawnee Mission","KS","38.924739","-94.70473","-6","1"
+"66211","Shawnee Mission","KS","38.925159","-94.64136","-6","1"
+"66212","Shawnee Mission","KS","38.959606","-94.68189","-6","1"
+"66213","Shawnee Mission","KS","38.899634","-94.70758","-6","1"
+"66214","Shawnee Mission","KS","38.961756","-94.71498","-6","1"
+"66215","Shawnee Mission","KS","38.961006","-94.74145","-6","1"
+"66216","Shawnee Mission","KS","39.009485","-94.73924","-6","1"
+"66217","Shawnee Mission","KS","39.021629","-94.78107","-6","1"
+"66218","Shawnee Mission","KS","39.011673","-94.8126","-6","1"
+"66219","Shawnee Mission","KS","38.963798","-94.77155","-6","1"
+"66220","Shawnee Mission","KS","38.964728","-94.82117","-6","1"
+"66221","Shawnee Mission","KS","38.865825","-94.71231","-6","1"
+"66222","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66223","Shawnee Mission","KS","38.860552","-94.66594","-6","1"
+"66224","Shawnee Mission","KS","38.862007","-94.62127","-6","1"
+"66225","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66226","Shawnee Mission","KS","39.029641","-94.84844","-6","1"
+"66227","Shawnee Mission","KS","38.972197","-94.86987","-6","1"
+"66250","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66251","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66276","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66279","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66282","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66283","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66285","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66286","Shawnee Mission","KS","38.899901","-94.831991","-6","1"
+"66352","Robinson","KS","39.814081","-95.409339","-6","1"
+"66356","Lincoln","KS","37.57189","-94.654599","-6","1"
+"66401","Alma","KS","38.990708","-96.29473","-6","1"
+"66402","Auburn","KS","38.918102","-95.84417","-6","1"
+"66403","Axtell","KS","39.877691","-96.26985","-6","1"
+"66404","Baileyville","KS","39.891751","-96.17343","-6","1"
+"66406","Beattie","KS","39.877735","-96.41726","-6","1"
+"66407","Belvue","KS","39.207942","-96.18665","-6","1"
+"66408","Bern","KS","39.949989","-95.96831","-6","1"
+"66409","Berryton","KS","38.935058","-95.55745","-6","1"
+"66411","Blue Rapids","KS","39.656045","-96.63791","-6","1"
+"66412","Bremen","KS","39.921671","-96.77794","-6","1"
+"66413","Burlingame","KS","38.767905","-95.88076","-6","1"
+"66414","Carbondale","KS","38.82517","-95.68963","-6","1"
+"66415","Centralia","KS","39.697296","-96.14204","-6","1"
+"66416","Circleville","KS","39.516144","-95.85396","-6","1"
+"66417","Corning","KS","39.655741","-96.03394","-6","1"
+"66418","Delia","KS","39.267478","-95.94736","-6","1"
+"66419","Denison","KS","39.377827","-95.60496","-6","1"
+"66420","Dover","KS","38.964532","-95.917186","-6","1"
+"66422","Emmett","KS","39.317301","-96.06113","-6","1"
+"66423","Eskridge","KS","38.8421","-96.12775","-6","1"
+"66424","Everest","KS","39.681813","-95.41505","-6","1"
+"66425","Fairview","KS","39.811818","-95.72861","-6","1"
+"66426","Fostoria","KS","39.43982","-96.506769","-6","1"
+"66427","Frankfort","KS","39.689409","-96.43876","-6","1"
+"66428","Goff","KS","39.671207","-95.92512","-6","1"
+"66429","Grantville","KS","39.094823","-95.54874","-6","1"
+"66431","Harveyville","KS","38.810071","-95.98397","-6","1"
+"66432","Havensville","KS","39.496479","-96.07717","-6","1"
+"66434","Hiawatha","KS","39.857155","-95.54497","-6","1"
+"66436","Holton","KS","39.466971","-95.7132","-6","1"
+"66438","Home","KS","39.853477","-96.50361","-6","1"
+"66439","Horton","KS","39.659471","-95.53567","-6","1"
+"66440","Hoyt","KS","39.254902","-95.69171","-6","1"
+"66441","Junction City","KS","39.01585","-96.83653","-6","1"
+"66442","Fort Riley","KS","39.074628","-96.80662","-6","1"
+"66449","Leonardville","KS","39.383205","-96.85876","-6","1"
+"66450","Louisville","KS","39.251831","-96.31402","-6","1"
+"66451","Lyndon","KS","38.602873","-95.67363","-6","1"
+"66481","Weir","KS","37.302792","-94.77251","-6","1"
+"66501","McFarland","KS","39.053241","-96.23893","-6","1"
+"66502","Manhattan","KS","39.184986","-96.56932","-6","1"
+"66503","Manhattan","KS","39.241083","-96.64914","-6","1"
+"66505","Manhattan","KS","39.304937","-96.675295","-6","1"
+"66506","Manhattan","KS","39.194065","-96.57872","-6","1"
+"66507","Maple Hill","KS","39.076048","-96.0343","-6","1"
+"66508","Marysville","KS","39.852696","-96.63963","-6","1"
+"66509","Mayetta","KS","39.337531","-95.75535","-6","1"
+"66510","Melvern","KS","38.503219","-95.63079","-6","1"
+"66512","Meriden","KS","39.201628","-95.55387","-6","1"
+"66514","Milford","KS","39.149612","-96.90611","-6","1"
+"66515","Morrill","KS","39.936121","-95.70325","-6","1"
+"66516","Netawaka","KS","39.626301","-95.72954","-6","1"
+"66517","Ogden","KS","39.113103","-96.70935","-6","1"
+"66518","Oketo","KS","39.964921","-96.57004","-6","1"
+"66520","Olsburg","KS","39.417531","-96.59975","-6","1"
+"66521","Onaga","KS","39.483435","-96.21101","-6","1"
+"66522","Oneida","KS","39.865907","-95.9413","-6","1"
+"66523","Osage City","KS","38.611619","-95.83132","-6","1"
+"66524","Overbrook","KS","38.775185","-95.52869","-6","1"
+"66526","Paxico","KS","39.06583","-96.15801","-6","1"
+"66527","Powhattan","KS","39.747135","-95.68096","-6","1"
+"66528","Quenemo","KS","38.60969","-95.54333","-6","1"
+"66531","Riley","KS","39.303014","-96.84635","-6","1"
+"66532","Robinson","KS","39.8202","-95.36776","-6","1"
+"66533","Rossville","KS","39.143168","-95.95263","-6","1"
+"66534","Sabetha","KS","39.889544","-95.82289","-6","1"
+"66535","Saint George","KS","39.21939","-96.43346","-6","1"
+"66536","Saint Marys","KS","39.200733","-96.07148","-6","1"
+"66537","Scranton","KS","38.771467","-95.72799","-6","1"
+"66538","Seneca","KS","39.840496","-96.04833","-6","1"
+"66539","Silver Lake","KS","39.136616","-95.85898","-6","1"
+"66540","Soldier","KS","39.502211","-95.97495","-6","1"
+"66541","Summerfield","KS","39.977047","-96.3636","-6","1"
+"66542","Tecumseh","KS","39.020437","-95.55336","-6","1"
+"66543","Vassar","KS","38.647459","-95.61031","-6","1"
+"66544","Vermillion","KS","39.694315","-96.28476","-6","1"
+"66546","Wakarusa","KS","38.895185","-95.71995","-6","1"
+"66547","Wamego","KS","39.220965","-96.31279","-6","1"
+"66548","Waterville","KS","39.691428","-96.76189","-6","1"
+"66549","Westmoreland","KS","39.427973","-96.4027","-6","1"
+"66550","Wetmore","KS","39.654548","-95.81925","-6","1"
+"66551","Wheaton","KS","39.471738","-96.257561","-6","1"
+"66552","Whiting","KS","39.585484","-95.6202","-6","1"
+"66554","Randolph","KS","39.472188","-96.76806","-6","1"
+"66555","Marysville","KS","39.783753","-96.522806","-6","1"
+"66601","Topeka","KS","38.988075","-95.780662","-6","1"
+"66603","Topeka","KS","39.0562","-95.67547","-6","1"
+"66604","Topeka","KS","39.04045","-95.71698","-6","1"
+"66605","Topeka","KS","39.013988","-95.65056","-6","1"
+"66606","Topeka","KS","39.058177","-95.71088","-6","1"
+"66607","Topeka","KS","39.044056","-95.64804","-6","1"
+"66608","Topeka","KS","39.077066","-95.66824","-6","1"
+"66609","Topeka","KS","38.988508","-95.66869","-6","1"
+"66610","Topeka","KS","38.981849","-95.79016","-6","1"
+"66611","Topeka","KS","39.0161","-95.6979","-6","1"
+"66612","Topeka","KS","39.040333","-95.68048","-6","1"
+"66614","Topeka","KS","39.015374","-95.76057","-6","1"
+"66615","Topeka","KS","39.067174","-95.88115","-6","1"
+"66616","Topeka","KS","39.065249","-95.63808","-6","1"
+"66617","Topeka","KS","39.130354","-95.63373","-6","1"
+"66618","Topeka","KS","39.126429","-95.73302","-6","1"
+"66619","Topeka","KS","38.946977","-95.6938","-6","1"
+"66620","Topeka","KS","39.042939","-95.769657","-6","1"
+"66621","Topeka","KS","39.042939","-95.769657","-6","1"
+"66622","Topeka","KS","39.042939","-95.769657","-6","1"
+"66624","Topeka","KS","39.042939","-95.769657","-6","1"
+"66625","Topeka","KS","39.042939","-95.769657","-6","1"
+"66626","Topeka","KS","39.042939","-95.769657","-6","1"
+"66628","Topeka","KS","39.042939","-95.769657","-6","1"
+"66629","Topeka","KS","39.042939","-95.769657","-6","1"
+"66634","Topeka","KS","39.042939","-95.769657","-6","1"
+"66635","St. George","KS","39.199103","-96.43889","-6","1"
+"66636","Topeka","KS","39.042939","-95.769657","-6","1"
+"66637","Topeka","KS","39.042939","-95.769657","-6","1"
+"66638","Topeka","KS","39.042939","-95.769657","-6","1"
+"66642","Topeka","KS","39.042939","-95.769657","-6","1"
+"66647","Topeka","KS","39.042939","-95.769657","-6","1"
+"66650","Powhattan","KS","39.672989","-95.788948","-6","1"
+"66652","Topeka","KS","39.042939","-95.769657","-6","1"
+"66653","Topeka","KS","39.042939","-95.769657","-6","1"
+"66658","Topeka","KS","39.042939","-95.769657","-6","1"
+"66667","Topeka","KS","39.042939","-95.769657","-6","1"
+"66675","Topeka","KS","39.042939","-95.769657","-6","1"
+"66683","Topeka","KS","39.042939","-95.769657","-6","1"
+"66686","Topeka","KS","39.042939","-95.769657","-6","1"
+"66692","Topeka","KS","39.042939","-95.769657","-6","1"
+"66699","Topeka","KS","39.042939","-95.769657","-6","1"
+"66701","Fort Scott","KS","37.823295","-94.73389","-6","1"
+"66710","Altoona","KS","37.551596","-95.65671","-6","1"
+"66711","Arcadia","KS","37.644301","-94.64895","-6","1"
+"66712","Arma","KS","37.547763","-94.70622","-6","1"
+"66713","Baxter Springs","KS","37.026091","-94.74929","-6","1"
+"66714","Benedict","KS","37.628076","-95.73245","-6","1"
+"66716","Bronson","KS","37.916575","-95.07063","-6","1"
+"66717","Buffalo","KS","37.705016","-95.69832","-6","1"
+"66720","Chanute","KS","37.666078","-95.45681","-6","1"
+"66721","Lincoln","KS","37.59292","-94.729782","-6","1"
+"66724","Cherokee","KS","37.347065","-94.82665","-6","1"
+"66725","Columbus","KS","37.17473","-94.87713","-6","1"
+"66727","Coyville","KS","37.559151","-95.743835","-6","1"
+"66728","Crestline","KS","37.16944","-94.704133","-6","1"
+"66732","Elsmore","KS","37.799021","-95.18806","-6","1"
+"66733","Erie","KS","37.594166","-95.24755","-6","1"
+"66734","Farlington","KS","37.616393","-94.82712","-6","1"
+"66735","Franklin","KS","37.522439","-94.70402","-6","1"
+"66736","Fredonia","KS","37.539672","-95.84307","-6","1"
+"66738","Fulton","KS","38.01707","-94.71256","-6","1"
+"66739","Galena","KS","37.091398","-94.65462","-6","1"
+"66740","Galesburg","KS","37.464733","-95.37039","-6","1"
+"66741","Arcadia","KS","37.726754","-94.65864","-6","1"
+"66742","Gas","KS","37.923162","-95.346697","-6","1"
+"66743","Girard","KS","37.506616","-94.86078","-6","1"
+"66746","Hepler","KS","37.66749","-94.95144","-6","1"
+"66747","Neodesha","KS","37.424622","-95.681454","-6","1"
+"66748","Humboldt","KS","37.802718","-95.43452","-6","1"
+"66749","Iola","KS","37.926666","-95.39695","-6","1"
+"66751","La Harpe","KS","37.918044","-95.2947","-6","1"
+"66752","Ross","KS","37.332679","-94.977587","-6","1"
+"66753","McCune","KS","37.364275","-95.00432","-6","1"
+"66754","Mapleton","KS","38.017205","-94.8929","-6","1"
+"66755","Moran","KS","37.933658","-95.16768","-6","1"
+"66756","Mulberry","KS","37.554735","-94.63283","-6","1"
+"66757","Neodesha","KS","37.420016","-95.683","-6","1"
+"66758","Neosho Falls","KS","38.005429","-95.56976","-6","1"
+"66759","New Albany","KS","37.568611","-95.93926","-6","1"
+"66760","Opolis","KS","37.344142","-94.62156","-6","1"
+"66761","Piqua","KS","37.900385","-95.56255","-6","1"
+"66762","Pittsburg","KS","37.408511","-94.70414","-6","1"
+"66763","Frontenac","KS","37.455819","-94.69088","-6","1"
+"66767","Prescott","KS","38.066976","-94.69495","-6","1"
+"66769","Redfield","KS","37.840828","-94.89202","-6","1"
+"66770","Riverton","KS","37.074648","-94.71538","-6","1"
+"66771","Saint Paul","KS","37.500157","-95.15952","-6","1"
+"66772","Savonburg","KS","37.75459","-95.18816","-6","1"
+"66773","Scammon","KS","37.27522","-94.82738","-6","1"
+"66775","Stark","KS","37.691117","-95.14826","-6","1"
+"66776","Thayer","KS","37.478331","-95.48417","-6","1"
+"66777","Toronto","KS","37.777886","-95.93877","-6","1"
+"66778","Treece","KS","37.000262","-94.84372","-6","1"
+"66779","Uniontown","KS","37.848943","-94.97218","-6","1"
+"66780","Walnut","KS","37.603419","-95.06279","-6","1"
+"66781","Weir","KS","37.300262","-94.75259","-6","1"
+"66782","West Mineral","KS","37.284559","-94.92613","-6","1"
+"66783","Yates Center","KS","37.873778","-95.7313","-6","1"
+"66801","Emporia","KS","38.410549","-96.19736","-6","1"
+"66804","Bern","KS","39.964236","-95.972744","-6","1"
+"66830","Admire","KS","38.614057","-96.08821","-6","1"
+"66833","Allen","KS","38.672825","-96.16385","-6","1"
+"66834","Alta Vista","KS","38.862376","-96.47367","-6","1"
+"66835","Americus","KS","38.513771","-96.25853","-6","1"
+"66838","Burdick","KS","38.536957","-96.78484","-6","1"
+"66839","Burlington","KS","38.211108","-95.74293","-6","1"
+"66840","Burns","KS","38.064497","-96.89128","-6","1"
+"66842","Cassoday","KS","38.018802","-96.66349","-6","1"
+"66843","Cedar Point","KS","38.224172","-96.77229","-6","1"
+"66845","Cottonwood Falls","KS","38.344157","-96.52969","-6","1"
+"66846","Council Grove","KS","38.649811","-96.49331","-6","1"
+"66849","Dwight","KS","38.877563","-96.58981","-6","1"
+"66850","Elmdale","KS","38.395027","-96.69377","-6","1"
+"66851","Florence","KS","38.228452","-96.92825","-6","1"
+"66852","Gridley","KS","38.078496","-95.89505","-6","1"
+"66853","Hamilton","KS","38.000062","-96.21271","-6","1"
+"66854","Hartford","KS","38.281776","-95.9686","-6","1"
+"66855","Lamont","KS","37.888276","-96.242059","-6","1"
+"66856","Lebo","KS","38.427161","-95.82627","-6","1"
+"66857","Le Roy","KS","38.095388","-95.63461","-6","1"
+"66858","Lincolnville","KS","38.473549","-96.95611","-6","1"
+"66859","Lost Springs","KS","38.556941","-96.96494","-6","1"
+"66860","Madison","KS","38.126728","-96.16635","-6","1"
+"66861","Marion","KS","38.359189","-97.01768","-6","1"
+"66862","Matfield Green","KS","38.14969","-96.51545","-6","1"
+"66863","Neal","KS","37.831349","-96.07111","-6","1"
+"66864","Neosho Rapids","KS","38.368683","-95.98917","-6","1"
+"66865","Olpe","KS","38.241502","-96.20048","-6","1"
+"66866","Peabody","KS","38.175115","-97.1049","-6","1"
+"66868","Reading","KS","38.532132","-95.97685","-6","1"
+"66869","Strong City","KS","38.415712","-96.50104","-6","1"
+"66870","Virgil","KS","37.925128","-96.00967","-6","1"
+"66871","Waverly","KS","38.382581","-95.62641","-6","1"
+"66872","White City","KS","38.79144","-96.73809","-6","1"
+"66873","Wilsey","KS","38.682093","-96.663865","-6","1"
+"66901","Concordia","KS","39.568803","-97.64627","-6","1"
+"66930","Agenda","KS","39.718857","-97.49191","-6","1"
+"66932","Athol","KS","39.761524","-98.92213","-6","1"
+"66933","Barnes","KS","39.675346","-96.87232","-6","1"
+"66935","Belleville","KS","39.824657","-97.62881","-6","1"
+"66936","Burr Oak","KS","39.908065","-98.29451","-6","1"
+"66937","Clifton","KS","39.594163","-97.26295","-6","1"
+"66938","Clyde","KS","39.594485","-97.40544","-6","1"
+"66939","Courtland","KS","39.837438","-97.90386","-6","1"
+"66940","Cuba","KS","39.81884","-97.44917","-6","1"
+"66941","Esbon","KS","39.827165","-98.44356","-6","1"
+"66942","Formoso","KS","39.791338","-97.9986","-6","1"
+"66943","Greenleaf","KS","39.688224","-96.96583","-6","1"
+"66944","Haddam","KS","39.841886","-97.30119","-6","1"
+"66945","Hanover","KS","39.888945","-96.88156","-6","1"
+"66946","Hollenberg","KS","39.968115","-96.98906","-6","1"
+"66948","Jamestown","KS","39.609023","-97.84511","-6","1"
+"66949","Jewell","KS","39.652106","-98.18519","-6","1"
+"66951","Kensington","KS","39.792636","-99.03877","-6","1"
+"66952","Lebanon","KS","39.835476","-98.58668","-6","1"
+"66953","Linn","KS","39.689909","-97.10565","-6","1"
+"66955","Mahaska","KS","39.966106","-97.3249","-6","1"
+"66956","Mankato","KS","39.790935","-98.20722","-6","1"
+"66958","Morrowville","KS","39.883769","-97.16491","-6","1"
+"66959","Munden","KS","39.933522","-97.53242","-6","1"
+"66960","Narka","KS","39.934395","-97.42125","-6","1"
+"66961","Norway","KS","39.827894","-97.650902","-6","1"
+"66962","Palmer","KS","39.618962","-97.13434","-6","1"
+"66963","Randall","KS","39.633913","-98.02957","-6","1"
+"66964","Republic","KS","39.931181","-97.81023","-6","1"
+"66966","Scandia","KS","39.776903","-97.76394","-6","1"
+"66967","Smith Center","KS","39.794538","-98.79561","-6","1"
+"66968","Washington","KS","39.815522","-97.06111","-6","1"
+"66969","Scandia","KS","39.798339","-97.783181","-6","1"
+"66970","Webber","KS","39.936773","-98.04227","-6","1"
+"66998","Buffalo","KS","39.588426","-97.788817","-6","1"
+"67001","Andale","KS","37.779021","-97.62602","-6","1"
+"67002","Andover","KS","37.693585","-97.11321","-6","1"
+"67003","Anthony","KS","37.144088","-98.03857","-6","1"
+"67004","Argonia","KS","37.270346","-97.76478","-6","1"
+"67005","Arkansas City","KS","37.067387","-97.02831","-6","1"
+"67008","Atlanta","KS","37.454925","-96.83152","-6","1"
+"67009","Attica","KS","37.233697","-98.24779","-6","1"
+"67010","Augusta","KS","37.68066","-96.98153","-6","1"
+"67012","Beaumont","KS","37.660135","-96.53372","-6","1"
+"67013","Belle Plaine","KS","37.390809","-97.29152","-6","1"
+"67016","Bentley","KS","37.886437","-97.51828","-6","1"
+"67017","Benton","KS","37.818158","-97.10839","-6","1"
+"67018","Bluff City","KS","37.076529","-97.87011","-6","1"
+"67019","Burden","KS","37.314208","-96.78463","-6","1"
+"67020","Burrton","KS","38.008128","-97.67008","-6","1"
+"67021","Byers","KS","37.784193","-98.89486","-6","1"
+"67022","Caldwell","KS","37.062453","-97.60782","-6","1"
+"67023","Cambridge","KS","37.327404","-96.65629","-6","1"
+"67024","Cedar Vale","KS","37.104057","-96.48447","-6","1"
+"67025","Cheney","KS","37.647611","-97.78765","-6","1"
+"67026","Clearwater","KS","37.518342","-97.49452","-6","1"
+"67028","Coats","KS","37.469499","-98.93543","-6","1"
+"67029","Coldwater","KS","37.259332","-99.33385","-6","1"
+"67030","Colwich","KS","37.787206","-97.54135","-6","1"
+"67031","Conway Springs","KS","37.400431","-97.65338","-6","1"
+"67033","Richland","KS","37.519257","-97.152533","-6","1"
+"67035","Cunningham","KS","37.655003","-98.39643","-6","1"
+"67036","Danville","KS","37.298982","-97.87357","-6","1"
+"67037","Derby","KS","37.557434","-97.25167","-6","1"
+"67038","Dexter","KS","37.150816","-96.7426","-6","1"
+"67039","Douglass","KS","37.513371","-96.99851","-6","1"
+"67041","Elbing","KS","38.054115","-97.12711","-6","1"
+"67042","El Dorado","KS","37.830417","-96.84294","-6","1"
+"67045","Eureka","KS","37.854192","-96.32433","-6","1"
+"67047","Fall River","KS","37.64248","-96.07105","-6","1"
+"67049","Freeport","KS","37.173305","-97.84835","-6","1"
+"67050","Garden Plain","KS","37.663743","-97.68539","-6","1"
+"67051","Geuda Springs","KS","37.104798","-97.19239","-6","1"
+"67052","Goddard","KS","37.651845","-97.5739","-6","1"
+"67053","Goessel","KS","38.246972","-97.34817","-6","1"
+"67054","Greensburg","KS","37.590146","-99.29989","-6","1"
+"67055","Greenwich","KS","37.78335","-97.205419","-6","1"
+"67056","Halstead","KS","38.007112","-97.5139","-6","1"
+"67057","Hardtner","KS","37.041728","-98.67631","-6","1"
+"67058","Harper","KS","37.297898","-98.03916","-6","1"
+"67059","Haviland","KS","37.658761","-99.09672","-6","1"
+"67060","Haysville","KS","37.552425","-97.34785","-6","1"
+"67061","Hazelton","KS","37.088979","-98.37544","-6","1"
+"67062","Hesston","KS","38.142541","-97.43368","-6","1"
+"67063","Hillsboro","KS","38.347058","-97.21489","-6","1"
+"67065","Isabel","KS","37.461079","-98.54262","-6","1"
+"67066","Iuka","KS","37.746879","-98.75308","-6","1"
+"67067","Kechi","KS","37.795395","-97.27309","-6","1"
+"67068","Kingman","KS","37.618339","-98.10612","-6","1"
+"67069","Ninnescah","KS","37.5731","-98.23619","-6","1"
+"67070","Kiowa","KS","37.037218","-98.49342","-6","1"
+"67071","Lake City","KS","37.316336","-98.83859","-6","1"
+"67072","Latham","KS","37.561112","-96.59795","-6","1"
+"67073","Lehigh","KS","38.376681","-97.31611","-6","1"
+"67074","Leon","KS","37.686034","-96.7069","-6","1"
+"67101","Maize","KS","37.775593","-97.46797","-6","1"
+"67102","Maple City","KS","37.043519","-96.75924","-6","1"
+"67103","Mayfield","KS","37.26475","-97.55569","-6","1"
+"67104","Medicine Lodge","KS","37.286936","-98.60271","-6","1"
+"67105","Milan","KS","37.251663","-97.66554","-6","1"
+"67106","Milton","KS","37.447829","-97.75943","-6","1"
+"67107","Moundridge","KS","38.193313","-97.52827","-6","1"
+"67108","Mount Hope","KS","37.831684","-97.67462","-6","1"
+"67109","Mullinville","KS","37.581777","-99.47608","-6","1"
+"67110","Mulvane","KS","37.474542","-97.22812","-6","1"
+"67111","Murdock","KS","37.625625","-97.92699","-6","1"
+"67112","Nashville","KS","37.442074","-98.41625","-6","1"
+"67114","Newton","KS","38.051679","-97.323","-6","1"
+"67117","North Newton","KS","38.073865","-97.34635","-6","1"
+"67118","Norwich","KS","37.460764","-97.85182","-6","1"
+"67119","Oxford","KS","37.253486","-97.18161","-6","1"
+"67120","Peck","KS","37.459433","-97.3804","-6","1"
+"67122","Piedmont","KS","37.629754","-96.40529","-6","1"
+"67123","Potwin","KS","37.946174","-97.01423","-6","1"
+"67124","Pratt","KS","37.642738","-98.75394","-6","1"
+"67127","Protection","KS","37.196316","-99.50499","-6","1"
+"67128","Rago","KS","37.436662","-98.03131","-6","1"
+"67131","Rock","KS","37.42198","-97.00329","-6","1"
+"67132","Rosalia","KS","37.813869","-96.57856","-6","1"
+"67133","Rose Hill","KS","37.573226","-97.12421","-6","1"
+"67134","Sawyer","KS","37.494728","-98.68324","-6","1"
+"67135","Sedgwick","KS","37.921185","-97.44004","-6","1"
+"67137","Severy","KS","37.647292","-96.22324","-6","1"
+"67138","Sharon","KS","37.253964","-98.41429","-6","1"
+"67140","South Haven","KS","37.065497","-97.36562","-6","1"
+"67142","Spivey","KS","37.468889","-98.21584","-6","1"
+"67143","Sun City","KS","37.363445","-98.96044","-6","1"
+"67144","Towanda","KS","37.804776","-97.01477","-6","1"
+"67146","Udall","KS","37.395382","-97.10432","-6","1"
+"67147","Valley Center","KS","37.853935","-97.33059","-6","1"
+"67149","Viola","KS","37.538257","-97.62031","-6","1"
+"67150","Waldron","KS","37.026317","-98.20814","-6","1"
+"67151","Walton","KS","38.13467","-97.25509","-6","1"
+"67152","Wellington","KS","37.268972","-97.41247","-6","1"
+"67154","Whitewater","KS","37.963712","-97.12193","-6","1"
+"67155","Wilmore","KS","37.34323","-99.14364","-6","1"
+"67156","Winfield","KS","37.256575","-96.97885","-6","1"
+"67159","Zenda","KS","37.422585","-98.30304","-6","1"
+"67201","Wichita","KS","37.651974","-97.258997","-6","1"
+"67202","Wichita","KS","37.686992","-97.33362","-6","1"
+"67203","Wichita","KS","37.703932","-97.36237","-6","1"
+"67204","Wichita","KS","37.754443","-97.35763","-6","1"
+"67205","Wichita","KS","37.738348","-97.42917","-6","1"
+"67206","Wichita","KS","37.703247","-97.23166","-6","1"
+"67207","Wichita","KS","37.669803","-97.23289","-6","1"
+"67208","Wichita","KS","37.701997","-97.28114","-6","1"
+"67209","Wichita","KS","37.67129","-97.4372","-6","1"
+"67210","Wichita","KS","37.638946","-97.26652","-6","1"
+"67211","Wichita","KS","37.667175","-97.31917","-6","1"
+"67212","Wichita","KS","37.700632","-97.4343","-6","1"
+"67213","Wichita","KS","37.669067","-97.36204","-6","1"
+"67214","Wichita","KS","37.705384","-97.31777","-6","1"
+"67215","Wichita","KS","37.626676","-97.42398","-6","1"
+"67216","Wichita","KS","37.619858","-97.31751","-6","1"
+"67217","Wichita","KS","37.62421","-97.36312","-6","1"
+"67218","Wichita","KS","37.670092","-97.27953","-6","1"
+"67219","Wichita","KS","37.765919","-97.31997","-6","1"
+"67220","Wichita","KS","37.745561","-97.27841","-6","1"
+"67221","McConnell A F B","KS","37.628158","-97.26626","-6","1"
+"67222","Wichita","KS","37.751267","-97.262371","-6","1"
+"67223","Wichita","KS","37.73674","-97.499","-6","1"
+"67226","Wichita","KS","37.750904","-97.23115","-6","1"
+"67227","Wichita","KS","37.62812","-97.491566","-6","1"
+"67228","Wichita","KS","37.774174","-97.171098","-6","1"
+"67230","Wichita","KS","37.683392","-97.1706","-6","1"
+"67231","Wichita","KS","37.556692","-97.410154","-6","1"
+"67232","Wichita","KS","37.639491","-97.171372","-6","1"
+"67233","Wichita","KS","37.568951","-97.33449","-6","1"
+"67235","Wichita","KS","37.692778","-97.4959","-6","1"
+"67236","Wichita","KS","37.542182","-97.287134","-6","1"
+"67251","Wichita","KS","37.693588","-97.480419","-6","1"
+"67256","Wichita","KS","37.693588","-97.480419","-6","1"
+"67257","Wichita","KS","37.693588","-97.480419","-6","1"
+"67259","Wichita","KS","37.693588","-97.480419","-6","1"
+"67260","Wichita","KS","37.693588","-97.480419","-6","1"
+"67275","Wichita","KS","37.693588","-97.480419","-6","1"
+"67276","Wichita","KS","37.693588","-97.480419","-6","1"
+"67277","Wichita","KS","37.693588","-97.480419","-6","1"
+"67278","Wichita","KS","37.693588","-97.480419","-6","1"
+"67301","Independence","KS","37.216856","-95.72898","-6","1"
+"67330","Altamont","KS","37.180641","-95.30389","-6","1"
+"67332","Bartlett","KS","37.051587","-95.2227","-6","1"
+"67333","Caney","KS","37.021498","-95.91616","-6","1"
+"67334","Chautauqua","KS","37.026172","-96.17845","-6","1"
+"67335","Cherryvale","KS","37.278991","-95.54722","-6","1"
+"67336","Chetopa","KS","37.047431","-95.08365","-6","1"
+"67337","Coffeyville","KS","37.041838","-95.61814","-6","1"
+"67339","Howard","KS","37.050156","-95.504561","-6","1"
+"67340","Dearing","KS","37.058083","-95.70982","-6","1"
+"67341","Dennis","KS","37.347626","-95.41692","-6","1"
+"67342","Edna","KS","37.059559","-95.356","-6","1"
+"67344","Elk City","KS","37.279439","-95.93171","-6","1"
+"67345","Elk Falls","KS","37.37477","-96.19019","-6","1"
+"67346","Grenola","KS","37.326384","-96.43368","-6","1"
+"67347","Havana","KS","37.103604","-95.9426","-6","1"
+"67349","Howard","KS","37.479165","-96.26594","-6","1"
+"67351","Liberty","KS","37.135671","-95.58247","-6","1"
+"67352","Longton","KS","37.376701","-96.07025","-6","1"
+"67353","Moline","KS","37.337559","-96.29965","-6","1"
+"67354","Mound Valley","KS","37.200877","-95.41003","-6","1"
+"67355","Niotaze","KS","37.053112","-96.01065","-6","1"
+"67356","Oswego","KS","37.182538","-95.13678","-6","1"
+"67357","Parsons","KS","37.339913","-95.25834","-6","1"
+"67360","Peru","KS","37.074399","-96.09053","-6","1"
+"67361","Sedan","KS","37.107867","-96.22087","-6","1"
+"67363","Sycamore","KS","37.327608","-95.71842","-6","1"
+"67364","Tyro","KS","37.035742","-95.82167","-6","1"
+"67401","Salina","KS","38.827875","-97.61553","-6","1"
+"67402","Salina","KS","38.78359","-97.650446","-6","1"
+"67410","Abilene","KS","38.94112","-97.21973","-6","1"
+"67411","Fairview","KS","37.872226","-97.005915","-6","1"
+"67416","Assaria","KS","38.674468","-97.59811","-6","1"
+"67417","Aurora","KS","39.433975","-97.54588","-6","1"
+"67418","Barnard","KS","39.18871","-98.04615","-6","1"
+"67419","Union","KS","38.362379","-97.944818","-6","1"
+"67420","Beloit","KS","39.440546","-98.07736","-6","1"
+"67422","Bennington","KS","39.03407","-97.58943","-6","1"
+"67423","Beverly","KS","38.980027","-97.97921","-6","1"
+"67425","Brookville","KS","38.813761","-97.9286","-6","1"
+"67427","Bushton","KS","38.50978","-98.39638","-6","1"
+"67428","Canton","KS","38.369576","-97.41789","-6","1"
+"67430","Cawker City","KS","39.520894","-98.43768","-6","1"
+"67431","Chapman","KS","38.959448","-97.01425","-6","1"
+"67432","Clay Center","KS","39.341513","-97.1552","-6","1"
+"67435","Sedan","KS","37.125692","-96.190914","-6","1"
+"67436","Delphos","KS","39.26795","-97.73798","-6","1"
+"67437","Downs","KS","39.50357","-98.55591","-6","1"
+"67438","Durham","KS","38.499781","-97.27114","-6","1"
+"67439","Ellsworth","KS","38.744056","-98.22729","-6","1"
+"67441","Enterprise","KS","38.894257","-97.11391","-6","1"
+"67442","Falun","KS","38.660286","-97.75005","-6","1"
+"67443","Galva","KS","38.372202","-97.53229","-6","1"
+"67444","Geneseo","KS","38.527035","-98.1392","-6","1"
+"67445","Glasco","KS","39.367111","-97.82634","-6","1"
+"67446","Glen Elder","KS","39.503154","-98.3031","-6","1"
+"67447","Green","KS","39.475173","-96.99137","-6","1"
+"67448","Gypsum","KS","38.657542","-97.40005","-6","1"
+"67449","Herington","KS","38.677306","-96.92129","-6","1"
+"67450","Holyrood","KS","38.61616","-98.43104","-6","1"
+"67451","Hope","KS","38.689794","-97.12005","-6","1"
+"67452","Hunter","KS","39.229204","-98.38455","-6","1"
+"67454","Kanopolis","KS","38.703443","-98.13731","-6","1"
+"67455","Lincoln","KS","39.034792","-98.17577","-6","1"
+"67456","Lindsborg","KS","38.590743","-97.67156","-6","1"
+"67457","Little River","KS","38.40198","-98.00626","-6","1"
+"67458","Longford","KS","39.171661","-97.30594","-6","1"
+"67459","Lorraine","KS","38.57504","-98.33675","-6","1"
+"67460","Mcpherson","KS","38.367298","-97.67719","-6","1"
+"67464","Marquette","KS","38.590489","-97.89512","-6","1"
+"67466","Miltonvale","KS","39.342965","-97.47176","-6","1"
+"67467","Minneapolis","KS","39.131275","-97.70794","-6","1"
+"67468","Morganville","KS","39.459244","-97.22525","-6","1"
+"67470","New Cambria","KS","38.891137","-97.51114","-6","1"
+"67472","Chapman","KS","39.248278","-97.410025","-6","1"
+"67473","Osborne","KS","39.409385","-98.7059","-6","1"
+"67474","Portis","KS","39.579664","-98.70224","-6","1"
+"67475","Ramona","KS","38.596837","-97.05274","-6","1"
+"67476","Roxbury","KS","38.391722","-97.648402","-6","1"
+"67478","Simpson","KS","39.384449","-97.93323","-6","1"
+"67479","Smolan","KS","38.702546","-97.642827","-6","1"
+"67480","Solomon","KS","38.950725","-97.39924","-6","1"
+"67481","Sylvan Grove","KS","39.023406","-98.40165","-6","1"
+"67482","Talmage","KS","39.027261","-97.25917","-6","1"
+"67483","Tampa","KS","38.538684","-97.15947","-6","1"
+"67484","Tescott","KS","38.998387","-97.83261","-6","1"
+"67485","Tipton","KS","39.32071","-98.50294","-6","1"
+"67487","Wakefield","KS","39.180886","-97.04513","-6","1"
+"67488","Durham","KS","39.188023","-97.435986","-6","1"
+"67490","Wilson","KS","38.817788","-98.44972","-6","1"
+"67491","Windom","KS","38.367098","-97.89977","-6","1"
+"67492","Woodbine","KS","38.807138","-96.9568","-6","1"
+"67495","Tipton","KS","39.339801","-98.470661","-6","1"
+"67501","Hutchinson","KS","38.034292","-97.92382","-6","1"
+"67502","Hutchinson","KS","38.094945","-97.929","-6","1"
+"67504","Hutchinson","KS","37.953219","-98.085924","-6","1"
+"67505","South Hutchinson","KS","38.027185","-97.93976","-6","1"
+"67510","Abbyville","KS","37.992099","-98.22479","-6","1"
+"67511","Albert","KS","38.442368","-99.04195","-6","1"
+"67512","Alden","KS","38.238827","-98.31957","-6","1"
+"67513","Alexander","KS","38.446509","-99.53906","-6","1"
+"67514","Arlington","KS","37.876541","-98.18757","-6","1"
+"67515","Arnold","KS","38.674455","-100.05532","-6","1"
+"67516","Bazine","KS","38.400425","-99.68699","-6","1"
+"67518","Beeler","KS","38.427837","-100.16811","-6","1"
+"67519","Belpre","KS","37.947324","-99.10017","-6","1"
+"67520","Bison","KS","38.573848","-99.18943","-6","1"
+"67521","Brownell","KS","38.618706","-99.74865","-6","1"
+"67522","Buhler","KS","38.122234","-97.74843","-6","1"
+"67523","Burdett","KS","38.200452","-99.54314","-6","1"
+"67524","Chase","KS","38.360414","-98.37397","-6","1"
+"67525","Claflin","KS","38.555566","-98.56309","-6","1"
+"67526","Ellinwood","KS","38.347872","-98.56205","-6","1"
+"67529","Garfield","KS","38.070818","-99.2477","-6","1"
+"67530","Great Bend","KS","38.363151","-98.78495","-6","1"
+"67543","Haven","KS","37.898787","-97.79101","-6","1"
+"67544","Hoisington","KS","38.562172","-98.76647","-6","1"
+"67545","Hudson","KS","38.15141","-98.64732","-6","1"
+"67546","Inman","KS","38.224457","-97.80321","-6","1"
+"67547","Kinsley","KS","37.918313","-99.43134","-6","1"
+"67548","La Crosse","KS","38.560733","-99.3193","-6","1"
+"67550","Larned","KS","38.179418","-99.12757","-6","1"
+"67552","Lewis","KS","37.876262","-99.23229","-6","1"
+"67553","Liebenthal","KS","38.654948","-99.32062","-6","1"
+"67554","Lyons","KS","38.356474","-98.2025","-6","1"
+"67556","McCracken","KS","38.589291","-99.52231","-6","1"
+"67557","Macksville","KS","37.934689","-98.95861","-6","1"
+"67559","Nekoma","KS","38.41473","-99.44681","-6","1"
+"67560","Ness City","KS","38.443723","-99.92622","-6","1"
+"67561","Nickerson","KS","38.137119","-98.08847","-6","1"
+"67563","Offerle","KS","37.861674","-99.56069","-6","1"
+"67564","Olmitz","KS","38.526757","-98.93228","-6","1"
+"67565","Otis","KS","38.587486","-99.04206","-6","1"
+"67566","Partridge","KS","37.953609","-98.10291","-6","1"
+"67567","Pawnee Rock","KS","38.262021","-98.97856","-6","1"
+"67568","Plevna","KS","38.006382","-98.31657","-6","1"
+"67570","Pretty Prairie","KS","37.784834","-97.98231","-6","1"
+"67572","Ransom","KS","38.660733","-99.90598","-6","1"
+"67573","Raymond","KS","38.278487","-98.41672","-6","1"
+"67574","Rozel","KS","38.193997","-99.40331","-6","1"
+"67575","Rush Center","KS","38.445884","-99.26298","-6","1"
+"67576","Saint John","KS","38.014216","-98.79487","-6","1"
+"67578","Stafford","KS","37.976752","-98.59126","-6","1"
+"67579","Sterling","KS","38.19784","-98.20222","-6","1"
+"67581","Sylvia","KS","37.967166","-98.41303","-6","1"
+"67583","Turon","KS","37.804591","-98.45617","-6","1"
+"67584","Utica","KS","38.669493","-100.19251","-6","1"
+"67585","Yoder","KS","37.94119","-97.871147","-6","1"
+"67601","Hays","KS","38.881082","-99.32559","-6","1"
+"67621","Agra","KS","39.792611","-99.13229","-6","1"
+"67622","Almena","KS","39.891365","-99.72471","-6","1"
+"67623","Alton","KS","39.461403","-98.95757","-6","1"
+"67625","Bogue","KS","39.360896","-99.68559","-6","1"
+"67626","Bunker Hill","KS","38.86913","-98.70904","-6","1"
+"67627","Catharine","KS","38.927648","-99.216051","-6","1"
+"67628","Cedar","KS","39.647706","-98.96837","-6","1"
+"67629","Clayton","KS","39.707176","-100.17544","-6","1"
+"67630","Belleville","KS","37.097273","-96.100176","-6","1"
+"67631","Collyer","KS","39.028141","-100.08722","-6","1"
+"67632","Damar","KS","39.336054","-99.60749","-6","1"
+"67634","Dorrance","KS","38.834958","-98.60426","-6","1"
+"67635","Dresden","KS","39.610945","-100.45129","-6","1"
+"67637","Ellis","KS","38.933306","-99.60135","-6","1"
+"67638","Gaylord","KS","39.640967","-98.84528","-6","1"
+"67639","Glade","KS","39.652794","-99.30712","-6","1"
+"67640","Gorham","KS","38.878181","-99.03432","-6","1"
+"67642","Hill City","KS","39.360338","-99.8456","-6","1"
+"67643","Jennings","KS","39.676204","-100.29331","-6","1"
+"67644","Kirwin","KS","39.644576","-99.1437","-6","1"
+"67645","Lenora","KS","39.609655","-99.91904","-6","1"
+"67646","Logan","KS","39.65573","-99.59094","-6","1"
+"67647","Long Island","KS","39.947283","-99.53467","-6","1"
+"67648","Lucas","KS","39.059815","-98.55613","-6","1"
+"67649","Luray","KS","39.120158","-98.69182","-6","1"
+"67650","Morland","KS","39.359896","-100.08518","-6","1"
+"67651","Natoma","KS","39.202987","-99.04018","-6","1"
+"67653","Norcatur","KS","39.907372","-100.20732","-6","1"
+"67654","Norton","KS","39.822766","-99.93288","-6","1"
+"67656","Ogallah","KS","38.989828","-99.75144","-6","1"
+"67657","Palco","KS","39.22742","-99.61488","-6","1"
+"67658","Paradise","KS","39.118835","-98.91517","-6","1"
+"67659","Penokee","KS","39.301053","-99.98755","-6","1"
+"67660","Pfeifer","KS","38.704467","-99.1815","-6","1"
+"67661","Phillipsburg","KS","39.799834","-99.32852","-6","1"
+"67663","Plainville","KS","39.212784","-99.31688","-6","1"
+"67664","Prairie View","KS","39.823946","-99.56002","-6","1"
+"67665","Russell","KS","38.866551","-98.8672","-6","1"
+"67666","Towanda","KS","39.684032","-99.598374","-6","1"
+"67667","Schoenchen","KS","38.711024","-99.33117","-6","1"
+"67669","Stockton","KS","39.436461","-99.32578","-6","1"
+"67670","Stuttgart","KS","39.799148","-99.45494","-6","1"
+"67671","Victoria","KS","38.861194","-99.15047","-6","1"
+"67672","Wa Keeney","KS","39.015522","-99.89944","-6","1"
+"67673","Waldo","KS","39.166845","-98.79762","-6","1"
+"67674","Walker","KS","38.868064","-99.07886","-6","1"
+"67675","Woodston","KS","39.450984","-99.09119","-6","1"
+"67701","Colby","KS","39.394701","-101.04485","-6","1"
+"67730","Atwood","KS","39.810204","-101.1109","-6","1"
+"67731","Bird City","KS","39.758864","-101.54448","-6","1"
+"67732","Brewster","KS","39.424782","-101.3533","-6","1"
+"67733","Edson","KS","39.356075","-101.51227","-7","1"
+"67734","Gem","KS","39.488765","-100.89755","-6","1"
+"67735","Goodland","KS","39.332837","-101.75422","-7","1"
+"67736","Gove","KS","38.882722","-100.46085","-6","1"
+"67737","Grainfield","KS","39.117535","-100.47735","-6","1"
+"67738","Grinnell","KS","39.042757","-100.64563","-6","1"
+"67739","Herndon","KS","39.893743","-100.78687","-6","1"
+"67740","Hoxie","KS","39.356622","-100.3861","-6","1"
+"67741","Kanorado","KS","39.358034","-102.00483","-7","1"
+"67743","Levant","KS","39.406853","-101.23341","-6","1"
+"67744","Ludell","KS","39.857038","-100.93866","-6","1"
+"67745","McDonald","KS","39.792736","-101.36332","-6","1"
+"67747","Monument","KS","39.071265","-101.04488","-6","1"
+"67748","Oakley","KS","39.11329","-100.83926","-6","1"
+"67749","Oberlin","KS","39.832075","-100.53872","-6","1"
+"67751","Park","KS","39.116982","-100.35656","-6","1"
+"67752","Quinter","KS","39.038252","-100.2322","-6","1"
+"67753","Rexford","KS","39.40544","-100.74875","-6","1"
+"67756","Saint Francis","KS","39.773872","-101.82167","-6","1"
+"67757","Selden","KS","39.534756","-100.59954","-6","1"
+"67758","Sharon Springs","KS","38.865428","-101.73575","-7","1"
+"67761","Wallace","KS","38.912898","-101.50937","-7","1"
+"67762","Weskan","KS","38.930464","-101.99084","-7","1"
+"67764","Winona","KS","38.942421","-101.20603","-6","1"
+"67801","Dodge City","KS","37.755267","-100.02632","-6","1"
+"67831","Ashland","KS","37.196075","-99.77662","-6","1"
+"67834","Bucklin","KS","37.523175","-99.63435","-6","1"
+"67835","Cimarron","KS","37.84899","-100.32811","-6","1"
+"67836","Coolidge","KS","38.043992","-102.00832","-7","1"
+"67837","Copeland","KS","37.554849","-100.67514","-6","1"
+"67838","Deerfield","KS","38.039676","-101.12571","-6","1"
+"67839","Dighton","KS","38.514924","-100.43776","-6","1"
+"67840","Englewood","KS","37.040749","-99.98903","-6","1"
+"67841","Ensign","KS","37.629346","-100.22704","-6","1"
+"67842","Ford","KS","37.549041","-99.74869","-6","1"
+"67844","Fowler","KS","37.401983","-100.2073","-6","1"
+"67845","Bloom","KS","39.296417","-98.524566","-6","1"
+"67846","Garden City","KS","37.976008","-100.82503","-6","1"
+"67849","Hanston","KS","38.134219","-99.73853","-6","1"
+"67850","Healy","KS","38.591591","-100.62302","-6","1"
+"67851","Holcomb","KS","38.089121","-101.01535","-6","1"
+"67852","Holcomb","KS","37.989353","-100.993268","-6","1"
+"67853","Ingalls","KS","37.842421","-100.49796","-6","1"
+"67854","Jetmore","KS","38.080626","-99.96701","-6","1"
+"67855","Johnson","KS","37.557733","-101.68074","-6","1"
+"67856","Garfield","KS","38.140691","-100.415419","-6","1"
+"67857","Kendall","KS","37.974098","-101.5325","-6","1"
+"67858","Sodville","KS","37.513348","-99.692418","-6","1"
+"67859","Kismet","KS","37.23521","-100.75208","-6","1"
+"67860","Lakin","KS","37.995238","-101.2722","-6","1"
+"67861","Leoti","KS","38.503037","-101.39536","-6","1"
+"67862","Manter","KS","37.585473","-101.91157","-6","1"
+"67863","Marienthal","KS","38.551037","-101.22087","-6","1"
+"67864","Meade","KS","37.21313","-100.34464","-6","1"
+"67865","Minneola","KS","37.394383","-99.96723","-6","1"
+"67867","Montezuma","KS","37.586422","-100.46228","-6","1"
+"67868","Pierceville","KS","37.881899","-100.67849","-6","1"
+"67869","Plains","KS","37.257151","-100.58189","-6","1"
+"67870","Satanta","KS","37.496762","-101.00775","-6","1"
+"67871","Scott City","KS","38.48461","-100.93476","-6","1"
+"67876","Spearville","KS","37.845029","-99.72578","-6","1"
+"67877","Sublette","KS","37.525821","-100.84391","-6","1"
+"67878","Syracuse","KS","38.022874","-101.80781","-7","1"
+"67879","Tribune","KS","38.478369","-101.7871","-7","1"
+"67880","Ulysses","KS","37.569601","-101.33268","-6","1"
+"67882","Wright","KS","37.805301","-99.88021","-6","1"
+"67901","Liberal","KS","37.067979","-100.92813","-6","1"
+"67905","Liberal","KS","37.021641","-100.938049","-6","1"
+"67938","Colfax","KS","39.43042","-97.462993","-6","1"
+"67950","Elkhart","KS","37.011254","-101.88893","-6","1"
+"67951","Hugoton","KS","37.185269","-101.349","-6","1"
+"67952","Moscow","KS","37.30755","-101.18541","-6","1"
+"67953","Richfield","KS","37.23606","-101.83681","-6","1"
+"67954","Rolla","KS","37.163412","-101.61909","-6","1"
+"68001","Abie","NE","41.334744","-96.94965","-6","1"
+"68002","Arlington","NE","41.47502","-96.34446","-6","1"
+"68003","Ashland","NE","41.068476","-96.38189","-6","1"
+"68004","Bancroft","NE","42.009508","-96.62313","-6","1"
+"68005","Bellevue","NE","41.146848","-95.90796","-6","1"
+"68007","Bennington","NE","41.36753","-96.17269","-6","1"
+"68008","Blair","NE","41.538439","-96.14965","-6","1"
+"68009","Blair","NE","41.53827","-96.182295","-6","1"
+"68010","Boys Town","NE","41.25973","-96.12833","-6","1"
+"68014","Bruno","NE","41.28216","-96.9594","-6","1"
+"68015","Cedar Bluffs","NE","41.386373","-96.64986","-6","1"
+"68016","Cedar Creek","NE","41.03664","-96.10884","-6","1"
+"68017","Ceresco","NE","41.064961","-96.64953","-6","1"
+"68018","Colon","NE","41.309443","-96.61679","-6","1"
+"68019","Craig","NE","41.761217","-96.37407","-6","1"
+"68020","Decatur","NE","41.988034","-96.26545","-6","1"
+"68022","Elkhorn","NE","41.274881","-96.24565","-6","1"
+"68023","Fort Calhoun","NE","41.463418","-96.02777","-6","1"
+"68025","Fremont","NE","41.434796","-96.48869","-6","1"
+"68026","Fremont","NE","41.567907","-96.617443","-6","1"
+"68028","Gretna","NE","41.118694","-96.25535","-6","1"
+"68029","Herman","NE","41.665663","-96.25866","-6","1"
+"68030","Homer","NE","42.326727","-96.48475","-6","1"
+"68031","Hooper","NE","41.62307","-96.55172","-6","1"
+"68032","Linwood","NE","41.344868","-96.964345","-6","1"
+"68033","Ithaca","NE","41.134234","-96.5315","-6","1"
+"68034","Kennard","NE","41.465023","-96.2123","-6","1"
+"68035","Leshara","NE","41.330124","-96.42899","-6","1"
+"68036","Linwood","NE","41.391914","-96.96036","-6","1"
+"68037","Louisville","NE","40.992426","-96.14841","-6","1"
+"68038","Lyons","NE","41.948587","-96.45359","-6","1"
+"68039","Macy","NE","42.110959","-96.3393","-6","1"
+"68040","Malmo","NE","41.285973","-96.73951","-6","1"
+"68041","Mead","NE","41.22091","-96.47719","-6","1"
+"68042","Memphis","NE","41.095604","-96.43168","-6","1"
+"68044","Nickerson","NE","41.53608","-96.44999","-6","1"
+"68045","Oakland","NE","41.830827","-96.49444","-6","1"
+"68046","Papillion","NE","41.151899","-96.04484","-6","1"
+"68047","Pender","NE","42.112028","-96.73093","-6","1"
+"68048","Plattsmouth","NE","40.999245","-95.91589","-6","1"
+"68050","Prague","NE","41.309115","-96.83506","-6","1"
+"68054","Richfield","NE","41.108443","-96.07452","-6","1"
+"68055","Rosalie","NE","42.053783","-96.50536","-6","1"
+"68056","St Columbans","NE","41.092703","-96.090546","-6","1"
+"68057","Scribner","NE","41.653831","-96.708","-6","1"
+"68058","South Bend","NE","41.003188","-96.24529","-6","1"
+"68059","Springfield","NE","41.074548","-96.15635","-6","1"
+"68061","Tekamah","NE","41.783203","-96.21577","-6","1"
+"68062","Thurston","NE","42.187938","-96.67747","-6","1"
+"68063","Uehling","NE","41.733433","-96.50454","-6","1"
+"68064","Valley","NE","41.328149","-96.3396","-6","1"
+"68065","Valparaiso","NE","41.077766","-96.84586","-6","1"
+"68066","Wahoo","NE","41.199626","-96.6226","-6","1"
+"68067","Walthill","NE","42.148163","-96.48276","-6","1"
+"68068","Washington","NE","41.396848","-96.20759","-6","1"
+"68069","Waterloo","NE","41.255649","-96.30195","-6","1"
+"68070","Weston","NE","41.200338","-96.78359","-6","1"
+"68071","Winnebago","NE","42.232805","-96.48868","-6","1"
+"68072","Winslow","NE","41.61023","-96.503281","-6","1"
+"68073","Yutan","NE","41.249536","-96.40258","-6","1"
+"68101","Omaha","NE","41.291736","-96.171104","-6","1"
+"68102","Omaha","NE","41.260566","-95.9362","-6","1"
+"68103","Omaha","NE","41.291736","-96.171104","-6","1"
+"68104","Omaha","NE","41.292445","-96.0006","-6","1"
+"68105","Omaha","NE","41.240854","-95.96383","-6","1"
+"68106","Omaha","NE","41.242313","-95.99897","-6","1"
+"68107","Omaha","NE","41.205198","-95.95539","-6","1"
+"68108","Omaha","NE","41.240562","-95.93353","-6","1"
+"68109","Omaha","NE","41.291736","-96.171104","-6","1"
+"68110","Omaha","NE","41.292321","-95.93427","-6","1"
+"68111","Omaha","NE","41.294547","-95.96434","-6","1"
+"68112","Omaha","NE","41.334947","-95.95924","-6","1"
+"68113","Offutt A F B","NE","41.127805","-95.90649","-6","1"
+"68114","Omaha","NE","41.264531","-96.04798","-6","1"
+"68116","Omaha","NE","41.294069","-96.15352","-6","1"
+"68117","Omaha","NE","41.208364","-95.99675","-6","1"
+"68118","Omaha","NE","41.263194","-96.17108","-6","1"
+"68119","Omaha","NE","41.291736","-96.171104","-6","1"
+"68120","Omaha","NE","41.291736","-96.171104","-6","1"
+"68122","Omaha","NE","41.348081","-96.04609","-6","1"
+"68123","Bellevue","NE","41.117337","-95.95126","-6","1"
+"68124","Omaha","NE","41.235064","-96.05073","-6","1"
+"68127","Omaha","NE","41.203029","-96.05009","-6","1"
+"68128","La Vista","NE","41.183458","-96.05318","-6","1"
+"68130","Omaha","NE","41.240036","-96.18017","-6","1"
+"68131","Omaha","NE","41.264418","-95.96383","-6","1"
+"68132","Omaha","NE","41.26565","-95.99741","-6","1"
+"68133","Papillion","NE","41.144085","-96.00547","-6","1"
+"68134","Omaha","NE","41.296748","-96.05181","-6","1"
+"68135","Omaha","NE","41.203791","-96.17862","-6","1"
+"68136","Omaha","NE","41.177298","-96.18662","-6","1"
+"68137","Omaha","NE","41.204631","-96.12108","-6","1"
+"68138","Omaha","NE","41.175935","-96.13394","-6","1"
+"68139","Omaha","NE","41.291736","-96.171104","-6","1"
+"68142","Omaha","NE","41.365763","-96.10608","-6","1"
+"68144","Omaha","NE","41.235248","-96.11505","-6","1"
+"68145","Omaha","NE","41.291736","-96.171104","-6","1"
+"68147","Bellevue","NE","41.179338","-95.95592","-6","1"
+"68152","Omaha","NE","41.344394","-96.00077","-6","1"
+"68154","Omaha","NE","41.264952","-96.11422","-6","1"
+"68155","Omaha","NE","41.291736","-96.171104","-6","1"
+"68157","Omaha","NE","41.182198","-95.99058","-6","1"
+"68164","Omaha","NE","41.296198","-96.11027","-6","1"
+"68172","Omaha","NE","41.291736","-96.171104","-6","1"
+"68175","Omaha","NE","41.291736","-96.171104","-6","1"
+"68176","Omaha","NE","41.291736","-96.171104","-6","1"
+"68178","Omaha","NE","41.291736","-96.171104","-6","1"
+"68179","Omaha","NE","41.291736","-96.171104","-6","1"
+"68180","Omaha","NE","41.291736","-96.171104","-6","1"
+"68181","Omaha","NE","41.291736","-96.171104","-6","1"
+"68182","Omaha","NE","41.291736","-96.171104","-6","1"
+"68183","Omaha","NE","41.291736","-96.171104","-6","1"
+"68198","Omaha","NE","41.291736","-96.171104","-6","1"
+"68226","Central City","NE","41.12044","-97.992289","-6","1"
+"68278","Omaha","NE","41.264333","-95.946368","-6","1"
+"68301","Adams","NE","40.472055","-96.52637","-6","1"
+"68303","Alexandria","NE","40.247793","-97.41164","-6","1"
+"68304","Alvo","NE","40.874192","-96.38842","-6","1"
+"68305","Auburn","NE","40.376356","-95.84422","-6","1"
+"68307","Avoca","NE","40.789284","-96.13068","-6","1"
+"68309","Barneston","NE","40.048634","-96.57326","-6","1"
+"68310","Beatrice","NE","40.264193","-96.74604","-6","1"
+"68313","Beaver Crossing","NE","40.781788","-97.26849","-6","1"
+"68314","Bee","NE","41.009984","-97.03437","-6","1"
+"68315","Belvidere","NE","40.248038","-97.5574","-6","1"
+"68316","Benedict","NE","41.014534","-97.60967","-6","1"
+"68317","Bennet","NE","40.680749","-96.50073","-6","1"
+"68318","Blue Springs","NE","40.14601","-96.66049","-6","1"
+"68319","Bradshaw","NE","40.910954","-97.76081","-6","1"
+"68320","Brock","NE","40.487422","-95.96011","-6","1"
+"68321","Brownville","NE","40.400172","-95.69665","-6","1"
+"68322","Bruning","NE","40.328889","-97.54836","-6","1"
+"68323","Burchard","NE","40.135672","-96.35497","-6","1"
+"68324","Burr","NE","40.549923","-96.29776","-6","1"
+"68325","Byron","NE","40.042191","-97.76979","-6","1"
+"68326","Carleton","NE","40.29141","-97.68109","-6","1"
+"68327","Chester","NE","40.015959","-97.61926","-6","1"
+"68328","Clatonia","NE","40.473614","-96.84511","-6","1"
+"68329","Cook","NE","40.50482","-96.17229","-6","1"
+"68330","Cordova","NE","40.716216","-97.3522","-6","1"
+"68331","Cortland","NE","40.481866","-96.70362","-6","1"
+"68332","Crab Orchard","NE","40.327774","-96.40254","-6","1"
+"68333","Crete","NE","40.620175","-96.96099","-6","1"
+"68335","Davenport","NE","40.29735","-97.81152","-6","1"
+"68336","Davey","NE","40.965773","-96.67667","-6","1"
+"68337","Dawson","NE","40.11127","-95.83868","-6","1"
+"68338","Daykin","NE","40.327793","-97.26389","-6","1"
+"68339","Denton","NE","40.739508","-96.84873","-6","1"
+"68340","Deshler","NE","40.135651","-97.73636","-6","1"
+"68341","De Witt","NE","40.389849","-96.91229","-6","1"
+"68342","Diller","NE","40.105725","-96.93428","-6","1"
+"68343","Dorchester","NE","40.632861","-97.13139","-6","1"
+"68344","Douglas","NE","40.56985","-96.3806","-6","1"
+"68345","Du Bois","NE","40.034277","-96.02099","-6","1"
+"68346","Dunbar","NE","40.666814","-96.02796","-6","1"
+"68347","Eagle","NE","40.805678","-96.4362","-6","1"
+"68348","Elk Creek","NE","40.289859","-96.13044","-6","1"
+"68349","Elmwood","NE","40.837204","-96.29537","-6","1"
+"68350","Endicott","NE","40.061702","-97.07633","-6","1"
+"68351","Exeter","NE","40.652298","-97.43684","-6","1"
+"68352","Fairbury","NE","40.151358","-97.20374","-6","1"
+"68354","Fairmont","NE","40.633747","-97.58041","-6","1"
+"68355","Falls City","NE","40.097217","-95.58631","-6","1"
+"68357","Filley","NE","40.298643","-96.54833","-6","1"
+"68358","Firth","NE","40.533257","-96.60568","-6","1"
+"68359","Friend","NE","40.630445","-97.28305","-6","1"
+"68360","Garland","NE","40.95178","-96.96787","-6","1"
+"68361","Geneva","NE","40.516034","-97.60056","-6","1"
+"68362","Gilead","NE","40.163122","-97.42863","-6","1"
+"68364","Goehner","NE","40.832663","-97.22019","-6","1"
+"68365","Grafton","NE","40.627475","-97.72408","-6","1"
+"68366","Greenwood","NE","40.974167","-96.43555","-6","1"
+"68367","Gresham","NE","41.03937","-97.39671","-6","1"
+"68368","Hallam","NE","40.563073","-96.78914","-6","1"
+"68370","Hebron","NE","40.154291","-97.54895","-6","1"
+"68371","Henderson","NE","40.763846","-97.77856","-6","1"
+"68372","Hickman","NE","40.612736","-96.62295","-6","1"
+"68374","Holmesville","NE","40.211775","-96.64233","-6","1"
+"68375","Hubbell","NE","40.025484","-97.47265","-6","1"
+"68376","Humboldt","NE","40.172733","-95.9426","-6","1"
+"68377","Jansen","NE","40.20808","-97.02445","-6","1"
+"68378","Johnson","NE","40.394814","-96.01864","-6","1"
+"68380","Lewiston","NE","40.242528","-96.40309","-6","1"
+"68381","Liberty","NE","40.081107","-96.4838","-6","1"
+"68382","Lorton","NE","40.653589","-96.086904","-6","1"
+"68401","McCool Junction","NE","40.744844","-97.58296","-6","1"
+"68402","Malcolm","NE","40.918054","-96.84839","-6","1"
+"68403","Manley","NE","40.918749","-96.16547","-6","1"
+"68404","Martell","NE","40.617147","-96.7559","-6","1"
+"68405","Milford","NE","40.772835","-97.05841","-6","1"
+"68406","Milligan","NE","40.501404","-97.39726","-6","1"
+"68407","Murdock","NE","40.912199","-96.24729","-6","1"
+"68409","Murray","NE","40.915826","-95.93611","-6","1"
+"68410","Nebraska City","NE","40.661439","-95.87023","-6","1"
+"68413","Nehawka","NE","40.833188","-96.00315","-6","1"
+"68414","Nemaha","NE","40.32194","-95.67683","-6","1"
+"68415","Odell","NE","40.052388","-96.81761","-6","1"
+"68416","Ohiowa","NE","40.401484","-97.45367","-6","1"
+"68417","Otoe","NE","40.728493","-96.09516","-6","1"
+"68418","Palmyra","NE","40.702467","-96.3845","-6","1"
+"68419","Panama","NE","40.596093","-96.50816","-6","1"
+"68420","Pawnee City","NE","40.106605","-96.15968","-6","1"
+"68421","Peru","NE","40.48863","-95.73152","-6","1"
+"68422","Pickrell","NE","40.385662","-96.71396","-6","1"
+"68423","Pleasant Dale","NE","40.806723","-96.93931","-6","1"
+"68424","Plymouth","NE","40.298729","-97.00106","-6","1"
+"68428","Raymond","NE","40.969816","-96.82364","-6","1"
+"68429","Reynolds","NE","40.059775","-97.380646","-6","1"
+"68430","Roca","NE","40.679251","-96.66579","-6","1"
+"68431","Rulo","NE","40.056628","-95.43297","-6","1"
+"68433","Salem","NE","40.060469","-95.74181","-6","1"
+"68434","Seward","NE","40.909197","-97.11206","-6","1"
+"68436","Shickley","NE","40.43034","-97.73815","-6","1"
+"68437","Shubert","NE","40.240436","-95.63981","-6","1"
+"68438","Sprague","NE","40.626661","-96.745622","-6","1"
+"68439","Staplehurst","NE","40.996127","-97.2052","-6","1"
+"68440","Steele City","NE","40.05097","-97.03057","-6","1"
+"68441","Steinauer","NE","40.224384","-96.24072","-6","1"
+"68442","Stella","NE","40.229899","-95.77517","-6","1"
+"68443","Sterling","NE","40.450262","-96.37773","-6","1"
+"68444","Strang","NE","40.409283","-97.58391","-6","1"
+"68445","Swanton","NE","40.400494","-97.09357","-6","1"
+"68446","Syracuse","NE","40.656899","-96.18201","-6","1"
+"68447","Table Rock","NE","40.188015","-96.08978","-6","1"
+"68448","Talmage","NE","40.537185","-96.02353","-6","1"
+"68450","Tecumseh","NE","40.373895","-96.2097","-6","1"
+"68452","Ong","NE","40.394354","-97.84507","-6","1"
+"68453","Tobias","NE","40.412117","-97.33094","-6","1"
+"68454","Unadilla","NE","40.698235","-96.28913","-6","1"
+"68455","Union","NE","40.820408","-95.89714","-6","1"
+"68456","Utica","NE","40.898329","-97.32084","-6","1"
+"68457","Verdon","NE","40.152937","-95.69982","-6","1"
+"68458","Virginia","NE","40.239986","-96.49182","-6","1"
+"68460","Waco","NE","40.897974","-97.45072","-6","1"
+"68461","Walton","NE","40.764867","-96.53044","-6","1"
+"68462","Waverly","NE","40.924298","-96.52581","-6","1"
+"68463","Weeping Water","NE","40.87142","-96.14188","-6","1"
+"68464","Western","NE","40.410478","-97.20746","-6","1"
+"68465","Wilber","NE","40.487481","-96.99849","-6","1"
+"68466","Wymore","NE","40.087289","-96.65361","-6","1"
+"68467","York","NE","40.865237","-97.58884","-6","1"
+"68501","Lincoln","NE","40.865142","-96.823133","-6","1"
+"68502","Lincoln","NE","40.789051","-96.69589","-6","1"
+"68503","Lincoln","NE","40.823602","-96.67552","-6","1"
+"68504","Lincoln","NE","40.8442","-96.65563","-6","1"
+"68505","Lincoln","NE","40.82655","-96.62564","-6","1"
+"68506","Lincoln","NE","40.785557","-96.64599","-6","1"
+"68507","Lincoln","NE","40.85115","-96.62914","-6","1"
+"68508","Lincoln","NE","40.814191","-96.70744","-6","1"
+"68509","Lincoln","NE","40.784451","-96.688799","-6","1"
+"68510","Lincoln","NE","40.807106","-96.65634","-6","1"
+"68512","Lincoln","NE","40.7448","-96.69574","-6","1"
+"68514","Lincoln","NE","40.940125","-96.662138","-6","1"
+"68516","Lincoln","NE","40.749224","-96.64566","-6","1"
+"68517","Lincoln","NE","40.92185","-96.61495","-6","1"
+"68520","Lincoln","NE","40.798632","-96.59023","-6","1"
+"68521","Lincoln","NE","40.855645","-96.71298","-6","1"
+"68522","Lincoln","NE","40.790601","-96.74974","-6","1"
+"68523","Lincoln","NE","40.740529","-96.76178","-6","1"
+"68524","Lincoln","NE","40.859321","-96.79586","-6","1"
+"68526","Lincoln","NE","40.740833","-96.59122","-6","1"
+"68527","Lincoln","NE","40.849249","-96.53061","-6","1"
+"68528","Lincoln","NE","40.816765","-96.78598","-6","1"
+"68529","Lincoln","NE","40.879752","-96.779796","-6","1"
+"68531","Lincoln","NE","40.900801","-96.720143","-6","1"
+"68532","Lincoln","NE","40.796876","-96.8585","-6","1"
+"68542","Lincoln","NE","40.784451","-96.688799","-6","1"
+"68544","Lincoln","NE","40.784451","-96.688799","-6","1"
+"68572","Lincoln","NE","40.784451","-96.688799","-6","1"
+"68583","Lincoln","NE","40.784451","-96.688799","-6","1"
+"68588","Lincoln","NE","40.820645","-96.692843","-6","1"
+"68601","Columbus","NE","41.437838","-97.37192","-6","1"
+"68602","Columbus","NE","41.53808","-97.541795","-6","1"
+"68620","Albion","NE","41.708281","-98.0246","-6","1"
+"68621","Ames","NE","41.482181","-96.63929","-6","1"
+"68622","Bartlett","NE","41.909737","-98.51413","-6","1"
+"68623","Belgrade","NE","41.441371","-98.1094","-6","1"
+"68624","Bellwood","NE","41.342529","-97.23485","-6","1"
+"68626","Brainard","NE","41.177056","-97.00012","-6","1"
+"68627","Cedar Rapids","NE","41.552082","-98.17449","-6","1"
+"68628","Clarks","NE","41.212516","-97.83118","-6","1"
+"68629","Clarkson","NE","41.70879","-97.12748","-6","1"
+"68631","Creston","NE","41.692408","-97.35456","-6","1"
+"68632","David City","NE","41.259891","-97.12638","-6","1"
+"68633","Dodge","NE","41.706209","-96.89662","-6","1"
+"68634","Duncan","NE","41.388893","-97.49439","-6","1"
+"68635","Dwight","NE","41.083432","-97.01583","-6","1"
+"68636","Elgin","NE","42.009216","-98.13311","-6","1"
+"68637","Ericson","NE","41.76983","-98.64132","-6","1"
+"68638","Fullerton","NE","41.375063","-97.96381","-6","1"
+"68640","Genoa","NE","41.44996","-97.75199","-6","1"
+"68641","Howells","NE","41.73427","-97.01367","-6","1"
+"68642","Humphrey","NE","41.690401","-97.49723","-6","1"
+"68643","Leigh","NE","41.691648","-97.24781","-6","1"
+"68644","Lindsay","NE","41.707169","-97.6865","-6","1"
+"68647","Monroe","NE","41.504301","-97.60921","-6","1"
+"68648","Morse Bluff","NE","41.400937","-96.78066","-6","1"
+"68649","North Bend","NE","41.484782","-96.77567","-6","1"
+"68651","Osceola","NE","41.21361","-97.56993","-6","1"
+"68652","Petersburg","NE","41.861111","-98.04549","-6","1"
+"68653","Platte Center","NE","41.545453","-97.48974","-6","1"
+"68654","Polk","NE","41.068368","-97.78036","-6","1"
+"68655","Primrose","NE","41.632602","-98.24319","-6","1"
+"68658","Rising City","NE","41.192785","-97.29532","-6","1"
+"68659","Rogers","NE","41.546604","-96.93521","-6","1"
+"68660","Saint Edward","NE","41.574309","-97.86898","-6","1"
+"68661","Schuyler","NE","41.472784","-97.06915","-6","1"
+"68662","Shelby","NE","41.184669","-97.41634","-6","1"
+"68663","Silver Creek","NE","41.306574","-97.70019","-6","1"
+"68664","Snyder","NE","41.704483","-96.78794","-6","1"
+"68665","Spalding","NE","41.693462","-98.38523","-6","1"
+"68666","Stromsburg","NE","41.113813","-97.60295","-6","1"
+"68667","Surprise","NE","41.106694","-97.30554","-6","1"
+"68669","Ulysses","NE","41.08293","-97.22235","-6","1"
+"68701","Norfolk","NE","42.026209","-97.41741","-6","1"
+"68702","Norfolk","NE","41.916476","-97.601348","-6","1"
+"68710","Allen","NE","42.450185","-96.85153","-6","1"
+"68711","Amelia","NE","42.214277","-98.98515","-6","1"
+"68713","Atkinson","NE","42.573338","-98.94136","-6","1"
+"68714","Bassett","NE","42.53961","-99.52938","-6","1"
+"68715","Battle Creek","NE","41.993408","-97.60196","-6","1"
+"68716","Beemer","NE","41.944906","-96.8338","-6","1"
+"68717","Belden","NE","42.408389","-97.20918","-6","1"
+"68718","Bloomfield","NE","42.651113","-97.67271","-6","1"
+"68719","Bristow","NE","42.845614","-98.56946","-6","1"
+"68720","Brunswick","NE","42.337964","-98.01432","-6","1"
+"68722","Butte","NE","42.923088","-98.85921","-6","1"
+"68723","Carroll","NE","42.281323","-97.20373","-6","1"
+"68724","Center","NE","42.62177","-97.87578","-6","1"
+"68725","Chambers","NE","42.182794","-98.77798","-6","1"
+"68726","Clearwater","NE","42.163976","-98.21846","-6","1"
+"68727","Coleridge","NE","42.509494","-97.20526","-6","1"
+"68728","Concord","NE","42.379899","-96.96331","-6","1"
+"68729","Creighton","NE","42.469145","-97.9023","-6","1"
+"68730","Crofton","NE","42.774493","-97.51543","-6","1"
+"68731","Dakota City","NE","42.424303","-96.43904","-6","1"
+"68732","Dixon","NE","42.459805","-96.98116","-6","1"
+"68733","Emerson","NE","42.288154","-96.73644","-6","1"
+"68734","Emmet","NE","42.475789","-98.79953","-6","1"
+"68735","Ewing","NE","42.189511","-98.42285","-6","1"
+"68736","Fordyce","NE","42.750269","-97.3801","-6","1"
+"68737","Foster","NE","42.272213","-97.67446","-6","1"
+"68738","Hadar","NE","42.264356","-97.601337","-6","1"
+"68739","Hartington","NE","42.624108","-97.25267","-6","1"
+"68740","Hoskins","NE","42.145982","-97.3009","-6","1"
+"68741","Hubbard","NE","42.367879","-96.58297","-6","1"
+"68742","Inman","NE","42.376443","-98.51848","-6","1"
+"68743","Jackson","NE","42.460155","-96.60668","-6","1"
+"68745","Laurel","NE","42.437732","-97.09057","-6","1"
+"68746","Lynch","NE","42.787371","-98.43592","-6","1"
+"68747","Mclean","NE","42.402076","-97.4751","-6","1"
+"68748","Madison","NE","41.836046","-97.45212","-6","1"
+"68749","Magnet","NE","42.609687","-97.250378","-6","1"
+"68751","Maskell","NE","42.481711","-96.926042","-6","1"
+"68752","Meadow Grove","NE","41.995961","-97.70788","-6","1"
+"68753","Mills","NE","42.855832","-99.44391","-6","1"
+"68755","Naper","NE","42.946169","-99.11638","-6","1"
+"68756","Neligh","NE","42.150892","-98.02352","-6","1"
+"68757","Newcastle","NE","42.660607","-96.92796","-6","1"
+"68758","Newman Grove","NE","41.769497","-97.79839","-6","1"
+"68759","Newport","NE","42.700145","-99.31812","-6","1"
+"68760","Niobrara","NE","42.776379","-98.07011","-6","1"
+"68761","Oakdale","NE","42.049818","-97.96188","-6","1"
+"68763","Oneill","NE","42.516792","-98.60341","-6","1"
+"68764","Orchard","NE","42.395137","-98.22358","-6","1"
+"68765","Osmond","NE","42.35077","-97.61574","-6","1"
+"68766","Page","NE","42.41927","-98.40272","-6","1"
+"68767","Pierce","NE","42.200994","-97.54527","-6","1"
+"68768","Pilger","NE","41.999564","-97.06804","-6","1"
+"68769","Plainview","NE","42.331689","-97.80618","-6","1"
+"68770","Ponca","NE","42.563297","-96.76399","-6","1"
+"68771","Randolph","NE","42.377338","-97.35618","-6","1"
+"68772","Rose","NE","42.231317","-99.59463","-6","1"
+"68773","Royal","NE","42.367457","-98.12019","-6","1"
+"68774","Saint Helena","NE","42.821095","-97.27699","-6","1"
+"68776","South Sioux City","NE","42.467095","-96.4187","-6","1"
+"68777","Spencer","NE","42.843338","-98.68298","-6","1"
+"68778","Springview","NE","42.880251","-99.8661","-6","1"
+"68779","Stanton","NE","41.955429","-97.21583","-6","1"
+"68780","Stuart","NE","42.591725","-99.13746","-6","1"
+"68781","Tilden","NE","42.028202","-97.84085","-6","1"
+"68782","Verdel","NE","42.811418","-98.191178","-6","1"
+"68783","Verdigre","NE","42.620877","-98.12001","-6","1"
+"68784","Wakefield","NE","42.242742","-96.87191","-6","1"
+"68785","Waterbury","NE","42.437174","-96.72103","-6","1"
+"68786","Wausa","NE","42.50198","-97.55717","-6","1"
+"68787","Wayne","NE","42.221382","-97.03303","-6","1"
+"68788","West Point","NE","41.841032","-96.72569","-6","1"
+"68789","Winnetoon","NE","42.534339","-97.99902","-6","1"
+"68790","Winside","NE","42.175272","-97.17016","-6","1"
+"68791","Wisner","NE","42.000682","-96.9295","-6","1"
+"68792","Wynot","NE","42.749481","-97.14372","-6","1"
+"68797","Sutton","NE","40.607095","-97.859489","-6","1"
+"68801","Grand Island","NE","40.922826","-98.33087","-6","1"
+"68802","Grand Island","NE","40.872457","-98.50213","-6","1"
+"68803","Grand Island","NE","40.916866","-98.38749","-6","1"
+"68810","Alda","NE","40.860494","-98.47051","-6","1"
+"68812","Amherst","NE","40.887707","-99.2839","-6","1"
+"68813","Anselmo","NE","41.726833","-99.82976","-6","1"
+"68814","Ansley","NE","41.296709","-99.38123","-6","1"
+"68815","Arcadia","NE","41.420141","-99.1444","-6","1"
+"68816","Archer","NE","41.172932","-98.12755","-6","1"
+"68817","Ashton","NE","41.251967","-98.78701","-6","1"
+"68818","Aurora","NE","40.83605","-98.00493","-6","1"
+"68819","Berwyn","NE","41.348094","-99.4839","-6","1"
+"68820","Boelus","NE","41.09121","-98.69726","-6","1"
+"68821","Brewster","NE","41.976053","-99.81717","-6","1"
+"68822","Broken Bow","NE","41.400263","-99.63075","-6","1"
+"68823","Burwell","NE","41.820617","-99.12531","-6","1"
+"68824","Cairo","NE","40.99858","-98.60417","-6","1"
+"68825","Callaway","NE","41.288656","-99.95439","-6","1"
+"68826","Central City","NE","41.12561","-98.00225","-6","1"
+"68827","Chapman","NE","41.031618","-98.17004","-6","1"
+"68828","Comstock","NE","41.556172","-99.24938","-6","1"
+"68831","Dannebrog","NE","41.125399","-98.57308","-6","1"
+"68832","Doniphan","NE","40.763643","-98.38794","-6","1"
+"68833","Dunning","NE","41.824292","-100.15245","-6","1"
+"68834","Eddyville","NE","41.013936","-99.6325","-6","1"
+"68835","Elba","NE","41.336945","-98.61248","-6","1"
+"68836","Elm Creek","NE","40.708697","-99.37512","-6","1"
+"68837","Elyria","NE","41.6477","-99.05046","-6","1"
+"68838","Farwell","NE","41.217633","-98.67027","-6","1"
+"68840","Gibbon","NE","40.754582","-98.86414","-6","1"
+"68841","Giltner","NE","40.769633","-98.16372","-6","1"
+"68842","Greeley","NE","41.517347","-98.49117","-6","1"
+"68843","Hampton","NE","40.894366","-97.89355","-6","1"
+"68844","Hazard","NE","41.067301","-99.04756","-6","1"
+"68845","Kearney","NE","40.713265","-99.11839","-6","1"
+"68846","Hordville","NE","41.068227","-97.89516","-6","1"
+"68847","Kearney","NE","40.709895","-99.05499","-6","1"
+"68848","Kearney","NE","40.686053","-99.069318","-6","1"
+"68849","Kearney","NE","40.849654","-99.074058","-6","1"
+"68850","Lexington","NE","40.786048","-99.7424","-6","1"
+"68852","Litchfield","NE","41.158146","-99.12336","-6","1"
+"68853","Loup City","NE","41.286479","-98.96733","-6","1"
+"68854","Marquette","NE","41.019927","-98.00297","-6","1"
+"68855","Mason City","NE","41.168004","-99.33514","-6","1"
+"68856","Merna","NE","41.488642","-99.81791","-6","1"
+"68858","Miller","NE","40.966548","-99.37818","-6","1"
+"68859","North Loup","NE","41.48443","-98.79933","-6","1"
+"68860","Oconto","NE","41.146805","-99.77117","-6","1"
+"68861","Odessa","NE","40.699986","-99.25626","-6","1"
+"68862","Ord","NE","41.597942","-98.93307","-6","1"
+"68863","Overton","NE","40.752213","-99.52687","-6","1"
+"68864","Palmer","NE","41.244441","-98.22475","-6","1"
+"68865","Phillips","NE","40.895553","-98.20719","-6","1"
+"68866","Pleasanton","NE","40.982236","-99.11132","-6","1"
+"68868","Martin","NE","40.718287","-98.52983","-6","1"
+"68869","Ravenna","NE","41.014592","-98.88267","-6","1"
+"68870","Riverdale","NE","40.817442","-99.15387","-6","1"
+"68871","Rockville","NE","41.121028","-98.82619","-6","1"
+"68872","Saint Libory","NE","41.097169","-98.31587","-6","1"
+"68873","Saint Paul","NE","41.230069","-98.47449","-6","1"
+"68874","Sargent","NE","41.639578","-99.41055","-6","1"
+"68875","Scotia","NE","41.523574","-98.68461","-6","1"
+"68876","Shelton","NE","40.786865","-98.74701","-6","1"
+"68878","Sumner","NE","40.970793","-99.48582","-6","1"
+"68879","Taylor","NE","41.826783","-99.49058","-6","1"
+"68880","Weissert","NE","41.393902","-99.728097","-6","1"
+"68881","Westerville","NE","41.44271","-99.35516","-6","1"
+"68882","Wolbach","NE","41.413885","-98.4231","-6","1"
+"68883","Wood River","NE","40.807789","-98.5978","-6","1"
+"68901","Hastings","NE","40.589299","-98.38131","-6","1"
+"68902","Hastings","NE","40.589594","-98.397248","-6","1"
+"68920","Alma","NE","40.142462","-99.35398","-6","1"
+"68922","Arapahoe","NE","40.318156","-99.89562","-6","1"
+"68923","Atlanta","NE","40.370382","-99.47144","-6","1"
+"68924","Axtell","NE","40.493457","-99.11348","-6","1"
+"68925","Ayr","NE","40.431821","-98.43946","-6","1"
+"68926","Beaver City","NE","40.106595","-99.8225","-6","1"
+"68927","Bertrand","NE","40.534445","-99.61498","-6","1"
+"68928","Bladen","NE","40.320042","-98.59331","-6","1"
+"68929","Bloomington","NE","40.121789","-99.04457","-6","1"
+"68930","Blue Hill","NE","40.284783","-98.43446","-6","1"
+"68932","Campbell","NE","40.303479","-98.73884","-6","1"
+"68933","Clay Center","NE","40.523823","-98.04812","-6","1"
+"68934","Deweese","NE","40.34357","-98.15079","-6","1"
+"68935","Edgar","NE","40.365387","-97.96363","-6","1"
+"68936","Edison","NE","40.310905","-99.7648","-6","1"
+"68937","Elwood","NE","40.627711","-99.86334","-6","1"
+"68938","Fairfield","NE","40.425264","-98.10957","-6","1"
+"68939","Franklin","NE","40.103792","-98.94389","-6","1"
+"68940","Funk","NE","40.532115","-99.24602","-6","1"
+"68941","Glenvil","NE","40.459158","-98.28892","-6","1"
+"68942","Guide Rock","NE","40.084405","-98.30306","-6","1"
+"68943","Hardy","NE","40.023871","-97.9101","-6","1"
+"68944","Harvard","NE","40.635514","-98.09442","-6","1"
+"68945","Heartwell","NE","40.568436","-98.78434","-6","1"
+"68946","Hendley","NE","40.099617","-99.97619","-6","1"
+"68947","Hildreth","NE","40.306853","-99.05694","-6","1"
+"68948","Holbrook","NE","40.34435","-100.03595","-6","1"
+"68949","Holdrege","NE","40.434479","-99.37311","-6","1"
+"68950","Holstein","NE","40.465821","-98.65405","-6","1"
+"68952","Inavale","NE","40.142355","-98.66952","-6","1"
+"68954","Inland","NE","40.60418","-98.23217","-6","1"
+"68955","Juniata","NE","40.595599","-98.53981","-6","1"
+"68956","Kenesaw","NE","40.642616","-98.67681","-6","1"
+"68957","Lawrence","NE","40.275161","-98.24659","-6","1"
+"68958","Loomis","NE","40.507276","-99.50047","-6","1"
+"68959","Minden","NE","40.491484","-98.92412","-6","1"
+"68960","Naponee","NE","40.085446","-99.14622","-6","1"
+"68961","Nelson","NE","40.19484","-98.03859","-6","1"
+"68963","Norman","NE","40.478879","-98.792699","-6","1"
+"68964","Oak","NE","40.230878","-97.89427","-6","1"
+"68966","Orleans","NE","40.145771","-99.46708","-6","1"
+"68967","Oxford","NE","40.247784","-99.62187","-6","1"
+"68969","Ragan","NE","40.176513","-99.404864","-6","1"
+"68970","Red Cloud","NE","40.090341","-98.52808","-6","1"
+"68971","Republican City","NE","40.113307","-99.23875","-6","1"
+"68972","Riverton","NE","40.083133","-98.78853","-6","1"
+"68973","Roseland","NE","40.459642","-98.55892","-6","1"
+"68974","Ruskin","NE","40.126094","-97.87696","-6","1"
+"68975","Saronville","NE","40.605538","-97.94955","-6","1"
+"68976","Smithfield","NE","40.576873","-99.74003","-6","1"
+"68977","Stamford","NE","40.092127","-99.63058","-6","1"
+"68978","Superior","NE","40.03686","-98.07828","-6","1"
+"68979","Sutton","NE","40.603945","-97.85433","-6","1"
+"68980","Trumbull","NE","40.674132","-98.26496","-6","1"
+"68981","Upland","NE","40.287173","-98.88958","-6","1"
+"68982","Wilcox","NE","40.338567","-99.18638","-6","1"
+"69001","McCook","NE","40.225039","-100.63052","-6","1"
+"69020","Bartley","NE","40.241652","-100.3015","-6","1"
+"69021","Benkelman","NE","40.097723","-101.54055","-7","1"
+"69022","Cambridge","NE","40.317358","-100.17857","-6","1"
+"69023","Champion","NE","40.489063","-101.88349","-7","1"
+"69024","Culbertson","NE","40.242582","-100.85376","-6","1"
+"69025","Curtis","NE","40.618751","-100.50729","-6","1"
+"69026","Danbury","NE","40.049447","-100.44338","-6","1"
+"69027","Enders","NE","40.429297","-101.53601","-7","1"
+"69028","Eustis","NE","40.656225","-100.05391","-6","1"
+"69029","Farnam","NE","40.756879","-100.21881","-6","1"
+"69030","Haigler","NE","40.032262","-101.96041","-7","1"
+"69031","Hamlet","NE","40.383691","-101.23172","-6","1"
+"69032","Hayes Center","NE","40.560493","-100.95654","-6","1"
+"69033","Imperial","NE","40.530405","-101.67576","-7","1"
+"69034","Indianola","NE","40.236212","-100.42375","-6","1"
+"69036","Lebanon","NE","40.056031","-100.28026","-6","1"
+"69037","Max","NE","40.142872","-101.40758","-7","1"
+"69038","Maywood","NE","40.638541","-100.65778","-6","1"
+"69039","Moorefield","NE","40.646065","-100.35262","-6","1"
+"69040","Palisade","NE","40.358455","-101.11224","-6","1"
+"69041","Parks","NE","40.133487","-101.7201","-7","1"
+"69042","Stockville","NE","40.519197","-100.37754","-6","1"
+"69043","Stratton","NE","40.150605","-101.23375","-6","1"
+"69044","Trenton","NE","40.160252","-101.01311","-6","1"
+"69045","Wauneta","NE","40.484407","-101.35561","-7","1"
+"69046","Wilsonville","NE","40.106363","-100.11077","-6","1"
+"69101","North Platte","NE","41.129363","-100.77502","-6","1"
+"69103","North Platte","NE","41.046447","-100.746912","-6","1"
+"69120","Arnold","NE","41.398865","-100.22265","-6","1"
+"69121","Arthur","NE","41.569138","-101.68816","-7","1"
+"69122","Big Springs","NE","41.058171","-102.08926","-7","1"
+"69123","Brady","NE","41.036035","-100.34398","-6","1"
+"69125","Broadwater","NE","41.583579","-102.85851","-7","1"
+"69127","Brule","NE","41.091667","-101.89092","-7","1"
+"69128","Bushnell","NE","41.173278","-103.9024","-7","1"
+"69129","Chappell","NE","41.104806","-102.40905","-7","1"
+"69130","Cozad","NE","40.868727","-99.97697","-6","1"
+"69131","Dalton","NE","41.406407","-103.00711","-7","1"
+"69132","Dickens","NE","40.808779","-100.96318","-6","1"
+"69133","Dix","NE","41.207381","-103.47126","-7","1"
+"69134","Elsie","NE","40.847471","-101.38031","-7","1"
+"69135","Elsmere","NE","42.211636","-100.2201","-6","1"
+"69138","Gothenburg","NE","40.952436","-100.15719","-6","1"
+"69140","Grant","NE","40.850141","-101.75824","-7","1"
+"69141","Gurley","NE","41.318554","-102.97377","-7","1"
+"69142","Halsey","NE","41.931243","-100.27285","-6","1"
+"69143","Hershey","NE","41.186837","-101.03117","-6","1"
+"69144","Keystone","NE","41.250772","-101.60141","-7","1"
+"69145","Kimball","NE","41.24058","-103.6608","-7","1"
+"69146","Lemoyne","NE","41.296221","-101.77851","-7","1"
+"69147","Lewellen","NE","41.376624","-102.05512","-7","1"
+"69148","Lisco","NE","41.521238","-102.55973","-7","1"
+"69149","Lodgepole","NE","41.168155","-102.63874","-7","1"
+"69150","Madrid","NE","40.845229","-101.5378","-7","1"
+"69151","Maxwell","NE","41.020868","-100.54009","-6","1"
+"69152","Mullen","NE","42.088889","-101.09299","-7","1"
+"69153","Ogallala","NE","41.115512","-101.69819","-7","1"
+"69154","Oshkosh","NE","41.402127","-102.35025","-7","1"
+"69155","Paxton","NE","41.154635","-101.37877","-7","1"
+"69156","Potter","NE","41.233268","-103.28325","-7","1"
+"69157","Purdum","NE","42.1088","-100.3151","-6","1"
+"69160","Sidney","NE","41.220549","-102.995925","-7","1"
+"69161","Seneca","NE","42.07739","-100.74359","-6","1"
+"69162","Sidney","NE","41.162214","-103.01949","-7","1"
+"69163","Stapleton","NE","41.437215","-100.53006","-6","1"
+"69165","Sutherland","NE","41.194109","-101.17899","-6","1"
+"69166","Thedford","NE","41.918663","-100.52739","-6","1"
+"69167","Tryon","NE","41.560479","-100.98254","-6","1"
+"69168","Venango","NE","40.734776","-101.98221","-7","1"
+"69169","Wallace","NE","40.820868","-101.17982","-6","1"
+"69170","Wellfleet","NE","40.770008","-100.73442","-6","1"
+"69171","Willow Island","NE","40.892469","-100.070257","-6","1"
+"69190","Oshkosh","NE","41.615307","-102.331762","-7","1"
+"69201","Valentine","NE","42.716711","-100.64716","-6","1"
+"69210","Ainsworth","NE","42.530382","-99.88206","-6","1"
+"69211","Cody","NE","42.838967","-101.36663","-7","1"
+"69212","Crookston","NE","42.914711","-100.78789","-6","1"
+"69214","Johnstown","NE","42.61416","-100.03899","-6","1"
+"69216","Kilgore","NE","42.939915","-100.92827","-7","1"
+"69217","Long Pine","NE","42.519402","-99.70826","-6","1"
+"69218","Merriman","NE","42.848109","-101.65674","-7","1"
+"69219","Nenzel","NE","42.686576","-101.09984","-7","1"
+"69220","Sparks","NE","42.940698","-100.25556","-6","1"
+"69221","Wood Lake","NE","42.63002","-100.26756","-6","1"
+"69301","Alliance","NE","42.13928","-102.84937","-7","1"
+"69331","Angora","NE","41.823881","-102.96652","-7","1"
+"69333","Ashby","NE","41.861313","-101.98548","-7","1"
+"69334","Bayard","NE","41.777948","-103.31277","-7","1"
+"69335","Bingham","NE","41.996022","-102.18247","-7","1"
+"69336","Bridgeport","NE","41.660814","-103.10517","-7","1"
+"69337","Chadron","NE","42.808213","-103.00219","-7","1"
+"69339","Crawford","NE","42.672974","-103.39841","-7","1"
+"69340","Ellsworth","NE","42.23242","-102.19792","-7","1"
+"69341","Gering","NE","41.803503","-103.65998","-7","1"
+"69343","Gordon","NE","42.567701","-102.00083","-7","1"
+"69345","Harrisburg","NE","41.549736","-103.72421","-7","1"
+"69346","Harrison","NE","42.624764","-103.83101","-7","1"
+"69347","Hay Springs","NE","42.580176","-102.65443","-7","1"
+"69348","Hemingford","NE","42.369213","-103.17741","-7","1"
+"69349","Henry","NE","41.992583","-104.04977","-7","1"
+"69350","Hyannis","NE","41.926792","-101.73705","-7","1"
+"69351","Lakeside","NE","42.21773","-102.42833","-7","1"
+"69352","Lyman","NE","41.849619","-103.99465","-7","1"
+"69353","Mcgrew","NE","41.746944","-103.416351","-7","1"
+"69354","Marsland","NE","42.485817","-103.21227","-7","1"
+"69355","Melbeta","NE","41.781984","-103.51728","-7","1"
+"69356","Minatare","NE","41.863357","-103.47009","-7","1"
+"69357","Mitchell","NE","41.940693","-103.78815","-7","1"
+"69358","Morrill","NE","41.986025","-103.95935","-7","1"
+"69360","Rushville","NE","42.737843","-102.48573","-7","1"
+"69361","Scottsbluff","NE","41.885553","-103.65241","-7","1"
+"69363","Scottsbluff","NE","41.851012","-103.70726","-7","1"
+"69365","Whiteclay","NE","42.963117","-102.51068","-7","1"
+"69366","Whitman","NE","41.92305","-101.56145","-7","1"
+"69367","Whitney","NE","42.755969","-103.2562","-7","1"
+"70000","Laplace","LA","30.08677","-90.513522","-6","1"
+"70001","Metairie","LA","29.984096","-90.16902","-6","1"
+"70002","Metairie","LA","30.011517","-90.16245","-6","1"
+"70003","Metairie","LA","29.997168","-90.2138","-6","1"
+"70004","Metairie","LA","29.677893","-90.0901","-6","1"
+"70005","Metairie","LA","29.999453","-90.13398","-6","1"
+"70006","Metairie","LA","30.013985","-90.19128","-6","1"
+"70009","Metairie","LA","29.677893","-90.0901","-6","1"
+"70010","Metairie","LA","29.677893","-90.0901","-6","1"
+"70011","Metairie","LA","29.677893","-90.0901","-6","1"
+"70021","Jefferson","LA","29.960375","-90.156143","-6","1"
+"70030","Des Allemands","LA","29.810193","-90.44769","-6","1"
+"70031","Ama","LA","29.942703","-90.29969","-6","1"
+"70032","Arabi","LA","29.958802","-89.99902","-6","1"
+"70033","Metairie","LA","29.677893","-90.0901","-6","1"
+"70036","Barataria","LA","29.715795","-90.12419","-6","1"
+"70037","Belle Chasse","LA","29.822707","-90.00616","-6","1"
+"70038","Boothville","LA","29.307982","-89.38007","-6","1"
+"70039","Boutte","LA","29.900075","-90.38655","-6","1"
+"70040","Braithwaite","LA","29.749706","-89.94043","-6","1"
+"70041","Buras","LA","29.351783","-89.51381","-6","1"
+"70042","Carlisle","LA","29.380066","-89.477464","-6","1"
+"70043","Chalmette","LA","29.946404","-89.96118","-6","1"
+"70044","Chalmette","LA","29.96765","-89.951441","-6","1"
+"70046","Davant","LA","29.61829","-89.872599","-6","1"
+"70047","Destrehan","LA","29.969128","-90.37563","-6","1"
+"70048","Reserve","LA","30.071155","-90.546138","-6","1"
+"70049","Edgard","LA","30.033974","-90.5538","-6","1"
+"70050","Empire","LA","29.384033","-89.59696","-6","1"
+"70051","Garyville","LA","30.058276","-90.61738","-6","1"
+"70052","Gramercy","LA","30.053907","-90.68915","-6","1"
+"70053","Gretna","LA","29.915355","-90.05335","-6","1"
+"70054","Gretna","LA","29.677893","-90.0901","-6","1"
+"70055","Metairie","LA","29.677893","-90.0901","-6","1"
+"70056","Gretna","LA","29.894261","-90.03072","-6","1"
+"70057","Hahnville","LA","29.967081","-90.41012","-6","1"
+"70058","Harvey","LA","29.878578","-90.06903","-6","1"
+"70059","Harvey","LA","29.677893","-90.0901","-6","1"
+"70060","Metairie","LA","29.677893","-90.0901","-6","1"
+"70062","Kenner","LA","29.991051","-90.2469","-6","1"
+"70063","Kenner","LA","29.677893","-90.0901","-6","1"
+"70064","Kenner","LA","29.677893","-90.0901","-6","1"
+"70065","Kenner","LA","30.022853","-90.25133","-6","1"
+"70066","Killona","LA","29.999471","-90.48708","-6","1"
+"70067","Lafitte","LA","29.652752","-90.1012","-6","1"
+"70068","La Place","LA","30.073941","-90.48516","-6","1"
+"70069","La Place","LA","30.091158","-90.483189","-6","1"
+"70070","Luling","LA","29.907162","-90.35142","-6","1"
+"70071","Lutcher","LA","30.04401","-90.69956","-6","1"
+"70072","Marrero","LA","29.869283","-90.10933","-6","1"
+"70073","Marrero","LA","29.677893","-90.0901","-6","1"
+"70075","Meraux","LA","29.935089","-89.92089","-6","1"
+"70076","Mount Airy","LA","30.055429","-90.64073","-6","1"
+"70078","New Sarpy","LA","29.981674","-90.38595","-6","1"
+"70079","Norco","LA","30.007089","-90.41389","-6","1"
+"70080","Paradis","LA","29.878373","-90.43063","-6","1"
+"70081","Pilottown","LA","29.285081","-89.364034","-6","1"
+"70082","Pointe A La Hache","LA","29.572751","-89.78139","-6","1"
+"70083","Port Sulphur","LA","29.529091","-89.7883","-6","1"
+"70084","Reserve","LA","30.059516","-90.55987","-6","1"
+"70085","Saint Bernard","LA","29.86089","-89.82225","-6","1"
+"70086","Saint James","LA","30.013027","-90.85714","-6","1"
+"70087","Saint Rose","LA","29.962601","-90.30965","-6","1"
+"70090","Vacherie","LA","29.979997","-90.71178","-6","1"
+"70091","Venice","LA","29.277457","-89.35898","-6","1"
+"70092","Violet","LA","29.902193","-89.89726","-6","1"
+"70093","Violet","LA","29.877893","-89.878719","-6","1"
+"70094","Westwego","LA","29.91534","-90.17737","-6","1"
+"70096","Westwego","LA","29.677893","-90.0901","-6","1"
+"70112","New Orleans","LA","29.956804","-90.07757","-6","1"
+"70113","New Orleans","LA","29.943505","-90.08408","-6","1"
+"70114","New Orleans","LA","29.938155","-90.03667","-6","1"
+"70115","New Orleans","LA","29.927305","-90.10197","-6","1"
+"70116","New Orleans","LA","29.968054","-90.06403","-6","1"
+"70117","New Orleans","LA","29.970404","-90.03036","-6","1"
+"70118","New Orleans","LA","29.952305","-90.12347","-6","1"
+"70119","New Orleans","LA","29.974504","-90.08747","-6","1"
+"70121","New Orleans","LA","29.961875","-90.16037","-6","1"
+"70122","New Orleans","LA","30.006353","-90.06264","-6","1"
+"70123","New Orleans","LA","29.952605","-90.20536","-6","1"
+"70124","New Orleans","LA","30.006003","-90.10947","-6","1"
+"70125","New Orleans","LA","29.951705","-90.10411","-6","1"
+"70126","New Orleans","LA","30.016002","-90.01972","-6","1"
+"70127","New Orleans","LA","30.033475","-89.97736","-6","1"
+"70128","New Orleans","LA","30.05031","-89.95638","-6","1"
+"70129","New Orleans","LA","30.063059","-89.88511","-6","1"
+"70130","New Orleans","LA","29.938005","-90.07195","-6","1"
+"70131","New Orleans","LA","29.917005","-89.98982","-6","1"
+"70139","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70140","New Orleans","LA","29.95612","-90.078312","-6","1"
+"70141","New Orleans","LA","29.677893","-90.0901","-6","1"
+"70142","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70143","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70144","New Orleans","LA","29.930433","-90.038021","-6","1"
+"70145","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70146","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70148","New Orleans","LA","30.030902","-90.068022","-6","1"
+"70149","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70150","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70151","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70152","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70153","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70154","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70155","New Orleans","LA","29.940138","-90.109823","-6","1"
+"70156","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70157","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70158","New Orleans","LA","29.922905","-90.070922","-6","1"
+"70159","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70160","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70161","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70162","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70163","New Orleans","LA","29.95006","-90.07532","-6","1"
+"70164","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70165","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70166","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70167","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70170","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70172","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70174","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70175","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70176","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70177","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70178","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70179","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70181","New Orleans","LA","29.677893","-90.0901","-6","1"
+"70182","New Orleans","LA","30.067646","-89.815993","-6","1"
+"70183","New Orleans","LA","29.677893","-90.0901","-6","1"
+"70184","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70185","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70186","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70187","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70189","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70190","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70195","New Orleans","LA","30.032997","-89.882564","-6","1"
+"70199","New Orleans","LA","29.987528","-90.079501","-6","1"
+"70301","Thibodaux","LA","29.797776","-90.81809","-6","1"
+"70302","Thibodaux","LA","29.458689","-90.502848","-6","1"
+"70310","Thibodaux","LA","29.803282","-90.816914","-6","1"
+"70339","Pierre Part","LA","29.931838","-91.19813","-6","1"
+"70340","Amelia","LA","29.688425","-91.220844","-6","1"
+"70341","Belle Rose","LA","30.030819","-91.07576","-6","1"
+"70342","Berwick","LA","29.692515","-91.22938","-6","1"
+"70343","Bourg","LA","29.553952","-90.59881","-6","1"
+"70344","Chauvin","LA","29.385126","-90.61939","-6","1"
+"70345","Cut Off","LA","29.523897","-90.34043","-6","1"
+"70346","Donaldsonville","LA","30.103905","-91.00104","-6","1"
+"70352","Donner","LA","29.696385","-90.944418","-6","1"
+"70353","Dulac","LA","29.384672","-90.69689","-6","1"
+"70354","Galliano","LA","29.435146","-90.30479","-6","1"
+"70355","Gheens","LA","29.670214","-90.46202","-6","1"
+"70356","Gibson","LA","29.658394","-90.97455","-6","1"
+"70357","Golden Meadow","LA","29.275485","-90.24378","-6","1"
+"70358","Grand Isle","LA","29.227769","-90.01211","-6","1"
+"70359","Gray","LA","29.696636","-90.77238","-6","1"
+"70360","Houma","LA","29.593377","-90.7475","-6","1"
+"70361","Houma","LA","29.382117","-90.865568","-6","1"
+"70363","Houma","LA","29.560581","-90.6903","-6","1"
+"70364","Houma","LA","29.626988","-90.72076","-6","1"
+"70369","Houma","LA","30.285602","-92.096266","-6","1"
+"70371","Kraemer","LA","29.865202","-90.596159","-6","1"
+"70372","Labadieville","LA","29.829135","-90.9636","-6","1"
+"70373","Larose","LA","29.535139","-90.44546","-6","1"
+"70374","Lockport","LA","29.620122","-90.49218","-6","1"
+"70375","Mathews","LA","29.697038","-90.55223","-6","1"
+"70376","Modeste","LA","30.204707","-90.869481","-6","1"
+"70377","Montegut","LA","29.428462","-90.52556","-6","1"
+"70380","Morgan City","LA","29.694806","-91.18252","-6","1"
+"70381","Morgan City","LA","29.694629","-91.259347","-6","1"
+"70384","Cankton","LA","30.350849","-92.107422","-6","1"
+"70390","Napoleonville","LA","29.91599","-91.02187","-6","1"
+"70391","Paincourtville","LA","29.990967","-91.05456","-6","1"
+"70392","Patterson","LA","29.69828","-91.31347","-6","1"
+"70393","Plattenville","LA","29.995157","-91.02586","-6","1"
+"70394","Raceland","LA","29.715302","-90.6097","-6","1"
+"70395","Schriever","LA","29.718856","-90.83425","-6","1"
+"70397","Theriot","LA","29.352141","-90.82604","-6","1"
+"70401","Hammond","LA","30.517866","-90.47254","-6","1"
+"70402","Hammond","LA","30.513982","-90.480403","-6","1"
+"70403","Hammond","LA","30.484785","-90.4762","-6","1"
+"70404","Hammond","LA","30.505061","-90.422504","-6","1"
+"70420","Abita Springs","LA","30.482725","-90.00103","-6","1"
+"70421","Akers","LA","30.612371","-90.405312","-6","1"
+"70422","Amite","LA","30.723034","-90.52108","-6","1"
+"70426","Angie","LA","30.932125","-89.86251","-6","1"
+"70427","Bogalusa","LA","30.762908","-89.87774","-6","1"
+"70428","Sun","LA","30.591363","-89.941408","-6","1"
+"70429","Bogalusa","LA","30.83503","-90.037115","-6","1"
+"70431","Bush","LA","30.613004","-89.93089","-6","1"
+"70432","Covington","LA","30.496278","-90.131145","-6","1"
+"70433","Covington","LA","30.470793","-90.10491","-6","1"
+"70434","Covington","LA","30.492753","-90.125666","-6","1"
+"70435","Covington","LA","30.53978","-90.07953","-6","1"
+"70436","Fluker","LA","30.793858","-90.51026","-6","1"
+"70437","Folsom","LA","30.616777","-90.1898","-6","1"
+"70438","Franklinton","LA","30.844465","-90.12066","-6","1"
+"70440","Mandeville","LA","30.375852","-90.07828","-6","1"
+"70441","Greensburg","LA","30.867259","-90.74688","-6","1"
+"70442","Husser","LA","30.686968","-90.32332","-6","1"
+"70443","Independence","LA","30.628735","-90.51744","-6","1"
+"70444","Kentwood","LA","30.923938","-90.50206","-6","1"
+"70445","Lacombe","LA","30.327126","-89.93118","-6","1"
+"70446","Loranger","LA","30.623502","-90.35689","-6","1"
+"70447","Madisonville","LA","30.424049","-90.18519","-6","1"
+"70448","Mandeville","LA","30.367119","-90.05999","-6","1"
+"70449","Maurepas","LA","30.272335","-90.72701","-6","1"
+"70450","Mount Hermon","LA","30.944302","-90.26252","-6","1"
+"70451","Natalbany","LA","30.546528","-90.48375","-6","1"
+"70452","Pearl River","LA","30.401481","-89.76917","-6","1"
+"70453","Pine Grove","LA","30.702471","-90.77604","-6","1"
+"70454","Ponchatoula","LA","30.427599","-90.41728","-6","1"
+"70455","Robert","LA","30.520782","-90.30638","-6","1"
+"70456","Roseland","LA","30.769493","-90.51064","-6","1"
+"70457","Saint Benedict","LA","30.42551","-89.881256","-6","1"
+"70458","Slidell","LA","30.269565","-89.77587","-6","1"
+"70459","Slidell","LA","30.42551","-89.881256","-6","1"
+"70460","Slidell","LA","30.298048","-89.81176","-6","1"
+"70461","Slidell","LA","30.266707","-89.73049","-6","1"
+"70462","Springfield","LA","30.386031","-90.57297","-6","1"
+"70463","Sun","LA","30.658471","-89.90398","-6","1"
+"70464","Talisheek","LA","30.534785","-89.88582","-6","1"
+"70465","Tangipahoa","LA","30.875453","-90.51254","-6","1"
+"70466","Tickfaw","LA","30.560995","-90.50196","-6","1"
+"70467","Angie","LA","30.90169","-89.820725","-6","1"
+"70469","Slidell","LA","30.42551","-89.881256","-6","1"
+"70470","Mandeville","LA","30.42551","-89.881256","-6","1"
+"70471","Mandeville","LA","30.400949","-90.08105","-6","1"
+"70494","Ponchatoula","LA","30.432586","-90.452775","-6","1"
+"70499","Franklinton","LA","30.847346","-90.154156","-6","1"
+"70501","Lafayette","LA","30.2334","-92.00959","-6","1"
+"70502","Lafayette","LA","30.319799","-92.026969","-6","1"
+"70503","Lafayette","LA","30.185867","-92.04706","-6","1"
+"70504","Lafayette","LA","30.21385","-92.01866","-6","1"
+"70505","Lafayette","LA","30.202251","-92.01877","-6","1"
+"70506","Lafayette","LA","30.211901","-92.05912","-6","1"
+"70507","Lafayette","LA","30.2786","-92.02759","-6","1"
+"70508","Lafayette","LA","30.163368","-92.01974","-6","1"
+"70509","Lafayette","LA","30.156506","-92.000019","-6","1"
+"70510","Abbeville","LA","29.943573","-92.14872","-6","1"
+"70511","Abbeville","LA","30.032434","-92.176655","-6","1"
+"70512","Arnaudville","LA","30.411741","-91.91702","-6","1"
+"70513","Avery Island","LA","29.907136","-91.90578","-6","1"
+"70514","Baldwin","LA","29.841827","-91.54679","-6","1"
+"70515","Basile","LA","30.47461","-92.58568","-6","1"
+"70516","Branch","LA","30.365586","-92.30363","-6","1"
+"70517","Breaux Bridge","LA","30.301254","-91.86169","-6","1"
+"70518","Broussard","LA","30.134801","-91.95251","-6","1"
+"70519","Cade","LA","30.079692","-91.911387","-6","1"
+"70520","Carencro","LA","30.327199","-92.0433","-6","1"
+"70521","Cecilia","LA","30.336379","-91.84786","-6","1"
+"70522","Centerville","LA","29.75226","-91.439679","-6","1"
+"70523","Charenton","LA","29.883266","-91.5301","-6","1"
+"70524","Chataignier","LA","30.566122","-92.32115","-6","1"
+"70525","Church Point","LA","30.414588","-92.21772","-6","1"
+"70526","Crowley","LA","30.213767","-92.37921","-6","1"
+"70527","Crowley","LA","30.228409","-92.301795","-6","1"
+"70528","Delcambre","LA","29.945707","-91.98682","-6","1"
+"70529","Duson","LA","30.198258","-92.16211","-6","1"
+"70531","Egan","LA","30.237007","-92.51199","-6","1"
+"70532","Elton","LA","30.477275","-92.69691","-6","1"
+"70533","Erath","LA","29.941157","-92.03811","-6","1"
+"70534","Estherwood","LA","30.182784","-92.46576","-6","1"
+"70535","Eunice","LA","30.492895","-92.41578","-6","1"
+"70537","Evangeline","LA","30.261809","-92.5677","-6","1"
+"70538","Franklin","LA","29.759314","-91.52561","-6","1"
+"70540","Garden City","LA","29.761665","-91.46569","-6","1"
+"70541","Grand Coteau","LA","30.419571","-92.04753","-6","1"
+"70542","Gueydan","LA","30.005408","-92.54417","-6","1"
+"70543","Iota","LA","30.328683","-92.49549","-6","1"
+"70544","Jeanerette","LA","29.910582","-91.6698","-6","1"
+"70546","Jennings","LA","30.242533","-92.66375","-6","1"
+"70548","Kaplan","LA","29.984184","-92.3207","-6","1"
+"70549","Lake Arthur","LA","30.082515","-92.72596","-6","1"
+"70550","Lawtell","LA","30.517709","-92.1835","-6","1"
+"70551","Leonville","LA","30.475194","-91.973736","-6","1"
+"70552","Loreauville","LA","30.076638","-91.71294","-6","1"
+"70554","Mamou","LA","30.63","-92.42652","-6","1"
+"70555","Maurice","LA","30.101305","-92.13152","-6","1"
+"70556","Mermentau","LA","30.188258","-92.57614","-6","1"
+"70558","Milton","LA","30.101464","-92.06338","-6","1"
+"70559","Morse","LA","30.142775","-92.51166","-6","1"
+"70560","New Iberia","LA","29.975453","-91.84073","-6","1"
+"70562","New Iberia","LA","29.739932","-91.6331","-6","1"
+"70563","New Iberia","LA","30.022348","-91.78314","-6","1"
+"70569","Lydia","LA","29.909643","-91.812552","-6","1"
+"70570","Opelousas","LA","30.530965","-92.09521","-6","1"
+"70571","Opelousas","LA","30.57445","-92.086077","-6","1"
+"70575","Perry","LA","29.866543","-92.158982","-6","1"
+"70576","Pine Prairie","LA","30.781744","-92.41968","-6","1"
+"70577","Port Barre","LA","30.549089","-91.93006","-6","1"
+"70578","Rayne","LA","30.234581","-92.26431","-6","1"
+"70580","Reddell","LA","30.675449","-92.42562","-6","1"
+"70581","Roanoke","LA","30.24711","-92.73951","-6","1"
+"70582","Saint Martinville","LA","30.148473","-91.8003","-6","1"
+"70583","Scott","LA","30.244311","-92.10099","-6","1"
+"70584","Sunset","LA","30.394648","-92.07786","-6","1"
+"70585","Turkey Creek","LA","30.871853","-92.40532","-6","1"
+"70586","Ville Platte","LA","30.710639","-92.30628","-6","1"
+"70589","Washington","LA","30.653805","-92.05479","-6","1"
+"70591","Welsh","LA","30.246368","-92.83199","-6","1"
+"70592","Youngsville","LA","30.103107","-91.99993","-6","1"
+"70593","Lafayette","LA","30.20812","-92.095109","-6","1"
+"70594","Raceland","LA","29.700243","-90.570722","-6","1"
+"70596","Lafayette","LA","30.20812","-92.095109","-6","1"
+"70598","Lafayette","LA","30.20812","-92.095109","-6","1"
+"70601","Lake Charles","LA","30.226399","-93.20496","-6","1"
+"70602","Lake Charles","LA","30.264232","-93.326527","-6","1"
+"70605","Lake Charles","LA","30.165907","-93.24905","-6","1"
+"70606","Lake Charles","LA","30.264232","-93.326527","-6","1"
+"70607","Lake Charles","LA","30.129908","-93.19632","-6","1"
+"70609","Lake Charles","LA","30.264232","-93.326527","-6","1"
+"70611","Lake Charles","LA","30.32797","-93.2109","-6","1"
+"70612","Lake Charles","LA","30.264232","-93.326527","-6","1"
+"70615","Lake Charles","LA","30.239906","-93.14977","-6","1"
+"70616","Lake Charles","LA","30.264232","-93.326527","-6","1"
+"70629","Lake Charles","LA","30.264232","-93.326527","-6","1"
+"70630","Bell City","LA","30.077002","-93.03224","-6","1"
+"70631","Cameron","LA","29.778234","-93.40907","-6","1"
+"70632","Creole","LA","29.836547","-93.0363","-6","1"
+"70633","Dequincy","LA","30.44431","-93.41221","-6","1"
+"70634","Deridder","LA","30.835881","-93.27071","-6","1"
+"70637","Dry Creek","LA","30.685067","-92.98065","-6","1"
+"70638","Elizabeth","LA","30.86741","-92.79442","-6","1"
+"70639","Evans","LA","30.994164","-93.49998","-6","1"
+"70640","Fenton","LA","30.366126","-92.91837","-6","1"
+"70642","Fullerton","LA","31.111979","-93.200936","-6","1"
+"70643","Grand Chenier","LA","29.77124","-92.88732","-6","1"
+"70644","Grant","LA","30.799893","-92.94408","-6","1"
+"70645","Hackberry","LA","29.995358","-93.37575","-6","1"
+"70646","Hayes","LA","30.107308","-92.91992","-6","1"
+"70647","Iowa","LA","30.243213","-93.00386","-6","1"
+"70648","Kinder","LA","30.494379","-92.85992","-6","1"
+"70650","Lacassine","LA","30.235892","-92.91527","-6","1"
+"70651","Leblanc","LA","30.518729","-92.96199","-6","1"
+"70652","Longville","LA","30.599065","-93.2561","-6","1"
+"70653","Merryville","LA","30.685274","-93.55827","-6","1"
+"70654","Mittie","LA","30.710561","-92.89081","-6","1"
+"70655","Oberlin","LA","30.620456","-92.74582","-6","1"
+"70656","Pitkin","LA","30.937089","-92.94802","-6","1"
+"70657","Ragley","LA","30.472103","-93.13957","-6","1"
+"70658","Reeves","LA","30.518748","-93.02735","-6","1"
+"70659","Rosepine","LA","30.921274","-93.28194","-6","1"
+"70660","Singer","LA","30.586251","-93.42135","-6","1"
+"70661","Starks","LA","30.338939","-93.66472","-6","1"
+"70662","Sugartown","LA","30.811926","-93.00582","-6","1"
+"70663","Sulphur","LA","30.245205","-93.3636","-6","1"
+"70664","Sulphur","LA","30.264232","-93.326527","-6","1"
+"70665","Sulphur","LA","30.154028","-93.42412","-6","1"
+"70668","Vinton","LA","30.183689","-93.59815","-6","1"
+"70669","Westlake","LA","30.251665","-93.27047","-6","1"
+"70704","Baker","LA","30.51589","-91.080373","-6","1"
+"70706","Denham Springs","LA","30.608471","-90.92758","-6","1"
+"70707","Gonzales","LA","30.204707","-90.869481","-6","1"
+"70710","Addis","LA","30.350306","-91.26121","-6","1"
+"70711","Albany","LA","30.508318","-90.58546","-6","1"
+"70712","Angola","LA","30.949066","-91.59294","-6","1"
+"70714","Baker","LA","30.584787","-91.14763","-6","1"
+"70715","Batchelor","LA","30.822847","-91.70531","-6","1"
+"70716","Bayou Goula","LA","30.261384","-91.36026","-6","1"
+"70717","Blanks","LA","30.547187","-91.59119","-6","1"
+"70718","Brittany","LA","30.201004","-90.868876","-6","1"
+"70719","Brusly","LA","30.384402","-91.25549","-6","1"
+"70720","Bueche","LA","30.587305","-91.33252","-6","1"
+"70721","Carville","LA","30.216906","-91.07975","-6","1"
+"70722","Clinton","LA","30.823174","-90.921","-6","1"
+"70723","Convent","LA","30.063433","-90.84644","-6","1"
+"70725","Darrow","LA","30.130584","-90.95909","-6","1"
+"70726","Denham Springs","LA","30.468526","-90.92827","-6","1"
+"70727","Denham Springs","LA","30.337495","-90.843449","-6","1"
+"70728","Duplessis","LA","30.295446","-90.945836","-6","1"
+"70729","Erwinville","LA","30.546033","-91.41898","-6","1"
+"70730","Ethel","LA","30.810733","-91.11541","-6","1"
+"70732","Fordoche","LA","30.605673","-91.61612","-6","1"
+"70733","French Settlement","LA","30.307865","-90.80054","-6","1"
+"70734","Geismar","LA","30.211172","-91.00875","-6","1"
+"70736","Glynn","LA","30.633678","-91.33786","-6","1"
+"70737","Gonzales","LA","30.229237","-90.92251","-6","1"
+"70738","Burnside","LA","30.204707","-90.869481","-6","1"
+"70739","Greenwell Springs","LA","30.585687","-90.98014","-6","1"
+"70740","Grosse Tete","LA","30.399271","-91.42148","-6","1"
+"70743","Hester","LA","30.019278","-90.77619","-6","1"
+"70744","Holden","LA","30.535477","-90.67464","-6","1"
+"70747","Innis","LA","30.878083","-91.67672","-6","1"
+"70748","Jackson","LA","30.826285","-91.22812","-6","1"
+"70749","Jarreau","LA","30.622391","-91.41468","-6","1"
+"70750","Krotz Springs","LA","30.514159","-91.74246","-6","1"
+"70751","Labarre","LA","30.7513","-91.566273","-6","1"
+"70752","Lakeland","LA","30.587852","-91.39994","-6","1"
+"70753","Lettsworth","LA","30.917437","-91.7126","-6","1"
+"70754","Livingston","LA","30.447866","-90.75228","-6","1"
+"70755","Livonia","LA","30.568308","-91.55075","-6","1"
+"70756","Lottie","LA","30.548421","-91.6325","-6","1"
+"70757","Maringouin","LA","30.483791","-91.51619","-6","1"
+"70759","Morganza","LA","30.720494","-91.58029","-6","1"
+"70760","New Roads","LA","30.700337","-91.44032","-6","1"
+"70761","Norwood","LA","30.972292","-91.07895","-6","1"
+"70762","Oscar","LA","30.609979","-91.46181","-6","1"
+"70763","Paulina","LA","30.03318","-90.73674","-6","1"
+"70764","Plaquemine","LA","30.270694","-91.24853","-6","1"
+"70765","Plaquemine","LA","30.261384","-91.36026","-6","1"
+"70767","Port Allen","LA","30.473536","-91.26324","-6","1"
+"70769","Prairieville","LA","30.31144","-90.93955","-6","1"
+"70770","Pride","LA","30.642585","-90.99489","-6","1"
+"70772","Rosedale","LA","30.439483","-91.46806","-6","1"
+"70773","Rougon","LA","30.613588","-91.36361","-6","1"
+"70774","Saint Amant","LA","30.212699","-90.81947","-6","1"
+"70775","Saint Francisville","LA","30.857355","-91.37308","-6","1"
+"70776","Saint Gabriel","LA","30.264611","-91.09595","-6","1"
+"70777","Slaughter","LA","30.722133","-91.10915","-6","1"
+"70778","Sorrento","LA","30.182068","-90.85707","-6","1"
+"70780","Sunshine","LA","30.287104","-91.15362","-6","1"
+"70781","Torbert","LA","30.561065","-91.48607","-6","1"
+"70782","Tunica","LA","30.934986","-91.53701","-6","1"
+"70783","Ventress","LA","30.680083","-91.39852","-6","1"
+"70784","Wakefield","LA","30.917453","-91.358149","-6","1"
+"70785","Walker","LA","30.521962","-90.84035","-6","1"
+"70786","Watson","LA","30.550219","-90.958219","-6","1"
+"70787","Weyanoke","LA","30.962103","-91.47351","-6","1"
+"70788","White Castle","LA","30.153959","-91.1593","-6","1"
+"70789","Wilson","LA","30.925815","-91.09672","-6","1"
+"70791","Zachary","LA","30.655578","-91.14015","-6","1"
+"70792","Uncle Sam","LA","30.027914","-90.802759","-6","1"
+"70801","Baton Rouge","LA","30.44884","-91.18633","-6","1"
+"70802","Baton Rouge","LA","30.44629","-91.17305","-6","1"
+"70803","Baton Rouge","LA","30.405002","-91.186834","-6","1"
+"70804","Baton Rouge","LA","30.386267","-91.133905","-6","1"
+"70805","Baton Rouge","LA","30.485639","-91.15612","-6","1"
+"70806","Baton Rouge","LA","30.44495","-91.13806","-6","1"
+"70807","Baton Rouge","LA","30.534088","-91.17865","-6","1"
+"70808","Baton Rouge","LA","30.411391","-91.1497","-6","1"
+"70809","Baton Rouge","LA","30.403341","-91.08035","-6","1"
+"70810","Baton Rouge","LA","30.361609","-91.09041","-6","1"
+"70811","Baton Rouge","LA","30.525121","-91.13185","-6","1"
+"70812","Baton Rouge","LA","30.504989","-91.1188","-6","1"
+"70813","Baton Rouge","LA","30.520111","-91.194863","-6","1"
+"70814","Baton Rouge","LA","30.484756","-91.06862","-6","1"
+"70815","Baton Rouge","LA","30.45514","-91.06358","-6","1"
+"70816","Baton Rouge","LA","30.425791","-91.03815","-6","1"
+"70817","Baton Rouge","LA","30.387642","-90.99921","-6","1"
+"70818","Baton Rouge","LA","30.537938","-91.04812","-6","1"
+"70819","Baton Rouge","LA","30.46534","-91.01659","-6","1"
+"70820","Baton Rouge","LA","30.373865","-91.17065","-6","1"
+"70821","Baton Rouge","LA","30.461252","-91.044723","-6","1"
+"70822","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70823","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70825","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70826","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70827","Baton Rouge","LA","30.433837","-91.082468","-6","1"
+"70831","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70832","Elton","LA","30.484853","-92.694679","-6","1"
+"70833","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70835","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70836","Baton Rouge","LA","30.388292","-91.08631","-6","1"
+"70837","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70848","Baton Rouge","LA","30.433083","-91.102808","-6","1"
+"70874","Baton Rouge","LA","30.590238","-91.2054","-6","1"
+"70879","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70883","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70884","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70892","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70893","Baton Rouge","LA","30.412991","-91.171456","-6","1"
+"70894","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70895","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70896","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70898","Baton Rouge","LA","30.51589","-91.080373","-6","1"
+"70952","Youngsville","LA","30.117148","-91.990319","-6","1"
+"71001","Arcadia","LA","32.57761","-92.9062","-6","1"
+"71002","Ashland","LA","32.129489","-93.08273","-6","1"
+"71003","Athens","LA","32.642811","-93.01709","-6","1"
+"71004","Belcher","LA","32.765739","-93.88028","-6","1"
+"71006","Benton","LA","32.697056","-93.6991","-6","1"
+"71007","Bethany","LA","32.420611","-94.00923","-6","1"
+"71008","Bienville","LA","32.331964","-92.95173","-6","1"
+"71009","Blanchard","LA","32.579853","-93.89317","-6","1"
+"71016","Castor","LA","32.204949","-93.10383","-6","1"
+"71018","Cotton Valley","LA","32.803257","-93.40802","-6","1"
+"71019","Coushatta","LA","32.050033","-93.31928","-6","1"
+"71021","Cullen","LA","32.969535","-93.44959","-6","1"
+"71023","Doyline","LA","32.487485","-93.39035","-6","1"
+"71024","Dubberly","LA","32.502528","-93.21326","-6","1"
+"71025","East Point","LA","32.062391","-93.367949","-6","1"
+"71027","Frierson","LA","32.234006","-93.69008","-6","1"
+"71028","Gibsland","LA","32.518748","-93.05705","-6","1"
+"71029","Gilliam","LA","32.828541","-93.83918","-6","1"
+"71030","Gloster","LA","32.191147","-93.8191","-6","1"
+"71031","Goldonna","LA","32.01716","-92.9059","-6","1"
+"71032","Grand Cane","LA","32.110359","-93.78584","-6","1"
+"71033","Greenwood","LA","32.453029","-93.99683","-6","1"
+"71034","Hall Summit","LA","32.176112","-93.30398","-6","1"
+"71036","Harmon","LA","32.062391","-93.367949","-6","1"
+"71037","Haughton","LA","32.569798","-93.55133","-6","1"
+"71038","Haynesville","LA","32.954851","-93.11344","-6","1"
+"71039","Heflin","LA","32.429157","-93.29549","-6","1"
+"71040","Homer","LA","32.78288","-93.03176","-6","1"
+"71043","Hosston","LA","32.890777","-93.87995","-6","1"
+"71044","Ida","LA","32.983957","-93.89254","-6","1"
+"71045","Jamestown","LA","32.342739","-93.16075","-6","1"
+"71046","Keatchie","LA","32.168532","-93.95402","-6","1"
+"71047","Keithville","LA","32.309864","-93.87089","-6","1"
+"71048","Lisbon","LA","32.830135","-92.85568","-6","1"
+"71049","Logansport","LA","31.991863","-93.98356","-6","1"
+"71050","Longstreet","LA","32.117539","-93.913834","-6","1"
+"71051","Elm Grove","LA","32.31718","-93.50366","-6","1"
+"71052","Mansfield","LA","32.031067","-93.68585","-6","1"
+"71053","South Mansfield","LA","32.048905","-93.608059","-6","1"
+"71055","Minden","LA","32.631009","-93.28751","-6","1"
+"71058","Minden","LA","32.576948","-93.250705","-6","1"
+"71059","Mansfield","LA","32.044529","-93.691972","-6","1"
+"71060","Mooringsport","LA","32.679068","-93.97534","-6","1"
+"71061","Oil City","LA","32.748354","-93.97188","-6","1"
+"71063","Pelican","LA","31.920574","-93.48365","-6","1"
+"71064","Plain Dealing","LA","32.913383","-93.68912","-6","1"
+"71065","Pleasant Hill","LA","31.810803","-93.5082","-6","1"
+"71066","Powhatan","LA","31.874172","-93.19719","-6","1"
+"71067","Princeton","LA","32.596886","-93.5026","-6","1"
+"71068","Ringgold","LA","32.304429","-93.33008","-6","1"
+"71069","Rodessa","LA","32.978828","-93.99733","-6","1"
+"71070","Saline","LA","32.122435","-92.98414","-6","1"
+"71071","Sarepta","LA","32.924798","-93.45295","-6","1"
+"71072","Shongaloo","LA","32.941481","-93.3102","-6","1"
+"71073","Sibley","LA","32.535107","-93.30297","-6","1"
+"71075","Springhill","LA","32.994597","-93.45992","-6","1"
+"71076","Castor","LA","32.25043","-93.155616","-6","1"
+"71078","Stonewall","LA","32.278422","-93.79469","-6","1"
+"71079","Summerfield","LA","32.937726","-92.80471","-6","1"
+"71080","Taylor","LA","32.366002","-93.101086","-6","1"
+"71082","Vivian","LA","32.849008","-93.97599","-6","1"
+"71095","Jamestown","LA","32.34205","-93.203923","-6","1"
+"71101","Shreveport","LA","32.505352","-93.74861","-6","1"
+"71102","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71103","Shreveport","LA","32.490777","-93.76761","-6","1"
+"71104","Shreveport","LA","32.484232","-93.73671","-6","1"
+"71105","Shreveport","LA","32.457903","-93.7133","-6","1"
+"71106","Shreveport","LA","32.426104","-93.74542","-6","1"
+"71107","Shreveport","LA","32.56443","-93.8305","-6","1"
+"71108","Shreveport","LA","32.449286","-93.78","-6","1"
+"71109","Shreveport","LA","32.474453","-93.80022","-6","1"
+"71110","Barksdale AFB","LA","32.477994","-93.61918","-6","1"
+"71111","Bossier City","LA","32.552315","-93.70836","-6","1"
+"71112","Bossier City","LA","32.478752","-93.6704","-6","1"
+"71113","Bossier City","LA","32.62762","-93.608968","-6","1"
+"71115","Shreveport","LA","32.350987","-93.62938","-6","1"
+"71118","Shreveport","LA","32.397255","-93.8043","-6","1"
+"71119","Shreveport","LA","32.487601","-93.89064","-6","1"
+"71120","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71129","Shreveport","LA","32.42067","-93.8877","-6","1"
+"71130","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71133","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71134","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71135","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71136","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71137","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71138","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71148","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71149","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71151","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71152","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71153","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71154","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71156","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71161","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71162","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71163","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71164","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71165","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71166","Shreveport","LA","32.607556","-93.75256","-6","1"
+"71171","Bossier City","LA","32.62762","-93.608968","-6","1"
+"71172","Bossier City","LA","32.62762","-93.608968","-6","1"
+"71201","Monroe","LA","32.519393","-92.10755","-6","1"
+"71202","Monroe","LA","32.456862","-92.08881","-6","1"
+"71203","Monroe","LA","32.547067","-92.04384","-6","1"
+"71207","Monroe","LA","32.490777","-92.159354","-6","1"
+"71208","Monroe","LA","32.496764","-92.075615","-6","1"
+"71209","Monroe","LA","32.527693","-92.075583","-6","1"
+"71210","Monroe","LA","32.490777","-92.159354","-6","1"
+"71211","Monroe","LA","32.490777","-92.159354","-6","1"
+"71212","Monroe","LA","32.528593","-92.072683","-6","1"
+"71213","Monroe","LA","32.490777","-92.159354","-6","1"
+"71218","Archibald","LA","32.350427","-91.7722","-6","1"
+"71219","Baskin","LA","32.308243","-91.71527","-6","1"
+"71220","Bastrop","LA","32.814969","-91.90678","-6","1"
+"71221","Bastrop","LA","32.823863","-91.843528","-6","1"
+"71222","Bernice","LA","32.829213","-92.65296","-6","1"
+"71223","Bonita","LA","32.919093","-91.67737","-6","1"
+"71225","Calhoun","LA","32.507942","-92.34923","-6","1"
+"71226","Chatham","LA","32.277816","-92.45283","-6","1"
+"71227","Choudrant","LA","32.533389","-92.49164","-6","1"
+"71229","Collinston","LA","32.678312","-91.89546","-6","1"
+"71230","Crowville","LA","32.138935","-91.691899","-6","1"
+"71232","Delhi","LA","32.438621","-91.50809","-6","1"
+"71233","Delta","LA","32.341594","-91.216458","-6","1"
+"71234","Downsville","LA","32.641967","-92.3529","-6","1"
+"71235","Dubach","LA","32.683644","-92.67179","-6","1"
+"71237","Epps","LA","32.597244","-91.47664","-6","1"
+"71238","Eros","LA","32.361562","-92.37517","-6","1"
+"71240","Fairbanks","LA","32.490777","-92.159354","-6","1"
+"71241","Farmerville","LA","32.764289","-92.37657","-6","1"
+"71242","Forest","LA","32.82388","-91.398944","-6","1"
+"71243","Fort Necessity","LA","31.950754","-91.78463","-6","1"
+"71245","Grambling","LA","32.526277","-92.71794","-6","1"
+"71247","Hodge","LA","32.272141","-92.72489","-6","1"
+"71249","Jigger","LA","32.138935","-91.691899","-6","1"
+"71250","Jones","LA","32.978295","-91.61945","-6","1"
+"71251","Jonesboro","LA","32.229884","-92.69763","-6","1"
+"71253","Kilbourne","LA","32.995821","-91.31686","-6","1"
+"71254","Lake Providence","LA","32.806899","-91.20759","-6","1"
+"71256","Lillie","LA","32.957004","-92.70152","-6","1"
+"71259","Mangham","LA","32.286179","-91.80804","-6","1"
+"71260","Marion","LA","32.885372","-92.23581","-6","1"
+"71261","Mer Rouge","LA","32.770852","-91.74361","-6","1"
+"71263","Oak Grove","LA","32.887552","-91.4107","-6","1"
+"71264","Oak Ridge","LA","32.601149","-91.79917","-6","1"
+"71266","Pioneer","LA","32.714211","-91.45776","-6","1"
+"71268","Quitman","LA","32.341112","-92.72027","-6","1"
+"71269","Rayville","LA","32.457301","-91.78754","-6","1"
+"71270","Ruston","LA","32.52476","-92.64696","-6","1"
+"71272","Ruston","LA","32.525825","-92.649298","-6","1"
+"71273","Ruston","LA","32.606535","-92.648384","-6","1"
+"71275","Simsboro","LA","32.513699","-92.80633","-6","1"
+"71276","Sondheimer","LA","32.582205","-91.11541","-6","1"
+"71277","Spearsville","LA","32.957393","-92.57935","-6","1"
+"71279","Start","LA","32.49191","-91.856326","-6","1"
+"71280","Sterlington","LA","32.700356","-92.08283","-6","1"
+"71281","Swartz","LA","32.490777","-92.159354","-6","1"
+"71282","Tallulah","LA","32.397286","-91.17657","-6","1"
+"71284","Tallulah","LA","32.341594","-91.216458","-6","1"
+"71286","Transylvania","LA","32.660116","-91.20531","-6","1"
+"71291","West Monroe","LA","32.526944","-92.1599","-6","1"
+"71292","West Monroe","LA","32.456034","-92.18276","-6","1"
+"71294","West Monroe","LA","32.490777","-92.159354","-6","1"
+"71295","Winnsboro","LA","32.156791","-91.72874","-6","1"
+"71301","Alexandria","LA","31.294532","-92.46015","-6","1"
+"71302","Alexandria","LA","31.261716","-92.42469","-6","1"
+"71303","Alexandria","LA","31.302432","-92.50515","-6","1"
+"71306","Alexandria","LA","31.075638","-92.446135","-6","1"
+"71307","Alexandria","LA","31.203393","-92.526927","-6","1"
+"71309","Alexandria","LA","31.30473","-92.619593","-6","1"
+"71315","Alexandria","LA","31.139651","-92.398384","-6","1"
+"71316","Acme","LA","31.252471","-91.77031","-6","1"
+"71320","Bordelonville","LA","31.1741","-91.72501","-6","1"
+"71322","Bunkie","LA","30.920328","-92.16809","-6","1"
+"71323","Center Point","LA","31.247945","-92.21624","-6","1"
+"71324","Chase","LA","32.138935","-91.691899","-6","1"
+"71325","Cheneyville","LA","30.996931","-92.32228","-6","1"
+"71326","Clayton","LA","31.755985","-91.57852","-6","1"
+"71327","Cottonport","LA","30.98676","-92.04319","-6","1"
+"71328","Deville","LA","31.365331","-92.19546","-6","1"
+"71329","Dupont","LA","31.095889","-91.97899","-6","1"
+"71330","Echo","LA","31.110171","-92.23657","-6","1"
+"71331","Effie","LA","31.21968","-92.07345","-6","1"
+"71333","Evergreen","LA","30.930026","-92.08955","-6","1"
+"71334","Ferriday","LA","31.667978","-91.51382","-6","1"
+"71336","Gilbert","LA","32.037425","-91.64475","-6","1"
+"71339","Hamburg","LA","31.024614","-91.92715","-6","1"
+"71340","Harrisonburg","LA","31.765818","-91.82382","-6","1"
+"71341","Hessmer","LA","31.060792","-92.15702","-6","1"
+"71342","Jena","LA","31.654792","-92.12872","-6","1"
+"71343","Jonesville","LA","31.586986","-91.86725","-6","1"
+"71345","Lebeau","LA","30.728695","-91.9727","-6","1"
+"71346","Lecompte","LA","31.114462","-92.40455","-6","1"
+"71348","Libuse","LA","31.203393","-92.526927","-6","1"
+"71350","Mansura","LA","31.067379","-92.05447","-6","1"
+"71351","Marksville","LA","31.140727","-92.08056","-6","1"
+"71353","Melville","LA","30.698425","-91.75288","-6","1"
+"71354","Monterey","LA","31.381317","-91.76914","-6","1"
+"71355","Moreauville","LA","31.05305","-91.91001","-6","1"
+"71356","Morrow","LA","30.835875","-92.06564","-6","1"
+"71357","Newellton","LA","32.090387","-91.24121","-6","1"
+"71358","Palmetto","LA","30.717386","-91.89085","-6","1"
+"71359","Pineville","LA","31.203393","-92.526927","-6","1"
+"71360","Pineville","LA","31.352105","-92.4006","-6","1"
+"71361","Pineville","LA","31.36923","-92.419836","-6","1"
+"71362","Plaucheville","LA","30.945975","-91.95294","-6","1"
+"71363","Rhinehart","LA","31.596272","-91.77941","-6","1"
+"71365","Ruby","LA","31.203393","-92.526927","-6","1"
+"71366","Saint Joseph","LA","31.924224","-91.31265","-6","1"
+"71367","Saint Landry","LA","30.895994","-92.3126","-6","1"
+"71368","Sicily Island","LA","31.85889","-91.67463","-6","1"
+"71369","Simmesport","LA","30.966506","-91.82242","-6","1"
+"71371","Trout","LA","31.695553","-92.22751","-6","1"
+"71373","Vidalia","LA","31.540784","-91.48698","-6","1"
+"71375","Waterproof","LA","31.796575","-91.4343","-6","1"
+"71377","Wildsville","LA","31.615767","-91.78713","-6","1"
+"71378","Wisner","LA","31.938233","-91.70832","-6","1"
+"71401","Aimwell","LA","31.769334","-91.97998","-6","1"
+"71403","Anacoco","LA","31.215039","-93.42301","-6","1"
+"71404","Atlanta","LA","31.755314","-92.75474","-6","1"
+"71405","Ball","LA","31.415125","-92.394536","-6","1"
+"71406","Belmont","LA","31.733049","-93.51746","-6","1"
+"71407","Bentley","LA","31.527479","-92.48404","-6","1"
+"71409","Boyce","LA","31.332031","-92.67485","-6","1"
+"71410","Calvin","LA","31.963299","-92.77985","-6","1"
+"71411","Campti","LA","31.903462","-93.09805","-6","1"
+"71414","Clarence","LA","31.817257","-93.02552","-6","1"
+"71415","Clarks","LA","32.026445","-92.13951","-6","1"
+"71416","Cloutierville","LA","31.541077","-92.89842","-6","1"
+"71417","Colfax","LA","31.5254","-92.6815","-6","1"
+"71418","Columbia","LA","32.130124","-92.06755","-6","1"
+"71419","Converse","LA","31.80442","-93.71835","-6","1"
+"71422","Dodson","LA","32.08115","-92.63979","-6","1"
+"71423","Dry Prong","LA","31.563093","-92.54954","-6","1"
+"71424","Elmer","LA","31.168617","-92.6977","-6","1"
+"71425","Enterprise","LA","31.899409","-91.91043","-6","1"
+"71426","Fisher","LA","31.492622","-93.46457","-6","1"
+"71427","Flatwoods","LA","31.378139","-92.88735","-6","1"
+"71428","Flora","LA","31.612444","-93.097958","-6","1"
+"71429","Florien","LA","31.398236","-93.44422","-6","1"
+"71430","Forest Hill","LA","31.050239","-92.52474","-6","1"
+"71431","Gardner","LA","31.258681","-92.677545","-6","1"
+"71432","Georgetown","LA","31.759474","-92.38927","-6","1"
+"71433","Glenmora","LA","31.004922","-92.62099","-6","1"
+"71434","Gorum","LA","31.440908","-92.94724","-6","1"
+"71435","Grayson","LA","32.024884","-92.16421","-6","1"
+"71436","McNary","LA","30.97759","-92.572039","-6","1"
+"71438","Hineston","LA","31.118135","-92.79996","-6","1"
+"71439","Hornbeck","LA","31.330255","-93.38882","-6","1"
+"71440","Joyce","LA","31.951166","-92.565884","-6","1"
+"71441","Kelly","LA","31.95047","-92.15107","-6","1"
+"71443","Kurthwood","LA","31.1019","-93.361238","-6","1"
+"71444","Lacamp","LA","31.120174","-93.104943","-6","1"
+"71446","Leesville","LA","31.138723","-93.22745","-6","1"
+"71447","Lena","LA","31.452874","-92.79465","-6","1"
+"71448","Longleaf","LA","31.203393","-92.526927","-6","1"
+"71449","Many","LA","31.514631","-93.54869","-6","1"
+"71450","Marthaville","LA","31.77112","-93.41547","-6","1"
+"71452","Melrose","LA","31.612618","-92.98075","-6","1"
+"71454","Montgomery","LA","31.671252","-92.85932","-6","1"
+"71455","Mora","LA","31.371519","-92.97318","-6","1"
+"71456","Natchez","LA","31.660742","-92.98886","-6","1"
+"71457","Natchitoches","LA","31.751287","-93.09021","-6","1"
+"71458","Natchitoches","LA","31.747563","-93.079055","-6","1"
+"71459","Leesville","LA","31.072209","-93.21762","-6","1"
+"71460","Negreet","LA","31.448907","-93.621234","-6","1"
+"71461","Newllano","LA","31.114793","-93.27979","-6","1"
+"71462","Noble","LA","31.672295","-93.71997","-6","1"
+"71463","Oakdale","LA","30.806617","-92.65224","-6","1"
+"71465","Olla","LA","31.861406","-92.19259","-6","1"
+"71466","Otis","LA","31.200922","-92.72641","-6","1"
+"71467","Pollock","LA","31.529155","-92.39418","-6","1"
+"71468","Provencal","LA","31.494144","-93.17508","-6","1"
+"71469","Robeline","LA","31.693192","-93.29586","-6","1"
+"71471","Saint Maurice","LA","31.749699","-92.927989","-6","1"
+"71472","Sieper","LA","31.206148","-92.80459","-6","1"
+"71473","Sikes","LA","32.100491","-92.43442","-6","1"
+"71474","Simpson","LA","31.252873","-93.02395","-6","1"
+"71475","Slagle","LA","31.111979","-93.200936","-6","1"
+"71477","Tioga","LA","31.399855","-92.604193","-6","1"
+"71479","Tullos","LA","31.823038","-92.34017","-6","1"
+"71480","Urania","LA","31.861708","-92.29141","-6","1"
+"71481","Verda","LA","31.592547","-92.58483","-6","1"
+"71483","Winnfield","LA","31.915828","-92.6445","-6","1"
+"71485","Woodworth","LA","31.163538","-92.50144","-6","1"
+"71486","Zwolle","LA","31.597407","-93.66397","-6","1"
+"71496","Leesville","LA","31.110298","-93.289988","-6","1"
+"71497","Natchitoches","LA","31.747563","-93.079055","-6","1"
+"71545","Montgomery","LA","31.66581","-92.890325","-6","1"
+"71601","Pine Bluff","AR","34.215648","-91.98841","-6","1"
+"71602","White Hall","AR","34.261359","-92.09592","-6","1"
+"71603","Pine Bluff","AR","34.189398","-92.04495","-6","1"
+"71611","Pine Bluff","AR","34.261465","-91.955115","-6","1"
+"71612","White Hall","AR","34.277534","-91.832539","-6","1"
+"71613","Pine Bluff","AR","34.157876","-92.071284","-6","1"
+"71630","Arkansas City","AR","33.608935","-91.20577","-6","1"
+"71631","Banks","AR","33.580919","-92.26477","-6","1"
+"71635","Crossett","AR","33.125032","-91.97037","-6","1"
+"71638","Dermott","AR","33.525266","-91.47922","-6","1"
+"71639","Dumas","AR","33.900515","-91.50041","-6","1"
+"71640","Eudora","AR","33.118147","-91.26107","-6","1"
+"71642","Fountain Hill","AR","33.375479","-91.86188","-6","1"
+"71643","Gould","AR","34.004537","-91.5784","-6","1"
+"71644","Grady","AR","34.110042","-91.70488","-6","1"
+"71646","Hamburg","AR","33.224814","-91.79176","-6","1"
+"71647","Hermitage","AR","33.384421","-92.14897","-6","1"
+"71649","Jennie","AR","33.283901","-91.25206","-6","1"
+"71650","Jerome","AR","33.590601","-91.732829","-6","1"
+"71651","Jersey","AR","33.346473","-92.31954","-6","1"
+"71652","Kingsland","AR","33.914079","-92.33251","-6","1"
+"71653","Lake Village","AR","33.351501","-91.27133","-6","1"
+"71654","McGehee","AR","33.628723","-91.38236","-6","1"
+"71655","Monticello","AR","33.62086","-91.76272","-6","1"
+"71656","Monticello","AR","33.592575","-91.81237","-6","1"
+"71657","Monticello","AR","33.590601","-91.732829","-6","1"
+"71658","Montrose","AR","33.323463","-91.54633","-6","1"
+"71659","Moscow","AR","34.154012","-91.80062","-6","1"
+"71660","New Edinburg","AR","33.736301","-92.18447","-6","1"
+"71661","Parkdale","AR","33.133126","-91.53103","-6","1"
+"71662","Pickens","AR","33.818318","-91.214054","-6","1"
+"71663","Portland","AR","33.236401","-91.47982","-6","1"
+"71665","Rison","AR","33.941582","-92.14575","-6","1"
+"71666","McGehee","AR","33.763205","-91.27239","-6","1"
+"71667","Star City","AR","33.945654","-91.83957","-6","1"
+"71670","Tillar","AR","33.737729","-91.41876","-6","1"
+"71671","Warren","AR","33.608004","-92.08101","-6","1"
+"71674","Watson","AR","33.873022","-91.24235","-6","1"
+"71675","Wilmar","AR","33.592313","-91.93607","-6","1"
+"71676","Wilmot","AR","33.059255","-91.55866","-6","1"
+"71677","Winchester","AR","33.749668","-91.4657","-6","1"
+"71678","Yorktown","AR","33.978738","-91.699077","-6","1"
+"71691","Warren","AR","33.608542","-92.081022","-6","1"
+"71701","Camden","AR","33.578096","-92.81368","-6","1"
+"71711","Camden","AR","33.589009","-92.842649","-6","1"
+"71720","Bearden","AR","33.733334","-92.64664","-6","1"
+"71721","Beirne","AR","34.055486","-93.189406","-6","1"
+"71722","Bluff City","AR","33.704074","-93.13364","-6","1"
+"71724","Calion","AR","33.326096","-92.53866","-6","1"
+"71725","Carthage","AR","34.058224","-92.56519","-6","1"
+"71726","Chidester","AR","33.686264","-93.01966","-6","1"
+"71728","Curtis","AR","34.010316","-93.097627","-6","1"
+"71730","El Dorado","AR","33.218456","-92.64911","-6","1"
+"71731","El Dorado","AR","33.198024","-92.52891","-6","1"
+"71740","Emerson","AR","33.091077","-93.18468","-6","1"
+"71742","Fordyce","AR","33.834201","-92.43421","-6","1"
+"71743","Gurdon","AR","33.913838","-93.13855","-6","1"
+"71744","Hampton","AR","33.521575","-92.47898","-6","1"
+"71745","Harrell","AR","33.525889","-92.39227","-6","1"
+"71747","Huttig","AR","33.050688","-92.18501","-6","1"
+"71748","Ivan","AR","33.97547","-92.647817","-6","1"
+"71749","Junction City","AR","33.067477","-92.76449","-6","1"
+"71750","Lawson","AR","33.198024","-92.52891","-6","1"
+"71751","Louann","AR","33.397936","-92.77116","-6","1"
+"71752","McNeil","AR","33.362351","-93.20045","-6","1"
+"71753","Magnolia","AR","33.249608","-93.20427","-6","1"
+"71754","Magnolia","AR","33.242571","-93.22996","-6","1"
+"71758","Mount Holly","AR","33.325889","-92.90485","-6","1"
+"71759","Norphlet","AR","33.323051","-92.66095","-6","1"
+"71762","Smackover","AR","33.350296","-92.7379","-6","1"
+"71763","Sparkman","AR","33.91855","-92.80484","-6","1"
+"71764","Stephens","AR","33.4125","-93.06263","-6","1"
+"71765","Strong","AR","33.123334","-92.34988","-6","1"
+"71766","Thornton","AR","33.741892","-92.48834","-6","1"
+"71767","Hampton","AR","33.535994","-92.543915","-6","1"
+"71768","Urbana","AR","33.198024","-92.52891","-6","1"
+"71769","Village","AR","33.236156","-93.234494","-6","1"
+"71770","Waldo","AR","33.34937","-93.31176","-6","1"
+"71772","Whelen Springs","AR","33.832537","-93.1238","-6","1"
+"71801","Hope","AR","33.657969","-93.59486","-6","1"
+"71802","Hope","AR","33.765584","-93.559162","-6","1"
+"71820","Alleene","AR","33.780463","-94.24384","-6","1"
+"71822","Ashdown","AR","33.675597","-94.13465","-6","1"
+"71823","Ben Lomond","AR","33.822226","-94.13294","-6","1"
+"71825","Blevins","AR","33.867903","-93.57136","-6","1"
+"71826","Bradley","AR","33.102083","-93.67372","-6","1"
+"71827","Buckner","AR","33.378452","-93.43692","-6","1"
+"71828","Cale","AR","33.70082","-93.294126","-6","1"
+"71831","Columbus","AR","33.793524","-93.807007","-6","1"
+"71832","De Queen","AR","34.038226","-94.33597","-6","1"
+"71833","Dierks","AR","34.152505","-94.03786","-6","1"
+"71834","Doddridge","AR","33.09863","-93.95261","-6","1"
+"71835","Emmet","AR","33.70485","-93.46779","-6","1"
+"71836","Foreman","AR","33.731908","-94.38751","-6","1"
+"71837","Fouke","AR","33.271824","-93.85202","-6","1"
+"71838","Fulton","AR","33.638783","-93.80828","-6","1"
+"71839","Garland City","AR","33.312764","-93.71734","-6","1"
+"71840","Genoa","AR","33.316578","-93.854484","-6","1"
+"71841","Gillham","AR","34.163393","-94.3049","-6","1"
+"71842","Horatio","AR","33.927425","-94.30834","-6","1"
+"71844","Laneburg","AR","33.70082","-93.294126","-6","1"
+"71845","Lewisville","AR","33.326251","-93.58986","-6","1"
+"71846","Lockesburg","AR","33.961768","-94.14717","-6","1"
+"71847","McCaskill","AR","33.920355","-93.63751","-6","1"
+"71851","Mineral Springs","AR","33.859173","-93.92692","-6","1"
+"71852","Nashville","AR","33.985613","-93.85214","-6","1"
+"71853","Ogden","AR","33.582879","-94.01151","-6","1"
+"71854","Texarkana","AR","33.428618","-93.99236","-6","1"
+"71855","Ozan","AR","33.865305","-93.7512","-6","1"
+"71857","Prescott","AR","33.806886","-93.36595","-6","1"
+"71858","Rosston","AR","33.551439","-93.28269","-6","1"
+"71859","Saratoga","AR","33.740704","-93.91747","-6","1"
+"71860","Stamps","AR","33.35996","-93.49293","-6","1"
+"71861","Taylor","AR","33.108043","-93.47283","-6","1"
+"71862","Washington","AR","33.761309","-93.71273","-6","1"
+"71864","Willisville","AR","33.70082","-93.294126","-6","1"
+"71865","Wilton","AR","33.741986","-94.14867","-6","1"
+"71866","Winthrop","AR","33.865609","-94.38408","-6","1"
+"71901","Hot Springs National Park","AR","34.506487","-93.01941","-6","1"
+"71902","Hot Springs National Park","AR","34.581374","-93.099403","-6","1"
+"71903","Hot Springs National Park","AR","34.581374","-93.099403","-6","1"
+"71907","Hot Springs","AR","34.532516","-93.048397","-6","1"
+"71909","Hot Springs Village","AR","34.657742","-92.9811","-6","1"
+"71910","Hot Springs Village","AR","34.581374","-93.099403","-6","1"
+"71913","Hot Springs National Park","AR","34.47056","-93.08805","-6","1"
+"71914","Hot Springs National Park","AR","34.513682","-92.968531","-6","1"
+"71920","Alpine","AR","34.055486","-93.189406","-6","1"
+"71921","Amity","AR","34.257603","-93.45822","-6","1"
+"71922","Antoine","AR","34.033062","-93.42614","-6","1"
+"71923","Arkadelphia","AR","34.111837","-93.05585","-6","1"
+"71929","Bismarck","AR","34.285033","-93.19533","-6","1"
+"71932","Board Camp","AR","34.537164","-94.0972","-6","1"
+"71933","Bonnerdale","AR","34.397266","-93.4063","-6","1"
+"71935","Caddo Gap","AR","34.373399","-93.70591","-6","1"
+"71937","Cove","AR","34.398483","-94.39398","-6","1"
+"71940","Delight","AR","34.082845","-93.51733","-6","1"
+"71941","Donaldson","AR","34.254277","-92.95971","-6","1"
+"71942","Friendship","AR","34.223546","-93.002367","-6","1"
+"71943","Glenwood","AR","34.320028","-93.5993","-6","1"
+"71944","Grannis","AR","34.24238","-94.35535","-6","1"
+"71945","Hatfield","AR","34.496472","-94.3691","-6","1"
+"71946","Hatton","AR","34.459413","-94.200221","-6","1"
+"71949","Jessieville","AR","34.727093","-93.03315","-6","1"
+"71950","Kirby","AR","34.251107","-93.76005","-6","1"
+"71951","Hot Springs National Park","AR","34.581374","-93.099403","-6","1"
+"71952","Langley","AR","34.29627","-93.83656","-6","1"
+"71953","Mena","AR","34.588479","-94.21567","-6","1"
+"71956","Mountain Pine","AR","34.663502","-93.23591","-6","1"
+"71957","Mount Ida","AR","34.571277","-93.58361","-6","1"
+"71958","Murfreesboro","AR","34.118589","-93.69401","-6","1"
+"71959","Newhope","AR","34.229742","-93.88694","-6","1"
+"71960","Norman","AR","34.480095","-93.72298","-6","1"
+"71961","Oden","AR","34.606137","-93.82391","-6","1"
+"71962","Okolona","AR","34.072187","-93.33704","-6","1"
+"71964","Pearcy","AR","34.424114","-93.24096","-6","1"
+"71965","Pencil Bluff","AR","34.655204","-93.73748","-6","1"
+"71966","Oden","AR","34.542995","-93.66463","-6","1"
+"71968","Royal","AR","34.522254","-93.25662","-6","1"
+"71969","Sims","AR","34.679542","-93.61788","-6","1"
+"71970","Story","AR","34.669401","-93.4857","-6","1"
+"71971","Umpire","AR","34.299569","-94.03479","-6","1"
+"71972","Vandervoort","AR","34.381056","-94.19716","-6","1"
+"71973","Wickes","AR","34.302177","-94.35083","-6","1"
+"71998","Arkadelphia","AR","34.055486","-93.189406","-6","1"
+"71999","Arkadelphia","AR","34.055486","-93.189406","-6","1"
+"72001","Adona","AR","35.058503","-92.88762","-6","1"
+"72002","Alexander","AR","34.644387","-92.50223","-6","1"
+"72003","Almyra","AR","34.403216","-91.40953","-6","1"
+"72004","Altheimer","AR","34.252213","-91.7679","-6","1"
+"72005","Amagon","AR","35.569503","-91.10435","-6","1"
+"72006","Augusta","AR","35.251768","-91.35603","-6","1"
+"72007","Austin","AR","34.998573","-91.98417","-6","1"
+"72010","Bald Knob","AR","35.321261","-91.54989","-6","1"
+"72011","Bauxite","AR","34.523858","-92.46989","-6","1"
+"72012","Beebe","AR","35.095774","-91.90636","-6","1"
+"72013","Bee Branch","AR","35.452494","-92.36279","-6","1"
+"72014","Beedeville","AR","35.429694","-91.10723","-6","1"
+"72015","Benton","AR","34.564734","-92.59562","-6","1"
+"72016","Bigelow","AR","34.993579","-92.62183","-6","1"
+"72017","Biscoe","AR","34.864607","-91.40408","-6","1"
+"72018","Benton","AR","34.597345","-92.622857","-6","1"
+"72019","North Little Rock","AR","34.804791","-92.28925","-6","1"
+"72020","Bradford","AR","35.461798","-91.46353","-6","1"
+"72021","Brinkley","AR","34.867846","-91.19271","-6","1"
+"72022","Bryant","AR","34.606079","-92.49472","-6","1"
+"72023","Cabot","AR","34.967043","-92.03537","-6","1"
+"72024","Carlisle","AR","34.776306","-91.74635","-6","1"
+"72025","Casa","AR","35.043093","-93.00689","-6","1"
+"72026","Casscoe","AR","34.505369","-91.30213","-6","1"
+"72027","Center Ridge","AR","35.365909","-92.57876","-6","1"
+"72028","Choctaw","AR","35.57727","-92.545572","-6","1"
+"72029","Clarendon","AR","34.697068","-91.29347","-6","1"
+"72030","Cleveland","AR","35.423473","-92.67942","-6","1"
+"72031","Clinton","AR","35.586064","-92.48355","-6","1"
+"72032","Conway","AR","35.075467","-92.43401","-6","1"
+"72033","Conway","AR","35.105306","-92.354915","-6","1"
+"72034","Conway","AR","35.074617","-92.444426","-6","1"
+"72035","Conway","AR","35.105306","-92.354915","-6","1"
+"72036","Cotton Plant","AR","35.011873","-91.25449","-6","1"
+"72037","Coy","AR","34.541185","-91.875767","-6","1"
+"72038","Crocketts Bluff","AR","34.438327","-91.26907","-6","1"
+"72039","Damascus","AR","35.339128","-92.4036","-6","1"
+"72040","Des Arc","AR","34.955641","-91.52399","-6","1"
+"72041","De Valls Bluff","AR","34.745671","-91.46945","-6","1"
+"72042","De Witt","AR","34.283347","-91.32515","-6","1"
+"72043","Diaz","AR","35.633263","-91.26187","-6","1"
+"72044","Edgemont","AR","35.624351","-92.16056","-6","1"
+"72045","El Paso","AR","35.141743","-92.07641","-6","1"
+"72046","England","AR","34.53785","-91.92159","-6","1"
+"72047","Enola","AR","35.220931","-92.21721","-6","1"
+"72048","Ethel","AR","34.28965","-91.13632","-6","1"
+"72051","Fox","AR","35.814005","-92.32243","-6","1"
+"72052","Garner","AR","35.144271","-91.77722","-6","1"
+"72053","College Station","AR","34.708292","-92.22764","-6","1"
+"72055","Gillett","AR","34.109348","-91.36875","-6","1"
+"72057","Grapevine","AR","34.14741","-92.31641","-6","1"
+"72058","Greenbrier","AR","35.236993","-92.37573","-6","1"
+"72059","Gregory","AR","35.179148","-91.259428","-6","1"
+"72060","Griffithville","AR","35.091184","-91.58451","-6","1"
+"72061","Guy","AR","35.311481","-92.27505","-6","1"
+"72063","Hattieville","AR","35.320423","-92.7496","-6","1"
+"72064","Hazen","AR","34.781079","-91.59288","-6","1"
+"72065","Hensley","AR","34.52109","-92.29743","-6","1"
+"72066","Hickory Plains","AR","34.785525","-91.573785","-6","1"
+"72067","Higden","AR","35.564065","-92.1649","-6","1"
+"72068","Higginson","AR","35.169853","-91.70833","-6","1"
+"72069","Holly Grove","AR","34.584347","-91.14873","-6","1"
+"72070","Houston","AR","35.023369","-92.71047","-6","1"
+"72071","Howell","AR","35.179148","-91.259428","-6","1"
+"72072","Humnoke","AR","34.516932","-91.76502","-6","1"
+"72073","Humphrey","AR","34.396301","-91.66201","-6","1"
+"72074","Hunter","AR","35.04369","-91.12029","-6","1"
+"72075","Jacksonport","AR","35.640464","-91.30412","-6","1"
+"72076","Jacksonville","AR","34.879419","-92.12244","-6","1"
+"72078","Jacksonville","AR","34.751918","-92.392487","-6","1"
+"72079","Jefferson","AR","34.401717","-92.20272","-6","1"
+"72080","Jerusalem","AR","35.567694","-92.82756","-6","1"
+"72081","Judsonia","AR","35.319143","-91.65148","-6","1"
+"72082","Kensett","AR","35.233947","-91.67048","-6","1"
+"72083","Keo","AR","34.604268","-92.01479","-6","1"
+"72084","Leola","AR","34.17618","-92.65463","-6","1"
+"72085","Letona","AR","35.362742","-91.8275","-6","1"
+"72086","Lonoke","AR","34.7964","-91.90949","-6","1"
+"72087","Lonsdale","AR","34.581202","-92.8236","-6","1"
+"72088","Fairfield Bay","AR","35.598238","-92.26358","-6","1"
+"72089","Bryant","AR","34.635041","-92.65974","-6","1"
+"72098","Jacksonville","AR","34.89522","-92.140701","-6","1"
+"72099","Little Rock Air Force Base","AR","34.908539","-92.11722","-6","1"
+"72101","McCrory","AR","35.224432","-91.15291","-6","1"
+"72102","McRae","AR","35.125583","-91.82508","-6","1"
+"72103","Mabelvale","AR","34.598551","-92.38169","-6","1"
+"72104","Malvern","AR","34.364093","-92.8146","-6","1"
+"72105","Jones Mill","AR","34.437118","-92.89278","-6","1"
+"72106","Mayflower","AR","34.969848","-92.42483","-6","1"
+"72107","Menifee","AR","35.145915","-92.54648","-6","1"
+"72108","Monroe","AR","34.726737","-91.10958","-6","1"
+"72110","Morrilton","AR","35.156491","-92.75858","-6","1"
+"72111","Mount Vernon","AR","35.227869","-92.13033","-6","1"
+"72112","Newport","AR","35.586065","-91.24695","-6","1"
+"72113","Maumelle","AR","34.854746","-92.39981","-6","1"
+"72114","North Little Rock","AR","34.763924","-92.26463","-6","1"
+"72115","North Little Rock","AR","34.751918","-92.392487","-6","1"
+"72116","North Little Rock","AR","34.799541","-92.24764","-6","1"
+"72117","North Little Rock","AR","34.777238","-92.17913","-6","1"
+"72118","North Little Rock","AR","34.813269","-92.30229","-6","1"
+"72119","North Little Rock","AR","34.80165","-92.259781","-6","1"
+"72120","Sherwood","AR","34.855962","-92.21997","-6","1"
+"72121","Pangburn","AR","35.432905","-91.81901","-6","1"
+"72122","Paron","AR","34.774077","-92.7549","-6","1"
+"72123","Patterson","AR","35.256759","-91.23819","-6","1"
+"72124","North Little Rock","AR","34.751918","-92.392487","-6","1"
+"72125","Perry","AR","35.056424","-92.79432","-6","1"
+"72126","Perryville","AR","34.965699","-92.86841","-6","1"
+"72127","Plumerville","AR","35.155206","-92.61975","-6","1"
+"72128","Poyen","AR","34.32012","-92.63984","-6","1"
+"72129","Prattsville","AR","34.330808","-92.54349","-6","1"
+"72130","Prim","AR","35.638247","-92.06612","-6","1"
+"72131","Quitman","AR","35.402236","-92.20204","-6","1"
+"72132","Redfield","AR","34.443452","-92.1854","-6","1"
+"72133","Reydell","AR","34.165734","-91.57169","-6","1"
+"72134","Roe","AR","34.640886","-91.3892","-6","1"
+"72135","Roland","AR","34.880442","-92.55142","-6","1"
+"72136","Romance","AR","35.230036","-92.01106","-6","1"
+"72137","Rose Bud","AR","35.341123","-92.06141","-6","1"
+"72139","Russell","AR","35.36083","-91.50875","-6","1"
+"72140","Saint Charles","AR","34.383661","-91.15428","-6","1"
+"72141","Scotland","AR","35.51921","-92.66488","-6","1"
+"72142","Scott","AR","34.689349","-92.07792","-6","1"
+"72143","Searcy","AR","35.239022","-91.73776","-6","1"
+"72145","Searcy","AR","35.277393","-91.732556","-6","1"
+"72149","Searcy","AR","35.247376","-91.73139","-6","1"
+"72150","Sheridan","AR","34.31985","-92.39319","-6","1"
+"72152","Sherrill","AR","34.352844","-91.98078","-6","1"
+"72153","Shirley","AR","35.619538","-92.32589","-6","1"
+"72156","Solgohachia","AR","35.284619","-92.6754","-6","1"
+"72157","Springfield","AR","35.290158","-92.55715","-6","1"
+"72158","Benton","AR","34.635041","-92.65974","-6","1"
+"72160","Stuttgart","AR","34.479852","-91.53854","-6","1"
+"72164","Sweet Home","AR","34.687292","-92.2399","-6","1"
+"72165","Thida","AR","35.594246","-91.45052","-6","1"
+"72166","Tichnor","AR","34.061917","-91.24828","-6","1"
+"72167","Traskwood","AR","34.433276","-92.66087","-6","1"
+"72168","Tucker","AR","34.434204","-91.98585","-6","1"
+"72169","Tupelo","AR","35.391629","-91.22927","-6","1"
+"72170","Ulm","AR","34.576099","-91.46138","-6","1"
+"72173","Vilonia","AR","35.102318","-92.22148","-6","1"
+"72175","Wabbaseka","AR","34.351954","-91.77681","-6","1"
+"72176","Ward","AR","35.008529","-91.92244","-6","1"
+"72178","West Point","AR","35.203213","-91.606367","-6","1"
+"72179","Wilburn","AR","35.505158","-91.87084","-6","1"
+"72180","Woodson","AR","34.528857","-92.21175","-6","1"
+"72181","Wooster","AR","35.163915","-92.45297","-6","1"
+"72182","Wright","AR","34.429059","-92.059863","-6","1"
+"72183","Wrightsville","AR","34.600398","-92.19513","-6","1"
+"72189","McCrory","AR","35.179148","-91.259428","-6","1"
+"72190","North Little Rock","AR","34.751918","-92.392487","-6","1"
+"72199","North Little Rock","AR","34.827174","-92.284718","-6","1"
+"72201","Little Rock","AR","34.745692","-92.27987","-6","1"
+"72202","Little Rock","AR","34.739224","-92.27765","-6","1"
+"72203","Little Rock","AR","34.883484","-92.390766","-6","1"
+"72204","Little Rock","AR","34.729159","-92.34019","-6","1"
+"72205","Little Rock","AR","34.752391","-92.3355","-6","1"
+"72206","Little Rock","AR","34.690671","-92.26865","-6","1"
+"72207","Little Rock","AR","34.771291","-92.34242","-6","1"
+"72209","Little Rock","AR","34.674192","-92.35557","-6","1"
+"72210","Little Rock","AR","34.71542","-92.47087","-6","1"
+"72211","Little Rock","AR","34.749723","-92.41345","-6","1"
+"72212","Little Rock","AR","34.783505","-92.40807","-6","1"
+"72214","Little Rock","AR","34.762141","-92.228248","-6","1"
+"72215","Little Rock","AR","34.751918","-92.392487","-6","1"
+"72216","Little Rock","AR","34.817834","-92.235668","-6","1"
+"72217","Little Rock","AR","34.830158","-92.170174","-6","1"
+"72219","Little Rock","AR","34.751918","-92.392487","-6","1"
+"72221","Little Rock","AR","34.751918","-92.392487","-6","1"
+"72222","Little Rock","AR","34.751918","-92.392487","-6","1"
+"72223","Little Rock","AR","34.796399","-92.46821","-6","1"
+"72225","Little Rock","AR","34.751918","-92.392487","-6","1"
+"72227","Little Rock","AR","34.771024","-92.37117","-6","1"
+"72231","Little Rock","AR","34.80189","-92.189397","-6","1"
+"72259","Little Rock","AR","34.661442","-92.318651","-6","1"
+"72295","Little Rock","AR","34.751918","-92.392487","-6","1"
+"72301","West Memphis","AR","35.150009","-90.17636","-6","1"
+"72303","West Memphis","AR","35.137366","-90.285543","-6","1"
+"72310","Armorel","AR","35.852046","-89.972762","-6","1"
+"72311","Aubrey","AR","34.719877","-90.89796","-6","1"
+"72312","Barton","AR","34.546696","-90.767879","-6","1"
+"72313","Bassett","AR","35.712249","-90.028429","-6","1"
+"72314","Birdeye","AR","35.357184","-90.677331","-6","1"
+"72315","Blytheville","AR","35.925991","-89.91767","-6","1"
+"72316","Blytheville","AR","35.694942","-89.966819","-6","1"
+"72319","Gosnell","AR","35.694942","-89.966819","-6","1"
+"72320","Brickeys","AR","34.764633","-90.54588","-6","1"
+"72321","Burdette","AR","35.818518","-89.93751","-6","1"
+"72322","Caldwell","AR","35.061156","-90.81547","-6","1"
+"72324","Cherry Valley","AR","35.387053","-90.76307","-6","1"
+"72325","Clarkedale","AR","35.286354","-90.253781","-6","1"
+"72326","Colt","AR","35.111687","-90.8989","-6","1"
+"72327","Crawfordsville","AR","35.232817","-90.33123","-6","1"
+"72328","Crumrod","AR","34.131527","-90.97793","-6","1"
+"72329","Driver","AR","35.621318","-90.00576","-6","1"
+"72330","Dyess","AR","35.601699","-90.20386","-6","1"
+"72331","Earle","AR","35.266812","-90.46421","-6","1"
+"72332","Edmondson","AR","35.103643","-90.31096","-6","1"
+"72333","Elaine","AR","34.305697","-90.85597","-6","1"
+"72335","Forrest City","AR","35.010683","-90.78048","-6","1"
+"72336","Forrest City","AR","35.100867","-90.726069","-6","1"
+"72338","Frenchmans Bayou","AR","35.443275","-90.17801","-6","1"
+"72339","Gilmore","AR","35.411831","-90.27537","-6","1"
+"72340","Goodwin","AR","34.935463","-91.02712","-6","1"
+"72341","Haynes","AR","34.903767","-90.76129","-6","1"
+"72342","Helena","AR","34.485028","-90.64636","-6","1"
+"72345","Marked Tree","AR","35.531429","-90.414113","-6","1"
+"72346","Heth","AR","35.079258","-90.46399","-6","1"
+"72347","Hickory Ridge","AR","35.396138","-90.99703","-6","1"
+"72348","Hughes","AR","34.935197","-90.44153","-6","1"
+"72350","Joiner","AR","35.512756","-90.14514","-6","1"
+"72351","Keiser","AR","35.673312","-90.0974","-6","1"
+"72352","La Grange","AR","34.769714","-90.755195","-6","1"
+"72353","Lambrook","AR","34.297754","-91.00403","-6","1"
+"72354","Lepanto","AR","35.624419","-90.3249","-6","1"
+"72355","Lexa","AR","34.554466","-90.76901","-6","1"
+"72358","Luxora","AR","35.777085","-89.89214","-6","1"
+"72359","Madison","AR","35.013693","-90.72317","-6","1"
+"72360","Marianna","AR","34.764904","-90.77793","-6","1"
+"72364","Marion","AR","35.200501","-90.20234","-6","1"
+"72365","Marked Tree","AR","35.534421","-90.41892","-6","1"
+"72366","Marvell","AR","34.550982","-90.94433","-6","1"
+"72367","Mellwood","AR","34.189902","-90.97694","-6","1"
+"72368","Moro","AR","34.805649","-91.00582","-6","1"
+"72369","Oneida","AR","34.459854","-90.78022","-6","1"
+"72370","Osceola","AR","35.696385","-90.02631","-6","1"
+"72372","Palestine","AR","34.981162","-90.96503","-6","1"
+"72373","Parkin","AR","35.292009","-90.5875","-6","1"
+"72374","Poplar Grove","AR","34.554559","-90.84231","-6","1"
+"72376","Proctor","AR","35.102775","-90.31884","-6","1"
+"72377","Rivervale","AR","35.679593","-90.34153","-6","1"
+"72379","Snow Lake","AR","34.044682","-91.0194","-6","1"
+"72381","Tomato","AR","35.694942","-89.966819","-6","1"
+"72383","Turner","AR","34.498519","-91.05167","-6","1"
+"72384","Turrell","AR","35.375704","-90.22848","-6","1"
+"72385","Twist","AR","35.296539","-90.772419","-6","1"
+"72386","Tyronza","AR","35.473821","-90.36077","-6","1"
+"72387","Vanndale","AR","35.328336","-90.77134","-6","1"
+"72389","Wabash","AR","34.358049","-90.88366","-6","1"
+"72390","West Helena","AR","34.546274","-90.65869","-6","1"
+"72391","West Ridge","AR","35.694942","-89.966819","-6","1"
+"72392","Wheatley","AR","34.929287","-91.09866","-6","1"
+"72394","Widener","AR","35.05102","-90.63521","-6","1"
+"72395","Wilson","AR","35.585875","-90.04742","-6","1"
+"72396","Wynne","AR","35.229779","-90.83237","-6","1"
+"72397","McCrory","AR","35.296539","-90.772419","-6","1"
+"72401","Jonesboro","AR","35.844795","-90.68443","-6","1"
+"72402","Jonesboro","AR","35.80881","-90.652887","-6","1"
+"72403","Jonesboro","AR","35.830541","-90.703915","-6","1"
+"72404","Jonesboro","AR","35.781707","-90.74506","-6","1"
+"72410","Alicia","AR","35.930405","-91.07664","-6","1"
+"72411","Bay","AR","35.747274","-90.569","-6","1"
+"72412","Beech Grove","AR","36.128323","-90.69114","-6","1"
+"72413","Biggers","AR","36.323353","-90.81054","-6","1"
+"72414","Black Oak","AR","35.823762","-90.37402","-6","1"
+"72415","Black Rock","AR","36.120567","-91.15045","-6","1"
+"72416","Bono","AR","35.927057","-90.79589","-6","1"
+"72417","Brookland","AR","35.92007","-90.57059","-6","1"
+"72419","Caraway","AR","35.755308","-90.32581","-6","1"
+"72421","Cash","AR","35.786094","-90.97073","-6","1"
+"72422","Corning","AR","36.410344","-90.56479","-6","1"
+"72423","Tuckerman","AR","35.723939","-91.203248","-6","1"
+"72424","Datto","AR","36.384555","-90.73187","-6","1"
+"72425","Delaplaine","AR","36.21405","-90.74383","-6","1"
+"72426","Dell","AR","35.855743","-90.04314","-6","1"
+"72427","Egypt","AR","35.867472","-90.94537","-6","1"
+"72428","Etowah","AR","35.744651","-90.22249","-6","1"
+"72429","Fisher","AR","35.49293","-90.95873","-6","1"
+"72430","Greenway","AR","36.334551","-90.19067","-6","1"
+"72431","Grubbs","AR","35.650914","-91.07618","-6","1"
+"72432","Harrisburg","AR","35.555062","-90.71725","-6","1"
+"72433","Hoxie","AR","36.042319","-90.99827","-6","1"
+"72434","Imboden","AR","36.21601","-91.15872","-6","1"
+"72435","Knobel","AR","36.315305","-90.57906","-6","1"
+"72436","Lafe","AR","36.205251","-90.49913","-6","1"
+"72437","Lake City","AR","35.82847","-90.44247","-6","1"
+"72438","Leachville","AR","35.941576","-90.22683","-6","1"
+"72439","Light","AR","36.06805","-90.748876","-6","1"
+"72440","Lynn","AR","35.995653","-91.26055","-6","1"
+"72441","McDougal","AR","36.437727","-90.38816","-6","1"
+"72442","Manila","AR","35.83821","-90.17029","-6","1"
+"72443","Marmaduke","AR","36.179815","-90.39082","-6","1"
+"72444","Maynard","AR","36.422163","-90.88239","-6","1"
+"72445","Minturn","AR","35.972767","-91.02349","-6","1"
+"72447","Monette","AR","35.910391","-90.34016","-6","1"
+"72448","Marmaduke","AR","36.189695","-90.379616","-6","1"
+"72449","O Kean","AR","36.167303","-90.81515","-6","1"
+"72450","Paragould","AR","36.065711","-90.5102","-6","1"
+"72451","Paragould","AR","36.11635","-90.525077","-6","1"
+"72452","Paragould","AR","36.047718","-90.516585","-6","1"
+"72453","Peach Orchard","AR","36.28117","-90.66941","-6","1"
+"72454","Piggott","AR","36.393325","-90.20277","-6","1"
+"72455","Pocahontas","AR","36.304912","-91.0141","-6","1"
+"72456","Pollard","AR","36.438645","-90.30302","-6","1"
+"72457","Portia","AR","36.092999","-91.06249","-6","1"
+"72458","Powhatan","AR","36.065739","-91.15181","-6","1"
+"72459","Ravenden","AR","36.20619","-91.27997","-6","1"
+"72460","Ravenden Springs","AR","36.322642","-91.22327","-6","1"
+"72461","Rector","AR","36.260606","-90.28187","-6","1"
+"72462","Reyno","AR","36.362896","-90.75676","-6","1"
+"72464","Saint Francis","AR","36.458348","-90.14377","-6","1"
+"72465","Sedgwick","AR","35.964317","-90.895421","-6","1"
+"72466","Smithville","AR","36.051063","-91.28209","-6","1"
+"72467","State University","AR","35.843125","-90.67579","-6","1"
+"72469","Strawberry","AR","35.961971","-91.33713","-6","1"
+"72470","Success","AR","36.460317","-90.70524","-6","1"
+"72471","Swifton","AR","35.821708","-91.1314","-6","1"
+"72472","Trumann","AR","35.623029","-90.52742","-6","1"
+"72473","Tuckerman","AR","35.731301","-91.20318","-6","1"
+"72474","Walcott","AR","36.041332","-90.671802","-6","1"
+"72475","Waldenburg","AR","35.564737","-90.93254","-6","1"
+"72476","Walnut Ridge","AR","36.068015","-90.94429","-6","1"
+"72477","Maynard","AR","36.417305","-90.896784","-6","1"
+"72478","Warm Springs","AR","36.464979","-91.053","-6","1"
+"72479","Weiner","AR","35.62608","-90.89575","-6","1"
+"72482","Williford","AR","36.279796","-91.37245","-6","1"
+"72501","Batesville","AR","35.78108","-91.63835","-6","1"
+"72503","Batesville","AR","35.734617","-91.534303","-6","1"
+"72512","Horseshoe Bend","AR","36.225645","-91.75019","-6","1"
+"72513","Ash Flat","AR","36.24564","-91.63703","-6","1"
+"72515","Bexar","AR","36.293095","-92.0417","-6","1"
+"72516","Boswell","AR","36.064329","-91.944673","-6","1"
+"72517","Brockwell","AR","36.126021","-91.96619","-6","1"
+"72519","Calico Rock","AR","36.132092","-92.16638","-6","1"
+"72520","Camp","AR","36.388724","-91.7353","-6","1"
+"72521","Cave City","AR","35.956342","-91.53548","-6","1"
+"72522","Charlotte","AR","35.819494","-91.45128","-6","1"
+"72523","Concord","AR","35.648717","-91.84428","-6","1"
+"72524","Cord","AR","35.836565","-91.30334","-6","1"
+"72525","Cherokee Village","AR","36.302469","-91.59744","-6","1"
+"72526","Cushman","AR","35.873117","-91.7544","-6","1"
+"72527","Desha","AR","35.733939","-91.68913","-6","1"
+"72528","Dolph","AR","36.245162","-92.12962","-6","1"
+"72529","Cherokee Village","AR","36.294732","-91.55777","-6","1"
+"72530","Drasco","AR","35.615841","-91.9451","-6","1"
+"72531","Elizabeth","AR","36.317264","-92.17314","-6","1"
+"72532","Evening Shade","AR","36.088921","-91.59919","-6","1"
+"72533","Fifty Six","AR","35.965754","-92.2303","-6","1"
+"72534","Floral","AR","35.588979","-91.74043","-6","1"
+"72536","Franklin","AR","36.155897","-91.75644","-6","1"
+"72537","Gamaliel","AR","36.428401","-92.23701","-6","1"
+"72538","Gepp","AR","36.427702","-92.11109","-6","1"
+"72539","Glencoe","AR","36.327307","-91.72234","-6","1"
+"72540","Guion","AR","35.929689","-91.92632","-6","1"
+"72542","Hardy","AR","36.303556","-91.48573","-6","1"
+"72543","Heber Springs","AR","35.489516","-92.02327","-6","1"
+"72544","Henderson","AR","36.388751","-92.20206","-6","1"
+"72545","Heber Springs","AR","35.535238","-92.021291","-6","1"
+"72546","Ida","AR","35.581607","-91.930535","-6","1"
+"72550","Locust Grove","AR","35.710614","-91.7639","-6","1"
+"72553","Magness","AR","35.698168","-91.48003","-6","1"
+"72554","Mammoth Spring","AR","36.445205","-91.5553","-6","1"
+"72555","Marcella","AR","35.758314","-91.86797","-6","1"
+"72556","Melbourne","AR","36.035962","-91.92696","-6","1"
+"72557","Moko","AR","36.374704","-91.804608","-6","1"
+"72559","Salem","AR","34.640273","-92.558295","-6","1"
+"72560","Mountain View","AR","35.863114","-92.11108","-6","1"
+"72561","Mount Pleasant","AR","35.959567","-91.76948","-6","1"
+"72562","Newark","AR","35.725631","-91.42605","-6","1"
+"72564","Oil Trough","AR","35.623263","-91.44076","-6","1"
+"72565","Oxford","AR","36.204582","-91.92355","-6","1"
+"72566","Pineville","AR","36.186879","-92.08691","-6","1"
+"72567","Pleasant Grove","AR","35.819261","-91.88291","-6","1"
+"72568","Pleasant Plains","AR","35.561834","-91.62566","-6","1"
+"72569","Poughkeepsie","AR","36.085113","-91.46586","-6","1"
+"72571","Rosie","AR","35.643961","-91.55966","-6","1"
+"72572","Saffell","AR","35.892646","-91.25768","-6","1"
+"72573","Sage","AR","36.058198","-91.80836","-6","1"
+"72575","Salado","AR","35.691868","-91.598917","-6","1"
+"72576","Salem","AR","36.359511","-91.83303","-6","1"
+"72577","Sidney","AR","36.033231","-91.70461","-6","1"
+"72578","Sturkie","AR","36.479925","-91.8863","-6","1"
+"72579","Sulphur Rock","AR","35.785607","-91.47502","-6","1"
+"72581","Tumbling Shoals","AR","35.555144","-91.99286","-6","1"
+"72583","Viola","AR","36.400178","-91.98711","-6","1"
+"72584","Violet Hill","AR","36.136468","-91.82757","-6","1"
+"72585","Wideman","AR","36.170391","-92.02036","-6","1"
+"72587","Wiseman","AR","36.226478","-91.82045","-6","1"
+"72601","Harrison","AR","36.236984","-93.09345","-6","1"
+"72602","Harrison","AR","36.355213","-93.122554","-6","1"
+"72610","Alco","AR","35.883787","-92.41591","-6","1"
+"72611","Alpena","AR","36.272469","-93.31302","-6","1"
+"72613","Beaver","AR","36.431111","-93.699392","-6","1"
+"72615","Bergman","AR","36.308349","-93.032099","-6","1"
+"72616","Berryville","AR","36.350821","-93.56324","-6","1"
+"72617","Big Flat","AR","36.004445","-92.37364","-6","1"
+"72619","Bull Shoals","AR","36.380815","-92.5856","-6","1"
+"72623","Clarkridge","AR","36.484192","-92.29736","-6","1"
+"72624","Compton","AR","36.0717","-93.35157","-6","1"
+"72626","Cotter","AR","36.276949","-92.53279","-6","1"
+"72628","Deer","AR","35.839126","-93.27737","-6","1"
+"72629","Dennard","AR","35.755793","-92.54556","-6","1"
+"72630","Diamond City","AR","36.461305","-92.91702","-6","1"
+"72631","Eureka Springs","AR","36.443322","-93.77474","-6","1"
+"72632","Eureka Springs","AR","36.392122","-93.7476","-6","1"
+"72633","Everton","AR","36.150276","-92.89576","-6","1"
+"72634","Flippin","AR","36.263145","-92.57635","-6","1"
+"72635","Gassville","AR","36.297345","-92.48429","-6","1"
+"72636","Gilbert","AR","35.916744","-92.681408","-6","1"
+"72638","Green Forest","AR","36.327014","-93.40111","-6","1"
+"72639","Harriet","AR","36.021569","-92.48605","-6","1"
+"72640","Hasty","AR","36.000804","-93.01818","-6","1"
+"72641","Jasper","AR","35.979619","-93.23783","-6","1"
+"72642","Lakeview","AR","36.378546","-92.53817","-6","1"
+"72644","Lead Hill","AR","36.424286","-92.925","-6","1"
+"72645","Leslie","AR","35.800025","-92.57586","-6","1"
+"72648","Marble Falls","AR","36.083655","-93.12978","-6","1"
+"72650","Marshall","AR","35.896883","-92.66479","-6","1"
+"72651","Midway","AR","36.389591","-92.48025","-6","1"
+"72653","Mountain Home","AR","36.329026","-92.35781","-6","1"
+"72654","Mountain Home","AR","36.23638","-92.372635","-6","1"
+"72655","Mount Judea","AR","35.927363","-93.0179","-6","1"
+"72657","Timbo","AR","35.91896","-92.127207","-6","1"
+"72658","Norfork","AR","36.193278","-92.29362","-6","1"
+"72659","Norfork","AR","36.23638","-92.372635","-6","1"
+"72660","Oak Grove","AR","36.492129","-93.3744","-6","1"
+"72661","Oakland","AR","36.459703","-92.60271","-6","1"
+"72662","Omaha","AR","36.427675","-93.19473","-6","1"
+"72663","Onia","AR","35.927802","-92.32249","-6","1"
+"72666","Parthenon","AR","35.955198","-93.25985","-6","1"
+"72668","Peel","AR","36.427511","-92.76948","-6","1"
+"72669","Pindall","AR","36.087461","-92.88803","-6","1"
+"72670","Ponca","AR","35.924868","-93.232298","-6","1"
+"72672","Pyatt","AR","36.264469","-92.84044","-6","1"
+"72675","Saint Joe","AR","36.021564","-92.77395","-6","1"
+"72677","Summit","AR","36.255295","-92.68844","-6","1"
+"72679","Tilly","AR","35.721896","-92.82678","-6","1"
+"72680","Timbo","AR","35.880462","-92.29117","-6","1"
+"72682","Valley Springs","AR","36.136628","-92.75237","-6","1"
+"72683","Vendor","AR","35.906856","-93.13425","-6","1"
+"72685","Western Grove","AR","36.062264","-92.96277","-6","1"
+"72686","Witts Springs","AR","35.747154","-92.90985","-6","1"
+"72687","Yellville","AR","36.242942","-92.69011","-6","1"
+"72701","Fayetteville","AR","36.040467","-94.13376","-6","1"
+"72702","Fayetteville","AR","35.99403","-94.219977","-6","1"
+"72703","Fayetteville","AR","36.107078","-94.11592","-6","1"
+"72704","Fayetteville","AR","36.096998","-94.2486","-6","1"
+"72711","Avoca","AR","36.40137","-94.07106","-6","1"
+"72712","Bentonville","AR","36.362525","-94.23308","-6","1"
+"72714","Bella Vista","AR","36.458041","-94.23551","-6","1"
+"72715","Bella Vista","AR","36.472567","-94.31606","-6","1"
+"72716","Bentonville","AR","36.299507","-93.956801","-6","1"
+"72717","Canehill","AR","35.852946","-94.4219","-6","1"
+"72718","Cave Springs","AR","36.267484","-94.22806","-6","1"
+"72719","Centerton","AR","36.36157","-94.29398","-6","1"
+"72721","Combs","AR","35.829657","-93.8354","-6","1"
+"72722","Decatur","AR","36.3389","-94.46394","-6","1"
+"72727","Elkins","AR","35.970492","-93.94296","-6","1"
+"72728","Elm Springs","AR","36.210013","-94.254573","-6","1"
+"72729","Evansville","AR","35.797242","-94.47662","-6","1"
+"72730","Farmington","AR","36.03667","-94.25261","-6","1"
+"72732","Garfield","AR","36.434311","-93.96045","-6","1"
+"72733","Gateway","AR","36.486424","-93.927748","-6","1"
+"72734","Gentry","AR","36.269478","-94.46137","-6","1"
+"72735","Goshen","AR","36.087551","-93.966645","-6","1"
+"72736","Gravette","AR","36.412233","-94.45226","-6","1"
+"72737","Greenland","AR","35.928186","-94.152899","-6","1"
+"72738","Hindsville","AR","36.155775","-93.88706","-6","1"
+"72739","Hiwasse","AR","36.437635","-94.33047","-6","1"
+"72740","Huntsville","AR","36.1161","-93.68605","-6","1"
+"72741","Johnson","AR","35.99403","-94.219977","-6","1"
+"72742","Kingston","AR","35.992386","-93.47918","-6","1"
+"72744","Lincoln","AR","35.954697","-94.42735","-6","1"
+"72745","Lowell","AR","36.247575","-94.11371","-6","1"
+"72747","Maysville","AR","36.381787","-94.58854","-6","1"
+"72749","Morrow","AR","35.864399","-94.43534","-6","1"
+"72751","Pea Ridge","AR","36.460576","-94.13334","-6","1"
+"72752","Pettigrew","AR","35.824911","-93.56071","-6","1"
+"72753","Prairie Grove","AR","35.951426","-94.32246","-6","1"
+"72756","Rogers","AR","36.342235","-94.07141","-6","1"
+"72757","Rogers","AR","36.371981","-94.115649","-6","1"
+"72758","Rogers","AR","36.306616","-94.14622","-6","1"
+"72760","Saint Paul","AR","35.82635","-93.73715","-6","1"
+"72761","Siloam Springs","AR","36.179905","-94.50208","-6","1"
+"72762","Springdale","AR","36.186059","-94.1937","-6","1"
+"72764","Springdale","AR","36.182407","-94.1082","-6","1"
+"72765","Springdale","AR","36.172541","-94.153512","-6","1"
+"72766","Springdale","AR","35.99403","-94.219977","-6","1"
+"72768","Sulphur Springs","AR","36.484548","-94.46911","-6","1"
+"72769","Summers","AR","36.027493","-94.50146","-6","1"
+"72770","Tontitown","AR","36.14998","-94.242884","-6","1"
+"72773","Wesley","AR","36.019883","-93.8651","-6","1"
+"72774","West Fork","AR","35.896307","-94.19661","-6","1"
+"72776","Witter","AR","35.934679","-93.64583","-6","1"
+"72801","Russellville","AR","35.278429","-93.13682","-6","1"
+"72802","Russellville","AR","35.308848","-93.10909","-6","1"
+"72811","Russellville","AR","35.314678","-93.113308","-6","1"
+"72812","Russellville","AR","35.423102","-93.054388","-6","1"
+"72820","Alix","AR","35.415616","-93.73383","-6","1"
+"72821","Altus","AR","35.44477","-93.747","-6","1"
+"72822","Russellville","AR","35.329457","-93.112368","-6","1"
+"72823","Atkins","AR","35.261843","-92.90795","-6","1"
+"72824","Belleville","AR","35.108311","-93.42594","-6","1"
+"72826","Blue Mountain","AR","35.161856","-93.65615","-6","1"
+"72827","Bluffton","AR","34.832089","-93.71111","-6","1"
+"72828","Briggsville","AR","34.929705","-93.53009","-6","1"
+"72829","Centerville","AR","35.110131","-93.17279","-6","1"
+"72830","Clarksville","AR","35.490105","-93.4851","-6","1"
+"72832","Coal Hill","AR","35.435619","-93.67368","-6","1"
+"72833","Danville","AR","35.044021","-93.4195","-6","1"
+"72834","Dardanelle","AR","35.199221","-93.17973","-6","1"
+"72835","Delaware","AR","35.299773","-93.35469","-6","1"
+"72837","Dover","AR","35.460782","-93.10863","-6","1"
+"72838","Gravelly","AR","34.88007","-93.70593","-6","1"
+"72839","Hagarville","AR","35.651525","-93.29708","-6","1"
+"72840","Hartman","AR","35.437519","-93.61675","-6","1"
+"72841","Harvey","AR","34.866017","-93.77678","-6","1"
+"72842","Havana","AR","35.111397","-93.58735","-6","1"
+"72843","Hector","AR","35.517382","-92.95354","-6","1"
+"72845","Knoxville","AR","35.376739","-93.35706","-6","1"
+"72846","Lamar","AR","35.470638","-93.36042","-6","1"
+"72847","London","AR","35.380528","-93.28528","-6","1"
+"72851","New Blaine","AR","35.289176","-93.44323","-6","1"
+"72852","Oark","AR","35.689689","-93.55764","-6","1"
+"72853","Ola","AR","35.014918","-93.25496","-6","1"
+"72854","Ozone","AR","35.686766","-93.42258","-6","1"
+"72855","Paris","AR","35.293281","-93.72139","-6","1"
+"72856","Pelsor","AR","35.794196","-93.04185","-6","1"
+"72857","Plainview","AR","34.865448","-93.33057","-6","1"
+"72858","Pottsville","AR","35.228264","-93.03947","-6","1"
+"72860","Rover","AR","34.949945","-93.40287","-6","1"
+"72863","Scranton","AR","35.358493","-93.52793","-6","1"
+"72865","Subiaco","AR","35.306084","-93.57336","-6","1"
+"72901","Fort Smith","AR","35.373791","-94.41371","-6","1"
+"72902","Fort Smith","AR","35.38619","-94.409114","-6","1"
+"72903","Fort Smith","AR","35.357041","-94.36914","-6","1"
+"72904","Fort Smith","AR","35.406185","-94.39103","-6","1"
+"72905","Fort Smith","AR","35.191046","-94.23816","-6","1"
+"72906","Fort Smith","AR","35.191046","-94.23816","-6","1"
+"72908","Fort Smith","AR","35.301623","-94.41283","-6","1"
+"72913","Fort Smith","AR","35.191046","-94.23816","-6","1"
+"72914","Fort Smith","AR","35.191046","-94.23816","-6","1"
+"72916","Fort Smith","AR","35.265119","-94.37789","-6","1"
+"72917","Fort Smith","AR","35.191046","-94.23816","-6","1"
+"72918","Fort Smith","AR","35.191046","-94.23816","-6","1"
+"72919","Fort Smith","AR","35.191046","-94.23816","-6","1"
+"72921","Alma","AR","35.48891","-94.20897","-6","1"
+"72923","Barling","AR","35.332908","-94.30853","-6","1"
+"72924","Bates","AR","34.882558","-94.079724","-6","1"
+"72926","Boles","AR","34.734204","-94.05784","-6","1"
+"72927","Booneville","AR","35.105966","-93.97531","-6","1"
+"72928","Branch","AR","35.297936","-93.94723","-6","1"
+"72930","Cecil","AR","35.426502","-94.04509","-6","1"
+"72932","Cedarville","AR","35.604409","-94.37313","-6","1"
+"72933","Charleston","AR","35.312232","-94.0371","-6","1"
+"72934","Chester","AR","35.668554","-94.27583","-6","1"
+"72935","Dyer","AR","35.478787","-94.11998","-6","1"
+"72936","Greenwood","AR","35.200061","-94.24376","-6","1"
+"72937","Hackett","AR","35.15875","-94.39462","-6","1"
+"72938","Hartford","AR","35.026991","-94.36684","-6","1"
+"72940","Huntington","AR","35.105477","-94.26995","-6","1"
+"72941","Lavaca","AR","35.348089","-94.17279","-6","1"
+"72943","Magazine","AR","35.184949","-93.80443","-6","1"
+"72944","Mansfield","AR","35.057119","-94.234","-6","1"
+"72945","Midland","AR","35.090489","-94.35097","-6","1"
+"72946","Mountainburg","AR","35.649503","-94.15357","-6","1"
+"72947","Mulberry","AR","35.528854","-94.05225","-6","1"
+"72948","Natural Dam","AR","35.72446","-94.41065","-6","1"
+"72949","Ozark","AR","35.549469","-93.81819","-6","1"
+"72950","Parks","AR","34.779465","-93.90077","-6","1"
+"72951","Ratcliff","AR","35.312316","-93.8805","-6","1"
+"72952","Rudy","AR","35.562293","-94.31088","-6","1"
+"72955","Uniontown","AR","35.594579","-94.44989","-6","1"
+"72956","Van Buren","AR","35.456536","-94.34581","-6","1"
+"72957","Van Buren","AR","35.494412","-94.318648","-6","1"
+"72958","Waldron","AR","34.907335","-94.13624","-6","1"
+"72959","Winslow","AR","35.797792","-94.11367","-6","1"
+"73001","Albert","OK","35.203206","-98.357423","-6","1"
+"73002","Alex","OK","34.936221","-97.74453","-6","1"
+"73003","Edmond","OK","35.681402","-97.5331","-6","1"
+"73004","Amber","OK","35.152892","-97.85582","-6","1"
+"73005","Anadarko","OK","35.050671","-98.23984","-6","1"
+"73006","Apache","OK","34.894964","-98.38697","-6","1"
+"73007","Arcadia","OK","35.685368","-97.32739","-6","1"
+"73008","Bethany","OK","35.506456","-97.63934","-6","1"
+"73009","Binger","OK","35.292476","-98.35804","-6","1"
+"73010","Blanchard","OK","35.118392","-97.66381","-6","1"
+"73011","Bradley","OK","34.868514","-97.71386","-6","1"
+"73012","Bray","OK","34.48532","-97.852223","-6","1"
+"73013","Edmond","OK","35.623805","-97.47909","-6","1"
+"73014","Calumet","OK","35.587497","-98.14506","-6","1"
+"73015","Carnegie","OK","35.113271","-98.58643","-6","1"
+"73016","Cashion","OK","35.805831","-97.68754","-6","1"
+"73017","Cement","OK","34.932493","-98.11946","-6","1"
+"73018","Chickasha","OK","35.040526","-97.94723","-6","1"
+"73019","Norman","OK","35.208566","-97.44451","-6","1"
+"73020","Choctaw","OK","35.465363","-97.26645","-6","1"
+"73021","Colony","OK","35.34525","-98.66403","-6","1"
+"73022","Concho","OK","35.618487","-97.99188","-6","1"
+"73023","Chickasha","OK","35.031247","-97.881959","-6","1"
+"73024","Corn","OK","35.370775","-98.80897","-6","1"
+"73026","Norman","OK","35.22704","-97.28198","-6","1"
+"73027","Coyle","OK","35.975057","-97.25088","-6","1"
+"73028","Crescent","OK","35.96375","-97.63071","-6","1"
+"73029","Cyril","OK","34.907566","-98.19738","-6","1"
+"73030","Davis","OK","34.485896","-97.14753","-6","1"
+"73031","Dibble","OK","35.027","-97.62801","-6","1"
+"73032","Dougherty","OK","34.400476","-97.05041","-6","1"
+"73033","Eakly","OK","35.303547","-98.55543","-6","1"
+"73034","Edmond","OK","35.683768","-97.44686","-6","1"
+"73036","El Reno","OK","35.519046","-97.95534","-6","1"
+"73038","Fort Cobb","OK","35.137863","-98.43667","-6","1"
+"73040","Geary","OK","35.631117","-98.35764","-6","1"
+"73041","Gotebo","OK","35.045196","-98.87586","-6","1"
+"73042","Gracemont","OK","35.218293","-98.2484","-6","1"
+"73043","Greenfield","OK","35.730049","-98.38577","-6","1"
+"73044","Guthrie","OK","35.857303","-97.43176","-6","1"
+"73045","Harrah","OK","35.491184","-97.16132","-6","1"
+"73047","Hinton","OK","35.463837","-98.32451","-6","1"
+"73048","Hydro","OK","35.471566","-98.54418","-6","1"
+"73049","Jones","OK","35.572909","-97.29596","-6","1"
+"73050","Langston","OK","35.941421","-97.25495","-6","1"
+"73051","Lexington","OK","35.039068","-97.29276","-6","1"
+"73052","Lindsay","OK","34.839562","-97.60045","-6","1"
+"73053","Lookeba","OK","35.372736","-98.41223","-6","1"
+"73054","Luther","OK","35.662619","-97.18976","-6","1"
+"73055","Marlow","OK","34.637595","-97.93235","-6","1"
+"73056","Marshall","OK","36.153239","-97.62988","-6","1"
+"73057","Maysville","OK","34.828663","-97.42481","-6","1"
+"73058","Meridian","OK","35.821107","-97.23455","-6","1"
+"73059","Minco","OK","35.313109","-98.01237","-6","1"
+"73061","Morrison","OK","36.323723","-97.00904","-6","1"
+"73062","Mountain View","OK","35.062348","-98.73519","-6","1"
+"73063","Mulhall","OK","36.06773","-97.43987","-6","1"
+"73064","Mustang","OK","35.388059","-97.73626","-6","1"
+"73065","Newcastle","OK","35.240232","-97.60908","-6","1"
+"73066","Nicoma Park","OK","35.491226","-97.32434","-6","1"
+"73067","Ninnekah","OK","34.909551","-97.9436","-6","1"
+"73068","Noble","OK","35.138421","-97.32689","-6","1"
+"73069","Norman","OK","35.228649","-97.45629","-6","1"
+"73070","Norman","OK","35.187611","-97.397509","-6","1"
+"73071","Norman","OK","35.225702","-97.42394","-6","1"
+"73072","Norman","OK","35.212681","-97.48672","-6","1"
+"73073","Orlando","OK","36.151316","-97.36279","-6","1"
+"73074","Paoli","OK","34.831083","-97.2718","-6","1"
+"73075","Pauls Valley","OK","34.741677","-97.22846","-6","1"
+"73077","Perry","OK","36.308588","-97.28809","-6","1"
+"73078","Piedmont","OK","35.654827","-97.76238","-6","1"
+"73079","Pocasset","OK","35.210855","-98.01195","-6","1"
+"73080","Purcell","OK","35.017656","-97.39646","-6","1"
+"73082","Rush Springs","OK","34.790635","-97.93807","-6","1"
+"73083","Edmond","OK","35.666481","-97.465436","-6","1"
+"73084","Spencer","OK","35.52106","-97.34173","-6","1"
+"73085","Yukon","OK","35.489527","-97.750009","-6","1"
+"73086","Sulphur","OK","34.49284","-96.98606","-6","1"
+"73089","Tuttle","OK","35.279882","-97.78458","-6","1"
+"73090","Union City","OK","35.394725","-97.93552","-6","1"
+"73092","Verden","OK","35.109275","-98.08247","-6","1"
+"73093","Washington","OK","35.089882","-97.48837","-6","1"
+"73094","Washita","OK","35.203206","-98.357423","-6","1"
+"73095","Wayne","OK","34.913215","-97.30452","-6","1"
+"73096","Weatherford","OK","35.527593","-98.71259","-6","1"
+"73097","Wheatland","OK","35.397259","-97.65189","-6","1"
+"73098","Wynnewood","OK","34.634693","-97.16322","-6","1"
+"73099","Yukon","OK","35.506204","-97.74814","-6","1"
+"73101","Oklahoma City","OK","35.491608","-97.562817","-6","1"
+"73102","Oklahoma City","OK","35.47156","-97.52036","-6","1"
+"73103","Oklahoma City","OK","35.489709","-97.51819","-6","1"
+"73104","Oklahoma City","OK","35.47596","-97.50586","-6","1"
+"73105","Oklahoma City","OK","35.509659","-97.50211","-6","1"
+"73106","Oklahoma City","OK","35.482309","-97.53499","-6","1"
+"73107","Oklahoma City","OK","35.484558","-97.57336","-6","1"
+"73108","Oklahoma City","OK","35.447126","-97.55824","-6","1"
+"73109","Oklahoma City","OK","35.43366","-97.52496","-6","1"
+"73110","Oklahoma City","OK","35.459478","-97.39721","-6","1"
+"73111","Oklahoma City","OK","35.504109","-97.47889","-6","1"
+"73112","Oklahoma City","OK","35.517857","-97.57284","-6","1"
+"73113","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73114","Oklahoma City","OK","35.568806","-97.52544","-6","1"
+"73115","Oklahoma City","OK","35.440311","-97.44201","-6","1"
+"73116","Oklahoma City","OK","35.544864","-97.55637","-6","1"
+"73117","Oklahoma City","OK","35.476457","-97.47411","-6","1"
+"73118","Oklahoma City","OK","35.515008","-97.53106","-6","1"
+"73119","Oklahoma City","OK","35.42306","-97.56051","-6","1"
+"73120","Oklahoma City","OK","35.579488","-97.56496","-6","1"
+"73121","Oklahoma City","OK","35.50356","-97.44693","-6","1"
+"73122","Oklahoma City","OK","35.520506","-97.6133","-6","1"
+"73123","Oklahoma City","OK","35.535989","-97.202331","-6","1"
+"73124","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73125","Oklahoma City","OK","35.465418","-97.521816","-6","1"
+"73126","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73127","Oklahoma City","OK","35.481507","-97.6423","-6","1"
+"73128","Oklahoma City","OK","35.441759","-97.62721","-6","1"
+"73129","Oklahoma City","OK","35.431361","-97.49267","-6","1"
+"73130","Oklahoma City","OK","35.459512","-97.35183","-6","1"
+"73131","Oklahoma City","OK","35.576357","-97.46924","-6","1"
+"73132","Oklahoma City","OK","35.552755","-97.63571","-6","1"
+"73134","Oklahoma City","OK","35.612359","-97.57152","-6","1"
+"73135","Oklahoma City","OK","35.40017","-97.43249","-6","1"
+"73136","Oklahoma City","OK","35.61534","-97.326151","-6","1"
+"73137","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73139","Oklahoma City","OK","35.388461","-97.52713","-6","1"
+"73140","Oklahoma City","OK","35.518509","-97.427464","-6","1"
+"73141","Oklahoma City","OK","35.498461","-97.39314","-6","1"
+"73142","Oklahoma City","OK","35.605785","-97.63042","-6","1"
+"73143","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73144","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73145","Oklahoma City","OK","35.433093","-97.39844","-6","1"
+"73146","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73147","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73148","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73149","Oklahoma City","OK","35.395362","-97.49701","-6","1"
+"73150","Oklahoma City","OK","35.407113","-97.33996","-6","1"
+"73151","Oklahoma City","OK","35.568867","-97.4055","-6","1"
+"73152","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73153","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73154","Oklahoma City","OK","35.523758","-97.525467","-6","1"
+"73155","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73156","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73157","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73159","Oklahoma City","OK","35.386411","-97.55731","-6","1"
+"73160","Oklahoma City","OK","35.34377","-97.48596","-6","1"
+"73162","Oklahoma City","OK","35.579254","-97.63765","-6","1"
+"73163","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73164","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73165","Oklahoma City","OK","35.338689","-97.36747","-6","1"
+"73167","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73169","Oklahoma City","OK","35.388023","-97.64135","-6","1"
+"73170","Oklahoma City","OK","35.338716","-97.53569","-6","1"
+"73172","Oklahoma City","OK","35.517456","-97.621769","-6","1"
+"73173","Oklahoma City","OK","35.355645","-97.64479","-6","1"
+"73177","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73178","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73179","Oklahoma City","OK","35.416826","-97.62787","-6","1"
+"73180","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73184","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73185","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73189","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73190","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73193","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73194","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73196","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73197","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73198","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73199","Oklahoma City","OK","35.551409","-97.407537","-6","1"
+"73301","Austin","TX","30.326374","-97.771258","-6","1"
+"73344","Austin","TX","30.326374","-97.771258","-6","1"
+"73367","Sterling","OK","34.752406","-98.171022","-6","1"
+"73371","Ames","OK","36.248359","-98.189412","-6","1"
+"73401","Ardmore","OK","34.184742","-97.12655","-6","1"
+"73402","Ardmore","OK","34.288884","-97.248074","-6","1"
+"73403","Ardmore","OK","34.288884","-97.248074","-6","1"
+"73425","Countyline","OK","34.447003","-97.55801","-6","1"
+"73430","Burneyville","OK","33.925768","-97.36956","-6","1"
+"73432","Coleman","OK","34.252682","-96.43358","-6","1"
+"73433","Elmore City","OK","34.625144","-97.39901","-6","1"
+"73434","Foster","OK","34.647208","-97.55044","-6","1"
+"73435","Fox","OK","34.354547","-97.4843","-6","1"
+"73436","Gene Autry","OK","34.293948","-97.033905","-6","1"
+"73437","Graham","OK","34.363418","-97.43017","-6","1"
+"73438","Healdton","OK","34.238486","-97.48895","-6","1"
+"73439","Kingston","OK","33.938714","-96.71234","-6","1"
+"73440","Lebanon","OK","33.975243","-96.90609","-6","1"
+"73441","Leon","OK","33.877679","-97.42814","-6","1"
+"73442","Loco","OK","34.329621","-97.68182","-6","1"
+"73443","Lone Grove","OK","34.175234","-97.28894","-6","1"
+"73444","Hennepin","OK","34.499735","-97.36406","-6","1"
+"73445","Ravia","OK","34.244011","-96.751093","-6","1"
+"73446","Madill","OK","34.092658","-96.74851","-6","1"
+"73447","Mannsville","OK","34.225742","-96.86109","-6","1"
+"73448","Marietta","OK","33.9401","-97.11031","-6","1"
+"73449","Mead","OK","33.990978","-96.54409","-6","1"
+"73450","Milburn","OK","34.273995","-96.54837","-6","1"
+"73453","Overbrook","OK","34.033426","-97.24379","-6","1"
+"73455","Ravia","OK","34.240761","-96.75726","-6","1"
+"73456","Ringling","OK","34.165558","-97.62121","-6","1"
+"73458","Springer","OK","34.337522","-97.23958","-6","1"
+"73459","Thackerville","OK","33.794716","-97.13848","-6","1"
+"73460","Tishomingo","OK","34.253452","-96.68124","-6","1"
+"73461","Wapanucka","OK","34.367986","-96.43012","-6","1"
+"73463","Wilson","OK","34.149455","-97.43096","-6","1"
+"73476","Pernell","OK","34.680871","-97.300429","-6","1"
+"73481","Ratliff City","OK","34.43664","-97.50121","-6","1"
+"73487","Tatums","OK","34.481151","-97.46209","-6","1"
+"73488","Tussy","OK","34.4836","-97.54783","-6","1"
+"73491","Velma","OK","34.462809","-97.65419","-6","1"
+"73501","Lawton","OK","34.608348","-98.39414","-6","1"
+"73502","Lawton","OK","34.630879","-98.457646","-6","1"
+"73503","Fort Sill","OK","34.69727","-98.46808","-6","1"
+"73505","Lawton","OK","34.613973","-98.46255","-6","1"
+"73506","Lawton","OK","34.630879","-98.457646","-6","1"
+"73507","Lawton","OK","34.621373","-98.4001","-6","1"
+"73520","Addington","OK","34.243494","-97.93843","-6","1"
+"73521","Altus","OK","34.638773","-99.31787","-6","1"
+"73522","Altus","OK","34.723795","-99.383928","-6","1"
+"73523","Altus AFB","OK","34.598197","-99.440839","-6","1"
+"73526","Blair","OK","34.776114","-99.30835","-6","1"
+"73527","Cache","OK","34.613786","-98.62492","-6","1"
+"73528","Chattanooga","OK","34.425098","-98.65892","-6","1"
+"73529","Comanche","OK","34.372622","-97.97809","-6","1"
+"73530","Davidson","OK","34.254376","-99.05182","-6","1"
+"73531","Devol","OK","34.209826","-98.54891","-6","1"
+"73532","Duke","OK","34.649815","-99.55555","-6","1"
+"73533","Duncan","OK","34.502833","-97.95185","-6","1"
+"73534","Duncan","OK","34.518944","-97.973331","-6","1"
+"73536","Duncan","OK","34.48532","-97.852223","-6","1"
+"73537","Eldorado","OK","34.49515","-99.67861","-6","1"
+"73538","Elgin","OK","34.747379","-98.27805","-6","1"
+"73539","Elmer","OK","34.457367","-99.28051","-6","1"
+"73540","Faxon","OK","34.465332","-98.56181","-6","1"
+"73541","Fletcher","OK","34.809495","-98.19821","-6","1"
+"73542","Frederick","OK","34.410061","-98.96701","-6","1"
+"73543","Geronimo","OK","34.478901","-98.37791","-6","1"
+"73544","Gould","OK","34.681369","-99.74534","-6","1"
+"73546","Grandfield","OK","34.239154","-98.72275","-6","1"
+"73547","Granite","OK","34.976173","-99.3952","-6","1"
+"73548","Hastings","OK","34.239192","-98.11312","-6","1"
+"73549","Headrick","OK","34.645375","-99.15211","-6","1"
+"73550","Hollis","OK","34.688567","-99.90944","-6","1"
+"73551","Hollister","OK","34.325802","-98.86104","-6","1"
+"73552","Indiahoma","OK","34.62256","-98.75386","-6","1"
+"73553","Loveland","OK","34.330239","-98.70098","-6","1"
+"73554","Mangum","OK","34.855652","-99.52012","-6","1"
+"73555","Manitou","OK","34.50847","-98.96369","-6","1"
+"73556","Martha","OK","34.751924","-99.39383","-6","1"
+"73557","Medicine Park","OK","34.72775","-98.5008","-6","1"
+"73558","Meers","OK","34.630879","-98.457646","-6","1"
+"73559","Mountain Park","OK","34.696985","-98.96184","-6","1"
+"73560","Olustee","OK","34.571329","-99.45164","-6","1"
+"73561","Oscar","OK","34.023916","-97.64801","-6","1"
+"73562","Randlett","OK","34.188182","-98.43533","-6","1"
+"73564","Roosevelt","OK","34.834172","-98.97568","-6","1"
+"73565","Ryan","OK","34.008894","-97.93581","-6","1"
+"73566","Snyder","OK","34.637179","-98.96532","-6","1"
+"73567","Sterling","OK","34.748538","-98.16905","-6","1"
+"73568","Temple","OK","34.273576","-98.23377","-6","1"
+"73569","Terral","OK","33.916049","-97.8621","-6","1"
+"73570","Tipton","OK","34.500298","-99.12375","-6","1"
+"73571","Vinson","OK","34.924584","-99.86736","-6","1"
+"73572","Walters","OK","34.359739","-98.3455","-6","1"
+"73573","Waurika","OK","34.16127","-97.99784","-6","1"
+"73575","Duncan","OK","34.48532","-97.852223","-6","1"
+"73601","Clinton","OK","35.508248","-98.96917","-6","1"
+"73620","Arapaho","OK","35.591351","-99.00873","-6","1"
+"73622","Bessie","OK","35.399588","-99.00641","-6","1"
+"73624","Burns Flat","OK","35.355453","-99.17705","-6","1"
+"73625","Butler","OK","35.675986","-99.19074","-6","1"
+"73626","Canute","OK","35.394","-99.28001","-6","1"
+"73627","Carter","OK","35.215997","-99.47006","-6","1"
+"73628","Cheyenne","OK","35.603809","-99.6728","-6","1"
+"73632","Cordell","OK","35.283812","-98.94987","-6","1"
+"73638","Crawford","OK","35.819529","-99.77425","-6","1"
+"73639","Custer City","OK","35.70364","-98.93351","-6","1"
+"73641","Dill City","OK","35.26727","-99.18162","-6","1"
+"73642","Durham","OK","35.851512","-99.90119","-6","1"
+"73644","Elk City","OK","35.405935","-99.41658","-6","1"
+"73645","Erick","OK","35.250612","-99.88029","-6","1"
+"73646","Fay","OK","35.826514","-98.62902","-6","1"
+"73647","Foss","OK","35.45544","-99.1744","-6","1"
+"73648","Elk City","OK","35.26946","-99.680146","-6","1"
+"73650","Hammon","OK","35.646142","-99.38849","-6","1"
+"73651","Hobart","OK","35.018385","-99.09374","-6","1"
+"73654","Leedey","OK","35.837115","-99.36845","-6","1"
+"73655","Lone Wolf","OK","35.006152","-99.24851","-6","1"
+"73656","Mayfield","OK","35.26946","-99.680146","-6","1"
+"73658","Oakwood","OK","35.934444","-98.70827","-6","1"
+"73659","Putnam","OK","35.848743","-98.9029","-6","1"
+"73660","Reydon","OK","35.610122","-99.91743","-6","1"
+"73661","Rocky","OK","35.167368","-99.0517","-6","1"
+"73662","Sayre","OK","35.321815","-99.65314","-6","1"
+"73663","Seiling","OK","36.13196","-98.91683","-6","1"
+"73664","Sentinel","OK","35.167499","-99.21043","-6","1"
+"73666","Sweetwater","OK","35.458562","-99.87143","-6","1"
+"73667","Taloga","OK","36.033979","-98.99491","-6","1"
+"73668","Texola","OK","35.219721","-99.99228","-6","1"
+"73669","Thomas","OK","35.739994","-98.75502","-6","1"
+"73673","Willow","OK","35.04655","-99.58042","-6","1"
+"73701","Enid","OK","36.411133","-97.85026","-6","1"
+"73702","Enid","OK","36.379072","-97.782595","-6","1"
+"73703","Enid","OK","36.402666","-97.92836","-6","1"
+"73705","Enid","OK","36.379072","-97.782595","-6","1"
+"73706","Enid","OK","36.379072","-97.782595","-6","1"
+"73716","Aline","OK","36.49556","-98.49057","-6","1"
+"73717","Alva","OK","36.804875","-98.69707","-6","1"
+"73718","Ames","OK","36.224663","-98.14881","-6","1"
+"73719","Amorita","OK","36.949448","-98.28297","-6","1"
+"73720","Bison","OK","36.200563","-97.88883","-6","1"
+"73722","Burlington","OK","36.920802","-98.38429","-6","1"
+"73724","Canton","OK","36.06141","-98.64291","-6","1"
+"73726","Carmen","OK","36.580451","-98.47567","-6","1"
+"73727","Carrier","OK","36.481331","-98.04144","-6","1"
+"73728","Cherokee","OK","36.751276","-98.37108","-6","1"
+"73729","Cleo Springs","OK","36.404703","-98.43861","-6","1"
+"73730","Covington","OK","36.311257","-97.5597","-6","1"
+"73731","Dacoma","OK","36.648048","-98.58222","-6","1"
+"73733","Douglas","OK","36.239024","-97.68299","-6","1"
+"73734","Dover","OK","35.978156","-97.8868","-6","1"
+"73735","Drummond","OK","36.285664","-98.04193","-6","1"
+"73736","Fairmont","OK","36.347664","-97.69316","-6","1"
+"73737","Fairview","OK","36.281915","-98.52463","-6","1"
+"73738","Garber","OK","36.455282","-97.55974","-6","1"
+"73739","Goltry","OK","36.521836","-98.13462","-6","1"
+"73741","Helena","OK","36.557263","-98.27451","-6","1"
+"73742","Hennessey","OK","36.105884","-97.88304","-6","1"
+"73743","Hillsdale","OK","36.563732","-97.99385","-6","1"
+"73744","Hitchcock","OK","35.966488","-98.29013","-6","1"
+"73746","Hopeton","OK","36.692876","-98.65816","-6","1"
+"73747","Isabella","OK","36.221983","-98.32899","-6","1"
+"73749","Jet","OK","36.702485","-98.1728","-6","1"
+"73750","Kingfisher","OK","35.856216","-97.93743","-6","1"
+"73753","Kremlin","OK","36.56225","-97.83368","-6","1"
+"73754","Lahoma","OK","36.389599","-98.09063","-6","1"
+"73755","Longdale","OK","36.14001","-98.57918","-6","1"
+"73756","Loyal","OK","36.007004","-98.11234","-6","1"
+"73757","Lucien","OK","36.267701","-97.45245","-6","1"
+"73758","Manchester","OK","36.949144","-98.04938","-6","1"
+"73759","Medford","OK","36.832446","-97.72414","-6","1"
+"73760","Meno","OK","36.371779","-98.16808","-6","1"
+"73761","Nash","OK","36.685205","-98.03095","-6","1"
+"73762","Okarche","OK","35.713606","-97.97217","-6","1"
+"73763","Okeene","OK","36.116401","-98.33352","-6","1"
+"73764","Omega","OK","35.867757","-98.17995","-6","1"
+"73766","Pond Creek","OK","36.662715","-97.83063","-6","1"
+"73768","Ringwood","OK","36.383753","-98.27411","-6","1"
+"73770","Southard","OK","36.058133","-98.588383","-6","1"
+"73771","Wakita","OK","36.844573","-97.962","-6","1"
+"73772","Watonga","OK","35.870276","-98.43772","-6","1"
+"73773","Waukomis","OK","36.273144","-97.90335","-6","1"
+"73801","Woodward","OK","36.433665","-99.40838","-6","1"
+"73802","Woodward","OK","36.543405","-99.29047","-6","1"
+"73832","Arnett","OK","36.122573","-99.712","-6","1"
+"73834","Buffalo","OK","36.851116","-99.5897","-6","1"
+"73835","Camargo","OK","35.986173","-99.23866","-6","1"
+"73838","Chester","OK","36.253795","-98.89818","-6","1"
+"73840","Fargo","OK","36.403804","-99.64674","-6","1"
+"73841","Fort Supply","OK","36.557966","-99.57425","-6","1"
+"73842","Freedom","OK","36.803902","-99.18304","-6","1"
+"73843","Gage","OK","36.41954","-99.84131","-6","1"
+"73844","Gate","OK","36.853151","-100.06947","-6","1"
+"73847","Knowles","OK","36.903089","-100.22748","-6","1"
+"73848","Laverne","OK","36.673357","-99.88179","-6","1"
+"73851","May","OK","36.614425","-99.77153","-6","1"
+"73852","Mooreland","OK","36.456875","-99.13004","-6","1"
+"73853","Mutual","OK","36.223999","-99.1237","-6","1"
+"73855","Rosston","OK","36.863262","-99.88181","-6","1"
+"73857","Sharon","OK","36.283175","-99.32679","-6","1"
+"73858","Shattuck","OK","36.226355","-99.89028","-6","1"
+"73859","Vici","OK","36.140186","-99.26866","-6","1"
+"73860","Waynoka","OK","36.56306","-98.86623","-6","1"
+"73901","Adams","OK","36.756145","-101.07462","-6","1"
+"73931","Balko","OK","36.601946","-100.76553","-6","1"
+"73932","Beaver","OK","36.710457","-100.47888","-6","1"
+"73933","Boise City","OK","36.740652","-102.54473","-6","1"
+"73937","Felt","OK","36.563865","-102.78868","-6","1"
+"73938","Forgan","OK","36.914169","-100.61244","-6","1"
+"73939","Goodwell","OK","36.691413","-101.738","-6","1"
+"73942","Guymon","OK","36.739447","-101.48851","-6","1"
+"73944","Hardesty","OK","36.605467","-101.1204","-6","1"
+"73945","Hooker","OK","36.832751","-101.25618","-6","1"
+"73946","Kenton","OK","36.922263","-102.92339","-6","1"
+"73947","Keyes","OK","36.844919","-102.2005","-6","1"
+"73949","Texhoma","OK","36.56879","-101.91782","-6","1"
+"73950","Turpin","OK","36.852475","-100.89584","-6","1"
+"73951","Tyrone","OK","36.95279","-101.06337","-6","1"
+"74001","Avant","OK","36.487394","-96.06384","-6","1"
+"74002","Barnsdall","OK","36.549109","-96.146","-6","1"
+"74003","Bartlesville","OK","36.741589","-96.00614","-6","1"
+"74004","Bartlesville","OK","36.711386","-95.894042","-6","1"
+"74005","Bartlesville","OK","36.711386","-95.894042","-6","1"
+"74006","Bartlesville","OK","36.733398","-95.92404","-6","1"
+"74008","Bixby","OK","35.951402","-95.88361","-6","1"
+"74009","Bowring","OK","36.665794","-96.398424","-6","1"
+"74010","Bristow","OK","35.843486","-96.38183","-6","1"
+"74011","Broken Arrow","OK","35.992283","-95.80542","-6","1"
+"74012","Broken Arrow","OK","36.045907","-95.80694","-6","1"
+"74013","Broken Arrow","OK","36.139826","-96.029725","-6","1"
+"74014","Broken Arrow","OK","36.053246","-95.70957","-6","1"
+"74015","Catoosa","OK","36.188136","-95.73199","-6","1"
+"74016","Chelsea","OK","36.546415","-95.44592","-6","1"
+"74017","Claremore","OK","36.327143","-95.61192","-6","1"
+"74018","Claremore","OK","36.343579","-95.605964","-6","1"
+"74020","Cleveland","OK","36.260645","-96.39586","-6","1"
+"74021","Collinsville","OK","36.369251","-95.8397","-6","1"
+"74022","Copan","OK","36.909076","-95.96577","-6","1"
+"74023","Cushing","OK","35.973286","-96.75751","-6","1"
+"74026","Davenport","OK","35.710256","-96.76333","-6","1"
+"74027","Delaware","OK","36.793303","-95.63631","-6","1"
+"74028","Depew","OK","35.805114","-96.53926","-6","1"
+"74029","Dewey","OK","36.808722","-95.92617","-6","1"
+"74030","Drumright","OK","35.987421","-96.58776","-6","1"
+"74031","Foyil","OK","36.336457","-95.571646","-6","1"
+"74032","Glencoe","OK","36.214419","-96.91672","-6","1"
+"74033","Glenpool","OK","35.951244","-96.00803","-6","1"
+"74034","Hallett","OK","36.232452","-96.56882","-6","1"
+"74035","Hominy","OK","36.417205","-96.38379","-6","1"
+"74036","Inola","OK","36.145085","-95.51443","-6","1"
+"74037","Jenks","OK","36.012562","-95.98241","-6","1"
+"74038","Jennings","OK","36.164934","-96.56083","-6","1"
+"74039","Kellyville","OK","35.931488","-96.22915","-6","1"
+"74041","Kiefer","OK","35.94876","-96.06237","-6","1"
+"74042","Lenapah","OK","36.857305","-95.61423","-6","1"
+"74043","Leonard","OK","35.918277","-95.798809","-6","1"
+"74044","Mannford","OK","36.111943","-96.37159","-6","1"
+"74045","Maramec","OK","36.241861","-96.68338","-6","1"
+"74046","Milfay","OK","35.901277","-96.326053","-6","1"
+"74047","Mounds","OK","35.853188","-96.00205","-6","1"
+"74048","Nowata","OK","36.690587","-95.62751","-6","1"
+"74050","Oakhurst","OK","36.074141","-96.0619","-6","1"
+"74051","Ochelata","OK","36.60234","-95.97544","-6","1"
+"74052","Oilton","OK","36.084211","-96.5794","-6","1"
+"74053","Oologah","OK","36.437088","-95.71144","-6","1"
+"74054","Osage","OK","36.276739","-96.36831","-6","1"
+"74055","Owasso","OK","36.278298","-95.8305","-6","1"
+"74056","Pawhuska","OK","36.764056","-96.32123","-6","1"
+"74058","Pawnee","OK","36.358645","-96.77143","-6","1"
+"74059","Perkins","OK","35.968675","-97.04258","-6","1"
+"74060","Prue","OK","36.24973","-96.2674","-6","1"
+"74061","Ramona","OK","36.533868","-95.90865","-6","1"
+"74062","Ripley","OK","36.024668","-96.90773","-6","1"
+"74063","Sand Springs","OK","36.139385","-96.16523","-6","1"
+"74064","McCord","OK","36.68125","-97.032304","-6","1"
+"74066","Sapulpa","OK","35.996582","-96.1194","-6","1"
+"74067","Sapulpa","OK","36.019575","-96.093682","-6","1"
+"74068","Shamrock","OK","35.910408","-96.57768","-6","1"
+"74070","Skiatook","OK","36.381305","-96.03998","-6","1"
+"74071","Slick","OK","35.778763","-96.26802","-6","1"
+"74072","S Coffeyville","OK","36.957786","-95.57108","-6","1"
+"74073","Sperry","OK","36.306323","-96.02081","-6","1"
+"74074","Stillwater","OK","36.105571","-97.07631","-6","1"
+"74075","Stillwater","OK","36.149394","-97.05784","-6","1"
+"74076","Stillwater","OK","36.072372","-97.055141","-6","1"
+"74077","Stillwater","OK","36.093665","-96.987458","-6","1"
+"74078","Stillwater","OK","36.093665","-96.987458","-6","1"
+"74079","Stroud","OK","35.744531","-96.66342","-6","1"
+"74080","Talala","OK","36.527631","-95.6992","-6","1"
+"74081","Terlton","OK","36.169806","-96.44005","-6","1"
+"74082","Vera","OK","36.450115","-95.881381","-6","1"
+"74083","Wann","OK","36.935821","-95.78336","-6","1"
+"74084","Wynona","OK","36.542944","-96.31853","-6","1"
+"74085","Yale","OK","36.10865","-96.70231","-6","1"
+"74101","Tulsa","OK","36.039147","-95.868667","-6","1"
+"74102","Tulsa","OK","36.063095","-95.804231","-6","1"
+"74103","Tulsa","OK","36.156892","-95.99508","-6","1"
+"74104","Tulsa","OK","36.146143","-95.95414","-6","1"
+"74105","Tulsa","OK","36.099044","-95.96615","-6","1"
+"74106","Tulsa","OK","36.184692","-95.98512","-6","1"
+"74107","Tulsa","OK","36.102042","-96.03144","-6","1"
+"74108","Tulsa","OK","36.146897","-95.79958","-6","1"
+"74110","Tulsa","OK","36.181143","-95.95424","-6","1"
+"74112","Tulsa","OK","36.148444","-95.90841","-6","1"
+"74114","Tulsa","OK","36.126894","-95.94657","-6","1"
+"74115","Tulsa","OK","36.180144","-95.91129","-6","1"
+"74116","Tulsa","OK","36.169454","-95.8242","-6","1"
+"74117","Tulsa","OK","36.235961","-95.88514","-6","1"
+"74119","Tulsa","OK","36.142743","-95.98872","-6","1"
+"74120","Tulsa","OK","36.151143","-95.97747","-6","1"
+"74121","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74126","Tulsa","OK","36.236691","-95.98674","-6","1"
+"74127","Tulsa","OK","36.160341","-96.03435","-6","1"
+"74128","Tulsa","OK","36.146577","-95.85194","-6","1"
+"74129","Tulsa","OK","36.126446","-95.86763","-6","1"
+"74130","Tulsa","OK","36.239642","-95.95847","-6","1"
+"74131","Tulsa","OK","36.057536","-96.07119","-6","1"
+"74132","Tulsa","OK","36.051893","-96.02752","-6","1"
+"74133","Tulsa","OK","36.04309","-95.88417","-6","1"
+"74134","Tulsa","OK","36.114797","-95.82105","-6","1"
+"74135","Tulsa","OK","36.101245","-95.92475","-6","1"
+"74136","Tulsa","OK","36.059495","-95.93922","-6","1"
+"74137","Tulsa","OK","36.025405","-95.92953","-6","1"
+"74141","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74145","Tulsa","OK","36.096296","-95.8847","-6","1"
+"74146","Tulsa","OK","36.102112","-95.85244","-6","1"
+"74147","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74148","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74149","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74150","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74152","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74153","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74155","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74156","Tulsa","OK","36.302391","-95.960472","-6","1"
+"74157","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74158","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74159","Tulsa","OK","36.077221","-96.083477","-6","1"
+"74169","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74170","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74171","Tulsa","OK","36.054345","-95.957721","-6","1"
+"74172","Tulsa","OK","36.154342","-95.992323","-6","1"
+"74177","Tulsa","OK","36.048045","-95.957771","-6","1"
+"74182","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74183","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74184","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74186","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74187","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74189","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74192","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74193","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74194","Tulsa","OK","36.139826","-96.029725","-6","1"
+"74301","Vinita","OK","36.631673","-95.17303","-6","1"
+"74328","Colcord","OK","36.260756","-94.69267","-6","1"
+"74330","Adair","OK","36.434328","-95.25512","-6","1"
+"74331","Afton","OK","36.618326","-94.93424","-6","1"
+"74332","Big Cabin","OK","36.51509","-95.22924","-6","1"
+"74333","Bluejacket","OK","36.802232","-95.07782","-6","1"
+"74334","Dodge","OK","36.597953","-94.647526","-6","1"
+"74335","Cardin","OK","36.975692","-94.85161","-6","1"
+"74336","Jay","OK","36.422876","-94.796399","-6","1"
+"74337","Chouteau","OK","36.167467","-95.31925","-6","1"
+"74338","Colcord","OK","36.227439","-94.67798","-6","1"
+"74339","Commerce","OK","36.932957","-94.87134","-6","1"
+"74340","Disney","OK","36.48721","-94.98452","-6","1"
+"74342","Eucha","OK","36.420495","-94.92621","-6","1"
+"74343","Fairland","OK","36.747928","-94.84022","-6","1"
+"74344","Grove","OK","36.599689","-94.76673","-6","1"
+"74345","Grove","OK","36.603587","-94.72974","-6","1"
+"74346","Jay","OK","36.444215","-94.78345","-6","1"
+"74347","Kansas","OK","36.19","-94.79595","-6","1"
+"74349","Ketchum","OK","36.523163","-95.02428","-6","1"
+"74350","Langley","OK","36.46898","-95.04967","-6","1"
+"74352","Locust Grove","OK","36.148065","-95.16801","-6","1"
+"74353","Mazie","OK","36.292495","-95.222792","-6","1"
+"74354","Miami","OK","36.880746","-94.87142","-6","1"
+"74355","Miami","OK","36.83408","-94.877031","-6","1"
+"74358","North Miami","OK","36.915805","-94.88039","-6","1"
+"74359","Oaks","OK","36.415938","-94.787091","-6","1"
+"74360","Picher","OK","36.981521","-94.83278","-6","1"
+"74361","Pryor","OK","36.294174","-95.30295","-6","1"
+"74362","Pryor","OK","36.292495","-95.222792","-6","1"
+"74363","Quapaw","OK","36.947372","-94.72912","-6","1"
+"74364","Rose","OK","36.197948","-94.96707","-6","1"
+"74365","Salina","OK","36.296196","-95.10556","-6","1"
+"74366","Spavinaw","OK","36.394258","-95.04869","-6","1"
+"74367","Strang","OK","36.412084","-95.12924","-6","1"
+"74368","Twin Oaks","OK","36.20822","-94.85945","-6","1"
+"74369","Welch","OK","36.897777","-95.15249","-6","1"
+"74370","Wyandotte","OK","36.777702","-94.68768","-6","1"
+"74399","Commerce","OK","36.932944","-94.873005","-6","1"
+"74401","Muskogee","OK","35.739681","-95.40711","-6","1"
+"74402","Muskogee","OK","35.764223","-95.306916","-6","1"
+"74403","Muskogee","OK","35.719962","-95.33691","-6","1"
+"74421","Beggs","OK","35.755522","-96.04744","-6","1"
+"74422","Boynton","OK","35.645974","-95.66931","-6","1"
+"74423","Braggs","OK","35.668132","-95.18582","-6","1"
+"74425","Canadian","OK","35.172538","-95.62824","-6","1"
+"74426","Checotah","OK","35.443872","-95.54393","-6","1"
+"74427","Cookson","OK","35.700818","-94.92552","-6","1"
+"74428","Council Hill","OK","35.550269","-95.64874","-6","1"
+"74429","Coweta","OK","35.94785","-95.6377","-6","1"
+"74430","Crowder","OK","35.124644","-95.66668","-6","1"
+"74431","Dewar","OK","35.458946","-95.94597","-6","1"
+"74432","Eufaula","OK","35.280145","-95.57854","-6","1"
+"74434","Fort Gibson","OK","35.799294","-95.23355","-6","1"
+"74435","Gore","OK","35.566657","-95.09627","-6","1"
+"74436","Haskell","OK","35.815497","-95.68608","-6","1"
+"74437","Henryetta","OK","35.447961","-95.95038","-6","1"
+"74438","Hitchita","OK","35.520519","-95.75122","-6","1"
+"74440","Hoyt","OK","35.269955","-95.30205","-6","1"
+"74441","Hulbert","OK","35.966254","-95.15436","-6","1"
+"74442","Indianola","OK","35.152295","-95.78957","-6","1"
+"74444","Moodys","OK","36.053001","-94.96682","-6","1"
+"74445","Morris","OK","35.616464","-95.84645","-6","1"
+"74446","Okay","OK","35.852293","-95.31717","-6","1"
+"74447","Okmulgee","OK","35.628612","-95.9734","-6","1"
+"74450","Oktaha","OK","35.59824","-95.48434","-6","1"
+"74451","Park Hill","OK","35.742956","-94.96737","-6","1"
+"74452","Peggs","OK","36.10862","-95.11169","-6","1"
+"74454","Porter","OK","35.867529","-95.52647","-6","1"
+"74455","Porum","OK","35.355394","-95.28635","-6","1"
+"74456","Preston","OK","35.712025","-95.99717","-6","1"
+"74457","Proctor","OK","36.053046","-94.7768","-6","1"
+"74458","Redbird","OK","35.963567","-95.513856","-6","1"
+"74459","Rentiesville","OK","35.519193","-95.49447","-6","1"
+"74460","Schulter","OK","35.51833","-95.9576","-6","1"
+"74461","Stidham","OK","35.384048","-95.70731","-6","1"
+"74462","Stigler","OK","35.272967","-95.16328","-6","1"
+"74463","Taft","OK","35.76342","-95.54788","-6","1"
+"74464","Tahlequah","OK","35.923658","-94.97185","-6","1"
+"74465","Tahlequah","OK","35.900074","-95.040008","-6","1"
+"74466","Tullahassee","OK","35.963567","-95.513856","-6","1"
+"74467","Wagoner","OK","35.961019","-95.3611","-6","1"
+"74468","Wainwright","OK","35.61546","-95.56851","-6","1"
+"74469","Warner","OK","35.493581","-95.30914","-6","1"
+"74470","Webbers Falls","OK","35.490036","-95.15158","-6","1"
+"74471","Welling","OK","35.837827","-94.87402","-6","1"
+"74472","Whitefield","OK","35.259201","-95.24701","-6","1"
+"74477","Wagoner","OK","35.963567","-95.513856","-6","1"
+"74501","Mcalester","OK","34.944399","-95.75709","-6","1"
+"74502","Mcalester","OK","34.947259","-95.720708","-6","1"
+"74520","Ada","OK","34.772557","-96.661745","-6","1"
+"74521","Albion","OK","34.660204","-95.09814","-6","1"
+"74522","Alderson","OK","34.902286","-95.69073","-6","1"
+"74523","Antlers","OK","34.229335","-95.61603","-6","1"
+"74525","Atoka","OK","34.347553","-96.11276","-6","1"
+"74528","Blanco","OK","34.722059","-95.76125","-6","1"
+"74529","Blocker","OK","34.947259","-95.720708","-6","1"
+"74530","Bromide","OK","34.416915","-96.49278","-6","1"
+"74531","Calvin","OK","34.932628","-96.23929","-6","1"
+"74533","Caney","OK","34.217672","-96.19634","-6","1"
+"74534","Centrahoma","OK","34.612564","-96.35556","-6","1"
+"74535","Clarita","OK","34.488403","-96.43356","-6","1"
+"74536","Clayton","OK","34.590491","-95.36797","-6","1"
+"74538","Coalgate","OK","34.553763","-96.23084","-6","1"
+"74540","Daisy","OK","34.540822","-95.71825","-6","1"
+"74542","Atoka","OK","34.4187","-96.039727","-6","1"
+"74543","Finley","OK","34.373618","-95.43604","-6","1"
+"74545","Gowen","OK","34.877067","-95.47832","-6","1"
+"74546","Haileyville","OK","34.855223","-95.57691","-6","1"
+"74547","Hartshorne","OK","34.84294","-95.57413","-6","1"
+"74549","Honobia","OK","34.536633","-94.93507","-6","1"
+"74552","Kinta","OK","35.127495","-95.23098","-6","1"
+"74553","Kiowa","OK","34.708098","-95.90485","-6","1"
+"74554","Krebs","OK","34.926507","-95.72048","-6","1"
+"74555","Lane","OK","34.249448","-95.96199","-6","1"
+"74556","Lehigh","OK","34.471798","-96.20366","-6","1"
+"74557","Moyers","OK","34.391572","-95.67366","-6","1"
+"74558","Nashoba","OK","34.497876","-95.1316","-6","1"
+"74559","Panola","OK","34.869457","-95.221099","-6","1"
+"74560","Pittsburg","OK","34.66625","-95.78885","-6","1"
+"74561","Quinton","OK","35.119128","-95.39008","-6","1"
+"74562","Rattan","OK","34.263342","-95.30693","-6","1"
+"74563","Red Oak","OK","34.948771","-95.1037","-6","1"
+"74565","Savanna","OK","34.831398","-95.83967","-6","1"
+"74567","Snow","OK","34.454702","-95.41013","-6","1"
+"74569","Stringtown","OK","34.491359","-95.94157","-6","1"
+"74570","Stuart","OK","34.858091","-96.09233","-6","1"
+"74571","Talihina","OK","34.729815","-95.03625","-6","1"
+"74572","Tupelo","OK","34.626083","-96.43083","-6","1"
+"74574","Tuskahoma","OK","34.646758","-95.27642","-6","1"
+"74576","Wardville","OK","34.665422","-96.03074","-6","1"
+"74577","Whitesboro","OK","34.689854","-94.8558","-6","1"
+"74578","Wilburton","OK","34.886021","-95.29859","-6","1"
+"74601","Ponca City","OK","36.707393","-97.10167","-6","1"
+"74602","Ponca City","OK","36.695368","-97.137693","-6","1"
+"74603","Ponca City","OK","36.796349","-97.106166","-6","1"
+"74604","Ponca City","OK","36.704703","-97.00798","-6","1"
+"74630","Billings","OK","36.52791","-97.43304","-6","1"
+"74631","Blackwell","OK","36.800787","-97.29289","-6","1"
+"74632","Braman","OK","36.939016","-97.33875","-6","1"
+"74633","Burbank","OK","36.694585","-96.73934","-6","1"
+"74636","Deer Creek","OK","36.810451","-97.51795","-6","1"
+"74637","Fairfax","OK","36.577618","-96.69529","-6","1"
+"74640","Hunter","OK","36.585776","-97.61334","-6","1"
+"74641","Kaw City","OK","36.807276","-96.86091","-6","1"
+"74643","Lamont","OK","36.69588","-97.56931","-6","1"
+"74644","Marland","OK","36.554757","-97.14483","-6","1"
+"74646","Nardin","OK","36.821862","-97.45366","-6","1"
+"74647","Newkirk","OK","36.904817","-97.06078","-6","1"
+"74650","Ralston","OK","36.500388","-96.74013","-6","1"
+"74651","Red Rock","OK","36.473704","-97.20505","-6","1"
+"74652","Shidler","OK","36.830328","-96.68054","-6","1"
+"74653","Tonkawa","OK","36.665613","-97.32967","-6","1"
+"74701","Durant","OK","34.009209","-96.38612","-6","1"
+"74702","Durant","OK","33.921979","-96.191767","-6","1"
+"74720","Achille","OK","33.83464","-96.39018","-6","1"
+"74721","Albany","OK","33.888549","-96.17244","-6","1"
+"74722","Battiest","OK","34.454046","-94.94148","-6","1"
+"74723","Bennington","OK","33.997865","-96.02963","-6","1"
+"74724","Bethel","OK","34.402346","-94.79763","-6","1"
+"74726","Bokchito","OK","33.98526","-96.15629","-6","1"
+"74727","Boswell","OK","34.026768","-95.8613","-6","1"
+"74728","Broken Bow","OK","34.142978","-94.80269","-6","1"
+"74729","Caddo","OK","34.137095","-96.26936","-6","1"
+"74730","Calera","OK","33.920767","-96.44073","-6","1"
+"74731","Cartwright","OK","33.869195","-96.57617","-6","1"
+"74733","Colbert","OK","33.84836","-96.5029","-6","1"
+"74734","Eagletown","OK","34.138965","-94.55407","-6","1"
+"74735","Fort Towson","OK","34.052225","-95.25701","-6","1"
+"74736","Garvin","OK","33.917419","-94.96494","-6","1"
+"74737","Golden","OK","34.032184","-94.89649","-6","1"
+"74738","Grant","OK","33.917165","-95.4894","-6","1"
+"74740","Haworth","OK","33.784733","-94.60436","-6","1"
+"74741","Hendrix","OK","33.77061","-96.29927","-6","1"
+"74743","Hugo","OK","34.010943","-95.51651","-6","1"
+"74745","Idabel","OK","33.883578","-94.83154","-6","1"
+"74747","Kemp","OK","33.769093","-96.3549","-6","1"
+"74748","Kenefic","OK","34.163069","-96.47772","-6","1"
+"74750","Millerton","OK","33.98471","-95.01088","-6","1"
+"74752","Pickens","OK","34.061674","-94.808868","-6","1"
+"74753","Platter","OK","33.918732","-96.5464","-6","1"
+"74754","Ringold","OK","34.199682","-95.12064","-6","1"
+"74755","Rufe","OK","34.127277","-95.11846","-6","1"
+"74756","Sawyer","OK","34.023191","-95.36911","-6","1"
+"74759","Soper","OK","34.038263","-95.70851","-6","1"
+"74760","Spencerville","OK","34.146827","-95.37358","-6","1"
+"74761","Swink","OK","34.01528","-95.20104","-6","1"
+"74764","Valliant","OK","34.038794","-95.07793","-6","1"
+"74766","Wright City","OK","34.148691","-94.95546","-6","1"
+"74801","Shawnee","OK","35.327341","-96.93544","-6","1"
+"74802","Shawnee","OK","35.365621","-96.959601","-6","1"
+"74804","Shawnee","OK","35.375188","-96.93162","-6","1"
+"74807","Shawnee","OK","35.306375","-96.935924","-6","1"
+"74818","Seminole","OK","35.162228","-96.609139","-6","1"
+"74820","Ada","OK","34.780243","-96.68761","-6","1"
+"74821","Ada","OK","34.735301","-96.669321","-6","1"
+"74824","Agra","OK","35.883914","-96.86735","-6","1"
+"74825","Allen","OK","34.817511","-96.4108","-6","1"
+"74826","Asher","OK","35.012407","-96.91873","-6","1"
+"74827","Atwood","OK","34.949547","-96.33356","-6","1"
+"74829","Boley","OK","35.49596","-96.48051","-6","1"
+"74830","Bowlegs","OK","35.147566","-96.6696","-6","1"
+"74831","Byars","OK","34.891218","-97.06278","-6","1"
+"74832","Carney","OK","35.815581","-97.01061","-6","1"
+"74833","Castle","OK","35.54247","-96.39471","-6","1"
+"74834","Chandler","OK","35.702159","-96.88961","-6","1"
+"74836","Connerville","OK","34.451503","-96.63092","-6","1"
+"74837","Cromwell","OK","35.348331","-96.46385","-6","1"
+"74839","Dustin","OK","35.262169","-96.05434","-6","1"
+"74840","Earlsboro","OK","35.29689","-96.78325","-6","1"
+"74842","Fittstown","OK","34.597595","-96.61818","-6","1"
+"74843","Fitzhugh","OK","34.648631","-96.73885","-6","1"
+"74844","Francis","OK","34.878209","-96.58838","-6","1"
+"74845","Hanna","OK","35.203729","-95.90822","-6","1"
+"74848","Holdenville","OK","35.088636","-96.38778","-6","1"
+"74849","Konawa","OK","34.969783","-96.73899","-6","1"
+"74850","Lamar","OK","35.104311","-96.09067","-6","1"
+"74851","Mcloud","OK","35.4122","-97.0984","-6","1"
+"74852","Macomb","OK","35.123383","-97.00869","-6","1"
+"74853","Wetumka","OK","35.235118","-96.24114","-6","1"
+"74854","Maud","OK","35.129805","-96.77625","-6","1"
+"74855","Meeker","OK","35.507952","-96.89689","-6","1"
+"74856","Mill Creek","OK","34.395266","-96.81667","-6","1"
+"74857","Newalla","OK","35.351612","-97.19507","-6","1"
+"74859","Okemah","OK","35.44116","-96.30798","-6","1"
+"74860","Paden","OK","35.514019","-96.56969","-6","1"
+"74864","Prague","OK","35.490727","-96.69141","-6","1"
+"74865","Roff","OK","34.618331","-96.81397","-6","1"
+"74866","Saint Louis","OK","35.062235","-96.8355","-6","1"
+"74867","Sasakwa","OK","34.948211","-96.53394","-6","1"
+"74868","Seminole","OK","35.249655","-96.65915","-6","1"
+"74869","Sparks","OK","35.601113","-96.7777","-6","1"
+"74871","Stonewall","OK","34.630936","-96.55756","-6","1"
+"74872","Stratford","OK","34.793533","-96.97738","-6","1"
+"74873","Tecumseh","OK","35.231608","-96.9767","-6","1"
+"74875","Tryon","OK","35.876736","-96.95179","-6","1"
+"74878","Wanette","OK","35.012317","-97.06156","-6","1"
+"74880","Weleetka","OK","35.369606","-96.13412","-6","1"
+"74881","Wellston","OK","35.694734","-97.07043","-6","1"
+"74883","Wetumka","OK","35.232465","-96.23571","-6","1"
+"74884","Wewoka","OK","35.166644","-96.5066","-6","1"
+"74894","Konawa","OK","34.955971","-96.754575","-6","1"
+"74901","Arkoma","OK","35.347792","-94.44274","-6","1"
+"74902","Pocola","OK","35.241727","-94.46967","-6","1"
+"74930","Bokoshe","OK","35.184593","-94.79752","-6","1"
+"74931","Bunch","OK","35.690088","-94.76307","-6","1"
+"74932","Cameron","OK","35.138765","-94.54108","-6","1"
+"74935","Fanshawe","OK","34.951143","-94.90421","-6","1"
+"74936","Gans","OK","35.392525","-94.70368","-6","1"
+"74937","Heavener","OK","34.866897","-94.58622","-6","1"
+"74939","Hodgen","OK","34.712466","-94.65008","-6","1"
+"74940","Howe","OK","34.956272","-94.63333","-6","1"
+"74941","Keota","OK","35.26773","-94.87609","-6","1"
+"74942","Leflore","OK","34.898768","-94.98141","-6","1"
+"74943","Lequire","OK","35.077265","-95.08613","-6","1"
+"74944","Mccurtain","OK","35.127447","-94.98545","-6","1"
+"74945","Marble City","OK","35.595915","-94.8089","-6","1"
+"74946","Moffett","OK","35.41483","-94.45263","-6","1"
+"74947","Monroe","OK","34.991767","-94.51763","-6","1"
+"74948","Muldrow","OK","35.431711","-94.56575","-6","1"
+"74949","Muse","OK","34.669198","-94.75729","-6","1"
+"74951","Panama","OK","35.172259","-94.67008","-6","1"
+"74953","Poteau","OK","35.052793","-94.61829","-6","1"
+"74954","Roland","OK","35.413049","-94.50476","-6","1"
+"74955","Sallisaw","OK","35.467031","-94.78647","-6","1"
+"74956","Shady Point","OK","35.122751","-94.72058","-6","1"
+"74957","Smithville","OK","34.503213","-94.67157","-6","1"
+"74959","Spiro","OK","35.247209","-94.62105","-6","1"
+"74960","Stilwell","OK","35.815628","-94.65023","-6","1"
+"74962","Vian","OK","35.543155","-94.96628","-6","1"
+"74963","Watson","OK","34.37769","-94.55278","-6","1"
+"74964","Watts","OK","36.114272","-94.6335","-6","1"
+"74965","Westville","OK","35.998632","-94.59266","-6","1"
+"74966","Wister","OK","34.943609","-94.81453","-6","1"
+"74968","Muldrow","OK","35.398035","-94.63761","-6","1"
+"75001","Addison","TX","32.96129","-96.83751","-6","1"
+"75002","Allen","TX","33.092846","-96.62447","-6","1"
+"75006","Carrollton","TX","32.960374","-96.89163","-6","1"
+"75007","Carrollton","TX","33.00542","-96.89773","-6","1"
+"75008","Carrollton","TX","33.20743","-97.116282","-6","1"
+"75009","Celina","TX","33.327927","-96.76129","-6","1"
+"75010","Carrollton","TX","33.030556","-96.89328","-6","1"
+"75011","Carrollton","TX","32.767268","-96.777626","-6","1"
+"75013","Allen","TX","33.106582","-96.69402","-6","1"
+"75014","Irving","TX","32.767268","-96.777626","-6","1"
+"75015","Irving","TX","32.767268","-96.777626","-6","1"
+"75016","Irving","TX","32.767268","-96.777626","-6","1"
+"75017","Irving","TX","32.767268","-96.777626","-6","1"
+"75019","Coppell","TX","32.967341","-96.98656","-6","1"
+"75020","Denison","TX","33.754053","-96.57867","-6","1"
+"75021","Denison","TX","33.742641","-96.51427","-6","1"
+"75022","Flower Mound","TX","33.024778","-97.10206","-6","1"
+"75023","Plano","TX","33.054671","-96.73506","-6","1"
+"75024","Plano","TX","33.07707","-96.79859","-6","1"
+"75025","Plano","TX","33.086868","-96.74504","-6","1"
+"75026","Plano","TX","33.19359","-96.569879","-6","1"
+"75027","Flower Mound","TX","33.20743","-97.116282","-6","1"
+"75028","Flower Mound","TX","33.033214","-97.05965","-6","1"
+"75029","Lewisville","TX","33.20743","-97.116282","-6","1"
+"75030","Rowlett","TX","32.91747","-96.534737","-6","1"
+"75032","Rockwall","TX","32.867103","-96.44129","-6","1"
+"75034","Frisco","TX","33.143792","-96.83938","-6","1"
+"75035","Frisco","TX","33.130086","-96.78177","-6","1"
+"75037","Irving","TX","32.767268","-96.777626","-6","1"
+"75038","Irving","TX","32.872386","-96.98524","-6","1"
+"75039","Irving","TX","32.876474","-96.94129","-6","1"
+"75040","Garland","TX","32.920574","-96.62639","-6","1"
+"75041","Garland","TX","32.881525","-96.64601","-6","1"
+"75042","Garland","TX","32.915625","-96.67399","-6","1"
+"75043","Garland","TX","32.854893","-96.60211","-6","1"
+"75044","Garland","TX","32.960375","-96.66188","-6","1"
+"75045","Garland","TX","32.913695","-96.627131","-6","1"
+"75046","Garland","TX","32.767268","-96.777626","-6","1"
+"75047","Garland","TX","32.767268","-96.777626","-6","1"
+"75048","Garland","TX","32.975723","-96.58661","-6","1"
+"75049","Garland","TX","32.767268","-96.777626","-6","1"
+"75050","Grand Prairie","TX","32.759922","-97.01216","-6","1"
+"75051","Grand Prairie","TX","32.728982","-97.00428","-6","1"
+"75052","Grand Prairie","TX","32.675604","-97.02346","-6","1"
+"75053","Grand Prairie","TX","32.767268","-96.777626","-6","1"
+"75054","Grand Prairie","TX","32.767268","-96.777626","-6","1"
+"75056","The Colony","TX","33.081421","-96.88957","-6","1"
+"75057","Lewisville","TX","33.04867","-96.99321","-6","1"
+"75058","Gunter","TX","33.453628","-96.73436","-6","1"
+"75059","Irving","TX","32.86372","-96.934998","-6","1"
+"75060","Irving","TX","32.80268","-96.95499","-6","1"
+"75061","Irving","TX","32.826729","-96.9614","-6","1"
+"75062","Irving","TX","32.846645","-96.96733","-6","1"
+"75063","Irving","TX","32.916865","-96.97349","-6","1"
+"75065","Lake Dallas","TX","33.12635","-97.02525","-6","1"
+"75066","Carrollton","TX","32.959222","-96.853877","-6","1"
+"75067","Lewisville","TX","33.020118","-97.00771","-6","1"
+"75068","Little Elm","TX","33.173008","-96.95485","-6","1"
+"75069","McKinney","TX","33.195073","-96.60363","-6","1"
+"75070","McKinney","TX","33.212203","-96.67522","-6","1"
+"75071","Frisco","TX","33.225107","-96.638614","-6","1"
+"75074","Plano","TX","33.028921","-96.68102","-6","1"
+"75075","Plano","TX","33.024721","-96.74038","-6","1"
+"75076","Pottsboro","TX","33.818635","-96.69338","-6","1"
+"75077","Lewisville","TX","33.075138","-97.0529","-6","1"
+"75078","Prosper","TX","33.240766","-96.79944","-6","1"
+"75080","Richardson","TX","32.969523","-96.74093","-6","1"
+"75081","Richardson","TX","32.948974","-96.70916","-6","1"
+"75082","Richardson","TX","32.993405","-96.65901","-6","1"
+"75083","Richardson","TX","32.767268","-96.777626","-6","1"
+"75085","Richardson","TX","32.767268","-96.777626","-6","1"
+"75086","Plano","TX","33.002395","-96.615837","-6","1"
+"75087","Rockwall","TX","32.93382","-96.45446","-6","1"
+"75088","Rowlett","TX","32.897459","-96.5497","-6","1"
+"75089","Rowlett","TX","32.923924","-96.54697","-6","1"
+"75090","Sherman","TX","33.632806","-96.59106","-6","1"
+"75091","Sherman","TX","33.678665","-96.662289","-6","1"
+"75092","Sherman","TX","33.649938","-96.65387","-6","1"
+"75093","Plano","TX","33.03505","-96.80492","-6","1"
+"75094","Plano","TX","33.009681","-96.61113","-6","1"
+"75097","Weston","TX","33.351238","-96.664632","-6","1"
+"75098","Wylie","TX","33.011975","-96.53607","-6","1"
+"75099","Coppell","TX","32.77103","-96.79963","-6","1"
+"75101","Bardwell","TX","32.267846","-96.6967","-6","1"
+"75102","Barry","TX","32.075079","-96.64311","-6","1"
+"75103","Canton","TX","32.532449","-95.88","-6","1"
+"75104","Cedar Hill","TX","32.588536","-96.94949","-6","1"
+"75105","Chatfield","TX","32.241963","-96.37917","-6","1"
+"75106","Cedar Hill","TX","32.767268","-96.777626","-6","1"
+"75109","Angus","TX","32.03049","-96.383005","-6","1"
+"75110","Corsicana","TX","32.078228","-96.44612","-6","1"
+"75114","Crandall","TX","32.629178","-96.44339","-6","1"
+"75115","Desoto","TX","32.599286","-96.85882","-6","1"
+"75116","Duncanville","TX","32.658384","-96.91265","-6","1"
+"75117","Edgewood","TX","32.696777","-95.86881","-6","1"
+"75118","Elmo","TX","32.599614","-96.302743","-6","1"
+"75119","Ennis","TX","32.331239","-96.61962","-6","1"
+"75120","Ennis","TX","32.334709","-96.633546","-6","1"
+"75121","Copeville","TX","33.079946","-96.41788","-6","1"
+"75123","Desoto","TX","32.767268","-96.777626","-6","1"
+"75124","Eustace","TX","32.310343","-96.00312","-6","1"
+"75125","Ferris","TX","32.533551","-96.65684","-6","1"
+"75126","Forney","TX","32.745373","-96.46038","-6","1"
+"75127","Fruitvale","TX","32.68309","-95.79436","-6","1"
+"75132","Fate","TX","32.941014","-96.38095","-6","1"
+"75134","Lancaster","TX","32.620385","-96.7812","-6","1"
+"75135","Caddo Mills","TX","33.075653","-96.23774","-6","1"
+"75137","Duncanville","TX","32.634835","-96.91343","-6","1"
+"75138","Duncanville","TX","32.767268","-96.777626","-6","1"
+"75140","Grand Saline","TX","32.661299","-95.71738","-6","1"
+"75141","Hutchins","TX","32.644647","-96.71036","-6","1"
+"75142","Kaufman","TX","32.574299","-96.30377","-6","1"
+"75143","Kemp","TX","32.348007","-96.21035","-6","1"
+"75144","Kerens","TX","32.120271","-96.22474","-6","1"
+"75146","Lancaster","TX","32.590063","-96.75892","-6","1"
+"75147","Mabank","TX","32.314256","-96.11068","-6","1"
+"75148","Malakoff","TX","32.183649","-96.01862","-6","1"
+"75149","Mesquite","TX","32.767329","-96.60759","-6","1"
+"75150","Mesquite","TX","32.818392","-96.63355","-6","1"
+"75151","Corsicana","TX","32.062395","-96.473459","-6","1"
+"75152","Palmer","TX","32.425222","-96.68103","-6","1"
+"75153","Powell","TX","32.142925","-96.32632","-6","1"
+"75154","Red Oak","TX","32.526123","-96.82325","-6","1"
+"75155","Rice","TX","32.226257","-96.48147","-6","1"
+"75156","Gun Barrel City","TX","32.290819","-96.114108","-6","1"
+"75157","Rosser","TX","32.455407","-96.439495","-6","1"
+"75158","Scurry","TX","32.466891","-96.38502","-6","1"
+"75159","Seagoville","TX","32.628858","-96.53811","-6","1"
+"75160","Terrell","TX","32.747747","-96.28923","-6","1"
+"75161","Terrell","TX","32.727366","-96.187","-6","1"
+"75163","Trinidad","TX","32.17548","-96.10935","-6","1"
+"75164","Josephine","TX","33.065217","-96.31152","-6","1"
+"75165","Waxahachie","TX","32.397024","-96.83283","-6","1"
+"75166","Lavon","TX","33.022051","-96.43601","-6","1"
+"75167","Waxahachie","TX","32.380958","-96.91801","-6","1"
+"75168","Waxahachie","TX","32.374937","-96.716638","-6","1"
+"75169","Wills Point","TX","32.725386","-96.00238","-6","1"
+"75172","Wilmer","TX","32.598845","-96.6831","-6","1"
+"75173","Nevada","TX","33.048275","-96.42153","-6","1"
+"75180","Mesquite","TX","32.72203","-96.61634","-6","1"
+"75181","Mesquite","TX","32.735812","-96.55886","-6","1"
+"75182","Sunnyvale","TX","32.803646","-96.56965","-6","1"
+"75185","Mesquite","TX","32.740332","-96.561846","-6","1"
+"75187","Mesquite","TX","32.767268","-96.777626","-6","1"
+"75189","Royse City","TX","32.960512","-96.31278","-6","1"
+"75201","Dallas","TX","32.787629","-96.79941","-6","1"
+"75202","Dallas","TX","32.77988","-96.80502","-6","1"
+"75203","Dallas","TX","32.745831","-96.80672","-6","1"
+"75204","Dallas","TX","32.800333","-96.78952","-6","1"
+"75205","Dallas","TX","32.836094","-96.79524","-6","1"
+"75206","Dallas","TX","32.826128","-96.7712","-6","1"
+"75207","Dallas","TX","32.78643","-96.81992","-6","1"
+"75208","Dallas","TX","32.751464","-96.83864","-6","1"
+"75209","Dallas","TX","32.845978","-96.82552","-6","1"
+"75210","Dallas","TX","32.77103","-96.74732","-6","1"
+"75211","Dallas","TX","32.736931","-96.88253","-6","1"
+"75212","Dallas","TX","32.78238","-96.86945","-6","1"
+"75214","Dallas","TX","32.825628","-96.74872","-6","1"
+"75215","Dallas","TX","32.76103","-96.77035","-6","1"
+"75216","Dallas","TX","32.710082","-96.7972","-6","1"
+"75217","Dallas","TX","32.72238","-96.67582","-6","1"
+"75218","Dallas","TX","32.842726","-96.69937","-6","1"
+"75219","Dallas","TX","32.812462","-96.81412","-6","1"
+"75220","Dallas","TX","32.867977","-96.86306","-6","1"
+"75221","Dallas","TX","32.814728","-96.787725","-6","1"
+"75222","Dallas","TX","32.767268","-96.777626","-6","1"
+"75223","Dallas","TX","32.792879","-96.74918","-6","1"
+"75224","Dallas","TX","32.716065","-96.83987","-6","1"
+"75225","Dallas","TX","32.862876","-96.7904","-6","1"
+"75226","Dallas","TX","32.783978","-96.77662","-6","1"
+"75227","Dallas","TX","32.77003","-96.69","-6","1"
+"75228","Dallas","TX","32.825227","-96.67955","-6","1"
+"75229","Dallas","TX","32.895376","-96.85985","-6","1"
+"75230","Dallas","TX","32.901176","-96.79054","-6","1"
+"75231","Dallas","TX","32.874317","-96.74764","-6","1"
+"75232","Dallas","TX","32.664034","-96.83886","-6","1"
+"75233","Dallas","TX","32.704398","-96.87222","-6","1"
+"75234","Dallas","TX","32.925975","-96.88322","-6","1"
+"75235","Dallas","TX","32.828128","-96.84612","-6","1"
+"75236","Dallas","TX","32.685533","-96.91746","-6","1"
+"75237","Dallas","TX","32.666984","-96.87633","-6","1"
+"75238","Dallas","TX","32.873926","-96.70922","-6","1"
+"75239","Dallas","TX","32.767268","-96.777626","-6","1"
+"75240","Dallas","TX","32.938774","-96.78543","-6","1"
+"75241","Dallas","TX","32.669383","-96.77439","-6","1"
+"75242","Dallas","TX","32.767268","-96.777626","-6","1"
+"75243","Dallas","TX","32.912225","-96.73688","-6","1"
+"75244","Dallas","TX","32.922624","-96.83616","-6","1"
+"75245","Dallas","TX","32.922499","-96.535191","-6","1"
+"75246","Dallas","TX","32.791878","-96.77365","-6","1"
+"75247","Dallas","TX","32.817978","-96.87928","-6","1"
+"75248","Dallas","TX","32.968123","-96.78863","-6","1"
+"75249","Dallas","TX","32.639661","-96.95317","-6","1"
+"75250","Dallas","TX","32.767268","-96.777626","-6","1"
+"75251","Dallas","TX","32.919104","-96.77497","-6","1"
+"75252","Dallas","TX","32.998132","-96.79088","-6","1"
+"75253","Dallas","TX","32.679924","-96.60367","-6","1"
+"75254","Dallas","TX","32.946069","-96.794496","-6","1"
+"75255","Dallas","TX","32.669783","-96.614921","-6","1"
+"75258","Dallas","TX","32.767268","-96.777626","-6","1"
+"75260","Dallas","TX","32.767268","-96.777626","-6","1"
+"75261","Dallas","TX","32.767268","-96.777626","-6","1"
+"75262","Dallas","TX","32.767268","-96.777626","-6","1"
+"75263","Dallas","TX","32.767268","-96.777626","-6","1"
+"75264","Dallas","TX","32.767268","-96.777626","-6","1"
+"75265","Dallas","TX","32.767268","-96.777626","-6","1"
+"75266","Dallas","TX","32.767268","-96.777626","-6","1"
+"75267","Dallas","TX","32.767268","-96.777626","-6","1"
+"75270","Dallas","TX","32.78133","-96.80198","-6","1"
+"75275","Dallas","TX","32.767268","-96.777626","-6","1"
+"75277","Dallas","TX","32.767268","-96.777626","-6","1"
+"75283","Dallas","TX","32.767268","-96.777626","-6","1"
+"75284","Dallas","TX","32.767268","-96.777626","-6","1"
+"75285","Dallas","TX","32.767268","-96.777626","-6","1"
+"75286","Dallas","TX","32.767268","-96.777626","-6","1"
+"75287","Dallas","TX","32.998786","-96.84436","-6","1"
+"75294","Dallas","TX","32.767268","-96.777626","-6","1"
+"75295","Dallas","TX","32.767268","-96.777626","-6","1"
+"75301","Dallas","TX","32.767268","-96.777626","-6","1"
+"75303","Dallas","TX","32.767268","-96.777626","-6","1"
+"75310","Dallas","TX","32.767268","-96.777626","-6","1"
+"75312","Dallas","TX","32.767268","-96.777626","-6","1"
+"75313","Dallas","TX","32.767268","-96.777626","-6","1"
+"75315","Dallas","TX","32.767268","-96.777626","-6","1"
+"75320","Dallas","TX","32.767268","-96.777626","-6","1"
+"75323","Dallas","TX","32.767268","-96.777626","-6","1"
+"75326","Dallas","TX","32.767268","-96.777626","-6","1"
+"75336","Dallas","TX","32.767268","-96.777626","-6","1"
+"75339","Dallas","TX","32.767268","-96.777626","-6","1"
+"75342","Dallas","TX","32.767268","-96.777626","-6","1"
+"75346","Dallas","TX","32.767268","-96.777626","-6","1"
+"75350","Dallas","TX","32.767268","-96.777626","-6","1"
+"75353","Dallas","TX","32.767268","-96.777626","-6","1"
+"75354","Dallas","TX","32.767268","-96.777626","-6","1"
+"75355","Dallas","TX","32.767268","-96.777626","-6","1"
+"75356","Dallas","TX","32.767268","-96.777626","-6","1"
+"75357","Dallas","TX","32.767268","-96.777626","-6","1"
+"75359","Dallas","TX","32.767268","-96.777626","-6","1"
+"75360","Dallas","TX","32.767268","-96.777626","-6","1"
+"75363","Dallas","TX","32.767268","-96.777626","-6","1"
+"75364","Dallas","TX","32.767268","-96.777626","-6","1"
+"75367","Dallas","TX","32.767268","-96.777626","-6","1"
+"75368","Dallas","TX","32.767268","-96.777626","-6","1"
+"75370","Dallas","TX","32.767268","-96.777626","-6","1"
+"75371","Dallas","TX","32.767268","-96.777626","-6","1"
+"75372","Dallas","TX","32.767268","-96.777626","-6","1"
+"75373","Dallas","TX","32.767268","-96.777626","-6","1"
+"75374","Dallas","TX","32.767268","-96.777626","-6","1"
+"75376","Dallas","TX","32.767268","-96.777626","-6","1"
+"75378","Dallas","TX","32.767268","-96.777626","-6","1"
+"75379","Dallas","TX","32.767268","-96.777626","-6","1"
+"75380","Dallas","TX","32.767268","-96.777626","-6","1"
+"75381","Dallas","TX","32.767268","-96.777626","-6","1"
+"75382","Dallas","TX","32.767268","-96.777626","-6","1"
+"75386","Dallas","TX","32.767268","-96.777626","-6","1"
+"75387","Dallas","TX","32.767268","-96.777626","-6","1"
+"75388","Dallas","TX","32.767268","-96.777626","-6","1"
+"75389","Dallas","TX","32.767268","-96.777626","-6","1"
+"75390","Dallas","TX","32.767268","-96.777626","-6","1"
+"75391","Dallas","TX","32.767268","-96.777626","-6","1"
+"75392","Dallas","TX","32.767268","-96.777626","-6","1"
+"75393","Dallas","TX","32.767268","-96.777626","-6","1"
+"75394","Dallas","TX","32.767268","-96.777626","-6","1"
+"75395","Dallas","TX","32.767268","-96.777626","-6","1"
+"75396","Dallas","TX","32.767268","-96.777626","-6","1"
+"75397","Dallas","TX","32.767268","-96.777626","-6","1"
+"75398","Dallas","TX","32.767268","-96.777626","-6","1"
+"75401","Greenville","TX","33.15023","-96.11289","-6","1"
+"75402","Greenville","TX","33.082411","-96.08977","-6","1"
+"75403","Greenville","TX","33.218505","-96.048665","-6","1"
+"75404","Greenville","TX","33.056265","-96.080973","-6","1"
+"75407","Princeton","TX","33.14572","-96.49664","-6","1"
+"75408","Anna","TX","33.349316","-96.548597","-6","1"
+"75409","Anna","TX","33.356094","-96.51907","-6","1"
+"75410","Alba","TX","32.793512","-95.63182","-6","1"
+"75411","Arthur City","TX","33.86751","-95.60594","-6","1"
+"75412","Bagwell","TX","33.815996","-95.14402","-6","1"
+"75413","Bailey","TX","33.43515","-96.16671","-6","1"
+"75414","Bells","TX","33.615634","-96.41899","-6","1"
+"75415","Ben Franklin","TX","33.460447","-95.75734","-6","1"
+"75416","Blossom","TX","33.675155","-95.37293","-6","1"
+"75417","Bogata","TX","33.462828","-95.193","-6","1"
+"75418","Bonham","TX","33.583772","-96.1818","-6","1"
+"75420","Brashear","TX","33.052712","-95.72124","-6","1"
+"75421","Brookston","TX","33.642542","-95.69761","-6","1"
+"75422","Campbell","TX","33.146779","-95.93998","-6","1"
+"75423","Celeste","TX","33.291418","-96.20273","-6","1"
+"75424","Blue Ridge","TX","33.321604","-96.39502","-6","1"
+"75425","Chicota","TX","33.65973","-95.582906","-6","1"
+"75426","Clarksville","TX","33.626445","-95.03534","-6","1"
+"75428","Commerce","TX","33.25868","-95.91061","-6","1"
+"75429","Commerce","TX","33.237722","-95.90886","-6","1"
+"75431","Como","TX","33.027493","-95.46605","-6","1"
+"75432","Cooper","TX","33.377005","-95.68573","-6","1"
+"75433","Cumby","TX","33.13307","-95.81773","-6","1"
+"75434","Cunningham","TX","33.423626","-95.3567","-6","1"
+"75435","Deport","TX","33.507909","-95.31828","-6","1"
+"75436","Detroit","TX","33.670159","-95.2609","-6","1"
+"75437","Dike","TX","33.253911","-95.47125","-6","1"
+"75438","Dodd City","TX","33.595318","-96.07311","-6","1"
+"75439","Ector","TX","33.573304","-96.27386","-6","1"
+"75440","Emory","TX","32.882305","-95.73842","-6","1"
+"75441","Enloe","TX","33.432974","-95.65815","-6","1"
+"75442","Farmersville","TX","33.171899","-96.35096","-6","1"
+"75443","Gober","TX","33.469719","-96.111103","-6","1"
+"75444","Golden","TX","32.730279","-95.56286","-6","1"
+"75446","Honey Grove","TX","33.589851","-95.90242","-6","1"
+"75447","Ivanhoe","TX","33.774197","-96.12045","-6","1"
+"75448","Klondike","TX","33.31215","-95.81737","-6","1"
+"75449","Ladonia","TX","33.427504","-95.95578","-6","1"
+"75450","Lake Creek","TX","33.404332","-95.52546","-6","1"
+"75451","Leesburg","TX","32.971224","-95.11339","-6","1"
+"75452","Leonard","TX","33.385224","-96.24782","-6","1"
+"75453","Lone Oak","TX","32.952736","-95.94594","-6","1"
+"75454","Melissa","TX","33.277317","-96.57345","-6","1"
+"75455","Mount Pleasant","TX","33.166739","-94.9814","-6","1"
+"75456","Mount Pleasant","TX","33.19045","-94.967456","-6","1"
+"75457","Mount Vernon","TX","33.151104","-95.21965","-6","1"
+"75458","Merit","TX","33.242656","-96.291572","-6","1"
+"75459","Howe","TX","33.518979","-96.63523","-6","1"
+"75460","Paris","TX","33.660274","-95.55958","-6","1"
+"75461","Paris","TX","33.663213","-95.460797","-6","1"
+"75462","Paris","TX","33.638587","-95.48589","-6","1"
+"75468","Pattonville","TX","33.536414","-95.39817","-6","1"
+"75469","Pecan Gap","TX","33.434737","-95.83057","-6","1"
+"75470","Petty","TX","33.60355","-95.81202","-6","1"
+"75471","Pickton","TX","33.041578","-95.39527","-6","1"
+"75472","Point","TX","32.906194","-95.87967","-6","1"
+"75473","Powderly","TX","33.801663","-95.50309","-6","1"
+"75474","Quinlan","TX","32.896295","-96.06999","-6","1"
+"75475","Randolph","TX","33.485315","-96.25525","-6","1"
+"75476","Ravenna","TX","33.695647","-96.23381","-6","1"
+"75477","Roxton","TX","33.543006","-95.72382","-6","1"
+"75478","Saltillo","TX","33.17329","-95.36663","-6","1"
+"75479","Savoy","TX","33.613097","-96.34474","-6","1"
+"75480","Scroggins","TX","33.04314","-95.19302","-6","1"
+"75481","Sulphur Bluff","TX","33.323467","-95.39168","-6","1"
+"75482","Sulphur Springs","TX","33.143752","-95.60102","-6","1"
+"75483","Sulphur Springs","TX","33.168606","-95.585464","-6","1"
+"75485","Westminster","TX","33.362227","-96.46299","-6","1"
+"75486","Sumner","TX","33.734091","-95.76203","-6","1"
+"75487","Talco","TX","33.346151","-95.15014","-6","1"
+"75488","Telephone","TX","33.76225","-96.00418","-6","1"
+"75489","Tom Bean","TX","33.521578","-96.48373","-6","1"
+"75490","Trenton","TX","33.435618","-96.3324","-6","1"
+"75491","Whitewright","TX","33.494285","-96.39598","-6","1"
+"75492","Windom","TX","33.566266","-96.01082","-6","1"
+"75493","Winfield","TX","33.165327","-95.11279","-6","1"
+"75494","Winnsboro","TX","32.922912","-95.28299","-6","1"
+"75495","Van Alstyne","TX","33.426635","-96.5637","-6","1"
+"75496","Wolfe City","TX","33.350543","-96.05705","-6","1"
+"75497","Yantis","TX","32.906074","-95.55779","-6","1"
+"75499","Savoy","TX","33.602194","-96.365174","-6","1"
+"75501","Texarkana","TX","33.414708","-94.08984","-6","1"
+"75502","Texarkana","TX","33.424125","-94.055214","-6","1"
+"75503","Texarkana","TX","33.476844","-94.09637","-6","1"
+"75504","Texarkana","TX","33.476552","-94.39495","-6","1"
+"75505","Texarkana","TX","33.46238","-94.0715","-6","1"
+"75507","Texarkana","TX","33.393447","-94.340437","-6","1"
+"75550","Annona","TX","33.530829","-94.90585","-6","1"
+"75551","Atlanta","TX","33.118611","-94.1773","-6","1"
+"75554","Avery","TX","33.563837","-94.78066","-6","1"
+"75555","Bivins","TX","32.930895","-94.13542","-6","1"
+"75556","Bloomburg","TX","33.142532","-94.05585","-6","1"
+"75558","Cookville","TX","33.236743","-94.84359","-6","1"
+"75559","De Kalb","TX","33.515778","-94.61355","-6","1"
+"75560","Douglassville","TX","33.189862","-94.37468","-6","1"
+"75561","Hooks","TX","33.480224","-94.2648","-6","1"
+"75562","Kildare","TX","32.941359","-94.25152","-6","1"
+"75563","Linden","TX","33.005009","-94.37603","-6","1"
+"75564","Lodi","TX","32.880182","-94.27725","-6","1"
+"75565","McLeod","TX","32.950857","-94.07429","-6","1"
+"75566","Marietta","TX","33.157897","-94.50853","-6","1"
+"75567","Maud","TX","33.328596","-94.31589","-6","1"
+"75568","Naples","TX","33.206258","-94.63009","-6","1"
+"75569","Nash","TX","33.441774","-94.12531","-6","1"
+"75570","New Boston","TX","33.465282","-94.41954","-6","1"
+"75571","Omaha","TX","33.183401","-94.75227","-6","1"
+"75572","Queen City","TX","33.210952","-94.13364","-6","1"
+"75573","Redwater","TX","33.353249","-94.25971","-6","1"
+"75574","Simms","TX","33.328878","-94.53657","-6","1"
+"75599","Texarkana","TX","33.476552","-94.39495","-6","1"
+"75601","Longview","TX","32.505248","-94.73172","-6","1"
+"75602","Longview","TX","32.474499","-94.712","-6","1"
+"75603","Longview","TX","32.396207","-94.70063","-6","1"
+"75604","Longview","TX","32.523779","-94.80692","-6","1"
+"75605","Longview","TX","32.557684","-94.74353","-6","1"
+"75606","Longview","TX","32.369393","-94.616062","-6","1"
+"75607","Longview","TX","32.51121","-94.783493","-6","1"
+"75608","Longview","TX","32.570051","-94.848063","-6","1"
+"75615","Longview","TX","32.51121","-94.783493","-6","1"
+"75630","Avinger","TX","32.854406","-94.55859","-6","1"
+"75631","Beckville","TX","32.237924","-94.46427","-6","1"
+"75633","Carthage","TX","32.145212","-94.31256","-6","1"
+"75636","Cason","TX","33.035716","-94.81589","-6","1"
+"75637","Clayton","TX","32.102729","-94.493543","-6","1"
+"75638","Daingerfield","TX","33.02583","-94.72481","-6","1"
+"75639","De Berry","TX","32.285877","-94.1811","-6","1"
+"75640","Diana","TX","32.723482","-94.69544","-6","1"
+"75641","Easton","TX","32.382771","-94.57945","-6","1"
+"75642","Elysian Fields","TX","32.386275","-94.210541","-6","1"
+"75643","Gary","TX","32.019931","-94.37287","-6","1"
+"75644","Gilmer","TX","32.727128","-94.9577","-6","1"
+"75645","Gilmer","TX","32.690553","-94.863311","-6","1"
+"75647","Gladewater","TX","32.531814","-94.94358","-6","1"
+"75650","Hallsville","TX","32.507527","-94.55839","-6","1"
+"75651","Harleton","TX","32.6941","-94.54519","-6","1"
+"75652","Henderson","TX","32.194938","-94.75852","-6","1"
+"75653","Henderson","TX","32.204724","-94.8845","-6","1"
+"75654","Henderson","TX","32.104159","-94.85568","-6","1"
+"75656","Hughes Springs","TX","32.998759","-94.61948","-6","1"
+"75657","Jefferson","TX","32.768011","-94.34908","-6","1"
+"75658","Joinerville","TX","32.195927","-94.906515","-6","1"
+"75659","Jonesville","TX","32.507491","-94.110636","-6","1"
+"75660","Judson","TX","32.51121","-94.783493","-6","1"
+"75661","Karnack","TX","32.66797","-94.16846","-6","1"
+"75662","Kilgore","TX","32.387151","-94.87439","-6","1"
+"75663","Kilgore","TX","32.386976","-94.895098","-6","1"
+"75666","Laird Hill","TX","32.301898","-94.928795","-6","1"
+"75667","Laneville","TX","31.981458","-94.85741","-6","1"
+"75668","Lone Star","TX","32.920957","-94.69722","-6","1"
+"75669","Long Branch","TX","32.03719","-94.57688","-6","1"
+"75670","Marshall","TX","32.547424","-94.37958","-6","1"
+"75671","Marshall","TX","32.522659","-94.389476","-6","1"
+"75672","Marshall","TX","32.513986","-94.30704","-6","1"
+"75680","Minden","TX","32.00923","-94.71766","-6","1"
+"75681","Mount Enterprise","TX","31.934633","-94.68886","-6","1"
+"75682","New London","TX","32.25416","-94.932215","-6","1"
+"75683","Ore City","TX","32.809766","-94.70513","-6","1"
+"75684","Overton","TX","32.26958","-94.94935","-6","1"
+"75685","Panola","TX","32.183774","-94.308713","-6","1"
+"75686","Pittsburg","TX","32.97708","-94.96809","-6","1"
+"75687","Price","TX","32.151755","-94.955432","-6","1"
+"75688","Scottsville","TX","32.55397","-94.239351","-6","1"
+"75689","Selman City","TX","32.1826","-94.935456","-6","1"
+"75691","Tatum","TX","32.312616","-94.53692","-6","1"
+"75692","Waskom","TX","32.472069","-94.09556","-6","1"
+"75693","White Oak","TX","32.533965","-94.86062","-6","1"
+"75694","Woodlawn","TX","32.653731","-94.342725","-6","1"
+"75701","Tyler","TX","32.325214","-95.29467","-6","1"
+"75702","Tyler","TX","32.360498","-95.3071","-6","1"
+"75703","Tyler","TX","32.264365","-95.31347","-6","1"
+"75704","Tyler","TX","32.388631","-95.41373","-6","1"
+"75705","Tyler","TX","32.364281","-95.08971","-6","1"
+"75706","Tyler","TX","32.456565","-95.33155","-6","1"
+"75707","Tyler","TX","32.292394","-95.20749","-6","1"
+"75708","Tyler","TX","32.40331","-95.22276","-6","1"
+"75709","Tyler","TX","32.31265","-95.39191","-6","1"
+"75710","Tyler","TX","32.347549","-95.306528","-6","1"
+"75711","Tyler","TX","32.539879","-95.419983","-6","1"
+"75712","Tyler","TX","32.411237","-95.289903","-6","1"
+"75713","Tyler","TX","32.411237","-95.289903","-6","1"
+"75750","Arp","TX","32.254414","-95.06517","-6","1"
+"75751","Athens","TX","32.184027","-95.84625","-6","1"
+"75752","Winona","TX","32.223828","-95.785482","-6","1"
+"75754","Ben Wheeler","TX","32.412451","-95.66711","-6","1"
+"75755","Big Sandy","TX","32.649482","-95.1259","-6","1"
+"75756","Brownsboro","TX","32.306045","-95.60507","-6","1"
+"75757","Bullard","TX","32.136787","-95.3671","-6","1"
+"75758","Chandler","TX","32.251068","-95.49667","-6","1"
+"75759","Cuney","TX","32.034127","-95.41776","-6","1"
+"75760","Cushing","TX","31.817889","-94.8631","-6","1"
+"75762","Flint","TX","32.207845","-95.41859","-6","1"
+"75763","Frankston","TX","32.072339","-95.50433","-6","1"
+"75764","Gallatin","TX","31.893439","-95.15272","-6","1"
+"75765","Hawkins","TX","32.617073","-95.22445","-6","1"
+"75766","Jacksonville","TX","31.953855","-95.25281","-6","1"
+"75770","Larue","TX","32.132651","-95.64632","-6","1"
+"75771","Lindale","TX","32.522902","-95.42126","-6","1"
+"75772","Maydelle","TX","31.800846","-95.300142","-6","1"
+"75773","Mineola","TX","32.674657","-95.46982","-6","1"
+"75778","Murchison","TX","32.33383","-95.7102","-6","1"
+"75779","Neches","TX","31.794191","-95.661964","-6","1"
+"75780","New Summerfield","TX","31.782048","-95.164021","-6","1"
+"75782","Poynor","TX","32.075703","-95.59919","-6","1"
+"75783","Quitman","TX","32.810076","-95.4355","-6","1"
+"75784","Reklaw","TX","31.883205","-94.9689","-6","1"
+"75785","Rusk","TX","31.79364","-95.16761","-6","1"
+"75788","Sacul","TX","31.825527","-94.91759","-6","1"
+"75789","Troup","TX","32.137225","-95.10105","-6","1"
+"75790","Van","TX","32.533765","-95.63493","-6","1"
+"75791","Whitehouse","TX","32.226082","-95.21751","-6","1"
+"75792","Winona","TX","32.476905","-95.13088","-6","1"
+"75798","Tyler","TX","32.411237","-95.289903","-6","1"
+"75799","Tyler","TX","32.411237","-95.289903","-6","1"
+"75801","Palestine","TX","31.779481","-95.63325","-6","1"
+"75802","Palestine","TX","31.926836","-95.579561","-6","1"
+"75803","Palestine","TX","31.760418","-95.656779","-6","1"
+"75806","Little Elm","TX","33.169075","-96.904315","-6","1"
+"75825","Alto","TX","31.64775","-95.082239","-6","1"
+"75831","Buffalo","TX","31.453732","-96.03725","-6","1"
+"75832","Cayuga","TX","31.794191","-95.661964","-6","1"
+"75833","Centerville","TX","31.27575","-95.90131","-6","1"
+"75834","Centralia","TX","31.105786","-95.138794","-6","1"
+"75835","Crockett","TX","31.315837","-95.47393","-6","1"
+"75838","Donie","TX","31.476671","-96.22212","-6","1"
+"75839","Elkhart","TX","31.627557","-95.53225","-6","1"
+"75840","Fairfield","TX","31.763713","-96.10808","-6","1"
+"75844","Grapeland","TX","31.505916","-95.46315","-6","1"
+"75845","Groveton","TX","31.090648","-95.07826","-6","1"
+"75846","Jewett","TX","31.346581","-96.17433","-6","1"
+"75847","Kennard","TX","31.355453","-95.15421","-6","1"
+"75848","Kirvin","TX","31.83272","-96.32126","-6","1"
+"75849","Latexo","TX","31.398448","-95.4737","-6","1"
+"75850","Leona","TX","31.134863","-95.93312","-6","1"
+"75851","Lovelady","TX","31.104197","-95.46434","-6","1"
+"75852","Midway","TX","30.984335","-95.71669","-6","1"
+"75853","Montalba","TX","31.930882","-95.82974","-6","1"
+"75855","Oakwood","TX","31.579572","-95.85303","-6","1"
+"75856","Pennington","TX","31.21349","-95.23475","-6","1"
+"75858","Ratcliff","TX","31.369811","-95.09184","-6","1"
+"75859","Streetman","TX","31.889748","-96.25435","-6","1"
+"75860","Teague","TX","31.625567","-96.27068","-6","1"
+"75861","Tennessee Colony","TX","31.829314","-95.86383","-6","1"
+"75862","Trinity","TX","30.94481","-95.33298","-6","1"
+"75865","Woodlake","TX","31.105786","-95.138794","-6","1"
+"75875","Rusk","TX","31.806615","-95.154008","-6","1"
+"75880","Tennessee Colony","TX","31.794191","-95.661964","-6","1"
+"75882","Palestine","TX","31.794191","-95.661964","-6","1"
+"75884","Tennessee Colony","TX","31.794191","-95.661964","-6","1"
+"75886","Tennessee Colony","TX","31.794191","-95.661964","-6","1"
+"75901","Lufkin","TX","31.330567","-94.68667","-6","1"
+"75902","Lufkin","TX","31.362315","-94.761103","-6","1"
+"75903","Lufkin","TX","31.276647","-94.56759","-6","1"
+"75904","Lufkin","TX","31.339891","-94.76295","-6","1"
+"75915","Lufkin","TX","31.287257","-94.577084","-6","1"
+"75925","Alto","TX","31.626263","-95.05495","-6","1"
+"75926","Apple Springs","TX","31.243006","-94.96448","-6","1"
+"75928","Bon Wier","TX","30.680344","-93.68535","-6","1"
+"75929","Broaddus","TX","31.242362","-94.17675","-6","1"
+"75930","Bronson","TX","31.340382","-94.02062","-6","1"
+"75931","Brookeland","TX","31.109064","-93.99031","-6","1"
+"75932","Burkeville","TX","31.067439","-93.61936","-6","1"
+"75933","Call","TX","30.580648","-93.81112","-6","1"
+"75934","Camden","TX","30.907239","-94.7312","-6","1"
+"75935","Center","TX","31.769105","-94.18997","-6","1"
+"75936","Chester","TX","30.942336","-94.58376","-6","1"
+"75937","Chireno","TX","31.467506","-94.37459","-6","1"
+"75938","Colmesneil","TX","30.916106","-94.35108","-6","1"
+"75939","Corrigan","TX","30.998982","-94.7994","-6","1"
+"75941","Diboll","TX","31.195633","-94.77725","-6","1"
+"75942","Doucette","TX","30.819095","-94.40497","-6","1"
+"75943","Douglass","TX","31.654777","-94.90988","-6","1"
+"75944","Etoile","TX","31.368872","-94.40817","-6","1"
+"75946","Garrison","TX","31.834379","-94.52629","-6","1"
+"75947","Geneva","TX","31.373062","-93.821948","-6","1"
+"75948","Hemphill","TX","31.332569","-93.75338","-6","1"
+"75949","Huntington","TX","31.226939","-94.5321","-6","1"
+"75951","Jasper","TX","30.941282","-94.03455","-6","1"
+"75954","Joaquin","TX","31.95015","-94.05761","-6","1"
+"75956","Kirbyville","TX","30.670556","-93.93811","-6","1"
+"75957","Timpson","TX","31.902986","-94.391148","-6","1"
+"75958","Martinsville","TX","31.534162","-94.639022","-6","1"
+"75959","Milam","TX","31.511711","-93.86086","-6","1"
+"75960","Moscow","TX","30.903688","-94.80916","-6","1"
+"75961","Nacogdoches","TX","31.626011","-94.60338","-6","1"
+"75962","Nacogdoches","TX","31.699494","-94.607432","-6","1"
+"75963","Nacogdoches","TX","31.604573","-94.664127","-6","1"
+"75964","Nacogdoches","TX","31.61099","-94.70503","-6","1"
+"75965","Nacogdoches","TX","31.649582","-94.638278","-6","1"
+"75966","Newton","TX","30.831678","-93.74869","-6","1"
+"75968","Pineland","TX","31.234368","-93.94399","-6","1"
+"75969","Pollok","TX","31.436494","-94.87815","-6","1"
+"75972","San Augustine","TX","31.514959","-94.16169","-6","1"
+"75973","Shelbyville","TX","31.735326","-93.90706","-6","1"
+"75974","Tenaha","TX","31.943273","-94.24291","-6","1"
+"75975","Timpson","TX","31.903614","-94.40775","-6","1"
+"75976","Wells","TX","31.506076","-94.94939","-6","1"
+"75977","Wiergate","TX","31.038417","-93.80057","-6","1"
+"75978","Woden","TX","31.502292","-94.52803","-6","1"
+"75979","Woodville","TX","30.768601","-94.40671","-6","1"
+"75980","Zavalla","TX","31.154673","-94.363","-6","1"
+"75990","Woodville","TX","30.792674","-94.354476","-6","1"
+"76001","Arlington","TX","32.634203","-97.14403","-6","1"
+"76002","Arlington","TX","32.632349","-97.0963","-6","1"
+"76003","Arlington","TX","32.741685","-97.225324","-6","1"
+"76004","Arlington","TX","32.771419","-97.291484","-6","1"
+"76005","Arlington","TX","32.771419","-97.291484","-6","1"
+"76006","Arlington","TX","32.778047","-97.08088","-6","1"
+"76007","Arlington","TX","32.771419","-97.291484","-6","1"
+"76008","Aledo","TX","32.690922","-97.64013","-6","1"
+"76009","Alvarado","TX","32.408183","-97.20956","-6","1"
+"76010","Arlington","TX","32.723382","-97.08498","-6","1"
+"76011","Arlington","TX","32.753672","-97.08706","-6","1"
+"76012","Arlington","TX","32.752048","-97.13514","-6","1"
+"76013","Arlington","TX","32.721632","-97.14698","-6","1"
+"76014","Arlington","TX","32.694666","-97.08748","-6","1"
+"76015","Arlington","TX","32.691393","-97.13546","-6","1"
+"76016","Arlington","TX","32.686863","-97.19234","-6","1"
+"76017","Arlington","TX","32.659277","-97.16435","-6","1"
+"76018","Arlington","TX","32.65392","-97.08724","-6","1"
+"76019","Arlington","TX","32.771419","-97.291484","-6","1"
+"76020","Azle","TX","32.905693","-97.54845","-6","1"
+"76021","Bedford","TX","32.851678","-97.13849","-6","1"
+"76022","Bedford","TX","32.831228","-97.14593","-6","1"
+"76023","Boyd","TX","33.068301","-97.59099","-6","1"
+"76025","Plano","TX","33.104374","-96.766109","-6","1"
+"76028","Burleson","TX","32.535841","-97.30681","-6","1"
+"76031","Cleburne","TX","32.343115","-97.40081","-6","1"
+"76033","Cleburne","TX","32.350907","-97.410254","-6","1"
+"76034","Colleyville","TX","32.885062","-97.14923","-6","1"
+"76035","Cresson","TX","32.546387","-97.64633","-6","1"
+"76036","Crowley","TX","32.573816","-97.38491","-6","1"
+"76039","Euless","TX","32.858727","-97.08453","-6","1"
+"76040","Euless","TX","32.826172","-97.09721","-6","1"
+"76041","Forreston","TX","32.244026","-96.86701","-6","1"
+"76043","Glen Rose","TX","32.228184","-97.77198","-6","1"
+"76044","Godley","TX","32.442679","-97.52595","-6","1"
+"76048","Granbury","TX","32.424695","-97.78894","-6","1"
+"76049","Granbury","TX","32.440376","-97.72002","-6","1"
+"76050","Grandview","TX","32.27442","-97.19282","-6","1"
+"76051","Grapevine","TX","32.93195","-97.08498","-6","1"
+"76052","Haslet","TX","32.972998","-97.35592","-6","1"
+"76053","Hurst","TX","32.821378","-97.181","-6","1"
+"76054","Hurst","TX","32.858398","-97.17681","-6","1"
+"76055","Itasca","TX","32.157903","-97.15014","-6","1"
+"76058","Joshua","TX","32.461964","-97.40774","-6","1"
+"76059","Keene","TX","32.39286","-97.3275","-6","1"
+"76060","Kennedale","TX","32.645257","-97.21458","-6","1"
+"76061","Lillian","TX","32.502674","-97.16347","-6","1"
+"76063","Mansfield","TX","32.57701","-97.13485","-6","1"
+"76064","Maypearl","TX","32.307456","-97.02761","-6","1"
+"76065","Midlothian","TX","32.484094","-96.98672","-6","1"
+"76066","Millsap","TX","32.715412","-98.00165","-6","1"
+"76067","Mineral Wells","TX","32.810275","-98.10707","-6","1"
+"76068","Mineral Wells","TX","32.759769","-98.316175","-6","1"
+"76070","Nemo","TX","32.259829","-97.65485","-6","1"
+"76071","Newark","TX","33.003717","-97.48974","-6","1"
+"76073","Paradise","TX","33.122273","-97.71691","-6","1"
+"76077","Rainbow","TX","32.28122","-97.70927","-6","1"
+"76078","Rhome","TX","33.072675","-97.473","-6","1"
+"76082","Springtown","TX","32.964932","-97.69803","-6","1"
+"76084","Venus","TX","32.434322","-97.09988","-6","1"
+"76085","Weatherford","TX","32.847183","-97.6986","-6","1"
+"76086","Weatherford","TX","32.77516","-97.77987","-6","1"
+"76087","Weatherford","TX","32.703008","-97.74814","-6","1"
+"76088","Weatherford","TX","32.842085","-97.90477","-6","1"
+"76092","Southlake","TX","32.946678","-97.14523","-6","1"
+"76093","Rio Vista","TX","32.220267","-97.39036","-6","1"
+"76094","Arlington","TX","32.771419","-97.291484","-6","1"
+"76095","Bedford","TX","32.771419","-97.291484","-6","1"
+"76096","Arlington","TX","32.771419","-97.291484","-6","1"
+"76097","Burleson","TX","32.524393","-97.2609","-6","1"
+"76098","Azle","TX","32.895716","-97.563622","-6","1"
+"76099","Grapevine","TX","32.771419","-97.291484","-6","1"
+"76101","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76102","Fort Worth","TX","32.75388","-97.32987","-6","1"
+"76103","Fort Worth","TX","32.745681","-97.26563","-6","1"
+"76104","Fort Worth","TX","32.730265","-97.32002","-6","1"
+"76105","Fort Worth","TX","32.724831","-97.26992","-6","1"
+"76106","Fort Worth","TX","32.798429","-97.354","-6","1"
+"76107","Fort Worth","TX","32.738481","-97.38424","-6","1"
+"76108","Fort Worth","TX","32.762563","-97.48079","-6","1"
+"76109","Fort Worth","TX","32.699565","-97.37808","-6","1"
+"76110","Fort Worth","TX","32.706331","-97.33787","-6","1"
+"76111","Fort Worth","TX","32.778479","-97.30099","-6","1"
+"76112","Fort Worth","TX","32.744032","-97.21957","-6","1"
+"76113","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76114","Fort Worth","TX","32.781329","-97.40099","-6","1"
+"76115","Fort Worth","TX","32.680333","-97.33579","-6","1"
+"76116","Fort Worth","TX","32.72228","-97.44409","-6","1"
+"76117","Haltom City","TX","32.805379","-97.27036","-6","1"
+"76118","Fort Worth","TX","32.80533","-97.22264","-6","1"
+"76119","Fort Worth","TX","32.691033","-97.26479","-6","1"
+"76120","Fort Worth","TX","32.762631","-97.17527","-6","1"
+"76121","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76122","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76123","Fort Worth","TX","32.623807","-97.37548","-6","1"
+"76124","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76126","Fort Worth","TX","32.649476","-97.49124","-6","1"
+"76127","Naval Air Station/ Jrb","TX","32.772063","-97.42165","-6","1"
+"76129","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76130","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76131","Fort Worth","TX","32.873017","-97.34622","-6","1"
+"76132","Fort Worth","TX","32.670345","-97.4143","-6","1"
+"76133","Fort Worth","TX","32.655401","-97.37765","-6","1"
+"76134","Fort Worth","TX","32.649855","-97.33358","-6","1"
+"76135","Fort Worth","TX","32.823629","-97.45167","-6","1"
+"76136","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76137","Fort Worth","TX","32.86814","-97.28566","-6","1"
+"76140","Fort Worth","TX","32.630268","-97.27102","-6","1"
+"76147","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76148","Fort Worth","TX","32.869384","-97.25123","-6","1"
+"76150","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76153","Fort Worth","TX","32.667134","-97.348895","-6","1"
+"76155","Fort Worth","TX","32.830932","-97.04778","-6","1"
+"76161","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76162","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76163","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76164","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76177","Fort Worth","TX","32.949819","-97.31406","-6","1"
+"76178","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76179","Fort Worth","TX","32.876475","-97.41249","-6","1"
+"76180","North Richland Hills","TX","32.855666","-97.21818","-6","1"
+"76181","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76182","North Richland Hills","TX","32.771419","-97.291484","-6","1"
+"76185","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76191","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76192","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76193","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76195","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76196","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76197","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76198","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76199","Fort Worth","TX","32.771419","-97.291484","-6","1"
+"76201","Denton","TX","33.226598","-97.13061","-6","1"
+"76202","Denton","TX","33.225523","-97.108546","-6","1"
+"76203","Denton","TX","33.246457","-97.127027","-6","1"
+"76204","Denton","TX","33.20743","-97.116282","-6","1"
+"76205","Denton","TX","33.16156","-97.10376","-6","1"
+"76206","Denton","TX","33.169379","-97.150558","-6","1"
+"76207","Denton","TX","33.236827","-97.16941","-6","1"
+"76208","Denton","TX","33.198442","-97.06078","-6","1"
+"76209","Denton","TX","33.23552","-97.112743","-6","1"
+"76210","Corinth","TX","33.143186","-97.088337","-6","1"
+"76225","Alvord","TX","33.360331","-97.69158","-6","1"
+"76226","Argyle","TX","33.105309","-97.16294","-6","1"
+"76227","Aubrey","TX","33.274761","-96.99457","-6","1"
+"76228","Bellevue","TX","33.586753","-98.07694","-6","1"
+"76230","Bowie","TX","33.54007","-97.88575","-6","1"
+"76233","Collinsville","TX","33.542765","-96.89419","-6","1"
+"76234","Decatur","TX","33.263039","-97.55657","-6","1"
+"76238","Era","TX","33.491311","-97.39136","-6","1"
+"76239","Forestburg","TX","33.530807","-97.54944","-6","1"
+"76240","Gainesville","TX","33.627942","-97.13636","-6","1"
+"76241","Gainesville","TX","33.610384","-97.03692","-6","1"
+"76244","Keller","TX","32.771419","-97.291484","-6","1"
+"76245","Gordonville","TX","33.842878","-96.82348","-6","1"
+"76246","Greenwood","TX","33.41798","-97.46457","-6","1"
+"76247","Justin","TX","33.08704","-97.30384","-6","1"
+"76248","Keller","TX","32.92704","-97.2506","-6","1"
+"76249","Krum","TX","33.270036","-97.24859","-6","1"
+"76250","Lindsay","TX","33.62109","-97.20652","-6","1"
+"76251","Montague","TX","33.660084","-97.71727","-6","1"
+"76252","Muenster","TX","33.661889","-97.38029","-6","1"
+"76253","Myra","TX","33.624401","-97.31704","-6","1"
+"76255","Nocona","TX","33.824724","-97.69688","-6","1"
+"76258","Pilot Point","TX","33.385645","-96.95213","-6","1"
+"76259","Ponder","TX","33.187644","-97.29676","-6","1"
+"76261","Ringgold","TX","33.817816","-97.94159","-6","1"
+"76262","Roanoke","TX","33.000177","-97.21871","-6","1"
+"76263","Rosston","TX","33.487842","-97.421155","-6","1"
+"76264","Sadler","TX","33.748414","-96.83792","-6","1"
+"76265","Saint Jo","TX","33.701692","-97.53029","-6","1"
+"76266","Sanger","TX","33.358871","-97.18944","-6","1"
+"76267","Slidell","TX","33.378039","-97.39219","-6","1"
+"76268","Southmayd","TX","33.621928","-96.7649","-6","1"
+"76270","Sunset","TX","33.446897","-97.77217","-6","1"
+"76271","Tioga","TX","33.469076","-96.91632","-6","1"
+"76272","Valley View","TX","33.482548","-97.12259","-6","1"
+"76273","Whitesboro","TX","33.705904","-96.91786","-6","1"
+"76299","Roanoke","TX","33.20743","-97.116282","-6","1"
+"76301","Wichita Falls","TX","33.916497","-98.47132","-6","1"
+"76302","Wichita Falls","TX","33.85379","-98.4801","-6","1"
+"76303","Wichita Falls","TX","33.897073","-98.459792","-6","1"
+"76304","Wichita Falls","TX","33.931024","-98.499077","-6","1"
+"76305","Wichita Falls","TX","33.996515","-98.51781","-6","1"
+"76306","Wichita Falls","TX","33.942496","-98.51923","-6","1"
+"76307","Wichita Falls","TX","33.877746","-98.494595","-6","1"
+"76308","Wichita Falls","TX","33.859798","-98.54064","-6","1"
+"76309","Wichita Falls","TX","33.892447","-98.53215","-6","1"
+"76310","Wichita Falls","TX","33.841948","-98.5624","-6","1"
+"76311","Sheppard AFB","TX","33.970725","-98.49127","-6","1"
+"76345","Fort Worth","TX","32.38253","-98.404816","-6","1"
+"76351","Archer City","TX","33.574426","-98.63462","-6","1"
+"76352","Bluegrove","TX","33.811665","-98.184762","-6","1"
+"76354","Burkburnett","TX","34.085289","-98.58881","-6","1"
+"76356","Terral","OK","33.897998","-97.936166","-6","1"
+"76357","Byers","TX","34.06722","-98.18119","-6","1"
+"76360","Electra","TX","33.963228","-98.97235","-6","1"
+"76363","Goree","TX","33.481208","-99.51447","-6","1"
+"76364","Harrold","TX","34.081642","-99.062","-6","1"
+"76365","Henrietta","TX","33.761291","-98.19145","-6","1"
+"76366","Holliday","TX","33.760814","-98.72148","-6","1"
+"76367","Iowa Park","TX","33.958681","-98.68492","-6","1"
+"76369","Kamay","TX","34.023386","-98.687748","-6","1"
+"76370","Megargel","TX","33.445341","-98.92106","-6","1"
+"76371","Munday","TX","33.463284","-99.63839","-6","1"
+"76372","Newcastle","TX","33.224562","-98.86043","-6","1"
+"76373","Oklaunion","TX","34.147838","-99.11818","-6","1"
+"76374","Olney","TX","33.364868","-98.75201","-6","1"
+"76377","Petrolia","TX","34.011464","-98.22961","-6","1"
+"76379","Scotland","TX","33.646685","-98.48719","-6","1"
+"76380","Seymour","TX","33.594956","-99.28506","-6","1"
+"76384","Vernon","TX","34.142094","-99.29649","-6","1"
+"76385","Vernon","TX","34.146356","-99.214088","-6","1"
+"76388","Weinert","TX","33.336436","-99.64257","-6","1"
+"76389","Windthorst","TX","33.554607","-98.42076","-6","1"
+"76401","Stephenville","TX","32.242816","-98.21058","-6","1"
+"76402","Stephenville","TX","32.215275","-98.207997","-6","1"
+"76420","Albany","TX","33.036724","-98.595422","-6","1"
+"76424","Breckenridge","TX","32.761058","-98.92225","-6","1"
+"76426","Bridgeport","TX","33.197313","-97.80932","-6","1"
+"76427","Bryson","TX","33.165414","-98.38244","-6","1"
+"76429","Caddo","TX","32.74154","-98.67089","-6","1"
+"76430","Albany","TX","32.742591","-99.27519","-6","1"
+"76431","Chico","TX","33.293652","-97.8597","-6","1"
+"76432","Blanket","TX","31.82741","-98.80286","-6","1"
+"76433","Bluff Dale","TX","32.318616","-98.03345","-6","1"
+"76435","Carbon","TX","32.236449","-98.83268","-6","1"
+"76436","Carlton","TX","31.917085","-98.17418","-6","1"
+"76437","Cisco","TX","32.39492","-98.99444","-6","1"
+"76439","Dennis","TX","32.632495","-97.957483","-6","1"
+"76442","Comanche","TX","31.906683","-98.60618","-6","1"
+"76443","Cross Plains","TX","32.103546","-99.17874","-6","1"
+"76444","De Leon","TX","32.122804","-98.55799","-6","1"
+"76445","Desdemona","TX","32.298841","-98.55194","-6","1"
+"76446","Dublin","TX","32.07881","-98.35073","-6","1"
+"76448","Eastland","TX","32.398681","-98.7959","-6","1"
+"76449","Graford","TX","32.908714","-98.35727","-6","1"
+"76450","Graham","TX","33.081863","-98.60091","-6","1"
+"76452","Energy","TX","31.758351","-98.40613","-6","1"
+"76453","Gordon","TX","32.572618","-98.36399","-6","1"
+"76454","Gorman","TX","32.214932","-98.68404","-6","1"
+"76455","Gustine","TX","31.833414","-98.37248","-6","1"
+"76457","Hico","TX","31.944207","-98.02763","-6","1"
+"76458","Jacksboro","TX","33.200265","-98.15778","-6","1"
+"76459","Jermyn","TX","33.277727","-98.39461","-6","1"
+"76460","Loving","TX","33.332336","-98.48413","-6","1"
+"76461","Lingleville","TX","32.221433","-98.342798","-6","1"
+"76462","Lipan","TX","32.517753","-98.03379","-6","1"
+"76463","Mingus","TX","32.493233","-98.41805","-6","1"
+"76464","Moran","TX","32.57665","-99.18511","-6","1"
+"76465","Morgan Mill","TX","32.215275","-98.207997","-6","1"
+"76466","Olden","TX","32.428128","-98.74853","-6","1"
+"76467","Paluxy","TX","32.341365","-97.932083","-6","1"
+"76468","Proctor","TX","31.989197","-98.42529","-6","1"
+"76469","Putnam","TX","32.37338","-99.19762","-6","1"
+"76470","Ranger","TX","32.497298","-98.67402","-6","1"
+"76471","Rising Star","TX","32.105459","-98.96537","-6","1"
+"76472","Santo","TX","32.617128","-98.17476","-6","1"
+"76474","Sidney","TX","31.963873","-98.78317","-6","1"
+"76475","Strawn","TX","32.628147","-98.48517","-6","1"
+"76476","Tolar","TX","32.387648","-97.93959","-6","1"
+"76481","South Bend","TX","32.970869","-98.71204","-6","1"
+"76483","Throckmorton","TX","33.155666","-99.2174","-6","1"
+"76484","Palo Pinto","TX","32.722689","-98.33271","-6","1"
+"76485","Peaster","TX","32.779315","-97.805502","-6","1"
+"76486","Perrin","TX","33.024726","-98.05788","-6","1"
+"76487","Poolville","TX","33.009411","-97.89968","-6","1"
+"76490","Whitt","TX","32.95802","-98.01942","-6","1"
+"76491","Woodson","TX","33.029698","-99.03622","-6","1"
+"76501","Temple","TX","31.093215","-97.31086","-6","1"
+"76502","Temple","TX","31.086483","-97.40076","-6","1"
+"76503","Temple","TX","31.053986","-97.320306","-6","1"
+"76504","Temple","TX","31.09954","-97.35766","-6","1"
+"76505","Temple","TX","31.036287","-97.492017","-6","1"
+"76508","Temple","TX","31.036287","-97.492017","-6","1"
+"76511","Bartlett","TX","30.798697","-97.42363","-6","1"
+"76513","Belton","TX","31.073329","-97.48642","-6","1"
+"76518","Buckholts","TX","30.851275","-97.13837","-6","1"
+"76519","Burlington","TX","31.002164","-97.0358","-6","1"
+"76520","Cameron","TX","30.851922","-96.96323","-6","1"
+"76522","Copperas Cove","TX","31.131076","-97.91666","-6","1"
+"76523","Davilla","TX","30.785114","-97.28058","-6","1"
+"76524","Eddy","TX","31.279614","-97.22336","-6","1"
+"76525","Evant","TX","31.485242","-98.19084","-6","1"
+"76526","Flat","TX","31.295568","-97.582152","-6","1"
+"76527","Florence","TX","30.833293","-97.8049","-6","1"
+"76528","Gatesville","TX","31.43211","-97.72602","-6","1"
+"76530","Granger","TX","30.715207","-97.43449","-6","1"
+"76531","Hamilton","TX","31.696154","-98.14834","-6","1"
+"76533","Heidenheimer","TX","31.049621","-97.493616","-6","1"
+"76534","Holland","TX","30.883556","-97.396","-6","1"
+"76537","Jarrell","TX","30.808903","-97.59923","-6","1"
+"76538","Jonesboro","TX","31.629515","-97.90249","-6","1"
+"76539","Kempner","TX","31.071352","-97.97615","-6","1"
+"76540","Killeen","TX","31.085833","-97.357099","-6","1"
+"76541","Killeen","TX","31.117874","-97.72924","-6","1"
+"76542","Killeen","TX","31.027003","-97.76717","-6","1"
+"76543","Killeen","TX","31.113828","-97.69246","-6","1"
+"76544","Killeen","TX","31.148447","-97.80918","-6","1"
+"76545","Killeen","TX","31.036287","-97.492017","-6","1"
+"76546","Killeen","TX","31.036287","-97.492017","-6","1"
+"76547","Killeen","TX","31.036287","-97.492017","-6","1"
+"76548","Harker Heights","TX","31.068459","-97.65552","-6","1"
+"76549","Killeen","TX","31.084108","-97.79149","-6","1"
+"76550","Lampasas","TX","31.06639","-98.19192","-6","1"
+"76552","Leon Junction","TX","31.351234","-97.548468","-6","1"
+"76554","Little River","TX","30.985136","-97.35508","-6","1"
+"76555","Maysfield","TX","30.784169","-96.96376","-6","1"
+"76556","Milano","TX","30.702352","-96.85039","-6","1"
+"76557","Moody","TX","31.29697","-97.38491","-6","1"
+"76558","Mound","TX","31.351386","-97.644352","-6","1"
+"76559","Nolanville","TX","31.081777","-97.6138","-6","1"
+"76561","Oglesby","TX","31.430323","-97.52946","-6","1"
+"76564","Pendleton","TX","31.036287","-97.492017","-6","1"
+"76565","Pottsville","TX","31.650023","-98.36186","-6","1"
+"76566","Purmela","TX","31.506687","-97.98997","-6","1"
+"76567","Rockdale","TX","30.646291","-97.01149","-6","1"
+"76569","Rogers","TX","30.932552","-97.22374","-6","1"
+"76570","Rosebud","TX","31.071723","-96.96229","-6","1"
+"76571","Salado","TX","30.955509","-97.56503","-6","1"
+"76573","Schwertner","TX","30.805512","-97.470456","-6","1"
+"76574","Taylor","TX","30.574821","-97.40948","-6","1"
+"76576","Salado","TX","30.946345","-97.535883","-6","1"
+"76577","Thorndale","TX","30.611416","-97.18458","-6","1"
+"76578","Thrall","TX","30.55063","-97.24963","-6","1"
+"76579","Troy","TX","31.212196","-97.26563","-6","1"
+"76596","Gatesville","TX","31.390196","-97.799309","-6","1"
+"76597","Gatesville","TX","31.390196","-97.799309","-6","1"
+"76598","Gatesville","TX","31.390196","-97.799309","-6","1"
+"76599","Gatesville","TX","31.470598","-97.734728","-6","1"
+"76607","Milford","TX","32.127507","-96.947689","-6","1"
+"76618","Richland","TX","31.930849","-96.429154","-6","1"
+"76621","Abbott","TX","31.884263","-97.08385","-6","1"
+"76622","Aquilla","TX","31.824495","-97.23306","-6","1"
+"76623","Avalon","TX","32.221421","-96.7832","-6","1"
+"76624","Axtell","TX","31.661554","-96.95451","-6","1"
+"76626","Blooming Grove","TX","32.098474","-96.71501","-6","1"
+"76627","Blum","TX","32.122106","-97.41864","-6","1"
+"76628","Brandon","TX","32.045029","-96.96601","-6","1"
+"76629","Bremond","TX","31.160528","-96.6778","-6","1"
+"76630","Bruceville","TX","31.337382","-97.22762","-6","1"
+"76631","Bynum","TX","31.978157","-96.9725","-6","1"
+"76632","Chilton","TX","31.287625","-97.06076","-6","1"
+"76633","China Spring","TX","31.669085","-97.3201","-6","1"
+"76634","Clifton","TX","31.798454","-97.52516","-6","1"
+"76635","Coolidge","TX","31.734571","-96.66388","-6","1"
+"76636","Covington","TX","32.177765","-97.27284","-6","1"
+"76637","Cranfills Gap","TX","31.771383","-97.82298","-6","1"
+"76638","Crawford","TX","31.555885","-97.41024","-6","1"
+"76639","Dawson","TX","31.881324","-96.70164","-6","1"
+"76640","Elm Mott","TX","31.686152","-97.08602","-6","1"
+"76641","Frost","TX","32.044273","-96.78624","-6","1"
+"76642","Groesbeck","TX","31.510726","-96.51529","-6","1"
+"76643","Hewitt","TX","31.453789","-97.19502","-6","1"
+"76644","Laguna Park","TX","31.897381","-97.64097","-6","1"
+"76645","Hillsboro","TX","32.015496","-97.12263","-6","1"
+"76648","Hubbard","TX","31.84121","-96.80817","-6","1"
+"76649","Iredell","TX","32.001365","-97.88196","-6","1"
+"76650","Irene","TX","31.987167","-97.108113","-6","1"
+"76651","Italy","TX","32.175783","-96.88018","-6","1"
+"76652","Kopperl","TX","32.109599","-97.54276","-6","1"
+"76653","Kosse","TX","31.304634","-96.61211","-6","1"
+"76654","Leroy","TX","31.553646","-97.203166","-6","1"
+"76655","Lorena","TX","31.393062","-97.16178","-6","1"
+"76656","Lott","TX","31.185062","-97.04389","-6","1"
+"76657","McGregor","TX","31.416926","-97.40095","-6","1"
+"76660","Malone","TX","31.928342","-96.88213","-6","1"
+"76661","Marlin","TX","31.310649","-96.87859","-6","1"
+"76664","Mart","TX","31.549368","-96.8233","-6","1"
+"76665","Meridian","TX","31.922473","-97.69159","-6","1"
+"76666","Mertens","TX","32.046241","-96.90003","-6","1"
+"76667","Mexia","TX","31.669823","-96.48721","-6","1"
+"76670","Milford","TX","32.111683","-96.97377","-6","1"
+"76671","Morgan","TX","32.011671","-97.5324","-6","1"
+"76673","Mount Calm","TX","31.74658","-96.89776","-6","1"
+"76675","Otto","TX","31.416468","-96.81813","-6","1"
+"76676","Penelope","TX","31.861594","-96.93466","-6","1"
+"76677","Perry","TX","31.254242","-96.937574","-6","1"
+"76678","Prairie Hill","TX","31.652858","-96.78857","-6","1"
+"76679","Purdon","TX","31.949312","-96.61514","-6","1"
+"76680","Reagan","TX","31.190291","-96.81034","-6","1"
+"76681","Richland","TX","31.90869","-96.40744","-6","1"
+"76682","Riesel","TX","31.475763","-96.9179","-6","1"
+"76683","Riesel","TX","31.503892","-97.179773","-6","1"
+"76684","Ross","TX","31.717293","-97.118754","-6","1"
+"76685","Satin","TX","31.35797","-97.02091","-6","1"
+"76686","Tehuacana","TX","31.752538","-96.54327","-6","1"
+"76687","Thornton","TX","31.376261","-96.49614","-6","1"
+"76689","Valley Mills","TX","31.662435","-97.50214","-6","1"
+"76690","Walnut Springs","TX","32.078488","-97.76708","-6","1"
+"76691","West","TX","31.783019","-97.07945","-6","1"
+"76692","Whitney","TX","31.975949","-97.35499","-6","1"
+"76693","Wortham","TX","31.787449","-96.44885","-6","1"
+"76701","Waco","TX","31.551955","-97.13833","-6","1"
+"76702","Waco","TX","31.547516","-97.14433","-6","1"
+"76703","Waco","TX","31.553646","-97.203166","-6","1"
+"76704","Waco","TX","31.571266","-97.12201","-6","1"
+"76705","Waco","TX","31.609834","-97.08821","-6","1"
+"76706","Waco","TX","31.514267","-97.11807","-6","1"
+"76707","Waco","TX","31.552266","-97.15957","-6","1"
+"76708","Waco","TX","31.584132","-97.18558","-6","1"
+"76710","Waco","TX","31.535916","-97.18588","-6","1"
+"76711","Waco","TX","31.520296","-97.15099","-6","1"
+"76712","Woodway","TX","31.514067","-97.23546","-6","1"
+"76714","Waco","TX","31.553646","-97.203166","-6","1"
+"76715","Waco","TX","31.553646","-97.203166","-6","1"
+"76716","Waco","TX","31.553646","-97.203166","-6","1"
+"76795","Waco","TX","31.553646","-97.203166","-6","1"
+"76797","Waco","TX","31.553646","-97.203166","-6","1"
+"76798","Waco","TX","31.547466","-97.11997","-6","1"
+"76799","Waco","TX","31.541116","-97.16148","-6","1"
+"76801","Brownwood","TX","31.73003","-99.00605","-6","1"
+"76802","Early","TX","31.747887","-98.93928","-6","1"
+"76803","Brownwood","TX","31.763882","-98.936021","-6","1"
+"76804","Brownwood","TX","31.77419","-99.09213","-6","1"
+"76820","Art","TX","30.720372","-99.100089","-6","1"
+"76821","Ballinger","TX","31.754011","-99.93695","-6","1"
+"76823","Bangs","TX","31.714347","-99.14462","-6","1"
+"76824","Bend","TX","31.086845","-98.51817","-6","1"
+"76825","Brady","TX","31.121411","-99.3407","-6","1"
+"76827","Brookesmith","TX","31.542459","-99.13604","-6","1"
+"76828","Burkett","TX","32.023828","-99.23597","-6","1"
+"76831","Castell","TX","30.776619","-98.95072","-6","1"
+"76832","Cherokee","TX","30.98609","-98.67201","-6","1"
+"76834","Coleman","TX","31.847973","-99.45514","-6","1"
+"76836","Doole","TX","31.217152","-99.347156","-6","1"
+"76837","Eden","TX","31.201871","-99.90601","-6","1"
+"76841","Fort McKavett","TX","30.834326","-100.09843","-6","1"
+"76842","Fredonia","TX","30.92753","-99.08975","-6","1"
+"76844","Goldthwaite","TX","31.460782","-98.52618","-6","1"
+"76845","Gouldbusk","TX","31.547652","-99.47679","-6","1"
+"76848","Hext","TX","30.847791","-99.52617","-6","1"
+"76849","Junction","TX","30.478782","-99.77444","-6","1"
+"76852","Lohn","TX","31.404745","-99.49265","-6","1"
+"76853","Lometa","TX","31.238292","-98.40241","-6","1"
+"76854","London","TX","30.646698","-99.54107","-6","1"
+"76855","Lowake","TX","31.333614","-99.85837","-6","1"
+"76856","Mason","TX","30.75159","-99.23238","-6","1"
+"76857","May","TX","31.917862","-98.95325","-6","1"
+"76858","Melvin","TX","31.230813","-99.62583","-6","1"
+"76859","Menard","TX","30.873091","-99.8296","-6","1"
+"76861","Miles","TX","31.58901","-100.1911","-6","1"
+"76862","Millersview","TX","31.445119","-99.70831","-6","1"
+"76864","Mullin","TX","31.561427","-98.73632","-6","1"
+"76865","Norton","TX","31.849628","-100.15332","-6","1"
+"76866","Paint Rock","TX","31.472654","-99.92215","-6","1"
+"76867","Pear Valley","TX","31.217152","-99.347156","-6","1"
+"76869","Pontotoc","TX","30.909853","-98.98395","-6","1"
+"76870","Priddy","TX","31.651485","-98.50831","-6","1"
+"76871","Richland Springs","TX","31.292292","-98.96012","-6","1"
+"76872","Rochelle","TX","31.314477","-99.17492","-6","1"
+"76873","Rockwood","TX","31.51161","-99.37166","-6","1"
+"76874","Roosevelt","TX","30.480128","-100.1175","-6","1"
+"76875","Rowena","TX","31.611317","-100.033","-6","1"
+"76877","San Saba","TX","31.190826","-98.74134","-6","1"
+"76878","Santa Anna","TX","31.722813","-99.2959","-6","1"
+"76880","Star","TX","31.477095","-98.630919","-6","1"
+"76882","Talpa","TX","31.801928","-99.68057","-6","1"
+"76883","Telegraph","TX","29.956952","-100.227509","-6","1"
+"76884","Valera","TX","31.753561","-99.54774","-6","1"
+"76885","Valley Spring","TX","30.904481","-98.79242","-6","1"
+"76886","Veribest","TX","31.349348","-100.494912","-6","1"
+"76887","Voca","TX","30.973049","-99.17091","-6","1"
+"76888","Voss","TX","31.589203","-99.62601","-6","1"
+"76890","Zephyr","TX","31.685153","-98.77741","-6","1"
+"76901","San Angelo","TX","31.474132","-100.5198","-6","1"
+"76902","San Angelo","TX","31.39577","-100.68959","-6","1"
+"76903","San Angelo","TX","31.468911","-100.4387","-6","1"
+"76904","San Angelo","TX","31.344515","-100.47217","-6","1"
+"76905","San Angelo","TX","31.515684","-100.34896","-6","1"
+"76906","San Angelo","TX","31.372754","-100.495114","-6","1"
+"76908","Goodfellow AFB","TX","31.39577","-100.68959","-6","1"
+"76909","San Angelo","TX","31.39577","-100.68959","-6","1"
+"76930","Barnhart","TX","31.148007","-101.18632","-6","1"
+"76932","Big Lake","TX","31.304669","-101.50841","-6","1"
+"76933","Bronte","TX","31.887436","-100.28655","-6","1"
+"76934","Carlsbad","TX","31.603027","-100.65431","-6","1"
+"76935","Christoval","TX","31.088429","-100.41072","-6","1"
+"76936","Eldorado","TX","30.860483","-100.53988","-6","1"
+"76937","Eola","TX","31.377623","-100.10134","-6","1"
+"76939","Knickerbocker","TX","31.250101","-100.592015","-6","1"
+"76940","Mereta","TX","31.45195","-100.12886","-6","1"
+"76941","Mertzon","TX","31.330315","-100.93381","-6","1"
+"76943","Ozona","TX","30.620199","-101.24517","-6","1"
+"76945","Robert Lee","TX","31.890079","-100.5669","-6","1"
+"76949","Silver","TX","32.047723","-100.69452","-6","1"
+"76950","Sonora","TX","30.453299","-100.56983","-6","1"
+"76951","Sterling City","TX","31.818347","-101.0455","-6","1"
+"76953","Tennyson","TX","31.716571","-100.35906","-6","1"
+"76955","Vancourt","TX","31.305402","-100.12871","-6","1"
+"76957","Wall","TX","31.359844","-100.206705","-6","1"
+"76958","Water Valley","TX","31.663529","-100.71789","-6","1"
+"77000","Houston","TX","29.711257","-95.304936","-6","1"
+"77001","Houston","TX","29.813142","-95.309789","-6","1"
+"77002","Houston","TX","29.755578","-95.36531","-6","1"
+"77003","Houston","TX","29.749278","-95.34741","-6","1"
+"77004","Houston","TX","29.728779","-95.3657","-6","1"
+"77005","Houston","TX","29.717529","-95.42821","-6","1"
+"77006","Houston","TX","29.741878","-95.38944","-6","1"
+"77007","Houston","TX","29.772627","-95.40319","-6","1"
+"77008","Houston","TX","29.798777","-95.40951","-6","1"
+"77009","Houston","TX","29.79326","-95.36735","-6","1"
+"77010","Houston","TX","29.754728","-95.36216","-6","1"
+"77011","Houston","TX","29.742378","-95.30726","-6","1"
+"77012","Houston","TX","29.719778","-95.27906","-6","1"
+"77013","Houston","TX","29.78146","-95.24289","-6","1"
+"77014","Houston","TX","29.979063","-95.47294","-6","1"
+"77015","Houston","TX","29.778526","-95.18118","-6","1"
+"77016","Houston","TX","29.857007","-95.30886","-6","1"
+"77017","Houston","TX","29.687829","-95.25478","-6","1"
+"77018","Houston","TX","29.825476","-95.42619","-6","1"
+"77019","Houston","TX","29.752528","-95.39923","-6","1"
+"77020","Houston","TX","29.775927","-95.31836","-6","1"
+"77021","Houston","TX","29.695879","-95.3573","-6","1"
+"77022","Houston","TX","29.825176","-95.37798","-6","1"
+"77023","Houston","TX","29.725961","-95.3227","-6","1"
+"77024","Houston","TX","29.773994","-95.51771","-6","1"
+"77025","Houston","TX","29.69023","-95.43474","-6","1"
+"77026","Houston","TX","29.79437","-95.33395","-6","1"
+"77027","Houston","TX","29.739029","-95.44364","-6","1"
+"77028","Houston","TX","29.827315","-95.28631","-6","1"
+"77029","Houston","TX","29.760794","-95.26043","-6","1"
+"77030","Houston","TX","29.704584","-95.40466","-6","1"
+"77031","Houston","TX","29.654132","-95.54311","-6","1"
+"77032","Houston","TX","29.944922","-95.34152","-6","1"
+"77033","Houston","TX","29.66913","-95.33834","-6","1"
+"77034","Houston","TX","29.63643","-95.21789","-6","1"
+"77035","Houston","TX","29.654108","-95.47692","-6","1"
+"77036","Houston","TX","29.70053","-95.53514","-6","1"
+"77037","Houston","TX","29.885451","-95.39552","-6","1"
+"77038","Houston","TX","29.917814","-95.44138","-6","1"
+"77039","Houston","TX","29.909123","-95.33683","-6","1"
+"77040","Houston","TX","29.878345","-95.53337","-6","1"
+"77041","Houston","TX","29.85873","-95.57243","-6","1"
+"77042","Houston","TX","29.741565","-95.55996","-6","1"
+"77043","Houston","TX","29.802473","-95.5618","-6","1"
+"77044","Houston","TX","29.88277","-95.16782","-6","1"
+"77045","Houston","TX","29.629111","-95.43841","-6","1"
+"77046","Houston","TX","29.733181","-95.43131","-6","1"
+"77047","Houston","TX","29.616182","-95.37767","-6","1"
+"77048","Houston","TX","29.633081","-95.33761","-6","1"
+"77049","Houston","TX","29.832668","-95.1742","-6","1"
+"77050","Houston","TX","29.896156","-95.28687","-6","1"
+"77051","Houston","TX","29.66543","-95.36871","-6","1"
+"77052","Houston","TX","29.676829","-95.177587","-6","1"
+"77053","Houston","TX","29.596666","-95.45981","-6","1"
+"77054","Houston","TX","29.683865","-95.39772","-6","1"
+"77055","Houston","TX","29.798877","-95.49629","-6","1"
+"77056","Houston","TX","29.747328","-95.46931","-6","1"
+"77057","Houston","TX","29.745129","-95.49131","-6","1"
+"77058","Houston","TX","29.55283","-95.10265","-6","1"
+"77059","Houston","TX","29.601776","-95.11734","-6","1"
+"77060","Houston","TX","29.933367","-95.39916","-6","1"
+"77061","Houston","TX","29.66028","-95.28446","-6","1"
+"77062","Houston","TX","29.57493","-95.13238","-6","1"
+"77063","Houston","TX","29.734379","-95.52269","-6","1"
+"77064","Houston","TX","29.923638","-95.55919","-6","1"
+"77065","Houston","TX","29.927675","-95.60547","-6","1"
+"77066","Houston","TX","29.959439","-95.49694","-6","1"
+"77067","Houston","TX","29.952354","-95.45065","-6","1"
+"77068","Houston","TX","30.007886","-95.48532","-6","1"
+"77069","Houston","TX","29.984672","-95.52887","-6","1"
+"77070","Houston","TX","29.978801","-95.57655","-6","1"
+"77071","Houston","TX","29.647637","-95.51718","-6","1"
+"77072","Houston","TX","29.700898","-95.59002","-6","1"
+"77073","Houston","TX","30.008745","-95.41273","-6","1"
+"77074","Houston","TX","29.689781","-95.51161","-6","1"
+"77075","Houston","TX","29.620881","-95.26018","-6","1"
+"77076","Houston","TX","29.858525","-95.38178","-6","1"
+"77077","Houston","TX","29.750897","-95.61255","-6","1"
+"77078","Houston","TX","29.849424","-95.25951","-6","1"
+"77079","Houston","TX","29.773018","-95.60125","-6","1"
+"77080","Houston","TX","29.816866","-95.52309","-6","1"
+"77081","Houston","TX","29.70828","-95.48361","-6","1"
+"77082","Houston","TX","29.722704","-95.6314","-6","1"
+"77083","Houston","TX","29.691714","-95.64978","-6","1"
+"77084","Houston","TX","29.839155","-95.66391","-6","1"
+"77085","Houston","TX","29.621746","-95.48695","-6","1"
+"77086","Houston","TX","29.920981","-95.49556","-6","1"
+"77087","Houston","TX","29.686579","-95.30386","-6","1"
+"77088","Houston","TX","29.879213","-95.45028","-6","1"
+"77089","Houston","TX","29.589831","-95.22251","-6","1"
+"77090","Houston","TX","30.012711","-95.45132","-6","1"
+"77091","Houston","TX","29.852975","-95.43586","-6","1"
+"77092","Houston","TX","29.833326","-95.47644","-6","1"
+"77093","Houston","TX","29.862024","-95.33967","-6","1"
+"77094","Houston","TX","29.770722","-95.6988","-6","1"
+"77095","Houston","TX","29.896656","-95.64842","-6","1"
+"77096","Houston","TX","29.674336","-95.48123","-6","1"
+"77097","Houston","TX","29.83399","-95.434241","-6","1"
+"77098","Houston","TX","29.735529","-95.41405","-6","1"
+"77099","Houston","TX","29.668489","-95.5869","-6","1"
+"77201","Houston","TX","29.83399","-95.434241","-6","1"
+"77202","Houston","TX","29.83399","-95.434241","-6","1"
+"77203","Houston","TX","29.83399","-95.434241","-6","1"
+"77204","Houston","TX","29.83399","-95.434241","-6","1"
+"77205","Houston","TX","29.83399","-95.434241","-6","1"
+"77206","Houston","TX","29.83399","-95.434241","-6","1"
+"77207","Houston","TX","29.83399","-95.434241","-6","1"
+"77208","Houston","TX","29.83399","-95.434241","-6","1"
+"77209","Houston","TX","29.612816","-95.158517","-6","1"
+"77210","Houston","TX","29.83399","-95.434241","-6","1"
+"77212","Houston","TX","29.83399","-95.434241","-6","1"
+"77213","Houston","TX","29.83399","-95.434241","-6","1"
+"77215","Houston","TX","29.83399","-95.434241","-6","1"
+"77216","Houston","TX","29.83399","-95.434241","-6","1"
+"77217","Houston","TX","29.83399","-95.434241","-6","1"
+"77218","Houston","TX","29.83399","-95.434241","-6","1"
+"77219","Houston","TX","29.83399","-95.434241","-6","1"
+"77220","Houston","TX","29.83399","-95.434241","-6","1"
+"77221","Houston","TX","29.83399","-95.434241","-6","1"
+"77222","Houston","TX","29.83399","-95.434241","-6","1"
+"77223","Houston","TX","29.83399","-95.434241","-6","1"
+"77224","Houston","TX","29.83399","-95.434241","-6","1"
+"77225","Houston","TX","29.83399","-95.434241","-6","1"
+"77226","Houston","TX","29.83399","-95.434241","-6","1"
+"77227","Houston","TX","29.83399","-95.434241","-6","1"
+"77228","Houston","TX","29.83399","-95.434241","-6","1"
+"77229","Houston","TX","29.83399","-95.434241","-6","1"
+"77230","Houston","TX","29.83399","-95.434241","-6","1"
+"77231","Houston","TX","29.83399","-95.434241","-6","1"
+"77233","Houston","TX","29.83399","-95.434241","-6","1"
+"77234","Houston","TX","29.83399","-95.434241","-6","1"
+"77235","Houston","TX","29.83399","-95.434241","-6","1"
+"77236","Houston","TX","29.83399","-95.434241","-6","1"
+"77237","Houston","TX","29.83399","-95.434241","-6","1"
+"77238","Houston","TX","29.83399","-95.434241","-6","1"
+"77240","Houston","TX","29.83399","-95.434241","-6","1"
+"77241","Houston","TX","29.83399","-95.434241","-6","1"
+"77242","Houston","TX","29.83399","-95.434241","-6","1"
+"77243","Houston","TX","29.83399","-95.434241","-6","1"
+"77244","Houston","TX","29.83399","-95.434241","-6","1"
+"77245","Houston","TX","29.83399","-95.434241","-6","1"
+"77248","Houston","TX","29.83399","-95.434241","-6","1"
+"77249","Houston","TX","29.83399","-95.434241","-6","1"
+"77251","Houston","TX","29.83399","-95.434241","-6","1"
+"77252","Houston","TX","29.83399","-95.434241","-6","1"
+"77253","Houston","TX","29.83399","-95.434241","-6","1"
+"77254","Houston","TX","29.83399","-95.434241","-6","1"
+"77255","Houston","TX","29.83399","-95.434241","-6","1"
+"77256","Houston","TX","29.83399","-95.434241","-6","1"
+"77257","Houston","TX","29.83399","-95.434241","-6","1"
+"77258","Houston","TX","29.83399","-95.434241","-6","1"
+"77259","Houston","TX","29.83399","-95.434241","-6","1"
+"77261","Houston","TX","29.83399","-95.434241","-6","1"
+"77262","Houston","TX","29.83399","-95.434241","-6","1"
+"77263","Houston","TX","29.83399","-95.434241","-6","1"
+"77265","Houston","TX","29.83399","-95.434241","-6","1"
+"77266","Houston","TX","29.83399","-95.434241","-6","1"
+"77267","Houston","TX","29.83399","-95.434241","-6","1"
+"77268","Houston","TX","29.83399","-95.434241","-6","1"
+"77269","Houston","TX","29.83399","-95.434241","-6","1"
+"77270","Houston","TX","29.83399","-95.434241","-6","1"
+"77271","Houston","TX","29.83399","-95.434241","-6","1"
+"77272","Houston","TX","29.83399","-95.434241","-6","1"
+"77273","Houston","TX","29.83399","-95.434241","-6","1"
+"77274","Houston","TX","29.83399","-95.434241","-6","1"
+"77275","Houston","TX","29.83399","-95.434241","-6","1"
+"77277","Houston","TX","29.83399","-95.434241","-6","1"
+"77279","Houston","TX","29.83399","-95.434241","-6","1"
+"77280","Houston","TX","29.83399","-95.434241","-6","1"
+"77281","Houston","TX","29.83399","-95.434241","-6","1"
+"77282","Houston","TX","29.83399","-95.434241","-6","1"
+"77284","Houston","TX","29.83399","-95.434241","-6","1"
+"77287","Houston","TX","29.83399","-95.434241","-6","1"
+"77288","Houston","TX","29.83399","-95.434241","-6","1"
+"77289","Houston","TX","29.83399","-95.434241","-6","1"
+"77290","Houston","TX","29.83399","-95.434241","-6","1"
+"77291","Houston","TX","29.83399","-95.434241","-6","1"
+"77292","Houston","TX","29.744341","-95.332598","-6","1"
+"77293","Houston","TX","29.83399","-95.434241","-6","1"
+"77297","Houston","TX","29.83399","-95.434241","-6","1"
+"77298","Houston","TX","29.83399","-95.434241","-6","1"
+"77299","Houston","TX","29.83399","-95.434241","-6","1"
+"77301","Conroe","TX","30.313308","-95.45085","-6","1"
+"77302","Conroe","TX","30.238563","-95.38927","-6","1"
+"77303","Conroe","TX","30.368543","-95.40217","-6","1"
+"77304","Conroe","TX","30.33146","-95.50703","-6","1"
+"77305","Conroe","TX","30.290638","-95.383202","-6","1"
+"77306","Conroe","TX","30.289893","-95.32698","-6","1"
+"77315","North Houston","TX","29.83399","-95.434241","-6","1"
+"77316","Montgomery","TX","30.329017","-95.64985","-6","1"
+"77318","Willis","TX","30.434486","-95.55009","-6","1"
+"77320","Huntsville","TX","30.805099","-95.50719","-6","1"
+"77325","Humble","TX","29.83399","-95.434241","-6","1"
+"77326","Ace","TX","30.519883","-94.81869","-6","1"
+"77327","Cleveland","TX","30.35469","-95.04514","-6","1"
+"77328","Cleveland","TX","30.188885","-94.804065","-6","1"
+"77331","Coldspring","TX","30.619313","-95.13802","-6","1"
+"77332","Dallardsville","TX","30.817866","-94.869052","-6","1"
+"77333","Dobbin","TX","30.353346","-95.77833","-6","1"
+"77334","Dodge","TX","30.758511","-95.3688","-6","1"
+"77335","Goodrich","TX","30.595651","-94.94597","-6","1"
+"77336","Huffman","TX","30.045495","-95.10714","-6","1"
+"77337","Hufsmith","TX","29.83399","-95.434241","-6","1"
+"77338","Humble","TX","30.005691","-95.28488","-6","1"
+"77339","Humble","TX","30.053368","-95.21807","-6","1"
+"77340","Huntsville","TX","30.680641","-95.50776","-6","1"
+"77341","Huntsville","TX","30.714476","-95.54977","-6","1"
+"77342","Huntsville","TX","30.78128","-95.59527","-6","1"
+"77343","Huntsville","TX","30.78128","-95.59527","-6","1"
+"77344","Huntsville","TX","30.78128","-95.59527","-6","1"
+"77345","Humble","TX","30.062436","-95.16945","-6","1"
+"77346","Humble","TX","30.001902","-95.16962","-6","1"
+"77347","Humble","TX","29.83399","-95.434241","-6","1"
+"77348","Huntsville","TX","30.78128","-95.59527","-6","1"
+"77349","Huntsville","TX","30.78128","-95.59527","-6","1"
+"77350","Leggett","TX","30.856814","-94.856052","-6","1"
+"77351","Livingston","TX","30.712538","-94.89915","-6","1"
+"77353","Magnolia","TX","30.180626","-95.70925","-6","1"
+"77354","Magnolia","TX","30.194267","-95.63918","-6","1"
+"77355","Magnolia","TX","30.158706","-95.74464","-6","1"
+"77356","Montgomery","TX","30.412229","-95.6529","-6","1"
+"77357","New Caney","TX","30.170751","-95.17832","-6","1"
+"77358","New Waverly","TX","30.545212","-95.46752","-6","1"
+"77359","Oakhurst","TX","30.735628","-95.30405","-6","1"
+"77360","Onalaska","TX","30.818886","-95.11108","-6","1"
+"77362","Pinehurst","TX","30.152265","-95.67556","-6","1"
+"77363","Plantersville","TX","30.281863","-95.85326","-6","1"
+"77364","Pointblank","TX","30.756728","-95.20485","-6","1"
+"77365","Porter","TX","30.102209","-95.25748","-6","1"
+"77367","Riverside","TX","30.848603","-95.39644","-6","1"
+"77368","Romayor","TX","30.453845","-94.83674","-6","1"
+"77369","Rye","TX","30.480319","-94.75643","-6","1"
+"77371","Shepherd","TX","30.488028","-94.99963","-6","1"
+"77372","Splendora","TX","30.220237","-95.16723","-6","1"
+"77373","Spring","TX","30.056394","-95.38961","-6","1"
+"77374","Thicket","TX","30.378705","-94.64906","-6","1"
+"77375","Tomball","TX","30.073775","-95.61882","-6","1"
+"77376","Votaw","TX","30.437704","-94.68614","-6","1"
+"77377","Tomball","TX","29.83399","-95.434241","-6","1"
+"77378","Willis","TX","30.439428","-95.44677","-6","1"
+"77379","Spring","TX","30.024749","-95.53215","-6","1"
+"77380","Spring","TX","30.143485","-95.46821","-6","1"
+"77381","Spring","TX","30.17873","-95.5021","-6","1"
+"77382","Spring","TX","30.214741","-95.53212","-6","1"
+"77383","Spring","TX","29.83399","-95.434241","-6","1"
+"77384","Conroe","TX","30.233865","-95.49679","-6","1"
+"77385","Conroe","TX","30.18771","-95.43893","-6","1"
+"77386","Spring","TX","30.128862","-95.41896","-6","1"
+"77387","Spring","TX","30.378446","-95.557004","-6","1"
+"77388","Spring","TX","30.055195","-95.46826","-6","1"
+"77389","Spring","TX","30.10824","-95.51716","-6","1"
+"77391","Spring","TX","29.83399","-95.434241","-6","1"
+"77393","Spring","TX","30.329016","-95.463474","-6","1"
+"77396","Humble","TX","29.951621","-95.26785","-6","1"
+"77399","Livingston","TX","30.817866","-94.869052","-6","1"
+"77401","Bellaire","TX","29.70403","-95.46099","-6","1"
+"77402","Bellaire","TX","29.83399","-95.434241","-6","1"
+"77404","Bay City","TX","28.798156","-95.651058","-6","1"
+"77406","Richmond","TX","29.50401","-95.919107","-6","1"
+"77410","Cypress","TX","29.83399","-95.434241","-6","1"
+"77411","Alief","TX","29.83399","-95.434241","-6","1"
+"77412","Altair","TX","29.575183","-96.46831","-6","1"
+"77413","Barker","TX","29.83399","-95.434241","-6","1"
+"77414","Bay City","TX","28.945269","-95.9357","-6","1"
+"77415","Cedar Lane","TX","28.936476","-95.72292","-6","1"
+"77417","Beasley","TX","29.483573","-95.93931","-6","1"
+"77418","Bellville","TX","29.983095","-96.26843","-6","1"
+"77419","Blessing","TX","28.872088","-96.2316","-6","1"
+"77420","Boling","TX","29.249812","-95.92241","-6","1"
+"77422","Brazoria","TX","29.011241","-95.58071","-6","1"
+"77423","Brookshire","TX","29.80038","-95.98452","-6","1"
+"77426","Chappell Hill","TX","30.132693","-96.25388","-6","1"
+"77428","Collegeport","TX","28.718954","-96.16969","-6","1"
+"77429","Cypress","TX","29.982746","-95.66597","-6","1"
+"77430","Damon","TX","29.290602","-95.70739","-6","1"
+"77431","Danciger","TX","29.173701","-95.820719","-6","1"
+"77432","Danevang","TX","29.064542","-96.21454","-6","1"
+"77433","Cypress","TX","29.884175","-95.72219","-6","1"
+"77434","Eagle Lake","TX","29.575458","-96.32079","-6","1"
+"77435","East Bernard","TX","29.520049","-96.08527","-6","1"
+"77436","Egypt","TX","29.375762","-96.227967","-6","1"
+"77437","El Campo","TX","29.197701","-96.2774","-6","1"
+"77439","San Leon","TX","29.487774","-94.951647","-6","1"
+"77440","Elmaton","TX","28.887522","-96.14826","-6","1"
+"77441","Fulshear","TX","29.685917","-95.91804","-6","1"
+"77442","Garwood","TX","29.424483","-96.45923","-6","1"
+"77443","Glen Flora","TX","29.346878","-96.19287","-6","1"
+"77444","Guy","TX","29.29995","-95.79753","-6","1"
+"77445","Hempstead","TX","30.096649","-96.06979","-6","1"
+"77446","Prairie View","TX","30.082131","-95.99178","-6","1"
+"77447","Hockley","TX","30.065152","-95.8144","-6","1"
+"77448","Hungerford","TX","29.401714","-96.07526","-6","1"
+"77449","Katy","TX","29.825908","-95.7301","-6","1"
+"77450","Katy","TX","29.758799","-95.74751","-6","1"
+"77451","Kendleton","TX","29.447947","-96.0007","-6","1"
+"77452","Kenney","TX","29.849283","-96.313271","-6","1"
+"77453","Lane City","TX","29.170387","-96.014159","-6","1"
+"77454","Lissie","TX","29.553544","-96.22224","-6","1"
+"77455","Louise","TX","29.095463","-96.40324","-6","1"
+"77456","Markham","TX","28.964146","-96.07346","-6","1"
+"77457","Matagorda","TX","28.67494","-95.9653","-6","1"
+"77458","Midfield","TX","28.939249","-96.2147","-6","1"
+"77459","Missouri City","TX","29.564347","-95.54762","-6","1"
+"77460","Nada","TX","29.60466","-96.524899","-6","1"
+"77461","Needville","TX","29.401461","-95.82334","-6","1"
+"77462","Newgulf","TX","29.298532","-96.241147","-6","1"
+"77463","Old Ocean","TX","29.135066","-95.78335","-6","1"
+"77464","Orchard","TX","29.602015","-95.96882","-6","1"
+"77465","Palacios","TX","28.735638","-96.22273","-6","1"
+"77466","Pattison","TX","29.818871","-95.99945","-6","1"
+"77467","Pierce","TX","29.238931","-96.1716","-6","1"
+"77468","Pledger","TX","29.177817","-95.89195","-6","1"
+"77469","Richmond","TX","29.584172","-95.747","-6","1"
+"77470","Rock Island","TX","29.520292","-96.57348","-6","1"
+"77471","Rosenberg","TX","29.549455","-95.81901","-6","1"
+"77473","San Felipe","TX","29.799608","-96.10123","-6","1"
+"77474","Sealy","TX","29.776375","-96.16474","-6","1"
+"77475","Sheridan","TX","29.488245","-96.65185","-6","1"
+"77476","Simonton","TX","29.686804","-95.99738","-6","1"
+"77477","Stafford","TX","29.626187","-95.57145","-6","1"
+"77478","Sugar Land","TX","29.627737","-95.62444","-6","1"
+"77479","Sugar Land","TX","29.573345","-95.63213","-6","1"
+"77480","Sweeny","TX","29.055954","-95.71344","-6","1"
+"77481","Thompsons","TX","29.478032","-95.58329","-6","1"
+"77482","Van Vleck","TX","29.035651","-95.89207","-6","1"
+"77483","Wadsworth","TX","28.83088","-95.93391","-6","1"
+"77484","Waller","TX","30.068888","-95.92499","-6","1"
+"77485","Wallis","TX","29.632221","-96.07144","-6","1"
+"77486","West Columbia","TX","29.152396","-95.66319","-6","1"
+"77487","Sugar Land","TX","29.525461","-95.756462","-6","1"
+"77488","Wharton","TX","29.307347","-96.09055","-6","1"
+"77489","Missouri City","TX","29.601141","-95.51772","-6","1"
+"77491","Katy","TX","29.83399","-95.434241","-6","1"
+"77492","Katy","TX","29.83399","-95.434241","-6","1"
+"77493","Katy","TX","29.810279","-95.82011","-6","1"
+"77494","Katy","TX","29.760833","-95.81104","-6","1"
+"77496","Sugar Land","TX","29.525461","-95.756462","-6","1"
+"77497","Stafford","TX","29.525461","-95.756462","-6","1"
+"77501","Pasadena","TX","29.83399","-95.434241","-6","1"
+"77502","Pasadena","TX","29.680079","-95.19966","-6","1"
+"77503","Pasadena","TX","29.695028","-95.15798","-6","1"
+"77504","Pasadena","TX","29.64878","-95.18813","-6","1"
+"77505","Pasadena","TX","29.650492","-95.14632","-6","1"
+"77506","Pasadena","TX","29.705678","-95.20216","-6","1"
+"77507","Pasadena","TX","29.624686","-95.06111","-6","1"
+"77508","Pasadena","TX","29.569927","-95.106637","-6","1"
+"77510","Santa Fe","TX","29.371171","-95.08552","-6","1"
+"77511","Alvin","TX","29.41148","-95.24475","-6","1"
+"77512","Alvin","TX","29.362879","-95.27605","-6","1"
+"77514","Anahuac","TX","29.689054","-94.66375","-6","1"
+"77515","Angleton","TX","29.16866","-95.44541","-6","1"
+"77516","Angleton","TX","29.183991","-95.465083","-6","1"
+"77517","Santa Fe","TX","29.382307","-95.12768","-6","1"
+"77518","Bacliff","TX","29.504389","-94.98779","-6","1"
+"77519","Batson","TX","30.249734","-94.60291","-6","1"
+"77520","Baytown","TX","29.74877","-94.94389","-6","1"
+"77521","Baytown","TX","29.784579","-94.97588","-6","1"
+"77522","Baytown","TX","29.83399","-95.434241","-6","1"
+"77530","Channelview","TX","29.786656","-95.12214","-6","1"
+"77531","Clute","TX","29.038068","-95.40114","-6","1"
+"77532","Crosby","TX","29.920121","-95.07327","-6","1"
+"77533","Daisetta","TX","30.112587","-94.64704","-6","1"
+"77534","Danbury","TX","29.226396","-95.33797","-6","1"
+"77535","Dayton","TX","30.044219","-94.88864","-6","1"
+"77536","Deer Park","TX","29.687657","-95.1201","-6","1"
+"77537","Dickinson","TX","29.469835","-95.005317","-6","1"
+"77538","Devers","TX","29.981421","-94.55067","-6","1"
+"77539","Dickinson","TX","29.468772","-95.02689","-6","1"
+"77541","Freeport","TX","28.975247","-95.34357","-6","1"
+"77542","Freeport","TX","29.183991","-95.465083","-6","1"
+"77545","Fresno","TX","29.526728","-95.45984","-6","1"
+"77546","Friendswood","TX","29.516873","-95.19472","-6","1"
+"77547","Galena Park","TX","29.737178","-95.23906","-6","1"
+"77549","Friendswood","TX","29.330501","-94.800238","-6","1"
+"77550","Galveston","TX","29.298448","-94.79316","-6","1"
+"77551","Galveston","TX","29.279937","-94.82683","-6","1"
+"77552","Galveston","TX","29.22051","-94.944391","-6","1"
+"77553","Galveston","TX","29.328547","-94.79422","-6","1"
+"77554","Galveston","TX","29.221289","-94.94455","-6","1"
+"77555","Galveston","TX","29.330501","-94.800238","-6","1"
+"77560","Hankamer","TX","29.860106","-94.58468","-6","1"
+"77561","Hardin","TX","30.154264","-94.72677","-6","1"
+"77562","Highlands","TX","29.81953","-95.05298","-6","1"
+"77563","Hitchcock","TX","29.339307","-95.00317","-6","1"
+"77564","Hull","TX","30.159698","-94.65504","-6","1"
+"77565","Kemah","TX","29.541285","-95.02996","-6","1"
+"77566","Lake Jackson","TX","29.036879","-95.44103","-6","1"
+"77567","League City","TX","29.545836","-95.041532","-6","1"
+"77568","La Marque","TX","29.366684","-94.97392","-6","1"
+"77571","La Porte","TX","29.666781","-95.04487","-6","1"
+"77572","La Porte","TX","29.83399","-95.434241","-6","1"
+"77573","League City","TX","29.502759","-95.08906","-6","1"
+"77574","League City","TX","29.511582","-95.058153","-6","1"
+"77575","Liberty","TX","30.066734","-94.76595","-6","1"
+"77577","Liverpool","TX","29.289673","-95.27709","-6","1"
+"77578","Manvel","TX","29.487395","-95.35807","-6","1"
+"77580","Mont Belvieu","TX","29.856137","-94.842939","-6","1"
+"77581","Pearland","TX","29.56218","-95.26982","-6","1"
+"77582","Raywood","TX","30.023932","-94.66678","-6","1"
+"77583","Rosharon","TX","29.429256","-95.45332","-6","1"
+"77584","Pearland","TX","29.543654","-95.34036","-6","1"
+"77585","Saratoga","TX","30.304796","-94.52727","-6","1"
+"77586","Seabrook","TX","29.576638","-95.03486","-6","1"
+"77587","South Houston","TX","29.66223","-95.23106","-6","1"
+"77588","Pearland","TX","29.512687","-95.254188","-6","1"
+"77590","Texas City","TX","29.395283","-94.91759","-6","1"
+"77591","Texas City","TX","29.389583","-94.99167","-6","1"
+"77592","Texas City","TX","29.330501","-94.800238","-6","1"
+"77593","League City","TX","29.506921","-95.111987","-6","1"
+"77597","Wallisville","TX","29.843158","-94.70376","-6","1"
+"77598","Webster","TX","29.539581","-95.13467","-6","1"
+"77611","Bridge City","TX","30.026093","-93.84071","-6","1"
+"77612","Buna","TX","30.433087","-93.96897","-6","1"
+"77613","China","TX","30.043401","-94.35853","-6","1"
+"77614","Deweyville","TX","30.293684","-93.74329","-6","1"
+"77615","Evadale","TX","30.316847","-94.07395","-6","1"
+"77616","Fred","TX","30.564151","-94.2076","-6","1"
+"77617","Gilchrist","TX","29.507243","-94.52028","-6","1"
+"77619","Groves","TX","29.947563","-93.91857","-6","1"
+"77622","Hamshire","TX","29.870794","-94.2896","-6","1"
+"77623","High Island","TX","29.571106","-94.4045","-6","1"
+"77624","Hillister","TX","30.664543","-94.30391","-6","1"
+"77625","Kountze","TX","30.372553","-94.33671","-6","1"
+"77626","Mauriceville","TX","30.203996","-93.886646","-6","1"
+"77627","Nederland","TX","29.974013","-93.99986","-6","1"
+"77629","Nome","TX","30.031927","-94.42374","-6","1"
+"77630","Orange","TX","30.089757","-93.77408","-6","1"
+"77631","Orange","TX","30.054793","-93.903108","-6","1"
+"77632","Orange","TX","30.182584","-93.79964","-6","1"
+"77633","Brenham","TX","30.158637","-96.407936","-6","1"
+"77639","Orangefield","TX","30.063101","-93.859903","-6","1"
+"77640","Port Arthur","TX","29.879796","-93.95575","-6","1"
+"77641","Port Arthur","TX","29.847569","-94.129733","-6","1"
+"77642","Port Arthur","TX","29.921564","-93.92694","-6","1"
+"77643","Port Arthur","TX","29.962144","-93.867932","-6","1"
+"77650","Port Bolivar","TX","29.43186","-94.68252","-6","1"
+"77651","Port Neches","TX","29.980863","-93.96038","-6","1"
+"77655","Sabine Pass","TX","29.732092","-93.90117","-6","1"
+"77656","Silsbee","TX","30.390569","-94.18056","-6","1"
+"77657","Lumberton","TX","30.240473","-94.20172","-6","1"
+"77659","Sour Lake","TX","30.150405","-94.41515","-6","1"
+"77660","Spurger","TX","30.635615","-94.1705","-6","1"
+"77661","Stowell","TX","29.780948","-94.390045","-6","1"
+"77662","Vidor","TX","30.142953","-94.00797","-6","1"
+"77663","Village Mills","TX","30.520625","-94.43631","-6","1"
+"77664","Warren","TX","30.600866","-94.40604","-6","1"
+"77665","Winnie","TX","29.820542","-94.39965","-6","1"
+"77670","Vidor","TX","30.054793","-93.903108","-6","1"
+"77701","Beaumont","TX","30.074112","-94.10358","-6","1"
+"77702","Beaumont","TX","30.085112","-94.12607","-6","1"
+"77703","Beaumont","TX","30.112312","-94.11736","-6","1"
+"77704","Beaumont","TX","30.12355","-94.153941","-6","1"
+"77705","Beaumont","TX","30.009609","-94.11401","-6","1"
+"77706","Beaumont","TX","30.092679","-94.16377","-6","1"
+"77707","Beaumont","TX","30.065029","-94.18031","-6","1"
+"77708","Beaumont","TX","30.141361","-94.16488","-6","1"
+"77709","Voth","TX","30.176361","-94.187683","-6","1"
+"77710","Beaumont","TX","29.847569","-94.129733","-6","1"
+"77713","Beaumont","TX","30.090135","-94.2467","-6","1"
+"77720","Beaumont","TX","29.847569","-94.129733","-6","1"
+"77725","Beaumont","TX","29.847569","-94.129733","-6","1"
+"77726","Beaumont","TX","30.111843","-94.190147","-6","1"
+"77735","Tomball","TX","30.095391","-95.628023","-6","1"
+"77801","Bryan","TX","30.637348","-96.36015","-6","1"
+"77802","Bryan","TX","30.655348","-96.34056","-6","1"
+"77803","Bryan","TX","30.678097","-96.37639","-6","1"
+"77805","Bryan","TX","30.65212","-96.341012","-6","1"
+"77806","Bryan","TX","30.65212","-96.341012","-6","1"
+"77807","Bryan","TX","30.68416","-96.46101","-6","1"
+"77808","Bryan","TX","30.762815","-96.31744","-6","1"
+"77830","Anderson","TX","30.536223","-96.0229","-6","1"
+"77831","Bedias","TX","30.74577","-95.91892","-6","1"
+"77833","Brenham","TX","30.183651","-96.40258","-6","1"
+"77834","Brenham","TX","30.231333","-96.290358","-6","1"
+"77835","Burton","TX","30.181677","-96.61373","-6","1"
+"77836","Caldwell","TX","30.517099","-96.67247","-6","1"
+"77837","Calvert","TX","30.993313","-96.6808","-6","1"
+"77838","Chriesman","TX","30.513118","-96.618047","-6","1"
+"77839","Clay","TX","30.341403","-96.526669","-6","1"
+"77840","College Station","TX","30.614647","-96.32641","-6","1"
+"77841","College Station","TX","30.57258","-96.327044","-6","1"
+"77842","College Station","TX","30.65212","-96.341012","-6","1"
+"77843","College Station","TX","30.65212","-96.341012","-6","1"
+"77844","College Station","TX","30.65212","-96.341012","-6","1"
+"77845","College Station","TX","30.571905","-96.29882","-6","1"
+"77850","Concord","TX","31.313816","-95.993482","-6","1"
+"77852","Deanville","TX","30.513118","-96.618047","-6","1"
+"77853","Dime Box","TX","30.3555","-96.85437","-6","1"
+"77855","Flynn","TX","31.134863","-96.11889","-6","1"
+"77856","Franklin","TX","31.049092","-96.44131","-6","1"
+"77857","Gause","TX","30.796177","-96.70685","-6","1"
+"77859","Hearne","TX","30.876658","-96.60205","-6","1"
+"77861","Iola","TX","30.752599","-96.09691","-6","1"
+"77862","Kurten","TX","30.65212","-96.341012","-6","1"
+"77863","Lyons","TX","30.359245","-96.591535","-6","1"
+"77864","Madisonville","TX","30.956147","-95.91606","-6","1"
+"77865","Marquez","TX","31.222211","-96.24043","-6","1"
+"77866","Millican","TX","30.466986","-96.20408","-6","1"
+"77867","Mumford","TX","30.748833","-96.57391","-6","1"
+"77868","Navasota","TX","30.374501","-96.07999","-6","1"
+"77869","Navasota","TX","30.65212","-96.341012","-6","1"
+"77870","New Baden","TX","31.050207","-96.42982","-6","1"
+"77871","Normangee","TX","31.058563","-96.15852","-6","1"
+"77872","North Zulch","TX","30.892212","-96.10346","-6","1"
+"77873","Richards","TX","30.56335","-95.8337","-6","1"
+"77874","Waller","TX","30.049881","-95.929015","-6","1"
+"77875","Roans Prairie","TX","30.607534","-95.957945","-6","1"
+"77876","Shiro","TX","30.647831","-95.83191","-6","1"
+"77878","Snook","TX","30.490162","-96.4698","-6","1"
+"77879","Somerville","TX","30.368922","-96.52359","-6","1"
+"77880","Washington","TX","30.281022","-96.16922","-6","1"
+"77881","Wellborn","TX","30.65212","-96.341012","-6","1"
+"77882","Wheelock","TX","30.896204","-96.40959","-6","1"
+"77889","Sienna Plantation","TX","29.472186","-95.483489","-6","1"
+"77901","Victoria","TX","28.806417","-96.99356","-6","1"
+"77902","Victoria","TX","28.925513","-97.100624","-6","1"
+"77903","Victoria","TX","28.794935","-96.974119","-6","1"
+"77904","Victoria","TX","28.873664","-97.00715","-6","1"
+"77905","Victoria","TX","28.737085","-97.0146","-6","1"
+"77950","Austwell","TX","28.390776","-96.84723","-6","1"
+"77951","Bloomington","TX","28.642875","-96.89172","-6","1"
+"77954","Cuero","TX","29.09649","-97.28798","-6","1"
+"77957","Edna","TX","28.966755","-96.65939","-6","1"
+"77960","Fannin","TX","28.694847","-97.24182","-6","1"
+"77961","Francitas","TX","28.861398","-96.34404","-6","1"
+"77962","Ganado","TX","29.02864","-96.50513","-6","1"
+"77963","Goliad","TX","28.685027","-97.40221","-6","1"
+"77964","Hallettsville","TX","29.369619","-96.86644","-6","1"
+"77965","Hallettsville","TX","29.444297","-96.952091","-6","1"
+"77967","Hochheim","TX","29.098894","-97.365742","-6","1"
+"77968","Inez","TX","28.888476","-96.82316","-6","1"
+"77969","La Salle","TX","28.77203","-96.63732","-6","1"
+"77970","La Ward","TX","28.865213","-96.4397","-6","1"
+"77971","Lolita","TX","28.853152","-96.52727","-6","1"
+"77972","Long Mott","TX","28.525453","-96.694818","-6","1"
+"77973","Mcfaddin","TX","28.532052","-96.9902","-6","1"
+"77974","Meyersville","TX","28.897693","-97.29589","-6","1"
+"77975","Moulton","TX","29.57449","-97.12675","-6","1"
+"77976","Nursery","TX","28.954273","-97.090604","-6","1"
+"77977","Placedo","TX","28.691718","-96.82657","-6","1"
+"77978","Point Comfort","TX","28.672399","-96.55725","-6","1"
+"77979","Port Lavaca","TX","28.604717","-96.63023","-6","1"
+"77982","Port O Connor","TX","28.430193","-96.4417","-6","1"
+"77983","Seadrift","TX","28.405373","-96.70325","-6","1"
+"77984","Shiner","TX","29.442934","-97.18691","-6","1"
+"77985","Speaks","TX","29.347975","-96.900331","-6","1"
+"77986","Sublime","TX","29.487564","-96.794605","-6","1"
+"77987","Sweet Home","TX","29.347975","-96.900331","-6","1"
+"77988","Telferner","TX","28.846861","-96.88966","-6","1"
+"77989","Thomaston","TX","28.997449","-97.153868","-6","1"
+"77990","Tivoli","TX","28.459757","-96.88598","-6","1"
+"77991","Vanderbilt","TX","28.82037","-96.61273","-6","1"
+"77993","Weesatche","TX","28.835825","-97.444155","-6","1"
+"77994","Westhoff","TX","29.195217","-97.47799","-6","1"
+"77995","Yoakum","TX","29.254632","-97.13046","-6","1"
+"77999","Texas City","TX","29.495537","-94.961797","-6","1"
+"78001","Artesia Wells","TX","28.265415","-99.2821","-6","1"
+"78002","Atascosa","TX","29.288108","-98.72878","-6","1"
+"78003","Bandera","TX","29.718152","-99.06605","-6","1"
+"78004","Bergheim","TX","29.903508","-98.55789","-6","1"
+"78005","Bigfoot","TX","28.976757","-98.84426","-6","1"
+"78006","Boerne","TX","29.851666","-98.72932","-6","1"
+"78007","Calliham","TX","28.453052","-98.37384","-6","1"
+"78008","Campbellton","TX","28.759107","-98.2173","-6","1"
+"78009","Castroville","TX","29.356455","-98.88062","-6","1"
+"78010","Center Point","TX","29.944906","-99.0559","-6","1"
+"78011","Charlotte","TX","28.795637","-98.71951","-6","1"
+"78012","Christine","TX","28.790841","-98.496","-6","1"
+"78013","Comfort","TX","29.972473","-98.91084","-6","1"
+"78014","Cotulla","TX","28.43544","-99.21676","-6","1"
+"78015","Boerne","TX","29.743603","-98.64854","-6","1"
+"78016","Devine","TX","29.158899","-98.933","-6","1"
+"78017","Dilley","TX","28.728991","-99.23388","-6","1"
+"78019","Encinal","TX","28.062471","-99.4289","-6","1"
+"78021","Fowlerton","TX","28.52856","-98.80845","-6","1"
+"78022","George West","TX","28.260148","-98.14978","-6","1"
+"78023","Helotes","TX","29.61403","-98.74185","-6","1"
+"78024","Hunt","TX","30.055926","-99.42213","-6","1"
+"78025","Ingram","TX","30.102854","-99.27685","-6","1"
+"78026","Jourdanton","TX","28.85458","-98.5528","-6","1"
+"78027","Kendalia","TX","30.002501","-98.57124","-6","1"
+"78028","Kerrville","TX","30.042529","-99.15152","-6","1"
+"78029","Kerrville","TX","30.033226","-99.140974","-6","1"
+"78039","La Coste","TX","29.312661","-98.81591","-6","1"
+"78040","Laredo","TX","27.514845","-99.49991","-6","1"
+"78041","Laredo","TX","27.542244","-99.49233","-6","1"
+"78042","Laredo","TX","27.565464","-99.476792","-6","1"
+"78043","Laredo","TX","27.538658","-99.38274","-6","1"
+"78044","Laredo","TX","27.363738","-99.481919","-6","1"
+"78045","Laredo","TX","27.648832","-99.53371","-6","1"
+"78046","Laredo","TX","27.435814","-99.45996","-6","1"
+"78047","Laredo","TX","27.564249","-99.471719","-6","1"
+"78049","Laredo","TX","27.732094","-99.505138","-6","1"
+"78050","Leming","TX","29.072689","-98.48916","-6","1"
+"78052","Lytle","TX","29.227628","-98.79895","-6","1"
+"78053","McCoy","TX","28.906103","-98.2802","-6","1"
+"78054","Macdona","TX","29.325602","-98.732187","-6","1"
+"78055","Medina","TX","29.833279","-99.32589","-6","1"
+"78056","Mico","TX","29.54825","-98.90353","-6","1"
+"78057","Moore","TX","29.047934","-99.0416","-6","1"
+"78058","Mountain Home","TX","30.070414","-99.69191","-6","1"
+"78059","Natalia","TX","29.19085","-98.84676","-6","1"
+"78060","Oakville","TX","28.421814","-98.071902","-6","1"
+"78061","Pearsall","TX","28.888468","-99.09005","-6","1"
+"78062","Peggy","TX","28.919999","-98.552942","-6","1"
+"78063","Pipe Creek","TX","29.641551","-98.93407","-6","1"
+"78064","Pleasanton","TX","28.958803","-98.4639","-6","1"
+"78065","Poteet","TX","29.057172","-98.58398","-6","1"
+"78066","Rio Medina","TX","29.466279","-98.89162","-6","1"
+"78067","San Ygnacio","TX","27.198571","-99.36781","-6","1"
+"78069","Somerset","TX","29.200169","-98.67235","-6","1"
+"78070","Spring Branch","TX","29.898176","-98.40135","-6","1"
+"78071","Three Rivers","TX","28.492487","-98.1764","-6","1"
+"78072","Tilden","TX","28.314027","-98.49899","-6","1"
+"78073","Von Ormy","TX","29.227135","-98.60919","-6","1"
+"78074","Waring","TX","29.950969","-98.79093","-6","1"
+"78075","Whitsett","TX","28.633209","-98.27924","-6","1"
+"78076","Zapata","TX","26.9052","-99.21863","-6","1"
+"78081","Judsonia","AR","29.542778","-98.20799","-6","1"
+"78093","Laredo","TX","27.492996","-99.463668","-6","1"
+"78101","Adkins","TX","29.326804","-98.21887","-6","1"
+"78102","Beeville","TX","28.426202","-97.74806","-6","1"
+"78104","Beeville","TX","28.393116","-97.776017","-6","1"
+"78107","Berclair","TX","28.53232","-97.5888","-6","1"
+"78108","Cibolo","TX","29.574127","-98.23308","-6","1"
+"78109","Converse","TX","29.50198","-98.30582","-6","1"
+"78111","Ecleto","TX","28.944864","-97.882815","-6","1"
+"78112","Elmendorf","TX","29.221682","-98.36902","-6","1"
+"78113","Falls City","TX","28.972553","-98.06964","-6","1"
+"78114","Floresville","TX","29.150937","-98.17929","-6","1"
+"78115","Geronimo","TX","29.54508","-98.040833","-6","1"
+"78116","Gillett","TX","29.112202","-97.78275","-6","1"
+"78117","Hobson","TX","28.956196","-97.95012","-6","1"
+"78118","Karnes City","TX","28.894382","-97.90102","-6","1"
+"78119","Kenedy","TX","28.779344","-97.85626","-6","1"
+"78121","La Vernia","TX","29.351202","-98.11528","-6","1"
+"78122","Leesville","TX","29.425729","-97.7365","-6","1"
+"78123","McQueeney","TX","29.598103","-98.04346","-6","1"
+"78124","Marion","TX","29.570379","-98.14606","-6","1"
+"78125","Mineral","TX","28.535247","-97.93937","-6","1"
+"78126","San Antonio","TX","29.55302","-98.486871","-6","1"
+"78130","New Braunfels","TX","29.699844","-98.10754","-6","1"
+"78131","New Braunfels","TX","29.79918","-98.338419","-6","1"
+"78132","New Braunfels","TX","29.749204","-98.17653","-6","1"
+"78133","Canyon Lake","TX","29.883884","-98.25219","-6","1"
+"78134","New Braunfels","TX","29.687579","-98.120104","-6","1"
+"78135","New Braunfels","TX","29.738502","-98.087157","-6","1"
+"78136","McQueeney","TX","29.619401","-98.060419","-6","1"
+"78140","Nixon","TX","29.292655","-97.76167","-6","1"
+"78141","Nordheim","TX","28.919157","-97.61607","-6","1"
+"78142","Normanna","TX","28.52604","-97.78256","-6","1"
+"78143","Pandora","TX","29.248705","-97.84412","-6","1"
+"78144","Panna Maria","TX","28.954252","-97.89674","-6","1"
+"78145","Pawnee","TX","28.650728","-98.00056","-6","1"
+"78146","Pettus","TX","28.615464","-97.81591","-6","1"
+"78147","Poth","TX","29.072412","-98.07786","-6","1"
+"78148","Universal City","TX","29.550223","-98.29936","-6","1"
+"78150","Universal City","TX","29.437532","-98.461582","-6","1"
+"78151","Runge","TX","28.878902","-97.71427","-6","1"
+"78152","Saint Hedwig","TX","29.432262","-98.20151","-6","1"
+"78154","Schertz","TX","29.577359","-98.2787","-6","1"
+"78155","Seguin","TX","29.56478","-97.96283","-6","1"
+"78156","Seguin","TX","29.611797","-97.971208","-6","1"
+"78159","Smiley","TX","29.269305","-97.60044","-6","1"
+"78160","Stockdale","TX","29.237074","-97.95439","-6","1"
+"78161","Sutherland Springs","TX","29.273819","-98.05424","-6","1"
+"78162","Tuleta","TX","28.424535","-97.732736","-6","1"
+"78163","Bulverde","TX","29.758619","-98.44199","-6","1"
+"78164","Yorktown","TX","28.988817","-97.51773","-6","1"
+"78201","San Antonio","TX","29.466781","-98.52519","-6","1"
+"78202","San Antonio","TX","29.428132","-98.46279","-6","1"
+"78203","San Antonio","TX","29.414983","-98.46239","-6","1"
+"78204","San Antonio","TX","29.403583","-98.5063","-6","1"
+"78205","San Antonio","TX","29.425932","-98.48931","-6","1"
+"78206","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78207","San Antonio","TX","29.423932","-98.5235","-6","1"
+"78208","San Antonio","TX","29.439832","-98.45879","-6","1"
+"78209","San Antonio","TX","29.48618","-98.4568","-6","1"
+"78210","San Antonio","TX","29.397934","-98.46669","-6","1"
+"78211","San Antonio","TX","29.362185","-98.54644","-6","1"
+"78212","San Antonio","TX","29.460381","-98.49649","-6","1"
+"78213","San Antonio","TX","29.510562","-98.52203","-6","1"
+"78214","San Antonio","TX","29.363335","-98.49049","-6","1"
+"78215","San Antonio","TX","29.438032","-98.48114","-6","1"
+"78216","San Antonio","TX","29.528515","-98.49219","-6","1"
+"78217","San Antonio","TX","29.543865","-98.41755","-6","1"
+"78218","San Antonio","TX","29.49428","-98.40431","-6","1"
+"78219","San Antonio","TX","29.448379","-98.39908","-6","1"
+"78220","San Antonio","TX","29.411583","-98.41833","-6","1"
+"78221","San Antonio","TX","29.326586","-98.50217","-6","1"
+"78222","San Antonio","TX","29.379902","-98.38926","-6","1"
+"78223","San Antonio","TX","29.352352","-98.43215","-6","1"
+"78224","San Antonio","TX","29.333436","-98.53934","-6","1"
+"78225","San Antonio","TX","29.387734","-98.52492","-6","1"
+"78226","San Antonio","TX","29.392167","-98.55468","-6","1"
+"78227","San Antonio","TX","29.405424","-98.63832","-6","1"
+"78228","San Antonio","TX","29.457281","-98.5665","-6","1"
+"78229","San Antonio","TX","29.499454","-98.57166","-6","1"
+"78230","San Antonio","TX","29.539562","-98.55253","-6","1"
+"78231","San Antonio","TX","29.574677","-98.53946","-6","1"
+"78232","San Antonio","TX","29.584698","-98.46987","-6","1"
+"78233","San Antonio","TX","29.552128","-98.36775","-6","1"
+"78234","San Antonio","TX","29.457389","-98.45537","-6","1"
+"78235","San Antonio","TX","29.33906","-98.42793","-6","1"
+"78236","San Antonio","TX","29.389767","-98.61251","-6","1"
+"78237","San Antonio","TX","29.422583","-98.56584","-6","1"
+"78238","San Antonio","TX","29.479874","-98.61509","-6","1"
+"78239","San Antonio","TX","29.51613","-98.36161","-6","1"
+"78240","San Antonio","TX","29.518413","-98.60869","-6","1"
+"78241","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78242","San Antonio","TX","29.353735","-98.61423","-6","1"
+"78243","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78244","San Antonio","TX","29.475598","-98.35434","-6","1"
+"78245","San Antonio","TX","29.412338","-98.70484","-6","1"
+"78246","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78247","San Antonio","TX","29.581304","-98.40889","-6","1"
+"78248","San Antonio","TX","29.589826","-98.52524","-6","1"
+"78249","San Antonio","TX","29.569934","-98.61282","-6","1"
+"78250","San Antonio","TX","29.510204","-98.66784","-6","1"
+"78251","San Antonio","TX","29.466061","-98.67004","-6","1"
+"78252","San Antonio","TX","29.335577","-98.70173","-6","1"
+"78253","San Antonio","TX","29.461353","-98.75976","-6","1"
+"78254","San Antonio","TX","29.523294","-98.74504","-6","1"
+"78255","San Antonio","TX","29.665822","-98.66812","-6","1"
+"78256","San Antonio","TX","29.623533","-98.62493","-6","1"
+"78257","San Antonio","TX","29.646618","-98.6099","-6","1"
+"78258","San Antonio","TX","29.649797","-98.50406","-6","1"
+"78259","San Antonio","TX","29.627332","-98.42781","-6","1"
+"78260","San Antonio","TX","29.707273","-98.47969","-6","1"
+"78261","San Antonio","TX","29.698045","-98.42624","-6","1"
+"78262","San Antonio","TX","29.449332","-98.290394","-6","1"
+"78263","San Antonio","TX","29.358153","-98.31978","-6","1"
+"78264","San Antonio","TX","29.193828","-98.51795","-6","1"
+"78265","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78266","San Antonio","TX","29.641132","-98.30856","-6","1"
+"78268","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78269","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78270","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78275","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78278","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78279","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78280","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78283","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78284","San Antonio","TX","29.442632","-98.491344","-6","1"
+"78285","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78286","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78287","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78288","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78289","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78291","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78292","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78293","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78294","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78295","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78296","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78297","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78298","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78299","San Antonio","TX","29.437532","-98.461582","-6","1"
+"78301","McAllen","TX","26.200001","-98.231166","-6","1"
+"78330","Agua Dulce","TX","27.782267","-97.90134","-6","1"
+"78331","Alice","TX","27.750684","-98.082694","-6","1"
+"78332","Alice","TX","27.737965","-98.09302","-6","1"
+"78333","Alice","TX","27.659473","-98.012331","-6","1"
+"78335","Aransas Pass","TX","27.912454","-97.188437","-6","1"
+"78336","Aransas Pass","TX","27.915764","-97.15436","-6","1"
+"78337","Rancho Alegre","TX","27.738511","-98.098534","-6","1"
+"78338","Armstrong","TX","26.870238","-97.77433","-6","1"
+"78339","Banquete","TX","27.807025","-97.79801","-6","1"
+"78340","Bayside","TX","28.103283","-97.20757","-6","1"
+"78341","Benavides","TX","27.592468","-98.414188","-6","1"
+"78342","Ben Bolt","TX","27.659473","-98.012331","-6","1"
+"78343","Bishop","TX","27.60549","-97.78572","-6","1"
+"78344","Bruni","TX","27.43254","-98.81271","-6","1"
+"78347","Chapman Ranch","TX","27.593816","-97.46214","-6","1"
+"78349","Concepcion","TX","27.316167","-98.29797","-6","1"
+"78350","Dinero","TX","28.421814","-98.071902","-6","1"
+"78351","Driscoll","TX","27.672549","-97.75105","-6","1"
+"78352","Edroy","TX","27.973465","-97.68169","-6","1"
+"78353","Encino","TX","26.894094","-98.21561","-6","1"
+"78355","Falfurrias","TX","27.217893","-98.16479","-6","1"
+"78357","Freer","TX","27.939823","-98.57624","-6","1"
+"78358","Fulton","TX","28.065865","-97.04066","-6","1"
+"78359","Gregory","TX","27.920604","-97.29248","-6","1"
+"78360","Guerra","TX","27.071318","-98.686327","-6","1"
+"78361","Hebbronville","TX","27.17199","-98.73083","-6","1"
+"78362","Ingleside","TX","27.866143","-97.20712","-6","1"
+"78363","Kingsville","TX","27.496472","-97.86808","-6","1"
+"78364","Kingsville","TX","27.342872","-97.70355","-6","1"
+"78368","Mathis","TX","28.101323","-97.82968","-6","1"
+"78369","Mirando City","TX","27.44333","-98.99944","-6","1"
+"78370","Odem","TX","27.955312","-97.59288","-6","1"
+"78371","Oilton","TX","27.467237","-98.97431","-6","1"
+"78372","Orange Grove","TX","27.963592","-98.07031","-6","1"
+"78373","Port Aransas","TX","27.818477","-97.07998","-6","1"
+"78374","Portland","TX","27.884565","-97.32054","-6","1"
+"78375","Premont","TX","27.368433","-98.12184","-6","1"
+"78376","Realitos","TX","27.363706","-98.56442","-6","1"
+"78377","Refugio","TX","28.327234","-97.24787","-6","1"
+"78379","Riviera","TX","27.299073","-97.78433","-6","1"
+"78380","Robstown","TX","27.782255","-97.68609","-6","1"
+"78381","Rockport","TX","28.013108","-97.09364","-6","1"
+"78382","Rockport","TX","28.047744","-97.04818","-6","1"
+"78383","Sandia","TX","28.066598","-97.92891","-6","1"
+"78384","San Diego","TX","27.683506","-98.38142","-6","1"
+"78385","Sarita","TX","27.17914","-97.82511","-6","1"
+"78387","Sinton","TX","28.054995","-97.5133","-6","1"
+"78389","Skidmore","TX","28.237359","-97.69331","-6","1"
+"78390","Taft","TX","27.977641","-97.37032","-6","1"
+"78391","Tynan","TX","28.169309","-97.75404","-6","1"
+"78393","Woodsboro","TX","28.206223","-97.30778","-6","1"
+"78401","Corpus Christi","TX","27.795805","-97.40019","-6","1"
+"78402","Corpus Christi","TX","27.829732","-97.4016","-6","1"
+"78403","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78404","Corpus Christi","TX","27.770056","-97.4001","-6","1"
+"78405","Corpus Christi","TX","27.777922","-97.42695","-6","1"
+"78406","Corpus Christi","TX","27.776304","-97.51253","-6","1"
+"78407","Corpus Christi","TX","27.802404","-97.42599","-6","1"
+"78408","Corpus Christi","TX","27.796171","-97.43796","-6","1"
+"78409","Corpus Christi","TX","27.806753","-97.50971","-6","1"
+"78410","Corpus Christi","TX","27.846568","-97.59435","-6","1"
+"78411","Corpus Christi","TX","27.733058","-97.38542","-6","1"
+"78412","Corpus Christi","TX","27.709309","-97.35225","-6","1"
+"78413","Corpus Christi","TX","27.687792","-97.40165","-6","1"
+"78414","Corpus Christi","TX","27.672334","-97.37051","-6","1"
+"78415","Corpus Christi","TX","27.727083","-97.4289","-6","1"
+"78416","Corpus Christi","TX","27.752356","-97.43465","-6","1"
+"78417","Corpus Christi","TX","27.729855","-97.44503","-6","1"
+"78418","Corpus Christi","TX","27.633433","-97.26792","-6","1"
+"78419","Corpus Christi","TX","27.723611","-97.380884","-6","1"
+"78426","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78427","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78460","Corpus Christi","TX","27.889868","-97.879743","-6","1"
+"78461","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78463","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78465","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78466","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78467","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78468","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78469","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78470","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78471","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78472","Corpus Christi","TX","27.740225","-97.579207","-6","1"
+"78473","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78474","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78475","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78476","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78477","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78478","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78480","Corpus Christi","TX","27.777","-97.463213","-6","1"
+"78501","Mcallen","TX","26.213105","-98.23579","-6","1"
+"78502","Mcallen","TX","26.25671","-98.198929","-6","1"
+"78503","Mcallen","TX","26.172018","-98.25042","-6","1"
+"78504","Mcallen","TX","26.26273","-98.23082","-6","1"
+"78505","Mcallen","TX","26.409709","-98.224206","-6","1"
+"78512","Mission","TX","26.232613","-98.348534","-6","1"
+"78516","Alamo","TX","26.175021","-98.11969","-6","1"
+"78520","Brownsville","TX","25.928274","-97.51618","-6","1"
+"78521","Brownsville","TX","25.918758","-97.42739","-6","1"
+"78522","Brownsville","TX","26.188911","-97.764271","-6","1"
+"78523","Brownsville","TX","25.981006","-97.520941","-6","1"
+"78526","Brownsville","TX","25.969007","-97.47211","-6","1"
+"78535","Combes","TX","26.245051","-97.74157","-6","1"
+"78536","Delmita","TX","26.421394","-98.848757","-6","1"
+"78537","Donna","TX","26.165352","-98.05568","-6","1"
+"78538","Edcouch","TX","26.344688","-97.96961","-6","1"
+"78539","Edinburg","TX","26.344128","-98.18011","-6","1"
+"78540","Edinburg","TX","26.319405","-98.190922","-6","1"
+"78541","Edinburg","TX","26.319427","-98.154881","-6","1"
+"78543","Elsa","TX","26.298611","-97.99464","-6","1"
+"78545","Falcon Heights","TX","26.561861","-99.13392","-6","1"
+"78547","Garciasville","TX","26.321652","-98.69525","-6","1"
+"78548","Grulla","TX","26.270824","-98.64891","-6","1"
+"78549","Hargill","TX","26.44489","-98.01478","-6","1"
+"78550","Harlingen","TX","26.206602","-97.68776","-6","1"
+"78551","Harlingen","TX","26.244651","-97.720569","-6","1"
+"78552","Harlingen","TX","26.195591","-97.75321","-6","1"
+"78553","Harlingen","TX","26.125242","-97.475663","-6","1"
+"78555","McAllen","TX","26.250709","-97.711367","-6","1"
+"78557","Hidalgo","TX","26.105725","-98.24639","-6","1"
+"78558","La Blanca","TX","26.305113","-98.03375","-6","1"
+"78559","La Feria","TX","26.149453","-97.82923","-6","1"
+"78560","La Joya","TX","26.244317","-98.49574","-6","1"
+"78561","Lasara","TX","26.561287","-97.429952","-6","1"
+"78562","La Villa","TX","26.301385","-97.92547","-6","1"
+"78563","Linn","TX","26.633158","-98.21578","-6","1"
+"78564","Lopeno","TX","26.945418","-99.203985","-6","1"
+"78565","Los Ebanos","TX","26.247488","-98.55962","-6","1"
+"78566","Los Fresnos","TX","26.099562","-97.43927","-6","1"
+"78567","Los Indios","TX","26.041669","-97.693736","-6","1"
+"78568","Lozano","TX","26.190402","-97.542263","-6","1"
+"78569","Lyford","TX","26.39381","-97.7113","-6","1"
+"78570","Mercedes","TX","26.169728","-97.91232","-6","1"
+"78571","Salado","TX","30.916863","-97.485039","-6","1"
+"78572","Mission","TX","26.234417","-98.34205","-6","1"
+"78573","Mission","TX","26.409709","-98.224206","-6","1"
+"78574","Sebastian","TX","26.244013","-98.31176","-6","1"
+"78575","Olmito","TX","26.023905","-97.54457","-6","1"
+"78576","Penitas","TX","26.24901","-98.45014","-6","1"
+"78577","Pharr","TX","26.201284","-98.18619","-6","1"
+"78578","Port Isabel","TX","26.080434","-97.25024","-6","1"
+"78579","Progreso","TX","26.087777","-97.9719","-6","1"
+"78580","Raymondville","TX","26.500175","-97.81013","-6","1"
+"78582","Rio Grande City","TX","26.445982","-98.69332","-6","1"
+"78583","Rio Hondo","TX","26.259032","-97.52948","-6","1"
+"78584","Roma","TX","26.493058","-99.00718","-6","1"
+"78585","Salineno","TX","26.510436","-98.746365","-6","1"
+"78586","San Benito","TX","26.111261","-97.63519","-6","1"
+"78587","La Victoria","TX","26.316452","-98.639793","-6","1"
+"78588","San Isidro","TX","26.720155","-98.46845","-6","1"
+"78589","San Juan","TX","26.190444","-98.15301","-6","1"
+"78590","San Perlita","TX","26.455519","-97.585805","-6","1"
+"78591","Santa Elena","TX","26.749896","-98.583016","-6","1"
+"78592","Santa Maria","TX","26.078355","-97.84169","-6","1"
+"78593","Santa Rosa","TX","26.27109","-97.82904","-6","1"
+"78594","Sebastian","TX","26.344765","-97.80031","-6","1"
+"78595","Sullivan City","TX","26.272363","-98.5587","-6","1"
+"78596","Weslaco","TX","26.162609","-97.98512","-6","1"
+"78597","South Padre Island","TX","26.117636","-97.17019","-6","1"
+"78598","Port Mansfield","TX","26.558995","-97.42738","-6","1"
+"78599","Weslaco","TX","26.409709","-98.224206","-6","1"
+"78602","Bastrop","TX","30.120443","-97.30991","-6","1"
+"78603","Bebe","TX","29.447211","-97.494649","-6","1"
+"78604","Belmont","TX","29.447211","-97.494649","-6","1"
+"78605","Bertram","TX","30.760216","-98.03579","-6","1"
+"78606","Blanco","TX","30.096855","-98.43411","-6","1"
+"78607","Bluffton","TX","30.833543","-98.47938","-6","1"
+"78608","Briggs","TX","30.9306","-97.90929","-6","1"
+"78609","Buchanan Dam","TX","30.744225","-98.43167","-6","1"
+"78610","Buda","TX","30.07703","-97.8178","-6","1"
+"78611","Burnet","TX","30.767327","-98.30109","-6","1"
+"78612","Cedar Creek","TX","30.130116","-97.49055","-6","1"
+"78613","Cedar Park","TX","30.501272","-97.83087","-6","1"
+"78614","Cost","TX","29.406434","-97.5869","-6","1"
+"78615","Coupland","TX","30.460373","-97.3935","-6","1"
+"78616","Dale","TX","29.928764","-97.56317","-6","1"
+"78617","Del Valle","TX","30.166225","-97.62496","-6","1"
+"78618","Doss","TX","30.486818","-99.17526","-6","1"
+"78619","Driftwood","TX","30.103644","-98.03875","-6","1"
+"78620","Dripping Springs","TX","30.24108","-98.10753","-6","1"
+"78621","Elgin","TX","30.338279","-97.36611","-6","1"
+"78622","Fentress","TX","29.760052","-97.77727","-6","1"
+"78623","Fischer","TX","29.960139","-98.21846","-6","1"
+"78624","Fredericksburg","TX","30.279267","-98.88389","-6","1"
+"78626","Georgetown","TX","30.643058","-97.64713","-6","1"
+"78627","Georgetown","TX","30.673597","-97.646143","-6","1"
+"78628","Georgetown","TX","30.674349","-97.72338","-6","1"
+"78629","Gonzales","TX","29.510439","-97.45352","-6","1"
+"78630","Cedar Park","TX","30.656817","-97.602552","-6","1"
+"78631","Harper","TX","30.334152","-99.2956","-6","1"
+"78632","Harwood","TX","29.698718","-97.45739","-6","1"
+"78634","Hutto","TX","30.540874","-97.54611","-6","1"
+"78635","Hye","TX","30.217838","-98.53788","-6","1"
+"78636","Johnson City","TX","30.286655","-98.39837","-6","1"
+"78638","Kingsbury","TX","29.655639","-97.77219","-6","1"
+"78639","Kingsland","TX","30.663209","-98.44588","-6","1"
+"78640","Kyle","TX","29.996916","-97.84756","-6","1"
+"78641","Leander","TX","30.547001","-97.87006","-6","1"
+"78642","Liberty Hill","TX","30.702882","-97.9269","-6","1"
+"78643","Llano","TX","30.721302","-98.66557","-6","1"
+"78644","Lockhart","TX","29.872165","-97.68093","-6","1"
+"78645","Leander","TX","30.453776","-97.97507","-6","1"
+"78646","Leander","TX","30.656817","-97.602552","-6","1"
+"78648","Luling","TX","29.694257","-97.6533","-6","1"
+"78650","McDade","TX","30.283941","-97.23563","-6","1"
+"78651","McNeil","TX","30.326374","-97.771258","-6","1"
+"78652","Manchaca","TX","30.12848","-97.8438","-6","1"
+"78653","Manor","TX","30.351225","-97.54731","-6","1"
+"78654","Marble Falls","TX","30.566681","-98.30756","-6","1"
+"78655","Martindale","TX","29.838163","-97.84178","-6","1"
+"78656","Maxwell","TX","29.887939","-97.83613","-6","1"
+"78657","Marble Falls","TX","30.538867","-98.36511","-6","1"
+"78658","Ottine","TX","29.592212","-97.58922","-6","1"
+"78659","Paige","TX","30.210685","-97.11662","-6","1"
+"78660","Pflugerville","TX","30.450122","-97.623","-6","1"
+"78661","Prairie Lea","TX","29.72057","-97.73519","-6","1"
+"78662","Red Rock","TX","29.950887","-97.42728","-6","1"
+"78663","Round Mountain","TX","30.44858","-98.38421","-6","1"
+"78664","Round Rock","TX","30.514401","-97.65549","-6","1"
+"78665","Sandy","TX","30.219829","-98.358613","-6","1"
+"78666","San Marcos","TX","29.876944","-97.94668","-6","1"
+"78667","San Marcos","TX","30.054378","-98.003574","-6","1"
+"78669","Spicewood","TX","30.427733","-98.08062","-6","1"
+"78670","Staples","TX","29.777564","-97.81966","-6","1"
+"78671","Stonewall","TX","30.230188","-98.62152","-6","1"
+"78672","Tow","TX","30.864936","-98.45361","-6","1"
+"78673","Walburg","TX","30.741495","-97.589147","-6","1"
+"78674","Weir","TX","30.674667","-97.59286","-6","1"
+"78675","Willow City","TX","30.460464","-98.71911","-6","1"
+"78676","Wimberley","TX","30.022492","-98.13294","-6","1"
+"78677","Wrightsboro","TX","29.447211","-97.494649","-6","1"
+"78680","Round Rock","TX","30.656817","-97.602552","-6","1"
+"78681","Round Rock","TX","30.518975","-97.71439","-6","1"
+"78682","Round Rock","TX","30.656817","-97.602552","-6","1"
+"78683","Round Rock","TX","30.656817","-97.602552","-6","1"
+"78691","Pflugerville","TX","30.326374","-97.771258","-6","1"
+"78701","Austin","TX","30.27127","-97.74103","-6","1"
+"78702","Austin","TX","30.265158","-97.71879","-6","1"
+"78703","Austin","TX","30.290907","-97.76277","-6","1"
+"78704","Austin","TX","30.246309","-97.76087","-6","1"
+"78705","Austin","TX","30.292424","-97.73856","-6","1"
+"78708","Austin","TX","30.326374","-97.771258","-6","1"
+"78709","Austin","TX","30.326374","-97.771258","-6","1"
+"78710","Austin","TX","30.351953","-97.715123","-6","1"
+"78711","Austin","TX","30.326374","-97.771258","-6","1"
+"78712","Austin","TX","30.285207","-97.735394","-6","1"
+"78713","Austin","TX","30.468583","-97.843336","-6","1"
+"78714","Austin","TX","30.335787","-97.443751","-6","1"
+"78715","Austin","TX","30.450088","-97.486509","-6","1"
+"78716","Austin","TX","30.316223","-97.85877","-6","1"
+"78717","Austin","TX","30.494623","-97.75687","-6","1"
+"78718","Austin","TX","30.326374","-97.771258","-6","1"
+"78719","Austin","TX","30.163458","-97.67711","-6","1"
+"78720","Austin","TX","30.326374","-97.771258","-6","1"
+"78721","Austin","TX","30.272926","-97.68665","-6","1"
+"78722","Austin","TX","30.289307","-97.71659","-6","1"
+"78723","Austin","TX","30.306507","-97.68651","-6","1"
+"78724","Austin","TX","30.294148","-97.62863","-6","1"
+"78725","Austin","TX","30.231583","-97.60992","-6","1"
+"78726","Austin","TX","30.439053","-97.83503","-6","1"
+"78727","Austin","TX","30.425652","-97.71419","-6","1"
+"78728","Austin","TX","30.451803","-97.67989","-6","1"
+"78729","Austin","TX","30.451348","-97.76588","-6","1"
+"78730","Austin","TX","30.359935","-97.83125","-6","1"
+"78731","Austin","TX","30.344305","-97.7638","-6","1"
+"78732","Austin","TX","30.382724","-97.89459","-6","1"
+"78733","Austin","TX","30.329704","-97.8751","-6","1"
+"78734","Austin","TX","30.378675","-97.95028","-6","1"
+"78735","Austin","TX","30.250761","-97.84469","-6","1"
+"78736","Austin","TX","30.245558","-97.94177","-6","1"
+"78737","Austin","TX","30.19025","-97.95854","-6","1"
+"78738","Austin","TX","30.340111","-97.98869","-6","1"
+"78739","Austin","TX","30.17207","-97.87284","-6","1"
+"78741","Austin","TX","30.231252","-97.716","-6","1"
+"78742","Austin","TX","30.23358","-97.67831","-6","1"
+"78744","Austin","TX","30.188377","-97.74038","-6","1"
+"78745","Austin","TX","30.207559","-97.79575","-6","1"
+"78746","Austin","TX","30.287739","-97.8022","-6","1"
+"78747","Austin","TX","30.132855","-97.76187","-6","1"
+"78748","Austin","TX","30.17202","-97.82265","-6","1"
+"78749","Austin","TX","30.216108","-97.85828","-6","1"
+"78750","Austin","TX","30.438933","-97.80383","-6","1"
+"78751","Austin","TX","30.310707","-97.723","-6","1"
+"78752","Austin","TX","30.332506","-97.70571","-6","1"
+"78753","Austin","TX","30.374654","-97.67621","-6","1"
+"78754","Austin","TX","30.354234","-97.64679","-6","1"
+"78755","Austin","TX","30.326374","-97.771258","-6","1"
+"78756","Austin","TX","30.320206","-97.74177","-6","1"
+"78757","Austin","TX","30.349455","-97.73328","-6","1"
+"78758","Austin","TX","30.384204","-97.70392","-6","1"
+"78759","Austin","TX","30.406169","-97.75743","-6","1"
+"78760","Austin","TX","30.326374","-97.771258","-6","1"
+"78761","Austin","TX","30.326374","-97.771258","-6","1"
+"78762","Austin","TX","30.326374","-97.771258","-6","1"
+"78763","Austin","TX","30.335398","-97.559807","-6","1"
+"78764","Austin","TX","30.445502","-97.659533","-6","1"
+"78765","Austin","TX","30.326374","-97.771258","-6","1"
+"78766","Austin","TX","30.442202","-97.62333","-6","1"
+"78767","Austin","TX","30.222007","-97.896285","-6","1"
+"78768","Austin","TX","30.326374","-97.771258","-6","1"
+"78769","Austin","TX","30.326374","-97.771258","-6","1"
+"78771","Austin","TX","30.326374","-97.771258","-6","1"
+"78772","Austin","TX","30.326374","-97.771258","-6","1"
+"78773","Austin","TX","30.326374","-97.771258","-6","1"
+"78774","Austin","TX","30.326374","-97.771258","-6","1"
+"78778","Austin","TX","30.326374","-97.771258","-6","1"
+"78779","Austin","TX","30.326374","-97.771258","-6","1"
+"78780","Austin","TX","30.326374","-97.771258","-6","1"
+"78781","Austin","TX","30.326374","-97.771258","-6","1"
+"78782","Austin","TX","30.326374","-97.771258","-6","1"
+"78783","Austin","TX","30.326374","-97.771258","-6","1"
+"78785","Austin","TX","30.326374","-97.771258","-6","1"
+"78786","Austin","TX","30.326374","-97.771258","-6","1"
+"78787","Austin","TX","30.326374","-97.771258","-6","1"
+"78788","Austin","TX","30.326374","-97.771258","-6","1"
+"78789","Austin","TX","30.326374","-97.771258","-6","1"
+"78801","Uvalde","TX","29.252882","-99.8165","-6","1"
+"78802","Uvalde","TX","29.223697","-99.779351","-6","1"
+"78827","Asherton","TX","28.442081","-99.76064","-6","1"
+"78828","Barksdale","TX","29.782887","-100.08547","-6","1"
+"78829","Batesville","TX","28.883474","-99.58416","-6","1"
+"78830","Big Wells","TX","28.555795","-99.50744","-6","1"
+"78832","Brackettville","TX","29.313559","-100.42452","-6","1"
+"78833","Camp Wood","TX","29.664428","-99.99968","-6","1"
+"78834","Carrizo Springs","TX","28.524292","-99.83827","-6","1"
+"78835","Burton","TX","30.178439","-96.591092","-6","1"
+"78836","Catarina","TX","28.34884","-99.61238","-6","1"
+"78837","Comstock","TX","29.933388","-101.40061","-6","1"
+"78838","Concan","TX","29.541648","-99.71817","-6","1"
+"78839","Crystal City","TX","28.68906","-99.81278","-6","1"
+"78840","Del Rio","TX","29.404267","-100.88116","-6","1"
+"78841","Del Rio","TX","29.346518","-100.928864","-6","1"
+"78842","Del Rio","TX","29.411955","-100.934216","-6","1"
+"78843","Laughlin A F B","TX","29.356379","-100.79269","-6","1"
+"78847","Del Rio","TX","29.763171","-101.230032","-6","1"
+"78850","D Hanis","TX","29.334701","-99.33534","-6","1"
+"78851","Dryden","TX","30.075997","-101.95574","-6","1"
+"78852","Eagle Pass","TX","28.716242","-100.48058","-6","1"
+"78853","Eagle Pass","TX","28.679006","-100.478373","-6","1"
+"78860","El Indio","TX","28.513787","-100.31647","-6","1"
+"78861","Hondo","TX","29.379516","-99.12665","-6","1"
+"78870","Knippa","TX","29.297821","-99.62754","-6","1"
+"78871","Langtry","TX","29.763171","-101.230032","-6","1"
+"78872","La Pryor","TX","28.950547","-99.85032","-6","1"
+"78873","Leakey","TX","29.756509","-99.76665","-6","1"
+"78877","Quemado","TX","28.917675","-100.60332","-6","1"
+"78879","Rio Frio","TX","29.628266","-99.73847","-6","1"
+"78880","Rocksprings","TX","30.065334","-100.17202","-6","1"
+"78881","Sabinal","TX","29.361493","-99.50497","-6","1"
+"78883","Tarpley","TX","29.671077","-99.34384","-6","1"
+"78884","Utopia","TX","29.634216","-99.48894","-6","1"
+"78885","Vanderpool","TX","29.785042","-99.55361","-6","1"
+"78886","Yancey","TX","29.143045","-99.19045","-6","1"
+"78931","Bleiblerville","TX","29.849283","-96.313271","-6","1"
+"78932","Carmine","TX","30.141287","-96.6909","-6","1"
+"78933","Cat Spring","TX","29.773128","-96.39342","-6","1"
+"78934","Columbus","TX","29.712052","-96.56134","-6","1"
+"78935","Alleyton","TX","29.698797","-96.45594","-6","1"
+"78938","Ellinger","TX","29.838528","-96.70389","-6","1"
+"78940","Fayetteville","TX","29.941521","-96.65977","-6","1"
+"78941","Flatonia","TX","29.719856","-97.1249","-6","1"
+"78942","Giddings","TX","30.182175","-96.93171","-6","1"
+"78943","Glidden","TX","29.699797","-96.59314","-6","1"
+"78944","Industry","TX","29.975083","-96.50081","-6","1"
+"78945","La Grange","TX","29.909764","-96.8745","-6","1"
+"78946","Ledbetter","TX","30.186858","-96.78185","-6","1"
+"78947","Lexington","TX","30.414806","-97.03904","-6","1"
+"78948","Lincoln","TX","30.2984","-96.95358","-6","1"
+"78949","Muldoon","TX","29.847433","-97.07988","-6","1"
+"78950","New Ulm","TX","29.909257","-96.49617","-6","1"
+"78951","Oakland","TX","29.60466","-96.524899","-6","1"
+"78952","Plum","TX","29.896219","-96.943868","-6","1"
+"78953","Rosanky","TX","29.846862","-97.3318","-6","1"
+"78954","Round Top","TX","30.057137","-96.67796","-6","1"
+"78956","Schulenburg","TX","29.680723","-96.91964","-6","1"
+"78957","Smithville","TX","30.010487","-97.16036","-6","1"
+"78959","Waelder","TX","29.697311","-97.29077","-6","1"
+"78960","Warda","TX","30.070257","-96.91939","-6","1"
+"78961","Round Top","TX","29.665518","-97.039741","-6","1"
+"78962","Weimar","TX","29.698373","-96.75932","-6","1"
+"78963","West Point","TX","29.930184","-97.0269","-6","1"
+"78972","Austin","TX","30.31536","-97.663293","-6","1"
+"79001","Adrian","TX","35.2195","-102.71795","-6","1"
+"79002","Alanreed","TX","35.201105","-100.74939","-6","1"
+"79003","Allison","TX","35.629034","-100.09291","-6","1"
+"79005","Booker","TX","36.427031","-100.51097","-6","1"
+"79007","Borger","TX","35.665899","-101.40666","-6","1"
+"79008","Borger","TX","35.631621","-101.599447","-6","1"
+"79009","Bovina","TX","34.51748","-102.89478","-6","1"
+"79010","Boys Ranch","TX","35.459732","-102.14757","-6","1"
+"79011","Briscoe","TX","35.662917","-100.21999","-6","1"
+"79012","Bushland","TX","35.191525","-102.08831","-6","1"
+"79013","Cactus","TX","36.044769","-102.01155","-6","1"
+"79014","Canadian","TX","35.866528","-100.31313","-6","1"
+"79015","Canyon","TX","34.971029","-101.9212","-6","1"
+"79016","Canyon","TX","34.96539","-101.895894","-6","1"
+"79018","Channing","TX","35.718644","-102.25186","-6","1"
+"79019","Claude","TX","35.062127","-101.41617","-6","1"
+"79021","Cotton Center","TX","33.980231","-102.02668","-6","1"
+"79022","Dalhart","TX","36.090281","-102.60769","-6","1"
+"79024","Darrouzett","TX","36.441178","-100.33123","-6","1"
+"79025","Dawn","TX","34.92765","-102.21997","-6","1"
+"79027","Dimmitt","TX","34.539266","-102.37108","-6","1"
+"79029","Dumas","TX","35.893121","-101.95908","-6","1"
+"79031","Earth","TX","34.235871","-102.40636","-6","1"
+"79032","Edmonson","TX","34.281443","-101.898","-6","1"
+"79033","Farnsworth","TX","36.317403","-100.97272","-6","1"
+"79034","Follett","TX","36.397469","-100.16168","-6","1"
+"79035","Friona","TX","34.631714","-102.72658","-6","1"
+"79036","Fritch","TX","35.625603","-101.61413","-6","1"
+"79039","Groom","TX","35.235628","-101.10183","-6","1"
+"79040","Gruver","TX","36.27128","-101.49483","-6","1"
+"79041","Hale Center","TX","34.043076","-101.89695","-6","1"
+"79042","Happy","TX","34.759887","-101.83116","-6","1"
+"79043","Hart","TX","34.423414","-102.12132","-6","1"
+"79044","Hartley","TX","35.890235","-102.3595","-6","1"
+"79045","Hereford","TX","34.854898","-102.41824","-6","1"
+"79046","Higgins","TX","36.113986","-100.09235","-6","1"
+"79051","Kerrick","OK","36.531076","-102.33198","-6","1"
+"79052","Kress","TX","34.356732","-101.76769","-6","1"
+"79053","Lazbuddie","TX","34.39174","-102.60242","-6","1"
+"79054","Lefors","TX","35.444006","-100.80119","-6","1"
+"79056","Lipscomb","TX","36.232046","-100.27971","-6","1"
+"79057","Mclean","TX","35.263424","-100.61635","-6","1"
+"79058","Masterson","TX","35.837775","-101.892846","-6","1"
+"79059","Miami","TX","35.724847","-100.6961","-6","1"
+"79061","Mobeetie","TX","35.534558","-100.44105","-6","1"
+"79062","Morse","TX","36.004239","-101.54672","-6","1"
+"79063","Nazareth","TX","34.543766","-102.12349","-6","1"
+"79064","Olton","TX","34.18788","-102.13325","-6","1"
+"79065","Pampa","TX","35.533093","-100.96041","-6","1"
+"79066","Pampa","TX","35.533384","-100.956013","-6","1"
+"79068","Panhandle","TX","35.335288","-101.39752","-6","1"
+"79070","Perryton","TX","36.336972","-100.82966","-6","1"
+"79072","Plainview","TX","34.191002","-101.72506","-6","1"
+"79073","Plainview","TX","34.068903","-101.826997","-6","1"
+"79077","Samnorwood","TX","34.840485","-100.204928","-6","1"
+"79078","Sanford","TX","35.71177","-101.54716","-6","1"
+"79079","Shamrock","TX","35.227015","-100.27501","-6","1"
+"79080","Skellytown","TX","35.655035","-101.22477","-6","1"
+"79081","Spearman","TX","36.185112","-101.18783","-6","1"
+"79082","Springlake","TX","34.209814","-102.29761","-6","1"
+"79083","Stinnett","TX","35.844445","-101.48031","-6","1"
+"79084","Stratford","TX","36.28116","-102.02187","-6","1"
+"79085","Summerfield","TX","34.743735","-102.506442","-6","1"
+"79086","Sunray","TX","36.057372","-101.76599","-6","1"
+"79087","Texline","TX","36.316305","-102.97676","-6","1"
+"79088","Tulia","TX","34.541042","-101.72921","-6","1"
+"79091","Umbarger","TX","34.938094","-102.11087","-6","1"
+"79092","Vega","TX","35.209649","-102.42611","-6","1"
+"79093","Waka","TX","36.280101","-101.04673","-6","1"
+"79094","Wayside","TX","34.965329","-101.357838","-6","1"
+"79095","Wellington","TX","34.858194","-100.20763","-6","1"
+"79096","Wheeler","TX","35.459147","-100.20106","-6","1"
+"79097","White Deer","TX","35.432364","-101.16687","-6","1"
+"79098","Wildorado","TX","35.151101","-102.18977","-6","1"
+"79101","Amarillo","TX","35.206402","-101.83924","-6","1"
+"79102","Amarillo","TX","35.197852","-101.84543","-6","1"
+"79103","Amarillo","TX","35.184253","-101.81073","-6","1"
+"79104","Amarillo","TX","35.199652","-101.79486","-6","1"
+"79105","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79106","Amarillo","TX","35.204652","-101.88353","-6","1"
+"79107","Amarillo","TX","35.228302","-101.81946","-6","1"
+"79108","Amarillo","TX","35.296948","-101.78641","-6","1"
+"79109","Amarillo","TX","35.171903","-101.87581","-6","1"
+"79110","Amarillo","TX","35.157403","-101.86114","-6","1"
+"79111","Amarillo","TX","35.226552","-101.67875","-6","1"
+"79114","Amarillo","TX","35.050003","-101.817485","-6","1"
+"79116","Amarillo","TX","35.245398","-101.999047","-6","1"
+"79117","Amarillo","TX","35.308889","-101.843033","-6","1"
+"79118","Amarillo","TX","35.100501","-101.80606","-6","1"
+"79119","Amarillo","TX","35.097488","-101.98105","-6","1"
+"79120","Amarillo","TX","35.196352","-101.803412","-6","1"
+"79121","Amarillo","TX","35.173704","-101.92914","-6","1"
+"79123","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79124","Amarillo","TX","35.244819","-101.95391","-6","1"
+"79159","Amarillo","TX","35.216029","-102.071415","-6","1"
+"79160","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79163","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79164","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79165","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79166","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79167","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79168","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79170","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79171","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79172","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79174","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79175","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79178","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79180","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79181","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79182","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79184","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79185","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79186","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79187","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79189","Amarillo","TX","35.401475","-101.895089","-6","1"
+"79201","Childress","TX","34.38587","-100.28401","-6","1"
+"79220","Afton","TX","33.749303","-100.76393","-6","1"
+"79221","Aiken","TX","34.071514","-101.30313","-6","1"
+"79222","Carey","TX","34.529678","-100.207642","-6","1"
+"79223","Cee Vee","TX","34.216509","-100.47198","-6","1"
+"79224","Chalk","TX","34.074854","-100.258156","-6","1"
+"79225","Chillicothe","TX","34.261752","-99.5202","-6","1"
+"79226","Clarendon","TX","34.971719","-100.90662","-6","1"
+"79227","Crowell","TX","33.929907","-99.74194","-6","1"
+"79229","Dickens","TX","33.654512","-100.75517","-6","1"
+"79230","Dodson","TX","34.698438","-100.06623","-6","1"
+"79231","Dougherty","TX","33.943005","-101.09236","-6","1"
+"79232","Dumont","TX","33.773871","-100.61443","-6","1"
+"79233","Estelline","TX","34.545031","-100.43729","-6","1"
+"79234","Flomot","TX","34.241416","-100.93789","-6","1"
+"79235","Floydada","TX","33.941748","-101.30072","-6","1"
+"79236","Guthrie","TX","33.652122","-100.35199","-6","1"
+"79237","Hedley","TX","34.874151","-100.63288","-6","1"
+"79238","Kirkland","TX","34.529678","-100.207642","-6","1"
+"79239","Lakeview","TX","34.637427","-100.76388","-6","1"
+"79240","Lelia Lake","TX","34.896396","-100.76721","-6","1"
+"79241","Lockney","TX","34.192619","-101.38934","-6","1"
+"79243","Mcadoo","TX","33.787306","-100.98464","-6","1"
+"79244","Matador","TX","34.070936","-100.82488","-6","1"
+"79245","Memphis","TX","34.715551","-100.53964","-6","1"
+"79247","Odell","TX","34.345924","-99.41669","-6","1"
+"79248","Paducah","TX","34.006473","-100.21246","-6","1"
+"79250","Petersburg","TX","33.870404","-101.60467","-6","1"
+"79251","Quail","TX","34.975549","-100.44628","-6","1"
+"79252","Quanah","TX","34.297126","-99.77713","-6","1"
+"79255","Quitaque","TX","34.362997","-101.05209","-6","1"
+"79256","Roaring Springs","TX","33.915528","-100.81731","-6","1"
+"79257","Silverton","TX","34.444761","-101.32582","-6","1"
+"79258","South Plains","TX","34.071514","-101.30313","-6","1"
+"79259","Tell","TX","34.391847","-100.40597","-6","1"
+"79261","Turkey","TX","34.408268","-100.87132","-6","1"
+"79301","Earth","TX","34.230527","-102.41085","-6","1"
+"79311","Abernathy","TX","33.857895","-101.88156","-6","1"
+"79312","Amherst","TX","34.017448","-102.3858","-6","1"
+"79313","Anton","TX","33.823216","-102.16413","-6","1"
+"79314","Bledsoe","TX","33.616833","-103.01952","-6","1"
+"79316","Brownfield","TX","33.153528","-102.29568","-6","1"
+"79320","Bula","TX","33.861914","-102.67355","-6","1"
+"79321","Sudan","TX","34.061309","-102.521814","-6","1"
+"79322","Crosbyton","TX","33.653787","-101.22866","-6","1"
+"79323","Denver City","TX","32.976623","-102.84661","-6","1"
+"79324","Enochs","TX","33.895013","-102.78117","-6","1"
+"79325","Farwell","TX","34.389202","-102.89928","-6","1"
+"79326","Fieldton","TX","34.04877","-102.20958","-6","1"
+"79329","Idalou","TX","33.701827","-101.69093","-6","1"
+"79330","Justiceburg","TX","33.04993","-101.14146","-6","1"
+"79331","Lamesa","TX","32.714521","-101.94086","-6","1"
+"79336","Levelland","TX","33.609208","-102.41478","-6","1"
+"79338","Levelland","TX","33.593213","-102.362709","-6","1"
+"79339","Littlefield","TX","33.894823","-102.32282","-6","1"
+"79342","Loop","TX","32.893447","-102.30958","-6","1"
+"79343","Lorenzo","TX","33.605628","-101.5205","-6","1"
+"79344","Maple","TX","33.855245","-102.95319","-6","1"
+"79345","Meadow","TX","33.344598","-102.28814","-6","1"
+"79346","Morton","TX","33.688713","-102.81775","-6","1"
+"79347","Muleshoe","TX","34.206848","-102.78511","-6","1"
+"79350","New Deal","TX","33.751374","-101.83672","-6","1"
+"79351","Odonnell","TX","32.951473","-101.83895","-6","1"
+"79353","Pep","TX","33.783555","-102.59146","-6","1"
+"79355","Plains","TX","33.16997","-102.86992","-6","1"
+"79356","Post","TX","33.245276","-101.37638","-6","1"
+"79357","Ralls","TX","33.667836","-101.38794","-6","1"
+"79358","Ropesville","TX","33.425342","-102.16505","-6","1"
+"79359","Seagraves","TX","32.922387","-102.56265","-6","1"
+"79360","Seminole","TX","32.718232","-102.73458","-6","1"
+"79363","Shallowater","TX","33.701024","-102.01948","-6","1"
+"79364","Slaton","TX","33.437291","-101.65054","-6","1"
+"79366","Ransom Canyon","TX","33.531908","-101.69479","-6","1"
+"79367","Smyer","TX","33.588639","-102.16126","-6","1"
+"79368","Seminole","TX","33.044702","-102.099276","-6","1"
+"79369","Spade","TX","33.91843","-102.15822","-6","1"
+"79370","Spur","TX","33.478848","-100.89669","-6","1"
+"79371","Sudan","TX","34.068183","-102.52625","-6","1"
+"79372","Sundown","TX","33.45798","-102.48829","-6","1"
+"79373","Tahoka","TX","33.199867","-101.81949","-6","1"
+"79376","Tokio","TX","33.203713","-102.62018","-6","1"
+"79377","Welch","TX","32.931786","-102.14673","-6","1"
+"79378","Wellman","TX","33.037656","-102.44248","-6","1"
+"79379","Whiteface","TX","33.600017","-102.61953","-6","1"
+"79380","Whitharral","TX","33.733418","-102.33103","-6","1"
+"79381","Wilson","TX","33.327782","-101.76906","-6","1"
+"79382","Wolfforth","TX","33.483465","-102.02033","-6","1"
+"79383","New Home","TX","33.330983","-101.91065","-6","1"
+"79401","Lubbock","TX","33.578935","-101.8316","-6","1"
+"79402","Lubbock","TX","33.592235","-101.851144","-6","1"
+"79403","Lubbock","TX","33.614934","-101.8067","-6","1"
+"79404","Lubbock","TX","33.549785","-101.82634","-6","1"
+"79405","Lubbock","TX","33.570035","-101.84984","-6","1"
+"79406","Lubbock","TX","33.583798","-101.87525","-6","1"
+"79407","Lubbock","TX","33.567134","-101.98329","-6","1"
+"79408","Lubbock","TX","33.565926","-101.92669","-6","1"
+"79409","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79410","Lubbock","TX","33.570135","-101.88901","-6","1"
+"79411","Lubbock","TX","33.570435","-101.86184","-6","1"
+"79412","Lubbock","TX","33.549135","-101.85846","-6","1"
+"79413","Lubbock","TX","33.547735","-101.88881","-6","1"
+"79414","Lubbock","TX","33.550335","-101.91661","-6","1"
+"79415","Lubbock","TX","33.62386","-101.88057","-6","1"
+"79416","Lubbock","TX","33.591877","-101.94754","-6","1"
+"79423","Lubbock","TX","33.496603","-101.86923","-6","1"
+"79424","Lubbock","TX","33.513337","-101.93239","-6","1"
+"79430","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79452","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79453","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79457","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79464","Lubbock","TX","33.489623","-102.010895","-6","1"
+"79490","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79491","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79493","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79499","Lubbock","TX","33.610018","-101.821292","-6","1"
+"79501","Anson","TX","32.754555","-99.89507","-6","1"
+"79502","Aspermont","TX","33.151713","-100.25449","-6","1"
+"79503","Avoca","TX","32.882154","-99.69298","-6","1"
+"79504","Baird","TX","32.333638","-99.35055","-6","1"
+"79505","Benjamin","TX","33.565259","-99.84811","-6","1"
+"79506","Blackwell","TX","32.106949","-100.31228","-6","1"
+"79508","Buffalo Gap","TX","32.280068","-99.82808","-6","1"
+"79510","Clyde","TX","32.337156","-99.51701","-6","1"
+"79511","Coahoma","TX","32.38737","-101.28147","-6","1"
+"79512","Colorado City","TX","32.368824","-100.93689","-6","1"
+"79516","Dunn","TX","32.747707","-100.9153","-6","1"
+"79517","Fluvanna","TX","32.883354","-101.20597","-6","1"
+"79518","Girard","TX","33.361766","-100.6895","-6","1"
+"79519","Goldsboro","TX","32.043108","-99.70865","-6","1"
+"79520","Hamlin","TX","32.88019","-100.13583","-6","1"
+"79521","Haskell","TX","33.147497","-99.70246","-6","1"
+"79525","Hawley","TX","32.616906","-99.82211","-6","1"
+"79526","Hermleigh","TX","32.627475","-100.76416","-6","1"
+"79527","Ira","TX","32.584546","-101.06523","-6","1"
+"79528","Jayton","TX","33.238378","-100.57389","-6","1"
+"79529","Knox City","TX","33.423156","-99.82014","-6","1"
+"79530","Lawn","TX","32.128112","-99.7639","-6","1"
+"79532","Loraine","TX","32.409433","-100.71285","-6","1"
+"79533","Lueders","TX","32.80699","-99.60862","-6","1"
+"79534","McCaulley","TX","32.766833","-100.21048","-6","1"
+"79535","Maryneal","TX","32.249241","-100.449","-6","1"
+"79536","Merkel","TX","32.473679","-100.02753","-6","1"
+"79537","Nolan","TX","32.269772","-100.23572","-6","1"
+"79538","Novice","TX","32.011087","-99.63167","-6","1"
+"79539","O Brien","TX","33.379469","-99.89708","-6","1"
+"79540","Old Glory","TX","33.151135","-100.04142","-6","1"
+"79541","Ovalo","TX","32.151983","-99.84483","-6","1"
+"79543","Roby","TX","32.739964","-100.38106","-6","1"
+"79544","Rochester","TX","33.308203","-99.86203","-6","1"
+"79545","Roscoe","TX","32.422985","-100.55397","-6","1"
+"79546","Rotan","TX","32.87144","-100.46635","-6","1"
+"79547","Rule","TX","33.196822","-99.90554","-6","1"
+"79548","Rule","TX","33.067644","-99.94686","-6","1"
+"79549","Snyder","TX","32.760229","-100.95344","-6","1"
+"79550","Snyder","TX","32.747707","-100.9153","-6","1"
+"79552","Stamford","TX","32.944761","-99.800304","-6","1"
+"79553","Stamford","TX","32.943145","-99.81595","-6","1"
+"79556","Sweetwater","TX","32.465621","-100.39814","-6","1"
+"79560","Sylvester","TX","32.684029","-100.1998","-6","1"
+"79561","Trent","TX","32.504094","-100.15822","-6","1"
+"79562","Tuscola","TX","32.230821","-99.90025","-6","1"
+"79563","Tye","TX","32.442465","-99.87238","-6","1"
+"79565","Westbrook","TX","32.358785","-101.07207","-6","1"
+"79566","Wingate","TX","32.109191","-100.10582","-6","1"
+"79567","Winters","TX","31.965685","-99.93471","-6","1"
+"79571","Haskell","TX","33.158381","-99.718725","-6","1"
+"79601","Abilene","TX","32.500532","-99.69803","-6","1"
+"79602","Abilene","TX","32.40769","-99.72107","-6","1"
+"79603","Abilene","TX","32.466724","-99.76927","-6","1"
+"79604","Abilene","TX","32.428796","-99.795167","-6","1"
+"79605","Abilene","TX","32.432975","-99.77096","-6","1"
+"79606","Abilene","TX","32.360362","-99.79886","-6","1"
+"79607","Dyess AFB","TX","32.417269","-99.82203","-6","1"
+"79608","Abilene","TX","32.302132","-99.890737","-6","1"
+"79643","Ozona","TX","30.711061","-101.215979","-6","1"
+"79697","Abilene","TX","32.302132","-99.890737","-6","1"
+"79698","Abilene","TX","32.475074","-99.73484","-6","1"
+"79699","Abilene","TX","32.466474","-99.711665","-6","1"
+"79701","Midland","TX","31.995623","-102.08108","-6","1"
+"79702","Midland","TX","31.963698","-102.080064","-6","1"
+"79703","Midland","TX","31.984823","-102.13015","-6","1"
+"79704","Midland","TX","31.869259","-102.031726","-6","1"
+"79705","Midland","TX","32.029022","-102.08618","-6","1"
+"79706","Midland","TX","31.880341","-101.96324","-6","1"
+"79707","Midland","TX","32.021056","-102.16008","-6","1"
+"79708","Midland","TX","31.869259","-102.031726","-6","1"
+"79710","Midland","TX","31.869259","-102.031726","-6","1"
+"79711","Midland","TX","31.869259","-102.031726","-6","1"
+"79712","Midland","TX","31.869259","-102.031726","-6","1"
+"79713","Ackerly","TX","32.520297","-101.73528","-6","1"
+"79714","Andrews","TX","32.345871","-102.56767","-6","1"
+"79718","Balmorhea","TX","30.966245","-103.73108","-6","1"
+"79719","Barstow","TX","31.461562","-103.39895","-6","1"
+"79720","Big Spring","TX","32.21649","-101.4532","-6","1"
+"79721","Big Spring","TX","32.27328","-101.373968","-6","1"
+"79730","Coyanosa","TX","31.17942","-103.03594","-6","1"
+"79731","Crane","TX","31.389079","-102.35059","-6","1"
+"79733","Forsan","TX","32.110298","-101.3655","-6","1"
+"79734","Fort Davis","TX","30.626134","-103.98274","-6","1"
+"79735","Fort Stockton","TX","30.877528","-102.852","-6","1"
+"79738","Gail","TX","32.723865","-101.45811","-6","1"
+"79739","Garden City","TX","31.807661","-101.51475","-6","1"
+"79740","Girvin","TX","31.019602","-102.47675","-6","1"
+"79741","Goldsmith","TX","31.983989","-102.64729","-6","1"
+"79742","Grandfalls","TX","31.34197","-102.8564","-6","1"
+"79743","Imperial","TX","31.253704","-102.696","-6","1"
+"79744","Iraan","TX","30.899378","-101.98029","-6","1"
+"79745","Kermit","TX","31.847071","-103.08399","-6","1"
+"79748","Knott","TX","32.388962","-101.66373","-6","1"
+"79749","Lenorah","TX","32.255909","-101.81824","-6","1"
+"79752","McCamey","TX","31.156902","-102.19598","-6","1"
+"79754","Mentone","TX","31.72285","-103.57449","-6","1"
+"79755","Midkiff","TX","31.608083","-101.86524","-6","1"
+"79756","Monahans","TX","31.568459","-102.89658","-6","1"
+"79757","Wickett","TX","31.566763","-103.014646","-6","1"
+"79758","Gardendale","TX","32.020274","-102.35512","-6","1"
+"79759","Notrees","TX","31.840191","-102.74709","-6","1"
+"79760","Odessa","TX","31.765163","-102.354346","-6","1"
+"79761","Odessa","TX","31.854455","-102.35906","-6","1"
+"79762","Odessa","TX","31.890374","-102.35398","-6","1"
+"79763","Odessa","TX","31.817344","-102.42315","-6","1"
+"79764","Odessa","TX","31.86577","-102.45367","-6","1"
+"79765","Odessa","TX","31.910706","-102.28644","-6","1"
+"79766","Odessa","TX","31.749504","-102.32177","-6","1"
+"79768","Odessa","TX","31.869142","-102.542944","-6","1"
+"79769","Odessa","TX","31.746572","-102.566993","-6","1"
+"79770","Orla","TX","31.383297","-103.556598","-6","1"
+"79772","Pecos","TX","31.388404","-103.52515","-6","1"
+"79776","Penwell","TX","31.730204","-102.62831","-6","1"
+"79777","Pyote","TX","31.535153","-103.12722","-6","1"
+"79778","Rankin","TX","31.2244","-101.94317","-6","1"
+"79779","Royalty","TX","31.459448","-103.188993","-6","1"
+"79780","Saragosa","TX","31.026706","-103.65509","-6","1"
+"79781","Sheffield","TX","30.703917","-101.87223","-6","1"
+"79782","Stanton","TX","32.09023","-101.81691","-6","1"
+"79783","Tarzan","TX","32.369835","-102.03317","-6","1"
+"79785","Toyah","TX","31.306912","-103.79377","-6","1"
+"79786","Toyahvale","TX","31.383297","-103.556598","-6","1"
+"79788","Wickett","TX","31.569032","-103.00689","-6","1"
+"79789","Wink","TX","31.753101","-103.15737","-6","1"
+"79821","Anthony","TX","31.977553","-106.60469","-7","1"
+"79830","Alpine","TX","30.011559","-103.56444","-6","1"
+"79831","Alpine","TX","30.349136","-103.69271","-6","1"
+"79832","Alpine","TX","30.363139","-103.653904","-6","1"
+"79834","Big Bend National Park","TX","29.321321","-103.21085","-6","1"
+"79835","Canutillo","TX","31.932926","-106.59577","-7","1"
+"79836","Clint","TX","31.570185","-106.2133","-7","1"
+"79837","Dell City","TX","31.937024","-105.19353","-7","1"
+"79838","Fabens","TX","31.490587","-106.15381","-7","1"
+"79839","Fort Hancock","TX","31.270689","-105.6653","-7","1"
+"79841","Sierra Blanca","TX","32.624796","-103.597991","-7","1"
+"79842","Marathon","TX","30.12169","-103.22091","-6","1"
+"79843","Marfa","TX","30.217129","-104.22045","-6","1"
+"79845","Presidio","TX","29.597409","-104.27058","-6","1"
+"79846","Redford","TX","29.444333","-104.11628","-6","1"
+"79847","Salt Flat","TX","31.820395","-105.30882","-7","1"
+"79848","Sanderson","TX","30.144953","-102.39894","-6","1"
+"79849","San Elizario","TX","31.577344","-106.2672","-7","1"
+"79850","Shafter","TX","29.943719","-104.386683","-6","1"
+"79851","Sierra Blanca","TX","31.182009","-105.34084","-7","1"
+"79852","Terlingua","TX","29.441286","-103.63643","-6","1"
+"79853","Tornillo","TX","31.447738","-106.09049","-7","1"
+"79854","Valentine","TX","30.647349","-104.52192","-6","1"
+"79855","Van Horn","TX","31.099326","-104.69511","-6","1"
+"79858","Fabens","TX","31.509199","-106.151727","-7","1"
+"79870","Alpine","TX","30.354251","-103.658391","-6","1"
+"79901","El Paso","TX","31.759558","-106.48011","-7","1"
+"79902","El Paso","TX","31.775458","-106.4945","-7","1"
+"79903","El Paso","TX","31.786221","-106.44583","-7","1"
+"79904","El Paso","TX","31.852156","-106.44181","-7","1"
+"79905","El Paso","TX","31.768758","-106.43047","-7","1"
+"79906","El Paso","TX","31.809263","-106.43081","-7","1"
+"79907","El Paso","TX","31.70831","-106.32749","-7","1"
+"79908","El Paso","TX","31.912449","-106.32501","-7","1"
+"79910","El Paso","TX","31.694842","-106.299987","-7","1"
+"79911","El Paso","TX","31.694842","-106.299987","-7","1"
+"79912","El Paso","TX","31.848055","-106.54487","-7","1"
+"79913","El Paso","TX","31.93728","-106.572393","-7","1"
+"79914","El Paso","TX","31.694842","-106.299987","-7","1"
+"79915","El Paso","TX","31.743038","-106.36957","-7","1"
+"79916","El Paso","TX","31.744353","-106.287923","-7","1"
+"79917","El Paso","TX","31.694842","-106.299987","-7","1"
+"79918","El Paso","TX","31.831782","-106.390656","-7","1"
+"79920","El Paso","TX","31.821439","-106.461405","-7","1"
+"79922","El Paso","NM","31.789109","-106.54291","-7","1"
+"79923","El Paso","TX","31.694842","-106.299987","-7","1"
+"79924","El Paso","TX","31.901737","-106.41827","-7","1"
+"79925","El Paso","TX","31.782408","-106.36353","-7","1"
+"79926","El Paso","TX","31.694842","-106.299987","-7","1"
+"79927","El Paso","TX","31.684338","-106.20788","-7","1"
+"79928","El Paso","TX","31.674736","-106.197528","-7","1"
+"79929","El Paso","TX","31.694842","-106.299987","-7","1"
+"79930","El Paso","TX","31.803457","-106.45758","-7","1"
+"79931","El Paso","TX","31.694842","-106.299987","-7","1"
+"79932","El Paso","TX","31.865696","-106.59982","-7","1"
+"79934","El Paso","TX","31.943633","-106.42402","-7","1"
+"79935","El Paso","TX","31.784541","-106.33705","-7","1"
+"79936","El Paso","TX","31.766355","-106.29828","-7","1"
+"79937","El Paso","TX","31.694842","-106.299987","-7","1"
+"79938","El Paso","TX","31.852355","-106.09325","-7","1"
+"79940","El Paso","TX","31.694842","-106.299987","-7","1"
+"79941","El Paso","TX","31.694842","-106.299987","-7","1"
+"79942","El Paso","TX","31.694842","-106.299987","-7","1"
+"79943","El Paso","TX","31.694842","-106.299987","-7","1"
+"79944","El Paso","TX","31.694842","-106.299987","-7","1"
+"79945","El Paso","TX","31.694842","-106.299987","-7","1"
+"79946","El Paso","TX","31.694842","-106.299987","-7","1"
+"79947","El Paso","TX","31.694842","-106.299987","-7","1"
+"79948","El Paso","TX","31.694842","-106.299987","-7","1"
+"79949","El Paso","TX","31.694842","-106.299987","-7","1"
+"79950","El Paso","TX","31.694842","-106.299987","-7","1"
+"79951","El Paso","TX","31.694842","-106.299987","-7","1"
+"79952","El Paso","TX","31.694842","-106.299987","-7","1"
+"79953","El Paso","TX","31.694842","-106.299987","-7","1"
+"79954","El Paso","TX","31.694842","-106.299987","-7","1"
+"79955","El Paso","TX","31.694842","-106.299987","-7","1"
+"79958","El Paso","TX","31.694842","-106.299987","-7","1"
+"79960","El Paso","TX","31.694842","-106.299987","-7","1"
+"79961","El Paso","TX","31.694842","-106.299987","-7","1"
+"79966","El Paso","TX","31.694842","-106.299987","-7","1"
+"79968","El Paso","TX","31.770458","-106.504843","-7","1"
+"79973","El Paso","TX","31.694842","-106.299987","-7","1"
+"79974","El Paso","TX","31.694842","-106.299987","-7","1"
+"79975","El Paso","TX","31.694842","-106.299987","-7","1"
+"79976","El Paso","TX","31.694842","-106.299987","-7","1"
+"79977","El Paso","TX","31.694842","-106.299987","-7","1"
+"79978","El Paso","TX","31.799275","-106.382757","-7","1"
+"79980","El Paso","TX","31.694842","-106.299987","-7","1"
+"79982","El Paso","TX","31.694842","-106.299987","-7","1"
+"79983","El Paso","TX","31.694842","-106.299987","-7","1"
+"79984","El Paso","TX","31.694842","-106.299987","-7","1"
+"79985","El Paso","TX","31.694842","-106.299987","-7","1"
+"79986","El Paso","TX","31.694842","-106.299987","-7","1"
+"79987","El Paso","TX","31.694842","-106.299987","-7","1"
+"79988","El Paso","TX","31.694842","-106.299987","-7","1"
+"79989","El Paso","TX","31.694842","-106.299987","-7","1"
+"79990","El Paso","TX","31.694842","-106.299987","-7","1"
+"79991","El Paso","TX","31.694842","-106.299987","-7","1"
+"79992","El Paso","TX","31.694842","-106.299987","-7","1"
+"79993","El Paso","TX","31.694842","-106.299987","-7","1"
+"79994","El Paso","TX","31.694842","-106.299987","-7","1"
+"79995","El Paso","TX","31.694842","-106.299987","-7","1"
+"79996","El Paso","TX","31.694842","-106.299987","-7","1"
+"79997","El Paso","TX","31.694842","-106.299987","-7","1"
+"79998","El Paso","TX","31.694842","-106.299987","-7","1"
+"79999","El Paso","TX","31.694842","-106.299987","-7","1"
+"80000","Aurora","CO","39.669637","-104.773083","-7","1"
+"80001","Arvada","CO","39.522014","-105.223945","-7","1"
+"80002","Arvada","CO","39.795006","-105.0981","-7","1"
+"80003","Arvada","CO","39.825357","-105.06439","-7","1"
+"80004","Arvada","CO","39.81431","-105.12263","-7","1"
+"80005","Arvada","CO","39.843304","-105.11896","-7","1"
+"80006","Arvada","CO","39.522014","-105.223945","-7","1"
+"80007","Arvada","CO","39.833442","-105.18591","-7","1"
+"80010","Aurora","CO","39.739387","-104.8621","-7","1"
+"80011","Aurora","CO","39.739737","-104.80905","-7","1"
+"80012","Aurora","CO","39.698387","-104.83956","-7","1"
+"80013","Aurora","CO","39.659105","-104.7791","-7","1"
+"80014","Aurora","CO","39.665637","-104.83421","-7","1"
+"80015","Aurora","CO","39.623896","-104.77723","-7","1"
+"80016","Aurora","CO","39.595115","-104.7485","-7","1"
+"80017","Aurora","CO","39.695269","-104.78439","-7","1"
+"80018","Aurora","CO","39.689244","-104.7166","-7","1"
+"80019","Aurora","CO","39.784036","-104.72289","-7","1"
+"80020","Broomfield","CO","39.93404","-105.05454","-7","1"
+"80021","Broomfield","CO","39.881608","-105.09953","-7","1"
+"80022","Commerce City","CO","39.836586","-104.9039","-7","1"
+"80024","Dupont","CO","39.844685","-104.91851","-7","1"
+"80025","Eldorado Springs","CO","39.92926","-105.28863","-7","1"
+"80026","Lafayette","CO","40.002156","-105.10036","-7","1"
+"80027","Louisville","CO","39.963322","-105.15053","-7","1"
+"80028","Louisville","CO","40.087835","-105.373507","-7","1"
+"80030","Westminster","CO","39.830936","-105.03736","-7","1"
+"80031","Westminster","CO","39.866785","-105.04143","-7","1"
+"80033","Wheat Ridge","CO","39.774341","-105.10036","-7","1"
+"80034","Wheat Ridge","CO","39.522014","-105.223945","-7","1"
+"80035","Westminster","CO","39.80797","-104.407918","-7","1"
+"80036","Westminster","CO","39.80797","-104.407918","-7","1"
+"80037","Commerce City","CO","39.80797","-104.407918","-7","1"
+"80038","Broomfield","CO","40.087835","-105.373507","-7","1"
+"80040","Aurora","CO","39.80797","-104.407918","-7","1"
+"80041","Aurora","CO","39.738752","-104.408349","-7","1"
+"80042","Aurora","CO","39.80797","-104.407918","-7","1"
+"80044","Aurora","CO","39.738752","-104.408349","-7","1"
+"80045","Aurora","CO","39.746736","-104.838361","-7","1"
+"80046","Aurora","CO","39.738752","-104.408349","-7","1"
+"80047","Aurora","CO","39.738752","-104.408349","-7","1"
+"80061","Westminster","CO","39.862286","-105.072049","-7","1"
+"80101","Agate","CO","39.378712","-104.02409","-7","1"
+"80102","Bennett","CO","39.760573","-104.431","-7","1"
+"80103","Byers","CO","39.746563","-104.17162","-7","1"
+"80104","Castle Rock","CO","39.385141","-104.85962","-7","1"
+"80105","Deer Trail","CO","39.631741","-104.01594","-7","1"
+"80106","Elbert","CO","39.148692","-104.5635","-7","1"
+"80107","Elizabeth","CO","39.397242","-104.58696","-7","1"
+"80108","Castle Rock","CO","39.453833","-104.885409","-7","1"
+"80109","Castle Rock","CO","39.380857","-104.89947","-7","1"
+"80110","Englewood","CO","39.646847","-104.99076","-7","1"
+"80111","Englewood","CO","39.610431","-104.88139","-7","1"
+"80112","Englewood","CO","39.579454","-104.88288","-7","1"
+"80115","Aurora","CO","39.636562","-104.82093","-7","1"
+"80116","Franktown","CO","39.355957","-104.7241","-7","1"
+"80117","Kiowa","CO","39.382543","-104.42847","-7","1"
+"80118","Larkspur","CO","39.206652","-104.90983","-7","1"
+"80120","Littleton","CO","39.599687","-105.00658","-7","1"
+"80121","Littleton","CO","39.607386","-104.95805","-7","1"
+"80122","Littleton","CO","39.582604","-104.95834","-7","1"
+"80123","Littleton","CO","39.616114","-105.07393","-7","1"
+"80124","Littleton","CO","39.543478","-104.89644","-7","1"
+"80125","Littleton","CO","39.479365","-105.06708","-7","1"
+"80126","Littleton","CO","39.544549","-104.96808","-7","1"
+"80127","Littleton","CO","39.599755","-105.13052","-7","1"
+"80128","Littleton","CO","39.576838","-105.07882","-7","1"
+"80129","Littleton","CO","39.539556","-105.009739","-7","1"
+"80130","Lone Tree","CO","39.541571","-104.92152","-7","1"
+"80131","Louviers","CO","39.347863","-104.994708","-7","1"
+"80132","Monument","CO","39.098692","-104.8684","-7","1"
+"80133","Palmer Lake","CO","39.113371","-104.90493","-7","1"
+"80134","Parker","CO","39.508608","-104.78031","-7","1"
+"80135","Sedalia","CO","39.340969","-105.05404","-7","1"
+"80136","Strasburg","CO","39.776934","-104.30997","-7","1"
+"80137","Watkins","CO","39.749664","-104.60811","-7","1"
+"80138","Parker","CO","39.523171","-104.70607","-7","1"
+"80139","Parker","CO","39.51474","-104.744145","-7","1"
+"80150","Englewood","CO","39.738752","-104.408349","-7","1"
+"80151","Englewood","CO","39.738752","-104.408349","-7","1"
+"80154","Englewood","CO","39.738752","-104.408349","-7","1"
+"80155","Englewood","CO","39.738752","-104.408349","-7","1"
+"80160","Littleton","CO","39.738752","-104.408349","-7","1"
+"80161","Littleton","CO","39.738752","-104.408349","-7","1"
+"80162","Littleton","CO","39.522014","-105.223945","-7","1"
+"80163","Littleton","CO","39.347863","-104.994708","-7","1"
+"80165","Littleton","CO","39.738752","-104.408349","-7","1"
+"80166","Littleton","CO","39.738752","-104.408349","-7","1"
+"80201","Denver","CO","39.726303","-104.856808","-7","1"
+"80202","Denver","CO","39.751586","-104.99699","-7","1"
+"80203","Denver","CO","39.731286","-104.98306","-7","1"
+"80204","Denver","CO","39.734686","-105.01966","-7","1"
+"80205","Denver","CO","39.758986","-104.96678","-7","1"
+"80206","Denver","CO","39.731237","-104.95243","-7","1"
+"80207","Denver","CO","39.759386","-104.91945","-7","1"
+"80208","Denver","CO","39.738752","-104.408349","-7","1"
+"80209","Denver","CO","39.706535","-104.96698","-7","1"
+"80210","Denver","CO","39.679437","-104.96473","-7","1"
+"80211","Denver","CO","39.767536","-105.01973","-7","1"
+"80212","Denver","CO","39.770336","-105.04688","-7","1"
+"80214","Denver","CO","39.745526","-105.06251","-7","1"
+"80215","Denver","CO","39.744437","-105.10441","-7","1"
+"80216","Denver","CO","39.784622","-104.96214","-7","1"
+"80217","Denver","CO","39.738752","-104.408349","-7","1"
+"80218","Denver","CO","39.731237","-104.97133","-7","1"
+"80219","Denver","CO","39.698137","-105.03483","-7","1"
+"80220","Denver","CO","39.734387","-104.91678","-7","1"
+"80221","Denver","CO","39.816536","-105.01123","-7","1"
+"80222","Denver","CO","39.669237","-104.92766","-7","1"
+"80223","Denver","CO","39.699156","-104.99999","-7","1"
+"80224","Denver","CO","39.688437","-104.91348","-7","1"
+"80225","Denver","CO","39.69709","-105.12044","-7","1"
+"80226","Denver","CO","39.71222","-105.08918","-7","1"
+"80227","Denver","CO","39.668576","-105.09191","-7","1"
+"80228","Denver","CO","39.688278","-105.14558","-7","1"
+"80229","Denver","CO","39.859585","-104.95943","-7","1"
+"80230","Denver","CO","39.721763","-104.89627","-7","1"
+"80231","Denver","CO","39.681687","-104.88338","-7","1"
+"80232","Denver","CO","39.690387","-105.08866","-7","1"
+"80233","Denver","CO","39.903043","-104.9544","-7","1"
+"80234","Denver","CO","39.9091","-105.00829","-7","1"
+"80235","Denver","CO","39.648328","-105.08431","-7","1"
+"80236","Denver","CO","39.652454","-105.04089","-7","1"
+"80237","Denver","CO","39.643637","-104.90406","-7","1"
+"80238","Denver","CO","39.738752","-104.408349","-7","1"
+"80239","Denver","CO","39.788236","-104.83034","-7","1"
+"80241","Denver","CO","39.929566","-104.94931","-7","1"
+"80243","Denver","CO","39.738752","-104.408349","-7","1"
+"80244","Denver","CO","39.738752","-104.408349","-7","1"
+"80246","Denver","CO","39.705318","-104.93113","-7","1"
+"80247","Denver","CO","39.693573","-104.876649","-7","1"
+"80248","Denver","CO","39.738752","-104.408349","-7","1"
+"80249","Denver","CO","39.793686","-104.73913","-7","1"
+"80250","Denver","CO","39.738752","-104.408349","-7","1"
+"80251","Denver","CO","39.738752","-104.408349","-7","1"
+"80252","Denver","CO","39.738752","-104.408349","-7","1"
+"80254","Denver","CO","39.738752","-104.408349","-7","1"
+"80255","Denver","CO","39.738752","-104.408349","-7","1"
+"80256","Denver","CO","39.74739","-104.992842","-7","1"
+"80257","Denver","CO","39.738752","-104.408349","-7","1"
+"80259","Denver","CO","39.746239","-104.991334","-7","1"
+"80260","Denver","CO","39.868635","-105.00805","-7","1"
+"80261","Denver","CO","39.737929","-104.985036","-7","1"
+"80262","Denver","CO","39.731038","-104.938391","-7","1"
+"80263","Denver","CO","39.738752","-104.408349","-7","1"
+"80264","Denver","CO","39.742486","-104.98563","-7","1"
+"80265","Denver","CO","39.738752","-104.408349","-7","1"
+"80266","Denver","CO","39.747179","-104.991511","-7","1"
+"80270","Denver","CO","39.738752","-104.408349","-7","1"
+"80271","Denver","CO","39.738752","-104.408349","-7","1"
+"80273","Denver","CO","39.727293","-104.987535","-7","1"
+"80274","Denver","CO","39.743934","-104.987577","-7","1"
+"80275","Denver","CO","39.738752","-104.408349","-7","1"
+"80279","Denver","CO","39.738752","-104.408349","-7","1"
+"80280","Denver","CO","39.716675","-104.906942","-7","1"
+"80281","Denver","CO","39.74394","-104.987577","-7","1"
+"80290","Denver","CO","39.744086","-104.98696","-7","1"
+"80291","Denver","CO","39.74394","-104.987577","-7","1"
+"80292","Denver","CO","39.74739","-104.992842","-7","1"
+"80293","Denver","CO","39.746286","-104.99008","-7","1"
+"80294","Denver","CO","39.749436","-104.98948","-7","1"
+"80295","Denver","CO","39.745486","-104.986336","-7","1"
+"80296","Sherrelwood","CO","39.832432","-104.987535","-7","1"
+"80299","Denver","CO","39.738752","-104.408349","-7","1"
+"80301","Boulder","CO","40.044385","-105.21928","-7","1"
+"80302","Boulder","CO","40.020885","-105.29673","-7","1"
+"80303","Boulder","CO","39.989135","-105.22883","-7","1"
+"80304","Boulder","CO","40.039784","-105.27938","-7","1"
+"80305","Boulder","CO","39.979691","-105.252586","-7","1"
+"80306","Boulder","CO","40.102219","-105.384694","-7","1"
+"80307","Boulder","CO","40.087835","-105.373507","-7","1"
+"80308","Boulder","CO","40.027672","-105.3868","-7","1"
+"80309","Boulder","CO","40.087835","-105.373507","-7","1"
+"80310","Boulder","CO","40.087835","-105.373507","-7","1"
+"80314","Boulder","CO","40.087835","-105.373507","-7","1"
+"80321","Boulder","CO","40.087835","-105.373507","-7","1"
+"80322","Boulder","CO","40.087835","-105.373507","-7","1"
+"80323","Boulder","CO","40.087835","-105.373507","-7","1"
+"80328","Boulder","CO","40.087835","-105.373507","-7","1"
+"80329","Boulder","CO","40.087835","-105.373507","-7","1"
+"80401","Golden","CO","39.735745","-105.19337","-7","1"
+"80402","Golden","CO","39.522014","-105.223945","-7","1"
+"80403","Golden","CO","39.827903","-105.32256","-7","1"
+"80419","Golden","CO","39.522014","-105.223945","-7","1"
+"80420","Alma","CO","39.293921","-106.06889","-7","1"
+"80421","Bailey","CO","39.460306","-105.476","-7","1"
+"80422","Black Hawk","CO","39.813744","-105.50875","-7","1"
+"80423","Bond","CO","39.871619","-106.57267","-7","1"
+"80424","Breckenridge","CO","39.478893","-106.03747","-7","1"
+"80425","Buffalo Creek","CO","39.361089","-105.22472","-7","1"
+"80426","Burns","CO","39.885527","-106.93018","-7","1"
+"80427","Central City","CO","39.804776","-105.53422","-7","1"
+"80428","Clark","CO","40.854473","-106.92438","-7","1"
+"80429","Climax","CO","39.225758","-106.311697","-7","1"
+"80430","Coalmont","CO","40.436948","-106.49424","-7","1"
+"80432","Como","CO","39.24344","-105.79431","-7","1"
+"80433","Conifer","CO","39.514738","-105.31198","-7","1"
+"80434","Cowdrey","CO","40.92301","-106.33104","-7","1"
+"80435","Dillon","CO","39.607479","-105.97937","-7","1"
+"80436","Dumont","CO","39.766277","-105.61523","-7","1"
+"80437","Evergreen","CO","39.522014","-105.223945","-7","1"
+"80438","Empire","CO","39.762835","-105.71302","-7","1"
+"80439","Evergreen","CO","39.642572","-105.36812","-7","1"
+"80440","Fairplay","CO","39.22106","-106.0065","-7","1"
+"80442","Fraser","CO","39.949217","-105.83438","-7","1"
+"80443","Frisco","CO","39.532506","-106.14029","-7","1"
+"80444","Georgetown","CO","39.694915","-105.7258","-7","1"
+"80446","Granby","CO","40.142434","-105.95502","-7","1"
+"80447","Grand Lake","CO","40.23832","-105.84688","-7","1"
+"80448","Grant","CO","39.459109","-105.72873","-7","1"
+"80449","Hartsel","CO","38.993175","-105.79916","-7","1"
+"80451","Hot Sulphur Springs","CO","40.101485","-106.11862","-7","1"
+"80452","Idaho Springs","CO","39.737369","-105.56054","-7","1"
+"80453","Idledale","CO","39.668426","-105.244245","-7","1"
+"80454","Indian Hills","CO","39.631254","-105.26071","-7","1"
+"80455","Jamestown","CO","40.094785","-105.39844","-7","1"
+"80456","Jefferson","CO","39.310793","-105.74027","-7","1"
+"80457","Kittredge","CO","39.653899","-105.30102","-7","1"
+"80459","Kremmling","CO","40.14711","-106.42854","-7","1"
+"80461","Leadville","CO","39.231776","-106.31399","-7","1"
+"80463","McCoy","CO","39.912186","-106.74302","-7","1"
+"80465","Morrison","CO","39.620748","-105.18121","-7","1"
+"80466","Nederland","CO","39.964486","-105.50805","-7","1"
+"80467","Oak Creek","CO","40.266778","-106.92849","-7","1"
+"80468","Parshall","CO","39.967717","-106.16205","-7","1"
+"80469","Phippsburg","CO","40.218412","-106.94494","-7","1"
+"80470","Pine","CO","39.45658","-105.36876","-7","1"
+"80471","Pinecliffe","CO","39.947386","-105.459269","-7","1"
+"80473","Rand","CO","40.455817","-106.20137","-7","1"
+"80474","Rollinsville","CO","39.908923","-105.57057","-7","1"
+"80475","Shawnee","CO","39.439493","-105.602959","-7","1"
+"80476","Silver Plume","CO","39.695974","-105.73155","-7","1"
+"80477","Steamboat Springs","CO","40.348242","-106.92691","-7","1"
+"80478","Tabernash","CO","40.00167","-105.8686","-7","1"
+"80479","Toponas","CO","40.041288","-106.8557","-7","1"
+"80480","Walden","CO","40.621621","-106.24457","-7","1"
+"80481","Ward","CO","40.10613","-105.48044","-7","1"
+"80482","Winter Park","CO","39.915508","-105.78359","-7","1"
+"80483","Yampa","CO","40.149432","-106.90681","-7","1"
+"80487","Steamboat Springs","CO","40.502772","-106.87521","-7","1"
+"80488","Steamboat Springs","CO","40.619661","-106.860746","-7","1"
+"80497","Silverthorne","CO","39.641146","-106.108002","-7","1"
+"80498","Silverthorne","CO","39.722417","-106.13744","-7","1"
+"80501","Longmont","CO","40.171484","-105.10033","-7","1"
+"80502","Longmont","CO","40.087835","-105.373507","-7","1"
+"80503","Longmont","CO","40.156035","-105.17365","-7","1"
+"80504","Longmont","CO","40.160138","-105.01772","-7","1"
+"80509","Colorado Springs","CO","38.828692","-104.84063","-7","1"
+"80510","Allenspark","CO","40.223935","-105.52421","-7","1"
+"80511","Estes Park","CO","40.628112","-105.569245","-7","1"
+"80512","Bellvue","CO","40.700258","-105.64876","-7","1"
+"80513","Berthoud","CO","40.294423","-105.08431","-7","1"
+"80514","Dacono","CO","40.083475","-104.93581","-7","1"
+"80515","Drake","CO","40.412496","-105.41818","-7","1"
+"80516","Erie","CO","40.051051","-105.02767","-7","1"
+"80517","Estes Park","CO","40.370415","-105.51722","-7","1"
+"80520","Firestone","CO","40.115501","-104.93637","-7","1"
+"80521","Fort Collins","CO","40.586282","-105.10494","-7","1"
+"80522","Fort Collins","CO","40.642907","-105.057005","-7","1"
+"80523","Fort Collins","CO","40.45553","-105.464832","-7","1"
+"80524","Fort Collins","CO","40.606962","-105.05106","-7","1"
+"80525","Fort Collins","CO","40.532354","-105.0535","-7","1"
+"80526","Fort Collins","CO","40.539432","-105.11576","-7","1"
+"80527","Fort Collins","CO","40.540565","-105.280009","-7","1"
+"80528","Fort Collins","CO","40.502779","-105.01123","-7","1"
+"80530","Frederick","CO","40.104211","-104.93576","-7","1"
+"80532","Glen Haven","CO","40.497758","-105.43325","-7","1"
+"80533","Hygiene","CO","40.181515","-105.232695","-7","1"
+"80534","Johnstown","CO","40.335398","-104.91477","-7","1"
+"80535","Laporte","CO","40.67069","-105.17388","-7","1"
+"80536","Livermore","CO","40.878334","-105.40415","-7","1"
+"80537","Loveland","CO","40.383636","-105.10349","-7","1"
+"80538","Loveland","CO","40.435645","-105.08726","-7","1"
+"80539","Loveland","CO","40.38636","-105.163377","-7","1"
+"80540","Lyons","CO","40.253033","-105.33762","-7","1"
+"80541","Masonville","CO","40.529278","-105.372014","-7","1"
+"80542","Mead","CO","40.234505","-104.99747","-7","1"
+"80543","Milliken","CO","40.332926","-104.85394","-7","1"
+"80544","Niwot","CO","40.177043","-105.275045","-7","1"
+"80545","Red Feather Lakes","CO","40.824993","-105.63525","-7","1"
+"80546","Severance","CO","40.524987","-104.850544","-7","1"
+"80547","Timnath","CO","40.528966","-104.98083","-7","1"
+"80549","Wellington","CO","40.762264","-105.01233","-7","1"
+"80550","Windsor","CO","40.47997","-104.90227","-7","1"
+"80551","Windsor","CO","40.464092","-104.885116","-7","1"
+"80553","Fort Collins","CO","40.628112","-105.569245","-7","1"
+"80601","Brighton","CO","39.973251","-104.82407","-7","1"
+"80602","Thornton","CO","39.958987","-104.908921","-7","1"
+"80603","Lochbuie","CO","39.943831","-104.629665","-7","1"
+"80610","Ault","CO","40.61798","-104.66762","-7","1"
+"80611","Briggsdale","CO","40.581437","-104.26915","-7","1"
+"80612","Carr","CO","40.886476","-104.87448","-7","1"
+"80614","Eastlake","CO","39.80797","-104.407918","-7","1"
+"80615","Eaton","CO","40.529241","-104.71181","-7","1"
+"80620","Evans","CO","40.378019","-104.70357","-7","1"
+"80621","Fort Lupton","CO","40.090367","-104.79723","-7","1"
+"80622","Galeton","CO","40.536158","-104.500735","-7","1"
+"80623","Gilcrest","CO","40.28319","-104.77878","-7","1"
+"80624","Gill","CO","40.481168","-104.5151","-7","1"
+"80630","Greeley","CO","40.405094","-104.800547","-7","1"
+"80631","Greeley","CO","40.421845","-104.69175","-7","1"
+"80632","Greeley","CO","40.376626","-104.762899","-7","1"
+"80633","Greeley","CO","40.500919","-104.31497","-7","1"
+"80634","Greeley","CO","40.407853","-104.75498","-7","1"
+"80638","Greeley","CO","40.500919","-104.31497","-7","1"
+"80639","Greeley","CO","40.399281","-104.70172","-7","1"
+"80640","Henderson","CO","39.885202","-104.88339","-7","1"
+"80642","Hudson","CO","40.060539","-104.62943","-7","1"
+"80643","Keenesburg","CO","40.078242","-104.49916","-7","1"
+"80644","Kersey","CO","40.363777","-104.51964","-7","1"
+"80645","La Salle","CO","40.332131","-104.68704","-7","1"
+"80646","Lucerne","CO","40.48243","-104.70542","-7","1"
+"80648","Nunn","CO","40.746862","-104.76208","-7","1"
+"80649","Orchard","CO","40.310272","-104.15685","-7","1"
+"80650","Pierce","CO","40.637244","-104.75847","-7","1"
+"80651","Platteville","CO","40.228533","-104.84267","-7","1"
+"80652","Roggen","CO","40.095142","-104.28784","-7","1"
+"80653","Weldona","CO","40.36593","-104.00612","-7","1"
+"80654","Wiggins","CO","40.196296","-104.07361","-7","1"
+"80701","Fort Morgan","CO","40.226357","-103.80625","-7","1"
+"80705","Log Lane Village","CO","40.270801","-103.82915","-7","1"
+"80720","Akron","CO","40.124199","-103.18362","-7","1"
+"80721","Amherst","CO","40.681557","-102.16663","-7","1"
+"80722","Atwood","CO","40.53158","-103.26151","-7","1"
+"80723","Brush","CO","40.23045","-103.60824","-7","1"
+"80726","Crook","CO","40.888254","-102.78823","-7","1"
+"80727","Eckley","CO","40.086896","-102.48265","-7","1"
+"80728","Fleming","CO","40.620805","-102.84813","-7","1"
+"80729","Grover","CO","40.877461","-104.22705","-7","1"
+"80731","Haxtun","CO","40.593911","-102.58831","-7","1"
+"80732","Hereford","CO","40.975104","-104.305265","-7","1"
+"80733","Hillrose","CO","40.340456","-103.51203","-7","1"
+"80734","Holyoke","CO","40.582954","-102.30451","-7","1"
+"80735","Idalia","CO","39.709824","-102.24035","-7","1"
+"80736","Iliff","CO","40.798956","-103.04649","-7","1"
+"80737","Julesburg","CO","40.916929","-102.21858","-7","1"
+"80740","Lindon","CO","39.724528","-103.38353","-7","1"
+"80741","Merino","CO","40.508131","-103.41815","-7","1"
+"80742","New Raymer","CO","40.603869","-103.87807","-7","1"
+"80743","Otis","CO","40.215063","-102.95628","-7","1"
+"80744","Ovid","CO","40.888124","-102.3726","-7","1"
+"80745","Padroni","CO","40.825947","-103.27669","-7","1"
+"80746","Paoli","CO","40.610554","-102.472203","-7","1"
+"80747","Peetz","CO","40.964518","-103.11162","-7","1"
+"80749","Sedgwick","CO","40.86845","-102.54595","-7","1"
+"80750","Snyder","CO","40.382063","-103.60936","-7","1"
+"80751","Sterling","CO","40.633845","-103.21574","-7","1"
+"80754","Stoneham","CO","40.686028","-103.65736","-7","1"
+"80755","Vernon","CO","39.940858","-102.36417","-7","1"
+"80757","Woodrow","CO","39.836887","-103.61156","-7","1"
+"80758","Wray","CO","40.064734","-102.21336","-7","1"
+"80759","Yuma","CO","40.169249","-102.69005","-7","1"
+"80801","Anton","CO","39.727493","-103.10362","-7","1"
+"80802","Arapahoe","CO","38.834807","-102.1746","-7","1"
+"80804","Arriba","CO","39.317411","-103.24869","-7","1"
+"80805","Bethune","CO","39.302035","-102.44357","-7","1"
+"80807","Burlington","CO","39.3124","-102.25094","-7","1"
+"80808","Calhan","CO","38.977375","-104.32017","-7","1"
+"80809","Cascade","CO","38.911701","-104.98731","-7","1"
+"80810","Cheyenne Wells","CO","38.846982","-102.37913","-7","1"
+"80812","Cope","CO","39.648325","-102.88722","-7","1"
+"80813","Cripple Creek","CO","38.75604","-105.1497","-7","1"
+"80814","Divide","CO","38.927344","-105.18746","-7","1"
+"80815","Flagler","CO","39.348989","-103.07103","-7","1"
+"80816","Florissant","CO","38.876897","-105.30711","-7","1"
+"80817","Fountain","CO","38.674013","-104.69627","-7","1"
+"80818","Genoa","CO","39.386933","-103.48219","-7","1"
+"80819","Green Mountain Falls","CO","38.940813","-105.01363","-7","1"
+"80820","Guffey","CO","38.783844","-105.63616","-7","1"
+"80821","Hugo","CO","39.020889","-103.48045","-7","1"
+"80822","Joes","CO","39.633953","-102.69795","-7","1"
+"80823","Karval","CO","38.709972","-103.54469","-7","1"
+"80824","Kirk","CO","39.650653","-102.52694","-7","1"
+"80825","Kit Carson","CO","38.765737","-102.78889","-7","1"
+"80826","Limon","CO","39.041435","-103.604851","-7","1"
+"80827","Lake George","CO","39.031989","-105.46846","-7","1"
+"80828","Limon","CO","39.273148","-103.69416","-7","1"
+"80829","Manitou Springs","CO","38.853663","-104.93485","-7","1"
+"80830","Matheson","CO","39.089871","-103.89534","-7","1"
+"80831","Peyton","CO","38.96634","-104.54313","-7","1"
+"80832","Ramah","CO","39.034273","-104.07125","-7","1"
+"80833","Rush","CO","38.694617","-103.96314","-7","1"
+"80834","Seibert","CO","39.315812","-102.88573","-7","1"
+"80835","Simla","CO","39.172831","-104.08793","-7","1"
+"80836","Stratton","CO","39.29782","-102.59745","-7","1"
+"80840","U S A F Academy","CO","39.008109","-104.84248","-7","1"
+"80841","U S A F Academy","CO","38.82469","-104.562027","-7","1"
+"80860","Victor","CO","38.719345","-105.12429","-7","1"
+"80861","Vona","CO","39.36479","-102.75387","-7","1"
+"80862","Wild Horse","CO","38.922655","-103.02115","-7","1"
+"80863","Woodland Park","CO","38.996004","-105.06335","-7","1"
+"80864","Yoder","CO","38.688075","-104.17321","-7","1"
+"80866","Woodland Park","CO","39.085706","-105.23659","-7","1"
+"80901","Colorado Springs","CO","38.861469","-104.857828","-7","1"
+"80902","Colorado Springs","CO","38.942365","-104.807081","-7","1"
+"80903","Colorado Springs","CO","38.834282","-104.81654","-7","1"
+"80904","Colorado Springs","CO","38.850558","-104.86481","-7","1"
+"80905","Colorado Springs","CO","38.837542","-104.83632","-7","1"
+"80906","Colorado Springs","CO","38.791242","-104.82492","-7","1"
+"80907","Colorado Springs","CO","38.873692","-104.81869","-7","1"
+"80908","Colorado Springs","CO","39.035216","-104.69575","-7","1"
+"80909","Colorado Springs","CO","38.851493","-104.77856","-7","1"
+"80910","Colorado Springs","CO","38.813044","-104.77158","-7","1"
+"80911","Colorado Springs","CO","38.746807","-104.7232","-7","1"
+"80912","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80913","Colorado Springs","CO","38.743871","-104.76387","-7","1"
+"80914","Colorado Springs","CO","38.819195","-104.701177","-7","1"
+"80915","Colorado Springs","CO","38.858644","-104.70892","-7","1"
+"80916","Colorado Springs","CO","38.808934","-104.73823","-7","1"
+"80917","Colorado Springs","CO","38.888394","-104.73975","-7","1"
+"80918","Colorado Springs","CO","38.916226","-104.76602","-7","1"
+"80919","Colorado Springs","CO","38.925451","-104.85255","-7","1"
+"80920","Colorado Springs","CO","38.952366","-104.76701","-7","1"
+"80921","Colorado Springs","CO","39.044969","-104.83755","-7","1"
+"80922","Colorado Springs","CO","38.897344","-104.70145","-7","1"
+"80924","Breckenridge","CO","39.527772","-106.039412","-7","1"
+"80925","Colorado Springs","CO","38.758252","-104.6555","-7","1"
+"80926","Colorado Springs","CO","38.652352","-104.87298","-7","1"
+"80928","Colorado Springs","CO","38.629157","-104.45068","-7","1"
+"80929","Colorado Springs","CO","38.831149","-104.65178","-7","1"
+"80930","Colorado Springs","CO","38.811434","-104.50403","-7","1"
+"80931","Colorado Springs","CO","38.953003","-104.60923","-7","1"
+"80932","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80933","Colorado Springs","CO","38.939371","-105.011786","-7","1"
+"80934","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80935","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80936","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80937","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80940","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80941","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80942","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80943","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80944","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80945","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80946","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80947","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80949","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80950","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80960","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80962","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80970","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80977","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80995","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"80997","Colorado Springs","CO","38.82469","-104.562027","-7","1"
+"81001","Pueblo","CO","38.282872","-104.57029","-7","1"
+"81002","Pueblo","CO","38.128626","-104.552299","-7","1"
+"81003","Pueblo","CO","38.281052","-104.62567","-7","1"
+"81004","Pueblo","CO","38.197344","-104.6331","-7","1"
+"81005","Pueblo","CO","38.235865","-104.66972","-7","1"
+"81006","Pueblo","CO","38.243266","-104.52912","-7","1"
+"81007","Pueblo","CO","38.333601","-104.74329","-7","1"
+"81008","Pueblo","CO","38.370203","-104.61964","-7","1"
+"81009","Pueblo","CO","38.128626","-104.552299","-7","1"
+"81010","Pueblo","CO","38.128626","-104.552299","-7","1"
+"81011","Pueblo","CO","38.128626","-104.552299","-7","1"
+"81012","Pueblo","CO","38.128626","-104.552299","-7","1"
+"81013","Pueblo","CO","38.128626","-104.552299","-7","1"
+"81014","Pueblo","CO","38.128626","-104.552299","-7","1"
+"81015","Pueblo","CO","38.128626","-104.552299","-7","1"
+"81019","Colorado City","CO","37.887346","-104.613617","-7","1"
+"81020","Aguilar","CO","37.400041","-104.66016","-7","1"
+"81021","Arlington","CO","38.414313","-103.37824","-7","1"
+"81022","Avondale","CO","38.089719","-104.37807","-7","1"
+"81023","Beulah","CO","38.069421","-104.95609","-7","1"
+"81024","Boncarbo","CO","37.229888","-104.71063","-7","1"
+"81025","Boone","CO","38.243711","-104.23282","-7","1"
+"81027","Branson","CO","37.095478","-103.84302","-7","1"
+"81029","Campo","CO","37.136682","-102.5296","-7","1"
+"81030","Cheraw","CO","38.107901","-103.51113","-7","1"
+"81033","Crowley","CO","38.193627","-103.85543","-7","1"
+"81034","Crowley","CO","38.317851","-103.779959","-7","1"
+"81036","Eads","CO","38.467553","-102.80439","-7","1"
+"81038","Fort Lyon","CO","37.955547","-103.072469","-7","1"
+"81039","Fowler","CO","38.002861","-104.03445","-7","1"
+"81040","Gardner","CO","37.777997","-105.20072","-7","1"
+"81041","Granada","CO","37.962678","-102.33025","-7","1"
+"81042","Gulnare","CO","37.315263","-104.73461","-7","1"
+"81043","Hartman","CO","38.119932","-102.21952","-7","1"
+"81044","Hasty","CO","38.039941","-102.94569","-7","1"
+"81045","Haswell","CO","38.45313","-103.16965","-7","1"
+"81046","Hoehne","CO","37.279584","-104.358375","-7","1"
+"81047","Holly","CO","38.060575","-102.19677","-7","1"
+"81049","Kim","CO","37.242629","-103.47108","-7","1"
+"81050","La Junta","CO","37.995879","-103.54001","-7","1"
+"81052","Lamar","CO","38.08759","-102.61855","-7","1"
+"81054","Las Animas","CO","38.037435","-103.18631","-7","1"
+"81055","La Veta","CO","37.499829","-105.02943","-7","1"
+"81057","McClave","CO","38.136132","-102.88325","-7","1"
+"81058","Manzanola","CO","38.107593","-103.86848","-7","1"
+"81059","Model","CO","37.513166","-104.02959","-7","1"
+"81062","Olney Springs","CO","38.193937","-103.92275","-7","1"
+"81063","Ordway","CO","38.253191","-103.76209","-7","1"
+"81064","Pritchett","CO","37.315497","-102.95462","-7","1"
+"81066","Red Wing","CO","37.730256","-105.31806","-7","1"
+"81067","Rocky Ford","CO","38.042083","-103.72231","-7","1"
+"81069","Rye","CO","37.909758","-104.89892","-7","1"
+"81071","Sheridan Lake","CO","38.44672","-102.24844","-7","1"
+"81073","Springfield","CO","37.409787","-102.61726","-7","1"
+"81074","Starkville","CO","37.121029","-104.523155","-7","1"
+"81076","Sugar City","CO","38.26144","-103.67101","-7","1"
+"81077","Swink","CO","38.015189","-103.62827","-7","1"
+"81079","Colorado City","CO","37.951881","-104.858227","-7","1"
+"81081","Trinchera","CO","37.096255","-104.14826","-7","1"
+"81082","Trinidad","CO","37.191882","-104.47809","-7","1"
+"81084","Two Buttes","CO","37.567773","-102.39192","-7","1"
+"81087","Vilas","CO","37.377938","-102.42882","-7","1"
+"81089","Walsenburg","CO","37.621071","-104.80456","-7","1"
+"81090","Walsh","CO","37.347009","-102.26776","-7","1"
+"81091","Weston","CO","37.193451","-104.97188","-7","1"
+"81092","Wiley","CO","38.17924","-102.75161","-7","1"
+"81101","Alamosa","CO","37.471802","-105.83471","-7","1"
+"81102","Alamosa","CO","37.476026","-105.881779","-7","1"
+"81120","Antonito","CO","37.086403","-106.08325","-7","1"
+"81121","Arboles","CO","37.039131","-107.42271","-7","1"
+"81122","Bayfield","CO","37.329743","-107.59026","-7","1"
+"81123","Blanca","CO","37.419263","-105.58024","-7","1"
+"81124","Capulin","CO","37.291966","-106.12085","-7","1"
+"81125","Center","CO","37.773899","-106.08966","-7","1"
+"81126","Chama","CO","37.175339","-105.34164","-7","1"
+"81127","Chimney Rock","CO","37.218131","-107.34452","-7","1"
+"81128","Chromo","CO","37.086533","-106.75491","-7","1"
+"81129","Conejos","CO","37.101134","-106.02648","-7","1"
+"81130","Creede","CO","37.705276","-106.95429","-7","1"
+"81131","Crestone","CO","37.945768","-105.69706","-7","1"
+"81132","Del Norte","CO","37.731981","-106.39774","-7","1"
+"81133","Fort Garland","CO","37.375698","-105.37293","-7","1"
+"81134","Garcia","CO","37.092195","-105.530023","-7","1"
+"81135","Homelake","CO","37.615741","-106.375292","-7","1"
+"81136","Hooper","CO","37.779885","-105.81264","-7","1"
+"81137","Ignacio","CO","37.099348","-107.64223","-7","1"
+"81138","Jaroso","CO","37.197731","-105.429395","-7","1"
+"81140","La Jara","CO","37.274108","-106.05178","-7","1"
+"81141","Manassa","CO","37.144944","-105.90161","-7","1"
+"81143","Moffat","CO","38.142453","-105.91579","-7","1"
+"81144","Monte Vista","CO","37.569501","-106.14946","-7","1"
+"81146","Mosca","CO","37.620038","-105.73101","-7","1"
+"81147","Pagosa Springs","CO","37.241179","-107.11287","-7","1"
+"81148","Romeo","CO","37.171583","-105.98648","-7","1"
+"81149","Saguache","CO","38.120209","-106.22626","-7","1"
+"81151","Sanford","CO","37.23354","-105.7477","-7","1"
+"81152","San Luis","CO","37.134458","-105.54778","-7","1"
+"81153","San Pablo","CO","37.127132","-105.3675","-7","1"
+"81154","South Fork","CO","37.671046","-106.63177","-7","1"
+"81155","Villa Grove","CO","38.327695","-106.14476","-7","1"
+"81157","Pagosa Springs","CO","37.270438","-107.093153","-7","1"
+"81201","Salida","CO","38.533464","-106.03468","-7","1"
+"81210","Almont","CO","38.778749","-106.62831","-7","1"
+"81211","Buena Vista","CO","38.867111","-106.14664","-7","1"
+"81212","Canon City","CO","38.464212","-105.27973","-7","1"
+"81215","Canon City","CO","38.477563","-105.476577","-7","1"
+"81220","Cimarron","CO","38.321598","-107.4166","-7","1"
+"81221","Coal Creek","CO","38.36154","-105.14752","-7","1"
+"81222","Coaldale","CO","38.374462","-105.76738","-7","1"
+"81223","Cotopaxi","CO","38.357344","-105.53192","-7","1"
+"81224","Crested Butte","CO","38.865307","-106.96556","-7","1"
+"81225","Crested Butte","CO","38.901649","-106.96755","-7","1"
+"81226","Florence","CO","38.387091","-105.1226","-7","1"
+"81227","Monarch","CO","38.545757","-106.243422","-7","1"
+"81228","Granite","CO","39.030747","-106.256615","-7","1"
+"81230","Gunnison","CO","38.464132","-106.95776","-7","1"
+"81231","Gunnison","CO","38.702309","-106.940201","-7","1"
+"81232","Hillside","CO","38.285533","-105.642451","-7","1"
+"81233","Howard","CO","38.442267","-105.85054","-7","1"
+"81235","Lake City","CO","37.961233","-107.29953","-7","1"
+"81236","Nathrop","CO","38.720234","-106.18801","-7","1"
+"81237","Ohio City","CO","38.590788","-106.602838","-7","1"
+"81239","Parlin","CO","38.618553","-106.54811","-7","1"
+"81240","Penrose","CO","38.439499","-105.02111","-7","1"
+"81241","Pitkin","CO","38.607617","-106.52037","-7","1"
+"81242","Poncha Springs","CO","38.471892","-106.097284","-7","1"
+"81243","Powderhorn","CO","38.249778","-107.15542","-7","1"
+"81244","Rockvale","CO","38.353064","-105.18642","-7","1"
+"81246","Canon City","CO","38.477563","-105.476577","-7","1"
+"81247","Gunnison","CO","38.457513","-107.292081","-7","1"
+"81248","Sargents","CO","38.410975","-106.47812","-7","1"
+"81251","Twin Lakes","CO","39.096394","-106.32916","-7","1"
+"81252","Westcliffe","CO","38.130741","-105.45798","-7","1"
+"81253","Wetmore","CO","38.186991","-105.07615","-7","1"
+"81260","Basalt","CO","39.361605","-107.025486","-7","1"
+"81290","Florence","CO","38.358421","-105.106881","-7","1"
+"81301","Durango","CO","37.295888","-107.84945","-7","1"
+"81302","Durango","CO","37.357249","-107.935945","-7","1"
+"81303","Durango","CO","37.222311","-107.653131","-7","1"
+"81310","Durango","CO","37.28211","-107.856609","-7","1"
+"81320","Cahone","CO","37.696224","-108.78271","-7","1"
+"81321","Cortez","CO","37.344985","-108.60355","-7","1"
+"81323","Dolores","CO","37.515311","-108.45204","-7","1"
+"81324","Dove Creek","CO","37.775543","-108.92455","-7","1"
+"81325","Egnar","CO","38.027131","-108.83162","-7","1"
+"81326","Hesperus","CO","37.131282","-108.15728","-7","1"
+"81327","Lewis","CO","37.534825","-108.65188","-7","1"
+"81328","Mancos","CO","37.363564","-108.29691","-7","1"
+"81329","Marvel","CO","37.092605","-108.125194","-7","1"
+"81330","Mesa Verde National Park","CO","37.237814","-108.50424","-7","1"
+"81331","Pleasant View","CO","37.590205","-108.76998","-7","1"
+"81332","Rico","CO","37.713158","-108.02585","-7","1"
+"81334","Towaoc","CO","37.178946","-108.88769","-7","1"
+"81335","Yellow Jacket","CO","37.508184","-108.78311","-7","1"
+"81401","Montrose","CO","38.436409","-107.8625","-7","1"
+"81402","Montrose","CO","38.485093","-107.885975","-7","1"
+"81410","Austin","CO","38.79053","-107.97404","-7","1"
+"81411","Bedrock","CO","38.318109","-108.92858","-7","1"
+"81413","Cedaredge","CO","38.941926","-107.92669","-7","1"
+"81414","Cory","CO","38.788697","-107.986174","-7","1"
+"81415","Crawford","CO","38.636112","-107.59315","-7","1"
+"81416","Delta","CO","38.733901","-108.08219","-7","1"
+"81418","Eckert","CO","38.842439","-107.96085","-7","1"
+"81419","Hotchkiss","CO","38.819199","-107.73704","-7","1"
+"81420","Lazear","CO","38.781745","-107.780778","-7","1"
+"81421","Maher","CO","38.942927","-107.939831","-7","1"
+"81422","Naturita","CO","38.296229","-108.68079","-7","1"
+"81423","Norwood","CO","38.082231","-108.2586","-7","1"
+"81424","Nucla","CO","38.29545","-108.50164","-7","1"
+"81425","Olathe","CO","38.605432","-108.0098","-7","1"
+"81426","Ophir","CO","37.860092","-107.86975","-7","1"
+"81427","Ouray","CO","38.016388","-107.67438","-7","1"
+"81428","Paonia","CO","38.877695","-107.58799","-7","1"
+"81429","Paradox","CO","38.371101","-108.969823","-7","1"
+"81430","Placerville","CO","38.08677","-108.00332","-7","1"
+"81431","Redvale","CO","38.153484","-108.43921","-7","1"
+"81432","Ridgway","CO","38.131449","-107.77322","-7","1"
+"81433","Silverton","CO","37.868294","-107.62223","-7","1"
+"81434","Somerset","CO","38.994185","-107.35526","-7","1"
+"81435","Telluride","CO","37.932874","-107.88874","-7","1"
+"81501","Grand Junction","CO","39.072831","-108.55","-7","1"
+"81502","Grand Junction","CO","39.017876","-108.481354","-7","1"
+"81503","Grand Junction","CO","39.059221","-108.58311","-7","1"
+"81504","Grand Junction","CO","39.085481","-108.49019","-7","1"
+"81505","Grand Junction","CO","39.112514","-108.60506","-7","1"
+"81506","Grand Junction","CO","39.106039","-108.54679","-7","1"
+"81516","Snowmass Village","CO","39.225729","-106.937134","-7","1"
+"81520","Clifton","CO","39.085981","-108.44444","-7","1"
+"81521","Fruita","CO","39.159971","-108.72071","-7","1"
+"81522","Gateway","CO","38.715101","-109.01087","-7","1"
+"81523","Glade Park","CO","38.958934","-108.85126","-7","1"
+"81524","Loma","CO","39.238633","-108.78893","-7","1"
+"81525","Mack","CO","39.244427","-108.93781","-7","1"
+"81526","Palisade","CO","39.1013","-108.367","-7","1"
+"81527","Whitewater","CO","38.833235","-108.58155","-7","1"
+"81601","Glenwood Springs","CO","39.533318","-107.32107","-7","1"
+"81602","Glenwood Springs","CO","39.511742","-107.325336","-7","1"
+"81610","Dinosaur","CO","40.334542","-108.76266","-7","1"
+"81611","Aspen","CO","39.196857","-106.8191","-7","1"
+"81612","Aspen","CO","39.223416","-106.882774","-7","1"
+"81613","Snowmass Village","CO","39.212626","-106.941907","-7","1"
+"81615","Snowmass Village","CO","39.214104","-106.94528","-7","1"
+"81620","Avon","CO","39.63298","-106.51534","-7","1"
+"81621","Basalt","CO","39.379423","-106.97082","-7","1"
+"81623","Carbondale","CO","39.335504","-107.1882","-7","1"
+"81624","Collbran","CO","39.220166","-107.93414","-7","1"
+"81625","Craig","CO","40.566113","-107.60818","-7","1"
+"81626","Craig","CO","40.667669","-107.783276","-7","1"
+"81628","El Jebel","CO","39.39787","-107.089239","-7","1"
+"81630","De Beque","CO","39.378823","-108.34069","-7","1"
+"81631","Eagle","CO","39.622314","-106.7751","-7","1"
+"81632","Edwards","CO","39.620748","-106.6148","-7","1"
+"81633","Dinosaur","CO","40.377031","-108.398991","-7","1"
+"81635","Parachute","CO","39.493283","-108.11571","-7","1"
+"81636","Battlement Mesa","CO","39.430535","-108.023924","-7","1"
+"81637","Gypsum","CO","39.690233","-107.02552","-7","1"
+"81638","Hamilton","CO","40.298366","-107.51756","-7","1"
+"81639","Hayden","CO","40.48806","-107.26093","-7","1"
+"81640","Maybell","CO","40.594344","-108.39974","-7","1"
+"81641","Meeker","CO","40.042797","-107.92158","-7","1"
+"81642","Meredith","CO","39.342438","-106.63444","-7","1"
+"81643","Mesa","CO","39.102266","-108.16033","-7","1"
+"81645","Minturn","CO","39.459323","-106.37859","-7","1"
+"81646","Molina","CO","39.139927","-108.00498","-7","1"
+"81647","New Castle","CO","39.567059","-107.54974","-7","1"
+"81648","Rangely","CO","40.011447","-108.77528","-7","1"
+"81649","Red Cliff","CO","39.451885","-106.32403","-7","1"
+"81650","Rifle","CO","39.603225","-107.89755","-7","1"
+"81652","Silt","CO","39.508481","-107.66873","-7","1"
+"81653","Slater","CO","40.929768","-107.18886","-7","1"
+"81654","Snowmass","CO","39.254607","-106.97888","-7","1"
+"81655","Wolcott","CO","39.731182","-106.62705","-7","1"
+"81656","Woody Creek","CO","39.30179","-106.81878","-7","1"
+"81657","Vail","CO","39.634566","-106.37077","-7","1"
+"81658","Vail","CO","39.624171","-106.497314","-7","1"
+"82001","Cheyenne","WY","41.141281","-104.80208","-7","1"
+"82002","Cheyenne","WY","41.327351","-104.666365","-7","1"
+"82003","Cheyenne","WY","41.219107","-104.661244","-7","1"
+"82005","Fe Warren AFB","WY","41.139057","-104.862947","-7","1"
+"82006","Cheyenne","WY","41.327351","-104.666365","-7","1"
+"82007","Cheyenne","WY","41.101731","-104.80582","-7","1"
+"82008","Cheyenne","WY","41.327351","-104.666365","-7","1"
+"82009","Cheyenne","WY","41.275932","-104.88279","-7","1"
+"82010","Cheyenne","WY","41.327351","-104.666365","-7","1"
+"82050","Albin","WY","41.425769","-104.18805","-7","1"
+"82051","Bosler","WY","41.601379","-105.65207","-7","1"
+"82052","Buford","WY","41.105595","-105.3549","-7","1"
+"82053","Burns","WY","41.209041","-104.35907","-7","1"
+"82054","Carpenter","WY","41.064212","-104.34107","-7","1"
+"82055","Centennial","WY","41.33144","-106.17649","-7","1"
+"82058","Garrett","WY","42.22772","-105.66184","-7","1"
+"82059","Granite Canon","WY","41.051097","-105.19216","-7","1"
+"82060","Hillsdale","WY","41.210012","-104.48095","-7","1"
+"82061","Horse Creek","WY","41.422733","-105.19881","-7","1"
+"82063","Jelm","CO","40.932966","-105.87705","-7","1"
+"82070","Laramie","WY","41.232815","-105.75364","-7","1"
+"82071","Laramie","WY","41.715061","-105.797388","-7","1"
+"82072","Laramie","WY","41.344843","-105.58626","-7","1"
+"82073","Laramie","WY","41.307065","-105.624667","-7","1"
+"82081","Meriden","WY","41.552531","-104.39118","-7","1"
+"82082","Pine Bluffs","NE","41.181106","-104.00078","-7","1"
+"82083","Rock River","WY","41.724691","-105.99071","-7","1"
+"82084","Tie Siding","WY","41.024827","-105.46188","-7","1"
+"82190","Yellowstone National Park","WY","44.890668","-110.89421","-7","1"
+"82201","Wheatland","WY","42.038694","-105.05069","-7","1"
+"82210","Chugwater","WY","41.742212","-104.82923","-7","1"
+"82212","Fort Laramie","WY","42.321548","-104.53453","-7","1"
+"82213","Glendo","WY","42.489239","-104.97591","-7","1"
+"82214","Guernsey","WY","42.27774","-104.76034","-7","1"
+"82215","Hartville","WY","42.382338","-104.71135","-7","1"
+"82217","Hawk Springs","WY","41.76916","-104.24488","-7","1"
+"82218","Huntley","WY","41.865935","-104.11451","-7","1"
+"82219","Jay Em","WY","42.507335","-104.4242","-7","1"
+"82221","Lagrange","WY","41.646277","-104.2877","-7","1"
+"82222","Lance Creek","WY","43.149226","-104.61635","-7","1"
+"82223","Lingle","WY","42.121155","-104.37708","-7","1"
+"82224","Lost Springs","WY","42.792664","-104.94156","-7","1"
+"82225","Lusk","WY","43.034269","-104.35784","-7","1"
+"82226","Lusk","WY","42.757317","-104.448288","-7","1"
+"82227","Manville","WY","42.785056","-104.75034","-7","1"
+"82229","Shawnee","WY","42.787675","-105.063337","-7","1"
+"82240","Torrington","WY","42.119328","-104.19228","-7","1"
+"82242","Van Tassell","WY","42.706475","-104.12045","-7","1"
+"82243","Veteran","WY","41.979994","-104.38969","-7","1"
+"82244","Yoder","WY","41.907756","-104.3721","-7","1"
+"82301","Rawlins","WY","41.971581","-107.29475","-7","1"
+"82310","Jeffrey City","WY","42.444748","-107.7646","-7","1"
+"82321","Baggs","WY","41.347337","-107.71062","-7","1"
+"82322","Bairoil","WY","42.180259","-107.73911","-7","1"
+"82323","Dixon","WY","41.034747","-107.53257","-7","1"
+"82324","Elk Mountain","WY","41.620507","-106.43594","-7","1"
+"82325","Encampment","WY","41.159654","-106.66284","-7","1"
+"82327","Hanna","WY","42.041677","-106.60352","-7","1"
+"82329","Medicine Bow","WY","42.196315","-106.32113","-7","1"
+"82331","Saratoga","WY","41.475612","-106.75888","-7","1"
+"82332","Savery","WY","41.330666","-107.23106","-7","1"
+"82334","Sinclair","WY","41.780239","-107.117226","-7","1"
+"82335","Walcott","WY","41.804594","-106.78063","-7","1"
+"82336","Wamsutter","WY","41.765078","-108.16076","-7","1"
+"82354","Sinclair","WY","41.778225","-107.119867","-7","1"
+"82401","Worland","WY","43.993124","-107.97365","-7","1"
+"82410","Basin","WY","44.369517","-108.04905","-7","1"
+"82411","Burlington","WY","44.436009","-108.44195","-7","1"
+"82412","Byron","WY","44.794477","-108.53415","-7","1"
+"82414","Cody","WY","44.566114","-109.20826","-7","1"
+"82420","Cowley","WY","44.929728","-108.45634","-7","1"
+"82421","Deaver","WY","44.909434","-108.58917","-7","1"
+"82422","Emblem","WY","44.498455","-108.3809","-7","1"
+"82423","Frannie","WY","44.979667","-108.64076","-7","1"
+"82426","Greybull","WY","44.500759","-108.03102","-7","1"
+"82427","Hamilton Dome","WY","43.76976","-108.454106","-7","1"
+"82428","Hyattville","WY","44.255087","-107.63702","-7","1"
+"82430","Kirby","WY","43.808024","-108.18385","-7","1"
+"82431","Lovell","WY","44.791974","-108.32833","-7","1"
+"82432","Manderson","WY","44.24825","-107.9263","-7","1"
+"82433","Meeteetse","WY","44.20528","-108.92718","-7","1"
+"82434","Otto","WY","44.396661","-108.28605","-7","1"
+"82435","Powell","WY","44.789953","-108.86789","-7","1"
+"82440","Ralston","WY","44.718546","-108.86538","-7","1"
+"82441","Shell","WY","44.632199","-107.67034","-7","1"
+"82442","Ten Sleep","WY","43.885863","-107.36569","-7","1"
+"82443","Thermopolis","WY","43.694009","-108.31942","-7","1"
+"82450","Wapiti","WY","44.463071","-109.415501","-7","1"
+"82501","Riverton","WY","43.013826","-108.34879","-7","1"
+"82504","Vista West","WY","42.878665","-106.438937","-7","1"
+"82510","Arapahoe","WY","42.981091","-108.60194","-7","1"
+"82512","Crowheart","WY","43.428698","-109.21806","-7","1"
+"82513","Dubois","WY","43.557529","-109.70709","-7","1"
+"82514","Fort Washakie","WY","42.971973","-108.92886","-7","1"
+"82515","Hudson","WY","42.86682","-108.53339","-7","1"
+"82516","Kinnear","WY","43.14687","-108.89349","-7","1"
+"82520","Lander","WY","42.729832","-108.63154","-7","1"
+"82523","Pavillion","WY","43.312211","-108.56038","-7","1"
+"82524","Saint Stephens","WY","42.998588","-108.57191","-7","1"
+"82601","Casper","WY","42.896822","-106.29799","-7","1"
+"82602","Casper","WY","42.889576","-106.35696","-7","1"
+"82604","Casper","WY","42.791242","-106.53986","-7","1"
+"82605","Casper","WY","42.966192","-106.807047","-7","1"
+"82609","Casper","WY","42.844915","-106.27255","-7","1"
+"82615","Shirley Basin","WY","41.71694","-106.999195","-7","1"
+"82620","Alcova","WY","42.65723","-107.12523","-7","1"
+"82630","Arminto","WY","42.966192","-106.807047","-7","1"
+"82631","Bill","WY","42.894249","-105.485243","-7","1"
+"82633","Douglas","WY","42.935874","-105.37303","-7","1"
+"82635","Edgerton","WY","43.410459","-106.2421","-7","1"
+"82636","Evansville","WY","42.828639","-106.15952","-7","1"
+"82637","Glenrock","WY","42.796442","-105.91078","-7","1"
+"82638","Hiland","WY","42.966192","-106.807047","-7","1"
+"82639","Kaycee","WY","43.602698","-106.65945","-7","1"
+"82640","Linch","WY","43.551448","-106.14153","-7","1"
+"82642","Lysite","WY","43.228052","-107.68195","-7","1"
+"82643","Midwest","WY","43.363864","-106.27476","-7","1"
+"82644","Mills","WY","42.842615","-106.37103","-7","1"
+"82646","Natrona","WY","42.966192","-106.807047","-7","1"
+"82648","Powder River","WY","42.966192","-106.807047","-7","1"
+"82649","Shoshoni","WY","43.232318","-108.15555","-7","1"
+"82701","Newcastle","WY","43.738237","-104.44387","-7","1"
+"82703","Laramie","WY","41.327892","-105.616339","-7","1"
+"82710","Aladdin","WY","44.776684","-104.22425","-7","1"
+"82711","Alva","WY","44.706167","-104.45138","-7","1"
+"82712","Beulah","WY","44.447058","-104.12853","-7","1"
+"82713","Carlile","WY","44.525891","-104.767846","-7","1"
+"82714","Devils Tower","WY","44.553925","-104.68992","-7","1"
+"82715","Four Corners","WY","43.840033","-104.568128","-7","1"
+"82716","Gillette","WY","44.356533","-105.52661","-7","1"
+"82717","Gillette","WY","44.374954","-105.38624","-7","1"
+"82718","Gillette","WY","43.939968","-105.52445","-7","1"
+"82720","Hulett","WY","44.81103","-104.72952","-7","1"
+"82721","Moorcroft","WY","44.453553","-104.92334","-7","1"
+"82723","Osage","WY","43.992349","-104.45121","-7","1"
+"82725","Recluse","WY","44.876211","-105.74228","-7","1"
+"82727","Rozet","WY","44.221574","-105.23842","-7","1"
+"82729","Sundance","WY","44.376421","-104.398","-7","1"
+"82730","Upton","WY","44.062053","-104.71043","-7","1"
+"82731","Weston","WY","44.799642","-105.24695","-7","1"
+"82732","Wright","WY","43.715486","-105.35878","-7","1"
+"82779","Sundance","WY","44.408744","-104.371298","-7","1"
+"82801","Sheridan","WY","44.801249","-106.96782","-7","1"
+"82831","Arvada","WY","44.681337","-106.08209","-7","1"
+"82832","Banner","WY","44.602518","-106.76367","-7","1"
+"82833","Big Horn","WY","44.615453","-107.10625","-7","1"
+"82834","Buffalo","WY","44.301141","-106.67638","-7","1"
+"82835","Clearmont","WY","44.770838","-106.42404","-7","1"
+"82836","Dayton","WY","44.787512","-107.48172","-7","1"
+"82837","Leiter","WY","44.74323","-106.23963","-7","1"
+"82838","Parkman","WY","44.947602","-107.38903","-7","1"
+"82839","Ranchester","WY","44.889239","-107.14202","-7","1"
+"82840","Saddlestring","WY","44.497609","-106.870963","-7","1"
+"82842","Story","WY","44.576978","-106.9081","-7","1"
+"82844","Wolf","WY","44.788759","-107.21937","-7","1"
+"82845","Wyarno","WY","44.725332","-106.66324","-7","1"
+"82901","Rock Springs","WY","41.594542","-109.16304","-7","1"
+"82902","Rock Springs","WY","41.631408","-108.963931","-7","1"
+"82922","Bondurant","WY","43.1856","-110.38625","-7","1"
+"82923","Boulder","WY","42.75073","-109.61933","-7","1"
+"82925","Cora","WY","43.081275","-109.92672","-7","1"
+"82929","Little America","WY","41.587387","-109.82274","-7","1"
+"82930","Evanston","WY","41.267546","-110.90607","-7","1"
+"82931","Evanston","WY","41.261943","-110.919995","-7","1"
+"82932","Farson","WY","42.026986","-109.40903","-7","1"
+"82933","Fort Bridger","WY","41.299766","-110.43728","-7","1"
+"82934","Granger","WY","41.610852","-109.97361","-7","1"
+"82935","Green River","WY","41.659162","-109.63919","-7","1"
+"82936","Lontetree","WY","41.081086","-110.22391","-7","1"
+"82937","Lyman","WY","41.399751","-110.36624","-7","1"
+"82938","McKinnon","WY","41.181959","-109.48709","-7","1"
+"82939","Mountain View","WY","41.246498","-110.33778","-7","1"
+"82941","Pinedale","WY","42.874606","-109.85694","-7","1"
+"82942","Point Of Rocks","WY","41.689968","-108.81963","-7","1"
+"82943","Reliance","WY","41.702635","-109.22044","-7","1"
+"82944","Robertson","WY","41.10401","-110.53733","-7","1"
+"82945","Superior","WY","41.761851","-108.97139","-7","1"
+"83001","Jackson","WY","43.468383","-110.75714","-7","1"
+"83002","Jackson","WY","43.50537","-110.786527","-7","1"
+"83011","Kelly","WY","43.639867","-110.57908","-7","1"
+"83012","Moose","WY","43.701492","-110.83215","-7","1"
+"83013","Moran","WY","44.04215","-110.97876","-7","1"
+"83014","Wilson","WY","43.520413","-110.86418","-7","1"
+"83025","Teton Village","WY","43.443851","-110.694002","-7","1"
+"83101","Kemmerer","WY","41.890875","-110.40687","-7","1"
+"83110","Afton","WY","42.681301","-110.92196","-7","1"
+"83111","Auburn","WY","42.801664","-111.0048","-7","1"
+"83112","Bedford","WY","42.877387","-110.92859","-7","1"
+"83113","Big Piney","WY","42.557035","-110.11482","-7","1"
+"83114","Cokeville","WY","42.039281","-110.85188","-7","1"
+"83115","Daniel","WY","42.926318","-110.18889","-7","1"
+"83116","Diamondville","WY","41.779266","-110.53868","-7","1"
+"83118","Etna","WY","43.062245","-111.01917","-7","1"
+"83119","Fairview","WY","42.683338","-110.99847","-7","1"
+"83120","Freedom","ID","43.001889","-111.0932","-7","1"
+"83121","Frontier","WY","41.814385","-110.53743","-7","1"
+"83122","Grover","WY","42.803357","-110.93182","-7","1"
+"83123","La Barge","WY","42.243979","-110.24195","-7","1"
+"83124","Opal","WY","41.767699","-110.27732","-7","1"
+"83126","Smoot","WY","42.607888","-110.91808","-7","1"
+"83127","Thayne","WY","42.96067","-110.98262","-7","1"
+"83128","Alpine","WY","43.129462","-110.93247","-7","1"
+"83201","Pocatello","ID","42.883214","-112.43968","-7","1"
+"83202","Pocatello","ID","42.96866","-112.43182","-7","1"
+"83203","Fort Hall","ID","43.040466","-112.48638","-7","1"
+"83204","Pocatello","ID","42.847727","-112.50329","-7","1"
+"83205","Pocatello","ID","42.80616","-112.410283","-7","1"
+"83206","Pocatello","ID","42.639474","-112.313836","-7","1"
+"83209","Pocatello","ID","42.639474","-112.313836","-7","1"
+"83210","Aberdeen","ID","42.97228","-112.83218","-7","1"
+"83211","American Falls","ID","42.75159","-112.91931","-7","1"
+"83212","Arbon","ID","42.514471","-112.54626","-7","1"
+"83213","Arco","ID","43.65183","-113.31639","-7","1"
+"83214","Arimo","ID","42.539952","-112.23971","-7","1"
+"83215","Atomic City","ID","43.442618","-112.81316","-7","1"
+"83217","Bancroft","ID","42.768812","-111.87207","-7","1"
+"83218","Basalt","ID","43.317823","-112.16356","-7","1"
+"83220","Bern","ID","42.339083","-111.37641","-7","1"
+"83221","Blackfoot","ID","43.211238","-112.39454","-7","1"
+"83223","Bloomington","ID","42.188641","-111.40853","-7","1"
+"83226","Challis","ID","44.53742","-114.18803","-7","1"
+"83227","Clayton","ID","44.20719","-114.5981","-7","1"
+"83228","Clifton","ID","42.213131","-112.01429","-7","1"
+"83229","Cobalt","ID","44.968059","-113.816735","-7","1"
+"83230","Conda","ID","42.719102","-111.596651","-7","1"
+"83232","Dayton","ID","42.129892","-111.97605","-7","1"
+"83233","Dingle","ID","42.177359","-111.217381","-7","1"
+"83234","Downey","ID","42.43627","-112.11647","-7","1"
+"83235","Ellis","ID","44.633935","-113.99217","-7","1"
+"83236","Firth","ID","43.287888","-112.12765","-7","1"
+"83237","Franklin","ID","42.021688","-111.79977","-7","1"
+"83238","Geneva","ID","42.324873","-111.09002","-7","1"
+"83239","Georgetown","ID","42.483479","-111.35333","-7","1"
+"83241","Grace","ID","42.525021","-111.7509","-7","1"
+"83243","Holbrook","ID","42.217418","-112.64211","-7","1"
+"83244","Howe","ID","43.854175","-113.04362","-7","1"
+"83245","Inkom","ID","42.79471","-112.23562","-7","1"
+"83246","Lava Hot Springs","ID","42.616477","-112.01889","-7","1"
+"83250","McCammon","ID","42.659404","-112.21484","-7","1"
+"83251","Mackay","ID","43.969772","-113.74907","-7","1"
+"83252","Malad City","ID","42.192579","-112.32902","-7","1"
+"83253","May","ID","44.486997","-113.80293","-7","1"
+"83254","Montpelier","ID","42.327996","-111.32637","-7","1"
+"83255","Moore","ID","43.774709","-113.45086","-7","1"
+"83256","Moreland","ID","43.222648","-112.442253","-7","1"
+"83261","Paris","ID","42.22771","-111.39651","-7","1"
+"83262","Pingree","ID","43.115708","-112.59511","-7","1"
+"83263","Preston","ID","42.165399","-111.82369","-7","1"
+"83271","Rockland","ID","42.542266","-112.84484","-7","1"
+"83272","Saint Charles","ID","42.127915","-111.3922","-7","1"
+"83274","Shelley","ID","43.366017","-112.11712","-7","1"
+"83276","Soda Springs","ID","42.693133","-111.57731","-7","1"
+"83277","Springfield","ID","43.074319","-112.68229","-7","1"
+"83278","Stanley","ID","44.248203","-114.93551","-7","1"
+"83281","Swanlake","ID","42.305798","-111.96206","-7","1"
+"83283","Thatcher","ID","42.344123","-111.67297","-7","1"
+"83285","Wayan","ID","43.027278","-111.22042","-7","1"
+"83286","Weston","ID","42.055593","-111.98144","-7","1"
+"83287","Fish Haven","ID","42.021829","-111.42742","-7","1"
+"83301","Twin Falls","ID","42.530288","-114.47509","-7","1"
+"83302","Rogerson","ID","42.096094","-115.02366","-7","1"
+"83303","Twin Falls","ID","42.456273","-114.519536","-7","1"
+"83311","Albion","ID","42.390977","-113.59744","-7","1"
+"83312","Almo","ID","42.08685","-113.64135","-7","1"
+"83313","Bellevue","ID","43.39918","-114.25865","-7","1"
+"83314","Bliss","ID","42.937947","-114.95287","-7","1"
+"83316","Buhl","ID","42.596953","-114.81886","-7","1"
+"83318","Burley","ID","42.496588","-113.79857","-7","1"
+"83320","Carey","ID","43.356224","-113.89078","-7","1"
+"83321","Castleford","ID","42.371508","-114.90993","-7","1"
+"83322","Corral","ID","43.377947","-114.96964","-7","1"
+"83323","Declo","ID","42.510364","-113.41808","-7","1"
+"83324","Dietrich","ID","42.883302","-114.2441","-7","1"
+"83325","Eden","ID","42.59465","-114.25578","-7","1"
+"83327","Fairfield","ID","43.365909","-114.77559","-7","1"
+"83328","Filer","ID","42.565542","-114.61919","-7","1"
+"83330","Gooding","ID","42.944346","-114.70605","-7","1"
+"83332","Hagerman","ID","42.811892","-114.9251","-7","1"
+"83333","Hailey","ID","43.527659","-114.31153","-7","1"
+"83334","Hansen","ID","42.482046","-114.299","-7","1"
+"83335","Hazelton","ID","42.599276","-114.05941","-7","1"
+"83336","Heyburn","ID","42.562839","-113.7864","-7","1"
+"83337","Hill City","ID","43.312973","-115.04088","-7","1"
+"83338","Jerome","ID","42.710124","-114.46394","-7","1"
+"83340","Ketchum","ID","43.750744","-114.5198","-7","1"
+"83341","Kimberly","ID","42.509557","-114.37441","-7","1"
+"83342","Malta","ID","42.232525","-113.35296","-7","1"
+"83343","Minidoka","ID","42.772955","-113.509762","-7","1"
+"83344","Murtaugh","ID","42.444159","-114.12157","-7","1"
+"83346","Oakley","ID","42.261085","-113.8869","-7","1"
+"83347","Paul","ID","42.71554","-113.86281","-7","1"
+"83348","Picabo","ID","43.304395","-114.06444","-7","1"
+"83349","Richfield","ID","43.078896","-114.18795","-7","1"
+"83350","Rupert","ID","42.671054","-113.62976","-7","1"
+"83352","Shoshone","ID","43.036666","-114.40997","-7","1"
+"83353","Sun Valley","ID","43.661373","-114.18191","-7","1"
+"83354","Sun Valley","ID","43.681156","-114.33214","-7","1"
+"83355","Wendell","ID","42.76079","-114.71025","-7","1"
+"83401","Idaho Falls","ID","43.528891","-111.98136","-7","1"
+"83402","Idaho Falls","ID","43.497685","-112.07391","-7","1"
+"83403","Idaho Falls","ID","43.421132","-111.333376","-7","1"
+"83404","Idaho Falls","ID","43.465998","-112.01425","-7","1"
+"83405","Idaho Falls","ID","43.323306","-111.782152","-7","1"
+"83406","Idaho Falls","ID","43.458004","-111.95925","-7","1"
+"83415","Idaho Falls","ID","43.323306","-111.782152","-7","1"
+"83420","Ashton","ID","44.060947","-111.40548","-7","1"
+"83421","Chester","ID","44.004709","-111.55527","-7","1"
+"83422","Driggs","ID","43.726688","-111.11484","-7","1"
+"83423","Dubois","ID","44.164718","-112.34258","-7","1"
+"83424","Felt","ID","43.882935","-111.21512","-7","1"
+"83425","Hamer","ID","43.951754","-112.23219","-7","1"
+"83427","Iona","ID","43.403744","-111.83881","-7","1"
+"83428","Irwin","ID","43.369671","-111.23417","-7","1"
+"83429","Island Park","ID","44.490674","-111.36631","-7","1"
+"83431","Lewisville","ID","43.694827","-112.01477","-7","1"
+"83433","Macks Inn","ID","44.496112","-111.32682","-7","1"
+"83434","Menan","ID","43.759605","-111.99508","-7","1"
+"83435","Monteview","ID","43.964437","-112.54642","-7","1"
+"83436","Newdale","ID","43.879722","-111.49617","-7","1"
+"83438","Parker","ID","44.319199","-111.60171","-7","1"
+"83440","Rexburg","ID","43.80991","-111.80942","-7","1"
+"83441","Rexburg","ID","43.776095","-111.691047","-7","1"
+"83442","Rigby","ID","43.67511","-111.87407","-7","1"
+"83443","Ririe","ID","43.570104","-111.59911","-7","1"
+"83444","Roberts","ID","43.722695","-112.15002","-7","1"
+"83445","Saint Anthony","ID","43.957025","-111.70208","-7","1"
+"83446","Spencer","ID","44.397984","-112.20206","-7","1"
+"83447","Squirrel","ID","44.319199","-111.60171","-7","1"
+"83448","Sugar City","ID","43.860023","-111.70879","-7","1"
+"83449","Swan Valley","ID","43.450364","-111.33201","-7","1"
+"83450","Terreton","ID","43.857435","-112.42474","-7","1"
+"83451","Teton","ID","43.890719","-111.64522","-7","1"
+"83452","Tetonia","ID","43.81958","-111.16768","-7","1"
+"83454","Ucon","ID","43.593567","-111.957274","-7","1"
+"83455","Victor","ID","43.636332","-111.14842","-7","1"
+"83460","Rexburg","ID","43.776095","-111.691047","-7","1"
+"83462","Carmen","ID","45.338175","-113.8584","-7","1"
+"83463","Gibbonsville","ID","45.593774","-113.9625","-7","1"
+"83464","Leadore","ID","44.525291","-113.29547","-7","1"
+"83465","Lemhi","ID","44.817505","-113.67277","-7","1"
+"83466","North Fork","ID","45.486818","-114.07866","-7","1"
+"83467","Salmon","ID","45.101697","-113.90306","-7","1"
+"83468","Tendoy","ID","44.926709","-113.68966","-7","1"
+"83469","Shoup","ID","45.234391","-114.31565","-7","1"
+"83501","Lewiston","ID","46.388753","-116.98484","-8","1"
+"83520","Ahsahka","ID","46.505902","-116.3187","-8","1"
+"83522","Cottonwood","ID","46.041157","-116.38568","-8","1"
+"83523","Craigmont","ID","46.223309","-116.48168","-8","1"
+"83524","Culdesac","ID","46.363204","-116.63906","-8","1"
+"83525","Elk City","ID","45.920694","-115.25273","-8","1"
+"83526","Ferdinand","ID","46.154136","-116.40471","-8","1"
+"83530","Grangeville","ID","45.923869","-116.13146","-8","1"
+"83531","Fenn","ID","45.889314","-115.557407","-8","1"
+"83533","Greencreek","ID","46.106803","-116.25403","-8","1"
+"83534","Culdesac","ID","46.375238","-116.666843","-8","1"
+"83535","Juliaetta","ID","46.542771","-116.7202","-8","1"
+"83536","Kamiah","ID","46.224145","-116.03726","-8","1"
+"83537","Kendrick","ID","46.635799","-116.54146","-8","1"
+"83539","Kooskia","ID","46.122654","-115.72485","-8","1"
+"83540","Lapwai","ID","46.39708","-116.78649","-8","1"
+"83541","Lenore","ID","46.52808","-116.46896","-8","1"
+"83542","Lucile","ID","45.548413","-116.301","-8","1"
+"83543","Nezperce","ID","46.256652","-116.24922","-8","1"
+"83544","Orofino","ID","46.485334","-116.20071","-8","1"
+"83545","Peck","ID","46.460115","-116.43823","-8","1"
+"83546","Pierce","ID","46.525642","-115.82276","-8","1"
+"83547","Pollock","ID","45.291282","-116.35695","-7","1"
+"83548","Reubens","ID","46.332945","-116.52939","-8","1"
+"83549","Riggins","ID","45.405792","-116.36431","-7","1"
+"83551","Spalding","ID","46.400349","-116.804544","-8","1"
+"83552","Stites","ID","46.093893","-115.9769","-8","1"
+"83553","Weippe","ID","46.368447","-115.90101","-8","1"
+"83554","White Bird","ID","45.717554","-116.26936","-8","1"
+"83555","Winchester","ID","46.216165","-116.62363","-8","1"
+"83601","Atlanta","ID","43.801588","-115.13085","-7","1"
+"83602","Banks","ID","44.066434","-116.13976","-7","1"
+"83604","Bruneau","ID","42.87616","-115.88714","-7","1"
+"83605","Caldwell","ID","43.658834","-116.67755","-7","1"
+"83606","Caldwell","ID","43.724917","-116.798923","-7","1"
+"83607","Caldwell","ID","43.675651","-116.73825","-7","1"
+"83610","Cambridge","ID","44.647796","-116.69","-7","1"
+"83611","Cascade","ID","44.476882","-115.9729","-7","1"
+"83612","Council","ID","44.829994","-116.55344","-7","1"
+"83615","Donnelly","ID","44.699961","-116.05992","-7","1"
+"83616","Eagle","ID","43.705551","-116.36346","-7","1"
+"83617","Emmett","ID","43.888285","-116.5143","-7","1"
+"83619","Fruitland","ID","44.002031","-116.91129","-7","1"
+"83620","Fruitvale","ID","44.878097","-116.43395","-7","1"
+"83622","Garden Valley","ID","44.103121","-115.9354","-7","1"
+"83623","Glenns Ferry","ID","42.965519","-115.32724","-7","1"
+"83624","Grand View","ID","43.004691","-116.07225","-7","1"
+"83626","Greenleaf","ID","43.670142","-116.82367","-7","1"
+"83627","Hammett","ID","42.939818","-115.49697","-7","1"
+"83628","Homedale","ID","43.598319","-116.9484","-7","1"
+"83629","Horseshoe Bend","ID","43.933688","-116.1889","-7","1"
+"83630","Huston","ID","43.602661","-116.790284","-7","1"
+"83631","Idaho City","ID","43.85128","-115.87903","-7","1"
+"83632","Indian Valley","ID","44.554347","-116.4388","-7","1"
+"83633","King Hill","ID","42.969692","-115.17427","-7","1"
+"83634","Kuna","ID","43.463644","-116.39311","-7","1"
+"83635","Lake Fork","ID","44.68367","-115.453583","-7","1"
+"83636","Letha","ID","43.896275","-116.646209","-7","1"
+"83637","Lowman","ID","44.08857","-115.48797","-7","1"
+"83638","McCall","ID","44.854428","-116.04991","-7","1"
+"83639","Marsing","ID","43.534319","-116.84062","-7","1"
+"83641","Melba","ID","43.370358","-116.57555","-7","1"
+"83642","Meridian","ID","43.609434","-116.39642","-7","1"
+"83643","Mesa","ID","44.605095","-116.48879","-7","1"
+"83644","Middleton","ID","43.720076","-116.60253","-7","1"
+"83645","Midvale","ID","44.426905","-116.62405","-7","1"
+"83647","Mountain Home","ID","43.208029","-115.62345","-7","1"
+"83648","Mountain Home A F B","ID","43.06997","-115.85201","-7","1"
+"83650","Murphy","ID","43.135267","-116.46584","-7","1"
+"83651","Nampa","ID","43.583454","-116.58697","-7","1"
+"83652","Nampa","ID","43.70713","-116.620774","-7","1"
+"83653","Nampa","ID","43.585149","-116.752963","-7","1"
+"83654","New Meadows","ID","45.077791","-116.34335","-7","1"
+"83655","New Plymouth","ID","43.96929","-116.81389","-7","1"
+"83656","Notus","ID","43.725546","-116.8008","-7","1"
+"83657","Ola","ID","44.279564","-116.29949","-7","1"
+"83660","Parma","ID","43.790319","-116.93469","-7","1"
+"83661","Payette","ID","44.079947","-116.89433","-7","1"
+"83666","Placerville","ID","43.948003","-115.98055","-7","1"
+"83669","Star","ID","43.697658","-116.49155","-7","1"
+"83670","Sweet","ID","44.017756","-116.31264","-7","1"
+"83671","Warren","ID","45.273532","-115.69194","-7","1"
+"83672","Weiser","ID","44.310781","-116.93326","-7","1"
+"83676","Wilder","ID","43.653878","-116.90117","-7","1"
+"83677","Yellow Pine","ID","45.01781","-115.55397","-7","1"
+"83680","Meridian","ID","43.459855","-116.243984","-7","1"
+"83686","Nampa","ID","43.529812","-116.57761","-7","1"
+"83687","Nampa","ID","43.590212","-116.53781","-7","1"
+"83701","Boise","ID","43.603768","-116.272921","-7","1"
+"83702","Boise","ID","43.627734","-116.20756","-7","1"
+"83703","Boise","ID","43.668396","-116.25707","-7","1"
+"83704","Boise","ID","43.63123","-116.28716","-7","1"
+"83705","Boise","ID","43.583139","-116.2252","-7","1"
+"83706","Boise","ID","43.593523","-116.19903","-7","1"
+"83707","Boise","ID","43.38469","-115.997118","-7","1"
+"83708","Boise","ID","43.459855","-116.243984","-7","1"
+"83709","Boise","ID","43.572671","-116.29527","-7","1"
+"83711","Boise","ID","43.459855","-116.243984","-7","1"
+"83712","Boise","ID","43.595763","-116.16367","-7","1"
+"83713","Boise","ID","43.638314","-116.33059","-7","1"
+"83714","Boise","ID","43.641774","-116.26507","-7","1"
+"83715","Boise","ID","43.459855","-116.243984","-7","1"
+"83716","Boise","ID","43.601772","-116.02721","-7","1"
+"83717","Boise","ID","43.459855","-116.243984","-7","1"
+"83719","Boise","ID","43.459855","-116.243984","-7","1"
+"83720","Boise","ID","43.459855","-116.243984","-7","1"
+"83721","Boise","ID","43.459855","-116.243984","-7","1"
+"83722","Boise","ID","43.459855","-116.243984","-7","1"
+"83723","Boise","ID","43.459855","-116.243984","-7","1"
+"83724","Boise","ID","43.619477","-116.195159","-7","1"
+"83725","Boise","ID","43.459855","-116.243984","-7","1"
+"83726","Boise","ID","43.459855","-116.243984","-7","1"
+"83727","Boise","ID","43.459855","-116.243984","-7","1"
+"83728","Boise","ID","43.459855","-116.243984","-7","1"
+"83729","Boise","ID","43.459855","-116.243984","-7","1"
+"83730","Boise","ID","43.459855","-116.243984","-7","1"
+"83731","Boise","ID","43.459855","-116.243984","-7","1"
+"83732","Boise","ID","43.459855","-116.243984","-7","1"
+"83733","Boise","ID","43.459855","-116.243984","-7","1"
+"83735","Boise","ID","43.459855","-116.243984","-7","1"
+"83744","Boise","ID","43.459855","-116.243984","-7","1"
+"83756","Boise","ID","43.459855","-116.243984","-7","1"
+"83757","Boise","ID","43.459855","-116.243984","-7","1"
+"83788","Boise","ID","43.606453","-116.28116","-7","1"
+"83799","Boise","ID","43.459855","-116.243984","-7","1"
+"83801","Athol","ID","47.943718","-116.66605","-8","1"
+"83802","Avery","ID","47.173432","-115.80199","-8","1"
+"83803","Bayview","ID","47.982523","-116.56168","-8","1"
+"83804","Blanchard","ID","48.021497","-116.98833","-8","1"
+"83805","Bonners Ferry","ID","48.770783","-116.41051","-8","1"
+"83806","Bovill","ID","46.868617","-116.39726","-8","1"
+"83808","Calder","ID","47.269078","-116.12134","-8","1"
+"83809","Careywood","ID","48.055621","-116.5854","-8","1"
+"83810","Cataldo","ID","47.532742","-116.46535","-8","1"
+"83811","Clark Fork","ID","48.119781","-116.15905","-8","1"
+"83812","Clarkia","ID","46.999999","-116.26693","-8","1"
+"83813","Cocolalla","ID","48.108672","-116.64794","-8","1"
+"83814","Coeur D Alene","ID","47.66655","-116.7757","-8","1"
+"83815","Coeur D Alene","ID","47.718227","-116.78897","-8","1"
+"83816","Coeur D Alene","ID","47.678798","-116.682718","-8","1"
+"83821","Coolin","ID","48.582545","-116.83491","-8","1"
+"83822","Oldtown","ID","48.168577","-117.02483","-8","1"
+"83823","Deary","ID","46.79844","-116.54841","-8","1"
+"83824","Desmet","ID","47.123919","-116.94417","-8","1"
+"83825","Dover","ID","48.36875","-116.545493","-8","1"
+"83826","Eastport","ID","48.974293","-116.1865","-8","1"
+"83827","Elk River","ID","46.779767","-116.17964","-8","1"
+"83830","Fernwood","ID","47.10625","-116.38764","-8","1"
+"83832","Genesee","ID","46.552921","-116.91914","-8","1"
+"83833","Harrison","ID","47.498424","-116.74475","-8","1"
+"83834","Harvard","ID","46.973846","-116.71663","-8","1"
+"83835","Hayden","ID","47.773595","-116.74907","-8","1"
+"83836","Hope","ID","48.229101","-116.27423","-8","1"
+"83837","Kellogg","ID","47.542783","-116.11848","-8","1"
+"83839","Kingston","ID","47.566703","-116.20774","-8","1"
+"83840","Kootenai","ID","48.314378","-116.515276","-8","1"
+"83841","Laclede","ID","48.161421","-116.76728","-8","1"
+"83842","Medimont","ID","47.456917","-116.57917","-8","1"
+"83843","Moscow","ID","46.727636","-116.98067","-8","1"
+"83844","Moscow","ID","46.836284","-116.684553","-8","1"
+"83845","Moyie Springs","ID","48.720842","-116.13626","-8","1"
+"83846","Mullan","ID","47.466971","-115.78377","-8","1"
+"83847","Naples","ID","48.575219","-116.41475","-8","1"
+"83848","Nordman","ID","48.649023","-116.89426","-8","1"
+"83849","Osburn","ID","47.517239","-116.01495","-8","1"
+"83850","Pinehurst","ID","47.512203","-116.24128","-8","1"
+"83851","Plummer","ID","47.322203","-116.88379","-8","1"
+"83852","Ponderay","ID","48.30476","-116.53305","-8","1"
+"83853","Porthill","ID","48.953737","-116.53078","-8","1"
+"83854","Post Falls","ID","47.720306","-116.94564","-8","1"
+"83855","Potlatch","ID","46.95597","-116.91671","-8","1"
+"83856","Priest River","ID","48.315799","-116.90904","-8","1"
+"83857","Princeton","ID","46.871275","-116.82431","-8","1"
+"83858","Rathdrum","ID","47.818931","-116.8783","-8","1"
+"83860","Sagle","ID","48.205853","-116.5571","-8","1"
+"83861","Saint Maries","ID","47.274904","-116.57392","-8","1"
+"83862","Samuels","ID","48.36875","-116.545493","-8","1"
+"83864","Sandpoint","ID","48.362033","-116.55101","-8","1"
+"83865","Colburn","ID","48.363251","-116.625594","-8","1"
+"83866","Santa","ID","47.161756","-116.42113","-8","1"
+"83867","Silverton","ID","47.495306","-115.9555","-8","1"
+"83868","Smelterville","ID","47.542989","-116.18156","-8","1"
+"83869","Spirit Lake","ID","47.97618","-116.86895","-8","1"
+"83870","Tensed","ID","47.155827","-116.89647","-8","1"
+"83871","Troy","ID","46.747944","-116.74693","-8","1"
+"83872","Viola","ID","46.861905","-116.96316","-8","1"
+"83873","Wallace","ID","47.533448","-115.88759","-8","1"
+"83874","Murray","ID","47.626188","-115.83204","-8","1"
+"83876","Worley","ID","47.446701","-116.90486","-8","1"
+"83877","Post Falls","ID","47.678798","-116.682718","-8","1"
+"83888","Sandpoint","ID","48.36875","-116.545493","-8","1"
+"84001","Altamont","UT","40.395531","-110.27969","-7","1"
+"84002","Altonah","UT","40.45679","-110.32673","-7","1"
+"84003","American Fork","UT","40.394235","-111.79449","-7","1"
+"84004","Alpine","UT","40.465161","-111.76279","-7","1"
+"84006","Bingham Canyon","UT","40.563896","-112.1281","-7","1"
+"84007","Bluebell","UT","40.349644","-110.19776","-7","1"
+"84008","Bonanza","UT","40.443106","-109.505593","-7","1"
+"84010","Bountiful","UT","40.876312","-111.87249","-7","1"
+"84011","Bountiful","UT","40.963547","-112.115984","-7","1"
+"84013","Cedar Valley","UT","40.288953","-112.09859","-7","1"
+"84014","Centerville","UT","40.927244","-111.87682","-7","1"
+"84015","Clearfield","UT","41.126476","-112.04427","-7","1"
+"84016","Clearfield","UT","40.892995","-111.888121","-7","1"
+"84017","Coalville","UT","40.88097","-111.37752","-7","1"
+"84018","Croydon","UT","41.084479","-111.53153","-7","1"
+"84020","Draper","UT","40.514843","-111.87294","-7","1"
+"84021","Duchesne","UT","40.169399","-110.46066","-7","1"
+"84022","Dugway","UT","40.212316","-112.70012","-7","1"
+"84023","Dutch John","UT","40.881951","-109.46319","-7","1"
+"84024","Echo","UT","40.959532","-111.42743","-7","1"
+"84025","Farmington","UT","40.988347","-111.88847","-7","1"
+"84026","Fort Duchesne","UT","40.294693","-109.82903","-7","1"
+"84027","Fruitland","UT","40.156858","-110.95449","-7","1"
+"84028","Garden City","UT","41.91021","-111.40328","-7","1"
+"84029","Grantsville","UT","40.689007","-112.6698","-7","1"
+"84030","Gusher","UT","40.160179","-109.547839","-7","1"
+"84031","Hanna","UT","40.535823","-110.46651","-7","1"
+"84032","Heber City","UT","40.511413","-111.33259","-7","1"
+"84033","Henefer","UT","40.996895","-111.50264","-7","1"
+"84034","Ibapah","UT","40.105506","-113.94372","-7","1"
+"84035","Jensen","UT","40.443203","-109.25255","-7","1"
+"84036","Kamas","UT","40.625883","-111.20141","-7","1"
+"84037","Kaysville","UT","41.032893","-111.93004","-7","1"
+"84038","Laketown","UT","41.797569","-111.3702","-7","1"
+"84039","Lapoint","UT","40.401201","-109.81677","-7","1"
+"84040","Layton","UT","41.086894","-111.9271","-7","1"
+"84041","Layton","UT","41.07221","-111.97625","-7","1"
+"84042","Lindon","UT","40.338552","-111.7162","-7","1"
+"84043","Lehi","UT","40.366648","-111.89052","-7","1"
+"84044","Magna","UT","40.700162","-112.08318","-7","1"
+"84046","Manila","UT","40.978642","-109.74719","-7","1"
+"84047","Midvale","UT","40.614997","-111.88704","-7","1"
+"84049","Midway","UT","40.518775","-111.49837","-7","1"
+"84050","Morgan","UT","41.059771","-111.71141","-7","1"
+"84051","Mountain Home","UT","40.42204","-110.38597","-7","1"
+"84052","Myton","UT","40.065834","-110.14823","-7","1"
+"84053","Neola","UT","40.440294","-110.02525","-7","1"
+"84054","North Salt Lake","UT","40.843012","-111.90581","-7","1"
+"84055","Oakley","UT","40.80725","-111.204","-7","1"
+"84056","Hill AFB","UT","41.118815","-112.01151","-7","1"
+"84057","Orem","UT","40.311854","-111.70561","-7","1"
+"84058","Orem","UT","40.278086","-111.71067","-7","1"
+"84059","Orem","UT","40.176975","-111.536036","-7","1"
+"84060","Park City","UT","40.648541","-111.49362","-7","1"
+"84061","Peoa","UT","40.732935","-111.35283","-7","1"
+"84062","Pleasant Grove","UT","40.38584","-111.73333","-7","1"
+"84063","Randlett","UT","40.176006","-109.70579","-7","1"
+"84064","Randolph","UT","41.656963","-111.16584","-7","1"
+"84065","Riverton","UT","40.503746","-111.96327","-7","1"
+"84066","Roosevelt","UT","40.328012","-110.01689","-7","1"
+"84067","Roy","UT","41.173226","-112.05093","-7","1"
+"84068","Park City","UT","40.66797","-111.505365","-7","1"
+"84069","Rush Valley","UT","40.366554","-112.45813","-7","1"
+"84070","Sandy","UT","40.581595","-111.88821","-7","1"
+"84071","Stockton","UT","40.336367","-112.33819","-7","1"
+"84072","Tabiona","UT","40.362986","-110.70128","-7","1"
+"84073","Talmage","UT","40.352343","-110.46935","-7","1"
+"84074","Tooele","UT","40.560528","-112.29455","-7","1"
+"84075","Syracuse","UT","41.086069","-112.06279","-7","1"
+"84076","Tridell","UT","40.446132","-109.87476","-7","1"
+"84078","Vernal","UT","40.514262","-109.54223","-7","1"
+"84079","Vernal","UT","40.160179","-109.547839","-7","1"
+"84080","Vernon","UT","40.105195","-112.31673","-7","1"
+"84082","Wallsburg","UT","40.371817","-111.41809","-7","1"
+"84083","Wendover","UT","40.773372","-114.0093","-7","1"
+"84084","West Jordan","UT","40.627668","-111.97566","-7","1"
+"84085","Whiterocks","UT","40.529949","-109.91425","-7","1"
+"84086","Woodruff","UT","41.376622","-111.22578","-7","1"
+"84087","Woods Cross","UT","40.888711","-111.90909","-7","1"
+"84088","West Jordan","UT","40.594222","-111.97889","-7","1"
+"84089","Clearfield","UT","40.963547","-112.115984","-7","1"
+"84090","Sandy","UT","40.668068","-111.908297","-7","1"
+"84091","Sandy","UT","40.668068","-111.908297","-7","1"
+"84092","Sandy","UT","40.558748","-111.80902","-7","1"
+"84093","Sandy","UT","40.594948","-111.83448","-7","1"
+"84094","Sandy","UT","40.569598","-111.86217","-7","1"
+"84095","South Jordan","UT","40.561598","-111.96088","-7","1"
+"84097","Orem","UT","40.301444","-111.67485","-7","1"
+"84098","Park City","UT","40.726899","-111.53674","-7","1"
+"84101","Salt Lake City","UT","40.754746","-111.89875","-7","1"
+"84102","Salt Lake City","UT","40.759246","-111.86371","-7","1"
+"84103","Salt Lake City","UT","40.777746","-111.87491","-7","1"
+"84104","Salt Lake City","UT","40.750628","-111.94077","-7","1"
+"84105","Salt Lake City","UT","40.737132","-111.86044","-7","1"
+"84106","Salt Lake City","UT","40.706246","-111.85657","-7","1"
+"84107","Salt Lake City","UT","40.659997","-111.88394","-7","1"
+"84108","Salt Lake City","UT","40.744646","-111.81123","-7","1"
+"84109","Salt Lake City","UT","40.705747","-111.79973","-7","1"
+"84110","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84111","Salt Lake City","UT","40.7547","-111.88361","-7","1"
+"84112","Salt Lake City","UT","40.76784","-111.83805","-7","1"
+"84113","Salt Lake City","UT","40.763322","-111.83364","-7","1"
+"84114","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84115","Salt Lake City","UT","40.718113","-111.88938","-7","1"
+"84116","Salt Lake City","UT","40.790309","-111.94018","-7","1"
+"84117","Salt Lake City","UT","40.662797","-111.83797","-7","1"
+"84118","Salt Lake City","UT","40.650496","-111.99591","-7","1"
+"84119","Salt Lake City","UT","40.696596","-111.95239","-7","1"
+"84120","Salt Lake City","UT","40.688246","-111.99899","-7","1"
+"84121","Salt Lake City","UT","40.625621","-111.8158","-7","1"
+"84122","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84123","Salt Lake City","UT","40.659514","-111.92226","-7","1"
+"84124","Salt Lake City","UT","40.680064","-111.8222","-7","1"
+"84125","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84126","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84127","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84128","Salt Lake City","UT","40.694746","-112.04004","-7","1"
+"84130","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84131","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84132","Salt Lake City","UT","40.772743","-111.838541","-7","1"
+"84133","Salt Lake City","UT","40.769046","-111.889319","-7","1"
+"84134","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84135","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84136","Salt Lake City","UT","40.768546","-111.887869","-7","1"
+"84137","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84138","Salt Lake City","UT","40.671614","-111.74828","-7","1"
+"84139","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84140","Salt Lake City","UT","40.771345","-111.93087","-7","1"
+"84141","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84142","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84143","Salt Lake City","UT","40.786886","-111.900832","-7","1"
+"84144","Salt Lake City","UT","40.767946","-111.890819","-7","1"
+"84145","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84147","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84148","Salt Lake City","UT","40.756796","-111.837567","-7","1"
+"84150","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84151","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84152","Salt Lake City","UT","40.728579","-111.66273","-7","1"
+"84153","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84157","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84158","Salt Lake City","UT","40.768996","-111.762115","-7","1"
+"84165","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84170","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84171","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84180","Salt Lake City","UT","40.770248","-111.90077","-7","1"
+"84184","Salt Lake City","UT","40.676839","-111.956811","-7","1"
+"84185","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84189","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84190","Salt Lake City","UT","40.668068","-111.908297","-7","1"
+"84199","Salt Lake City","UT","40.725946","-111.93942","-7","1"
+"84201","Ogden","UT","41.244261","-112.007924","-7","1"
+"84244","Ogden","UT","41.255285","-111.956721","-7","1"
+"84252","Green River","UT","38.995483","-110.160534","-7","1"
+"84301","Bear River City","UT","41.615276","-112.12561","-7","1"
+"84302","Brigham City","UT","41.508605","-112.04736","-7","1"
+"84304","Cache Junction","UT","41.832776","-111.99738","-7","1"
+"84305","Clarkston","UT","41.938629","-112.0433","-7","1"
+"84306","Collinston","UT","41.804848","-112.07009","-7","1"
+"84307","Corinne","UT","41.535714","-112.30373","-7","1"
+"84308","Cornish","UT","41.944253","-111.973275","-7","1"
+"84309","Deweyville","UT","41.714101","-112.08846","-7","1"
+"84310","Eden","UT","41.364638","-111.81304","-7","1"
+"84311","Fielding","UT","41.81571","-112.11338","-7","1"
+"84312","Garland","UT","41.76645","-112.15829","-7","1"
+"84313","Grouse Creek","UT","41.307779","-113.56365","-7","1"
+"84314","Honeyville","UT","41.644833","-112.09427","-7","1"
+"84315","Hooper","UT","41.172593","-112.10675","-7","1"
+"84316","Howell","UT","41.773176","-112.45965","-7","1"
+"84317","Huntsville","UT","41.288679","-111.70449","-7","1"
+"84318","Hyde Park","UT","41.801888","-111.81535","-7","1"
+"84319","Hyrum","UT","41.630767","-111.84549","-7","1"
+"84320","Lewiston","UT","41.968475","-111.86587","-7","1"
+"84321","Logan","UT","41.730637","-111.78042","-7","1"
+"84322","Logan","UT","41.641189","-111.896571","-7","1"
+"84323","Logan","UT","41.684253","-111.783783","-7","1"
+"84324","Mantua","UT","41.492466","-111.94275","-7","1"
+"84325","Mendon","UT","41.721715","-111.97114","-7","1"
+"84326","Millville","UT","41.682506","-111.825","-7","1"
+"84327","Newton","UT","41.867966","-111.99026","-7","1"
+"84328","Paradise","UT","41.508503","-111.79102","-7","1"
+"84329","Park Valley","UT","41.689359","-113.44562","-7","1"
+"84330","Plymouth","UT","41.875803","-112.13957","-7","1"
+"84331","Portage","UT","41.909031","-112.32322","-7","1"
+"84332","Providence","UT","41.701304","-111.8096","-7","1"
+"84333","Richmond","UT","41.919806","-111.81676","-7","1"
+"84334","Riverside","UT","41.791414","-112.14671","-7","1"
+"84335","Smithfield","UT","41.833371","-111.85897","-7","1"
+"84336","Snowville","UT","41.792609","-112.91032","-7","1"
+"84337","Tremonton","UT","41.688721","-112.22327","-7","1"
+"84338","Trenton","UT","41.935384","-111.94607","-7","1"
+"84339","Wellsville","UT","41.641328","-111.92716","-7","1"
+"84340","Willard","UT","41.368481","-112.05538","-7","1"
+"84341","Logan","UT","41.780998","-111.80904","-7","1"
+"84346","South Willard","UT","41.346348","-112.063983","-7","1"
+"84401","Ogden","UT","41.224911","-111.98346","-7","1"
+"84402","Ogden","UT","41.255285","-111.956721","-7","1"
+"84403","Ogden","UT","41.188093","-111.94608","-7","1"
+"84404","Ogden","UT","41.270319","-112.01932","-7","1"
+"84405","Ogden","UT","41.165551","-111.9675","-7","1"
+"84407","Ogden","UT","41.238547","-111.965867","-7","1"
+"84408","Ogden","UT","41.195593","-111.948474","-7","1"
+"84409","Ogden","UT","41.255285","-111.956721","-7","1"
+"84412","Ogden","UT","41.255285","-111.956721","-7","1"
+"84414","Ogden","UT","41.314075","-111.96366","-7","1"
+"84415","Ogden","UT","41.255285","-111.956721","-7","1"
+"84501","Price","UT","39.578473","-110.78678","-7","1"
+"84510","Aneth","UT","37.198216","-109.11245","-7","1"
+"84511","Blanding","UT","37.562925","-109.46245","-7","1"
+"84512","Bluff","UT","37.158935","-109.52773","-7","1"
+"84513","Castle Dale","UT","39.222858","-111.00605","-7","1"
+"84515","Cisco","UT","38.999877","-109.615008","-7","1"
+"84516","Clawson","UT","39.088224","-111.05489","-7","1"
+"84518","Cleveland","UT","39.350034","-110.87184","-7","1"
+"84520","East Carbon","UT","39.569596","-110.34199","-7","1"
+"84521","Elmo","UT","39.367253","-110.78956","-7","1"
+"84522","Emery","UT","38.889362","-111.17706","-7","1"
+"84523","Ferron","UT","39.109059","-111.13617","-7","1"
+"84525","Green River","UT","38.983076","-110.35905","-7","1"
+"84526","Helper","UT","39.694641","-110.98561","-7","1"
+"84527","Hiawatha","UT","39.640779","-110.560697","-7","1"
+"84528","Huntington","UT","39.343592","-110.9778","-7","1"
+"84529","Kenilworth","UT","39.6866","-110.80479","-7","1"
+"84530","La Sal","UT","38.236886","-109.15445","-7","1"
+"84531","Mexican Hat","UT","37.183505","-109.93383","-7","1"
+"84532","Moab","UT","38.572778","-109.49392","-7","1"
+"84533","Lake Powell","UT","37.655431","-110.03772","-7","1"
+"84534","Montezuma Creek","UT","37.237899","-109.28709","-7","1"
+"84535","Monticello","UT","37.886087","-109.30629","-7","1"
+"84536","Monument Valley","AZ","36.990184","-110.2123","-7","0"
+"84537","Orangeville","UT","39.36696","-111.16518","-7","1"
+"84539","Sunnyside","UT","39.661026","-110.58819","-7","1"
+"84540","Thompson","UT","39.210907","-109.44491","-7","1"
+"84542","Wellington","UT","39.543105","-110.72865","-7","1"
+"84601","Provo","UT","40.230954","-111.68006","-7","1"
+"84602","Provo","UT","40.356343","-111.732476","-7","1"
+"84603","Provo","UT","40.203908","-111.626081","-7","1"
+"84604","Provo","UT","40.280454","-111.6491","-7","1"
+"84605","Provo","UT","40.176975","-111.536036","-7","1"
+"84606","Provo","UT","40.226302","-111.64439","-7","1"
+"84620","Aurora","UT","38.917381","-111.92835","-7","1"
+"84621","Axtell","UT","39.050838","-111.84775","-7","1"
+"84622","Centerfield","UT","39.114649","-111.80511","-7","1"
+"84623","Chester","UT","39.465357","-111.57686","-7","1"
+"84624","Delta","UT","39.349079","-112.5433","-7","1"
+"84626","Elberta","UT","39.92519","-111.99559","-7","1"
+"84627","Ephraim","UT","39.353561","-111.5783","-7","1"
+"84628","Eureka","UT","39.855141","-112.14995","-7","1"
+"84629","Fairview","UT","39.701506","-111.42865","-7","1"
+"84630","Fayette","UT","39.272741","-111.77838","-7","1"
+"84631","Fillmore","UT","38.951694","-112.31666","-7","1"
+"84632","Fountain Green","UT","39.633383","-111.62844","-7","1"
+"84633","Goshen","UT","39.949142","-111.89623","-7","1"
+"84634","Gunnison","UT","39.193513","-111.85047","-7","1"
+"84635","Hinckley","UT","39.314609","-112.79181","-7","1"
+"84636","Holden","UT","39.099629","-112.2823","-7","1"
+"84637","Kanosh","UT","38.811791","-112.70637","-7","1"
+"84638","Leamington","UT","39.532384","-112.27113","-7","1"
+"84639","Levan","UT","39.47178","-111.94431","-7","1"
+"84640","Lynndyl","UT","39.522214","-112.36913","-7","1"
+"84642","Manti","UT","39.230151","-111.57601","-7","1"
+"84643","Mayfield","UT","39.111512","-111.69904","-7","1"
+"84644","Meadow","UT","39.06433","-113.032141","-7","1"
+"84645","Mona","UT","39.859432","-111.85402","-7","1"
+"84646","Moroni","UT","39.526133","-111.58299","-7","1"
+"84647","Mount Pleasant","UT","39.545778","-111.43798","-7","1"
+"84648","Nephi","UT","39.692424","-111.88229","-7","1"
+"84649","Oak City","UT","39.370295","-112.32369","-7","1"
+"84650","Oasis","UT","39.291167","-112.62826","-7","1"
+"84651","Payson","UT","40.025007","-111.72117","-7","1"
+"84652","Redmond","UT","38.974463","-111.92215","-7","1"
+"84653","Salem","UT","40.043907","-111.66405","-7","1"
+"84654","Salina","UT","38.915722","-111.72893","-7","1"
+"84655","Santaquin","UT","40.03148","-111.85302","-7","1"
+"84656","Scipio","UT","39.240818","-112.14804","-7","1"
+"84657","Sigurd","UT","38.834889","-111.943","-7","1"
+"84660","Spanish Fork","UT","40.10637","-111.65408","-7","1"
+"84662","Spring City","UT","39.461825","-111.47818","-7","1"
+"84663","Springville","UT","40.168205","-111.59577","-7","1"
+"84664","Mapleton","UT","40.123394","-111.56665","-7","1"
+"84665","Sterling","UT","39.133489","-111.740853","-7","1"
+"84667","Wales","UT","39.458682","-111.67126","-7","1"
+"84701","Richfield","UT","38.765929","-112.08397","-7","1"
+"84710","Alton","UT","37.474045","-112.53409","-7","1"
+"84711","Annabella","UT","38.707639","-112.05826","-7","1"
+"84712","Antimony","UT","38.070706","-111.97354","-7","1"
+"84713","Beaver","UT","38.35906","-112.6926","-7","1"
+"84714","Beryl","UT","37.798268","-113.6718","-7","1"
+"84715","Bicknell","UT","38.338787","-111.54921","-7","1"
+"84716","Boulder","UT","37.94512","-111.09991","-7","1"
+"84717","Bryce Canyon","UT","37.6153","-112.17088","-7","1"
+"84718","Cannonville","UT","37.576034","-112.08849","-7","1"
+"84719","Brian Head","UT","37.663896","-112.81081","-7","1"
+"84720","Cedar City","UT","37.75164","-113.16557","-7","1"
+"84721","Cedar City","UT","37.656843","-113.3695","-7","1"
+"84722","Central","UT","37.416058","-113.62554","-7","1"
+"84723","Circleville","UT","38.180655","-112.25563","-7","1"
+"84724","Elsinore","UT","38.686793","-112.14565","-7","1"
+"84725","Enterprise","UT","37.533546","-113.76108","-7","1"
+"84726","Escalante","UT","37.76737","-111.6841","-7","1"
+"84728","Garrison","UT","38.970536","-113.7085","-7","1"
+"84729","Glendale","UT","37.351773","-112.61182","-7","1"
+"84730","Glenwood","UT","38.764683","-111.98379","-7","1"
+"84731","Greenville","UT","38.218885","-112.82508","-7","1"
+"84732","Greenwich","UT","38.446294","-111.9101","-7","1"
+"84733","Gunlock","UT","37.179347","-113.8136","-7","1"
+"84734","Hanksville","UT","38.289429","-110.66366","-7","1"
+"84735","Hatch","UT","37.61127","-112.55601","-7","1"
+"84736","Henrieville","UT","37.565311","-111.99144","-7","1"
+"84737","Hurricane","UT","37.130927","-113.24183","-7","1"
+"84738","Ivins","UT","37.164561","-113.67582","-7","1"
+"84739","Joseph","UT","38.620071","-112.23422","-7","1"
+"84740","Junction","UT","38.238084","-112.23014","-7","1"
+"84741","Kanab","UT","37.162224","-112.11431","-7","1"
+"84742","Kanarraville","UT","37.522753","-113.203633","-7","1"
+"84743","Kingston","UT","38.230935","-112.18455","-7","1"
+"84744","Koosharem","UT","38.510659","-111.88029","-7","1"
+"84745","La Verkin","UT","37.219954","-113.25581","-7","1"
+"84746","Leeds","UT","37.237225","-113.33562","-7","1"
+"84747","Loa","UT","38.41744","-111.67612","-7","1"
+"84749","Lyman","UT","38.386384","-111.5911","-7","1"
+"84750","Marysvale","UT","38.439428","-112.2208","-7","1"
+"84751","Milford","UT","38.348238","-113.1063","-7","1"
+"84752","Minersville","UT","38.217377","-112.93204","-7","1"
+"84753","Modena","UT","37.873645","-113.88673","-7","1"
+"84754","Monroe","UT","38.618547","-111.88908","-7","1"
+"84755","Mount Carmel","UT","37.261273","-112.79836","-7","1"
+"84756","Newcastle","UT","37.692401","-113.627239","-7","1"
+"84757","New Harmony","UT","37.391483","-113.2821","-7","1"
+"84758","Orderville","UT","37.26947","-112.64419","-7","1"
+"84759","Panguitch","UT","37.777031","-112.40819","-7","1"
+"84760","Paragonah","UT","37.911834","-112.68799","-7","1"
+"84761","Parowan","UT","37.886163","-112.83945","-7","1"
+"84762","Duck Creek Village","UT","37.48474","-112.71064","-7","1"
+"84763","Rockville","UT","37.160144","-113.042525","-7","1"
+"84764","Bryce","UT","37.638578","-112.20857","-7","1"
+"84765","Santa Clara","UT","37.136937","-113.64916","-7","1"
+"84766","Sevier","UT","38.568765","-112.35173","-7","1"
+"84767","Springdale","UT","37.186249","-113.013922","-7","1"
+"84770","Saint George","UT","37.118352","-113.5987","-7","1"
+"84771","Saint George","UT","37.309231","-113.476182","-7","1"
+"84772","Summit","UT","37.800295","-112.93517","-7","1"
+"84773","Teasdale","UT","38.28419","-111.53072","-7","1"
+"84774","Toquerville","UT","37.250749","-113.27491","-7","1"
+"84775","Torrey","UT","38.340186","-111.0022","-7","1"
+"84776","Tropic","UT","37.650853","-112.07946","-7","1"
+"84779","Virgin","UT","37.294867","-113.10279","-7","1"
+"84780","Washington","UT","37.144146","-113.49671","-7","1"
+"84781","Pine Valley","UT","37.391737","-113.51806","-7","1"
+"84782","Veyo","UT","37.359887","-113.66976","-7","1"
+"84783","Dammeron Valley","UT","37.287005","-113.66144","-7","1"
+"84784","Hildale","UT","37.004364","-112.978418","-7","1"
+"84790","Saint George","UT","37.075039","-113.55568","-7","1"
+"84791","Saint George","UT","37.309231","-113.476182","-7","1"
+"84821","Logan","UT","41.717612","-111.868898","-7","1"
+"84910","North Salt Lake","UT","40.858481","-111.898438","-7","1"
+"84915","Clinton","UT","41.142472","-112.066211","-7","1"
+"84947","Lyman","UT","38.399138","-111.591641","-7","1"
+"85001","Phoenix","AZ","33.703967","-112.351835","-7","0"
+"85002","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85003","Phoenix","AZ","33.451143","-112.07838","-7","0"
+"85004","Phoenix","AZ","33.451093","-112.07057","-7","0"
+"85005","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85006","Phoenix","AZ","33.466392","-112.04875","-7","0"
+"85007","Phoenix","AZ","33.449995","-112.09024","-7","0"
+"85008","Phoenix","AZ","33.466393","-112.0008","-7","0"
+"85009","Phoenix","AZ","33.45635","-112.12378","-7","0"
+"85010","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85011","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85012","Phoenix","AZ","33.505251","-112.0703","-7","0"
+"85013","Phoenix","AZ","33.50711","-112.08483","-7","0"
+"85014","Phoenix","AZ","33.511325","-112.05711","-7","0"
+"85015","Phoenix","AZ","33.50689","-112.10262","-7","0"
+"85016","Phoenix","AZ","33.503742","-112.03235","-7","0"
+"85017","Phoenix","AZ","33.514092","-112.12285","-7","0"
+"85018","Phoenix","AZ","33.498076","-111.98603","-7","0"
+"85019","Phoenix","AZ","33.511992","-112.1417","-7","0"
+"85020","Phoenix","AZ","33.563663","-112.05519","-7","0"
+"85021","Phoenix","AZ","33.559437","-112.09281","-7","0"
+"85022","Phoenix","AZ","33.630497","-112.0521","-7","0"
+"85023","Phoenix","AZ","33.638271","-112.09341","-7","0"
+"85024","Phoenix","AZ","33.675564","-112.04717","-7","0"
+"85025","Phoenix","AZ","33.422621","-111.723635","-7","0"
+"85026","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85027","Phoenix","AZ","33.698731","-112.11429","-7","0"
+"85028","Phoenix","AZ","33.585037","-112.00815","-7","0"
+"85029","Phoenix","AZ","33.598841","-112.12023","-7","0"
+"85030","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85031","Phoenix","AZ","33.493496","-112.17108","-7","0"
+"85032","Phoenix","AZ","33.62414","-112.00416","-7","0"
+"85033","Phoenix","AZ","33.496091","-112.21405","-7","0"
+"85034","Phoenix","AZ","33.437772","-112.0281","-7","0"
+"85035","Phoenix","AZ","33.472492","-112.1875","-7","0"
+"85036","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85037","Phoenix","AZ","33.493006","-112.25539","-7","0"
+"85038","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85039","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85040","Phoenix","AZ","33.393323","-112.02857","-7","0"
+"85041","Phoenix","AZ","33.386995","-112.10076","-7","0"
+"85042","Phoenix","AZ","33.381234","-112.027663","-7","0"
+"85043","Phoenix","AZ","33.435405","-112.20009","-7","0"
+"85044","Phoenix","AZ","33.333591","-111.99246","-7","0"
+"85045","Phoenix","AZ","33.29974","-112.09812","-7","0"
+"85046","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85048","Phoenix","AZ","33.302098","-112.02477","-7","0"
+"85050","Phoenix","AZ","33.683603","-111.99271","-7","0"
+"85051","Phoenix","AZ","33.559783","-112.13361","-7","0"
+"85053","Phoenix","AZ","33.629911","-112.13122","-7","0"
+"85054","Phoenix","AZ","33.689558","-111.96463","-7","0"
+"85055","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85060","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85061","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85062","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85063","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85064","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85065","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85066","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85067","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85068","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85069","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85070","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85071","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85072","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85073","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85074","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85075","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85076","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85077","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85078","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85079","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85080","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85082","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85085","Phoenix","AZ","33.77776","-112.07945","-7","0"
+"85086","Anthem","AZ","33.831866","-112.06339","-7","0"
+"85087","New River","AZ","33.921493","-112.09992","-7","0"
+"85089","New River","AZ","33.909138","-112.140771","-7","0"
+"85097","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85098","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85099","Phoenix","AZ","33.276539","-112.18717","-7","0"
+"85123","Mesa","AZ","33.427135","-111.758483","-7","0"
+"85200","Mesa","AZ","33.423596","-111.594435","-7","0"
+"85201","Mesa","AZ","33.432177","-111.84701","-7","0"
+"85202","Mesa","AZ","33.381097","-111.8756","-7","0"
+"85203","Mesa","AZ","33.437493","-111.806","-7","0"
+"85204","Mesa","AZ","33.400127","-111.78594","-7","0"
+"85205","Mesa","AZ","33.426932","-111.71686","-7","0"
+"85206","Mesa","AZ","33.400306","-111.72452","-7","0"
+"85207","Mesa","AZ","33.436767","-111.64338","-7","0"
+"85208","Mesa","AZ","33.393967","-111.64302","-7","0"
+"85210","Mesa","AZ","33.391233","-111.84129","-7","0"
+"85211","Mesa","AZ","33.466313","-111.837345","-7","0"
+"85212","Mesa","AZ","33.35035","-111.64535","-7","0"
+"85213","Mesa","AZ","33.434192","-111.76892","-7","0"
+"85214","Mesa","AZ","33.276539","-112.18717","-7","0"
+"85215","Mesa","AZ","33.479868","-111.6935","-7","0"
+"85216","Mesa","AZ","33.276539","-112.18717","-7","0"
+"85217","Apache Junction","AZ","33.393398","-111.478975","-7","0"
+"85218","Gold Camp","AZ","33.349996","-111.418233","-7","0"
+"85219","Apache Junction","AZ","33.402969","-111.46337","-7","0"
+"85220","Apache Junction","AZ","33.416083","-111.5762","-7","0"
+"85221","Bapchule","AZ","33.126134","-111.90545","-7","0"
+"85222","Casa Grande","AZ","32.878138","-111.73499","-7","0"
+"85223","Arizona City","AZ","32.749664","-111.68022","-7","0"
+"85224","Chandler","AZ","33.328951","-111.8735","-7","0"
+"85225","Chandler","AZ","33.316349","-111.83064","-7","0"
+"85226","Chandler","AZ","33.312208","-111.93177","-7","0"
+"85227","Chandler Heights","AZ","33.212186","-111.686171","-7","0"
+"85228","Coolidge","AZ","32.967829","-111.52617","-7","0"
+"85230","Casa Grande","AZ","32.742949","-111.78945","-7","0"
+"85231","Eloy","AZ","32.712323","-111.57673","-7","0"
+"85232","Florence","AZ","32.961615","-111.31629","-7","0"
+"85233","Gilbert","AZ","33.348593","-111.80833","-7","0"
+"85234","Gilbert","AZ","33.36344","-111.75093","-7","0"
+"85235","Hayden","AZ","32.995762","-110.7804","-7","0"
+"85236","Higley","AZ","33.305783","-111.70835","-7","0"
+"85237","Kearny","AZ","33.09977","-110.97202","-7","0"
+"85239","Maricopa","AZ","32.989261","-112.11505","-7","0"
+"85240","Chandler","AZ","33.222982","-111.858805","-7","0"
+"85241","Picacho","AZ","32.712136","-111.49949","-7","0"
+"85242","Queen Creek","AZ","33.227266","-111.61087","-7","0"
+"85244","Chandler","AZ","33.321316","-111.888824","-7","0"
+"85245","Red Rock","AZ","32.623115","-111.37672","-7","0"
+"85246","Chandler","AZ","33.276539","-112.18717","-7","0"
+"85247","Sacaton","AZ","33.107581","-111.75128","-7","0"
+"85248","Chandler","AZ","33.239097","-111.86355","-7","0"
+"85249","Chandler","AZ","33.237229","-111.8004","-7","0"
+"85250","Scottsdale","AZ","33.521433","-111.90944","-7","0"
+"85251","Scottsdale","AZ","33.494152","-111.92079","-7","0"
+"85252","Scottsdale","AZ","33.499529","-111.868432","-7","0"
+"85253","Paradise Valley","AZ","33.544596","-111.95645","-7","0"
+"85254","Scottsdale","AZ","33.617504","-111.95416","-7","0"
+"85255","Scottsdale","AZ","33.697268","-111.88321","-7","0"
+"85256","Scottsdale","AZ","33.491302","-111.83509","-7","0"
+"85257","Scottsdale","AZ","33.467347","-111.91741","-7","0"
+"85258","Scottsdale","AZ","33.566635","-111.89337","-7","0"
+"85259","Scottsdale","AZ","33.596995","-111.82628","-7","0"
+"85260","Scottsdale","AZ","33.606004","-111.88699","-7","0"
+"85261","Scottsdale","AZ","33.276539","-112.18717","-7","0"
+"85262","Scottsdale","AZ","33.798581","-111.8708","-7","0"
+"85263","Rio Verde","AZ","33.722594","-111.67915","-7","0"
+"85264","Fort Mcdowell","AZ","33.617643","-111.67554","-7","0"
+"85266","Scottsdale","AZ","33.276539","-112.18717","-7","0"
+"85267","Scottsdale","AZ","33.276539","-112.18717","-7","0"
+"85268","Fountain Hills","AZ","33.604811","-111.72852","-7","0"
+"85269","Fountain Hills","AZ","33.276539","-112.18717","-7","0"
+"85271","Scottsdale","AZ","33.276539","-112.18717","-7","0"
+"85272","Stanfield","AZ","32.852769","-111.97564","-7","0"
+"85273","Superior","AZ","33.28591","-111.11015","-7","0"
+"85274","Mesa","AZ","33.276539","-112.18717","-7","0"
+"85275","Mesa","AZ","33.276539","-112.18717","-7","0"
+"85277","Mesa","AZ","33.276539","-112.18717","-7","0"
+"85278","Apache Junction","AZ","32.983653","-111.326045","-7","0"
+"85279","Florence","AZ","32.983653","-111.326045","-7","0"
+"85280","Tempe","AZ","33.401395","-111.931298","-7","0"
+"85281","Tempe","AZ","33.426885","-111.92733","-7","0"
+"85282","Tempe","AZ","33.394067","-111.92873","-7","0"
+"85283","Tempe","AZ","33.365951","-111.93155","-7","0"
+"85284","Tempe","AZ","33.338333","-111.92962","-7","0"
+"85285","Tempe","AZ","33.276539","-112.18717","-7","0"
+"85286","New River","AZ","33.850506","-112.05927","-7","0"
+"85287","Tempe","AZ","33.428511","-111.934865","-7","0"
+"85288","Scottsdale","AZ","33.672973","-111.889286","-7","0"
+"85289","Tempe","AZ","33.276539","-112.18717","-7","0"
+"85290","Tortilla Flat","AZ","33.276539","-112.18717","-7","0"
+"85291","Valley Farms","AZ","33.013502","-111.42979","-7","0"
+"85292","Winkelman","AZ","32.945838","-110.72198","-7","0"
+"85296","Gilbert","AZ","33.319722","-111.76078","-7","0"
+"85297","Gilbert","AZ","33.272322","-111.714171","-7","0"
+"85299","Gilbert","AZ","33.276539","-112.18717","-7","0"
+"85301","Glendale","AZ","33.534128","-112.1767","-7","0"
+"85302","Glendale","AZ","33.568143","-112.17699","-7","0"
+"85303","Glendale","AZ","33.528166","-112.22189","-7","0"
+"85304","Glendale","AZ","33.594069","-112.17531","-7","0"
+"85305","Glendale","AZ","33.529373","-112.25225","-7","0"
+"85306","Glendale","AZ","33.624546","-112.1767","-7","0"
+"85307","Glendale","AZ","33.529314","-112.30607","-7","0"
+"85308","Glendale","AZ","33.657722","-112.17825","-7","0"
+"85309","Luke AFB","AZ","33.533985","-112.37688","-7","0"
+"85310","Glendale","AZ","33.701173","-112.17614","-7","0"
+"85311","Glendale","AZ","33.276539","-112.18717","-7","0"
+"85312","Glendale","AZ","33.276539","-112.18717","-7","0"
+"85313","Glendale","AZ","33.276539","-112.18717","-7","0"
+"85317","Carefree","AZ","33.820609","-111.886707","-7","0"
+"85318","Glendale","AZ","33.276539","-112.18717","-7","0"
+"85320","Aguila","AZ","33.945183","-113.19837","-7","0"
+"85321","Ajo","AZ","32.331853","-112.78694","-7","0"
+"85322","Arlington","AZ","33.274422","-112.78934","-7","0"
+"85323","Avondale","AZ","33.454441","-112.32401","-7","0"
+"85324","Black Canyon City","AZ","34.10865","-112.10088","-7","0"
+"85325","Bouse","AZ","33.946064","-113.9537","-7","0"
+"85326","Buckeye","AZ","33.354418","-112.56941","-7","0"
+"85327","Cave Creek","AZ","33.276539","-112.18717","-7","0"
+"85328","Cibola","AZ","33.326956","-114.68562","-7","0"
+"85329","Cashion","AZ","33.431242","-112.29588","-7","0"
+"85330","Wickenburg","AZ","33.973301","-112.722998","-7","0"
+"85331","Cave Creek","AZ","33.789204","-111.96301","-7","0"
+"85332","Congress","AZ","34.177939","-112.9307","-7","0"
+"85333","Dateland","AZ","32.921712","-113.45703","-7","0"
+"85334","Ehrenberg","AZ","33.631915","-114.49095","-7","0"
+"85335","El Mirage","AZ","33.596823","-112.32364","-7","0"
+"85336","Gadsden","AZ","32.532458","-114.78056","-7","0"
+"85337","Gila Bend","AZ","32.971684","-112.7946","-7","0"
+"85338","Goodyear","AZ","33.430922","-112.38482","-7","0"
+"85339","Laveen","AZ","33.352795","-112.16752","-7","0"
+"85340","Litchfield Park","AZ","33.50835","-112.40523","-7","0"
+"85341","Lukeville","AZ","31.970131","-111.890713","-7","0"
+"85342","Morristown","AZ","33.939162","-112.49976","-7","0"
+"85343","Palo Verde","AZ","33.276539","-112.18717","-7","0"
+"85344","Parker","AZ","34.100704","-114.30462","-7","0"
+"85345","Peoria","AZ","33.573602","-112.23984","-7","0"
+"85346","Quartzsite","AZ","33.654343","-114.23325","-7","0"
+"85347","Roll","AZ","32.744976","-113.85421","-7","0"
+"85348","Salome","AZ","33.730443","-113.62376","-7","0"
+"85349","San Luis","AZ","32.494054","-114.77866","-7","0"
+"85350","Somerton","AZ","32.58193","-114.71199","-7","0"
+"85351","Sun City","AZ","33.60642","-112.28316","-7","0"
+"85352","Tacna","AZ","32.693448","-113.976313","-7","0"
+"85353","Tolleson","AZ","33.426423","-112.28299","-7","0"
+"85354","Tonopah","AZ","33.452432","-113.01652","-7","0"
+"85355","Waddell","AZ","33.569705","-112.44792","-7","0"
+"85356","Wellton","AZ","32.676125","-114.13546","-7","0"
+"85357","Wenden","AZ","33.843519","-113.53441","-7","0"
+"85358","Wickenburg","AZ","33.276539","-112.18717","-7","0"
+"85359","Quartzsite","AZ","33.66688","-114.239557","-7","0"
+"85360","Wikieup","AZ","34.681394","-113.5935","-7","0"
+"85361","Wittmann","AZ","33.739904","-112.59778","-7","0"
+"85362","Yarnell","AZ","34.286193","-112.69667","-7","0"
+"85363","Youngtown","AZ","33.588225","-112.30263","-7","0"
+"85364","Yuma","AZ","32.704499","-114.64644","-7","0"
+"85365","Yuma","AZ","32.700018","-114.52671","-7","0"
+"85366","Yuma","AZ","32.609959","-114.631172","-7","0"
+"85367","Yuma","AZ","32.654701","-114.40884","-7","0"
+"85369","Yuma","AZ","32.751632","-114.074901","-7","0"
+"85371","Poston","AZ","34.031791","-114.390171","-7","0"
+"85372","Sun City","AZ","33.276539","-112.18717","-7","0"
+"85373","Sun City","AZ","33.66156","-112.28931","-7","0"
+"85374","Surprise","AZ","33.643508","-112.38502","-7","0"
+"85375","Sun City West","AZ","33.683352","-112.36474","-7","0"
+"85376","Sun City West","AZ","33.276539","-112.18717","-7","0"
+"85377","Carefree","AZ","33.276539","-112.18717","-7","0"
+"85378","Surprise","AZ","33.276539","-112.18717","-7","0"
+"85379","Surprise","AZ","33.616888","-112.40158","-7","0"
+"85380","Peoria","AZ","33.276539","-112.18717","-7","0"
+"85381","Peoria","AZ","33.60864","-112.22791","-7","0"
+"85382","Peoria","AZ","33.689869","-112.24838","-7","0"
+"85383","Peoria","AZ","33.700837","-112.244827","-7","0"
+"85385","Peoria","AZ","33.276539","-112.18717","-7","0"
+"85387","Surprise","AZ","33.276539","-112.18717","-7","0"
+"85390","Wickenburg","AZ","33.961122","-112.76952","-7","0"
+"85395","Peoria","AZ","33.580089","-112.246311","-7","0"
+"85439","San Luis","AZ","32.491745","-114.784135","-7","0"
+"85501","Globe","AZ","33.53457","-110.75681","-7","0"
+"85502","Globe","AZ","33.421919","-110.81268","-7","0"
+"85522","Thatcher","AZ","32.850901","-109.767893","-7","0"
+"85530","Bylas","AZ","33.053797","-110.22921","-7","0"
+"85531","Central","AZ","32.872122","-109.79267","-7","0"
+"85532","Claypool","AZ","33.415409","-110.814893","-7","0"
+"85533","Clifton","AZ","33.122043","-109.2841","-7","0"
+"85534","Duncan","AZ","32.731748","-109.11471","-7","0"
+"85535","Eden","AZ","32.963028","-109.91803","-7","0"
+"85536","Fort Thomas","AZ","33.02874","-109.98719","-7","0"
+"85539","Miami","AZ","33.383937","-110.90026","-7","0"
+"85540","Morenci","AZ","33.044523","-109.32904","-7","0"
+"85541","Payson","AZ","34.243578","-111.28137","-7","0"
+"85542","Peridot","AZ","33.262553","-110.5231","-7","0"
+"85543","Pima","AZ","32.90375","-109.84995","-7","0"
+"85544","Pine","AZ","34.394226","-111.46865","-7","0"
+"85545","Roosevelt","AZ","33.624008","-111.01062","-7","0"
+"85546","Safford","AZ","32.800222","-109.69052","-7","0"
+"85547","Payson","AZ","34.257457","-111.28775","-7","0"
+"85548","Safford","AZ","32.797009","-109.752196","-7","0"
+"85550","San Carlos","AZ","33.37214","-110.11686","-7","0"
+"85551","Solomon","AZ","32.842769","-109.696449","-7","0"
+"85552","Thatcher","AZ","32.816055","-109.76487","-7","0"
+"85553","Tonto Basin","AZ","33.830708","-111.30102","-7","0"
+"85554","Young","AZ","34.093715","-110.96487","-7","0"
+"85601","Arivaca","AZ","31.579152","-111.33413","-7","0"
+"85602","Benson","AZ","32.010164","-110.3182","-7","0"
+"85603","Bisbee","AZ","31.406229","-109.8958","-7","0"
+"85605","Bowie","AZ","32.314118","-109.46196","-7","0"
+"85606","Cochise","AZ","32.054694","-109.81342","-7","0"
+"85607","Douglas","AZ","31.382775","-109.55035","-7","0"
+"85608","Douglas","AZ","31.569536","-109.23407","-7","0"
+"85609","Dragoon","AZ","32.036365","-110.04581","-7","0"
+"85610","Elfrida","AZ","31.724946","-109.64646","-7","0"
+"85611","Elgin","AZ","31.588594","-110.51857","-7","0"
+"85613","Fort Huachuca","AZ","31.541437","-110.30004","-7","0"
+"85614","Green Valley","AZ","31.857504","-111.00904","-7","0"
+"85615","Hereford","AZ","31.429017","-110.23013","-7","0"
+"85616","Huachuca City","AZ","31.684819","-110.34743","-7","0"
+"85617","McNeal","AZ","31.536321","-109.67608","-7","0"
+"85618","Mammoth","AZ","32.70874","-110.63925","-7","0"
+"85619","Mount Lemmon","AZ","32.441496","-110.75682","-7","0"
+"85620","Naco","AZ","31.385182","-109.919794","-7","0"
+"85621","Nogales","AZ","31.37737","-110.9264","-7","0"
+"85622","Green Valley","AZ","31.853334","-110.932803","-7","0"
+"85623","Oracle","AZ","32.625543","-110.77201","-7","0"
+"85624","Patagonia","AZ","31.504439","-110.70794","-7","0"
+"85625","Pearce","AZ","31.911838","-109.7723","-7","0"
+"85626","Pirtleville","AZ","31.357528","-109.611545","-7","0"
+"85627","Pomerene","AZ","32.09881","-110.09917","-7","0"
+"85628","Nogales","AZ","31.531998","-110.909305","-7","0"
+"85629","Sahuarita","AZ","31.939718","-110.97527","-7","0"
+"85630","Saint David","AZ","31.898039","-110.21803","-7","0"
+"85631","San Manuel","AZ","32.597198","-110.60293","-7","0"
+"85632","San Simon","AZ","32.048448","-109.19635","-7","0"
+"85633","Sasabe","AZ","31.632739","-111.49066","-7","0"
+"85634","Sells","AZ","31.998543","-111.93712","-7","0"
+"85635","Sierra Vista","AZ","31.562546","-110.24288","-7","0"
+"85636","Sierra Vista","AZ","31.668685","-110.280111","-7","0"
+"85637","Sonoita","AZ","31.733433","-110.66869","-7","0"
+"85638","Tombstone","AZ","31.714525","-110.06684","-7","0"
+"85639","Topawa","AZ","31.773676","-111.76494","-7","0"
+"85640","Tumacacori","AZ","31.586392","-111.0416","-7","0"
+"85641","Vail","AZ","32.00196","-110.67442","-7","0"
+"85643","Willcox","AZ","32.356537","-109.88461","-7","0"
+"85644","Willcox","AZ","32.30069","-109.878211","-7","0"
+"85645","Amado","AZ","31.718671","-111.09908","-7","0"
+"85646","Tubac","AZ","31.623432","-111.06352","-7","0"
+"85648","Rio Rico","AZ","31.488579","-110.98926","-7","0"
+"85650","Sierra Vista","AZ","31.492003","-110.24699","-7","0"
+"85652","Cortaro","AZ","32.420055","-111.113178","-7","0"
+"85653","Marana","AZ","32.454488","-111.26232","-7","0"
+"85654","Rillito","AZ","32.417221","-111.17135","-7","0"
+"85655","Douglas","AZ","31.880077","-109.754263","-7","0"
+"85662","Nogales","AZ","31.531998","-110.909305","-7","0"
+"85670","Fort Huachuca","AZ","31.880077","-109.754263","-7","0"
+"85671","Sierra Vista","AZ","31.880077","-109.754263","-7","0"
+"85701","Tucson","AZ","32.216743","-110.9696","-7","0"
+"85702","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85703","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85704","Tucson","AZ","32.32764","-110.98801","-7","0"
+"85705","Tucson","AZ","32.260316","-110.98534","-7","0"
+"85706","Tucson","AZ","32.128649","-110.92497","-7","0"
+"85707","Tucson","AZ","32.169577","-110.875093","-7","0"
+"85708","Tucson","AZ","32.196846","-110.89189","-7","0"
+"85709","Tucson","AZ","32.200813","-110.897966","-7","0"
+"85710","Tucson","AZ","32.213291","-110.82559","-7","0"
+"85711","Tucson","AZ","32.216326","-110.88511","-7","0"
+"85712","Tucson","AZ","32.249551","-110.8878","-7","0"
+"85713","Tucson","AZ","32.194909","-110.9757","-7","0"
+"85714","Tucson","AZ","32.170277","-110.95525","-7","0"
+"85715","Tucson","AZ","32.247175","-110.82864","-7","0"
+"85716","Tucson","AZ","32.242275","-110.92533","-7","0"
+"85717","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85718","Tucson","AZ","32.31346","-110.92282","-7","0"
+"85719","Tucson","AZ","32.240625","-110.94791","-7","0"
+"85720","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85721","Tucson","AZ","32.233761","-110.949996","-7","0"
+"85722","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85723","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85724","Tucson","AZ","32.240571","-110.944343","-7","0"
+"85725","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85726","Tucson","AZ","32.202726","-110.945346","-7","0"
+"85728","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85730","Tucson","AZ","32.179227","-110.81032","-7","0"
+"85731","Tucson","AZ","32.088034","-110.708174","-7","0"
+"85732","Tucson","AZ","32.084775","-110.71225","-7","0"
+"85733","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85734","Tucson","AZ","32.065082","-110.935337","-7","0"
+"85735","Tucson","AZ","32.13918","-111.23968","-7","0"
+"85736","Tucson","AZ","31.979764","-111.29398","-7","0"
+"85737","Tucson","AZ","32.417144","-110.96354","-7","0"
+"85738","Catalina","AZ","31.970131","-111.890713","-7","0"
+"85739","Tucson","AZ","32.521096","-110.9087","-7","0"
+"85740","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85741","Tucson","AZ","32.338126","-111.04259","-7","0"
+"85742","Tucson","AZ","32.385588","-111.05582","-7","0"
+"85743","Tucson","AZ","32.335122","-111.14888","-7","0"
+"85744","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85745","Tucson","AZ","32.242724","-111.0209","-7","0"
+"85746","Tucson","AZ","32.126223","-111.04599","-7","0"
+"85747","Tucson","AZ","32.109302","-110.77573","-7","0"
+"85748","Tucson","AZ","32.216926","-110.76851","-7","0"
+"85749","Tucson","AZ","32.299275","-110.74419","-7","0"
+"85750","Tucson","AZ","32.292078","-110.84384","-7","0"
+"85751","Tucson","AZ","32.161972","-110.714678","-7","0"
+"85752","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85754","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85775","Tucson","AZ","31.970131","-111.890713","-7","0"
+"85777","Tucson","AZ","32.071764","-110.859106","-7","0"
+"85807","New River","AZ","33.876452","-112.088337","-7","0"
+"85901","Show Low","AZ","34.271427","-110.03676","-7","0"
+"85902","Show Low","AZ","34.298092","-110.035185","-7","0"
+"85911","Cibecue","AZ","34.102913","-110.55639","-7","0"
+"85912","White Mountain Lake","AZ","34.266588","-110.203073","-7","0"
+"85920","Alpine","AZ","33.836157","-109.19785","-7","0"
+"85922","Blue","AZ","33.681485","-109.24946","-7","0"
+"85923","Clay Springs","AZ","34.364618","-110.29487","-7","0"
+"85924","Concho","AZ","34.448733","-109.7114","-7","0"
+"85925","Eagar","AZ","34.109777","-109.34532","-7","0"
+"85926","Fort Apache","AZ","34.074253","-109.86356","-7","0"
+"85927","Greer","AZ","33.801744","-109.58336","-7","0"
+"85928","Heber","AZ","34.563994","-110.55929","-7","0"
+"85929","Lakeside","AZ","34.162407","-109.9952","-7","0"
+"85930","Mcnary","AZ","34.04421","-109.73709","-7","0"
+"85931","Forest Lakes","AZ","34.393887","-110.83591","-7","0"
+"85932","Nutrioso","AZ","33.927014","-109.22149","-7","0"
+"85933","Overgaard","AZ","34.392829","-110.52048","-7","0"
+"85934","Pinedale","AZ","34.270743","-110.26032","-7","0"
+"85935","Pinetop","AZ","34.121008","-109.91503","-7","0"
+"85936","Saint Johns","AZ","34.558663","-109.40254","-7","0"
+"85937","Snowflake","AZ","34.560896","-110.03633","-7","0"
+"85938","Springerville","AZ","34.094597","-109.22291","-7","0"
+"85939","Taylor","AZ","34.442667","-110.09181","-7","0"
+"85940","Vernon","AZ","34.268984","-109.67514","-7","0"
+"85941","Whiteriver","AZ","33.849439","-110.03334","-7","0"
+"85942","Woodruff","AZ","34.778649","-109.96697","-7","0"
+"86001","Flagstaff","AZ","35.279872","-111.72256","-7","0"
+"86002","Flagstaff","AZ","35.630842","-112.052427","-7","0"
+"86003","Flagstaff","AZ","35.630842","-112.052427","-7","0"
+"86004","Flagstaff","AZ","35.253002","-111.44851","-7","0"
+"86011","Flagstaff","AZ","35.630842","-112.052427","-7","0"
+"86015","Bellemont","AZ","35.235694","-111.83","-7","0"
+"86016","Gray Mountain","AZ","35.675689","-111.49474","-7","0"
+"86017","Munds Park","AZ","34.9372","-111.62931","-7","0"
+"86018","Parks","AZ","35.197566","-111.93253","-7","0"
+"86020","Cameron","AZ","36.182818","-111.5472","-7","0"
+"86021","Colorado City","AZ","36.985868","-112.9791","-7","0"
+"86022","Fredonia","AZ","36.844685","-112.47107","-7","0"
+"86023","Grand Canyon","AZ","35.862292","-112.06498","-7","0"
+"86024","Happy Jack","AZ","34.690846","-111.16676","-7","0"
+"86025","Holbrook","AZ","34.936261","-110.14698","-7","0"
+"86028","Petrified Forest Natl Pk","AZ","35.237487","-109.52295","-7","0"
+"86029","Sun Valley","AZ","35.285746","-110.288704","-7","0"
+"86030","Hotevilla","AZ","36.115339","-110.61562","-7","0"
+"86031","Indian Wells","AZ","35.48041","-110.09228","-7","0"
+"86032","Joseph City","AZ","35.101925","-110.42509","-7","0"
+"86033","Kayenta","AZ","36.608485","-110.18425","-7","0"
+"86034","Keams Canyon","AZ","35.765669","-110.18617","-7","0"
+"86035","Leupp","AZ","35.335107","-110.99972","-7","0"
+"86036","Marble Canyon","AZ","36.618595","-111.85444","-7","0"
+"86038","Mormon Lake","AZ","34.908287","-111.463026","-7","0"
+"86039","Kykotsmovi Village","AZ","36.00059","-110.5201","-7","0"
+"86040","Page","AZ","36.726377","-111.4284","-7","0"
+"86042","Polacca","AZ","35.835642","-110.36628","-7","0"
+"86043","Second Mesa","AZ","35.777227","-110.50131","-7","0"
+"86044","Tonalea","AZ","36.507554","-110.86804","-7","0"
+"86045","Tuba City","AZ","36.061184","-111.06828","-7","0"
+"86046","Williams","AZ","35.378832","-112.23657","-7","0"
+"86047","Winslow","AZ","35.258309","-110.53128","-7","0"
+"86052","North Rim","AZ","36.499283","-112.23039","-7","0"
+"86053","Kaibito","AZ","36.556111","-111.10495","-7","0"
+"86054","Shonto","AZ","36.630103","-110.65072","-7","0"
+"86231","Bagdad","AZ","34.581245","-113.16874","-7","0"
+"86301","Prescott","AZ","34.589477","-112.44726","-7","0"
+"86302","Prescott","AZ","34.574921","-112.491528","-7","0"
+"86303","Prescott","AZ","34.515939","-112.45399","-7","0"
+"86304","Prescott","AZ","34.59668","-112.49066","-7","0"
+"86305","Prescott","AZ","34.70062","-112.63753","-7","0"
+"86312","Prescott Valley","AZ","34.668291","-112.307777","-7","0"
+"86313","Prescott","AZ","34.706724","-112.39773","-7","0"
+"86314","Prescott Valley","AZ","34.621743","-112.32176","-7","0"
+"86320","Ash Fork","AZ","35.178163","-112.56465","-7","0"
+"86321","Bagdad","AZ","34.543627","-113.11473","-7","0"
+"86322","Camp Verde","AZ","34.556478","-111.84375","-7","0"
+"86323","Chino Valley","AZ","34.765452","-112.45931","-7","0"
+"86324","Clarkdale","AZ","34.767841","-112.06438","-7","0"
+"86325","Cornville","AZ","34.718836","-111.90168","-7","0"
+"86326","Cottonwood","AZ","34.723788","-112.01002","-7","0"
+"86327","Dewey","AZ","34.533237","-112.20644","-7","0"
+"86329","Humboldt","AZ","34.518883","-112.25234","-7","0"
+"86330","Iron Springs","AZ","34.706724","-112.39773","-7","0"
+"86331","Jerome","AZ","34.74428","-112.14586","-7","0"
+"86332","Kirkland","AZ","34.426513","-112.6261","-7","0"
+"86333","Mayer","AZ","34.339938","-112.13612","-7","0"
+"86334","Paulden","AZ","34.910591","-112.46252","-7","0"
+"86335","Rimrock","AZ","34.653475","-111.75103","-7","0"
+"86336","Sedona","AZ","34.876638","-111.80666","-7","0"
+"86337","Seligman","AZ","35.334394","-113.05774","-7","0"
+"86338","Skull Valley","AZ","34.557983","-112.70556","-7","0"
+"86339","Sedona","AZ","34.907188","-111.728572","-7","0"
+"86340","Sedona","AZ","34.706724","-112.39773","-7","0"
+"86341","Sedona","AZ","34.776648","-111.76788","-7","0"
+"86342","Lake Montezuma","AZ","34.641736","-111.787154","-7","0"
+"86343","Crown King","AZ","34.201191","-112.3501","-7","0"
+"86344","Paulden","AZ","34.907296","-112.492365","-7","0"
+"86351","Sedona","AZ","34.782453","-111.76764","-7","0"
+"86361","Bagdad","AZ","34.572995","-113.183806","-7","0"
+"86366","Cottonwood","AZ","34.704667","-111.989364","-7","0"
+"86401","Kingman","AZ","35.25925","-113.95225","-7","0"
+"86402","Kingman","AZ","35.263249","-114.063651","-7","0"
+"86403","Lake Havasu City","AZ","34.483582","-114.33694","-7","0"
+"86404","Lake Havasu City","AZ","34.546899","-114.32546","-7","0"
+"86405","Lake Havasu City","AZ","35.605301","-113.642712","-7","0"
+"86406","Lake Havasu City","AZ","34.469945","-114.27861","-7","0"
+"86411","Hackberry","AZ","35.605301","-113.642712","-7","0"
+"86412","Hualapai","AZ","35.397172","-113.843241","-7","0"
+"86413","Golden Valley","AZ","35.190896","-114.24036","-7","0"
+"86422","Bullhead City","AZ","35.109303","-114.574004","-7","0"
+"86426","Fort Mohave","AZ","35.013495","-114.58524","-7","0"
+"86427","Fort Mohave","AZ","35.00429","-114.581228","-7","0"
+"86429","Bullhead City","AZ","35.172854","-114.54696","-7","0"
+"86430","Bullhead City","AZ","35.256802","-114.49451","-7","0"
+"86431","Chloride","AZ","35.413284","-114.21626","-7","0"
+"86432","Littlefield","AZ","36.903232","-113.94024","-7","0"
+"86433","Oatman","AZ","35.030577","-114.38928","-7","0"
+"86434","Peach Springs","AZ","35.482227","-113.5121","-7","0"
+"86435","Supai","AZ","36.198652","-112.51013","-7","0"
+"86436","Topock","AZ","34.782526","-114.4663","-7","0"
+"86437","Valentine","AZ","35.386906","-113.66065","-7","0"
+"86438","Yucca","AZ","34.805546","-114.14175","-7","0"
+"86439","Bullhead City","AZ","35.095848","-114.619445","-7","0"
+"86440","Mohave Valley","AZ","34.888406","-114.57354","-7","0"
+"86441","Dolan Springs","AZ","35.607935","-114.30203","-7","0"
+"86442","Bullhead City","AZ","35.097719","-114.59734","-7","0"
+"86443","Temple Bar Marina","AZ","35.210634","-114.179228","-7","0"
+"86444","Meadview","AZ","35.950442","-114.07783","-7","0"
+"86445","Willow Beach","AZ","35.605301","-113.642712","-7","0"
+"86446","Mohave Valley","AZ","34.849946","-114.591728","-7","0"
+"86502","Chambers","AZ","35.213287","-109.54223","-7","0"
+"86503","Chinle","AZ","36.165779","-109.61956","-7","0"
+"86504","Fort Defiance","AZ","35.771067","-109.17878","-7","0"
+"86505","Ganado","AZ","35.665344","-109.65344","-7","0"
+"86506","Houck","AZ","35.368902","-109.22194","-7","0"
+"86507","Lukachukai","AZ","36.423229","-109.29689","-7","0"
+"86508","Lupton","AZ","35.325261","-109.07847","-7","0"
+"86510","Pinon","AZ","36.110934","-110.20181","-7","0"
+"86511","Saint Michaels","AZ","35.610285","-109.2093","-7","0"
+"86512","Sanders","AZ","35.15632","-109.32309","-7","0"
+"86514","Teec Nos Pos","AZ","36.88092","-109.33634","-7","0"
+"86515","Window Rock","AZ","35.672842","-109.06495","-7","0"
+"86520","Blue Gap","AZ","36.045603","-110.00633","-7","0"
+"86535","Dennehotso","AZ","36.798893","-109.86488","-7","0"
+"86538","Many Farms","AZ","36.374317","-109.6007","-7","0"
+"86540","Nazlini","AZ","35.952827","-109.41297","-7","0"
+"86544","Red Valley","AZ","36.59559","-109.11872","-7","0"
+"86545","Rock Point","AZ","36.662243","-109.59931","-7","0"
+"86547","Round Rock","AZ","36.494915","-109.45613","-7","0"
+"86549","Sawmill","AZ","35.958014","-109.17551","-7","0"
+"86551","Big Park","AZ","34.780464","-111.759944","-7","0"
+"86556","Tsaile","AZ","36.272262","-109.17516","-7","0"
+"86631","Jerome","AZ","34.748879","-112.115853","-7","0"
+"87001","Algodones","NM","35.388701","-106.42793","-7","1"
+"87002","Belen","NM","34.646779","-106.7648","-7","1"
+"87004","Bernalillo","NM","35.32151","-106.55322","-7","1"
+"87005","Bluewater","NM","35.20912","-108.07182","-7","1"
+"87006","Bosque","NM","34.511223","-106.80927","-7","1"
+"87007","Casa Blanca","NM","35.047954","-107.45148","-7","1"
+"87008","Cedar Crest","NM","35.136495","-106.37296","-7","1"
+"87009","Cedarvale","NM","34.650925","-105.880597","-7","1"
+"87010","Cerrillos","NM","35.409522","-106.15202","-7","1"
+"87011","Claunch","NM","34.032895","-106.03034","-7","1"
+"87012","Coyote","NM","36.195444","-106.6583","-7","1"
+"87013","Cuba","NM","35.869051","-107.40227","-7","1"
+"87014","Cubero","NM","35.166618","-107.5052","-7","1"
+"87015","Edgewood","NM","35.075777","-106.19155","-7","1"
+"87016","Estancia","NM","34.775863","-106.12269","-7","1"
+"87017","Gallina","NM","36.187444","-106.76581","-7","1"
+"87018","Counselor","NM","36.203634","-107.49441","-7","1"
+"87020","Grants","NM","35.122129","-107.90777","-7","1"
+"87021","Milan","NM","35.192539","-107.893691","-7","1"
+"87022","Isleta","NM","34.906197","-106.69301","-7","1"
+"87023","Jarales","NM","34.598268","-106.7592","-7","1"
+"87024","Jemez Pueblo","NM","35.624111","-106.73752","-7","1"
+"87025","Jemez Springs","NM","35.822802","-106.62093","-7","1"
+"87026","Laguna","NM","34.999815","-107.24109","-7","1"
+"87027","La Jara","NM","36.151633","-107.00449","-7","1"
+"87028","La Joya","NM","34.34886","-106.8053","-7","1"
+"87029","Lindrith","NM","36.343007","-107.09858","-7","1"
+"87031","Los Lunas","NM","34.786133","-106.70536","-7","1"
+"87032","McIntosh","NM","34.862981","-106.01328","-7","1"
+"87034","Pueblo Of Acoma","NM","34.900203","-107.65365","-7","1"
+"87035","Moriarty","NM","35.001195","-105.99524","-7","1"
+"87036","Mountainair","NM","34.500604","-106.27612","-7","1"
+"87037","Nageezi","NM","36.17798","-107.80037","-7","1"
+"87038","New Laguna","NM","35.05463","-107.44137","-7","1"
+"87040","Paguate","NM","35.132004","-107.36564","-7","1"
+"87041","Pena Blanca","NM","35.584234","-106.32728","-7","1"
+"87042","Peralta","NM","34.83436","-106.68375","-7","1"
+"87043","Placitas","NM","35.303843","-106.44361","-7","1"
+"87044","Ponderosa","NM","35.700027","-106.65317","-7","1"
+"87045","Prewitt","NM","35.408295","-107.98853","-7","1"
+"87046","Regina","NM","35.71742","-106.935844","-7","1"
+"87047","Sandia Park","NM","35.179121","-106.28742","-7","1"
+"87048","Corrales","NM","35.229614","-106.62141","-7","1"
+"87049","San Fidel","NM","35.087772","-107.63451","-7","1"
+"87051","San Rafael","NM","35.15105","-107.87701","-7","1"
+"87052","Santo Domingo Pueblo","NM","35.509184","-106.35022","-7","1"
+"87053","San Ysidro","NM","35.527064","-106.80866","-7","1"
+"87056","Stanley","NM","35.230514","-105.91598","-7","1"
+"87057","Tajique","NM","34.650925","-105.880597","-7","1"
+"87059","Tijeras","NM","35.017604","-106.31044","-7","1"
+"87060","Tome","NM","34.740708","-106.73362","-7","1"
+"87061","Torreon","NM","34.783472","-106.36553","-7","1"
+"87062","Veguita","NM","34.460462","-106.71879","-7","1"
+"87063","Willard","NM","34.43283","-105.95532","-7","1"
+"87064","Youngsville","NM","36.111907","-106.54779","-7","1"
+"87068","Bosque Farms","NM","34.864034","-106.6895","-7","1"
+"87070","Clines Corners","NM","35.00993","-105.97201","-7","1"
+"87072","Cochiti Pueblo","NM","35.612925","-106.34845","-7","1"
+"87083","Cochiti Lake","NM","35.648976","-106.33885","-7","1"
+"87101","Albuquerque","NM","35.199592","-106.644831","-7","1"
+"87102","Albuquerque","NM","35.083946","-106.64792","-7","1"
+"87103","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87104","Albuquerque","NM","35.101727","-106.67238","-7","1"
+"87105","Albuquerque","NM","35.031329","-106.68695","-7","1"
+"87106","Albuquerque","NM","35.078246","-106.61747","-7","1"
+"87107","Albuquerque","NM","35.134094","-106.64073","-7","1"
+"87108","Albuquerque","NM","35.073343","-106.58232","-7","1"
+"87109","Albuquerque","NM","35.155811","-106.56662","-7","1"
+"87110","Albuquerque","NM","35.106396","-106.57927","-7","1"
+"87111","Albuquerque","NM","35.135303","-106.52223","-7","1"
+"87112","Albuquerque","NM","35.100796","-106.52067","-7","1"
+"87113","Albuquerque","NM","35.179635","-106.59384","-7","1"
+"87114","Albuquerque","NM","35.196446","-106.67336","-7","1"
+"87115","Albuquerque","NM","35.054947","-106.546128","-7","1"
+"87116","Albuquerque","NM","35.053147","-106.55102","-7","1"
+"87117","Kirtland AFB","NM","35.056747","-106.571978","-7","1"
+"87118","Albuquerque","NM","35.051847","-106.59427","-7","1"
+"87119","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87120","Albuquerque","NM","35.146144","-106.70851","-7","1"
+"87121","Albuquerque","NM","35.051247","-106.74258","-7","1"
+"87122","Albuquerque","NM","35.18076","-106.52021","-7","1"
+"87123","Albuquerque","NM","35.067447","-106.50645","-7","1"
+"87124","Rio Rancho","NM","35.290647","-106.71469","-7","1"
+"87125","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87131","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87140","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87144","Rio Rancho","NM","35.295331","-106.645081","-7","1"
+"87153","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87154","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87158","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87174","Rio Rancho","NM","35.044339","-106.672872","-7","1"
+"87176","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87180","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87181","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87184","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87185","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87187","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87190","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87191","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87192","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87193","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87194","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87195","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87196","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87197","Albuquerque","NM","35.108573","-106.243911","-7","1"
+"87198","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87199","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87201","Albuquerque","NM","35.044339","-106.672872","-7","1"
+"87301","Gallup","NM","35.534253","-108.84857","-7","1"
+"87302","Gallup","NM","35.480924","-108.176693","-7","1"
+"87305","Gallup","NM","35.376892","-108.78661","-7","1"
+"87310","Brimhall","NM","35.766353","-108.57046","-7","1"
+"87311","Church Rock","NM","35.598798","-108.51792","-7","1"
+"87312","Continental Divide","NM","35.442033","-108.32473","-7","1"
+"87313","Crownpoint","NM","35.761481","-108.10225","-7","1"
+"87315","Fence Lake","NM","34.737855","-108.61359","-7","1"
+"87316","Fort Wingate","NM","35.463071","-108.54595","-7","1"
+"87317","Gamerco","NM","35.597972","-108.76657","-7","1"
+"87319","Mentmore","NM","35.486269","-108.90414","-7","1"
+"87320","Mexican Springs","NM","35.799367","-108.8731","-7","1"
+"87321","Ramah","NM","34.999427","-108.41304","-7","1"
+"87322","Rehoboth","NM","35.533134","-108.65253","-7","1"
+"87323","Thoreau","NM","35.495133","-108.19993","-7","1"
+"87325","Tohatchi","NM","36.002113","-108.6655","-7","1"
+"87326","Vanderwagen","NM","35.295558","-108.81277","-7","1"
+"87327","Zuni","NM","35.06947","-108.72493","-7","1"
+"87328","Navajo","AZ","35.923348","-109.08296","-7","0"
+"87347","Jamestown","NM","35.453355","-108.45374","-7","1"
+"87357","Pinehill","NM","34.888629","-108.27933","-7","1"
+"87364","Sheep Springs","NM","36.119846","-108.71665","-7","1"
+"87365","Smith Lake","NM","35.480924","-108.176693","-7","1"
+"87375","Yatahey","NM","35.680001","-108.79265","-7","1"
+"87378","Navajo","NM","35.902329","-109.031853","-7","1"
+"87401","Farmington","NM","36.625357","-108.19225","-7","1"
+"87402","Farmington","NM","36.785816","-108.14505","-7","1"
+"87410","Aztec","NM","36.837421","-107.96667","-7","1"
+"87412","Blanco","NM","36.681819","-107.48121","-7","1"
+"87413","Bloomfield","NM","36.579374","-107.87907","-7","1"
+"87415","Flora Vista","NM","36.813748","-108.09508","-7","1"
+"87416","Fruitland","NM","36.654783","-108.45001","-7","1"
+"87417","Kirtland","NM","36.763088","-108.3674","-7","1"
+"87418","La Plata","NM","36.927309","-108.15934","-7","1"
+"87419","Navajo Dam","NM","36.901026","-107.52505","-7","1"
+"87420","Shiprock","NM","36.748026","-108.80023","-7","1"
+"87421","Waterflow","NM","36.877607","-108.62606","-7","1"
+"87455","Newcomb","NM","36.272472","-108.79107","-7","1"
+"87461","Sanostee","NM","36.475414","-108.81089","-7","1"
+"87499","Farmington","NM","36.774472","-108.06925","-7","1"
+"87501","Santa Fe","NM","35.755312","-105.99936","-7","1"
+"87502","Santa Fe","NM","35.439937","-106.123698","-7","1"
+"87503","Santa Fe","NM","35.521181","-105.981847","-7","1"
+"87504","Santa Fe","NM","35.893597","-106.007499","-7","1"
+"87505","Santa Fe","NM","35.616662","-105.97926","-7","1"
+"87506","Santa Fe","NM","35.606283","-106.075722","-7","1"
+"87507","Santa Fe","NM","35.615216","-105.952788","-7","1"
+"87508","Santa Fe","NM","35.469938","-105.754453","-7","1"
+"87509","Santa Fe","NM","35.521181","-105.981847","-7","1"
+"87510","Abiquiu","NM","36.2996","-106.40596","-7","1"
+"87511","Alcalde","NM","36.097705","-106.04254","-7","1"
+"87512","Amalia","NM","36.962335","-105.41628","-7","1"
+"87513","Arroyo Hondo","NM","36.534541","-105.67244","-7","1"
+"87514","Arroyo Seco","NM","36.546104","-105.50586","-7","1"
+"87515","Canjilon","NM","36.476265","-106.40996","-7","1"
+"87516","Canones","NM","36.082439","-106.46786","-7","1"
+"87517","Carson","NM","36.333259","-105.81143","-7","1"
+"87518","Cebolla","NM","36.522263","-106.54918","-7","1"
+"87519","Cerro","NM","36.756688","-105.63855","-7","1"
+"87520","Chama","NM","36.874229","-106.55118","-7","1"
+"87521","Chamisal","NM","36.126615","-105.74651","-7","1"
+"87522","Chimayo","NM","35.997094","-105.94533","-7","1"
+"87523","Cordova","NM","36.005591","-105.903255","-7","1"
+"87524","Costilla","NM","36.959631","-105.5809","-7","1"
+"87525","Taos Ski Valley","NM","36.575944","-105.50602","-7","1"
+"87527","Dixon","NM","36.1566","-105.84161","-7","1"
+"87528","Dulce","NM","36.818905","-106.9757","-7","1"
+"87529","El Prado","NM","36.468402","-105.60547","-7","1"
+"87530","El Rito","NM","36.387967","-106.23407","-7","1"
+"87531","Embudo","NM","36.248813","-105.87995","-7","1"
+"87532","Espanola","NM","35.990548","-106.08036","-7","1"
+"87533","Espanola","NM","36.618928","-106.75512","-7","1"
+"87535","Glorieta","NM","35.759271","-105.74841","-7","1"
+"87537","Hernandez","NM","36.094021","-106.17472","-7","1"
+"87538","Ilfeld","NM","35.456288","-104.679611","-7","1"
+"87539","La Madera","NM","36.422525","-106.06145","-7","1"
+"87540","Lamy","NM","35.434943","-105.91873","-7","1"
+"87543","Llano","NM","36.129822","-105.66493","-7","1"
+"87544","Los Alamos","NM","35.86849","-106.29536","-7","1"
+"87545","Los Alamos","NM","35.863858","-106.295255","-7","1"
+"87548","Medanales","NM","36.17634","-106.18489","-7","1"
+"87549","Ojo Caliente","NM","36.362617","-106.02523","-7","1"
+"87551","Los Ojos","NM","36.700526","-106.63695","-7","1"
+"87552","Pecos","NM","35.622261","-105.6422","-7","1"
+"87553","Penasco","NM","36.191998","-105.71543","-7","1"
+"87554","Petaca","NM","36.465416","-106.578513","-7","1"
+"87556","Questa","NM","36.735033","-105.58602","-7","1"
+"87557","Ranchos De Taos","NM","36.377149","-105.67963","-7","1"
+"87558","Red River","NM","36.705987","-105.3955","-7","1"
+"87560","Ribera","NM","35.249513","-105.57658","-7","1"
+"87562","Rowe","NM","35.498227","-105.67671","-7","1"
+"87564","San Cristobal","NM","36.610705","-105.64442","-7","1"
+"87565","San Jose","NM","35.454443","-105.50337","-7","1"
+"87566","San Juan Pueblo","NM","36.074403","-106.07952","-7","1"
+"87567","Santa Cruz","NM","35.994909","-106.03282","-7","1"
+"87569","Serafina","NM","35.345618","-105.26233","-7","1"
+"87571","Taos","NM","36.414942","-105.5808","-7","1"
+"87573","Tererro","NM","35.795217","-105.65799","-7","1"
+"87574","Tesuque","NM","35.787442","-105.915713","-7","1"
+"87575","Tierra Amarilla","NM","36.64863","-106.54091","-7","1"
+"87576","Trampas","NM","36.504515","-105.62924","-7","1"
+"87577","Tres Piedras","NM","36.631809","-105.9267","-7","1"
+"87578","Truchas","NM","36.036721","-105.78702","-7","1"
+"87579","Vadito","NM","36.160484","-105.56045","-7","1"
+"87580","Valdez","NM","36.546068","-105.60728","-7","1"
+"87581","Vallecitos","NM","36.537146","-106.13395","-7","1"
+"87582","Velarde","NM","36.14773","-105.98866","-7","1"
+"87583","Villanueva","NM","35.276415","-105.33759","-7","1"
+"87585","Santa Fe","NM","35.632858","-106.044394","-7","1"
+"87592","Santa Fe","NM","35.521181","-105.981847","-7","1"
+"87594","Santa Fe","NM","35.521181","-105.981847","-7","1"
+"87701","Las Vegas","NM","35.594103","-105.08142","-7","1"
+"87710","Angel Fire","NM","36.363506","-105.24877","-7","1"
+"87711","Anton Chico","NM","35.203048","-105.15426","-7","1"
+"87712","Buena Vista","NM","35.881516","-105.18498","-7","1"
+"87713","Chacon","NM","36.14795","-105.37302","-7","1"
+"87714","Cimarron","NM","36.59956","-105.01333","-7","1"
+"87715","Cleveland","NM","36.006137","-105.39831","-7","1"
+"87718","Eagle Nest","NM","36.595247","-105.29165","-7","1"
+"87722","Guadalupita","NM","36.188161","-105.23043","-7","1"
+"87723","Holman","NM","36.045092","-105.3833","-7","1"
+"87724","La Loma","NM","35.173408","-104.98272","-7","1"
+"87728","Maxwell","NM","36.565525","-104.52049","-7","1"
+"87729","Miami","NM","36.358816","-104.82618","-7","1"
+"87730","Mills","NM","36.132502","-104.23902","-7","1"
+"87731","Montezuma","NM","35.711505","-105.41406","-7","1"
+"87732","Mora","NM","35.971938","-105.34137","-7","1"
+"87733","Mosquero","NM","35.80364","-103.90051","-7","1"
+"87734","Ocate","NM","36.197152","-105.10727","-7","1"
+"87735","Ojo Feliz","NM","36.074211","-105.11586","-7","1"
+"87736","Rainsville","NM","35.974115","-105.17633","-7","1"
+"87740","Raton","NM","36.78767","-104.38693","-7","1"
+"87742","Rociada","NM","35.856035","-105.42596","-7","1"
+"87743","Roy","NM","36.004279","-103.86353","-7","1"
+"87745","Sapello","NM","35.751778","-105.2258","-7","1"
+"87746","Solano","NM","35.804116","-103.902091","-7","1"
+"87747","Springer","NM","36.366344","-104.39211","-7","1"
+"87749","Ute Park","NM","36.606924","-104.692463","-7","1"
+"87750","Valmora","NM","35.798216","-104.85007","-7","1"
+"87752","Wagon Mound","NM","36.02239","-104.65018","-7","1"
+"87753","Watrous","NM","35.880398","-104.98925","-7","1"
+"87801","Socorro","NM","33.953237","-106.93722","-7","1"
+"87820","Aragon","NM","33.871414","-108.57547","-7","1"
+"87821","Datil","NM","33.934215","-108.05889","-7","1"
+"87823","Lemitar","NM","34.150585","-106.92814","-7","1"
+"87824","Luna","NM","33.879513","-108.91977","-7","1"
+"87825","Magdalena","NM","34.139451","-107.36816","-7","1"
+"87827","Pie Town","NM","34.387137","-108.14528","-7","1"
+"87828","Polvadera","NM","34.201613","-106.92146","-7","1"
+"87829","Quemado","NM","34.330192","-108.63899","-7","1"
+"87830","Reserve","NM","33.638186","-108.66387","-7","1"
+"87831","San Acacia","NM","34.326229","-106.87734","-7","1"
+"87832","San Antonio","NM","34.046275","-106.60285","-7","1"
+"87901","Truth Or Consequences","NM","33.148245","-107.18741","-7","1"
+"87910","Truth or Consequences","NM","33.127764","-107.260088","-7","1"
+"87930","Arrey","NM","32.807462","-107.32655","-7","1"
+"87931","Caballo","NM","32.969955","-107.36322","-7","1"
+"87933","Derry","NM","32.791076","-107.28652","-7","1"
+"87935","Elephant Butte","NM","33.208473","-107.22065","-7","1"
+"87936","Garfield","NM","32.760034","-107.27535","-7","1"
+"87937","Hatch","NM","32.603957","-107.16806","-7","1"
+"87939","Monticello","NM","33.377012","-107.43337","-7","1"
+"87940","Rincon","NM","32.620805","-107.02161","-7","1"
+"87941","Salem","NM","32.699873","-107.13794","-7","1"
+"87942","Williamsburg","NM","33.095526","-107.35393","-7","1"
+"87943","Winston","NM","33.252863","-107.69183","-7","1"
+"87945","Williamsburg","NM","33.116336","-107.28747","-7","1"
+"88001","Las Cruces","NM","32.300193","-106.76078","-7","1"
+"88002","White Sands Missile Range","NM","32.355099","-106.46884","-7","1"
+"88003","Las Cruces","NM","32.279944","-106.7541","-7","1"
+"88004","Las Cruces","NM","32.204171","-106.93052","-7","1"
+"88005","Las Cruces","NM","32.347752","-106.81463","-7","1"
+"88006","Las Cruces","NM","32.305193","-106.786259","-7","1"
+"88007","Las Cruces","NM","32.356091","-106.830111","-7","1"
+"88008","Santa Teresa","NM","31.879712","-106.71763","-7","1"
+"88009","Playas","NM","31.859178","-108.53985","-7","1"
+"88011","Las Cruces","NM","32.312506","-106.70306","-7","1"
+"88012","Las Cruces","NM","32.417871","-106.6977","-7","1"
+"88018","Sunland Park","NM","31.840649","-106.615936","-7","1"
+"88020","Animas","NM","31.861247","-108.81515","-7","1"
+"88021","Anthony","NM","32.013822","-106.5443","-7","1"
+"88022","Arenas Valley","NM","32.781205","-108.15795","-7","1"
+"88023","Bayard","NM","32.774869","-108.10736","-7","1"
+"88024","Berino","NM","32.068299","-106.61689","-7","1"
+"88025","Buckhorn","NM","33.034435","-108.70302","-7","1"
+"88026","Santa Clara","NM","32.775681","-108.15359","-7","1"
+"88027","Chamberino","NM","32.036669","-106.68516","-7","1"
+"88028","Cliff","NM","32.53667","-108.327898","-7","1"
+"88029","Columbus","NM","31.823645","-107.73529","-7","1"
+"88030","Deming","NM","32.223023","-107.71282","-7","1"
+"88031","Deming","NM","32.239815","-107.74042","-7","1"
+"88032","Dona Ana","NM","32.393919","-106.800976","-7","1"
+"88033","Fairacres","NM","32.19563","-107.10461","-7","1"
+"88034","Faywood","NM","32.693536","-107.906536","-7","1"
+"88036","Fort Bayard","NM","32.815317","-108.15086","-7","1"
+"88038","Gila","NM","32.961804","-108.44042","-7","1"
+"88039","Glenwood","NM","33.401692","-108.63575","-7","1"
+"88040","Hachita","NM","31.928038","-108.3645","-7","1"
+"88041","Hanover","NM","32.726051","-107.97807","-7","1"
+"88042","Hillsboro","NM","32.834372","-107.59761","-7","1"
+"88043","Hurley","NM","32.673398","-108.11625","-7","1"
+"88044","La Mesa","NM","32.149321","-106.72283","-7","1"
+"88045","Lordsburg","NM","32.350444","-108.73956","-7","1"
+"88046","Mesilla","NM","32.267993","-106.805867","-7","1"
+"88047","Mesilla Park","NM","32.213198","-106.71991","-7","1"
+"88048","Mesquite","NM","32.152569","-106.66112","-7","1"
+"88049","Mimbres","NM","33.029102","-108.14114","-7","1"
+"88051","Mule Creek","NM","33.091874","-108.94007","-7","1"
+"88052","Organ","NM","32.437435","-106.60256","-7","1"
+"88053","Pinos Altos","NM","32.872349","-108.21816","-7","1"
+"88054","Radium Springs","NM","32.488841","-106.914575","-7","1"
+"88055","Redrock","NM","32.802474","-108.90341","-7","1"
+"88056","Rodeo","NM","31.766132","-108.93389","-7","1"
+"88058","San Miguel","NM","32.41815","-106.820075","-7","1"
+"88061","Silver City","NM","32.729758","-108.30206","-7","1"
+"88062","Silver City","NM","32.728228","-108.137931","-7","1"
+"88063","Sunland Park","NM","31.799253","-106.57771","-7","1"
+"88065","Tyrone","NM","32.707876","-108.30257","-7","1"
+"88072","Vado","NM","32.123655","-106.63846","-7","1"
+"88081","Chaparral","NM","32.031665","-106.400486","-7","1"
+"88085","Las Cruces","NM","32.336251","-106.792993","-7","1"
+"88100","Grady","NM","34.6705","-103.329901","-7","1"
+"88101","Clovis","NM","34.432846","-103.22589","-7","1"
+"88102","Clovis","NM","34.628472","-103.391269","-7","1"
+"88103","Cannon AFB","NM","34.401452","-103.326445","-7","1"
+"88112","Broadview","NM","34.857544","-103.15193","-7","1"
+"88113","Causey","NM","33.843464","-103.10002","-7","1"
+"88114","Crossroads","NM","33.526887","-103.32392","-7","1"
+"88115","Dora","NM","33.931311","-103.35459","-7","1"
+"88116","Elida","NM","33.79692","-103.87575","-7","1"
+"88118","Floyd","NM","34.215025","-103.61576","-7","1"
+"88119","Fort Sumner","NM","34.346673","-104.24242","-7","1"
+"88120","Grady","NM","34.865507","-103.40619","-7","1"
+"88121","House","NM","34.706943","-103.97475","-7","1"
+"88122","Kenna","NM","33.883159","-103.709525","-7","1"
+"88123","Lingo","NM","33.717607","-103.145119","-7","1"
+"88124","Melrose","NM","34.528601","-103.62567","-7","1"
+"88125","Milnesand","NM","33.628946","-103.1837","-7","1"
+"88126","Pep","NM","33.793145","-103.27741","-7","1"
+"88130","Portales","NM","34.166231","-103.34255","-7","1"
+"88132","Rogers","NM","33.922767","-103.16138","-7","1"
+"88133","Saint Vrain","NM","34.475607","-103.46686","-7","1"
+"88134","Taiban","NM","34.429099","-103.96633","-7","1"
+"88135","Texico","NM","34.511478","-103.06869","-7","1"
+"88136","Yeso","NM","34.321787","-104.7305","-7","1"
+"88201","Roswell","NM","33.485178","-104.55089","-7","1"
+"88202","Roswell","NM","33.303825","-104.431788","-7","1"
+"88203","Roswell","NM","33.363439","-104.524894","-7","1"
+"88210","Artesia","NM","32.795467","-104.38083","-7","1"
+"88211","Artesia","NM","32.753571","-104.328113","-7","1"
+"88213","Caprock","NM","33.455761","-103.63843","-7","1"
+"88220","Carlsbad","NM","32.408311","-104.29134","-7","1"
+"88221","Carlsbad","NM","32.342033","-104.293691","-7","1"
+"88230","Dexter","NM","33.244151","-104.3334","-7","1"
+"88231","Eunice","NM","32.439762","-103.23598","-7","1"
+"88232","Hagerman","NM","33.060827","-104.33708","-7","1"
+"88240","Hobbs","NM","32.70778","-103.16616","-7","1"
+"88241","Hobbs","NM","32.7475","-103.216516","-7","1"
+"88242","Hobbs","NM","32.787805","-103.14592","-7","1"
+"88244","Hobbs","NM","32.785417","-103.433804","-7","1"
+"88250","Hope","NM","32.735982","-104.88576","-7","1"
+"88252","Jal","NM","32.188493","-103.26808","-7","1"
+"88253","Lake Arthur","NM","32.954421","-104.45187","-7","1"
+"88254","Lakewood","NM","32.65886","-104.45128","-7","1"
+"88255","Loco Hills","NM","32.74209","-103.96139","-7","1"
+"88256","Loving","NM","32.27936","-103.98784","-7","1"
+"88260","Lovington","NM","32.901887","-103.44623","-7","1"
+"88262","McDonald","NM","33.148388","-103.35216","-7","1"
+"88263","Malaga","NM","32.079363","-103.972","-7","1"
+"88264","Maljamar","NM","32.878526","-103.71399","-7","1"
+"88265","Monument","NM","32.590107","-103.30857","-7","1"
+"88267","Tatum","NM","33.270355","-103.42377","-7","1"
+"88268","Whites City","NM","32.188634","-104.36153","-7","1"
+"88301","Carrizozo","NM","33.710312","-105.88218","-7","1"
+"88310","Alamogordo","NM","32.839921","-105.97561","-7","1"
+"88311","Alamogordo","NM","32.695546","-105.612595","-7","1"
+"88312","Alto","NM","33.420542","-105.63599","-7","1"
+"88314","Bent","NM","33.158737","-105.85196","-7","1"
+"88315","Boles Acres","NM","32.806612","-105.99002","-7","1"
+"88316","Capitan","NM","33.722955","-105.41326","-7","1"
+"88317","Cloudcroft","NM","32.943661","-105.68568","-7","1"
+"88318","Corona","NM","34.156361","-105.33238","-7","1"
+"88321","Encino","NM","34.750736","-105.51307","-7","1"
+"88323","Fort Stanton","NM","33.492448","-105.53021","-7","1"
+"88324","Glencoe","NM","33.429637","-105.48489","-7","1"
+"88325","High Rolls Mountain Park","NM","32.902131","-105.81338","-7","1"
+"88330","Holloman Air Force Base","NM","32.841331","-106.07948","-7","1"
+"88332","La Luz","NM","32.980058","-105.938768","-7","1"
+"88336","Hondo","NM","33.285158","-105.26783","-7","1"
+"88337","La Luz","NM","33.001397","-105.91512","-7","1"
+"88338","Lincoln","NM","33.479136","-105.35812","-7","1"
+"88339","Mayhill","NM","32.923979","-105.40542","-7","1"
+"88340","Mescalero","NM","33.157278","-105.73266","-7","1"
+"88341","Nogal","NM","33.520074","-105.73072","-7","1"
+"88342","Orogrande","NM","32.405061","-106.079686","-7","1"
+"88343","Picacho","NM","33.267631","-105.01969","-7","1"
+"88344","Pinon","NM","32.663082","-105.36135","-7","1"
+"88345","Ruidoso","NM","33.350032","-105.66637","-7","1"
+"88346","Ruidoso Downs","NM","33.342426","-105.56694","-7","1"
+"88347","Sacramento","NM","32.789854","-105.60437","-7","1"
+"88348","San Patricio","NM","33.415814","-105.36046","-7","1"
+"88349","Sunspot","NM","32.8672","-105.781129","-7","1"
+"88350","Timberon","NM","32.629637","-105.68663","-7","1"
+"88351","Tinnie","NM","33.480197","-105.01755","-7","1"
+"88352","Tularosa","NM","33.098649","-106.02058","-7","1"
+"88353","Vaughn","NM","34.585906","-105.14392","-7","1"
+"88354","Weed","NM","32.783249","-105.47306","-7","1"
+"88355","Ruidoso","NM","33.330502","-105.693322","-7","1"
+"88401","Tucumcari","NM","35.103769","-103.77676","-7","1"
+"88410","Amistad","NM","35.890633","-103.20194","-7","1"
+"88411","Bard","NM","35.174099","-103.18444","-7","1"
+"88414","Capulin","NM","36.740696","-103.99329","-7","1"
+"88415","Clayton","NM","36.387827","-103.22216","-7","1"
+"88416","Conchas Dam","NM","35.387857","-104.18276","-7","1"
+"88417","Cuervo","NM","35.014908","-104.41778","-7","1"
+"88418","Des Moines","NM","36.734124","-103.74791","-7","1"
+"88419","Folsom","NM","36.896078","-103.56942","-7","1"
+"88421","Garita","NM","35.313786","-104.47567","-7","1"
+"88422","Gladstone","NM","36.353757","-103.96571","-7","1"
+"88424","Grenville","NM","36.458919","-103.62143","-7","1"
+"88426","Logan","NM","35.348463","-103.39045","-7","1"
+"88427","McAlister","NM","34.770332","-103.81162","-7","1"
+"88429","Mount Dora","NM","36.369783","-103.505541","-7","1"
+"88430","Nara Visa","NM","35.644244","-103.21973","-7","1"
+"88431","Newkirk","NM","35.157683","-104.2151","-7","1"
+"88433","Quay","NM","34.916697","-103.778184","-7","1"
+"88434","San Jon","NM","35.098357","-103.34027","-7","1"
+"88435","Santa Rosa","NM","34.862953","-104.81362","-7","1"
+"88436","Sedan","NM","36.137255","-103.12311","-7","1"
+"88437","Seneca","NM","36.710694","-103.14925","-7","1"
+"88439","Trementina","NM","35.456288","-104.679611","-7","1"
+"88441","Bell Ranch","NM","35.456288","-104.679611","-7","1"
+"88510","El Paso","TX","31.694842","-106.299987","-7","1"
+"88511","El Paso","TX","31.694842","-106.299987","-7","1"
+"88512","El Paso","TX","31.694842","-106.299987","-7","1"
+"88513","El Paso","TX","31.694842","-106.299987","-7","1"
+"88514","El Paso","TX","31.694842","-106.299987","-7","1"
+"88515","El Paso","TX","31.694842","-106.299987","-7","1"
+"88516","El Paso","TX","31.694842","-106.299987","-7","1"
+"88517","El Paso","TX","31.694842","-106.299987","-7","1"
+"88518","El Paso","TX","31.694842","-106.299987","-7","1"
+"88519","El Paso","TX","31.694842","-106.299987","-7","1"
+"88520","El Paso","TX","31.694842","-106.299987","-7","1"
+"88521","El Paso","TX","31.694842","-106.299987","-7","1"
+"88523","El Paso","TX","31.694842","-106.299987","-7","1"
+"88524","El Paso","TX","31.694842","-106.299987","-7","1"
+"88525","El Paso","TX","31.694842","-106.299987","-7","1"
+"88526","El Paso","TX","31.694842","-106.299987","-7","1"
+"88527","El Paso","TX","31.694842","-106.299987","-7","1"
+"88528","El Paso","TX","31.694842","-106.299987","-7","1"
+"88529","El Paso","TX","31.694842","-106.299987","-7","1"
+"88530","El Paso","TX","31.694842","-106.299987","-7","1"
+"88531","El Paso","TX","31.694842","-106.299987","-7","1"
+"88532","El Paso","TX","31.694842","-106.299987","-7","1"
+"88533","El Paso","TX","31.694842","-106.299987","-7","1"
+"88534","El Paso","TX","31.694842","-106.299987","-7","1"
+"88535","El Paso","TX","31.694842","-106.299987","-7","1"
+"88536","El Paso","TX","31.694842","-106.299987","-7","1"
+"88538","El Paso","TX","31.694842","-106.299987","-7","1"
+"88539","El Paso","TX","31.694842","-106.299987","-7","1"
+"88540","El Paso","TX","31.694842","-106.299987","-7","1"
+"88541","El Paso","TX","31.694842","-106.299987","-7","1"
+"88542","El Paso","TX","31.694842","-106.299987","-7","1"
+"88543","El Paso","TX","31.694842","-106.299987","-7","1"
+"88544","El Paso","TX","31.694842","-106.299987","-7","1"
+"88545","El Paso","TX","31.694842","-106.299987","-7","1"
+"88546","El Paso","TX","31.694842","-106.299987","-7","1"
+"88547","El Paso","TX","31.694842","-106.299987","-7","1"
+"88548","El Paso","TX","31.694842","-106.299987","-7","1"
+"88549","El Paso","TX","31.694842","-106.299987","-7","1"
+"88550","El Paso","TX","31.694842","-106.299987","-7","1"
+"88553","El Paso","TX","31.694842","-106.299987","-7","1"
+"88554","El Paso","TX","31.694842","-106.299987","-7","1"
+"88555","El Paso","TX","31.694842","-106.299987","-7","1"
+"88556","El Paso","TX","31.694842","-106.299987","-7","1"
+"88557","El Paso","TX","31.694842","-106.299987","-7","1"
+"88558","El Paso","TX","31.694842","-106.299987","-7","1"
+"88559","El Paso","TX","31.694842","-106.299987","-7","1"
+"88560","El Paso","TX","31.694842","-106.299987","-7","1"
+"88561","El Paso","TX","31.694842","-106.299987","-7","1"
+"88562","El Paso","TX","31.694842","-106.299987","-7","1"
+"88563","El Paso","TX","31.694842","-106.299987","-7","1"
+"88565","El Paso","TX","31.694842","-106.299987","-7","1"
+"88566","El Paso","TX","31.694842","-106.299987","-7","1"
+"88567","El Paso","TX","31.694842","-106.299987","-7","1"
+"88568","El Paso","TX","31.694842","-106.299987","-7","1"
+"88569","El Paso","TX","31.694842","-106.299987","-7","1"
+"88570","El Paso","TX","31.694842","-106.299987","-7","1"
+"88571","El Paso","TX","31.694842","-106.299987","-7","1"
+"88572","El Paso","TX","31.694842","-106.299987","-7","1"
+"88573","El Paso","TX","31.694842","-106.299987","-7","1"
+"88574","El Paso","TX","31.694842","-106.299987","-7","1"
+"88575","El Paso","TX","31.694842","-106.299987","-7","1"
+"88576","El Paso","TX","31.694842","-106.299987","-7","1"
+"88577","El Paso","TX","31.694842","-106.299987","-7","1"
+"88578","El Paso","TX","31.694842","-106.299987","-7","1"
+"88579","El Paso","TX","31.694842","-106.299987","-7","1"
+"88580","El Paso","TX","31.694842","-106.299987","-7","1"
+"88581","El Paso","TX","31.694842","-106.299987","-7","1"
+"88582","El Paso","TX","31.694842","-106.299987","-7","1"
+"88583","El Paso","TX","31.694842","-106.299987","-7","1"
+"88584","El Paso","TX","31.694842","-106.299987","-7","1"
+"88585","El Paso","TX","31.694842","-106.299987","-7","1"
+"88586","El Paso","TX","31.694842","-106.299987","-7","1"
+"88587","El Paso","TX","31.694842","-106.299987","-7","1"
+"88588","El Paso","TX","31.694842","-106.299987","-7","1"
+"88589","El Paso","TX","31.694842","-106.299987","-7","1"
+"88590","El Paso","TX","31.694842","-106.299987","-7","1"
+"88595","El Paso","TX","31.694842","-106.299987","-7","1"
+"88603","Roswell","NM","33.361658","-104.528038","-7","1"
+"88901","The Lakes","NV","36.322484","-114.819717","-8","1"
+"88905","The Lakes","NV","35.927901","-114.972061","-8","1"
+"89001","Alamo","NV","37.381946","-115.31502","-8","1"
+"89003","Beatty","NV","37.027453","-116.84011","-8","1"
+"89004","Blue Diamond","NV","36.046247","-115.40483","-8","1"
+"89005","Boulder City","NV","35.968615","-114.83354","-8","1"
+"89006","Boulder City","NV","35.927901","-114.972061","-8","1"
+"89007","Bunkerville","NV","36.766887","-114.13298","-8","1"
+"89008","Caliente","NV","37.488849","-114.45374","-8","1"
+"89009","Henderson","NV","35.927901","-114.972061","-8","1"
+"89010","Dyer","NV","37.751707","-118.08592","-8","1"
+"89011","Henderson","NV","36.121607","-114.92514","-8","1"
+"89012","Henderson","NV","36.017578","-115.05438","-8","1"
+"89013","Goldfield","NV","37.571495","-117.31507","-8","1"
+"89014","Henderson","NV","36.045811","-115.0778","-8","1"
+"89015","Henderson","NV","36.030927","-114.96787","-8","1"
+"89016","Henderson","NV","35.927901","-114.972061","-8","1"
+"89017","Hiko","NV","37.592182","-115.28676","-8","1"
+"89018","Indian Springs","NV","36.573712","-115.67024","-8","1"
+"89019","Jean","NV","35.801952","-115.57819","-8","1"
+"89020","Amargosa Valley","NV","36.52513","-116.46173","-8","1"
+"89021","Logandale","NV","36.616546","-114.47184","-8","1"
+"89022","Manhattan","NV","38.738647","-117.0789","-8","1"
+"89023","Mercury","NV","37.583805","-116.598559","-8","1"
+"89024","Mesquite","AZ","36.789432","-114.01042","-7","0"
+"89025","Moapa","NV","36.674946","-114.66488","-8","1"
+"89026","Jean","NV","35.927901","-114.972061","-8","1"
+"89027","Mesquite","NV","36.804651","-114.08749","-8","1"
+"89028","Laughlin","NV","35.013978","-114.6447","-8","1"
+"89029","Laughlin","NV","35.138674","-114.62875","-8","1"
+"89030","North Las Vegas","NV","36.206419","-115.12318","-8","1"
+"89031","North Las Vegas","NV","36.256479","-115.16139","-8","1"
+"89032","North Las Vegas","NV","36.224218","-115.1763","-8","1"
+"89033","North Las Vegas","NV","36.284511","-115.134488","-8","1"
+"89036","North Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89039","Cal Nev Ari","NV","35.28299","-114.87299","-8","1"
+"89040","Overton","NV","36.540495","-114.45478","-8","1"
+"89041","Pahrump","NV","36.655797","-116.004795","-8","1"
+"89042","Panaca","NV","37.785734","-114.38399","-8","1"
+"89043","Pioche","NV","38.122239","-114.40318","-8","1"
+"89045","Round Mountain","NV","37.583805","-116.598559","-8","1"
+"89046","Searchlight","NV","35.525338","-114.91149","-8","1"
+"89047","Silverpeak","NV","37.751386","-117.64225","-8","1"
+"89048","Pahrump","NV","36.218341","-116.00994","-8","1"
+"89049","Tonopah","NV","38.307931","-116.92779","-8","1"
+"89052","Henderson","NV","35.979863","-115.09895","-8","1"
+"89053","Henderson","NV","35.927901","-114.972061","-8","1"
+"89060","Pahrump","NV","36.264185","-116.038857","-8","1"
+"89061","Pahrump","NV","36.119299","-115.938992","-8","1"
+"89070","Indian Springs","NV","35.927901","-114.972061","-8","1"
+"89074","Henderson","NV","36.038181","-115.086999","-8","1"
+"89081","Indian Springs","NV","36.573377","-115.674671","-8","1"
+"89084","North Las Vegas","NV","36.281388","-115.148644","-8","1"
+"89086","North Las Vegas","NV","36.28094","-115.132695","-8","1"
+"89101","Las Vegas","NV","36.17022","-115.12785","-8","1"
+"89102","Las Vegas","NV","36.145303","-115.18358","-8","1"
+"89103","Las Vegas","NV","36.113211","-115.21849","-8","1"
+"89104","Las Vegas","NV","36.151108","-115.10857","-8","1"
+"89106","Las Vegas","NV","36.184219","-115.16292","-8","1"
+"89107","Las Vegas","NV","36.171219","-115.21682","-8","1"
+"89108","Las Vegas","NV","36.205718","-115.22363","-8","1"
+"89109","Las Vegas","NV","36.126038","-115.14796","-8","1"
+"89110","Las Vegas","NV","36.172744","-115.05795","-8","1"
+"89111","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89112","Las Vegas","NV","36.157764","-115.025559","-8","1"
+"89113","Las Vegas","NV","36.067495","-115.26039","-8","1"
+"89114","Las Vegas","NV","36.011339","-115.101508","-8","1"
+"89115","Las Vegas","NV","36.233655","-115.06881","-8","1"
+"89116","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89117","Las Vegas","NV","36.140974","-115.28205","-8","1"
+"89118","Las Vegas","NV","36.084361","-115.2103","-8","1"
+"89119","Las Vegas","NV","36.088922","-115.13905","-8","1"
+"89120","Las Vegas","NV","36.087623","-115.08872","-8","1"
+"89121","Las Vegas","NV","36.121972","-115.0903","-8","1"
+"89122","Las Vegas","NV","36.10524","-115.04592","-8","1"
+"89123","Las Vegas","NV","36.026532","-115.14848","-8","1"
+"89124","Las Vegas","NV","36.101538","-115.39948","-8","1"
+"89125","Las Vegas","NV","36.223528","-115.265529","-8","1"
+"89126","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89127","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89128","Las Vegas","NV","36.193501","-115.265","-8","1"
+"89129","Las Vegas","NV","36.231139","-115.28461","-8","1"
+"89130","Las Vegas","NV","36.257531","-115.22728","-8","1"
+"89131","Las Vegas","NV","36.294596","-115.24685","-8","1"
+"89132","Las Vegas","NV","36.018981","-115.151937","-8","1"
+"89133","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89134","Las Vegas","NV","36.204548","-115.31207","-8","1"
+"89135","Las Vegas","NV","36.131341","-115.32331","-8","1"
+"89136","Summerlin South","NV","36.129519","-115.322782","-8","1"
+"89137","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89138","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89139","Las Vegas","NV","36.031873","-115.20342","-8","1"
+"89141","Las Vegas","NV","35.998778","-115.19588","-8","1"
+"89142","Las Vegas","NV","36.148417","-115.04767","-8","1"
+"89143","Las Vegas","NV","36.326315","-115.25788","-8","1"
+"89144","Las Vegas","NV","36.181142","-115.32557","-8","1"
+"89145","Las Vegas","NV","36.167731","-115.26791","-8","1"
+"89146","Las Vegas","NV","36.141119","-115.22493","-8","1"
+"89147","Las Vegas","NV","36.113059","-115.27343","-8","1"
+"89148","Las Vegas","NV","36.049095","-115.28485","-8","1"
+"89149","Las Vegas","NV","36.266266","-115.28656","-8","1"
+"89150","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89151","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89152","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89153","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89154","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89155","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89156","Las Vegas","NV","36.201612","-115.03358","-8","1"
+"89158","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89159","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89160","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89163","The Lakes","NV","35.927901","-114.972061","-8","1"
+"89164","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89170","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89173","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89177","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89180","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89185","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89191","Nellis AFB","NV","36.370315","-115.23128","-8","1"
+"89193","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89195","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89199","Las Vegas","NV","35.927901","-114.972061","-8","1"
+"89301","Ely","NV","39.282855","-114.9208","-8","1"
+"89310","Austin","NV","39.748753","-117.01152","-8","1"
+"89311","Baker","NV","38.941805","-114.12592","-8","1"
+"89314","Duckwater","NV","38.944921","-115.70749","-8","1"
+"89315","Ely","NV","39.332636","-114.824507","-8","1"
+"89316","Eureka","NV","39.717627","-116.02944","-8","1"
+"89317","Lund","NV","38.835421","-115.02628","-8","1"
+"89318","McGill","NV","39.4163","-114.77624","-8","1"
+"89319","Ruth","NV","39.342631","-114.885945","-8","1"
+"89402","Crystal Bay","NV","39.239457","-119.971133","-8","1"
+"89403","Dayton","NV","39.25468","-119.51494","-8","1"
+"89404","Denio","NV","41.826461","-118.71295","-8","1"
+"89405","Empire","NV","40.555197","-119.35093","-8","1"
+"89406","Fallon","NV","39.461072","-118.69306","-8","1"
+"89407","Fallon","NV","39.525628","-118.842431","-8","1"
+"89408","Fernley","NV","39.617711","-119.17374","-8","1"
+"89409","Gabbs","NV","38.872139","-117.78194","-8","1"
+"89410","Gardnerville","NV","38.878641","-119.69753","-8","1"
+"89411","Genoa","NV","39.012361","-119.83288","-8","1"
+"89412","Gerlach","NV","40.652505","-119.356505","-8","1"
+"89413","Glenbrook","NV","39.083284","-119.93964","-8","1"
+"89414","Golconda","NV","40.926644","-117.31706","-8","1"
+"89415","Hawthorne","NV","38.505507","-118.70342","-8","1"
+"89418","Imlay","NV","40.700131","-118.11473","-8","1"
+"89419","Lovelock","NV","40.21672","-118.39475","-8","1"
+"89420","Luning","NV","38.555308","-118.21818","-8","1"
+"89421","McDermitt","NV","41.953624","-117.72501","-8","1"
+"89422","Mina","NV","38.271173","-118.19513","-8","1"
+"89423","Minden","NV","39.009564","-119.75557","-8","1"
+"89424","Nixon","NV","39.835829","-119.35634","-8","1"
+"89425","Orovada","NV","41.656001","-117.95538","-8","1"
+"89426","Paradise Valley","NV","41.596722","-117.40232","-8","1"
+"89427","Schurz","NV","38.966064","-118.67848","-8","1"
+"89428","Silver City","NV","39.262835","-119.64083","-8","1"
+"89429","Silver Springs","NV","39.367838","-119.24618","-8","1"
+"89430","Smith","NV","38.784128","-119.31697","-8","1"
+"89431","Sparks","NV","39.542711","-119.75445","-8","1"
+"89432","Sparks","NV","40.541218","-119.586934","-8","1"
+"89433","Sun Valley","NV","39.59218","-119.77467","-8","1"
+"89434","Sparks","NV","39.544183","-119.70003","-8","1"
+"89435","Sparks","NV","40.541218","-119.586934","-8","1"
+"89436","Sparks","NV","39.624698","-119.70585","-8","1"
+"89438","Valmy","NV","41.263287","-118.174506","-8","1"
+"89439","Verdi","CA","39.523693","-120.03012","-8","1"
+"89440","Virginia City","NV","39.298192","-119.65351","-8","1"
+"89442","Wadsworth","NV","39.659593","-119.30527","-8","1"
+"89444","Wellington","NV","38.738712","-119.34585","-8","1"
+"89445","Winnemucca","NV","41.02951","-117.94402","-8","1"
+"89446","Winnemucca","NV","41.076358","-117.760165","-8","1"
+"89447","Yerington","NV","38.94675","-119.11544","-8","1"
+"89448","Zephyr Cove","NV","39.006963","-119.94762","-8","1"
+"89449","Stateline","NV","38.968383","-119.91364","-8","1"
+"89450","Incline Village","NV","39.256357","-119.946371","-8","1"
+"89451","Incline Village","NV","39.245257","-119.95204","-8","1"
+"89452","Incline Village","NV","39.259103","-119.956585","-8","1"
+"89460","Gardnerville Ranchos","NV","38.903324","-119.763147","-8","1"
+"89496","Fallon","NV","39.537979","-118.343592","-8","1"
+"89501","Reno","NV","39.52616","-119.81367","-8","1"
+"89502","Reno","NV","39.499862","-119.77497","-8","1"
+"89503","Reno","NV","39.53636","-119.8373","-8","1"
+"89504","Reno","NV","40.541218","-119.586934","-8","1"
+"89505","Reno","NV","39.52241","-119.835275","-8","1"
+"89506","Reno","NV","39.659801","-119.87918","-8","1"
+"89507","Reno","NV","39.54231","-119.816374","-8","1"
+"89509","Reno","NV","39.496243","-119.83072","-8","1"
+"89510","Reno","NV","39.87107","-119.71313","-8","1"
+"89511","Reno","NV","39.403178","-119.7606","-8","1"
+"89512","Reno","NV","39.54641","-119.79664","-8","1"
+"89513","Reno","NV","39.631922","-119.293722","-8","1"
+"89515","Reno","NV","40.541218","-119.586934","-8","1"
+"89520","Reno","NV","40.541218","-119.586934","-8","1"
+"89521","Reno","NV","39.395387","-119.72735","-8","1"
+"89523","Reno","NV","39.523088","-119.89808","-8","1"
+"89533","Reno","NV","39.543941","-119.906109","-8","1"
+"89557","Reno","NV","40.541218","-119.586934","-8","1"
+"89564","Reno","NV","40.541218","-119.586934","-8","1"
+"89570","Reno","NV","40.541218","-119.586934","-8","1"
+"89595","Reno","NV","40.541218","-119.586934","-8","1"
+"89599","Reno","NV","40.541218","-119.586934","-8","1"
+"89701","Carson City","NV","39.147877","-119.74536","-8","1"
+"89702","Carson City","NV","39.135503","-119.75875","-8","1"
+"89703","Carson City","NV","39.164966","-119.79382","-8","1"
+"89704","Washoe Valley","NV","39.27521","-119.7908","-8","1"
+"89705","Carson City","NV","39.091507","-119.79896","-8","1"
+"89706","Carson City","NV","39.200035","-119.72732","-8","1"
+"89710","Carson City","NV","39.167833","-119.776409","-8","1"
+"89711","Carson City","NV","39.167833","-119.776409","-8","1"
+"89712","Carson City","NV","39.167833","-119.776409","-8","1"
+"89713","Carson City","NV","39.167833","-119.776409","-8","1"
+"89714","Carson City","NV","39.167833","-119.776409","-8","1"
+"89721","Carson City","NV","39.167833","-119.776409","-8","1"
+"89779","Kingsbury","NV","38.971319","-119.922973","-8","1"
+"89801","Elko","NV","40.883028","-115.75016","-8","1"
+"89802","Elko","NV","41.059414","-115.529596","-8","1"
+"89803","Elko","NV","40.81488","-115.79241","-8","1"
+"89815","Spring Creek","NV","40.644201","-115.64745","-8","1"
+"89820","Battle Mountain","NV","40.489736","-117.08692","-8","1"
+"89821","Crescent Valley","NV","40.450972","-116.51585","-8","1"
+"89822","Carlin","NV","40.715963","-116.11426","-8","1"
+"89823","Deeth","NV","41.252236","-115.40266","-8","1"
+"89824","Halleck","NV","41.029538","-115.4113","-8","1"
+"89825","Jackpot","NV","41.890872","-114.44545","-8","1"
+"89826","Jarbidge","NV","41.905845","-115.43542","-8","1"
+"89828","Lamoille","NV","40.79727","-115.44828","-8","1"
+"89830","Montello","NV","41.247573","-114.21077","-8","1"
+"89831","Mountain City","NV","41.796309","-116.05489","-8","1"
+"89832","Owyhee","NV","41.951703","-116.17725","-8","1"
+"89833","Ruby Valley","NV","40.453542","-115.33257","-8","1"
+"89834","Tuscarora","NV","41.328852","-116.12251","-8","1"
+"89835","Wells","NV","41.208288","-114.86098","-8","1"
+"89883","West Wendover","NV","40.854751","-114.14713","-8","1"
+"89912","Gerlach-Empire","NV","40.651432","-119.357959","-8","1"
+"90001","Los Angeles","CA","33.972914","-118.24878","-8","1"
+"90002","Los Angeles","CA","33.948315","-118.24845","-8","1"
+"90003","Los Angeles","CA","33.962714","-118.276","-8","1"
+"90004","Los Angeles","CA","34.07711","-118.30755","-8","1"
+"90005","Los Angeles","CA","34.058911","-118.30848","-8","1"
+"90006","Los Angeles","CA","34.048351","-118.2943","-8","1"
+"90007","Los Angeles","CA","34.026448","-118.2829","-8","1"
+"90008","Los Angeles","CA","34.009754","-118.33705","-8","1"
+"90009","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90010","Los Angeles","CA","34.062709","-118.31481","-8","1"
+"90011","Los Angeles","CA","34.007063","-118.25868","-8","1"
+"90012","Los Angeles","CA","34.061611","-118.23944","-8","1"
+"90013","Los Angeles","CA","34.044662","-118.24255","-8","1"
+"90014","Los Angeles","CA","34.042912","-118.25193","-8","1"
+"90015","Los Angeles","CA","34.038993","-118.26516","-8","1"
+"90016","Los Angeles","CA","34.029711","-118.35255","-8","1"
+"90017","Los Angeles","CA","34.052561","-118.26434","-8","1"
+"90018","Los Angeles","CA","34.029112","-118.3183","-8","1"
+"90019","Los Angeles","CA","34.048411","-118.34015","-8","1"
+"90020","Los Angeles","CA","34.06646","-118.30863","-8","1"
+"90021","Los Angeles","CA","34.029313","-118.24182","-8","1"
+"90022","Los Angeles","CA","34.023662","-118.15581","-8","1"
+"90023","Los Angeles","CA","34.023039","-118.20231","-8","1"
+"90024","Los Angeles","CA","34.063209","-118.43643","-8","1"
+"90025","Los Angeles","CA","34.045006","-118.44527","-8","1"
+"90026","Los Angeles","CA","34.07851","-118.26596","-8","1"
+"90027","Los Angeles","CA","34.111208","-118.28842","-8","1"
+"90028","Los Angeles","CA","34.098859","-118.32745","-8","1"
+"90029","Los Angeles","CA","34.090259","-118.29455","-8","1"
+"90030","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90031","Los Angeles","CA","34.07871","-118.2161","-8","1"
+"90032","Los Angeles","CA","34.08166","-118.17568","-8","1"
+"90033","Los Angeles","CA","34.050411","-118.21195","-8","1"
+"90034","Los Angeles","CA","34.03056","-118.39804","-8","1"
+"90035","Los Angeles","CA","34.05266","-118.38531","-8","1"
+"90036","Los Angeles","CA","34.07036","-118.34926","-8","1"
+"90037","Los Angeles","CA","34.002063","-118.28737","-8","1"
+"90038","Los Angeles","CA","34.089459","-118.3285","-8","1"
+"90039","Los Angeles","CA","34.110425","-118.25832","-8","1"
+"90040","Los Angeles","CA","33.997492","-118.15284","-8","1"
+"90041","Los Angeles","CA","34.137557","-118.20765","-8","1"
+"90042","Los Angeles","CA","34.114558","-118.19233","-8","1"
+"90043","Los Angeles","CA","33.987463","-118.334","-8","1"
+"90044","Los Angeles","CA","33.953814","-118.29158","-8","1"
+"90045","Los Angeles","CA","33.960041","-118.3949","-8","1"
+"90046","Los Angeles","CA","34.098908","-118.36241","-8","1"
+"90047","Los Angeles","CA","33.958464","-118.30998","-8","1"
+"90048","Los Angeles","CA","34.073759","-118.37376","-8","1"
+"90049","Los Angeles","CA","34.067409","-118.47528","-8","1"
+"90050","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90051","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90052","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90053","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90054","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90055","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90056","Los Angeles","CA","33.986212","-118.37099","-8","1"
+"90057","Los Angeles","CA","34.061911","-118.27687","-8","1"
+"90058","Los Angeles","CA","34.000219","-118.22605","-8","1"
+"90059","Los Angeles","CA","33.927471","-118.24778","-8","1"
+"90060","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90061","Los Angeles","CA","33.923365","-118.27591","-8","1"
+"90062","Los Angeles","CA","34.003213","-118.3078","-8","1"
+"90063","Los Angeles","CA","34.045161","-118.1865","-8","1"
+"90064","Los Angeles","CA","34.03457","-118.42843","-8","1"
+"90065","Los Angeles","CA","34.107559","-118.22663","-8","1"
+"90066","Los Angeles","CA","34.002011","-118.43083","-8","1"
+"90067","Los Angeles","CA","34.056709","-118.41183","-8","1"
+"90068","Los Angeles","CA","34.122058","-118.3379","-8","1"
+"90069","West Hollywood","CA","34.090975","-118.3813","-8","1"
+"90070","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90071","Los Angeles","CA","34.052709","-118.2559","-8","1"
+"90072","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90073","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90074","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90075","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90076","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90077","Los Angeles","CA","34.101007","-118.45077","-8","1"
+"90078","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90079","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90080","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90081","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90082","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90083","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90084","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90086","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90087","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90088","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90089","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90091","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90093","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90094","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90095","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90096","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90097","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90099","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90101","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90102","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90103","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90174","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90185","Los Angeles","CA","33.786594","-118.298662","-8","1"
+"90201","Bell","CA","33.972814","-118.17385","-8","1"
+"90202","Bell Gardens","CA","33.786594","-118.298662","-8","1"
+"90204","Inglewood","CA","33.944714","-118.356908","-8","1"
+"90209","Beverly Hills","CA","33.786594","-118.298662","-8","1"
+"90210","Beverly Hills","CA","34.088808","-118.40612","-8","1"
+"90211","Beverly Hills","CA","34.066009","-118.38271","-8","1"
+"90212","Beverly Hills","CA","34.060859","-118.40191","-8","1"
+"90213","Beverly Hills","CA","33.786594","-118.298662","-8","1"
+"90220","Compton","CA","33.890566","-118.23666","-8","1"
+"90221","Compton","CA","33.893265","-118.204","-8","1"
+"90222","Compton","CA","33.910716","-118.23624","-8","1"
+"90223","Compton","CA","33.786594","-118.298662","-8","1"
+"90224","Compton","CA","33.786594","-118.298662","-8","1"
+"90230","Culver City","CA","33.997179","-118.40145","-8","1"
+"90231","Culver City","CA","33.786594","-118.298662","-8","1"
+"90232","Culver City","CA","34.021611","-118.39168","-8","1"
+"90233","Culver City","CA","33.786594","-118.298662","-8","1"
+"90239","Downey","CA","33.786594","-118.298662","-8","1"
+"90240","Downey","CA","33.958363","-118.11987","-8","1"
+"90241","Downey","CA","33.942289","-118.12901","-8","1"
+"90242","Downey","CA","33.92018","-118.14291","-8","1"
+"90245","El Segundo","CA","33.921313","-118.40843","-8","1"
+"90247","Gardena","CA","33.891265","-118.2975","-8","1"
+"90248","Gardena","CA","33.870466","-118.28813","-8","1"
+"90249","Gardena","CA","33.899265","-118.319","-8","1"
+"90250","Hawthorne","CA","33.914614","-118.35092","-8","1"
+"90251","Hawthorne","CA","33.786594","-118.298662","-8","1"
+"90254","Hermosa Beach","CA","33.866314","-118.39968","-8","1"
+"90255","Huntington Park","CA","33.978404","-118.21773","-8","1"
+"90260","Lawndale","CA","33.888364","-118.35355","-8","1"
+"90261","Lawndale","CA","33.895363","-118.37689","-8","1"
+"90262","Lynwood","CA","33.924642","-118.20186","-8","1"
+"90263","Malibu","CA","34.035087","-118.70752","-8","1"
+"90264","Malibu","CA","33.786594","-118.298662","-8","1"
+"90265","Malibu","CA","34.051056","-118.80768","-8","1"
+"90266","Manhattan Beach","CA","33.88898","-118.40535","-8","1"
+"90267","Manhattan Beach","CA","33.786594","-118.298662","-8","1"
+"90270","Maywood","CA","33.988813","-118.18642","-8","1"
+"90272","Pacific Palisades","CA","34.050505","-118.53374","-8","1"
+"90274","Palos Verdes Peninsula","CA","33.784099","-118.38752","-8","1"
+"90275","Rancho Palos Verdes","CA","33.758216","-118.36425","-8","1"
+"90276","Redondo Beach","CA","33.845064","-118.395107","-8","1"
+"90277","Redondo Beach","CA","33.828815","-118.38322","-8","1"
+"90278","Redondo Beach","CA","33.871214","-118.37177","-8","1"
+"90280","South Gate","CA","33.944264","-118.1949","-8","1"
+"90290","Topanga","CA","34.101447","-118.59933","-8","1"
+"90291","Venice","CA","33.992411","-118.46531","-8","1"
+"90292","Marina Del Rey","CA","33.976373","-118.45458","-8","1"
+"90293","Playa Del Rey","CA","33.957012","-118.44167","-8","1"
+"90294","Venice","CA","33.786594","-118.298662","-8","1"
+"90295","Marina Del Rey","CA","33.786594","-118.298662","-8","1"
+"90296","Playa Del Rey","CA","33.786594","-118.298662","-8","1"
+"90301","Inglewood","CA","33.955913","-118.35868","-8","1"
+"90302","Inglewood","CA","33.975263","-118.35558","-8","1"
+"90303","Inglewood","CA","33.934164","-118.33255","-8","1"
+"90304","Inglewood","CA","33.936163","-118.36076","-8","1"
+"90305","Inglewood","CA","33.960263","-118.3252","-8","1"
+"90306","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90307","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90308","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90309","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90310","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90311","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90312","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90313","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90397","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90398","Inglewood","CA","33.786594","-118.298662","-8","1"
+"90401","Santa Monica","CA","34.01491","-118.4922","-8","1"
+"90402","Santa Monica","CA","34.036759","-118.50121","-8","1"
+"90403","Santa Monica","CA","34.032159","-118.49022","-8","1"
+"90404","Santa Monica","CA","34.026959","-118.47432","-8","1"
+"90405","Santa Monica","CA","34.009276","-118.47286","-8","1"
+"90406","Santa Monica","CA","33.786594","-118.298662","-8","1"
+"90407","Santa Monica","CA","33.786594","-118.298662","-8","1"
+"90408","Santa Monica","CA","33.786594","-118.298662","-8","1"
+"90409","Santa Monica","CA","33.786594","-118.298662","-8","1"
+"90410","Santa Monica","CA","33.786594","-118.298662","-8","1"
+"90411","Santa Monica","CA","33.786594","-118.298662","-8","1"
+"90421","Santa Monica","CA","34.010328","-118.494107","-8","1"
+"90501","Torrance","CA","33.828766","-118.31367","-8","1"
+"90502","Torrance","CA","33.833416","-118.29198","-8","1"
+"90503","Torrance","CA","33.840264","-118.35587","-8","1"
+"90504","Torrance","CA","33.870414","-118.33065","-8","1"
+"90505","Torrance","CA","33.810848","-118.35096","-8","1"
+"90506","Torrance","CA","33.786594","-118.298662","-8","1"
+"90507","Torrance","CA","33.786594","-118.298662","-8","1"
+"90508","Torrance","CA","33.786594","-118.298662","-8","1"
+"90509","Torrance","CA","33.786594","-118.298662","-8","1"
+"90510","Torrance","CA","33.786594","-118.298662","-8","1"
+"90601","Whittier","CA","34.002333","-118.03562","-8","1"
+"90602","Whittier","CA","33.967562","-118.03384","-8","1"
+"90603","Whittier","CA","33.941363","-117.99477","-8","1"
+"90604","Whittier","CA","33.929163","-118.009","-8","1"
+"90605","Whittier","CA","33.945413","-118.03362","-8","1"
+"90606","Whittier","CA","33.978312","-118.06778","-8","1"
+"90607","Whittier","CA","33.786594","-118.298662","-8","1"
+"90608","Whittier","CA","33.786594","-118.298662","-8","1"
+"90609","Whittier","CA","33.786594","-118.298662","-8","1"
+"90610","Whittier","CA","33.786594","-118.298662","-8","1"
+"90612","Whittier","CA","33.786594","-118.298662","-8","1"
+"90620","Buena Park","CA","33.841014","-118.00969","-8","1"
+"90621","Buena Park","CA","33.875714","-117.99404","-8","1"
+"90622","Buena Park","CA","33.640302","-117.769442","-8","1"
+"90623","La Palma","CA","33.849327","-118.04395","-8","1"
+"90624","Buena Park","CA","33.640302","-117.769442","-8","1"
+"90630","Cypress","CA","33.817481","-118.0399","-8","1"
+"90631","La Habra","CA","33.934513","-117.95159","-8","1"
+"90632","La Habra","CA","33.640302","-117.769442","-8","1"
+"90633","La Habra","CA","33.640302","-117.769442","-8","1"
+"90637","La Mirada","CA","33.786594","-118.298662","-8","1"
+"90638","La Mirada","CA","33.90213","-118.00966","-8","1"
+"90639","La Mirada","CA","33.905813","-118.018247","-8","1"
+"90640","Montebello","CA","34.014212","-118.11358","-8","1"
+"90650","Norwalk","CA","33.906914","-118.08339","-8","1"
+"90651","Norwalk","CA","33.786594","-118.298662","-8","1"
+"90652","Norwalk","CA","33.786594","-118.298662","-8","1"
+"90659","Norwalk","CA","33.786594","-118.298662","-8","1"
+"90660","Pico Rivera","CA","33.989013","-118.08912","-8","1"
+"90661","Pico Rivera","CA","33.786594","-118.298662","-8","1"
+"90662","Pico Rivera","CA","33.786594","-118.298662","-8","1"
+"90665","Pico Rivera","CA","33.786594","-118.298662","-8","1"
+"90670","Santa Fe Springs","CA","33.933551","-118.06821","-8","1"
+"90671","Santa Fe Springs","CA","33.786594","-118.298662","-8","1"
+"90680","Stanton","CA","33.803565","-117.99596","-8","1"
+"90701","Artesia","CA","33.867215","-118.08062","-8","1"
+"90702","Artesia","CA","33.786594","-118.298662","-8","1"
+"90703","Cerritos","CA","33.868314","-118.06754","-8","1"
+"90704","Avalon","CA","33.368642","-118.40835","-8","1"
+"90706","Bellflower","CA","33.888165","-118.1276","-8","1"
+"90707","Bellflower","CA","33.786594","-118.298662","-8","1"
+"90710","Harbor City","CA","33.797317","-118.30065","-8","1"
+"90711","Lakewood","CA","33.786594","-118.298662","-8","1"
+"90712","Lakewood","CA","33.851965","-118.1468","-8","1"
+"90713","Lakewood","CA","33.847265","-118.11337","-8","1"
+"90714","Lakewood","CA","33.851215","-118.1339","-8","1"
+"90715","Lakewood","CA","33.840965","-118.07775","-8","1"
+"90716","Hawaiian Gardens","CA","33.828565","-118.07364","-8","1"
+"90717","Lomita","CA","33.793384","-118.31611","-8","1"
+"90720","Los Alamitos","CA","33.794028","-118.07218","-8","1"
+"90721","Los Alamitos","CA","33.640302","-117.769442","-8","1"
+"90723","Paramount","CA","33.899915","-118.16231","-8","1"
+"90731","San Pedro","CA","33.732368","-118.28905","-8","1"
+"90732","San Pedro","CA","33.736718","-118.31123","-8","1"
+"90733","San Pedro","CA","33.786594","-118.298662","-8","1"
+"90734","San Pedro","CA","33.786594","-118.298662","-8","1"
+"90740","Seal Beach","CA","33.759283","-118.08239","-8","1"
+"90742","Sunset Beach","CA","33.718167","-118.07179","-8","1"
+"90743","Surfside","CA","33.72975","-118.0863","-8","1"
+"90744","Wilmington","CA","33.784018","-118.25897","-8","1"
+"90745","Carson","CA","33.823765","-118.2668","-8","1"
+"90746","Carson","CA","33.857416","-118.25633","-8","1"
+"90747","Carson","CA","33.867138","-118.253825","-8","1"
+"90748","Wilmington","CA","33.786594","-118.298662","-8","1"
+"90749","Carson","CA","33.786594","-118.298662","-8","1"
+"90755","Long Beach","CA","33.801783","-118.168691","-8","1"
+"90774","Los Angeles","CA","33.783038","-118.238683","-8","1"
+"90801","Long Beach","CA","33.804309","-118.200957","-8","1"
+"90802","Long Beach","CA","33.769018","-118.19225","-8","1"
+"90803","Long Beach","CA","33.761117","-118.12986","-8","1"
+"90804","Long Beach","CA","33.783467","-118.15182","-8","1"
+"90805","Long Beach","CA","33.865916","-118.18362","-8","1"
+"90806","Long Beach","CA","33.801767","-118.1858","-8","1"
+"90807","Long Beach","CA","33.828366","-118.18235","-8","1"
+"90808","Long Beach","CA","33.823316","-118.11329","-8","1"
+"90809","Long Beach","CA","33.786594","-118.298662","-8","1"
+"90810","Long Beach","CA","33.816217","-118.21495","-8","1"
+"90813","Long Beach","CA","33.781011","-118.19197","-8","1"
+"90814","Long Beach","CA","33.771167","-118.14482","-8","1"
+"90815","Long Beach","CA","33.795049","-118.11824","-8","1"
+"90822","Long Beach","CA","33.776094","-118.11848","-8","1"
+"90831","Long Beach","CA","33.767817","-118.199401","-8","1"
+"90832","Long Beach","CA","33.786594","-118.298662","-8","1"
+"90833","Long Beach","CA","33.767817","-118.199401","-8","1"
+"90834","Long Beach","CA","33.767817","-118.199401","-8","1"
+"90835","Long Beach","CA","33.767817","-118.199401","-8","1"
+"90840","Long Beach","CA","33.784266","-118.115698","-8","1"
+"90842","Long Beach","CA","33.786594","-118.298662","-8","1"
+"90844","Long Beach","CA","33.786594","-118.298662","-8","1"
+"90845","Long Beach","CA","33.786594","-118.298662","-8","1"
+"90846","Long Beach","CA","33.824918","-118.150352","-8","1"
+"90847","Long Beach","CA","33.786594","-118.298662","-8","1"
+"90848","Long Beach","CA","33.786594","-118.298662","-8","1"
+"90853","Long Beach","CA","33.786594","-118.298662","-8","1"
+"90879","Rancho Palos Verdes","CA","33.769667","-118.313405","-8","1"
+"90888","Long Beach","CA","33.786594","-118.298662","-8","1"
+"91001","Altadena","CA","34.192102","-118.14206","-8","1"
+"91003","Altadena","CA","33.786594","-118.298662","-8","1"
+"91006","Arcadia","CA","34.134057","-118.02662","-8","1"
+"91007","Arcadia","CA","34.126957","-118.05216","-8","1"
+"91009","Duarte","CA","33.786594","-118.298662","-8","1"
+"91010","Duarte","CA","34.137707","-117.96569","-8","1"
+"91011","La Canada Flintridge","CA","34.211171","-118.19776","-8","1"
+"91012","La Canada Flintridge","CA","33.786594","-118.298662","-8","1"
+"91016","Monrovia","CA","34.140806","-118.00184","-8","1"
+"91017","Monrovia","CA","33.786594","-118.298662","-8","1"
+"91020","Montrose","CA","34.211494","-118.23104","-8","1"
+"91021","Montrose","CA","33.786594","-118.298662","-8","1"
+"91023","Mount Wilson","CA","33.786594","-118.298662","-8","1"
+"91024","Sierra Madre","CA","34.164806","-118.0509","-8","1"
+"91025","Sierra Madre","CA","33.786594","-118.298662","-8","1"
+"91030","South Pasadena","CA","34.112958","-118.15577","-8","1"
+"91031","South Pasadena","CA","33.786594","-118.298662","-8","1"
+"91040","Sunland","CA","34.261221","-118.31887","-8","1"
+"91041","Sunland","CA","33.786594","-118.298662","-8","1"
+"91042","Tujunga","CA","34.256952","-118.28453","-8","1"
+"91043","Tujunga","CA","33.786594","-118.298662","-8","1"
+"91046","Verdugo City","CA","33.786594","-118.298662","-8","1"
+"91050","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91051","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91066","Arcadia","CA","33.786594","-118.298662","-8","1"
+"91077","Arcadia","CA","33.786594","-118.298662","-8","1"
+"91101","Pasadena","CA","34.146607","-118.1391","-8","1"
+"91102","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91103","Pasadena","CA","34.166706","-118.159","-8","1"
+"91104","Pasadena","CA","34.169356","-118.12392","-8","1"
+"91105","Pasadena","CA","34.137857","-118.16329","-8","1"
+"91106","Pasadena","CA","34.142557","-118.12715","-8","1"
+"91107","Pasadena","CA","34.151066","-118.08974","-8","1"
+"91108","San Marino","CA","34.122658","-118.11296","-8","1"
+"91109","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91110","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91114","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91115","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91116","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91117","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91118","San Marino","CA","33.786594","-118.298662","-8","1"
+"91121","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91123","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91124","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91125","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91126","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91129","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91131","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91175","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91182","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91184","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91185","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91186","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91187","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91188","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91189","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91191","Pasadena","CA","33.786594","-118.298662","-8","1"
+"91201","Glendale","CA","34.17013","-118.29158","-8","1"
+"91202","Glendale","CA","34.166567","-118.26994","-8","1"
+"91203","Glendale","CA","34.152757","-118.2658","-8","1"
+"91204","Glendale","CA","34.135259","-118.25948","-8","1"
+"91205","Glendale","CA","34.138514","-118.243","-8","1"
+"91206","Glendale","CA","34.156674","-118.22937","-8","1"
+"91207","Glendale","CA","34.165373","-118.24532","-8","1"
+"91208","Glendale","CA","34.189605","-118.22857","-8","1"
+"91209","Glendale","CA","33.786594","-118.298662","-8","1"
+"91210","Glendale","CA","33.786594","-118.298662","-8","1"
+"91214","La Crescenta","CA","34.232003","-118.24753","-8","1"
+"91221","Glendale","CA","33.786594","-118.298662","-8","1"
+"91222","Glendale","CA","33.786594","-118.298662","-8","1"
+"91224","La Crescenta","CA","33.786594","-118.298662","-8","1"
+"91225","Glendale","CA","33.786594","-118.298662","-8","1"
+"91226","Glendale","CA","33.786594","-118.298662","-8","1"
+"91301","Agoura Hills","CA","34.139536","-118.7607","-8","1"
+"91302","Calabasas","CA","34.133513","-118.66464","-8","1"
+"91303","Canoga Park","CA","34.198204","-118.60206","-8","1"
+"91304","Canoga Park","CA","34.218654","-118.62538","-8","1"
+"91305","Canoga Park","CA","33.786594","-118.298662","-8","1"
+"91306","Winnetka","CA","34.209407","-118.57735","-8","1"
+"91307","West Hills","CA","34.197737","-118.64797","-8","1"
+"91308","West Hills","CA","33.786594","-118.298662","-8","1"
+"91309","Canoga Park","CA","33.786594","-118.298662","-8","1"
+"91310","Castaic","CA","33.786594","-118.298662","-8","1"
+"91311","Chatsworth","CA","34.259052","-118.59426","-8","1"
+"91312","Chatsworth","CA","33.786594","-118.298662","-8","1"
+"91313","Chatsworth","CA","33.786594","-118.298662","-8","1"
+"91316","Encino","CA","34.168753","-118.51636","-8","1"
+"91319","Newbury Park","CA","34.032383","-119.1343","-8","1"
+"91320","Newbury Park","CA","34.175038","-118.93956","-8","1"
+"91321","Newhall","CA","34.377782","-118.51489","-8","1"
+"91322","Newhall","CA","33.786594","-118.298662","-8","1"
+"91324","Northridge","CA","34.240353","-118.55038","-8","1"
+"91325","Northridge","CA","34.235055","-118.51766","-8","1"
+"91326","Northridge","CA","34.276154","-118.54581","-8","1"
+"91327","Northridge","CA","33.786594","-118.298662","-8","1"
+"91328","Northridge","CA","33.786594","-118.298662","-8","1"
+"91329","Northridge","CA","33.786594","-118.298662","-8","1"
+"91330","Northridge","CA","33.786594","-118.298662","-8","1"
+"91331","Pacoima","CA","34.254751","-118.42406","-8","1"
+"91333","Pacoima","CA","33.786594","-118.298662","-8","1"
+"91334","Pacoima","CA","33.786594","-118.298662","-8","1"
+"91335","Reseda","CA","34.200104","-118.54099","-8","1"
+"91337","Reseda","CA","33.786594","-118.298662","-8","1"
+"91340","San Fernando","CA","34.284935","-118.43821","-8","1"
+"91341","San Fernando","CA","33.786594","-118.298662","-8","1"
+"91342","Sylmar","CA","34.307877","-118.42904","-8","1"
+"91343","North Hills","CA","34.239503","-118.48224","-8","1"
+"91344","Granada Hills","CA","34.277648","-118.50047","-8","1"
+"91345","Mission Hills","CA","34.264635","-118.45961","-8","1"
+"91346","Mission Hills","CA","33.786594","-118.298662","-8","1"
+"91350","Santa Clarita","CA","34.481172","-118.42821","-8","1"
+"91351","Canyon Country","CA","34.424794","-118.44513","-8","1"
+"91352","Sun Valley","CA","34.224089","-118.37563","-8","1"
+"91353","Sun Valley","CA","33.786594","-118.298662","-8","1"
+"91354","Valencia","CA","34.445313","-118.55252","-8","1"
+"91355","Valencia","CA","34.406519","-118.56214","-8","1"
+"91356","Tarzana","CA","34.164255","-118.54472","-8","1"
+"91357","Tarzana","CA","33.786594","-118.298662","-8","1"
+"91358","Thousand Oaks","CA","34.032383","-119.1343","-8","1"
+"91359","Westlake Village","CA","34.032383","-119.1343","-8","1"
+"91360","Thousand Oaks","CA","34.208837","-118.87348","-8","1"
+"91361","Westlake Village","CA","34.14348","-118.85608","-8","1"
+"91362","Thousand Oaks","CA","34.190804","-118.83704","-8","1"
+"91363","Westlake Village","CA","33.786594","-118.298662","-8","1"
+"91364","Woodland Hills","CA","34.158214","-118.60061","-8","1"
+"91365","Woodland Hills","CA","33.786594","-118.298662","-8","1"
+"91367","Woodland Hills","CA","34.176238","-118.61992","-8","1"
+"91371","Woodland Hills","CA","33.786594","-118.298662","-8","1"
+"91372","Calabasas","CA","33.786594","-118.298662","-8","1"
+"91376","Agoura Hills","CA","33.786594","-118.298662","-8","1"
+"91377","Oak Park","CA","34.182875","-118.76893","-8","1"
+"91380","Santa Clarita","CA","33.786594","-118.298662","-8","1"
+"91381","Stevenson Ranch","CA","34.384663","-118.58704","-8","1"
+"91382","Santa Clarita","CA","33.786594","-118.298662","-8","1"
+"91383","Santa Clarita","CA","33.786594","-118.298662","-8","1"
+"91384","Castaic","CA","34.478797","-118.65255","-8","1"
+"91385","Valencia","CA","33.786594","-118.298662","-8","1"
+"91386","Canyon Country","CA","33.786594","-118.298662","-8","1"
+"91387","Santa Clarita","CA","34.421537","-118.419181","-8","1"
+"91388","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91390","Santa Clarita","CA","34.490004","-118.300826","-8","1"
+"91392","Sylmar","CA","33.786594","-118.298662","-8","1"
+"91393","North Hills","CA","33.786594","-118.298662","-8","1"
+"91394","Granada Hills","CA","33.786594","-118.298662","-8","1"
+"91395","Mission Hills","CA","33.786594","-118.298662","-8","1"
+"91396","Winnetka","CA","33.786594","-118.298662","-8","1"
+"91399","Woodland Hills","CA","33.786594","-118.298662","-8","1"
+"91401","Van Nuys","CA","34.176505","-118.43308","-8","1"
+"91402","Panorama City","CA","34.223753","-118.44322","-8","1"
+"91403","Sherman Oaks","CA","34.152513","-118.46396","-8","1"
+"91404","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91405","Van Nuys","CA","34.199704","-118.44724","-8","1"
+"91406","Van Nuys","CA","34.201491","-118.49376","-8","1"
+"91407","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91408","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91409","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91410","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91411","Van Nuys","CA","34.178305","-118.45858","-8","1"
+"91412","Panorama City","CA","33.786594","-118.298662","-8","1"
+"91413","Sherman Oaks","CA","33.786594","-118.298662","-8","1"
+"91416","Encino","CA","33.786594","-118.298662","-8","1"
+"91423","Sherman Oaks","CA","34.153628","-118.43222","-8","1"
+"91426","Encino","CA","33.786594","-118.298662","-8","1"
+"91436","Encino","CA","34.155625","-118.48925","-8","1"
+"91470","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91482","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91495","Sherman Oaks","CA","33.786594","-118.298662","-8","1"
+"91496","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91497","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91499","Van Nuys","CA","33.786594","-118.298662","-8","1"
+"91501","Burbank","CA","34.186755","-118.30153","-8","1"
+"91502","Burbank","CA","34.177606","-118.30954","-8","1"
+"91503","Burbank","CA","33.786594","-118.298662","-8","1"
+"91504","Burbank","CA","34.201254","-118.32993","-8","1"
+"91505","Burbank","CA","34.166906","-118.34366","-8","1"
+"91506","Burbank","CA","34.169663","-118.32364","-8","1"
+"91507","Burbank","CA","33.786594","-118.298662","-8","1"
+"91508","Burbank","CA","33.786594","-118.298662","-8","1"
+"91510","Burbank","CA","33.786594","-118.298662","-8","1"
+"91521","Burbank","CA","33.786594","-118.298662","-8","1"
+"91522","Burbank","CA","33.786594","-118.298662","-8","1"
+"91523","Burbank","CA","33.786594","-118.298662","-8","1"
+"91526","Burbank","CA","33.786594","-118.298662","-8","1"
+"91601","North Hollywood","CA","34.168206","-118.37246","-8","1"
+"91602","North Hollywood","CA","34.152476","-118.36841","-8","1"
+"91603","North Hollywood","CA","33.786594","-118.298662","-8","1"
+"91604","Studio City","CA","34.143856","-118.39429","-8","1"
+"91605","North Hollywood","CA","34.208142","-118.4011","-8","1"
+"91606","North Hollywood","CA","34.185698","-118.38836","-8","1"
+"91607","Valley Village","CA","34.165706","-118.39986","-8","1"
+"91608","Universal City","CA","34.139397","-118.35034","-8","1"
+"91609","North Hollywood","CA","33.786594","-118.298662","-8","1"
+"91610","Toluca Lake","CA","33.786594","-118.298662","-8","1"
+"91611","North Hollywood","CA","33.786594","-118.298662","-8","1"
+"91612","North Hollywood","CA","33.786594","-118.298662","-8","1"
+"91614","Studio City","CA","33.786594","-118.298662","-8","1"
+"91615","North Hollywood","CA","33.786594","-118.298662","-8","1"
+"91616","North Hollywood","CA","33.786594","-118.298662","-8","1"
+"91617","Valley Village","CA","33.786594","-118.298662","-8","1"
+"91618","North Hollywood","CA","33.786594","-118.298662","-8","1"
+"91671","Los Angeles","CA","34.175205","-118.382212","-8","1"
+"91701","Alta Loma","CA","34.131659","-117.5924","-8","1"
+"91702","Azusa","CA","34.128907","-117.90309","-8","1"
+"91706","Baldwin Park","CA","34.087108","-117.96966","-8","1"
+"91708","Chino","CA","34.839964","-115.967051","-8","1"
+"91709","Chino Hills","CA","33.975267","-117.72305","-8","1"
+"91710","Chino","CA","34.015963","-117.68737","-8","1"
+"91711","Claremont","CA","34.110009","-117.71973","-8","1"
+"91714","City Of Industry","CA","33.786594","-118.298662","-8","1"
+"91715","City Of Industry","CA","33.786594","-118.298662","-8","1"
+"91716","City Of Industry","CA","33.786594","-118.298662","-8","1"
+"91718","Corona","CA","33.752886","-116.055617","-8","1"
+"91719","Corona","CA","33.735688","-117.42049","-8","1"
+"91720","Corona","CA","33.752886","-116.055617","-8","1"
+"91722","Covina","CA","34.097708","-117.90698","-8","1"
+"91723","Covina","CA","34.085809","-117.88694","-8","1"
+"91724","Covina","CA","34.088771","-117.85817","-8","1"
+"91729","Rancho Cucamonga","CA","34.839964","-115.967051","-8","1"
+"91730","Rancho Cucamonga","CA","34.104555","-117.58734","-8","1"
+"91731","El Monte","CA","34.076642","-118.03942","-8","1"
+"91732","El Monte","CA","34.070659","-118.01383","-8","1"
+"91733","South El Monte","CA","34.05051","-118.04834","-8","1"
+"91734","El Monte","CA","33.786594","-118.298662","-8","1"
+"91735","El Monte","CA","33.786594","-118.298662","-8","1"
+"91737","Alta Loma","CA","34.147849","-117.57847","-8","1"
+"91739","Rancho Cucamonga","CA","34.127819","-117.5246","-8","1"
+"91740","Glendora","CA","34.119245","-117.8548","-8","1"
+"91741","Glendora","CA","34.140207","-117.85704","-8","1"
+"91743","Guasti","CA","34.066655","-117.58831","-8","1"
+"91744","La Puente","CA","34.029561","-117.93975","-8","1"
+"91745","Hacienda Heights","CA","34.000578","-117.96943","-8","1"
+"91746","La Puente","CA","34.046889","-117.98464","-8","1"
+"91747","La Puente","CA","33.786594","-118.298662","-8","1"
+"91748","Rowland Heights","CA","33.985012","-117.89705","-8","1"
+"91749","La Puente","CA","33.786594","-118.298662","-8","1"
+"91750","La Verne","CA","34.117047","-117.77097","-8","1"
+"91752","Mira Loma","CA","34.001846","-117.52759","-8","1"
+"91754","Monterey Park","CA","34.048207","-118.14161","-8","1"
+"91755","Monterey Park","CA","34.05471","-118.11823","-8","1"
+"91756","Monterey Park","CA","33.786594","-118.298662","-8","1"
+"91758","Ontario","CA","34.839964","-115.967051","-8","1"
+"91759","Mt Baldy","CA","34.231581","-117.66106","-8","1"
+"91760","Norco","CA","33.752886","-116.055617","-8","1"
+"91761","Ontario","CA","34.036085","-117.6086","-8","1"
+"91762","Ontario","CA","34.057561","-117.66563","-8","1"
+"91763","Montclair","CA","34.07041","-117.69938","-8","1"
+"91764","Ontario","CA","34.077327","-117.6222","-8","1"
+"91765","Diamond Bar","CA","34.004172","-117.81673","-8","1"
+"91766","Pomona","CA","34.045584","-117.75305","-8","1"
+"91767","Pomona","CA","34.080143","-117.73861","-8","1"
+"91768","Pomona","CA","34.06521","-117.77932","-8","1"
+"91769","Pomona","CA","33.786594","-118.298662","-8","1"
+"91770","Rosemead","CA","34.066143","-118.08475","-8","1"
+"91771","Rosemead","CA","33.786594","-118.298662","-8","1"
+"91772","Rosemead","CA","33.786594","-118.298662","-8","1"
+"91773","San Dimas","CA","34.103341","-117.81814","-8","1"
+"91775","San Gabriel","CA","34.114041","-118.09035","-8","1"
+"91776","San Gabriel","CA","34.089059","-118.0951","-8","1"
+"91778","San Gabriel","CA","33.786594","-118.298662","-8","1"
+"91780","Temple City","CA","34.101608","-118.05606","-8","1"
+"91784","Upland","CA","34.138575","-117.66356","-8","1"
+"91785","Upland","CA","34.839964","-115.967051","-8","1"
+"91786","Upland","CA","34.101659","-117.65776","-8","1"
+"91788","Walnut","CA","33.786594","-118.298662","-8","1"
+"91789","Walnut","CA","34.018361","-117.85438","-8","1"
+"91790","West Covina","CA","34.068059","-117.93835","-8","1"
+"91791","West Covina","CA","34.063645","-117.89743","-8","1"
+"91792","West Covina","CA","34.020711","-117.89932","-8","1"
+"91793","West Covina","CA","33.786594","-118.298662","-8","1"
+"91795","Walnut","CA","33.786594","-118.298662","-8","1"
+"91797","Pomona","CA","33.786594","-118.298662","-8","1"
+"91798","Ontario","CA","34.839964","-115.967051","-8","1"
+"91799","Pomona","CA","33.786594","-118.298662","-8","1"
+"91801","Alhambra","CA","34.090409","-118.127","-8","1"
+"91802","Alhambra","CA","33.786594","-118.298662","-8","1"
+"91803","Alhambra","CA","34.072959","-118.1462","-8","1"
+"91804","Alhambra","CA","33.786594","-118.298662","-8","1"
+"91841","Alhambra","CA","33.786594","-118.298662","-8","1"
+"91896","Alhambra","CA","33.786594","-118.298662","-8","1"
+"91899","Alhambra","CA","33.786594","-118.298662","-8","1"
+"91901","Alpine","CA","32.823102","-116.73864","-8","1"
+"91902","Bonita","CA","32.663803","-117.02456","-8","1"
+"91903","Alpine","CA","33.016928","-116.846046","-8","1"
+"91905","Boulevard","CA","32.672239","-116.31497","-8","1"
+"91906","Campo","CA","32.664307","-116.46513","-8","1"
+"91908","Bonita","CA","33.016928","-116.846046","-8","1"
+"91909","Chula Vista","CA","33.016928","-116.846046","-8","1"
+"91910","Chula Vista","CA","32.638654","-117.06686","-8","1"
+"91911","Chula Vista","CA","32.608799","-117.0607","-8","1"
+"91912","Chula Vista","CA","33.016928","-116.846046","-8","1"
+"91913","Chula Vista","CA","32.642486","-116.98973","-8","1"
+"91914","Chula Vista","CA","32.662563","-116.95413","-8","1"
+"91915","Chula Vista","CA","32.638072","-116.95195","-8","1"
+"91916","Descanso","CA","32.890384","-116.62459","-8","1"
+"91917","Dulzura","CA","32.616539","-116.71187","-8","1"
+"91921","Chula Vista","CA","33.016928","-116.846046","-8","1"
+"91927","La Presa","CA","32.701452","-117.002054","-8","1"
+"91931","Guatay","CA","32.852086","-116.55559","-8","1"
+"91932","Imperial Beach","CA","32.579555","-117.11708","-8","1"
+"91933","Imperial Beach","CA","33.016928","-116.846046","-8","1"
+"91934","Jacumba","CA","32.624424","-116.17025","-8","1"
+"91935","Jamul","CA","32.718186","-116.82606","-8","1"
+"91941","La Mesa","CA","32.761801","-117.01273","-8","1"
+"91942","La Mesa","CA","32.785","-117.0186","-8","1"
+"91943","La Mesa","CA","33.016928","-116.846046","-8","1"
+"91944","La Mesa","CA","33.016928","-116.846046","-8","1"
+"91945","Lemon Grove","CA","32.733451","-117.0337","-8","1"
+"91946","Lemon Grove","CA","33.016928","-116.846046","-8","1"
+"91947","Lincoln Acres","CA","33.016928","-116.846046","-8","1"
+"91948","Mount Laguna","CA","32.875267","-116.42826","-8","1"
+"91950","National City","CA","32.670903","-117.09272","-8","1"
+"91951","National City","CA","33.016928","-116.846046","-8","1"
+"91962","Pine Valley","CA","32.773317","-116.49139","-8","1"
+"91963","Potrero","CA","32.620782","-116.60671","-8","1"
+"91976","Spring Valley","CA","33.016928","-116.846046","-8","1"
+"91977","Spring Valley","CA","32.721145","-116.99612","-8","1"
+"91978","Spring Valley","CA","32.732539","-116.95091","-8","1"
+"91979","Spring Valley","CA","33.016928","-116.846046","-8","1"
+"91980","Tecate","CA","32.588485","-116.63034","-8","1"
+"91987","Tecate","CA","33.016928","-116.846046","-8","1"
+"91990","Potrero","CA","33.016928","-116.846046","-8","1"
+"92002","Carlsbad","CA","33.198032","-117.234701","-8","1"
+"92003","Bonsall","CA","33.289265","-117.20011","-8","1"
+"92004","Borrego Springs","CA","33.184028","-116.26597","-8","1"
+"92007","Cardiff By The Sea","CA","33.026742","-117.27816","-8","1"
+"92008","Carlsbad","CA","33.158137","-117.32646","-8","1"
+"92009","Carlsbad","CA","33.097841","-117.26744","-8","1"
+"92013","Carlsbad","CA","33.016928","-116.846046","-8","1"
+"92014","Del Mar","CA","32.961812","-117.25967","-8","1"
+"92018","Carlsbad","CA","33.016928","-116.846046","-8","1"
+"92019","El Cajon","CA","32.788736","-116.90487","-8","1"
+"92020","El Cajon","CA","32.7991","-116.97334","-8","1"
+"92021","El Cajon","CA","32.8201","-116.91234","-8","1"
+"92022","El Cajon","CA","33.016928","-116.846046","-8","1"
+"92023","Encinitas","CA","33.016928","-116.846046","-8","1"
+"92024","Encinitas","CA","33.053092","-117.26855","-8","1"
+"92025","Escondido","CA","33.106862","-117.07077","-8","1"
+"92026","Escondido","CA","33.181543","-117.11136","-8","1"
+"92027","Escondido","CA","33.142706","-117.03049","-8","1"
+"92028","Fallbrook","CA","33.380359","-117.20605","-8","1"
+"92029","Escondido","CA","33.087868","-117.11558","-8","1"
+"92030","Escondido","CA","33.016928","-116.846046","-8","1"
+"92031","Adelanto","CA","34.587473","-117.406293","-8","1"
+"92033","Escondido","CA","33.016928","-116.846046","-8","1"
+"92036","Julian","CA","33.02757","-116.53109","-8","1"
+"92037","La Jolla","CA","32.838761","-117.26159","-8","1"
+"92038","La Jolla","CA","33.016928","-116.846046","-8","1"
+"92039","La Jolla","CA","33.016928","-116.846046","-8","1"
+"92040","Lakeside","CA","32.873849","-116.90477","-8","1"
+"92046","Escondido","CA","33.016928","-116.846046","-8","1"
+"92049","Oceanside","CA","33.016928","-116.846046","-8","1"
+"92051","Oceanside","CA","33.016928","-116.846046","-8","1"
+"92052","Oceanside","CA","33.016928","-116.846046","-8","1"
+"92054","Oceanside","CA","33.202463","-117.36077","-8","1"
+"92055","Camp Pendleton","CA","33.016928","-116.846046","-8","1"
+"92056","Oceanside","CA","33.195354","-117.28232","-8","1"
+"92057","Oceanside","CA","33.240926","-117.29851","-8","1"
+"92058","Oceanside","CA","33.016928","-116.846046","-8","1"
+"92059","Pala","CA","33.369249","-117.07236","-8","1"
+"92060","Palomar Mountain","CA","33.308217","-116.8471","-8","1"
+"92061","Pauma Valley","CA","33.311881","-116.96499","-8","1"
+"92064","Poway","CA","32.973645","-117.03701","-8","1"
+"92065","Ramona","CA","33.035844","-116.8513","-8","1"
+"92066","Ranchita","CA","33.209313","-116.54244","-8","1"
+"92067","Rancho Santa Fe","CA","33.016492","-117.20264","-8","1"
+"92068","San Luis Rey","CA","33.016928","-116.846046","-8","1"
+"92069","San Marcos","CA","33.144908","-117.17128","-8","1"
+"92070","Santa Ysabel","CA","33.166768","-116.71061","-8","1"
+"92071","Santee","CA","32.84681","-116.98983","-8","1"
+"92072","Santee","CA","33.016928","-116.846046","-8","1"
+"92074","Poway","CA","33.016928","-116.846046","-8","1"
+"92075","Solana Beach","CA","32.997543","-117.26087","-8","1"
+"92078","San Marcos","CA","33.122029","-117.15605","-8","1"
+"92079","San Marcos","CA","33.016928","-116.846046","-8","1"
+"92082","Valley Center","CA","33.261748","-117.01027","-8","1"
+"92083","Vista","CA","33.179587","-117.24461","-8","1"
+"92084","Vista","CA","33.213309","-117.21474","-8","1"
+"92085","Vista","CA","33.016928","-116.846046","-8","1"
+"92086","Warner Springs","CA","33.337152","-116.69355","-8","1"
+"92088","Fallbrook","CA","33.016928","-116.846046","-8","1"
+"92090","El Cajon","CA","33.016928","-116.846046","-8","1"
+"92091","Rancho Santa Fe","CA","32.993541","-117.21311","-8","1"
+"92092","La Jolla","CA","33.016928","-116.846046","-8","1"
+"92093","La Jolla","CA","33.016928","-116.846046","-8","1"
+"92096","San Marcos","CA","33.016928","-116.846046","-8","1"
+"92101","San Diego","CA","32.719601","-117.16246","-8","1"
+"92102","San Diego","CA","32.714992","-117.12537","-8","1"
+"92103","San Diego","CA","32.746018","-117.16715","-8","1"
+"92104","San Diego","CA","32.742892","-117.12774","-8","1"
+"92105","San Diego","CA","32.741256","-117.0951","-8","1"
+"92106","San Diego","CA","32.7259","-117.23079","-8","1"
+"92107","San Diego","CA","32.7409","-117.24434","-8","1"
+"92108","San Diego","CA","32.7736","-117.13785","-8","1"
+"92109","San Diego","CA","32.791246","-117.24343","-8","1"
+"92110","San Diego","CA","32.766482","-117.20077","-8","1"
+"92111","San Diego","CA","32.804972","-117.16871","-8","1"
+"92112","San Diego","CA","33.016928","-116.846046","-8","1"
+"92113","San Diego","CA","32.697402","-117.12001","-8","1"
+"92114","San Diego","CA","32.706954","-117.0542","-8","1"
+"92115","San Diego","CA","32.7603","-117.07031","-8","1"
+"92116","San Diego","CA","32.76235","-117.12246","-8","1"
+"92117","San Diego","CA","32.823865","-117.19966","-8","1"
+"92118","Coronado","CA","32.682727","-117.17441","-8","1"
+"92119","San Diego","CA","32.80225","-117.02431","-8","1"
+"92120","San Diego","CA","32.794449","-117.07221","-8","1"
+"92121","San Diego","CA","32.899996","-117.20722","-8","1"
+"92122","San Diego","CA","32.856447","-117.21143","-8","1"
+"92123","San Diego","CA","32.803799","-117.13595","-8","1"
+"92124","San Diego","CA","32.822815","-117.09844","-8","1"
+"92126","San Diego","CA","32.914346","-117.14116","-8","1"
+"92127","San Diego","CA","33.022384","-117.10694","-8","1"
+"92128","San Diego","CA","32.998855","-117.07054","-8","1"
+"92129","San Diego","CA","32.961014","-117.1251","-8","1"
+"92130","San Diego","CA","32.946776","-117.21918","-8","1"
+"92131","San Diego","CA","32.918035","-117.08438","-8","1"
+"92132","San Diego","CA","32.643703","-117.138414","-7","1"
+"92133","San Diego","CA","32.733507","-117.216451","-8","1"
+"92134","San Diego","CA","32.562106","-117.07166","-8","1"
+"92135","San Diego","CA","33.016928","-116.846046","-8","1"
+"92136","San Diego","CA","32.68342","-117.121913","-8","1"
+"92137","San Diego","CA","32.85377","-117.119744","-8","1"
+"92138","San Diego","CA","33.016928","-116.846046","-8","1"
+"92139","San Diego","CA","32.677286","-117.05241","-8","1"
+"92140","San Diego","CA","32.74344","-117.200412","-8","1"
+"92142","San Diego","CA","33.016928","-116.846046","-8","1"
+"92143","San Ysidro","CA","33.016928","-116.846046","-8","1"
+"92145","San Diego","CA","32.889139","-117.100486","-8","1"
+"92147","San Diego","CA","33.016928","-116.846046","-8","1"
+"92149","San Diego","CA","33.016928","-116.846046","-8","1"
+"92150","San Diego","CA","33.016928","-116.846046","-8","1"
+"92152","San Diego","CA","33.016928","-116.846046","-8","1"
+"92153","San Diego","CA","33.016928","-116.846046","-8","1"
+"92154","San Diego","CA","32.574398","-117.05633","-8","1"
+"92155","San Diego","CA","32.671602","-117.165665","-8","1"
+"92158","San Diego","CA","33.016928","-116.846046","-8","1"
+"92159","San Diego","CA","33.016928","-116.846046","-8","1"
+"92160","San Diego","CA","33.016928","-116.846046","-8","1"
+"92161","San Diego","CA","32.871846","-117.229119","-8","1"
+"92162","San Diego","CA","33.016928","-116.846046","-8","1"
+"92163","San Diego","CA","33.016928","-116.846046","-8","1"
+"92164","San Diego","CA","33.016928","-116.846046","-8","1"
+"92165","San Diego","CA","33.016928","-116.846046","-8","1"
+"92166","San Diego","CA","33.016928","-116.846046","-8","1"
+"92167","San Diego","CA","33.016928","-116.846046","-8","1"
+"92168","San Diego","CA","33.016928","-116.846046","-8","1"
+"92169","San Diego","CA","33.016928","-116.846046","-8","1"
+"92170","San Diego","CA","33.016928","-116.846046","-8","1"
+"92171","San Diego","CA","33.016928","-116.846046","-8","1"
+"92172","San Diego","CA","33.016928","-116.846046","-8","1"
+"92173","San Ysidro","CA","32.556264","-117.05057","-8","1"
+"92174","San Diego","CA","33.016928","-116.846046","-8","1"
+"92175","San Diego","CA","33.016928","-116.846046","-8","1"
+"92176","San Diego","CA","33.016928","-116.846046","-8","1"
+"92177","San Diego","CA","33.016928","-116.846046","-8","1"
+"92178","Coronado","CA","33.016928","-116.846046","-8","1"
+"92179","San Diego","CA","32.572602","-116.918724","-8","1"
+"92182","San Diego","CA","32.775088","-117.076176","-8","1"
+"92184","San Diego","CA","33.016928","-116.846046","-8","1"
+"92186","San Diego","CA","33.016928","-116.846046","-8","1"
+"92187","San Diego","CA","33.016928","-116.846046","-8","1"
+"92190","San Diego","CA","33.016928","-116.846046","-8","1"
+"92191","San Diego","CA","33.016928","-116.846046","-8","1"
+"92192","San Diego","CA","33.016928","-116.846046","-8","1"
+"92193","San Diego","CA","33.016928","-116.846046","-8","1"
+"92194","San Diego","CA","33.016928","-116.846046","-8","1"
+"92195","San Diego","CA","33.016928","-116.846046","-8","1"
+"92196","San Diego","CA","33.016928","-116.846046","-8","1"
+"92197","San Diego","CA","33.016928","-116.846046","-8","1"
+"92198","San Diego","CA","33.016928","-116.846046","-8","1"
+"92199","San Diego","CA","32.751575","-117.191848","-8","1"
+"92201","Indio","CA","33.715271","-116.235","-8","1"
+"92202","Indio","CA","33.752886","-116.055617","-8","1"
+"92203","Indio","CA","33.75307","-116.24688","-8","1"
+"92210","Indian Wells","CA","33.70129","-116.34148","-8","1"
+"92211","Palm Desert","CA","33.759409","-116.32317","-8","1"
+"92220","Banning","CA","33.920803","-116.87897","-8","1"
+"92222","Bard","CA","32.782242","-114.561905","-8","1"
+"92223","Beaumont","CA","33.945265","-116.9759","-8","1"
+"92225","Blythe","CA","33.628333","-114.61905","-8","1"
+"92226","Blythe","CA","33.59869","-114.652517","-8","1"
+"92227","Brawley","CA","32.98975","-115.50475","-8","1"
+"92230","Cabazon","CA","33.911404","-116.76834","-8","1"
+"92231","Calexico","CA","32.683491","-115.48277","-8","1"
+"92232","Calexico","CA","33.026203","-115.284581","-8","1"
+"92233","Calipatria","CA","33.131764","-115.51208","-8","1"
+"92234","Cathedral City","CA","33.807761","-116.46473","-8","1"
+"92235","Cathedral City","CA","33.752886","-116.055617","-8","1"
+"92236","Coachella","CA","33.679872","-116.17656","-8","1"
+"92239","Desert Center","CA","33.830029","-115.40124","-8","1"
+"92240","Desert Hot Springs","CA","33.952303","-116.50804","-8","1"
+"92241","Desert Hot Springs","CA","33.904371","-116.38634","-8","1"
+"92242","Earp","CA","34.137179","-114.35823","-8","1"
+"92243","El Centro","CA","32.783359","-115.57746","-8","1"
+"92244","El Centro","CA","32.79475","-115.692714","-8","1"
+"92249","Heber","CA","32.726931","-115.51245","-8","1"
+"92250","Holtville","CA","32.800259","-115.35369","-8","1"
+"92251","Imperial","CA","32.853471","-115.58942","-8","1"
+"92252","Joshua Tree","CA","34.175926","-116.29137","-8","1"
+"92253","La Quinta","CA","33.675373","-116.29649","-8","1"
+"92254","Mecca","CA","33.543836","-115.99404","-8","1"
+"92255","Palm Desert","CA","33.752886","-116.055617","-8","1"
+"92256","Morongo Valley","CA","34.066626","-116.55951","-8","1"
+"92257","Niland","CA","33.330929","-115.61583","-8","1"
+"92258","North Palm Springs","CA","33.921502","-116.56703","-8","1"
+"92259","Ocotillo","CA","32.722049","-115.95998","-8","1"
+"92260","Palm Desert","CA","33.715672","-116.38496","-8","1"
+"92261","Palm Desert","CA","33.660374","-116.408249","-8","1"
+"92262","Palm Springs","CA","33.842984","-116.54344","-8","1"
+"92263","Palm Springs","CA","33.761076","-116.535887","-8","1"
+"92264","Palm Springs","CA","33.798669","-116.51887","-8","1"
+"92266","Palo Verde","CA","33.387467","-114.71352","-8","1"
+"92267","Parker Dam","CA","34.286985","-114.17251","-8","1"
+"92268","Pioneertown","CA","34.203249","-116.56565","-8","1"
+"92270","Rancho Mirage","CA","33.762944","-116.42249","-8","1"
+"92271","Rancho Mirage","CA","33.53163","-114.892368","-8","1"
+"92273","Seeley","CA","32.792631","-115.69162","-8","1"
+"92274","Thermal","CA","33.466287","-116.0688","-8","1"
+"92275","Salton City","CA","33.289347","-115.9565","-8","1"
+"92276","Thousand Palms","CA","33.821318","-116.38023","-8","1"
+"92277","Twentynine Palms","CA","34.165696","-116.03343","-8","1"
+"92278","Twentynine Palms","CA","34.360235","-116.20964","-8","1"
+"92280","Vidal","CA","34.143497","-114.62411","-8","1"
+"92281","Westmorland","CA","33.037061","-115.6194","-8","1"
+"92282","White Water","CA","33.941487","-116.64506","-8","1"
+"92283","Winterhaven","CA","32.786759","-114.62591","-8","1"
+"92284","Yucca Valley","CA","34.161795","-116.41246","-8","1"
+"92285","Landers","CA","34.31039","-116.45012","-8","1"
+"92286","Yucca Valley","CA","34.180251","-116.350003","-8","1"
+"92292","Palm Springs","CA","33.752886","-116.055617","-8","1"
+"92301","Adelanto","CA","34.641695","-117.50803","-8","1"
+"92304","Amboy","CA","34.548138","-115.65796","-8","1"
+"92305","Angelus Oaks","CA","34.172474","-116.87593","-8","1"
+"92307","Apple Valley","CA","34.538622","-117.17729","-8","1"
+"92308","Apple Valley","CA","34.447959","-117.19222","-8","1"
+"92309","Baker","CA","35.27295","-116.06504","-8","1"
+"92310","Fort Irwin","CA","35.262763","-116.69452","-8","1"
+"92311","Barstow","CA","34.894181","-117.03636","-8","1"
+"92312","Barstow","CA","34.201638","-116.906215","-8","1"
+"92313","Grand Terrace","CA","34.030714","-117.31174","-8","1"
+"92314","Big Bear City","CA","34.255388","-116.85442","-8","1"
+"92315","Big Bear Lake","CA","34.241295","-116.90328","-8","1"
+"92316","Bloomington","CA","34.064062","-117.39432","-8","1"
+"92317","Blue Jay","CA","34.245607","-117.23","-8","1"
+"92318","Bryn Mawr","CA","34.048544","-117.23274","-8","1"
+"92320","Calimesa","CA","33.984551","-117.03767","-8","1"
+"92321","Cedar Glen","CA","34.254199","-117.17563","-8","1"
+"92322","Cedarpines Park","CA","34.839964","-115.967051","-8","1"
+"92323","Cima","CA","35.187237","-115.39727","-8","1"
+"92324","Colton","CA","34.061931","-117.31995","-8","1"
+"92325","Crestline","CA","34.242567","-117.28654","-8","1"
+"92326","Crest Park","CA","34.839964","-115.967051","-8","1"
+"92327","Daggett","CA","34.866837","-116.86379","-8","1"
+"92328","Death Valley","CA","35.945641","-117.20296","-8","1"
+"92329","Phelan","CA","34.839964","-115.967051","-8","1"
+"92332","Essex","CA","35.00224","-115.23936","-8","1"
+"92333","Fawnskin","CA","34.268344","-116.93842","-8","1"
+"92334","Fontana","CA","34.839964","-115.967051","-8","1"
+"92335","Fontana","CA","34.088911","-117.45213","-8","1"
+"92336","Fontana","CA","34.125147","-117.45818","-8","1"
+"92337","Fontana","CA","34.046992","-117.481","-8","1"
+"92338","Ludlow","CA","34.720285","-116.1982","-8","1"
+"92339","Forest Falls","CA","34.087114","-116.923","-8","1"
+"92340","Hesperia","CA","34.839964","-115.967051","-8","1"
+"92341","Green Valley Lake","CA","34.241477","-117.07449","-8","1"
+"92342","Helendale","CA","34.761696","-117.33444","-8","1"
+"92345","Hesperia","CA","34.399992","-117.33999","-8","1"
+"92346","Highland","CA","34.12716","-117.20073","-8","1"
+"92347","Hinkley","CA","34.956205","-117.21994","-8","1"
+"92350","Loma Linda","CA","34.839964","-115.967051","-8","1"
+"92352","Lake Arrowhead","CA","34.25629","-117.19132","-8","1"
+"92354","Loma Linda","CA","34.050764","-117.25327","-8","1"
+"92356","Lucerne Valley","CA","34.481229","-116.90601","-8","1"
+"92357","Loma Linda","CA","34.839964","-115.967051","-8","1"
+"92358","Lytle Creek","CA","34.229288","-117.52082","-8","1"
+"92359","Mentone","CA","34.083512","-117.09688","-8","1"
+"92363","Needles","CA","34.808718","-114.62664","-8","1"
+"92364","Nipton","CA","35.46019","-115.49467","-8","1"
+"92365","Newberry Springs","CA","34.896333","-116.63644","-8","1"
+"92366","Mountain Pass","CA","34.839964","-115.967051","-8","1"
+"92368","Oro Grande","CA","34.634147","-117.30614","-8","1"
+"92369","Patton","CA","34.839964","-115.967051","-8","1"
+"92371","Phelan","CA","34.453465","-117.53392","-8","1"
+"92372","Pinon Hills","CA","34.44654","-117.63411","-8","1"
+"92373","Redlands","CA","34.034714","-117.17305","-8","1"
+"92374","Redlands","CA","34.063264","-117.16888","-8","1"
+"92375","Redlands","CA","34.839964","-115.967051","-8","1"
+"92376","Rialto","CA","34.109511","-117.37617","-8","1"
+"92377","Rialto","CA","34.151243","-117.39873","-8","1"
+"92378","Rimforest","CA","34.839964","-115.967051","-8","1"
+"92382","Running Springs","CA","34.205626","-117.10499","-8","1"
+"92384","Shoshone","CA","35.947562","-116.27037","-8","1"
+"92385","Skyforest","CA","34.839964","-115.967051","-8","1"
+"92386","Sugarloaf","CA","34.244448","-116.82962","-8","1"
+"92389","Tecopa","CA","35.848556","-116.22627","-8","1"
+"92391","Twin Peaks","CA","34.839964","-115.967051","-8","1"
+"92392","Victorville","CA","34.489466","-117.35321","-8","1"
+"92393","Victorville","CA","34.839964","-115.967051","-8","1"
+"92394","Victorville","CA","34.55965","-117.35773","-8","1"
+"92396","Winchester","CA","33.714421","-117.069361","-8","1"
+"92397","Wrightwood","CA","34.35876","-117.62752","-8","1"
+"92398","Yermo","CA","34.909491","-116.84058","-8","1"
+"92399","Yucaipa","CA","34.033564","-117.03776","-8","1"
+"92401","San Bernardino","CA","34.105079","-117.29075","-8","1"
+"92402","San Bernardino","CA","34.21392","-117.127166","-8","1"
+"92403","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92404","San Bernardino","CA","34.14856","-117.26298","-8","1"
+"92405","San Bernardino","CA","34.141659","-117.29722","-8","1"
+"92406","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92407","San Bernardino","CA","34.198189","-117.35826","-8","1"
+"92408","San Bernardino","CA","34.080662","-117.27357","-8","1"
+"92410","San Bernardino","CA","34.106965","-117.2975","-8","1"
+"92411","San Bernardino","CA","34.12051","-117.3176","-8","1"
+"92412","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92413","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92414","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92415","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92416","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92418","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92420","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92423","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92424","San Bernardino","CA","34.839964","-115.967051","-8","1"
+"92427","San Bernardino","CA","34.262243","-116.861506","-8","1"
+"92501","Riverside","CA","33.991181","-117.37074","-8","1"
+"92502","Riverside","CA","33.752886","-116.055617","-8","1"
+"92503","Riverside","CA","33.91355","-117.46052","-8","1"
+"92504","Riverside","CA","33.926315","-117.40937","-8","1"
+"92505","Riverside","CA","33.921765","-117.48812","-8","1"
+"92506","Riverside","CA","33.943615","-117.37239","-8","1"
+"92507","Riverside","CA","33.978965","-117.33646","-8","1"
+"92508","Riverside","CA","33.890313","-117.32122","-8","1"
+"92509","Riverside","CA","33.998751","-117.44695","-8","1"
+"92513","Riverside","CA","33.752886","-116.055617","-8","1"
+"92514","Riverside","CA","33.752886","-116.055617","-8","1"
+"92515","Riverside","CA","33.752886","-116.055617","-8","1"
+"92516","Riverside","CA","33.752886","-116.055617","-8","1"
+"92517","Riverside","CA","33.752886","-116.055617","-8","1"
+"92518","March Air Force Base","CA","33.891084","-117.2726","-8","1"
+"92519","Riverside","CA","33.752886","-116.055617","-8","1"
+"92521","Riverside","CA","33.752886","-116.055617","-8","1"
+"92522","Riverside","CA","33.752886","-116.055617","-8","1"
+"92530","Lake Elsinore","CA","33.675893","-117.34946","-8","1"
+"92531","Lake Elsinore","CA","33.752886","-116.055617","-8","1"
+"92532","Lake Elsinore","CA","33.696543","-117.3247","-8","1"
+"92536","Aguanga","CA","33.485978","-116.82004","-8","1"
+"92539","Anza","CA","33.55055","-116.67362","-8","1"
+"92543","Hemet","CA","33.73542","-116.97401","-8","1"
+"92544","Hemet","CA","33.708843","-116.90948","-8","1"
+"92545","Hemet","CA","33.736743","-117.0217","-8","1"
+"92546","Hemet","CA","33.752886","-116.055617","-8","1"
+"92548","Homeland","CA","33.749656","-117.11706","-8","1"
+"92549","Idyllwild","CA","33.750795","-116.72562","-8","1"
+"92551","Moreno Valley","CA","33.889035","-117.22046","-8","1"
+"92552","Moreno Valley","CA","33.752886","-116.055617","-8","1"
+"92553","Moreno Valley","CA","33.923243","-117.24211","-8","1"
+"92554","Moreno Valley","CA","33.521993","-115.915905","-8","1"
+"92555","Moreno Valley","CA","33.922823","-117.16837","-8","1"
+"92556","Moreno Valley","CA","33.752886","-116.055617","-8","1"
+"92557","Moreno Valley","CA","33.957957","-117.24833","-8","1"
+"92561","Mountain Center","CA","33.632049","-116.55878","-8","1"
+"92562","Murrieta","CA","33.568617","-117.25264","-8","1"
+"92563","Murrieta","CA","33.571185","-117.15362","-8","1"
+"92564","Murrieta","CA","33.752886","-116.055617","-8","1"
+"92567","Nuevo","CA","33.819818","-117.11778","-8","1"
+"92570","Perris","CA","33.784051","-117.29812","-8","1"
+"92571","Perris","CA","33.822068","-117.21514","-8","1"
+"92572","Perris","CA","33.752886","-116.055617","-8","1"
+"92581","San Jacinto","CA","33.752886","-116.055617","-8","1"
+"92582","San Jacinto","CA","33.796153","-117.00046","-8","1"
+"92583","San Jacinto","CA","33.788491","-116.95125","-8","1"
+"92584","Menifee","CA","33.66035","-117.18987","-8","1"
+"92585","Sun City","CA","33.742936","-117.17432","-8","1"
+"92586","Sun City","CA","33.70602","-117.1974","-8","1"
+"92587","Sun City","CA","33.692876","-117.25038","-8","1"
+"92589","Temecula","CA","33.752886","-116.055617","-8","1"
+"92590","Temecula","CA","33.479467","-117.20933","-8","1"
+"92591","Temecula","CA","33.52775","-117.12056","-8","1"
+"92592","Temecula","CA","33.495343","-117.07657","-8","1"
+"92593","Temecula","CA","33.752886","-116.055617","-8","1"
+"92595","Wildomar","CA","33.614385","-117.2608","-8","1"
+"92596","Winchester","CA","33.653216","-117.07986","-8","1"
+"92599","Perris","CA","33.752886","-116.055617","-8","1"
+"92602","Irvine","CA","33.73297","-117.76932","-8","1"
+"92603","Irvine","CA","33.648871","-117.764637","-8","1"
+"92604","Irvine","CA","33.68762","-117.78852","-8","1"
+"92605","Huntington Beach","CA","33.640302","-117.769442","-8","1"
+"92606","Irvine","CA","33.695576","-117.80588","-8","1"
+"92607","Laguna Niguel","CA","33.640302","-117.769442","-8","1"
+"92610","Foothill Ranch","CA","33.685479","-117.6669","-8","1"
+"92612","Irvine","CA","33.650813","-117.81771","-8","1"
+"92614","Irvine","CA","33.680408","-117.82592","-8","1"
+"92615","Huntington Beach","CA","33.640302","-117.769442","-8","1"
+"92616","Irvine","CA","33.640302","-117.769442","-8","1"
+"92618","Irvine","CA","33.659639","-117.73948","-8","1"
+"92619","Irvine","CA","33.66985","-117.765939","-8","1"
+"92620","Irvine","CA","33.714889","-117.7633","-8","1"
+"92623","Irvine","CA","33.686519","-117.830788","-8","1"
+"92624","Capistrano Beach","CA","33.460727","-117.66467","-8","1"
+"92625","Corona Del Mar","CA","33.600172","-117.86823","-8","1"
+"92626","Costa Mesa","CA","33.677224","-117.90863","-8","1"
+"92627","Costa Mesa","CA","33.647028","-117.91506","-8","1"
+"92628","Costa Mesa","CA","33.640302","-117.769442","-8","1"
+"92629","Dana Point","CA","33.475302","-117.70327","-8","1"
+"92630","Lake Forest","CA","33.640223","-117.69108","-8","1"
+"92635","Laguna Hills","CA","33.573176","-117.698173","-8","1"
+"92646","Huntington Beach","CA","33.666269","-117.9693","-8","1"
+"92647","Huntington Beach","CA","33.725167","-118.00509","-8","1"
+"92648","Huntington Beach","CA","33.673468","-118.00243","-8","1"
+"92649","Huntington Beach","CA","33.720017","-118.04614","-8","1"
+"92650","East Irvine","CA","33.640302","-117.769442","-8","1"
+"92651","Laguna Beach","CA","33.535325","-117.77192","-8","1"
+"92652","Laguna Beach","CA","33.640302","-117.769442","-8","1"
+"92653","Laguna Hills","CA","33.602823","-117.71295","-8","1"
+"92654","Laguna Hills","CA","33.601673","-117.716885","-8","1"
+"92655","Midway City","CA","33.745166","-117.98569","-8","1"
+"92656","Aliso Viejo","CA","33.581533","-117.72474","-8","1"
+"92657","Newport Coast","CA","33.610717","-117.8325","-8","1"
+"92658","Newport Beach","CA","33.640302","-117.769442","-8","1"
+"92659","Newport Beach","CA","33.611198","-117.886731","-8","1"
+"92660","Newport Beach","CA","33.634821","-117.87453","-8","1"
+"92661","Newport Beach","CA","33.601822","-117.89966","-8","1"
+"92662","Newport Beach","CA","33.606271","-117.89243","-7","1"
+"92663","Newport Beach","CA","33.619221","-117.93087","-8","1"
+"92670","Placentia","CA","33.870714","-117.879342","-8","1"
+"92672","San Clemente","CA","33.427078","-117.61401","-8","1"
+"92673","San Clemente","CA","33.462927","-117.62414","-8","1"
+"92674","San Clemente","CA","33.438428","-117.623131","-8","1"
+"92675","San Juan Capistrano","CA","33.500843","-117.65866","-8","1"
+"92676","Silverado","CA","33.743168","-117.63563","-8","1"
+"92677","Laguna Niguel","CA","33.531938","-117.7025","-8","1"
+"92678","Trabuco Canyon","CA","33.673979","-117.59457","-8","1"
+"92679","Trabuco Canyon","CA","33.639227","-117.58518","-8","1"
+"92680","Garden Grove","CA","33.792124","-117.993561","-8","1"
+"92683","Westminster","CA","33.751418","-117.99392","-8","1"
+"92684","Westminster","CA","33.640302","-117.769442","-8","1"
+"92685","Westminster","CA","33.640302","-117.769442","-8","1"
+"92688","Rancho Santa Margarita","CA","33.639994","-117.60351","-8","1"
+"92690","Mission Viejo","CA","33.640302","-117.769442","-8","1"
+"92691","Mission Viejo","CA","33.611272","-117.66681","-8","1"
+"92692","Mission Viejo","CA","33.615462","-117.64093","-8","1"
+"92693","San Juan Capistrano","CA","33.555323","-117.564","-8","1"
+"92694","Ladera Ranch","CA","33.570763","-117.63463","-8","1"
+"92697","Irvine","CA","33.640302","-117.769442","-8","1"
+"92698","Aliso Viejo","CA","33.640302","-117.769442","-8","1"
+"92701","Santa Ana","CA","33.747017","-117.86248","-8","1"
+"92702","Santa Ana","CA","33.640302","-117.769442","-8","1"
+"92703","Santa Ana","CA","33.747067","-117.90433","-8","1"
+"92704","Santa Ana","CA","33.724167","-117.90623","-8","1"
+"92705","Santa Ana","CA","33.762117","-117.81828","-8","1"
+"92706","Santa Ana","CA","33.765916","-117.88139","-8","1"
+"92707","Santa Ana","CA","33.719118","-117.87143","-8","1"
+"92708","Fountain Valley","CA","33.708618","-117.95629","-8","1"
+"92709","Irvine","CA","33.640302","-117.769442","-8","1"
+"92710","Irvine","CA","33.711552","-117.809881","-8","1"
+"92711","Santa Ana","CA","33.640302","-117.769442","-8","1"
+"92712","Santa Ana","CA","33.640302","-117.769442","-8","1"
+"92728","Fountain Valley","CA","33.640302","-117.769442","-8","1"
+"92735","Santa Ana","CA","33.640302","-117.769442","-8","1"
+"92780","Tustin","CA","33.741651","-117.82127","-8","1"
+"92781","Tustin","CA","33.640302","-117.769442","-8","1"
+"92782","Tustin","CA","33.739571","-117.78618","-8","1"
+"92799","Santa Ana","CA","33.640302","-117.769442","-8","1"
+"92801","Anaheim","CA","33.844814","-117.95381","-8","1"
+"92802","Anaheim","CA","33.806965","-117.92594","-8","1"
+"92803","Anaheim","CA","33.640302","-117.769442","-8","1"
+"92804","Anaheim","CA","33.818165","-117.97304","-8","1"
+"92805","Anaheim","CA","33.835665","-117.90807","-8","1"
+"92806","Anaheim","CA","33.835465","-117.87362","-8","1"
+"92807","Anaheim","CA","33.850515","-117.79113","-8","1"
+"92808","Anaheim","CA","33.858151","-117.73864","-8","1"
+"92811","Atwood","CA","33.640302","-117.769442","-8","1"
+"92812","Anaheim","CA","33.640302","-117.769442","-8","1"
+"92814","Anaheim","CA","33.640302","-117.769442","-8","1"
+"92815","Anaheim","CA","33.640302","-117.769442","-8","1"
+"92816","Anaheim","CA","33.640302","-117.769442","-8","1"
+"92817","Anaheim","CA","33.640302","-117.769442","-8","1"
+"92821","Brea","CA","33.923463","-117.89559","-8","1"
+"92822","Brea","CA","33.640302","-117.769442","-8","1"
+"92823","Brea","CA","33.918965","-117.83252","-8","1"
+"92825","Anaheim","CA","33.640302","-117.769442","-8","1"
+"92831","Fullerton","CA","33.878981","-117.89325","-8","1"
+"92832","Fullerton","CA","33.869114","-117.92985","-8","1"
+"92833","Fullerton","CA","33.874314","-117.9637","-8","1"
+"92834","Fullerton","CA","33.640302","-117.769442","-8","1"
+"92835","Fullerton","CA","33.903164","-117.91224","-8","1"
+"92836","Fullerton","CA","33.640302","-117.769442","-8","1"
+"92837","Fullerton","CA","33.640302","-117.769442","-8","1"
+"92838","Fullerton","CA","33.640302","-117.769442","-8","1"
+"92840","Garden Grove","CA","33.785166","-117.93406","-8","1"
+"92841","Garden Grove","CA","33.786915","-117.98224","-8","1"
+"92842","Garden Grove","CA","33.640302","-117.769442","-8","1"
+"92843","Garden Grove","CA","33.763033","-117.9355","-8","1"
+"92844","Garden Grove","CA","33.765516","-117.9731","-8","1"
+"92845","Garden Grove","CA","33.782916","-118.02619","-8","1"
+"92846","Garden Grove","CA","33.640302","-117.769442","-8","1"
+"92850","Anaheim","CA","33.640302","-117.769442","-8","1"
+"92856","Orange","CA","33.640302","-117.769442","-8","1"
+"92857","Orange","CA","33.640302","-117.769442","-8","1"
+"92859","Orange","CA","33.640302","-117.769442","-8","1"
+"92860","Norco","CA","33.925885","-117.55978","-8","1"
+"92861","Villa Park","CA","33.812662","-117.81623","-8","1"
+"92862","Orange","CA","33.640302","-117.769442","-8","1"
+"92863","Orange","CA","33.640302","-117.769442","-8","1"
+"92864","Orange","CA","33.640302","-117.769442","-8","1"
+"92865","Orange","CA","33.8318","-117.84739","-8","1"
+"92866","Orange","CA","33.785091","-117.84569","-8","1"
+"92867","Orange","CA","33.811566","-117.82919","-8","1"
+"92868","Orange","CA","33.787266","-117.87494","-8","1"
+"92869","Orange","CA","33.792687","-117.79975","-8","1"
+"92870","Placentia","CA","33.883314","-117.85446","-8","1"
+"92871","Placentia","CA","33.640302","-117.769442","-8","1"
+"92877","Corona","CA","33.752886","-116.055617","-8","1"
+"92878","Corona","CA","33.752886","-116.055617","-8","1"
+"92879","Corona","CA","33.8808","-117.54068","-8","1"
+"92880","Corona","CA","33.903803","-117.60221","-8","1"
+"92881","Corona","CA","33.839516","-117.53581","-8","1"
+"92882","Corona","CA","33.866555","-117.59167","-8","1"
+"92883","Corona","CA","33.771548","-117.47884","-8","1"
+"92885","Yorba Linda","CA","33.640302","-117.769442","-8","1"
+"92886","Yorba Linda","CA","33.888062","-117.80407","-8","1"
+"92887","Yorba Linda","CA","33.883223","-117.73856","-8","1"
+"92899","Anaheim","CA","33.640302","-117.769442","-8","1"
+"93001","Ventura","CA","34.311203","-119.30164","-8","1"
+"93002","Ventura","CA","34.032383","-119.1343","-8","1"
+"93003","Ventura","CA","34.268736","-119.2249","-8","1"
+"93004","Ventura","CA","34.278812","-119.16784","-8","1"
+"93005","Ventura","CA","34.032383","-119.1343","-8","1"
+"93006","Ventura","CA","34.032383","-119.1343","-8","1"
+"93007","Ventura","CA","34.032383","-119.1343","-8","1"
+"93009","Ventura","CA","34.356248","-119.146228","-8","1"
+"93010","Camarillo","CA","34.231754","-119.05258","-8","1"
+"93011","Camarillo","CA","34.032383","-119.1343","-8","1"
+"93012","Camarillo","CA","34.218756","-118.99213","-8","1"
+"93013","Carpinteria","CA","34.402194","-119.52308","-8","1"
+"93014","Carpinteria","CA","34.262834","-119.848555","-8","1"
+"93015","Fillmore","CA","34.396646","-118.90082","-8","1"
+"93016","Fillmore","CA","34.032383","-119.1343","-8","1"
+"93020","Moorpark","CA","34.032383","-119.1343","-8","1"
+"93021","Moorpark","CA","34.292898","-118.87134","-8","1"
+"93022","Oak View","CA","34.401466","-119.30082","-8","1"
+"93023","Ojai","CA","34.456957","-119.25307","-8","1"
+"93024","Ojai","CA","34.032383","-119.1343","-8","1"
+"93030","Oxnard","CA","34.21707","-119.1769","-8","1"
+"93031","Oxnard","CA","34.032383","-119.1343","-8","1"
+"93032","Oxnard","CA","34.032383","-119.1343","-8","1"
+"93033","Oxnard","CA","34.166933","-119.16113","-8","1"
+"93034","Oxnard","CA","34.032383","-119.1343","-8","1"
+"93035","Oxnard","CA","34.179304","-119.22189","-8","1"
+"93036","Oxnard","CA","34.22942","-119.178814","-8","1"
+"93040","Piru","CA","34.424363","-118.73908","-8","1"
+"93041","Port Hueneme","CA","34.154072","-119.18829","-8","1"
+"93042","Point Mugu Nawc","CA","34.113389","-119.112432","-8","1"
+"93043","Port Hueneme Cbc Base","CA","34.162124","-119.207364","-8","1"
+"93044","Port Hueneme","CA","34.032383","-119.1343","-8","1"
+"93060","Santa Paula","CA","34.367474","-119.07317","-8","1"
+"93061","Santa Paula","CA","34.032383","-119.1343","-8","1"
+"93062","Simi Valley","CA","34.032383","-119.1343","-8","1"
+"93063","Simi Valley","CA","34.279343","-118.69607","-8","1"
+"93064","Brandeis","CA","34.258203","-118.710724","-8","1"
+"93065","Simi Valley","CA","34.265003","-118.77177","-8","1"
+"93066","Somis","CA","34.287679","-119.02059","-8","1"
+"93067","Summerland","CA","34.421895","-119.60084","-8","1"
+"93093","Simi Valley","CA","34.032383","-119.1343","-8","1"
+"93094","Simi Valley","CA","34.032383","-119.1343","-8","1"
+"93099","Simi Valley","CA","34.032383","-119.1343","-8","1"
+"93101","Santa Barbara","CA","34.420163","-119.7065","-8","1"
+"93102","Santa Barbara","CA","34.262834","-119.848555","-8","1"
+"93103","Santa Barbara","CA","34.428191","-119.68412","-8","1"
+"93105","Santa Barbara","CA","34.44005","-119.75496","-8","1"
+"93106","Santa Barbara","CA","34.432896","-119.837072","-8","1"
+"93107","Santa Barbara","CA","34.421795","-119.863722","-8","1"
+"93108","Santa Barbara","CA","34.433687","-119.63184","-8","1"
+"93109","Santa Barbara","CA","34.40323","-119.72069","-8","1"
+"93110","Santa Barbara","CA","34.439579","-119.76788","-8","1"
+"93111","Santa Barbara","CA","34.443529","-119.80297","-8","1"
+"93116","Goleta","CA","34.262834","-119.848555","-8","1"
+"93117","Goleta","CA","34.443746","-119.94215","-8","1"
+"93118","Goleta","CA","34.262834","-119.848555","-8","1"
+"93120","Santa Barbara","CA","34.262834","-119.848555","-8","1"
+"93121","Santa Barbara","CA","34.262834","-119.848555","-8","1"
+"93130","Santa Barbara","CA","34.262834","-119.848555","-8","1"
+"93140","Santa Barbara","CA","34.262834","-119.848555","-8","1"
+"93150","Santa Barbara","CA","34.262834","-119.848555","-8","1"
+"93160","Santa Barbara","CA","34.262834","-119.848555","-8","1"
+"93190","Santa Barbara","CA","34.262834","-119.848555","-8","1"
+"93199","Goleta","CA","34.262834","-119.848555","-8","1"
+"93201","Alpaugh","CA","35.889586","-119.49352","-8","1"
+"93202","Armona","CA","36.311439","-119.70823","-8","1"
+"93203","Arvin","CA","35.161923","-118.84655","-8","1"
+"93204","Avenal","CA","35.930766","-120.10057","-8","1"
+"93205","Bodfish","CA","35.576134","-118.46745","-8","1"
+"93206","Buttonwillow","CA","35.37825","-119.41664","-8","1"
+"93207","California Hot Springs","CA","35.87137","-118.6821","-8","1"
+"93208","Camp Nelson","CA","36.062748","-118.60663","-8","1"
+"93210","Coalinga","CA","36.194736","-120.30865","-8","1"
+"93212","Corcoran","CA","36.085342","-119.5548","-8","1"
+"93215","Delano","CA","35.774967","-119.23371","-8","1"
+"93216","Delano","CA","35.771876","-119.26984","-8","1"
+"93217","Earlimart","CA","35.89151","-119.263225","-8","1"
+"93218","Ducor","CA","35.842485","-119.01483","-8","1"
+"93219","Earlimart","CA","35.87368","-119.26362","-8","1"
+"93220","Edison","CA","35.357018","-118.810069","-8","1"
+"93221","Exeter","CA","36.304696","-119.11383","-8","1"
+"93222","Frazier Park","CA","34.850984","-119.16626","-8","1"
+"93223","Farmersville","CA","36.300574","-119.20552","-8","1"
+"93224","Fellows","CA","35.202535","-119.56093","-8","1"
+"93225","Frazier Park","CA","34.815266","-119.00404","-8","1"
+"93226","Glennville","CA","35.727428","-118.72424","-8","1"
+"93227","Goshen","CA","36.357151","-119.425371","-8","1"
+"93230","Hanford","CA","36.327063","-119.6451","-8","1"
+"93231","Hanford","CA","36.138861","-119.894727","-8","1"
+"93232","Hanford","CA","36.138861","-119.894727","-8","1"
+"93234","Huron","CA","36.209815","-120.0847","-8","1"
+"93235","Ivanhoe","CA","36.387879","-119.21908","-8","1"
+"93237","Kaweah","CA","36.472713","-118.902899","-8","1"
+"93238","Kernville","CA","35.784367","-118.43769","-8","1"
+"93239","Kettleman City","CA","36.015318","-120.00772","-8","1"
+"93240","Lake Isabella","CA","35.617148","-118.45299","-8","1"
+"93241","Lamont","CA","35.256873","-118.91325","-8","1"
+"93242","Laton","CA","36.43465","-119.71753","-8","1"
+"93243","Lebec","CA","34.851405","-118.87993","-8","1"
+"93244","Lemon Cove","CA","36.417743","-119.00457","-8","1"
+"93245","Lemoore","CA","36.312075","-119.80349","-8","1"
+"93246","Lemoore","CA","36.138861","-119.894727","-8","1"
+"93247","Lindsay","CA","36.201983","-119.08589","-8","1"
+"93249","Lost Hills","CA","35.689717","-119.91961","-8","1"
+"93250","McFarland","CA","35.670747","-119.21336","-8","1"
+"93251","McKittrick","CA","35.364749","-119.70242","-8","1"
+"93252","Maricopa","CA","35.040362","-119.41514","-8","1"
+"93254","New Cuyama","CA","34.956385","-119.74696","-8","1"
+"93255","Onyx","CA","35.666835","-118.01701","-8","1"
+"93256","Pixley","CA","35.957119","-119.31287","-8","1"
+"93257","Porterville","CA","36.055121","-119.01595","-8","1"
+"93258","Porterville","CA","36.033126","-119.007265","-8","1"
+"93260","Posey","CA","35.846291","-118.63298","-8","1"
+"93261","Richgrove","CA","35.801627","-119.11699","-8","1"
+"93262","Sequoia National Park","CA","36.596251","-118.73425","-8","1"
+"93263","Shafter","CA","35.490517","-119.26495","-8","1"
+"93265","Springville","CA","36.150892","-118.76204","-8","1"
+"93266","Stratford","CA","36.177361","-119.82042","-8","1"
+"93267","Strathmore","CA","36.141864","-119.09411","-8","1"
+"93268","Taft","CA","35.162776","-119.4303","-8","1"
+"93270","Terra Bella","CA","35.94901","-119.03742","-8","1"
+"93271","Three Rivers","CA","36.431565","-118.86296","-8","1"
+"93272","Tipton","CA","36.059363","-119.32025","-8","1"
+"93274","Tulare","CA","36.201451","-119.34994","-8","1"
+"93275","Tulare","CA","36.26699","-118.776902","-8","1"
+"93276","Tupman","CA","35.305512","-119.38925","-8","1"
+"93277","Visalia","CA","36.311","-119.32637","-8","1"
+"93278","Visalia","CA","36.126621","-118.819365","-8","1"
+"93279","Visalia","CA","36.393615","-119.118982","-8","1"
+"93280","Wasco","CA","35.605045","-119.37143","-8","1"
+"93282","Waukena","CA","36.12763","-119.52202","-8","1"
+"93283","Weldon","CA","35.614134","-118.27824","-8","1"
+"93285","Wofford Heights","CA","35.714118","-118.48416","-8","1"
+"93286","Woodlake","CA","36.431121","-119.10642","-8","1"
+"93287","Woody","CA","35.702936","-118.8844","-8","1"
+"93291","Visalia","CA","36.351009","-119.33655","-8","1"
+"93292","Visalia","CA","36.358928","-119.24027","-8","1"
+"93301","Bakersfield","CA","35.381408","-119.01935","-8","1"
+"93302","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93303","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93304","Bakersfield","CA","35.344209","-119.02225","-8","1"
+"93305","Bakersfield","CA","35.387058","-118.98647","-8","1"
+"93306","Bakersfield","CA","35.396411","-118.92268","-8","1"
+"93307","Bakersfield","CA","35.324767","-118.96329","-8","1"
+"93308","Bakersfield","CA","35.487491","-119.00896","-8","1"
+"93309","Bakersfield","CA","35.340759","-119.06497","-8","1"
+"93311","Bakersfield","CA","35.200467","-119.17399","-8","1"
+"93312","Bakersfield","CA","35.39068","-119.18583","-8","1"
+"93313","Bakersfield","CA","35.19766","-119.05698","-8","1"
+"93325","Lake of the Woods","CA","34.819232","-119.000391","-8","1"
+"93380","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93381","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93382","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93383","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93384","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93385","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93386","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93387","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93388","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93389","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93390","Bakersfield","CA","35.294405","-118.905173","-8","1"
+"93401","San Luis Obispo","CA","35.262548","-120.65196","-8","1"
+"93402","Los Osos","CA","35.313222","-120.83468","-8","1"
+"93403","San Luis Obispo","CA","35.347065","-120.455345","-8","1"
+"93405","San Luis Obispo","CA","35.277189","-120.70305","-8","1"
+"93406","San Luis Obispo","CA","35.347065","-120.455345","-8","1"
+"93407","San Luis Obispo","CA","35.347065","-120.455345","-8","1"
+"93408","San Luis Obispo","CA","35.347065","-120.455345","-8","1"
+"93409","San Luis Obispo","CA","35.221085","-120.636399","-8","1"
+"93410","San Luis Obispo","CA","35.347065","-120.455345","-8","1"
+"93412","Los Osos","CA","35.347065","-120.455345","-8","1"
+"93420","Arroyo Grande","CA","35.119678","-120.55116","-8","1"
+"93421","Arroyo Grande","CA","35.347065","-120.455345","-8","1"
+"93422","Atascadero","CA","35.474913","-120.676","-8","1"
+"93423","Atascadero","CA","35.428241","-120.769493","-8","1"
+"93424","Avila Beach","CA","35.18554","-120.72583","-8","1"
+"93426","Bradley","CA","35.834919","-120.98093","-8","1"
+"93427","Buellton","CA","34.613014","-120.2051","-8","1"
+"93428","Cambria","CA","35.563246","-121.07736","-8","1"
+"93429","Casmalia","CA","34.842293","-120.5318","-8","1"
+"93430","Cayucos","CA","35.459347","-120.88947","-8","1"
+"93432","Creston","CA","35.495242","-120.48392","-8","1"
+"93433","Grover Beach","CA","35.120934","-120.61952","-8","1"
+"93434","Guadalupe","CA","34.958896","-120.58014","-8","1"
+"93435","Harmony","CA","35.508282","-121.03551","-8","1"
+"93436","Lompoc","CA","34.639682","-120.4471","-8","1"
+"93437","Lompoc","CA","34.73489","-120.53467","-8","1"
+"93438","Lompoc","CA","34.262834","-119.848555","-8","1"
+"93440","Los Alamos","CA","34.75465","-120.27032","-8","1"
+"93441","Los Olivos","CA","34.709973","-120.09201","-8","1"
+"93442","Morro Bay","CA","35.373047","-120.83844","-8","1"
+"93443","Morro Bay","CA","35.347065","-120.455345","-8","1"
+"93444","Nipomo","CA","35.032408","-120.49446","-8","1"
+"93445","Oceano","CA","35.097599","-120.61327","-8","1"
+"93446","Paso Robles","CA","35.640589","-120.70418","-8","1"
+"93447","Paso Robles","CA","35.664837","-120.64542","-8","1"
+"93448","Pismo Beach","CA","35.347065","-120.455345","-8","1"
+"93449","Pismo Beach","CA","35.150886","-120.65401","-8","1"
+"93450","San Ardo","CA","35.964022","-120.87339","-8","1"
+"93451","San Miguel","CA","35.818054","-120.63645","-8","1"
+"93452","San Simeon","CA","35.664386","-121.21965","-8","1"
+"93453","Santa Margarita","CA","35.323098","-120.08301","-8","1"
+"93454","Santa Maria","CA","34.900809","-120.34876","-8","1"
+"93455","Santa Maria","CA","34.87455","-120.42806","-8","1"
+"93456","Santa Maria","CA","35.027682","-120.196818","-8","1"
+"93457","Santa Maria","CA","34.836252","-120.53421","-8","1"
+"93458","Santa Maria","CA","34.956344","-120.45243","-8","1"
+"93460","Santa Ynez","CA","34.626931","-120.0661","-8","1"
+"93461","Shandon","CA","35.636185","-120.27185","-8","1"
+"93463","Solvang","CA","34.608938","-120.13838","-8","1"
+"93464","Solvang","CA","34.674436","-120.111465","-8","1"
+"93465","Templeton","CA","35.54464","-120.72428","-8","1"
+"93483","Grover Beach","CA","35.347065","-120.455345","-8","1"
+"93492","Morro Bay","CA","35.372861","-120.859391","-8","1"
+"93501","Mojave","CA","35.04535","-118.16141","-8","1"
+"93502","Mojave","CA","35.068161","-118.224785","-8","1"
+"93504","California City","CA","35.187133","-117.885359","-8","1"
+"93505","California City","CA","35.139327","-117.91473","-8","1"
+"93510","Acton","CA","34.497245","-118.18951","-8","1"
+"93512","Benton","CA","37.583838","-118.23615","-8","1"
+"93513","Big Pine","CA","37.1363","-118.27335","-8","1"
+"93514","Bishop","CA","37.282192","-118.38717","-8","1"
+"93515","Bishop","CA","36.626033","-117.218616","-8","1"
+"93516","Boron","CA","35.030694","-117.67264","-8","1"
+"93517","Bridgeport","CA","38.21053","-119.31968","-8","1"
+"93518","Caliente","CA","35.381552","-118.54748","-8","1"
+"93519","Cantil","CA","35.177369","-118.035049","-8","1"
+"93522","Darwin","CA","36.269728","-117.59002","-8","1"
+"93523","Edwards","CA","35.044352","-117.8578","-8","1"
+"93524","Edwards","CA","35.294405","-118.905173","-8","1"
+"93526","Independence","CA","36.851729","-118.20743","-8","1"
+"93527","Inyokern","CA","35.734418","-117.89313","-8","1"
+"93528","Johannesburg","CA","35.366197","-117.63618","-8","1"
+"93529","June Lake","CA","37.765218","-119.07769","-8","1"
+"93530","Keeler","CA","36.495772","-117.88289","-8","1"
+"93531","Keene","CA","35.241311","-118.59338","-8","1"
+"93532","Lake Hughes","CA","34.676708","-118.45592","-8","1"
+"93534","Lancaster","CA","34.698696","-118.15015","-8","1"
+"93535","Lancaster","CA","34.691946","-117.97756","-8","1"
+"93536","Lancaster","CA","34.728857","-118.32683","-8","1"
+"93539","Lancaster","CA","33.786594","-118.298662","-8","1"
+"93540","Lake Isabella","CA","35.60345","-118.476436","-8","1"
+"93541","Lee Vining","CA","37.973204","-119.12029","-8","1"
+"93542","Little Lake","CA","36.626033","-117.218616","-8","1"
+"93543","Littlerock","CA","34.533321","-117.94904","-8","1"
+"93544","Llano","CA","34.493392","-117.77444","-8","1"
+"93545","Lone Pine","CA","36.589514","-118.07367","-8","1"
+"93546","Mammoth Lakes","CA","37.621587","-118.86279","-8","1"
+"93549","Olancha","CA","36.228484","-117.97084","-8","1"
+"93550","Palmdale","CA","34.56548","-118.08549","-8","1"
+"93551","Palmdale","CA","34.606146","-118.18495","-8","1"
+"93552","Palmdale","CA","34.561207","-118.0375","-8","1"
+"93553","Pearblossom","CA","34.487552","-117.89885","-8","1"
+"93554","Randsburg","CA","35.409108","-117.69966","-8","1"
+"93555","Ridgecrest","CA","35.599177","-117.68065","-8","1"
+"93556","Ridgecrest","CA","35.294405","-118.905173","-8","1"
+"93558","Red Mountain","CA","34.839964","-115.967051","-8","1"
+"93560","Rosamond","CA","34.88923","-118.33629","-8","1"
+"93561","Tehachapi","CA","35.132673","-118.50781","-8","1"
+"93562","Trona","CA","35.764433","-117.38202","-8","1"
+"93563","Valyermo","CA","34.394253","-117.69475","-8","1"
+"93564","Rosamond","CA","34.900151","-118.246691","-8","1"
+"93581","Tehachapi","CA","35.294405","-118.905173","-8","1"
+"93584","Lancaster","CA","33.786594","-118.298662","-8","1"
+"93586","Lancaster","CA","33.786594","-118.298662","-8","1"
+"93590","Palmdale","CA","33.786594","-118.298662","-8","1"
+"93591","Palmdale","CA","34.596742","-117.84467","-8","1"
+"93592","Trona","CA","34.839964","-115.967051","-8","1"
+"93596","Boron","CA","35.294405","-118.905173","-8","1"
+"93599","Palmdale","CA","33.786594","-118.298662","-8","1"
+"93601","Ahwahnee","CA","37.388698","-119.72439","-8","1"
+"93602","Auberry","CA","37.077273","-119.42982","-8","1"
+"93603","Badger","CA","36.678073","-118.9601","-8","1"
+"93604","Bass Lake","CA","37.364625","-119.51261","-8","1"
+"93605","Big Creek","CA","37.191503","-119.26372","-8","1"
+"93606","Biola","CA","36.802534","-120.01902","-8","1"
+"93607","Burrel","CA","36.589797","-119.899405","-8","1"
+"93608","Cantua Creek","CA","36.523482","-120.38428","-8","1"
+"93609","Caruthers","CA","36.534599","-119.83592","-8","1"
+"93610","Chowchilla","CA","37.100417","-120.27864","-8","1"
+"93611","Clovis","CA","36.840057","-119.66107","-8","1"
+"93612","Clovis","CA","36.813456","-119.70826","-8","1"
+"93613","Clovis","CA","37.036529","-119.511704","-8","1"
+"93614","Coarsegold","CA","37.206505","-119.7207","-8","1"
+"93615","Cutler","CA","36.506019","-119.2866","-8","1"
+"93616","Del Rey","CA","36.657266","-119.59309","-8","1"
+"93618","Dinuba","CA","36.538017","-119.38887","-8","1"
+"93620","Dos Palos","CA","37.029613","-120.64014","-8","1"
+"93621","Dunlap","CA","36.774951","-119.13779","-8","1"
+"93622","Firebaugh","CA","36.800027","-120.57996","-8","1"
+"93623","Fish Camp","CA","37.463177","-119.64498","-8","1"
+"93624","Five Points","CA","36.40263","-120.12855","-8","1"
+"93625","Fowler","CA","36.6265","-119.67526","-8","1"
+"93626","Friant","CA","37.024461","-119.68496","-8","1"
+"93627","Helm","CA","36.523726","-120.10669","-8","1"
+"93628","Hume","CA","36.780156","-118.91524","-8","1"
+"93630","Kerman","CA","36.722616","-120.10081","-8","1"
+"93631","Kingsburg","CA","36.506063","-119.54587","-8","1"
+"93633","Kings Canyon National Pk","CA","36.734051","-118.958777","-8","1"
+"93634","Lakeshore","CA","37.237216","-119.23304","-8","1"
+"93635","Los Banos","CA","37.048385","-120.86983","-8","1"
+"93637","Madera","CA","36.914819","-120.15817","-8","1"
+"93638","Madera","CA","36.991476","-119.98729","-8","1"
+"93639","Madera","CA","37.160622","-119.945035","-8","1"
+"93640","Mendota","CA","36.701905","-120.42801","-8","1"
+"93641","Miramonte","CA","36.697311","-119.01864","-8","1"
+"93642","Mono Hot Springs","CA","36.746375","-119.639658","-8","1"
+"93643","North Fork","CA","37.232047","-119.52006","-8","1"
+"93644","Oakhurst","CA","37.405699","-119.56754","-8","1"
+"93645","O Neals","CA","37.146284","-119.67379","-8","1"
+"93646","Orange Cove","CA","36.623699","-119.30892","-8","1"
+"93647","Orosi","CA","36.565252","-119.24273","-8","1"
+"93648","Parlier","CA","36.61365","-119.52873","-8","1"
+"93649","Piedra","CA","36.841665","-119.349639","-8","1"
+"93650","Fresno","CA","36.841454","-119.79832","-8","1"
+"93651","Prather","CA","37.004865","-119.50748","-8","1"
+"93652","Raisin","CA","36.600348","-119.90272","-8","1"
+"93653","Raymond","CA","37.236305","-119.92498","-8","1"
+"93654","Reedley","CA","36.608675","-119.43761","-8","1"
+"93656","Riverdale","CA","36.45185","-119.93651","-8","1"
+"93657","Sanger","CA","36.72845","-119.53571","-8","1"
+"93660","San Joaquin","CA","36.600172","-120.15338","-8","1"
+"93661","Santa Rita Park","CA","37.186872","-120.650351","-8","1"
+"93662","Selma","CA","36.566779","-119.62201","-8","1"
+"93664","Shaver Lake","CA","37.103957","-119.2644","-8","1"
+"93665","South Dos Palos","CA","36.961248","-120.65439","-8","1"
+"93666","Sultana","CA","36.545749","-119.33907","-8","1"
+"93667","Tollhouse","CA","36.981035","-119.38254","-8","1"
+"93668","Tranquillity","CA","36.641742","-120.28909","-8","1"
+"93669","Wishon","CA","37.284459","-119.53472","-8","1"
+"93670","Yettem","CA","36.471833","-119.259352","-8","1"
+"93673","Traver","CA","36.455501","-119.48495","-8","1"
+"93675","Squaw Valley","CA","36.713181","-119.18327","-8","1"
+"93688","Tranquillity","CA","36.648474","-120.248818","-8","1"
+"93701","Fresno","CA","36.749444","-119.78872","-8","1"
+"93702","Fresno","CA","36.741199","-119.7553","-8","1"
+"93703","Fresno","CA","36.767299","-119.765","-8","1"
+"93704","Fresno","CA","36.794748","-119.80097","-8","1"
+"93705","Fresno","CA","36.786948","-119.82747","-8","1"
+"93706","Fresno","CA","36.691036","-119.83321","-8","1"
+"93707","Fresno","CA","36.746375","-119.639658","-8","1"
+"93708","Fresno","CA","36.746375","-119.639658","-8","1"
+"93709","Fresno","CA","36.746375","-119.639658","-8","1"
+"93710","Fresno","CA","36.825582","-119.76358","-8","1"
+"93711","Fresno","CA","36.831723","-119.83198","-8","1"
+"93712","Fresno","CA","36.746375","-119.639658","-8","1"
+"93714","Fresno","CA","36.746375","-119.639658","-8","1"
+"93715","Fresno","CA","36.746375","-119.639658","-8","1"
+"93716","Fresno","CA","36.746375","-119.639658","-8","1"
+"93717","Fresno","CA","36.746375","-119.639658","-8","1"
+"93718","Fresno","CA","36.746375","-119.639658","-8","1"
+"93720","Fresno","CA","36.865587","-119.75917","-8","1"
+"93721","Fresno","CA","36.733193","-119.78473","-8","1"
+"93722","Fresno","CA","36.801603","-119.88878","-8","1"
+"93724","Fresno","CA","36.746375","-119.639658","-8","1"
+"93725","Fresno","CA","36.658599","-119.74097","-8","1"
+"93726","Fresno","CA","36.795249","-119.76293","-8","1"
+"93727","Fresno","CA","36.753177","-119.69703","-8","1"
+"93728","Fresno","CA","36.758598","-119.81022","-8","1"
+"93729","Fresno","CA","36.746375","-119.639658","-8","1"
+"93740","Fresno","CA","36.746375","-119.639658","-8","1"
+"93741","Fresno","CA","36.746375","-119.639658","-8","1"
+"93744","Fresno","CA","36.746375","-119.639658","-8","1"
+"93745","Fresno","CA","36.746375","-119.639658","-8","1"
+"93747","Fresno","CA","36.746375","-119.639658","-8","1"
+"93750","Fresno","CA","36.746375","-119.639658","-8","1"
+"93755","Fresno","CA","36.746375","-119.639658","-8","1"
+"93759","Fresno","CA","36.746375","-119.639658","-8","1"
+"93760","Fresno","CA","36.746375","-119.639658","-8","1"
+"93761","Fresno","CA","36.746375","-119.639658","-8","1"
+"93762","Fresno","CA","36.746375","-119.639658","-8","1"
+"93764","Fresno","CA","36.746375","-119.639658","-8","1"
+"93765","Fresno","CA","36.746375","-119.639658","-8","1"
+"93771","Fresno","CA","36.746375","-119.639658","-8","1"
+"93772","Fresno","CA","36.746375","-119.639658","-8","1"
+"93773","Fresno","CA","36.746375","-119.639658","-8","1"
+"93774","Fresno","CA","36.746375","-119.639658","-8","1"
+"93775","Fresno","CA","36.746375","-119.639658","-8","1"
+"93776","Fresno","CA","36.746375","-119.639658","-8","1"
+"93777","Fresno","CA","36.746375","-119.639658","-8","1"
+"93778","Fresno","CA","36.746375","-119.639658","-8","1"
+"93779","Fresno","CA","36.746375","-119.639658","-8","1"
+"93780","Fresno","CA","36.746375","-119.639658","-8","1"
+"93782","Fresno","CA","36.746375","-119.639658","-8","1"
+"93784","Fresno","CA","36.746375","-119.639658","-8","1"
+"93786","Fresno","CA","36.746375","-119.639658","-8","1"
+"93790","Fresno","CA","36.746375","-119.639658","-8","1"
+"93791","Fresno","CA","36.746375","-119.639658","-8","1"
+"93792","Fresno","CA","36.746375","-119.639658","-8","1"
+"93793","Fresno","CA","36.746375","-119.639658","-8","1"
+"93794","Fresno","CA","36.746375","-119.639658","-8","1"
+"93825","Wofford Heights","CA","35.717406","-118.466755","-8","1"
+"93844","Fresno","CA","36.746375","-119.639658","-8","1"
+"93888","Fresno","CA","36.746375","-119.639658","-8","1"
+"93901","Salinas","CA","36.665879","-121.65497","-8","1"
+"93902","Salinas","CA","36.35433","-121.132928","-8","1"
+"93905","Salinas","CA","36.681161","-121.61538","-8","1"
+"93906","Salinas","CA","36.709717","-121.63997","-8","1"
+"93907","Salinas","CA","36.754058","-121.66472","-8","1"
+"93908","Salinas","CA","36.619954","-121.65145","-8","1"
+"93912","Salinas","CA","36.35433","-121.132928","-8","1"
+"93915","Salinas","CA","36.35433","-121.132928","-8","1"
+"93920","Big Sur","CA","36.133401","-121.63798","-8","1"
+"93921","Carmel","CA","36.555248","-121.9212","-8","1"
+"93922","Carmel","CA","36.543261","-121.926315","-8","1"
+"93923","Carmel","CA","36.517261","-121.89436","-8","1"
+"93924","Carmel Valley","CA","36.447533","-121.68611","-8","1"
+"93925","Chualar","CA","36.581329","-121.46597","-8","1"
+"93926","Gonzales","CA","36.518179","-121.42557","-8","1"
+"93927","Greenfield","CA","36.300819","-121.2904","-8","1"
+"93928","Jolon","CA","36.015388","-121.24839","-8","1"
+"93930","King City","CA","36.21106","-121.05986","-8","1"
+"93932","Lockwood","CA","35.987276","-121.04788","-8","1"
+"93933","Marina","CA","36.678155","-121.79724","-8","1"
+"93940","Monterey","CA","36.586193","-121.88667","-8","1"
+"93942","Monterey","CA","36.35433","-121.132928","-8","1"
+"93943","Monterey","CA","36.35433","-121.132928","-8","1"
+"93944","Monterey","CA","36.606225","-121.908915","-8","1"
+"93950","Pacific Grove","CA","36.619065","-121.92102","-8","1"
+"93953","Pebble Beach","CA","36.59081","-121.9461","-8","1"
+"93954","San Lucas","CA","36.126393","-120.91784","-8","1"
+"93955","Seaside","CA","36.615813","-121.83461","-8","1"
+"93960","Soledad","CA","36.41176","-121.32617","-8","1"
+"93962","Spreckels","CA","36.624606","-121.64655","-8","1"
+"94002","Belmont","CA","37.516687","-122.29026","-8","1"
+"94003","Belmont","CA","37.381144","-122.334825","-8","1"
+"94005","Brisbane","CA","37.682882","-122.40422","-8","1"
+"94010","Burlingame","CA","37.574936","-122.36332","-8","1"
+"94011","Burlingame","CA","37.381144","-122.334825","-8","1"
+"94012","Burlingame","CA","37.381144","-122.334825","-8","1"
+"94014","Daly City","CA","37.699182","-122.45035","-8","1"
+"94015","Daly City","CA","37.682583","-122.48209","-8","1"
+"94016","Daly City","CA","37.381144","-122.334825","-8","1"
+"94017","Daly City","CA","37.381144","-122.334825","-8","1"
+"94018","El Granada","CA","37.510085","-122.473404","-8","1"
+"94019","Half Moon Bay","CA","37.47584","-122.44323","-8","1"
+"94020","La Honda","CA","37.28842","-122.22457","-8","1"
+"94021","Loma Mar","CA","37.271753","-122.27672","-8","1"
+"94022","Los Altos","CA","37.37714","-122.12412","-8","1"
+"94023","Los Altos","CA","37.189396","-121.705327","-8","1"
+"94024","Los Altos","CA","37.353741","-122.08717","-8","1"
+"94025","Menlo Park","CA","37.451688","-122.18385","-8","1"
+"94026","Menlo Park","CA","37.381144","-122.334825","-8","1"
+"94027","Atherton","CA","37.458615","-122.20009","-8","1"
+"94028","Portola Valley","CA","37.374421","-122.213","-8","1"
+"94029","Menlo Park","CA","37.381144","-122.334825","-8","1"
+"94030","Millbrae","CA","37.600735","-122.40135","-8","1"
+"94031","Millbrae","CA","37.381144","-122.334825","-8","1"
+"94035","Mountain View","CA","37.189396","-121.705327","-8","1"
+"94037","Montara","CA","37.539839","-122.50819","-8","1"
+"94038","Moss Beach","CA","37.52489","-122.50991","-8","1"
+"94039","Mountain View","CA","37.189396","-121.705327","-8","1"
+"94040","Mountain View","CA","37.380207","-122.08787","-8","1"
+"94041","Mountain View","CA","37.38949","-122.07846","-8","1"
+"94042","Mountain View","CA","37.189396","-121.705327","-8","1"
+"94043","Mountain View","CA","37.40679","-122.07461","-8","1"
+"94044","Pacifica","CA","37.613806","-122.48229","-8","1"
+"94045","Pacifica","CA","37.381144","-122.334825","-8","1"
+"94059","Redwood City","CA","37.381144","-122.334825","-8","1"
+"94060","Pescadero","CA","37.203092","-122.33718","-8","1"
+"94061","Redwood City","CA","37.463911","-122.23396","-8","1"
+"94062","Redwood City","CA","37.444879","-122.26253","-8","1"
+"94063","Redwood City","CA","37.483504","-122.2144","-8","1"
+"94064","Redwood City","CA","37.381144","-122.334825","-8","1"
+"94065","Redwood City","CA","37.533538","-122.24602","-8","1"
+"94066","San Bruno","CA","37.625908","-122.42363","-8","1"
+"94067","San Bruno","CA","37.381144","-122.334825","-8","1"
+"94070","San Carlos","CA","37.499175","-122.26655","-8","1"
+"94071","San Carlos","CA","37.381144","-122.334825","-8","1"
+"94074","San Gregorio","CA","37.317278","-122.36526","-8","1"
+"94080","South San Francisco","CA","37.652857","-122.4301","-8","1"
+"94083","South San Francisco","CA","37.381144","-122.334825","-8","1"
+"94085","Sunnyvale","CA","37.38894","-122.017956","-8","1"
+"94086","Sunnyvale","CA","37.378341","-122.02398","-8","1"
+"94087","Sunnyvale","CA","37.350091","-122.03602","-8","1"
+"94088","Sunnyvale","CA","37.189396","-121.705327","-8","1"
+"94089","Sunnyvale","CA","37.406289","-122.00838","-8","1"
+"94090","Sunnyvale","CA","37.189396","-121.705327","-8","1"
+"94096","San Bruno","CA","37.381144","-122.334825","-8","1"
+"94098","San Bruno","CA","37.381144","-122.334825","-8","1"
+"94099","South San Francisco","CA","37.381144","-122.334825","-8","1"
+"94101","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94102","San Francisco","CA","37.779329","-122.41915","-8","1"
+"94103","San Francisco","CA","37.772329","-122.41087","-8","1"
+"94104","San Francisco","CA","37.791728","-122.4019","-8","1"
+"94105","San Francisco","CA","37.789228","-122.3957","-8","1"
+"94106","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94107","San Francisco","CA","37.766529","-122.39577","-8","1"
+"94108","San Francisco","CA","37.792678","-122.40793","-8","1"
+"94109","San Francisco","CA","37.792778","-122.42188","-8","1"
+"94110","San Francisco","CA","37.74873","-122.41545","-8","1"
+"94111","San Francisco","CA","37.798228","-122.40027","-8","1"
+"94112","San Francisco","CA","37.720931","-122.44241","-8","1"
+"94114","San Francisco","CA","37.758434","-122.43512","-8","1"
+"94115","San Francisco","CA","37.786129","-122.43736","-8","1"
+"94116","San Francisco","CA","37.743381","-122.48578","-8","1"
+"94117","San Francisco","CA","37.770937","-122.44276","-8","1"
+"94118","San Francisco","CA","37.782029","-122.46158","-8","1"
+"94119","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94120","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94121","San Francisco","CA","37.778729","-122.49265","-8","1"
+"94122","San Francisco","CA","37.75838","-122.48478","-8","1"
+"94123","San Francisco","CA","37.801028","-122.43836","-8","1"
+"94124","San Francisco","CA","37.732797","-122.39348","-8","1"
+"94125","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94126","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94127","San Francisco","CA","37.734964","-122.4597","-8","1"
+"94128","San Francisco","CA","37.621964","-122.39534","-8","1"
+"94129","San Francisco","CA","37.79984","-122.46167","-8","1"
+"94130","San Francisco","CA","37.819423","-122.36966","-8","1"
+"94131","San Francisco","CA","37.741797","-122.4378","-8","1"
+"94132","San Francisco","CA","37.724231","-122.47958","-8","1"
+"94133","San Francisco","CA","37.801878","-122.41018","-8","1"
+"94134","San Francisco","CA","37.719581","-122.41085","-8","1"
+"94135","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94136","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94137","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94138","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94139","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94140","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94141","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94142","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94143","San Francisco","CA","37.76313","-122.458582","-8","1"
+"94144","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94145","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94146","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94147","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94150","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94151","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94152","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94153","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94154","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94155","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94156","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94157","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94159","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94160","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94161","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94162","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94163","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94164","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94165","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94166","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94167","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94168","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94169","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94170","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94171","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94172","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94175","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94177","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94188","San Francisco","CA","37.784827","-122.727802","-8","1"
+"94203","Sacramento","CA","38.380456","-121.555406","-8","1"
+"94204","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94205","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94206","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94207","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94208","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94209","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94211","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94229","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94230","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94232","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94234","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94235","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94236","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94237","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94239","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94240","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94243","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94244","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94245","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94246","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94247","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94248","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94249","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94250","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94252","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94253","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94254","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94256","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94257","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94258","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94259","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94261","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94262","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94263","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94267","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94268","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94269","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94271","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94273","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94274","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94277","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94278","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94279","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94280","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94282","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94283","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94284","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94285","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94286","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94287","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94288","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94289","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94290","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94291","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94293","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94294","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94295","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94296","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94297","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94298","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94299","Sacramento","CA","38.377411","-121.444429","-8","1"
+"94301","Palo Alto","CA","37.443688","-122.15071","-8","1"
+"94302","Palo Alto","CA","37.189396","-121.705327","-8","1"
+"94303","Palo Alto","CA","37.449888","-122.12749","-8","1"
+"94304","Palo Alto","CA","37.397823","-122.16605","-8","1"
+"94305","Stanford","CA","37.427039","-122.16496","-8","1"
+"94306","Palo Alto","CA","37.419389","-122.13273","-8","1"
+"94307","Palo Alto","CA","37.381144","-122.334825","-8","1"
+"94308","Palo Alto","CA","37.381144","-122.334825","-8","1"
+"94309","Palo Alto","CA","37.189396","-121.705327","-8","1"
+"94310","Palo Alto","CA","37.189396","-121.705327","-8","1"
+"94401","San Mateo","CA","37.570385","-122.32044","-8","1"
+"94402","San Mateo","CA","37.551586","-122.32773","-8","1"
+"94403","San Mateo","CA","37.539686","-122.30266","-8","1"
+"94404","San Mateo","CA","37.554335","-122.27032","-8","1"
+"94405","San Mateo","CA","37.381144","-122.334825","-8","1"
+"94406","San Mateo","CA","37.381144","-122.334825","-8","1"
+"94407","San Mateo","CA","37.381144","-122.334825","-8","1"
+"94408","San Mateo","CA","37.381144","-122.334825","-8","1"
+"94409","San Mateo","CA","37.381144","-122.334825","-8","1"
+"94420","Foster City","CA","37.562385","-122.251078","-8","1"
+"94497","San Mateo","CA","37.534736","-122.32588","-8","1"
+"94501","Alameda","CA","37.769528","-122.25937","-8","1"
+"94502","Alameda","CA","37.734379","-122.23952","-8","1"
+"94503","American Canyon","CA","38.170372","-122.25605","-8","1"
+"94506","Danville","CA","37.804064","-121.91202","-8","1"
+"94507","Alamo","CA","37.856683","-122.02488","-8","1"
+"94508","Angwin","CA","38.568307","-122.45084","-8","1"
+"94509","Antioch","CA","37.991571","-121.80207","-8","1"
+"94510","Benicia","CA","38.071769","-122.15517","-8","1"
+"94511","Bethel Island","CA","38.040395","-121.63852","-8","1"
+"94512","Birds Landing","CA","38.159894","-121.84195","-8","1"
+"94513","Brentwood","CA","37.932123","-121.70381","-8","1"
+"94514","Byron","CA","37.847704","-121.60812","-8","1"
+"94515","Calistoga","CA","38.597907","-122.60952","-8","1"
+"94516","Canyon","CA","37.777208","-121.955399","-8","1"
+"94517","Clayton","CA","37.923523","-121.91172","-8","1"
+"94518","Concord","CA","37.954122","-122.02506","-8","1"
+"94519","Concord","CA","37.984271","-122.01437","-8","1"
+"94520","Concord","CA","37.986321","-122.03988","-8","1"
+"94521","Concord","CA","37.957772","-121.97709","-8","1"
+"94522","Concord","CA","37.777208","-121.955399","-8","1"
+"94523","Pleasant Hill","CA","37.951672","-122.07317","-8","1"
+"94524","Concord","CA","37.777208","-121.955399","-8","1"
+"94525","Crockett","CA","38.05282","-122.2234","-8","1"
+"94526","Danville","CA","37.811676","-121.98647","-8","1"
+"94527","Concord","CA","37.953542","-121.957778","-8","1"
+"94528","Diablo","CA","37.838744","-121.96672","-8","1"
+"94529","Concord","CA","37.777208","-121.955399","-8","1"
+"94530","El Cerrito","CA","37.917774","-122.30426","-8","1"
+"94531","Antioch","CA","37.920852","-121.723919","-8","1"
+"94533","Fairfield","CA","38.269582","-122.03701","-8","1"
+"94534","Fairfield","CA","38.245844","-122.101917","-8","1"
+"94535","Travis AFB","CA","38.277661","-121.9192","-8","1"
+"94536","Fremont","CA","37.562218","-121.99433","-8","1"
+"94537","Fremont","CA","37.680181","-121.921498","-8","1"
+"94538","Fremont","CA","37.527237","-121.9679","-8","1"
+"94539","Fremont","CA","37.515014","-121.92916","-8","1"
+"94540","Hayward","CA","37.680181","-121.921498","-8","1"
+"94541","Hayward","CA","37.674431","-122.08883","-8","1"
+"94542","Hayward","CA","37.657381","-122.05076","-8","1"
+"94543","Hayward","CA","37.680181","-121.921498","-8","1"
+"94544","Hayward","CA","37.633732","-122.06101","-8","1"
+"94545","Hayward","CA","37.635582","-122.10418","-8","1"
+"94546","Castro Valley","CA","37.702063","-122.07934","-8","1"
+"94547","Hercules","CA","38.005122","-122.25784","-8","1"
+"94548","Knightsen","CA","37.972622","-121.665205","-8","1"
+"94549","Lafayette","CA","37.895695","-122.11785","-8","1"
+"94550","Livermore","CA","37.65778","-121.73011","-8","1"
+"94551","Livermore","CA","37.680181","-121.921498","-8","1"
+"94552","Castro Valley","CA","37.69768","-122.02503","-8","1"
+"94553","Martinez","CA","37.998912","-122.11501","-8","1"
+"94555","Fremont","CA","37.571581","-122.0509","-8","1"
+"94556","Moraga","CA","37.839426","-122.12426","-8","1"
+"94557","Hayward","CA","37.680181","-121.921498","-8","1"
+"94558","Napa","CA","38.337243","-122.30027","-8","1"
+"94559","Napa","CA","38.291164","-122.28671","-8","1"
+"94560","Newark","CA","37.535586","-122.03362","-8","1"
+"94561","Oakley","CA","37.992124","-121.71328","-8","1"
+"94562","Oakville","CA","38.437887","-122.399101","-8","1"
+"94563","Orinda","CA","37.878625","-122.18296","-8","1"
+"94564","Pinole","CA","37.997509","-122.29208","-8","1"
+"94565","Pittsburg","CA","38.017917","-121.90502","-8","1"
+"94566","Pleasanton","CA","37.658898","-121.87149","-8","1"
+"94567","Pope Valley","CA","38.658204","-122.40441","-8","1"
+"94568","Dublin","CA","37.714179","-121.92567","-8","1"
+"94569","Port Costa","CA","38.04337","-122.18994","-8","1"
+"94570","Moraga","CA","37.777208","-121.955399","-8","1"
+"94571","Rio Vista","CA","38.156909","-121.72075","-8","1"
+"94572","Rodeo","CA","38.031271","-122.26213","-8","1"
+"94573","Rutherford","CA","38.466508","-122.414189","-8","1"
+"94574","Saint Helena","CA","38.511241","-122.45695","-8","1"
+"94575","Moraga","CA","37.777208","-121.955399","-8","1"
+"94576","Deer Park","CA","38.553087","-122.47725","-8","1"
+"94577","San Leandro","CA","37.722279","-122.15702","-8","1"
+"94578","San Leandro","CA","37.703427","-122.128","-8","1"
+"94579","San Leandro","CA","37.68858","-122.15421","-8","1"
+"94580","San Lorenzo","CA","37.678531","-122.13199","-8","1"
+"94581","Napa","CA","38.509569","-122.3539","-8","1"
+"94583","San Ramon","CA","37.75735","-121.95213","-8","1"
+"94585","Suisun City","CA","38.231364","-122.05414","-8","1"
+"94586","Sunol","CA","37.593883","-121.88281","-8","1"
+"94587","Union City","CA","37.592184","-122.04577","-8","1"
+"94588","Pleasanton","CA","37.68973","-121.89244","-8","1"
+"94589","Vallejo","CA","38.152068","-122.25074","-8","1"
+"94590","Vallejo","CA","38.105219","-122.24571","-8","1"
+"94591","Vallejo","CA","38.099119","-122.21035","-8","1"
+"94592","Vallejo","CA","38.115015","-122.29055","-8","1"
+"94595","Walnut Creek","CA","37.879757","-122.07143","-8","1"
+"94596","Walnut Creek","CA","37.905924","-122.05858","-8","1"
+"94597","Walnut Creek","CA","37.777208","-121.955399","-8","1"
+"94598","Walnut Creek","CA","37.91878","-122.02618","-8","1"
+"94599","Yountville","CA","38.403011","-122.36228","-8","1"
+"94601","Oakland","CA","37.776835","-122.21792","-8","1"
+"94602","Oakland","CA","37.799727","-122.21211","-8","1"
+"94603","Oakland","CA","37.738379","-122.17332","-8","1"
+"94604","Oakland","CA","37.680181","-121.921498","-8","1"
+"94605","Oakland","CA","37.763028","-122.16305","-8","1"
+"94606","Oakland","CA","37.793177","-122.24352","-8","1"
+"94607","Oakland","CA","37.806427","-122.28898","-8","1"
+"94608","Emeryville","CA","37.834724","-122.28316","-8","1"
+"94609","Oakland","CA","37.834926","-122.264","-8","1"
+"94610","Oakland","CA","37.812377","-122.24199","-8","1"
+"94611","Oakland","CA","37.827126","-122.22289","-8","1"
+"94612","Oakland","CA","37.809427","-122.27172","-8","1"
+"94613","Oakland","CA","37.781098","-122.186573","-8","1"
+"94614","Oakland","CA","37.727739","-122.204573","-8","1"
+"94615","Oakland","CA","37.806677","-122.30038","-8","1"
+"94617","Oakland","CA","37.807827","-122.271652","-8","1"
+"94618","Oakland","CA","37.843726","-122.24369","-8","1"
+"94619","Oakland","CA","37.790027","-122.18615","-8","1"
+"94620","Piedmont","CA","37.680181","-121.921498","-8","1"
+"94621","Oakland","CA","37.753978","-122.18969","-8","1"
+"94623","Oakland","CA","37.680181","-121.921498","-8","1"
+"94624","Oakland","CA","37.680181","-121.921498","-8","1"
+"94625","Oakland","CA","37.803927","-122.319655","-8","1"
+"94626","Oakland","CA","37.819314","-122.303136","-8","1"
+"94627","Oakland","CA","37.680181","-121.921498","-8","1"
+"94643","Oakland","CA","37.680181","-121.921498","-8","1"
+"94649","Oakland","CA","37.680181","-121.921498","-8","1"
+"94659","Oakland","CA","37.680181","-121.921498","-8","1"
+"94660","Oakland","CA","37.680181","-121.921498","-8","1"
+"94661","Oakland","CA","37.680181","-121.921498","-8","1"
+"94662","Emeryville","CA","37.680181","-121.921498","-8","1"
+"94666","Oakland","CA","37.680181","-121.921498","-8","1"
+"94701","Berkeley","CA","37.860576","-122.29673","-8","1"
+"94702","Berkeley","CA","37.865026","-122.2859","-8","1"
+"94703","Berkeley","CA","37.862526","-122.27582","-8","1"
+"94704","Berkeley","CA","37.868575","-122.25855","-8","1"
+"94705","Berkeley","CA","37.856926","-122.25084","-8","1"
+"94706","Albany","CA","37.889125","-122.29371","-8","1"
+"94707","Berkeley","CA","37.894625","-122.27917","-8","1"
+"94708","Berkeley","CA","37.894625","-122.26372","-8","1"
+"94709","Berkeley","CA","37.879625","-122.2668","-8","1"
+"94710","Berkeley","CA","37.869976","-122.2981","-8","1"
+"94712","Berkeley","CA","37.680181","-121.921498","-8","1"
+"94720","Berkeley","CA","37.866825","-122.253582","-8","1"
+"94801","Richmond","CA","37.941424","-122.36628","-8","1"
+"94802","Richmond","CA","37.777208","-121.955399","-8","1"
+"94803","El Sobrante","CA","37.969673","-122.29413","-8","1"
+"94804","Richmond","CA","37.926509","-122.3408","-8","1"
+"94805","Richmond","CA","37.941824","-122.32553","-8","1"
+"94806","San Pablo","CA","37.972623","-122.33873","-8","1"
+"94807","Richmond","CA","37.777208","-121.955399","-8","1"
+"94808","Richmond","CA","37.777208","-121.955399","-8","1"
+"94820","El Sobrante","CA","37.777208","-121.955399","-8","1"
+"94850","Richmond","CA","37.777208","-121.955399","-8","1"
+"94901","San Rafael","CA","37.972423","-122.51484","-8","1"
+"94903","San Rafael","CA","38.019022","-122.54589","-8","1"
+"94904","Greenbrae","CA","37.950069","-122.54284","-8","1"
+"94912","San Rafael","CA","38.068036","-122.740988","-8","1"
+"94913","San Rafael","CA","38.068036","-122.740988","-8","1"
+"94914","Kentfield","CA","38.068036","-122.740988","-8","1"
+"94915","San Rafael","CA","38.07392","-122.55944","-8","1"
+"94920","Belvedere Tiburon","CA","37.892476","-122.47541","-8","1"
+"94922","Bodega","CA","38.345572","-122.96676","-8","1"
+"94923","Bodega Bay","CA","38.347701","-123.05869","-8","1"
+"94924","Bolinas","CA","37.907675","-122.70201","-8","1"
+"94925","Corte Madera","CA","37.924242","-122.516","-8","1"
+"94926","Cotati","CA","38.463088","-122.989975","-8","1"
+"94927","Rohnert Park","CA","38.463088","-122.989975","-8","1"
+"94928","Rohnert Park","CA","38.347174","-122.69537","-8","1"
+"94929","Dillon Beach","CA","38.246611","-122.95916","-8","1"
+"94930","Fairfax","CA","37.98779","-122.59962","-8","1"
+"94931","Cotati","CA","38.328614","-122.71044","-8","1"
+"94933","Forest Knolls","CA","38.012489","-122.68886","-8","1"
+"94937","Inverness","CA","38.099205","-122.87751","-8","1"
+"94938","Lagunitas","CA","38.017617","-122.6943","-8","1"
+"94939","Larkspur","CA","37.936151","-122.5355","-8","1"
+"94940","Marshall","CA","38.180029","-122.88357","-8","1"
+"94941","Mill Valley","CA","37.898058","-122.54134","-8","1"
+"94942","Mill Valley","CA","38.068036","-122.740988","-8","1"
+"94945","Novato","CA","38.117065","-122.56316","-8","1"
+"94946","Nicasio","CA","38.050454","-122.67866","-8","1"
+"94947","Novato","CA","38.098221","-122.59809","-8","1"
+"94948","Novato","CA","38.148858","-122.573745","-8","1"
+"94949","Novato","CA","38.06317","-122.54111","-8","1"
+"94950","Olema","CA","38.054433","-122.77762","-8","1"
+"94951","Penngrove","CA","38.314531","-122.66097","-8","1"
+"94952","Petaluma","CA","38.243734","-122.69345","-8","1"
+"94953","Petaluma","CA","38.463088","-122.989975","-8","1"
+"94954","Petaluma","CA","38.243299","-122.6069","-8","1"
+"94955","Petaluma","CA","38.463088","-122.989975","-8","1"
+"94956","Point Reyes Station","CA","38.081566","-122.81988","-8","1"
+"94957","Ross","CA","38.022322","-122.561689","-8","1"
+"94960","San Anselmo","CA","37.981623","-122.56884","-8","1"
+"94963","San Geronimo","CA","38.012082","-122.66389","-8","1"
+"94964","San Quentin","CA","37.943365","-122.49029","-8","1"
+"94965","Sausalito","CA","37.855527","-122.49949","-8","1"
+"94966","Sausalito","CA","38.068036","-122.740988","-8","1"
+"94970","Stinson Beach","CA","37.903396","-122.65043","-8","1"
+"94971","Tomales","CA","38.245851","-122.90644","-8","1"
+"94972","Valley Ford","CA","38.335515","-122.9392","-8","1"
+"94973","Woodacre","CA","38.007639","-122.63914","-8","1"
+"94974","San Quentin","CA","38.068036","-122.740988","-8","1"
+"94975","Petaluma","CA","38.463088","-122.989975","-8","1"
+"94976","Corte Madera","CA","38.068036","-122.740988","-8","1"
+"94977","Larkspur","CA","38.068036","-122.740988","-8","1"
+"94978","Fairfax","CA","38.068036","-122.740988","-8","1"
+"94979","San Anselmo","CA","38.068036","-122.740988","-8","1"
+"94991","San Rafael","CA","37.970726","-122.524012","-8","1"
+"94998","Novato","CA","38.117269","-122.568442","-8","1"
+"94999","Petaluma","CA","38.267466","-122.658097","-8","1"
+"95001","Aptos","CA","37.05297","-121.949418","-8","1"
+"95002","Alviso","CA","37.427439","-121.97521","-8","1"
+"95003","Aptos","CA","36.979333","-121.8944","-8","1"
+"95004","Aromas","CA","36.885056","-121.63082","-8","1"
+"95005","Ben Lomond","CA","37.084347","-122.08524","-8","1"
+"95006","Boulder Creek","CA","37.151813","-122.13679","-8","1"
+"95007","Brookdale","CA","37.10548","-122.1047","-8","1"
+"95008","Campbell","CA","37.278843","-121.95446","-8","1"
+"95009","Campbell","CA","37.189396","-121.705327","-8","1"
+"95010","Capitola","CA","36.9761","-121.95316","-8","1"
+"95011","Campbell","CA","37.189396","-121.705327","-8","1"
+"95012","Castroville","CA","36.768856","-121.75105","-8","1"
+"95013","Coyote","CA","37.189396","-121.705327","-8","1"
+"95014","Cupertino","CA","37.317909","-122.04779","-8","1"
+"95015","Cupertino","CA","37.189396","-121.705327","-8","1"
+"95017","Davenport","CA","37.085986","-122.22638","-8","1"
+"95018","Felton","CA","37.057708","-122.05967","-8","1"
+"95019","Freedom","CA","36.935552","-121.77972","-8","1"
+"95020","Gilroy","CA","37.016943","-121.56581","-8","1"
+"95021","Gilroy","CA","36.986148","-121.497349","-8","1"
+"95022","Palo Alto","CA","37.32477","-122.184276","-8","1"
+"95023","Hollister","CA","36.862243","-121.38006","-8","1"
+"95024","Hollister","CA","36.85443","-121.411909","-8","1"
+"95026","Holy City","CA","37.189396","-121.705327","-8","1"
+"95030","Los Gatos","CA","37.228594","-121.98396","-8","1"
+"95031","Los Gatos","CA","37.189396","-121.705327","-8","1"
+"95032","Los Gatos","CA","37.241193","-121.9534","-8","1"
+"95033","Los Gatos","CA","37.160012","-121.9881","-8","1"
+"95035","Milpitas","CA","37.436451","-121.89438","-8","1"
+"95036","Milpitas","CA","37.456807","-121.913632","-8","1"
+"95037","Morgan Hill","CA","37.137595","-121.66211","-8","1"
+"95038","Morgan Hill","CA","37.225787","-121.617894","-8","1"
+"95039","Moss Landing","CA","36.812905","-121.78299","-8","1"
+"95041","Mount Hermon","CA","37.050798","-122.0569","-8","1"
+"95042","New Almaden","CA","37.189396","-121.705327","-8","1"
+"95043","Paicines","CA","36.504586","-121.01515","-8","1"
+"95044","Redwood Estates","CA","37.189396","-121.705327","-8","1"
+"95045","San Juan Bautista","CA","36.829052","-121.52848","-8","1"
+"95046","San Martin","CA","37.088746","-121.60048","-8","1"
+"95050","Santa Clara","CA","37.347791","-121.95131","-8","1"
+"95051","Santa Clara","CA","37.346241","-121.9846","-8","1"
+"95052","Santa Clara","CA","37.189396","-121.705327","-8","1"
+"95053","Santa Clara","CA","37.189396","-121.705327","-8","1"
+"95054","Santa Clara","CA","37.39324","-121.96066","-8","1"
+"95055","Santa Clara","CA","37.189396","-121.705327","-8","1"
+"95056","Santa Clara","CA","37.189396","-121.705327","-8","1"
+"95060","Santa Cruz","CA","36.980556","-122.04603","-8","1"
+"95061","Santa Cruz","CA","37.007399","-122.075125","-8","1"
+"95062","Santa Cruz","CA","36.9707","-121.99086","-8","1"
+"95063","Santa Cruz","CA","36.9634","-121.973771","-8","1"
+"95064","Santa Cruz","CA","37.000199","-122.06026","-8","1"
+"95065","Santa Cruz","CA","37.010322","-121.98523","-8","1"
+"95066","Scotts Valley","CA","37.057575","-122.01507","-8","1"
+"95067","Scotts Valley","CA","37.05297","-121.949418","-8","1"
+"95070","Saratoga","CA","37.270543","-122.02305","-8","1"
+"95071","Saratoga","CA","37.189396","-121.705327","-8","1"
+"95073","Soquel","CA","37.007916","-121.95072","-8","1"
+"95075","Tres Pinos","CA","36.761702","-121.274795","-8","1"
+"95076","Watsonville","CA","36.922902","-121.77224","-8","1"
+"95077","Watsonville","CA","37.05297","-121.949418","-8","1"
+"95101","San Jose","CA","37.189396","-121.705327","-8","1"
+"95102","San Jose","CA","37.189396","-121.705327","-8","1"
+"95103","San Jose","CA","37.189396","-121.705327","-8","1"
+"95106","San Jose","CA","37.189396","-121.705327","-8","1"
+"95108","San Jose","CA","37.189396","-121.705327","-8","1"
+"95109","San Jose","CA","37.189396","-121.705327","-8","1"
+"95110","San Jose","CA","37.335545","-121.89877","-8","1"
+"95111","San Jose","CA","37.284042","-121.82664","-8","1"
+"95112","San Jose","CA","37.348541","-121.88627","-8","1"
+"95113","San Jose","CA","37.333941","-121.89154","-8","1"
+"95114","San Jose","CA","37.189396","-121.705327","-8","1"
+"95115","San Jose","CA","37.189396","-121.705327","-8","1"
+"95116","San Jose","CA","37.34964","-121.8544","-8","1"
+"95117","San Jose","CA","37.311042","-121.96162","-8","1"
+"95118","San Jose","CA","37.257643","-121.89072","-8","1"
+"95119","San Jose","CA","37.232244","-121.79092","-8","1"
+"95120","San Jose","CA","37.213624","-121.85671","-8","1"
+"95121","San Jose","CA","37.305714","-121.81145","-8","1"
+"95122","San Jose","CA","37.329641","-121.83359","-8","1"
+"95123","San Jose","CA","37.244426","-121.83246","-8","1"
+"95124","San Jose","CA","37.256743","-121.92312","-8","1"
+"95125","San Jose","CA","37.295092","-121.89649","-8","1"
+"95126","San Jose","CA","37.326341","-121.9178","-8","1"
+"95127","San Jose","CA","37.369473","-121.82077","-8","1"
+"95128","San Jose","CA","37.316983","-121.93555","-8","1"
+"95129","San Jose","CA","37.307742","-121.99976","-8","1"
+"95130","San Jose","CA","37.289642","-121.98311","-8","1"
+"95131","San Jose","CA","37.38631","-121.88987","-8","1"
+"95132","San Jose","CA","37.405989","-121.84775","-8","1"
+"95133","San Jose","CA","37.37354","-121.85784","-8","1"
+"95134","San Jose","CA","37.412539","-121.94461","-8","1"
+"95135","San Jose","CA","37.299474","-121.75446","-8","1"
+"95136","San Jose","CA","37.269343","-121.84939","-8","1"
+"95137","San Jose","CA","37.189396","-121.705327","-8","1"
+"95138","San Jose","CA","37.255915","-121.77536","-8","1"
+"95139","San Jose","CA","37.226194","-121.76514","-8","1"
+"95140","Mount Hamilton","CA","37.388718","-121.63845","-8","1"
+"95141","San Jose","CA","37.178745","-121.741809","-8","1"
+"95142","San Jose","CA","37.189396","-121.705327","-8","1"
+"95148","San Jose","CA","37.330496","-121.79141","-8","1"
+"95150","San Jose","CA","37.189396","-121.705327","-8","1"
+"95151","San Jose","CA","37.187349","-121.75722","-8","1"
+"95152","San Jose","CA","37.189396","-121.705327","-8","1"
+"95153","San Jose","CA","37.216184","-121.743632","-8","1"
+"95154","San Jose","CA","37.189396","-121.705327","-8","1"
+"95155","San Jose","CA","37.189396","-121.705327","-8","1"
+"95156","San Jose","CA","37.189396","-121.705327","-8","1"
+"95157","San Jose","CA","37.189396","-121.705327","-8","1"
+"95158","San Jose","CA","37.189396","-121.705327","-8","1"
+"95159","San Jose","CA","37.189396","-121.705327","-8","1"
+"95160","San Jose","CA","37.189396","-121.705327","-8","1"
+"95161","San Jose","CA","37.189396","-121.705327","-8","1"
+"95164","San Jose","CA","37.189396","-121.705327","-8","1"
+"95170","San Jose","CA","37.189396","-121.705327","-8","1"
+"95171","San Jose","CA","37.189396","-121.705327","-8","1"
+"95172","San Jose","CA","37.189396","-121.705327","-8","1"
+"95173","San Jose","CA","37.189396","-121.705327","-8","1"
+"95190","San Jose","CA","37.189396","-121.705327","-8","1"
+"95191","San Jose","CA","37.189396","-121.705327","-8","1"
+"95192","San Jose","CA","37.189396","-121.705327","-8","1"
+"95193","San Jose","CA","37.189396","-121.705327","-8","1"
+"95194","San Jose","CA","37.189396","-121.705327","-8","1"
+"95196","San Jose","CA","37.189396","-121.705327","-8","1"
+"95201","Stockton","CA","37.672196","-121.298794","-8","1"
+"95202","Stockton","CA","37.958723","-121.28805","-8","1"
+"95203","Stockton","CA","37.954823","-121.30735","-8","1"
+"95204","Stockton","CA","37.974273","-121.3147","-8","1"
+"95205","Stockton","CA","37.962873","-121.26401","-8","1"
+"95206","Stockton","CA","37.922024","-121.3025","-8","1"
+"95207","Stockton","CA","38.004172","-121.3237","-8","1"
+"95208","Stockton","CA","37.889849","-121.253872","-8","1"
+"95209","Stockton","CA","38.035499","-121.34378","-8","1"
+"95210","Stockton","CA","38.025086","-121.29722","-8","1"
+"95211","Stockton","CA","37.981073","-121.308008","-8","1"
+"95212","Stockton","CA","38.038906","-121.24213","-8","1"
+"95213","Stockton","CA","37.904777","-121.226782","-8","1"
+"95215","Stockton","CA","37.955474","-121.19064","-8","1"
+"95219","Stockton","CA","38.004922","-121.40022","-8","1"
+"95220","Acampo","CA","38.200193","-121.23505","-8","1"
+"95221","Altaville","CA","38.077","-120.55401","-8","1"
+"95222","Angels Camp","CA","38.087437","-120.58072","-8","1"
+"95223","Arnold","CA","38.282255","-120.28875","-8","1"
+"95224","Avery","CA","38.208553","-120.34876","-8","1"
+"95225","Burson","CA","38.183288","-120.89487","-8","1"
+"95226","Campo Seco","CA","38.229515","-120.86341","-8","1"
+"95227","Clements","CA","38.205817","-121.05361","-8","1"
+"95228","Copperopolis","CA","37.942532","-120.65786","-8","1"
+"95229","Douglas Flat","CA","38.110355","-120.45436","-8","1"
+"95230","Farmington","CA","37.959439","-120.82329","-8","1"
+"95231","French Camp","CA","37.882742","-121.27978","-8","1"
+"95232","Glencoe","CA","38.356552","-120.58318","-8","1"
+"95233","Hathaway Pines","CA","38.186102","-120.36328","-8","1"
+"95234","Holt","CA","37.889849","-121.253872","-8","1"
+"95236","Linden","CA","38.018456","-121.05675","-8","1"
+"95237","Lockeford","CA","38.162818","-121.14855","-8","1"
+"95240","Lodi","CA","38.12463","-121.25039","-8","1"
+"95241","Lodi","CA","37.889849","-121.253872","-8","1"
+"95242","Lodi","CA","38.132618","-121.32282","-8","1"
+"95245","Mokelumne Hill","CA","38.300688","-120.62632","-8","1"
+"95246","Mountain Ranch","CA","38.26127","-120.50328","-8","1"
+"95247","Murphys","CA","38.146124","-120.45458","-8","1"
+"95248","Rail Road Flat","CA","38.325626","-120.485154","-8","1"
+"95249","San Andreas","CA","38.192823","-120.64285","-8","1"
+"95250","Sheep Ranch","CA","38.256839","-120.38102","-8","1"
+"95251","Vallecito","CA","38.075897","-120.46544","-8","1"
+"95252","Valley Springs","CA","38.145601","-120.85733","-8","1"
+"95253","Victor","CA","38.114669","-121.203656","-8","1"
+"95254","Wallace","CA","38.192911","-120.95775","-8","1"
+"95255","West Point","CA","38.421689","-120.46947","-8","1"
+"95257","Wilseyville","CA","38.377741","-120.45741","-8","1"
+"95258","Woodbridge","CA","38.154118","-121.306","-8","1"
+"95267","Stockton","CA","37.889849","-121.253872","-8","1"
+"95269","Stockton","CA","37.889849","-121.253872","-8","1"
+"95290","Stockton","CA","37.953473","-121.285257","-8","1"
+"95296","Lyoth","CA","37.889849","-121.253872","-8","1"
+"95297","Stockton","CA","37.889849","-121.253872","-8","1"
+"95298","Stockton","CA","37.889849","-121.253872","-8","1"
+"95301","Atwater","CA","37.35115","-120.6056","-8","1"
+"95303","Ballico","CA","37.46994","-120.67607","-8","1"
+"95304","Banta","CA","37.889849","-121.253872","-8","1"
+"95305","Big Oak Flat","CA","37.824554","-120.25764","-8","1"
+"95306","Catheys Valley","CA","37.432168","-120.09682","-8","1"
+"95307","Ceres","CA","37.584282","-120.95064","-8","1"
+"95309","Chinese Camp","CA","37.807938","-120.440467","-8","1"
+"95310","Columbia","CA","38.060956","-120.39216","-8","1"
+"95311","Coulterville","CA","37.74614","-120.15123","-8","1"
+"95312","Cressey","CA","37.420143","-120.66525","-8","1"
+"95313","Crows Landing","CA","37.413659","-121.05649","-8","1"
+"95314","Dardanelle","CA","38.033541","-119.92502","-8","1"
+"95315","Delhi","CA","37.428227","-120.77519","-8","1"
+"95316","Denair","CA","37.552329","-120.78463","-8","1"
+"95317","El Nido","CA","37.127525","-120.50574","-8","1"
+"95318","El Portal","CA","37.673629","-119.81305","-8","1"
+"95319","Empire","CA","37.637531","-120.906593","-8","1"
+"95320","Escalon","CA","37.797806","-121.00179","-8","1"
+"95321","Groveland","CA","37.840248","-120.04541","-8","1"
+"95322","Gustine","CA","37.187494","-121.03232","-8","1"
+"95323","Hickman","CA","37.6194","-120.7141","-8","1"
+"95324","Hilmar","CA","37.400932","-120.87972","-8","1"
+"95325","Hornitos","CA","37.46336","-120.2561","-8","1"
+"95326","Hughson","CA","37.59471","-120.86419","-8","1"
+"95327","Jamestown","CA","37.867243","-120.49157","-8","1"
+"95328","Keyes","CA","37.5596","-120.9141","-8","1"
+"95329","La Grange","CA","37.694235","-120.42421","-8","1"
+"95330","Lathrop","CA","37.816876","-121.28541","-8","1"
+"95333","Le Grand","CA","37.245423","-120.27116","-8","1"
+"95334","Livingston","CA","37.38025","-120.72614","-8","1"
+"95335","Long Barn","CA","38.119056","-120.1014","-8","1"
+"95336","Manteca","CA","37.812815","-121.21416","-8","1"
+"95337","Manteca","CA","37.782332","-121.23578","-8","1"
+"95338","Mariposa","CA","37.505484","-119.92527","-8","1"
+"95340","Merced","CA","37.294648","-120.47474","-8","1"
+"95341","Merced","CA","37.186872","-120.650351","-8","1"
+"95342","Atwater","CA","37.367315","-120.570634","-8","1"
+"95343","Merced","CA","37.186872","-120.650351","-8","1"
+"95344","Merced","CA","37.378234","-120.617808","-8","1"
+"95345","Midpines","CA","37.576262","-119.94865","-8","1"
+"95346","Mi Wuk Village","CA","38.079632","-120.16872","-8","1"
+"95347","Moccasin","CA","37.805371","-120.375945","-8","1"
+"95348","Merced","CA","37.342056","-120.50154","-8","1"
+"95350","Modesto","CA","37.671778","-121.01249","-8","1"
+"95351","Modesto","CA","37.626067","-120.99955","-8","1"
+"95352","Modesto","CA","37.60396","-120.937052","-8","1"
+"95353","Modesto","CA","37.60396","-120.937052","-8","1"
+"95354","Modesto","CA","37.644481","-120.98043","-8","1"
+"95355","Modesto","CA","37.673513","-120.95566","-8","1"
+"95356","Modesto","CA","37.704138","-121.02187","-8","1"
+"95357","Modesto","CA","37.667196","-120.9061","-8","1"
+"95358","Modesto","CA","37.622898","-121.05181","-8","1"
+"95360","Newman","CA","37.312014","-121.0314","-8","1"
+"95361","Oakdale","CA","37.776528","-120.84756","-8","1"
+"95363","Patterson","CA","37.477477","-121.14555","-8","1"
+"95364","Pinecrest","CA","38.275328","-119.89619","-8","1"
+"95365","Planada","CA","37.297403","-120.32285","-8","1"
+"95366","Ripon","CA","37.742895","-121.12546","-8","1"
+"95367","Riverbank","CA","37.731272","-120.94365","-8","1"
+"95368","Salida","CA","37.708727","-121.08928","-8","1"
+"95369","Snelling","CA","37.521832","-120.46555","-8","1"
+"95370","Sonora","CA","37.995238","-120.3437","-8","1"
+"95372","Soulsbyville","CA","37.991855","-120.25829","-8","1"
+"95373","Standard","CA","37.986377","-120.241412","-8","1"
+"95374","Stevinson","CA","37.322619","-120.88299","-8","1"
+"95375","Strawberry","CA","38.184096","-120.021342","-8","1"
+"95376","Tracy","CA","37.728417","-121.42399","-8","1"
+"95377","Tracy","CA","37.72374","-121.447131","-8","1"
+"95378","Tracy","CA","37.889849","-121.253872","-8","1"
+"95379","Tuolumne","CA","37.957978","-120.2297","-8","1"
+"95380","Turlock","CA","37.48858","-120.85196","-8","1"
+"95381","Turlock","CA","37.60396","-120.937052","-8","1"
+"95382","Turlock","CA","37.523901","-120.8516","-8","1"
+"95383","Twain Harte","CA","38.055888","-120.23002","-8","1"
+"95385","Vernalis","CA","37.609781","-121.26784","-8","1"
+"95386","Waterford","CA","37.645632","-120.73812","-8","1"
+"95387","Westley","CA","37.539768","-121.24702","-8","1"
+"95388","Winton","CA","37.400193","-120.61094","-8","1"
+"95389","Yosemite National Park","CA","37.699662","-119.67529","-8","1"
+"95390","Riverbank","CA","37.60396","-120.937052","-8","1"
+"95397","Modesto","CA","37.60396","-120.937052","-8","1"
+"95401","Santa Rosa","CA","38.440111","-122.74563","-8","1"
+"95402","Santa Rosa","CA","38.440061","-122.710598","-8","1"
+"95403","Santa Rosa","CA","38.480494","-122.74976","-8","1"
+"95404","Santa Rosa","CA","38.457611","-122.69317","-8","1"
+"95405","Santa Rosa","CA","38.438161","-122.67419","-8","1"
+"95406","Santa Rosa","CA","38.459575","-122.715654","-8","1"
+"95407","Santa Rosa","CA","38.404991","-122.7275","-8","1"
+"95408","Santa Rosa","CA","38.463088","-122.989975","-8","1"
+"95409","Santa Rosa","CA","38.460594","-122.6422","-8","1"
+"95410","Albion","CA","39.216157","-123.71376","-8","1"
+"95412","Annapolis","CA","38.717819","-123.32757","-8","1"
+"95415","Boonville","CA","39.026811","-123.38621","-8","1"
+"95416","Boyes Hot Springs","CA","38.463088","-122.989975","-8","1"
+"95417","Branscomb","CA","39.670239","-123.64423","-8","1"
+"95418","Calpella","CA","39.213324","-123.277143","-8","1"
+"95419","Camp Meeker","CA","38.424554","-122.96067","-8","1"
+"95420","Caspar","CA","39.365356","-123.80469","-8","1"
+"95421","Cazadero","CA","38.562843","-123.16785","-8","1"
+"95422","Clearlake","CA","38.956206","-122.63523","-8","1"
+"95423","Clearlake Oaks","CA","39.037173","-122.65445","-8","1"
+"95424","Clearlake Park","CA","38.971518","-122.66423","-8","1"
+"95425","Cloverdale","CA","38.795668","-122.997","-8","1"
+"95426","Cobb","CA","38.835146","-122.72234","-8","1"
+"95427","Comptche","CA","39.240872","-123.54765","-8","1"
+"95428","Covelo","CA","39.825781","-123.23026","-8","1"
+"95429","Dos Rios","CA","39.761199","-123.33547","-8","1"
+"95430","Duncans Mills","CA","38.449265","-123.05495","-8","1"
+"95431","Eldridge","CA","38.347913","-122.51753","-8","1"
+"95432","Elk","CA","39.103897","-123.64617","-8","1"
+"95433","El Verano","CA","38.313864","-122.513093","-8","1"
+"95435","Finley","CA","39.00686","-122.859625","-8","1"
+"95436","Forestville","CA","38.495857","-122.90636","-8","1"
+"95437","Fort Bragg","CA","39.43695","-123.76087","-8","1"
+"95439","Fulton","CA","38.494643","-122.77226","-8","1"
+"95441","Geyserville","CA","38.710228","-122.95704","-8","1"
+"95442","Glen Ellen","CA","38.367948","-122.52468","-8","1"
+"95443","Glenhaven","CA","39.03276","-122.74082","-8","1"
+"95444","Graton","CA","38.434663","-122.8689","-8","1"
+"95445","Gualala","CA","38.813417","-123.55762","-8","1"
+"95446","Guerneville","CA","38.509737","-123.00084","-8","1"
+"95448","Healdsburg","CA","38.614088","-122.87626","-8","1"
+"95449","Hopland","CA","38.955142","-123.08125","-8","1"
+"95450","Jenner","CA","38.506229","-123.22938","-8","1"
+"95451","Kelseyville","CA","38.939725","-122.78548","-8","1"
+"95452","Kenwood","CA","38.414061","-122.54668","-8","1"
+"95453","Lakeport","CA","39.051698","-122.92071","-8","1"
+"95454","Laytonville","CA","39.745588","-123.5223","-8","1"
+"95456","Littleriver","CA","39.268774","-123.75568","-8","1"
+"95457","Lower Lake","CA","38.911393","-122.599","-8","1"
+"95458","Lucerne","CA","39.090421","-122.78972","-8","1"
+"95459","Manchester","CA","38.996389","-123.66468","-8","1"
+"95460","Mendocino","CA","39.311858","-123.79166","-8","1"
+"95461","Middletown","CA","38.791139","-122.61069","-8","1"
+"95462","Monte Rio","CA","38.471368","-123.01469","-8","1"
+"95463","Navarro","CA","39.173321","-123.55081","-8","1"
+"95464","Nice","CA","39.12558","-122.84653","-8","1"
+"95465","Occidental","CA","38.409993","-122.98347","-8","1"
+"95466","Philo","CA","39.089273","-123.50186","-8","1"
+"95468","Point Arena","CA","38.898385","-123.65746","-8","1"
+"95469","Potter Valley","CA","39.383027","-123.07856","-8","1"
+"95470","Redwood Valley","CA","39.285782","-123.22064","-8","1"
+"95471","Rio Nido","CA","38.522499","-122.97967","-8","1"
+"95472","Sebastopol","CA","38.393314","-122.83666","-8","1"
+"95473","Sebastopol","CA","38.325851","-122.505846","-8","1"
+"95476","Sonoma","CA","38.277147","-122.47058","-8","1"
+"95480","Stewarts Point","CA","38.654705","-123.3999","-8","1"
+"95481","Talmage","CA","39.131856","-123.16221","-8","1"
+"95482","Ukiah","CA","39.154946","-123.20088","-8","1"
+"95485","Upper Lake","CA","39.172397","-122.90474","-8","1"
+"95486","Villa Grande","CA","38.464487","-123.037996","-8","1"
+"95487","Vineburg","CA","38.463088","-122.989975","-8","1"
+"95488","Westport","CA","39.727052","-123.79238","-8","1"
+"95490","Willits","CA","39.451662","-123.37285","-8","1"
+"95492","Windsor","CA","38.54486","-122.80785","-8","1"
+"95493","Witter Springs","CA","39.19607","-122.96649","-8","1"
+"95494","Yorkville","CA","38.916201","-123.26509","-8","1"
+"95497","The Sea Ranch","CA","38.725628","-123.47625","-8","1"
+"95501","Eureka","CA","40.793739","-124.16102","-8","1"
+"95502","Eureka","CA","40.814595","-124.08052","-8","1"
+"95503","Eureka","CA","40.757091","-124.1513","-8","1"
+"95511","Alderpoint","CA","40.169518","-123.60216","-8","1"
+"95514","Blocksburg","CA","40.325767","-123.69266","-8","1"
+"95517","Diamond Springs","CA","38.692808","-120.818771","-8","1"
+"95518","Arcata","CA","40.881383","-123.984232","-8","1"
+"95519","Mckinleyville","CA","40.963482","-124.07286","-8","1"
+"95521","Arcata","CA","40.867469","-124.07519","-8","1"
+"95522","Arcata","CA","40.878317","-124.075673","-8","1"
+"95524","Bayside","CA","40.822884","-124.06711","-8","1"
+"95525","Blue Lake","CA","40.907437","-123.88348","-8","1"
+"95526","Bridgeville","CA","40.413386","-123.53267","-8","1"
+"95527","Burnt Ranch","CA","40.877334","-123.45661","-8","1"
+"95528","Carlotta","CA","40.489925","-123.97132","-8","1"
+"95531","Crescent City","CA","41.782681","-124.16703","-8","1"
+"95532","Crescent City","CA","41.852985","-124.15721","-8","1"
+"95534","Cutten","CA","40.733552","-123.944021","-8","1"
+"95536","Ferndale","CA","40.561448","-124.25781","-8","1"
+"95537","Fields Landing","CA","40.725444","-124.21697","-8","1"
+"95538","Fort Dick","CA","41.892473","-124.145734","-8","1"
+"95540","Fortuna","CA","40.583488","-124.14367","-8","1"
+"95542","Garberville","CA","40.0985","-123.80654","-8","1"
+"95543","Gasquet","CA","41.888557","-123.80079","-8","1"
+"95545","Honeydew","CA","40.281369","-124.08998","-8","1"
+"95546","Hoopa","CA","41.161505","-123.72444","-8","1"
+"95547","Hydesville","CA","40.546202","-124.08412","-8","1"
+"95548","Klamath","CA","41.51823","-124.03075","-8","1"
+"95549","Kneeland","CA","40.691578","-123.87189","-8","1"
+"95550","Korbel","CA","40.766645","-123.83488","-8","1"
+"95551","Loleta","CA","40.659753","-124.22153","-8","1"
+"95552","Mad River","CA","40.390478","-123.41309","-8","1"
+"95553","Miranda","CA","40.210793","-123.86447","-8","1"
+"95554","Myers Flat","CA","40.2959","-123.77902","-8","1"
+"95555","Orick","CA","41.296122","-124.05351","-8","1"
+"95556","Orleans","CA","41.300573","-123.54411","-8","1"
+"95558","Petrolia","CA","40.272963","-124.21494","-8","1"
+"95559","Phillipsville","CA","40.196116","-123.77315","-8","1"
+"95560","Redway","CA","40.131417","-123.85855","-8","1"
+"95562","Rio Dell","CA","40.494813","-124.11637","-8","1"
+"95563","Salyer","CA","40.89197","-123.56149","-8","1"
+"95564","Samoa","CA","40.79348","-124.19929","-8","1"
+"95565","Scotia","CA","40.459978","-124.06059","-8","1"
+"95567","Smith River","CA","41.949739","-124.15098","-8","1"
+"95568","Somes Bar","CA","41.455226","-123.47671","-8","1"
+"95569","Redcrest","CA","40.35983","-123.87105","-8","1"
+"95570","Trinidad","CA","41.081726","-124.13112","-8","1"
+"95571","Weott","CA","40.322683","-123.92367","-8","1"
+"95573","Willow Creek","CA","40.945039","-123.65806","-8","1"
+"95585","Leggett","CA","39.860285","-123.71685","-8","1"
+"95587","Piercy","CA","39.96266","-123.74471","-8","1"
+"95589","Whitethorn","CA","40.033316","-124.02379","-8","1"
+"95592","Vallejo","CA","38.098737","-122.271251","-8","1"
+"95595","Zenia","CA","40.202464","-123.46646","-8","1"
+"95601","Amador City","CA","38.426602","-120.8275","-8","1"
+"95602","Auburn","CA","38.976837","-121.09142","-8","1"
+"95603","Auburn","CA","38.909605","-121.07971","-8","1"
+"95604","Auburn","CA","39.106287","-120.536032","-8","1"
+"95605","West Sacramento","CA","38.592155","-121.52805","-8","1"
+"95606","Brooks","CA","38.857328","-122.21486","-8","1"
+"95607","Capay","CA","38.706727","-122.125","-8","1"
+"95608","Carmichael","CA","38.628371","-121.32702","-8","1"
+"95609","Carmichael","CA","38.650335","-121.327214","-8","1"
+"95610","Citrus Heights","CA","38.696912","-121.27125","-8","1"
+"95611","Citrus Heights","CA","38.377411","-121.444429","-8","1"
+"95612","Clarksburg","CA","38.383366","-121.57819","-8","1"
+"95613","Coloma","CA","38.79829","-120.88578","-8","1"
+"95614","Cool","CA","38.880294","-120.97426","-8","1"
+"95615","Courtland","CA","38.333568","-121.54853","-8","1"
+"95616","Davis","CA","38.549256","-121.73655","-8","1"
+"95617","Davis","CA","38.619545","-121.961532","-8","1"
+"95618","El Macero","CA","38.546306","-121.68682","-8","1"
+"95619","Diamond Springs","CA","38.689067","-120.82071","-8","1"
+"95620","Dixon","CA","38.427208","-121.81348","-8","1"
+"95621","Citrus Heights","CA","38.695252","-121.3081","-8","1"
+"95623","El Dorado","CA","38.639643","-120.84556","-8","1"
+"95624","Elk Grove","CA","38.421068","-121.36059","-8","1"
+"95625","Elmira","CA","38.35011","-121.90799","-8","1"
+"95626","Elverta","CA","38.727451","-121.45433","-8","1"
+"95627","Esparto","CA","38.744062","-121.99929","-8","1"
+"95628","Fair Oaks","CA","38.654803","-121.26529","-8","1"
+"95629","Fiddletown","CA","38.527556","-120.69292","-8","1"
+"95630","Folsom","CA","38.672127","-121.15783","-8","1"
+"95631","Foresthill","CA","39.033312","-120.82172","-8","1"
+"95632","Galt","CA","38.267544","-121.29723","-8","1"
+"95633","Garden Valley","CA","38.839773","-120.82881","-8","1"
+"95634","Georgetown","CA","38.930207","-120.78557","-8","1"
+"95635","Greenwood","CA","38.919588","-120.90406","-8","1"
+"95636","Grizzly Flats","CA","38.634753","-120.53353","-8","1"
+"95637","Guinda","CA","38.830508","-122.19944","-8","1"
+"95638","Herald","CA","38.317665","-121.16166","-8","1"
+"95639","Hood","CA","38.367276","-121.51487","-8","1"
+"95640","Ione","CA","38.346132","-120.94516","-8","1"
+"95641","Isleton","CA","38.161756","-121.60428","-8","1"
+"95642","Jackson","CA","38.359772","-120.75324","-8","1"
+"95644","Kit Carson","CA","38.463282","-120.550021","-8","1"
+"95645","Knights Landing","CA","38.851198","-121.73354","-8","1"
+"95646","Kirkwood","CA","38.688329","-120.05516","-8","1"
+"95648","Lincoln","CA","38.902873","-121.29795","-8","1"
+"95650","Loomis","CA","38.817508","-121.17225","-8","1"
+"95651","Lotus","CA","38.817357","-120.92213","-8","1"
+"95652","Mcclellan AFB","CA","38.666653","-121.389613","-8","1"
+"95653","Madison","CA","38.678663","-121.96907","-8","1"
+"95654","Martell","CA","38.463282","-120.550021","-8","1"
+"95655","Mather","CA","38.558073","-121.28737","-8","1"
+"95656","Mount Aukum","CA","38.54723","-120.707891","-8","1"
+"95658","Newcastle","CA","38.87672","-121.14213","-8","1"
+"95659","Nicolaus","CA","38.868919","-121.56398","-8","1"
+"95660","North Highlands","CA","38.676103","-121.37656","-8","1"
+"95661","Roseville","CA","38.731976","-121.2531","-8","1"
+"95662","Orangevale","CA","38.682803","-121.2231","-8","1"
+"95663","Penryn","CA","38.859227","-121.17565","-8","1"
+"95664","Pilot Hill","CA","38.811695","-121.02427","-8","1"
+"95665","Pine Grove","CA","38.40097","-120.64952","-8","1"
+"95666","Pioneer","CA","38.529753","-120.41411","-8","1"
+"95667","Placerville","CA","38.724682","-120.79533","-8","1"
+"95668","Pleasant Grove","CA","38.8323","-121.51661","-8","1"
+"95669","Plymouth","CA","38.480569","-120.86895","-8","1"
+"95670","Rancho Cordova","CA","38.605355","-121.28247","-8","1"
+"95671","Represa","CA","38.377411","-121.444429","-8","1"
+"95672","Rescue","CA","38.71203","-121.0023","-8","1"
+"95673","Rio Linda","CA","38.688069","-121.44874","-8","1"
+"95674","Rio Oso","CA","38.961976","-121.48166","-8","1"
+"95675","River Pines","CA","38.545656","-120.74287","-8","1"
+"95676","Robbins","CA","38.909351","-121.71843","-8","1"
+"95677","Rocklin","CA","38.789165","-121.23825","-8","1"
+"95678","Roseville","CA","38.752434","-121.28933","-8","1"
+"95679","Rumsey","CA","38.867147","-122.224813","-8","1"
+"95680","Ryde","CA","38.232898","-121.568427","-8","1"
+"95681","Sheridan","CA","38.997612","-121.37967","-8","1"
+"95682","Shingle Springs","CA","38.641158","-120.97109","-8","1"
+"95683","Sloughhouse","CA","38.492811","-121.10036","-8","1"
+"95684","Somerset","CA","38.60766","-120.5937","-8","1"
+"95685","Sutter Creek","CA","38.394464","-120.79015","-8","1"
+"95686","Thornton","CA","38.228976","-121.44032","-8","1"
+"95687","Vacaville","CA","38.34401","-121.95333","-8","1"
+"95688","Vacaville","CA","38.380528","-121.99192","-8","1"
+"95689","Volcano","CA","38.473857","-120.59421","-8","1"
+"95690","Walnut Grove","CA","38.240477","-121.56507","-8","1"
+"95691","West Sacramento","CA","38.569193","-121.54496","-8","1"
+"95692","Wheatland","CA","39.030716","-121.43497","-8","1"
+"95693","Wilton","CA","38.382367","-121.23708","-8","1"
+"95694","Winters","CA","38.537434","-121.97757","-8","1"
+"95695","Woodland","CA","38.697238","-121.80944","-8","1"
+"95696","Vacaville","CA","38.34896","-121.908324","-8","1"
+"95697","Yolo","CA","38.751038","-121.832156","-8","1"
+"95698","Zamora","CA","38.782731","-121.89811","-8","1"
+"95699","Drytown","CA","38.437001","-120.845706","-8","1"
+"95701","Alta","CA","39.217668","-120.78346","-8","1"
+"95703","Applegate","CA","38.995732","-120.99703","-8","1"
+"95709","Camino","CA","38.748112","-120.67463","-8","1"
+"95712","Chicago Park","CA","39.167276","-120.964275","-8","1"
+"95713","Colfax","CA","39.092062","-120.93471","-8","1"
+"95714","Dutch Flat","CA","39.204434","-120.83816","-8","1"
+"95715","Emigrant Gap","CA","39.277658","-120.7067","-8","1"
+"95717","Gold Run","CA","39.177026","-120.8451","-8","1"
+"95720","Kyburz","CA","38.771209","-120.26765","-8","1"
+"95721","Echo Lake","CA","38.823996","-120.05956","-8","1"
+"95722","Meadow Vista","CA","39.005098","-121.01891","-8","1"
+"95724","Norden","CA","39.26599","-120.64145","-8","1"
+"95726","Pollock Pines","CA","38.749713","-120.53386","-8","1"
+"95728","Soda Springs","CA","39.311156","-120.41039","-8","1"
+"95735","Twin Bridges","CA","38.805745","-120.13213","-8","1"
+"95736","Weimar","CA","39.01004","-120.97814","-8","1"
+"95741","Rancho Cordova","CA","38.377411","-121.444429","-8","1"
+"95742","Rancho Cordova","CA","38.607756","-121.18367","-8","1"
+"95743","Rancho Cordova","CA","38.377411","-121.444429","-8","1"
+"95746","Granite Bay","CA","38.743811","-121.19013","-8","1"
+"95747","Roseville","CA","38.768829","-121.33629","-8","1"
+"95749","San Andreas","CA","38.195804","-120.679713","-8","1"
+"95758","Elk Grove","CA","38.406432","-121.43673","-8","1"
+"95759","Elk Grove","CA","38.377411","-121.444429","-8","1"
+"95762","El Dorado Hills","CA","38.684324","-121.06879","-8","1"
+"95763","Folsom","CA","38.377411","-121.444429","-8","1"
+"95765","Rocklin","CA","38.817993","-121.2631","-8","1"
+"95771","Spring Garden","CA","40.036998","-121.831299","-8","1"
+"95776","Woodland","CA","38.681254","-121.74189","-8","1"
+"95798","West Sacramento","CA","38.619545","-121.961532","-8","1"
+"95799","West Sacramento","CA","38.619545","-121.961532","-8","1"
+"95812","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95813","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95814","Sacramento","CA","38.580255","-121.49125","-8","1"
+"95815","Sacramento","CA","38.611854","-121.44553","-8","1"
+"95816","Sacramento","CA","38.571661","-121.46827","-8","1"
+"95817","Sacramento","CA","38.551106","-121.45996","-8","1"
+"95818","Sacramento","CA","38.556576","-121.49285","-8","1"
+"95819","Sacramento","CA","38.568855","-121.44099","-8","1"
+"95820","Sacramento","CA","38.535795","-121.44663","-8","1"
+"95821","Sacramento","CA","38.623304","-121.38181","-8","1"
+"95822","Sacramento","CA","38.51394","-121.49201","-8","1"
+"95823","Sacramento","CA","38.477508","-121.44561","-8","1"
+"95824","Sacramento","CA","38.518356","-121.44378","-8","1"
+"95825","Sacramento","CA","38.594205","-121.40726","-8","1"
+"95826","Sacramento","CA","38.550098","-121.37492","-8","1"
+"95827","Sacramento","CA","38.566506","-121.32515","-8","1"
+"95828","Sacramento","CA","38.484747","-121.4024","-8","1"
+"95829","Sacramento","CA","38.476196","-121.34715","-8","1"
+"95830","Sacramento","CA","38.498156","-121.2651","-8","1"
+"95831","Sacramento","CA","38.494971","-121.53059","-8","1"
+"95832","Sacramento","CA","38.464667","-121.49643","-8","1"
+"95833","Sacramento","CA","38.616891","-121.49623","-8","1"
+"95834","Sacramento","CA","38.642805","-121.50466","-8","1"
+"95835","Sacramento","CA","38.664824","-121.52061","-8","1"
+"95836","Sacramento","CA","38.707236","-121.54983","-8","1"
+"95837","Sacramento","CA","38.700244","-121.60207","-8","1"
+"95838","Sacramento","CA","38.641223","-121.4417","-8","1"
+"95840","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95841","Sacramento","CA","38.66152","-121.34361","-8","1"
+"95842","Sacramento","CA","38.687718","-121.349","-8","1"
+"95843","Antelope","CA","38.716874","-121.3698","-8","1"
+"95851","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95852","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95853","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95857","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95860","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95864","Sacramento","CA","38.587805","-121.37809","-8","1"
+"95865","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95866","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95867","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95873","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95887","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95894","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95899","Sacramento","CA","38.377411","-121.444429","-8","1"
+"95901","Marysville","CA","39.15973","-121.53735","-8","1"
+"95903","Beale AFB","CA","39.125997","-121.36637","-8","1"
+"95910","Alleghany","CA","39.465229","-120.84496","-8","1"
+"95912","Arbuckle","CA","38.97159","-122.02725","-8","1"
+"95913","Artois","CA","39.633265","-122.21009","-8","1"
+"95914","Bangor","CA","39.425854","-121.35852","-8","1"
+"95915","Belden","CA","39.912222","-120.834958","-8","1"
+"95916","Berry Creek","CA","39.661519","-121.38193","-8","1"
+"95917","Biggs","CA","39.413477","-121.71162","-8","1"
+"95918","Browns Valley","CA","39.282171","-121.34733","-8","1"
+"95919","Brownsville","CA","39.453457","-121.26543","-8","1"
+"95920","Butte City","CA","39.44223","-121.95216","-8","1"
+"95922","Camptonville","CA","39.469943","-121.07321","-8","1"
+"95923","Canyondam","CA","40.187554","-121.1152","-8","1"
+"95924","Cedar Ridge","CA","39.26599","-120.64145","-8","1"
+"95925","Challenge","CA","39.466279","-121.20936","-8","1"
+"95926","Chico","CA","39.745973","-121.84259","-8","1"
+"95927","Chico","CA","39.805255","-121.684124","-8","1"
+"95928","Chico","CA","39.720955","-121.81888","-8","1"
+"95929","Chico","CA","39.731406","-121.801215","-8","1"
+"95930","Clipper Mills","CA","39.563522","-121.13191","-8","1"
+"95931","College City","CA","39.169245","-122.290204","-8","1"
+"95932","Colusa","CA","39.254875","-122.04572","-8","1"
+"95934","Crescent Mills","CA","40.074042","-120.93973","-8","1"
+"95935","Dobbins","CA","39.381883","-121.21763","-8","1"
+"95936","Downieville","CA","39.567001","-120.8384","-8","1"
+"95937","Dunnigan","CA","38.931025","-121.94518","-8","1"
+"95938","Durham","CA","39.624259","-121.79152","-8","1"
+"95939","Elk Creek","CA","39.535446","-122.57667","-8","1"
+"95940","Feather Falls","CA","39.585648","-121.259009","-8","1"
+"95941","Forbestown","CA","39.51642","-121.26853","-8","1"
+"95942","Forest Ranch","CA","40.044865","-121.59415","-8","1"
+"95943","Glenn","CA","39.605289","-122.03231","-8","1"
+"95944","Goodyears Bar","CA","39.545514","-120.88512","-8","1"
+"95945","Grass Valley","CA","39.202725","-121.02076","-8","1"
+"95946","Penn Valley","CA","39.207828","-121.20021","-8","1"
+"95947","Greenville","CA","40.144573","-120.88311","-8","1"
+"95948","Gridley","CA","39.35217","-121.71129","-8","1"
+"95949","Grass Valley","CA","39.13255","-121.0981","-8","1"
+"95950","Grimes","CA","39.070128","-121.8981","-8","1"
+"95951","Hamilton City","CA","39.738889","-122.01675","-8","1"
+"95953","Live Oak","CA","39.25209","-121.69439","-8","1"
+"95954","Magalia","CA","39.888074","-121.59048","-8","1"
+"95955","Maxwell","CA","39.283329","-122.20206","-8","1"
+"95956","Meadow Valley","CA","39.93935","-121.06047","-8","1"
+"95957","Meridian","CA","39.070323","-121.83065","-8","1"
+"95958","Nelson","CA","39.556251","-121.803777","-8","1"
+"95959","Nevada City","CA","39.299405","-120.95144","-8","1"
+"95960","North San Juan","CA","39.396152","-121.08227","-8","1"
+"95961","Olivehurst","CA","39.089929","-121.55053","-8","1"
+"95962","Oregon House","CA","39.355688","-121.2548","-8","1"
+"95963","Orland","CA","39.760968","-122.218","-8","1"
+"95965","Oroville","CA","39.558586","-121.58923","-8","1"
+"95966","Oroville","CA","39.491076","-121.49468","-8","1"
+"95967","Paradise","CA","39.723898","-121.572986","-8","1"
+"95968","Palermo","CA","39.434644","-121.55043","-8","1"
+"95969","Paradise","CA","39.750422","-121.61026","-8","1"
+"95970","Princeton","CA","39.415041","-122.02487","-8","1"
+"95971","Quincy","CA","39.957324","-120.98366","-8","1"
+"95972","Rackerby","CA","39.441356","-121.31354","-8","1"
+"95973","Chico","CA","39.793465","-121.87946","-8","1"
+"95974","Richvale","CA","39.496465","-121.74712","-8","1"
+"95975","Rough And Ready","CA","39.224179","-121.14539","-8","1"
+"95976","Chico","CA","39.723898","-121.572986","-8","1"
+"95977","Smartville","CA","39.19322","-121.28975","-8","1"
+"95978","Stirling City","CA","39.904478","-121.52805","-8","1"
+"95979","Stonyford","CA","39.331444","-122.47943","-8","1"
+"95980","Storrie","CA","39.918503","-121.337404","-8","1"
+"95981","Strawberry Valley","CA","39.584801","-121.08762","-8","1"
+"95982","Sutter","CA","39.16855","-121.76465","-8","1"
+"95983","Taylorsville","CA","40.06686","-120.77442","-8","1"
+"95984","Twain","CA","40.017767","-121.05989","-8","1"
+"95986","Washington","CA","39.340422","-120.79166","-8","1"
+"95987","Williams","CA","39.139543","-122.20563","-8","1"
+"95988","Willows","CA","39.499754","-122.20773","-8","1"
+"95991","Yuba City","CA","39.114138","-121.6196","-8","1"
+"95992","Yuba City","CA","39.020133","-121.681345","-8","1"
+"95993","Yuba City","CA","39.109272","-121.68033","-8","1"
+"96001","Redding","CA","40.56816","-122.41519","-8","1"
+"96002","Redding","CA","40.539302","-122.33279","-8","1"
+"96003","Redding","CA","40.641389","-122.34206","-8","1"
+"96006","Adin","CA","41.190742","-120.90294","-8","1"
+"96007","Anderson","CA","40.45453","-122.31101","-8","1"
+"96008","Bella Vista","CA","40.732501","-122.11264","-8","1"
+"96009","Bieber","CA","41.119727","-121.1362","-8","1"
+"96010","Big Bar","CA","40.723792","-123.34016","-8","1"
+"96011","Big Bend","CA","41.027553","-121.91847","-8","1"
+"96013","Burney","CA","40.926289","-121.68452","-8","1"
+"96014","Callahan","CA","41.32211","-122.81535","-8","1"
+"96015","Canby","CA","41.425912","-120.90316","-8","1"
+"96016","Cassel","CA","40.929301","-121.55711","-8","1"
+"96017","Castella","CA","41.109487","-122.33133","-8","1"
+"96019","Shasta Lake","CA","40.682393","-122.36824","-8","1"
+"96020","Chester","CA","40.289788","-121.23263","-8","1"
+"96021","Corning","CA","39.918271","-122.21393","-8","1"
+"96022","Cottonwood","CA","40.360583","-122.33544","-8","1"
+"96023","Dorris","CA","41.963883","-121.89165","-8","1"
+"96024","Douglas City","CA","40.606673","-122.92335","-8","1"
+"96025","Dunsmuir","CA","41.221077","-122.28003","-8","1"
+"96027","Etna","CA","41.414707","-122.96832","-8","1"
+"96028","Fall River Mills","CA","41.056097","-121.49021","-8","1"
+"96029","Flournoy","CA","39.861821","-122.48014","-8","1"
+"96031","Forks Of Salmon","CA","41.228397","-123.20187","-8","1"
+"96032","Fort Jones","CA","41.615475","-122.87744","-8","1"
+"96033","French Gulch","CA","40.736679","-122.61121","-8","1"
+"96034","Gazelle","CA","41.441194","-122.64688","-8","1"
+"96035","Gerber","CA","40.039257","-122.16555","-8","1"
+"96037","Greenview","CA","41.53101","-122.95666","-8","1"
+"96038","Grenada","CA","41.604392","-122.52666","-8","1"
+"96039","Happy Camp","CA","41.82087","-123.43126","-8","1"
+"96040","Hat Creek","CA","40.788512","-121.47668","-8","1"
+"96041","Hayfork","CA","40.524496","-123.18307","-8","1"
+"96044","Hornbrook","CA","41.925752","-122.52253","-8","1"
+"96046","Hyampom","CA","40.639108","-123.47525","-8","1"
+"96047","Igo","CA","40.472993","-122.63707","-8","1"
+"96048","Junction City","CA","40.850776","-122.92043","-8","1"
+"96049","Redding","CA","40.709783","-122.311628","-8","1"
+"96050","Klamath River","CA","41.831947","-122.9206","-8","1"
+"96051","Lakehead","CA","40.939342","-122.42246","-8","1"
+"96052","Lewiston","CA","40.743423","-122.81414","-8","1"
+"96053","Mcarthur","CA","40.446063","-120.664132","-8","1"
+"96054","Lookout","CA","41.285897","-121.16094","-8","1"
+"96055","Los Molinos","CA","40.041399","-122.09793","-8","1"
+"96056","Mcarthur","CA","41.114424","-121.332","-8","1"
+"96057","Mccloud","CA","41.263103","-122.10297","-8","1"
+"96058","Macdoel","CA","41.790562","-121.94214","-8","1"
+"96059","Manton","CA","40.437443","-121.84678","-8","1"
+"96061","Mill Creek","CA","40.310324","-121.43316","-8","1"
+"96062","Millville","CA","40.577799","-122.10148","-8","1"
+"96063","Mineral","CA","40.371043","-121.58245","-8","1"
+"96064","Montague","CA","41.736424","-122.40008","-8","1"
+"96065","Montgomery Creek","CA","40.876184","-121.88975","-8","1"
+"96067","Mount Shasta","CA","41.317771","-122.31207","-8","1"
+"96068","Nubieber","CA","41.102891","-121.19828","-8","1"
+"96069","Oak Run","CA","40.705474","-122.021","-8","1"
+"96070","Obrien","CA","40.735153","-122.1944","-8","1"
+"96071","Old Station","CA","40.646417","-121.4418","-8","1"
+"96073","Palo Cedro","CA","40.562648","-122.2255","-8","1"
+"96074","Paskenta","CA","39.878018","-122.57972","-8","1"
+"96075","Paynes Creek","CA","40.338253","-121.84025","-8","1"
+"96076","Platina","CA","40.366349","-122.94566","-8","1"
+"96078","Proberta","CA","40.12517","-122.204141","-8","1"
+"96079","Shasta Lake","CA","40.686639","-122.334778","-8","1"
+"96080","Red Bluff","CA","40.183837","-122.24074","-8","1"
+"96084","Round Mountain","CA","40.871548","-121.98807","-8","1"
+"96085","Scott Bar","CA","41.734832","-123.07218","-8","1"
+"96086","Seiad Valley","CA","41.86235","-123.24091","-8","1"
+"96087","Shasta","CA","40.608728","-122.51427","-8","1"
+"96088","Shingletown","CA","40.504853","-121.83501","-8","1"
+"96089","Shasta Lake","CA","40.657893","-122.427333","-8","1"
+"96090","Tehama","CA","40.024337","-122.12378","-8","1"
+"96091","Trinity Center","CA","41.004651","-122.71541","-8","1"
+"96092","Vina","CA","39.941595","-122.03746","-8","1"
+"96093","Weaverville","CA","40.734483","-122.93982","-8","1"
+"96094","Weed","CA","41.460403","-122.38544","-8","1"
+"96095","Whiskeytown","CA","40.607134","-122.54626","-8","1"
+"96096","Whitmore","CA","40.63446","-121.91202","-8","1"
+"96097","Yreka","CA","41.749249","-122.64479","-8","1"
+"96099","Redding","CA","40.704337","-122.387808","-8","1"
+"96101","Alturas","CA","41.439363","-120.58771","-8","1"
+"96103","Blairsden-Graeagle","CA","39.779486","-120.64058","-8","1"
+"96104","Cedarville","CA","41.527226","-120.13826","-8","1"
+"96105","Chilcoot","CA","39.862832","-120.17303","-8","1"
+"96106","Clio","CA","39.743835","-120.58114","-8","1"
+"96107","Coleville","CA","38.475853","-119.49014","-8","1"
+"96108","Davis Creek","CA","41.736074","-120.3778","-8","1"
+"96109","Doyle","CA","40.030098","-120.11304","-8","1"
+"96110","Eagleville","CA","41.251918","-120.12897","-8","1"
+"96111","Floriston","CA","39.392752","-120.021212","-8","1"
+"96112","Fort Bidwell","CA","41.90749","-120.14789","-8","1"
+"96113","Herlong","CA","40.158794","-120.18597","-8","1"
+"96114","Janesville","CA","40.295652","-120.51775","-8","1"
+"96115","Lake City","CA","41.688163","-120.23924","-8","1"
+"96116","Likely","CA","41.268746","-120.42843","-8","1"
+"96117","Litchfield","CA","40.446122","-120.35776","-8","1"
+"96118","Loyalton","CA","39.663256","-120.24835","-8","1"
+"96119","Madeline","CA","41.021344","-120.52472","-8","1"
+"96120","Markleeville","CA","38.76467","-119.85236","-8","1"
+"96121","Milford","CA","40.169038","-120.37815","-8","1"
+"96122","Portola","CA","39.801047","-120.48359","-8","1"
+"96123","Ravendale","CA","40.800556","-120.36374","-8","1"
+"96124","Calpine","CA","39.663242","-120.43806","-8","1"
+"96125","Sierra City","CA","39.598792","-120.63432","-8","1"
+"96126","Sierraville","CA","39.560357","-120.35662","-8","1"
+"96127","Susanville","CA","40.446063","-120.664132","-8","1"
+"96128","Standish","CA","40.34863","-120.4065","-8","1"
+"96129","Beckwourth","CA","39.772064","-120.405095","-8","1"
+"96130","Susanville","CA","40.474951","-120.67685","-8","1"
+"96132","Termo","CA","40.921124","-120.62265","-8","1"
+"96133","Topaz","CA","38.651141","-119.49874","-8","1"
+"96134","Tulelake","CA","41.874847","-121.43738","-8","1"
+"96135","Vinton","CA","40.02349","-120.79861","-8","1"
+"96136","Wendel","CA","40.283378","-120.12859","-8","1"
+"96137","Westwood","CA","40.290007","-121.05272","-8","1"
+"96140","Carnelian Bay","CA","39.223151","-120.08627","-8","1"
+"96141","Homewood","CA","39.093271","-120.16325","-8","1"
+"96142","Tahoma","CA","39.037696","-120.12438","-8","1"
+"96143","Kings Beach","CA","39.241961","-120.02809","-8","1"
+"96145","Tahoe City","CA","39.177383","-120.14607","-8","1"
+"96146","Olympic Valley","CA","39.180983","-120.21804","-8","1"
+"96148","Tahoe Vista","CA","39.243877","-120.05437","-8","1"
+"96150","South Lake Tahoe","CA","38.908741","-120.00992","-8","1"
+"96151","South Lake Tahoe","CA","38.90392","-119.995024","-8","1"
+"96152","South Lake Tahoe","CA","38.927149","-119.999032","-8","1"
+"96154","South Lake Tahoe","CA","38.87529","-120.0188","-8","1"
+"96155","South Lake Tahoe","CA","38.844909","-120.042996","-8","1"
+"96156","South Lake Tahoe","CA","38.935245","-119.967631","-8","1"
+"96157","South Lake Tahoe","CA","38.934409","-119.976707","-8","1"
+"96158","South Lake Tahoe","CA","38.898142","-119.998419","-8","1"
+"96160","Truckee","CA","39.3781","-120.186383","-8","1"
+"96161","Truckee","CA","39.339574","-120.22805","-8","1"
+"96162","Truckee","CA","39.26599","-120.64145","-8","1"
+"96163","Truckee","CA","39.320012","-120.160271","-8","1"
+"96222","Cottonwood","CA","40.385673","-122.279739","-8","1"
+"96371","Kawela Bay","HI","21.703","-157.996233","-10","0"
+"96373","Hawaiian Ocean View","HI","19.112099","-155.798594","-10","0"
+"96385","Volcano","HI","19.44707","-155.243925","-10","0"
+"96477","Kaneohe","HI","21.41345","-157.80575","-10","0"
+"96701","Aiea","HI","21.389167","-157.93091","-10","0"
+"96703","Anahola","HI","22.148133","-159.31765","-10","0"
+"96704","Captain Cook","HI","19.307543","-155.88338","-10","0"
+"96705","Eleele","HI","21.910767","-159.58222","-10","0"
+"96706","Ewa Beach","HI","21.338055","-158.02499","-10","0"
+"96707","Kapolei","HI","21.345535","-158.08587","-10","0"
+"96708","Haiku","HI","20.899634","-156.27315","-10","0"
+"96709","Kapolei","HI","23.573339","-164.701172","-10","0"
+"96710","Hakalau","HI","19.857045","-155.15249","-10","0"
+"96712","Haleiwa","HI","21.630633","-158.07448","-10","0"
+"96713","Hana","HI","20.739217","-156.03893","-10","0"
+"96714","Hanalei","HI","22.208401","-159.4896","-10","0"
+"96715","Hanamaulu","HI","21.979991","-159.512392","-10","0"
+"96716","Hanapepe","HI","21.917153","-159.59407","-10","0"
+"96717","Hauula","HI","21.60625","-157.90949","-10","0"
+"96718","Hawaii National Park","HI","19.435739","-155.26648","-10","0"
+"96719","Hawi","HI","20.241109","-155.84459","-10","0"
+"96720","Hilo","HI","19.713562","-155.09842","-10","0"
+"96721","Hilo","HI","19.593456","-155.438015","-10","0"
+"96722","Princeville","HI","22.223635","-159.49025","-10","0"
+"96725","Holualoa","HI","19.410727","-155.7478","-10","0"
+"96726","Honaunau","HI","19.278298","-155.845329","-10","0"
+"96727","Honokaa","HI","20.089087","-155.51679","-10","0"
+"96728","Honomu","HI","19.866007","-155.12172","-10","0"
+"96729","Hoolehua","HI","21.168775","-157.08588","-10","0"
+"96730","Kaaawa","HI","21.554467","-157.85108","-10","0"
+"96731","Kahuku","HI","21.68762","-157.95903","-10","0"
+"96732","Kahului","HI","20.883951","-156.46579","-10","0"
+"96733","Kahului","HI","20.866638","-156.646667","-10","0"
+"96734","Kailua","HI","21.3949","-157.74529","-10","0"
+"96737","Ocean View","HI","19.101978","-155.76114","-10","0"
+"96738","Waikoloa","HI","19.947774","-155.78634","-10","0"
+"96739","Keauhou","HI","19.593456","-155.438015","-10","0"
+"96740","Kailua Kona","HI","19.675386","-155.97588","-10","0"
+"96741","Kalaheo","HI","21.999721","-159.4776","-10","0"
+"96742","Kalaupapa","HI","21.191665","-156.9818","-10","0"
+"96743","Kamuela","HI","20.040191","-155.69999","-10","0"
+"96744","Kaneohe","HI","21.501854","-157.87926","-10","0"
+"96745","Kailua Kona","HI","19.593456","-155.438015","-10","0"
+"96746","Kapaa","HI","22.077472","-159.34463","-10","0"
+"96747","Kaumakani","HI","21.920292","-159.62428","-10","0"
+"96748","Kaunakakai","HI","21.111246","-156.9741","-10","0"
+"96749","Keaau","HI","19.625495","-155.01121","-10","0"
+"96750","Kealakekua","HI","19.526845","-155.9215","-10","0"
+"96751","Kealia","HI","22.111837","-159.31283","-10","0"
+"96752","Kekaha","HI","21.97313","-159.71766","-10","0"
+"96753","Kihei","HI","20.771418","-156.45769","-10","0"
+"96754","Kilauea","HI","22.212733","-159.40787","-10","0"
+"96755","Kapaau","HI","20.222668","-155.78664","-10","0"
+"96756","Koloa","HI","21.910013","-159.48044","-10","0"
+"96757","Kualapuu","HI","21.156174","-157.03622","-10","0"
+"96759","Kunia","HI","21.4603","-158.06446","-10","0"
+"96760","Kurtistown","HI","19.5604","-155.05686","-10","0"
+"96761","Lahaina","HI","20.913335","-156.65765","-10","0"
+"96762","Laie","HI","21.6485","-157.92556","-10","0"
+"96763","Lanai City","HI","20.823607","-156.9274","-10","0"
+"96764","Laupahoehoe","HI","19.983584","-155.25963","-10","0"
+"96765","Lawai","HI","21.930922","-159.499342","-10","0"
+"96766","Lihue","HI","21.98081","-159.37746","-10","0"
+"96767","Lahaina","HI","20.866638","-156.646667","-10","0"
+"96768","Makawao","HI","20.865115","-156.33158","-10","0"
+"96769","Makaweli","HI","21.946244","-159.65981","-10","0"
+"96770","Maunaloa","HI","21.15058","-157.1977","-10","0"
+"96771","Mountain View","HI","19.516132","-155.11305","-10","0"
+"96772","Naalehu","HI","19.110687","-155.58738","-10","0"
+"96773","Ninole","HI","19.942301","-155.18112","-10","0"
+"96774","Ookala","HI","19.996769","-155.31153","-10","0"
+"96775","Paauhau","HI","19.593456","-155.438015","-10","0"
+"96776","Paauilo","HI","20.022513","-155.37514","-10","0"
+"96777","Pahala","HI","19.226749","-155.49217","-10","0"
+"96778","Pahoa","HI","19.494625","-154.9266","-10","0"
+"96779","Paia","HI","20.906999","-156.38202","-10","0"
+"96780","Papaaloa","HI","19.946758","-155.2086","-10","0"
+"96781","Papaikou","HI","19.800318","-155.10649","-10","0"
+"96782","Pearl City","HI","21.408333","-157.9669","-10","0"
+"96783","Pepeekeo","HI","19.843259","-155.10548","-10","0"
+"96784","Puunene","HI","20.866638","-156.646667","-10","0"
+"96785","Volcano","HI","19.447717","-155.21012","-10","0"
+"96786","Wahiawa","HI","21.501722","-158.03543","-10","0"
+"96788","Pukalani","HI","20.855864","-156.325923","-10","0"
+"96789","Mililani","HI","21.459206","-158.0116","-10","0"
+"96790","Kula","HI","20.724391","-156.34031","-10","0"
+"96791","Waialua","HI","21.572131","-158.13489","-10","0"
+"96792","Waianae","HI","21.434246","-158.17092","-10","0"
+"96793","Wailuku","HI","20.889294","-156.50497","-10","0"
+"96795","Waimanalo","HI","21.33743","-157.70599","-10","0"
+"96796","Waimea","HI","21.997746","-159.7187","-10","0"
+"96797","Waipahu","HI","21.403487","-158.01389","-10","0"
+"96799","Pago Pago","AS","-7.209975","-170.7716","-10","0"
+"96801","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96802","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96803","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96804","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96805","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96806","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96807","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96808","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96809","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96810","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96811","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96812","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96813","Honolulu","HI","21.313033","-157.85615","-10","0"
+"96814","Honolulu","HI","21.300167","-157.84777","-10","0"
+"96815","Honolulu","HI","21.2782","-157.82199","-10","0"
+"96816","Honolulu","HI","21.284","-157.79925","-10","0"
+"96817","Honolulu","HI","21.3307","-157.85913","-10","0"
+"96818","Honolulu","HI","21.36425","-157.96316","-10","0"
+"96819","Honolulu","HI","21.3452","-157.88165","-10","0"
+"96820","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96821","Honolulu","HI","21.287967","-157.75456","-10","0"
+"96822","Honolulu","HI","21.31275","-157.82195","-10","0"
+"96823","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96824","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96825","Honolulu","HI","21.2946","-157.69721","-10","0"
+"96826","Honolulu","HI","21.2951","-157.83066","-10","0"
+"96827","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96828","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96830","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96835","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96836","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96837","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96838","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96839","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96840","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96841","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96842","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96843","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96844","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96845","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96846","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96847","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96848","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96849","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96850","Honolulu","HI","24.859832","-168.021815","-10","0"
+"96853","Hickam AFB","HI","24.859832","-168.021815","-10","0"
+"96854","Wheeler Army Airfield","HI","24.859832","-168.021815","-10","0"
+"96857","Schofield Barracks","HI","24.859832","-168.021815","-10","0"
+"96858","Fort Shafter","HI","24.859832","-168.021815","-10","0"
+"96859","Tripler Army Medical Ctr","HI","24.859832","-168.021815","-10","0"
+"96860","Pearl Harbor","HI","24.859832","-168.021815","-10","0"
+"96861","Camp H M Smith","HI","24.859832","-168.021815","-10","0"
+"96862","Barbers Point N A S","HI","21.3017","-158.08174","-10","0"
+"96863","M C B H Kaneohe Bay","HI","21.439867","-157.74772","-10","0"
+"96885","Volcano","HI","19.433152","-155.238743","-10","0"
+"96898","Wake Island","HI","24.859832","-168.021815","-10","0"
+"97001","Antelope","OR","44.904051","-120.67244","-8","1"
+"97002","Aurora","OR","45.234609","-122.79749","-8","1"
+"97004","Beavercreek","OR","45.255392","-122.4749","-8","1"
+"97005","Beaverton","OR","45.49106","-122.80359","-8","1"
+"97006","Beaverton","OR","45.517695","-122.85826","-8","1"
+"97007","Beaverton","OR","45.469079","-122.85602","-8","1"
+"97008","Beaverton","OR","45.46059","-122.80683","-8","1"
+"97009","Boring","OR","45.428663","-122.3809","-8","1"
+"97010","Bridal Veil","OR","45.582981","-122.101103","-8","1"
+"97011","Brightwood","OR","45.371086","-122.01227","-8","1"
+"97013","Canby","OR","45.247004","-122.68208","-8","1"
+"97014","Cascade Locks","OR","45.655523","-121.89435","-8","1"
+"97015","Clackamas","OR","45.416785","-122.52859","-8","1"
+"97016","Clatskanie","OR","46.078338","-123.26993","-8","1"
+"97017","Colton","OR","45.181819","-122.39802","-8","1"
+"97018","Columbia City","OR","45.891952","-122.8132","-8","1"
+"97019","Corbett","OR","45.514515","-122.23283","-8","1"
+"97020","Donald","OR","45.224154","-122.83989","-8","1"
+"97021","Dufur","OR","45.430024","-121.17922","-8","1"
+"97022","Eagle Creek","OR","45.349244","-122.33554","-8","1"
+"97023","Estacada","OR","45.267354","-122.28464","-8","1"
+"97024","Fairview","OR","45.542239","-122.44553","-8","1"
+"97026","Gervais","OR","45.10649","-122.90363","-8","1"
+"97027","Gladstone","OR","45.385642","-122.59272","-8","1"
+"97028","Government Camp","OR","45.305113","-121.78441","-8","1"
+"97029","Grass Valley","OR","45.335199","-120.7798","-8","1"
+"97030","Gresham","OR","45.507752","-122.4323","-8","1"
+"97031","Hood River","OR","45.673147","-121.5368","-8","1"
+"97032","Hubbard","OR","45.183167","-122.80193","-8","1"
+"97033","Kent","OR","45.195235","-120.59745","-8","1"
+"97034","Lake Oswego","OR","45.40765","-122.6811","-8","1"
+"97035","Lake Oswego","OR","45.41387","-122.72492","-8","1"
+"97036","Marylhurst","OR","45.173284","-122.259861","-8","1"
+"97037","Maupin","OR","45.093643","-121.10814","-8","1"
+"97038","Molalla","OR","45.10799","-122.56555","-8","1"
+"97039","Moro","OR","45.479419","-120.75969","-8","1"
+"97040","Mosier","OR","45.636848","-121.40926","-8","1"
+"97041","Mount Hood Parkdale","OR","45.503224","-121.59252","-8","1"
+"97042","Mulino","OR","45.21307","-122.54321","-8","1"
+"97044","Odell","OR","45.643738","-121.536658","-8","1"
+"97045","Oregon City","OR","45.344246","-122.58464","-8","1"
+"97048","Rainier","OR","46.054948","-122.95714","-8","1"
+"97049","Rhododendron","OR","45.369468","-121.92558","-8","1"
+"97050","Rufus","OR","45.693219","-120.73221","-8","1"
+"97051","Saint Helens","OR","45.862489","-122.84824","-8","1"
+"97053","Warren","OR","45.821358","-122.86404","-8","1"
+"97054","Deer Island","OR","45.946314","-122.90416","-8","1"
+"97055","Sandy","OR","45.375143","-122.21021","-8","1"
+"97056","Scappoose","OR","45.778892","-122.92065","-8","1"
+"97057","Shaniko","OR","45.263301","-121.088513","-8","1"
+"97058","The Dalles","OR","45.594257","-121.18944","-8","1"
+"97060","Troutdale","OR","45.529551","-122.39156","-8","1"
+"97062","Tualatin","OR","45.373991","-122.77127","-8","1"
+"97063","Tygh Valley","OR","45.262423","-121.23304","-8","1"
+"97064","Vernonia","OR","45.862577","-123.206","-8","1"
+"97065","Wasco","OR","45.585405","-120.69234","-8","1"
+"97067","Welches","OR","45.333824","-121.95765","-8","1"
+"97068","West Linn","OR","45.361991","-122.64443","-8","1"
+"97070","Wilsonville","OR","45.308105","-122.77266","-8","1"
+"97071","Woodburn","OR","45.144415","-122.84521","-8","1"
+"97075","Beaverton","OR","45.548616","-123.114725","-8","1"
+"97076","Beaverton","OR","45.548616","-123.114725","-8","1"
+"97077","Beaverton","OR","45.548616","-123.114725","-8","1"
+"97078","Beaverton","OR","45.451976","-122.789257","-8","1"
+"97080","Gresham","OR","45.481342","-122.40856","-8","1"
+"97101","Amity","OR","45.100504","-123.22834","-8","1"
+"97102","Arch Cape","OR","45.819042","-123.95827","-8","1"
+"97103","Astoria","OR","46.155007","-123.7417","-8","1"
+"97104","Hillsboro","OR","45.546914","-122.928208","-8","1"
+"97106","Banks","OR","45.644591","-123.12811","-8","1"
+"97107","Bay City","OR","45.534203","-123.88468","-8","1"
+"97108","Beaver","OR","45.284763","-123.6908","-8","1"
+"97109","Buxton","OR","45.729085","-123.20234","-8","1"
+"97110","Cannon Beach","OR","45.894287","-123.961","-8","1"
+"97111","Carlton","OR","45.287751","-123.19334","-8","1"
+"97112","Cloverdale","OR","45.257176","-123.89141","-8","1"
+"97113","Cornelius","OR","45.515181","-123.05089","-8","1"
+"97114","Dayton","OR","45.211339","-123.08114","-8","1"
+"97115","Dundee","OR","45.272559","-123.01631","-8","1"
+"97116","Forest Grove","OR","45.541009","-123.13043","-8","1"
+"97117","Gales Creek","OR","45.622824","-123.25977","-8","1"
+"97118","Garibaldi","OR","45.561139","-123.91004","-8","1"
+"97119","Gaston","OR","45.43957","-123.17165","-8","1"
+"97121","Hammond","OR","46.187903","-123.96437","-8","1"
+"97122","Hebo","OR","45.187837","-123.82026","-8","1"
+"97123","Hillsboro","OR","45.491024","-122.95745","-8","1"
+"97124","Hillsboro","OR","45.545841","-122.94605","-8","1"
+"97125","Manning","OR","45.662196","-123.22518","-8","1"
+"97127","Lafayette","OR","45.2455","-123.11304","-8","1"
+"97128","Mcminnville","OR","45.210104","-123.20747","-8","1"
+"97130","Manzanita","OR","45.720836","-123.93471","-8","1"
+"97131","Nehalem","OR","45.715015","-123.88233","-8","1"
+"97132","Newberg","OR","45.310304","-122.972","-8","1"
+"97133","North Plains","OR","45.65749","-123.0242","-8","1"
+"97134","Oceanside","OR","45.461852","-123.96804","-8","1"
+"97135","Pacific City","OR","45.201302","-123.95999","-8","1"
+"97136","Rockaway Beach","OR","45.620062","-123.93449","-8","1"
+"97137","Saint Paul","OR","45.215261","-122.97186","-8","1"
+"97138","Seaside","OR","45.926112","-123.81524","-8","1"
+"97140","Sherwood","OR","45.352086","-122.85376","-8","1"
+"97141","Tillamook","OR","45.459109","-123.80389","-8","1"
+"97143","Netarts","OR","45.438112","-123.9483","-8","1"
+"97144","Timber","OR","45.744404","-123.3235","-8","1"
+"97145","Tolovana Park","OR","45.868839","-123.95909","-8","1"
+"97146","Warrenton","OR","46.136322","-123.91753","-8","1"
+"97147","Wheeler","OR","45.688054","-123.8842","-8","1"
+"97148","Yamhill","OR","45.352399","-123.22502","-8","1"
+"97149","Neskowin","OR","45.101518","-123.9737","-8","1"
+"97180","Sherwood","OR","45.354615","-122.850808","-8","1"
+"97201","Portland","OR","45.49894","-122.68781","-8","1"
+"97202","Portland","OR","45.481791","-122.64055","-8","1"
+"97203","Portland","OR","45.589689","-122.73875","-8","1"
+"97204","Portland","OR","45.51854","-122.6755","-8","1"
+"97205","Portland","OR","45.52054","-122.68573","-8","1"
+"97206","Portland","OR","45.482341","-122.60007","-8","1"
+"97207","Portland","OR","45.480324","-122.711117","-8","1"
+"97208","Portland","OR","45.532165","-122.564824","-8","1"
+"97209","Portland","OR","45.52889","-122.68458","-8","1"
+"97210","Portland","OR","45.534839","-122.7095","-8","1"
+"97211","Portland","OR","45.56544","-122.64635","-8","1"
+"97212","Portland","OR","45.54424","-122.64353","-8","1"
+"97213","Portland","OR","45.53704","-122.59979","-8","1"
+"97214","Portland","OR","45.51379","-122.6458","-8","1"
+"97215","Portland","OR","45.514241","-122.60089","-8","1"
+"97216","Portland","OR","45.515674","-122.56087","-8","1"
+"97217","Portland","OR","45.574439","-122.68665","-8","1"
+"97218","Portland","OR","45.56099","-122.59987","-8","1"
+"97219","Portland","OR","45.45867","-122.70611","-8","1"
+"97220","Portland","OR","45.546205","-122.56027","-8","1"
+"97221","Portland","OR","45.49759","-122.72945","-8","1"
+"97222","Portland","OR","45.442634","-122.61833","-8","1"
+"97223","Portland","OR","45.43884","-122.78224","-8","1"
+"97224","Portland","OR","45.406292","-122.78441","-8","1"
+"97225","Portland","OR","45.497856","-122.76988","-8","1"
+"97226","Raleigh Hills","OR","45.484854","-122.625257","-8","1"
+"97227","Portland","OR","45.543831","-122.67497","-8","1"
+"97228","Portland","OR","45.580557","-122.374776","-8","1"
+"97229","Portland","OR","45.540967","-122.81728","-8","1"
+"97230","Portland","OR","45.539473","-122.50488","-8","1"
+"97231","Portland","OR","45.651279","-122.82465","-8","1"
+"97232","Portland","OR","45.52874","-122.6446","-8","1"
+"97233","Portland","OR","45.513242","-122.49985","-8","1"
+"97236","Portland","OR","45.474722","-122.50997","-8","1"
+"97238","Portland","OR","45.580557","-122.374776","-8","1"
+"97239","Portland","OR","45.488031","-122.693796","-8","1"
+"97240","Portland","OR","45.580557","-122.374776","-8","1"
+"97242","Portland","OR","45.580557","-122.374776","-8","1"
+"97251","Portland","OR","45.580557","-122.374776","-8","1"
+"97253","Portland","OR","45.580557","-122.374776","-8","1"
+"97254","Portland","OR","45.596678","-122.59418","-8","1"
+"97255","Portland","OR","45.580557","-122.374776","-8","1"
+"97256","Portland","OR","45.580557","-122.374776","-8","1"
+"97257","Grants Pass","OR","42.421567","-123.33749","-8","1"
+"97258","Portland","OR","45.580557","-122.374776","-8","1"
+"97259","Portland","OR","45.580557","-122.374776","-8","1"
+"97264","Chiloquin","OR","42.577154","-121.860525","-8","1"
+"97266","Portland","OR","45.478641","-122.56233","-8","1"
+"97267","Portland","OR","45.408882","-122.61476","-8","1"
+"97268","Portland","OR","45.173284","-122.259861","-8","1"
+"97269","Portland","OR","45.173284","-122.259861","-8","1"
+"97271","Portland","OR","45.580557","-122.374776","-8","1"
+"97272","Portland","OR","45.580557","-122.374776","-8","1"
+"97280","Portland","OR","45.580557","-122.374776","-8","1"
+"97281","Portland","OR","45.548616","-123.114725","-8","1"
+"97282","Portland","OR","45.580557","-122.374776","-8","1"
+"97283","Portland","OR","45.580557","-122.374776","-8","1"
+"97286","Portland","OR","45.580557","-122.374776","-8","1"
+"97290","Portland","OR","45.580557","-122.374776","-8","1"
+"97291","Portland","OR","45.548616","-123.114725","-8","1"
+"97292","Portland","OR","45.580557","-122.374776","-8","1"
+"97293","Portland","OR","45.580557","-122.374776","-8","1"
+"97294","Portland","OR","45.580557","-122.374776","-8","1"
+"97296","Portland","OR","45.580557","-122.374776","-8","1"
+"97298","Portland","OR","45.548616","-123.114725","-8","1"
+"97299","Portland","OR","45.580557","-122.374776","-8","1"
+"97301","Salem","OR","44.926644","-122.98694","-8","1"
+"97302","Salem","OR","44.906492","-123.05129","-8","1"
+"97303","Salem","OR","44.984008","-123.01992","-8","1"
+"97304","Salem","OR","44.970181","-123.08033","-8","1"
+"97305","Salem","OR","44.995029","-122.95801","-8","1"
+"97306","Salem","OR","44.858446","-123.05368","-8","1"
+"97307","Keizer","OR","44.984465","-122.457024","-8","1"
+"97308","Salem","OR","44.984465","-122.457024","-8","1"
+"97309","Salem","OR","44.984465","-122.457024","-8","1"
+"97310","Salem","OR","44.927141","-122.986105","-8","1"
+"97311","Salem","OR","44.943841","-123.028607","-8","1"
+"97312","Salem","OR","44.936357","-123.038116","-8","1"
+"97313","Salem","OR","44.984941","-122.998756","-8","1"
+"97314","Salem","OR","44.965541","-123.006606","-8","1"
+"97321","Albany","OR","44.635395","-123.0896","-8","1"
+"97322","Albany","OR","44.62205","-123.061329","-8","1"
+"97324","Alsea","OR","44.369264","-123.62349","-8","1"
+"97325","Aumsville","OR","44.838001","-122.8593","-8","1"
+"97326","Blodgett","OR","44.637701","-123.62496","-8","1"
+"97327","Brownsville","OR","44.390881","-122.97168","-8","1"
+"97329","Cascadia","OR","44.400432","-122.35469","-8","1"
+"97330","Corvallis","OR","44.608694","-123.2752","-8","1"
+"97331","Corvallis","OR","44.565648","-123.27906","-8","1"
+"97333","Corvallis","OR","44.52789","-123.2791","-8","1"
+"97335","Crabtree","OR","44.634439","-122.893292","-8","1"
+"97336","Crawfordsville","OR","44.359301","-122.850752","-8","1"
+"97338","Dallas","OR","44.920815","-123.33432","-8","1"
+"97339","Corvallis","OR","44.49893","-123.445033","-8","1"
+"97341","Depoe Bay","OR","44.821446","-124.05729","-8","1"
+"97342","Detroit","OR","44.727388","-122.08703","-8","1"
+"97343","Eddyville","OR","44.643659","-123.76213","-8","1"
+"97344","Falls City","OR","44.865209","-123.44807","-8","1"
+"97345","Foster","OR","44.407794","-122.60034","-8","1"
+"97346","Gates","OR","44.754247","-122.39736","-8","1"
+"97347","Grand Ronde","OR","45.060436","-123.66311","-8","1"
+"97348","Halsey","OR","44.381732","-123.12153","-8","1"
+"97350","Idanha","OR","44.696507","-122.07246","-8","1"
+"97351","Independence","OR","44.849012","-123.18673","-8","1"
+"97352","Jefferson","OR","44.736025","-123.02553","-8","1"
+"97355","Lebanon","OR","44.527304","-122.85512","-8","1"
+"97357","Logsden","OR","44.745464","-123.81722","-8","1"
+"97358","Lyons","OR","44.794701","-122.53703","-8","1"
+"97359","Marion","OR","44.984465","-122.457024","-8","1"
+"97360","Mill City","OR","44.75067","-122.47727","-8","1"
+"97361","Monmouth","OR","44.789252","-123.30325","-8","1"
+"97362","Mount Angel","OR","45.067719","-122.79115","-8","1"
+"97364","Neotsu","OR","44.997061","-123.98589","-8","1"
+"97365","Newport","OR","44.649252","-124.05039","-8","1"
+"97366","South Beach","OR","44.567998","-124.05401","-8","1"
+"97367","Lincoln City","OR","44.950573","-124.00655","-8","1"
+"97368","Otis","OR","45.009935","-123.91182","-8","1"
+"97369","Otter Rock","OR","44.758819","-124.06328","-8","1"
+"97370","Philomath","OR","44.578526","-123.43709","-8","1"
+"97371","Rickreall","OR","44.964115","-123.20681","-8","1"
+"97372","Rose Lodge","OR","44.659979","-123.892016","-8","1"
+"97373","Saint Benedict","OR","44.984465","-122.457024","-8","1"
+"97374","Scio","OR","44.702164","-122.81401","-8","1"
+"97375","Scotts Mills","OR","45.004218","-122.59658","-8","1"
+"97376","Seal Rock","OR","44.505655","-124.04512","-8","1"
+"97377","Shedd","OR","44.46448","-123.10916","-8","1"
+"97378","Sheridan","OR","45.089532","-123.40787","-8","1"
+"97380","Siletz","OR","44.738154","-123.91023","-8","1"
+"97381","Silverton","OR","45.003489","-122.78012","-8","1"
+"97383","Stayton","OR","44.798379","-122.7601","-8","1"
+"97384","Mehama","OR","44.790267","-122.618719","-8","1"
+"97385","Sublimity","OR","44.850245","-122.7645","-8","1"
+"97386","Sweet Home","OR","44.391863","-122.72856","-8","1"
+"97388","Gleneden Beach","OR","44.885","-123.994219","-8","1"
+"97389","Tangent","OR","44.538801","-123.09787","-8","1"
+"97390","Tidewater","OR","44.309872","-123.83344","-8","1"
+"97391","Toledo","OR","44.626888","-123.91515","-8","1"
+"97392","Turner","OR","44.807739","-122.9485","-8","1"
+"97394","Waldport","OR","44.424255","-124.04868","-8","1"
+"97396","Willamina","OR","45.140178","-123.49286","-8","1"
+"97401","Eugene","OR","44.06092","-123.08275","-8","1"
+"97402","Eugene","OR","44.062231","-123.16804","-8","1"
+"97403","Eugene","OR","44.03858","-123.05562","-8","1"
+"97404","Eugene","OR","44.101227","-123.13604","-8","1"
+"97405","Eugene","OR","44.004396","-123.12203","-8","1"
+"97406","Agness","OR","42.625928","-124.05435","-8","1"
+"97407","Allegany","OR","43.246918","-124.231068","-8","1"
+"97408","Eugene","OR","44.122004","-123.06447","-8","1"
+"97409","Alvadore","OR","44.127631","-123.266648","-8","1"
+"97410","Azalea","OR","42.790958","-123.14894","-8","1"
+"97411","Bandon","OR","43.113799","-124.39911","-8","1"
+"97412","Blachly","OR","44.196459","-123.53776","-8","1"
+"97413","Blue River","OR","44.178746","-122.14591","-8","1"
+"97414","Broadbent","OR","42.977978","-124.1716","-8","1"
+"97415","Brookings","OR","42.098285","-124.27265","-8","1"
+"97416","Camas Valley","OR","43.054446","-123.6864","-8","1"
+"97417","Canyonville","OR","42.934754","-123.25498","-8","1"
+"97419","Cheshire","OR","44.181193","-123.38603","-8","1"
+"97420","Coos Bay","OR","43.357357","-124.21086","-8","1"
+"97423","Coquille","OR","43.187219","-124.16396","-8","1"
+"97424","Cottage Grove","OR","43.77182","-123.05667","-8","1"
+"97425","Crescent Lake","OR","43.472276","-121.92768","-8","1"
+"97426","Creswell","OR","43.911542","-123.03036","-8","1"
+"97427","Culp Creek","OR","43.685176","-122.79827","-8","1"
+"97428","Curtin","OR","43.745797","-123.18191","-8","1"
+"97429","Days Creek","OR","42.971648","-123.06467","-8","1"
+"97430","Deadwood","OR","44.164325","-123.70193","-8","1"
+"97431","Dexter","OR","43.892577","-122.81992","-8","1"
+"97432","Dillard","OR","43.113502","-123.418068","-8","1"
+"97434","Dorena","OR","43.740859","-122.88828","-8","1"
+"97435","Drain","OR","43.703855","-123.35279","-8","1"
+"97436","Elkton","OR","43.647537","-123.58719","-8","1"
+"97437","Elmira","OR","44.099732","-123.38787","-8","1"
+"97438","Fall Creek","OR","43.958389","-122.75701","-8","1"
+"97439","Florence","OR","44.009099","-124.08307","-8","1"
+"97440","Eugene","OR","43.863845","-122.99879","-8","1"
+"97441","Gardiner","OR","43.760271","-124.12028","-8","1"
+"97442","Glendale","OR","42.771195","-123.38578","-8","1"
+"97443","Glide","OR","43.242312","-123.03325","-8","1"
+"97444","Gold Beach","OR","42.451203","-124.39036","-8","1"
+"97446","Harrisburg","OR","44.278808","-123.12026","-8","1"
+"97447","Idleyld Park","OR","43.333008","-122.78475","-8","1"
+"97448","Junction City","OR","44.204189","-123.2294","-8","1"
+"97449","Lakeside","OR","43.58119","-124.1557","-8","1"
+"97450","Langlois","OR","42.915024","-124.37576","-8","1"
+"97451","Lorane","OR","43.80135","-123.24938","-8","1"
+"97452","Lowell","OR","43.864671","-122.70932","-8","1"
+"97453","Mapleton","OR","44.018992","-123.87221","-8","1"
+"97454","Marcola","OR","44.227201","-122.8169","-8","1"
+"97455","Pleasant Hill","OR","43.960764","-122.91541","-8","1"
+"97456","Monroe","OR","44.333016","-123.36508","-8","1"
+"97457","Myrtle Creek","OR","43.042614","-123.2322","-8","1"
+"97458","Myrtle Point","OR","43.075356","-124.05682","-8","1"
+"97459","North Bend","OR","43.434529","-124.20994","-8","1"
+"97460","Norway","OR","43.138755","-124.127089","-8","1"
+"97461","Noti","OR","44.099562","-123.46265","-8","1"
+"97462","Oakland","OR","43.443648","-123.36727","-8","1"
+"97463","Oakridge","OR","43.747181","-122.44717","-8","1"
+"97464","Ophir","OR","42.739889","-124.51056","-8","1"
+"97465","Port Orford","OR","42.746529","-124.47596","-8","1"
+"97466","Powers","OR","42.873137","-124.07835","-8","1"
+"97467","Reedsport","OR","43.68516","-124.00262","-8","1"
+"97468","Remote","OR","43.138755","-124.127089","-8","1"
+"97469","Riddle","OR","42.935498","-123.39902","-8","1"
+"97470","Roseburg","OR","43.227287","-123.35138","-8","1"
+"97472","Saginaw","OR","43.863845","-122.99879","-8","1"
+"97473","Scottsburg","OR","43.669352","-123.8141","-8","1"
+"97476","Sixes","OR","42.813437","-124.35756","-8","1"
+"97477","Springfield","OR","44.061057","-123.01769","-8","1"
+"97478","Springfield","OR","44.070824","-122.90709","-8","1"
+"97479","Sutherlin","OR","43.397697","-123.27314","-8","1"
+"97480","Swisshome","OR","44.127179","-123.83519","-8","1"
+"97481","Tenmile","OR","43.098515","-123.55647","-8","1"
+"97482","Thurston","OR","43.863845","-122.99879","-8","1"
+"97484","Tiller","OR","42.879291","-122.89532","-8","1"
+"97486","Umpqua","OR","43.38382","-123.53031","-8","1"
+"97487","Veneta","OR","44.023225","-123.38399","-8","1"
+"97488","Vida","OR","44.112618","-122.42255","-8","1"
+"97489","Walterville","OR","44.131706","-122.6367","-8","1"
+"97490","Walton","OR","44.004968","-123.63206","-8","1"
+"97491","Wedderburn","OR","42.609252","-124.388576","-8","1"
+"97492","Westfir","OR","43.756923","-122.51777","-8","1"
+"97493","Westlake","OR","43.905878","-124.03929","-8","1"
+"97494","Wilbur","OR","43.32843","-123.333177","-8","1"
+"97495","Winchester","OR","43.333141","-123.325617","-8","1"
+"97496","Winston","OR","43.094626","-123.43658","-8","1"
+"97497","Wolf Creek","OR","42.676455","-123.324","-8","1"
+"97498","Yachats","OR","44.326381","-124.0557","-8","1"
+"97499","Yoncalla","OR","43.593788","-123.26602","-8","1"
+"97501","Medford","OR","42.313498","-122.87944","-8","1"
+"97502","Central Point","OR","42.387399","-122.92154","-8","1"
+"97503","White City","OR","42.471919","-122.87201","-8","1"
+"97504","Medford","OR","42.334496","-122.83547","-8","1"
+"97520","Ashland","OR","42.169751","-122.61772","-8","1"
+"97522","Butte Falls","OR","42.530663","-122.54822","-8","1"
+"97523","Cave Junction","OR","42.139958","-123.60245","-8","1"
+"97524","Eagle Point","OR","42.484283","-122.74031","-8","1"
+"97525","Gold Hill","OR","42.432422","-123.08639","-8","1"
+"97526","Grants Pass","OR","42.4631","-123.33162","-8","1"
+"97527","Grants Pass","OR","42.405162","-123.3624","-8","1"
+"97528","Grants Pass","OR","42.396421","-123.535027","-8","1"
+"97530","Jacksonville","OR","42.224913","-123.04526","-8","1"
+"97531","Kerby","OR","42.208018","-123.65551","-8","1"
+"97532","Merlin","OR","42.542134","-123.5078","-8","1"
+"97533","Murphy","OR","42.308007","-123.327323","-8","1"
+"97534","O Brien","OR","42.055397","-123.7031","-8","1"
+"97535","Phoenix","OR","42.270808","-122.81805","-8","1"
+"97536","Prospect","OR","42.780226","-122.51485","-8","1"
+"97537","Rogue River","OR","42.528269","-123.1515","-8","1"
+"97538","Selma","OR","42.259678","-123.54778","-8","1"
+"97539","Shady Cove","OR","42.612422","-122.81342","-8","1"
+"97540","Talent","OR","42.227162","-122.78933","-8","1"
+"97541","Trail","OR","42.713888","-122.7541","-8","1"
+"97543","Wilderville","OR","42.365473","-123.50865","-8","1"
+"97544","Williams","OR","42.155392","-123.2978","-8","1"
+"97567","Lincoln City","OR","44.996054","-123.997304","-8","1"
+"97587","Lostine","OR","45.487784","-117.430085","-8","1"
+"97601","Klamath Falls","OR","42.282428","-121.88447","-8","1"
+"97602","Klamath Falls","OR","42.804981","-121.584833","-8","1"
+"97603","Klamath Falls","OR","42.169323","-121.70298","-8","1"
+"97604","Crater Lake","OR","43.023645","-122.27443","-8","1"
+"97620","Adel","OR","42.227477","-119.88141","-8","1"
+"97621","Beatty","OR","42.476579","-121.23055","-8","1"
+"97622","Bly","OR","42.334534","-120.97637","-8","1"
+"97623","Bonanza","OR","42.202475","-121.33346","-8","1"
+"97624","Chiloquin","OR","42.606472","-121.81297","-8","1"
+"97625","Dairy","OR","42.330162","-121.55984","-8","1"
+"97626","Fort Klamath","OR","42.686498","-122.04524","-8","1"
+"97627","Keno","OR","42.086887","-121.98101","-8","1"
+"97630","Lakeview","OR","42.199446","-120.42459","-8","1"
+"97631","Monmouth","OR","44.855049","-123.237656","-8","1"
+"97632","Malin","OR","42.026248","-121.41706","-8","1"
+"97633","Merrill","OR","42.025618","-121.58306","-8","1"
+"97634","Midland","OR","42.129926","-121.81778","-8","1"
+"97635","New Pine Creek","CA","41.924974","-120.28989","-8","1"
+"97636","Paisley","OR","42.693563","-120.55234","-8","1"
+"97637","Plush","OR","42.543512","-119.86512","-8","1"
+"97638","Silver Lake","OR","43.189402","-121.00466","-8","1"
+"97639","Sprague River","OR","42.440695","-121.43464","-8","1"
+"97640","Summer Lake","OR","42.961806","-120.77072","-8","1"
+"97641","Christmas Valley","OR","43.256842","-120.65084","-8","1"
+"97701","Bend","OR","44.091256","-121.29769","-8","1"
+"97702","Bend","OR","44.020483","-121.30891","-8","1"
+"97707","Bend","OR","43.84783","-121.46569","-8","1"
+"97708","Bend","OR","44.001834","-120.94952","-8","1"
+"97709","Bend","OR","44.001834","-120.94952","-8","1"
+"97710","Fields","OR","42.130152","-118.5582","-8","1"
+"97711","Ashwood","OR","44.738812","-120.75257","-8","1"
+"97712","Brothers","OR","43.785416","-120.51518","-8","1"
+"97720","Burns","OR","43.600795","-118.96382","-8","1"
+"97721","Princeton","OR","43.036496","-118.61882","-8","1"
+"97722","Diamond","OR","42.965788","-118.68196","-8","1"
+"97730","Camp Sherman","OR","44.46723","-121.64724","-8","1"
+"97731","Chemult","OR","43.189824","-121.88616","-8","1"
+"97732","Crane","OR","43.40878","-118.45927","-8","1"
+"97733","Crescent","OR","43.437958","-121.73063","-8","1"
+"97734","Culver","OR","44.498302","-121.21084","-8","1"
+"97735","Fort Rock","OR","43.331581","-121.01016","-8","1"
+"97736","Frenchglen","OR","42.727146","-119.05385","-8","1"
+"97737","Gilchrist","OR","43.521016","-121.65255","-8","1"
+"97738","Hines","OR","43.471016","-119.21005","-8","1"
+"97739","La Pine","OR","43.692251","-121.53865","-8","1"
+"97740","Lawen","OR","43.019785","-119.069624","-8","1"
+"97741","Madras","OR","44.64079","-121.12506","-8","1"
+"97750","Mitchell","OR","44.611941","-120.11346","-8","1"
+"97751","Paulina","OR","44.113537","-119.79377","-8","1"
+"97752","Post","OR","44.119652","-120.30118","-8","1"
+"97753","Powell Butte","OR","44.229401","-121.03751","-8","1"
+"97754","Prineville","OR","44.238306","-120.75682","-8","1"
+"97756","Redmond","OR","44.272796","-121.19173","-8","1"
+"97758","Riley","OR","43.547855","-119.54235","-8","1"
+"97759","Sisters","OR","44.322689","-121.54897","-8","1"
+"97760","Terrebonne","OR","44.384155","-121.20181","-8","1"
+"97761","Warm Springs","OR","44.814466","-121.32302","-8","1"
+"97795","Roseburg North","OR","43.276877","-123.348568","-8","1"
+"97801","Pendleton","OR","45.665146","-118.789","-8","1"
+"97810","Adams","OR","45.719133","-118.46578","-8","1"
+"97812","Arlington","OR","45.57852","-120.17301","-8","1"
+"97813","Athena","OR","45.81667","-118.4966","-8","1"
+"97814","Baker City","OR","44.796517","-117.82092","-8","1"
+"97817","Bates","OR","44.705882","-118.79339","-8","1"
+"97818","Boardman","OR","45.816575","-119.76236","-8","1"
+"97819","Bridgeport","OR","44.489628","-117.73478","-8","1"
+"97820","Canyon City","OR","44.335525","-118.95076","-8","1"
+"97821","Cayuse","OR","45.683276","-118.45808","-8","1"
+"97823","Condon","OR","45.232817","-120.17139","-8","1"
+"97824","Cove","OR","45.331655","-117.83718","-8","1"
+"97825","Dayville","OR","44.474491","-119.54241","-8","1"
+"97826","Echo","OR","45.720228","-119.22894","-8","1"
+"97827","Elgin","OR","45.564451","-117.88306","-8","1"
+"97828","Enterprise","OR","45.547098","-117.26823","-8","1"
+"97830","Fossil","OR","44.978549","-120.14934","-8","1"
+"97831","Fox","OR","44.477794","-118.947769","-8","1"
+"97833","Haines","OR","44.930122","-117.98289","-8","1"
+"97834","Halfway","OR","44.919974","-117.13838","-8","1"
+"97835","Helix","OR","45.866696","-118.74565","-8","1"
+"97836","Heppner","OR","45.343509","-119.53938","-8","1"
+"97837","Hereford","OR","44.499533","-118.06076","-8","1"
+"97838","Hermiston","OR","45.846442","-119.28423","-8","1"
+"97839","Lexington","OR","45.512792","-119.64344","-8","1"
+"97840","Oxbow","OR","44.973266","-116.8565","-8","1"
+"97841","Imbler","OR","45.463939","-117.9624","-8","1"
+"97842","Imnaha","OR","45.479993","-116.79861","-8","1"
+"97843","Ione","OR","45.493783","-119.87071","-8","1"
+"97844","Irrigon","OR","45.886463","-119.51737","-8","1"
+"97845","John Day","OR","44.408646","-118.95122","-8","1"
+"97846","Joseph","OR","45.336407","-117.17791","-8","1"
+"97848","Kimberly","OR","44.675475","-119.57602","-8","1"
+"97850","La Grande","OR","45.32627","-118.08197","-8","1"
+"97856","Long Creek","OR","44.743532","-119.11886","-8","1"
+"97857","Lostine","OR","45.464512","-117.44227","-8","1"
+"97859","Meacham","OR","45.529778","-118.43996","-8","1"
+"97861","Mikkalo","OR","45.438822","-120.206698","-8","1"
+"97862","Milton Freewater","OR","45.938511","-118.36952","-8","1"
+"97864","Monument","OR","44.811965","-119.41539","-8","1"
+"97865","Mount Vernon","OR","44.421744","-119.14737","-8","1"
+"97867","North Powder","OR","45.048141","-117.96742","-8","1"
+"97868","Pilot Rock","OR","45.402303","-118.76751","-8","1"
+"97869","Prairie City","OR","44.441241","-118.69325","-8","1"
+"97870","Richland","OR","44.798064","-117.2181","-8","1"
+"97872","Ritter","OR","44.947425","-119.14087","-8","1"
+"97873","Seneca","OR","44.138142","-118.9767","-8","1"
+"97874","Spray","OR","44.741727","-119.82803","-8","1"
+"97875","Stanfield","OR","45.786324","-119.21099","-8","1"
+"97876","Summerville","OR","45.52535","-118.01193","-8","1"
+"97877","Sumpter","OR","44.744446","-118.2229","-8","1"
+"97880","Ukiah","OR","45.085144","-118.944","-8","1"
+"97882","Umatilla","OR","45.915993","-119.33008","-8","1"
+"97883","Union","OR","45.201699","-117.83083","-8","1"
+"97884","Unity","OR","44.471344","-118.20623","-8","1"
+"97885","Wallowa","OR","45.568843","-117.52645","-8","1"
+"97886","Weston","OR","45.800879","-118.28859","-8","1"
+"97901","Adrian","OR","43.661247","-117.07192","-7","1"
+"97902","Arock","OR","42.915641","-117.497988","-7","1"
+"97903","Brogan","OR","44.187379","-117.62629","-7","1"
+"97904","Drewsey","OR","43.834833","-118.47434","-8","1"
+"97905","Durkee","OR","44.578393","-117.48787","-8","1"
+"97906","Harper","OR","43.875636","-117.57157","-7","1"
+"97907","Huntington","OR","44.410083","-117.30995","-8","1"
+"97908","Ironside","OR","44.30411","-117.9161","-7","1"
+"97909","Jamieson","OR","44.207973","-117.45677","-7","1"
+"97910","Jordan Valley","ID","42.749306","-116.8863","-7","1"
+"97911","Juntura","OR","43.722896","-118.07394","-7","1"
+"97913","Nyssa","ID","43.909576","-116.97103","-7","1"
+"97914","Ontario","OR","44.057074","-116.99148","-7","1"
+"97917","Riverside","OR","43.509919","-118.098586","-7","1"
+"97918","Vale","OR","44.029403","-117.33282","-7","1"
+"97920","Westfall","OR","44.032437","-117.7115","-7","1"
+"98001","Auburn","WA","47.303722","-122.26608","-8","1"
+"98002","Auburn","WA","47.304221","-122.21602","-8","1"
+"98003","Federal Way","WA","47.311072","-122.31188","-8","1"
+"98004","Bellevue","WA","47.618371","-122.20308","-8","1"
+"98005","Bellevue","WA","47.611021","-122.16858","-8","1"
+"98006","Bellevue","WA","47.562975","-122.1526","-8","1"
+"98007","Bellevue","WA","47.610935","-122.14104","-8","1"
+"98008","Bellevue","WA","47.609222","-122.1155","-8","1"
+"98009","Bellevue","WA","47.432251","-121.803388","-8","1"
+"98010","Black Diamond","WA","47.317802","-122.01479","-8","1"
+"98011","Bothell","WA","47.751471","-122.20257","-8","1"
+"98012","Bothell","WA","47.84311","-122.20457","-8","1"
+"98013","Burton","WA","47.432251","-121.803388","-8","1"
+"98014","Carnation","WA","47.648232","-121.91265","-8","1"
+"98015","Bellevue","WA","47.432251","-121.803388","-8","1"
+"98019","Duvall","WA","47.7353","-121.96222","-8","1"
+"98020","Edmonds","WA","47.803668","-122.37096","-8","1"
+"98021","Bothell","WA","47.790653","-122.22021","-8","1"
+"98022","Enumclaw","WA","47.193729","-121.91915","-8","1"
+"98023","Federal Way","WA","47.309021","-122.36178","-8","1"
+"98024","Fall City","WA","47.565642","-121.88638","-8","1"
+"98025","Hobart","WA","47.430704","-121.88496","-8","1"
+"98026","Edmonds","WA","47.821568","-122.33651","-8","1"
+"98027","Issaquah","WA","47.522828","-122.02921","-8","1"
+"98028","Kenmore","WA","47.75287","-122.24736","-8","1"
+"98029","Issaquah","WA","47.572401","-122.02065","-8","1"
+"98030","Kent","WA","47.369098","-122.192276","-8","1"
+"98031","Kent","WA","47.388461","-122.19644","-8","1"
+"98032","Kent","WA","47.388254","-122.25932","-8","1"
+"98033","Kirkland","WA","47.67903","-122.1934","-8","1"
+"98034","Kirkland","WA","47.71828","-122.19702","-8","1"
+"98035","Kent","WA","47.432251","-121.803388","-8","1"
+"98036","Lynnwood","WA","47.808816","-122.28394","-8","1"
+"98037","Lynnwood","WA","47.848237","-122.28348","-8","1"
+"98038","Maple Valley","WA","47.381989","-122.03553","-8","1"
+"98039","Medina","WA","47.626571","-122.2328","-8","1"
+"98040","Mercer Island","WA","47.569271","-122.23233","-8","1"
+"98041","Bothell","WA","47.432251","-121.803388","-8","1"
+"98042","Kent","WA","47.363382","-122.11451","-8","1"
+"98043","Mountlake Terrace","WA","47.790969","-122.30539","-8","1"
+"98045","North Bend","WA","47.483057","-121.73254","-8","1"
+"98046","Lynnwood","WA","48.037258","-121.682271","-8","1"
+"98047","Pacific","WA","47.26619","-122.24463","-8","1"
+"98050","Preston","WA","47.536015","-121.931195","-8","1"
+"98051","Ravensdale","WA","47.359414","-121.88657","-8","1"
+"98052","Redmond","WA","47.677471","-122.12138","-8","1"
+"98053","Redmond","WA","47.640972","-122.03318","-8","1"
+"98054","Redondo","WA","47.432251","-121.803388","-8","1"
+"98055","Renton","WA","47.467422","-122.21005","-8","1"
+"98056","Renton","WA","47.510739","-122.18372","-8","1"
+"98057","Renton","WA","47.432251","-121.803388","-8","1"
+"98058","Renton","WA","47.448322","-122.14584","-8","1"
+"98059","Renton","WA","47.493031","-122.14169","-8","1"
+"98060","Seattle","WA","47.432251","-121.803388","-8","1"
+"98061","Rollingbay","WA","47.680763","-122.576199","-8","1"
+"98062","Seahurst","WA","47.432251","-121.803388","-8","1"
+"98063","Federal Way","WA","47.432251","-121.803388","-8","1"
+"98064","Kent","WA","47.432251","-121.803388","-8","1"
+"98065","Snoqualmie","WA","47.530639","-121.83053","-8","1"
+"98067","Bellevue","WA","47.617634","-122.140193","-8","1"
+"98068","Snoqualmie Pass","WA","47.397811","-121.39603","-8","1"
+"98070","Vashon","WA","47.416198","-122.46821","-8","1"
+"98071","Auburn","WA","47.432251","-121.803388","-8","1"
+"98072","Woodinville","WA","47.758786","-122.10205","-8","1"
+"98073","Redmond","WA","47.432251","-121.803388","-8","1"
+"98074","Sammamish","WA","47.625364","-122.045347","-8","1"
+"98075","Sammamish","WA","47.584879","-122.033685","-8","1"
+"98082","Bothell","WA","47.432251","-121.803388","-8","1"
+"98083","Kirkland","WA","47.432251","-121.803388","-8","1"
+"98092","Auburn","WA","47.297285","-122.16328","-8","1"
+"98093","Federal Way","WA","47.311041","-122.113791","-8","1"
+"98101","Seattle","WA","47.61067","-122.33438","-8","1"
+"98102","Seattle","WA","47.63287","-122.32253","-8","1"
+"98103","Seattle","WA","47.671346","-122.34166","-8","1"
+"98104","Seattle","WA","47.60252","-122.32855","-8","1"
+"98105","Seattle","WA","47.66377","-122.30118","-8","1"
+"98106","Seattle","WA","47.53282","-122.35443","-8","1"
+"98107","Seattle","WA","47.66747","-122.37468","-8","1"
+"98108","Seattle","WA","47.546188","-122.31514","-8","1"
+"98109","Seattle","WA","47.630648","-122.34675","-8","1"
+"98110","Bainbridge Island","WA","47.65526","-122.53508","-8","1"
+"98111","Seattle","WA","47.432251","-121.803388","-8","1"
+"98112","Seattle","WA","47.629653","-122.29752","-8","1"
+"98113","Shoreline","WA","47.763669","-122.35384","-8","1"
+"98114","Seattle","WA","47.432251","-121.803388","-8","1"
+"98115","Seattle","WA","47.68382","-122.30122","-8","1"
+"98116","Seattle","WA","47.57487","-122.39392","-8","1"
+"98117","Seattle","WA","47.685919","-122.37838","-8","1"
+"98118","Seattle","WA","47.543348","-122.27496","-8","1"
+"98119","Seattle","WA","47.63877","-122.36694","-8","1"
+"98121","Seattle","WA","47.61487","-122.34578","-8","1"
+"98122","Seattle","WA","47.61157","-122.30406","-8","1"
+"98124","Seattle","WA","47.432251","-121.803388","-8","1"
+"98125","Seattle","WA","47.716648","-122.30308","-8","1"
+"98126","Seattle","WA","47.54687","-122.3748","-8","1"
+"98129","Seattle","WA","47.432251","-121.803388","-8","1"
+"98130","Seattle","WA","47.432251","-121.803388","-8","1"
+"98131","Seattle","WA","47.432251","-121.803388","-8","1"
+"98132","Seattle","WA","47.432251","-121.803388","-8","1"
+"98133","Seattle","WA","47.733852","-122.34461","-8","1"
+"98134","Seattle","WA","47.57867","-122.33441","-8","1"
+"98136","Seattle","WA","47.538887","-122.38803","-8","1"
+"98138","Seattle","WA","47.432251","-121.803388","-8","1"
+"98140","Seattle","WA","47.432251","-121.803388","-8","1"
+"98144","Seattle","WA","47.58577","-122.30081","-8","1"
+"98145","Seattle","WA","47.432251","-121.803388","-8","1"
+"98146","Seattle","WA","47.501753","-122.35688","-8","1"
+"98148","Seattle","WA","47.443756","-122.33068","-8","1"
+"98150","Seattle","WA","47.432251","-121.803388","-8","1"
+"98151","Seattle","WA","47.432251","-121.803388","-8","1"
+"98154","Seattle","WA","47.60632","-122.33357","-8","1"
+"98155","Seattle","WA","47.753019","-122.30373","-8","1"
+"98158","Seattle","WA","47.432251","-121.803388","-8","1"
+"98160","Seattle","WA","47.432251","-121.803388","-8","1"
+"98161","Seattle","WA","47.432251","-121.803388","-8","1"
+"98164","Seattle","WA","47.606139","-122.33186","-8","1"
+"98166","Seattle","WA","47.458821","-122.34943","-8","1"
+"98168","Seattle","WA","47.491327","-122.3027","-8","1"
+"98171","Seattle","WA","47.432251","-121.803388","-8","1"
+"98174","Seattle","WA","47.604718","-122.33523","-8","1"
+"98177","Seattle","WA","47.740886","-122.36978","-8","1"
+"98178","Seattle","WA","47.497971","-122.24664","-8","1"
+"98181","Seattle","WA","47.432251","-121.803388","-8","1"
+"98184","Seattle","WA","47.432251","-121.803388","-8","1"
+"98185","Seattle","WA","47.432251","-121.803388","-8","1"
+"98188","Seattle","WA","47.450321","-122.27472","-8","1"
+"98190","Seattle","WA","47.432251","-121.803388","-8","1"
+"98191","Seattle","WA","47.432251","-121.803388","-8","1"
+"98195","Seattle","WA","47.432251","-121.803388","-8","1"
+"98198","Seattle","WA","47.397521","-122.315","-8","1"
+"98199","Seattle","WA","47.64767","-122.39758","-8","1"
+"98201","Everett","WA","47.986274","-122.20222","-8","1"
+"98203","Everett","WA","47.943468","-122.21792","-8","1"
+"98204","Everett","WA","47.90296","-122.25064","-8","1"
+"98205","Everett","WA","47.993436","-122.12723","-8","1"
+"98206","Everett","WA","47.859918","-122.284785","-8","1"
+"98207","Everett","WA","48.037258","-121.682271","-8","1"
+"98208","Everett","WA","47.893451","-122.19797","-8","1"
+"98220","Acme","WA","48.681582","-122.1977","-8","1"
+"98221","Anacortes","WA","48.495234","-122.61976","-8","1"
+"98222","Blakely Island","WA","48.586563","-122.80317","-8","1"
+"98223","Arlington","WA","48.203856","-122.05288","-8","1"
+"98224","Baring","WA","47.763755","-121.47607","-8","1"
+"98225","Bellingham","WA","48.747578","-122.48508","-8","1"
+"98226","Bellingham","WA","48.759079","-122.43597","-8","1"
+"98227","Bellingham","WA","48.814753","-121.988548","-8","1"
+"98228","Bellingham","WA","48.814753","-121.988548","-8","1"
+"98229","Bellingham","WA","48.725417","-122.435478","-8","1"
+"98230","Blaine","WA","48.961443","-122.73714","-8","1"
+"98231","Blaine","WA","48.814753","-121.988548","-8","1"
+"98232","Bow","WA","48.559548","-122.41375","-8","1"
+"98233","Burlington","WA","48.486892","-122.33366","-8","1"
+"98235","Clearlake","WA","48.461672","-122.23308","-8","1"
+"98236","Clinton","WA","47.962134","-122.40089","-8","1"
+"98237","Concrete","WA","48.497601","-121.70018","-8","1"
+"98238","Conway","WA","48.337796","-122.34517","-8","1"
+"98239","Coupeville","WA","48.204162","-122.66723","-8","1"
+"98240","Custer","WA","48.931679","-122.63256","-8","1"
+"98241","Darrington","WA","48.265483","-121.56075","-8","1"
+"98243","Deer Harbor","WA","48.612763","-123.02057","-8","1"
+"98244","Deming","WA","48.841442","-122.12547","-8","1"
+"98245","Eastsound","WA","48.672312","-122.91972","-8","1"
+"98246","Bow","WA","48.558127","-121.417034","-8","1"
+"98247","Everson","WA","48.900256","-122.32095","-8","1"
+"98248","Ferndale","WA","48.852655","-122.61807","-8","1"
+"98249","Freeland","WA","48.029176","-122.54222","-8","1"
+"98250","Friday Harbor","WA","48.55113","-123.07563","-8","1"
+"98251","Gold Bar","WA","47.851713","-121.66644","-8","1"
+"98252","Granite Falls","WA","48.070852","-121.82242","-8","1"
+"98253","Greenbank","WA","48.085852","-122.57129","-8","1"
+"98255","Hamilton","WA","48.525461","-121.9887","-8","1"
+"98256","Index","WA","47.84138","-121.50689","-8","1"
+"98257","La Conner","WA","48.393063","-122.50476","-8","1"
+"98258","Lake Stevens","WA","48.028355","-122.06327","-8","1"
+"98259","North Lakewood","WA","48.037258","-121.682271","-8","1"
+"98260","Langley","WA","48.030555","-122.44856","-8","1"
+"98261","Lopez Island","WA","48.481655","-122.88271","-8","1"
+"98262","Lummi Island","WA","48.699642","-122.66658","-8","1"
+"98263","Lyman","WA","48.534462","-122.058644","-8","1"
+"98264","Lynden","WA","48.943476","-122.45723","-8","1"
+"98266","Maple Falls","WA","48.853213","-122.247881","-8","1"
+"98267","Marblemount","WA","48.499159","-121.43163","-8","1"
+"98270","Marysville","WA","48.061269","-122.1588","-8","1"
+"98271","Marysville","WA","48.093129","-122.21614","-8","1"
+"98272","Monroe","WA","47.860245","-121.93734","-8","1"
+"98273","Mount Vernon","WA","48.414576","-122.35196","-8","1"
+"98274","Mount Vernon","WA","48.371026","-122.24432","-8","1"
+"98275","Mukilteo","WA","47.916148","-122.30293","-8","1"
+"98276","Nooksack","WA","48.834208","-122.335734","-8","1"
+"98277","Oak Harbor","WA","48.303774","-122.65093","-8","1"
+"98278","Oak Harbor","WA","48.310127","-122.655862","-8","1"
+"98279","Olga","WA","48.63205","-122.81372","-8","1"
+"98280","Orcas","WA","48.594255","-122.91828","-8","1"
+"98281","Point Roberts","WA","48.99201","-123.05047","-8","1"
+"98282","Camano","WA","48.185511","-122.48209","-8","1"
+"98283","Rockport","WA","48.509814","-121.48418","-8","1"
+"98284","Sedro Woolley","WA","48.518653","-122.16545","-8","1"
+"98286","Shaw Island","WA","48.575362","-122.96643","-8","1"
+"98287","Silvana","WA","48.037258","-121.682271","-8","1"
+"98288","Skykomish","WA","47.658047","-121.41445","-8","1"
+"98290","Snohomish","WA","47.930902","-122.03976","-8","1"
+"98291","Snohomish","WA","47.909511","-122.050108","-8","1"
+"98292","Stanwood","WA","48.222046","-122.38961","-8","1"
+"98293","Startup","WA","47.870275","-121.76849","-8","1"
+"98294","Sultan","WA","47.86527","-121.78899","-8","1"
+"98295","Sumas","WA","48.971298","-122.20146","-8","1"
+"98296","Snohomish","WA","47.846083","-122.11068","-8","1"
+"98297","Waldron","WA","48.701835","-123.02636","-8","1"
+"98303","Anderson Island","WA","47.16438","-122.69584","-8","1"
+"98304","Ashford","WA","46.75523","-122.01544","-8","1"
+"98305","Beaver","WA","48.066605","-124.30909","-8","1"
+"98310","Bremerton","WA","47.58675","-122.62371","-8","1"
+"98311","Bremerton","WA","47.629717","-122.63493","-8","1"
+"98312","Bremerton","WA","47.564437","-122.71293","-8","1"
+"98314","Bremerton","WA","47.559317","-122.64915","-8","1"
+"98315","Silverdale","WA","47.720777","-122.71309","-8","1"
+"98319","Duvall","WA","47.741268","-121.978279","-8","1"
+"98320","Brinnon","WA","47.705616","-122.92868","-8","1"
+"98321","Buckley","WA","47.155649","-122.05255","-8","1"
+"98322","Burley","WA","47.687971","-122.729304","-8","1"
+"98323","Carbonado","WA","47.035525","-121.951","-8","1"
+"98324","Carlsborg","WA","48.18315","-123.872972","-8","1"
+"98325","Chimacum","WA","47.974586","-122.78382","-8","1"
+"98326","Clallam Bay","WA","48.181608","-124.41188","-8","1"
+"98327","Dupont","WA","47.088719","-122.64326","-8","1"
+"98328","Eatonville","WA","46.884733","-122.29237","-8","1"
+"98329","Gig Harbor","WA","47.378121","-122.7222","-8","1"
+"98330","Elbe","WA","46.761546","-122.17858","-8","1"
+"98331","Forks","WA","47.838423","-124.35888","-8","1"
+"98332","Gig Harbor","WA","47.364321","-122.60011","-8","1"
+"98333","Fox Island","WA","47.244053","-122.6199","-8","1"
+"98335","Gig Harbor","WA","47.301252","-122.60562","-8","1"
+"98336","Glenoma","WA","46.53619","-122.11766","-8","1"
+"98337","Bremerton","WA","47.569167","-122.63479","-8","1"
+"98338","Graham","WA","47.028423","-122.291","-8","1"
+"98339","Port Hadlock","WA","48.036882","-122.7599","-8","1"
+"98340","Hansville","WA","47.910628","-122.57489","-8","1"
+"98342","Indianola","WA","47.74878","-122.53051","-8","1"
+"98343","Joyce","WA","48.18315","-123.872972","-8","1"
+"98344","Kapowsin","WA","46.989916","-122.222642","-8","1"
+"98345","Keyport","WA","47.702342","-122.62554","-8","1"
+"98346","Kingston","WA","47.807359","-122.51962","-8","1"
+"98348","La Grande","WA","47.066193","-122.113223","-8","1"
+"98349","Lakebay","WA","47.268551","-122.76897","-8","1"
+"98350","La Push","WA","47.905815","-124.62202","-8","1"
+"98351","Longbranch","WA","47.200168","-122.77537","-8","1"
+"98352","Sumner","WA","47.066193","-122.113223","-8","1"
+"98353","Manchester","WA","47.553289","-122.54535","-8","1"
+"98354","Milton","WA","47.248208","-122.31737","-8","1"
+"98355","Mineral","WA","46.711036","-122.0348","-8","1"
+"98356","Morton","WA","46.562676","-122.29514","-8","1"
+"98357","Neah Bay","WA","48.35306","-124.64076","-8","1"
+"98358","Nordland","WA","48.058323","-122.68794","-8","1"
+"98359","Olalla","WA","47.43025","-122.57159","-8","1"
+"98360","Orting","WA","47.039607","-122.14691","-8","1"
+"98361","Packwood","WA","46.580048","-121.61674","-8","1"
+"98362","Port Angeles","WA","48.097144","-123.40628","-8","1"
+"98363","Port Angeles","WA","48.102836","-123.63765","-8","1"
+"98364","Port Gamble","WA","47.854503","-122.59122","-8","1"
+"98365","Port Ludlow","WA","47.907561","-122.69416","-8","1"
+"98366","Port Orchard","WA","47.53587","-122.59905","-8","1"
+"98367","Port Orchard","WA","47.470971","-122.66335","-8","1"
+"98368","Port Townsend","WA","48.100255","-122.79736","-8","1"
+"98370","Poulsbo","WA","47.743302","-122.63041","-8","1"
+"98371","Puyallup","WA","47.196272","-122.31577","-8","1"
+"98372","Puyallup","WA","47.198591","-122.27131","-8","1"
+"98373","Puyallup","WA","47.147862","-122.31864","-8","1"
+"98374","Puyallup","WA","47.140045","-122.26012","-8","1"
+"98375","Puyallup","WA","47.112477","-122.32247","-8","1"
+"98376","Quilcene","WA","47.826111","-122.85233","-8","1"
+"98377","Randle","WA","46.525156","-121.85094","-8","1"
+"98378","Retsil","WA","47.687971","-122.729304","-8","1"
+"98380","Seabeck","WA","47.596122","-122.89456","-8","1"
+"98381","Sekiu","WA","48.283826","-124.37144","-8","1"
+"98382","Sequim","WA","48.079979","-123.09916","-8","1"
+"98383","Silverdale","WA","47.667257","-122.69055","-8","1"
+"98384","South Colby","WA","47.521803","-122.539637","-8","1"
+"98385","South Prairie","WA","47.138345","-122.09819","-8","1"
+"98386","Southworth","WA","47.51037","-122.499139","-8","1"
+"98387","Spanaway","WA","47.077796","-122.40517","-8","1"
+"98388","Steilacoom","WA","47.164965","-122.6005","-8","1"
+"98389","South Prairie","WA","47.137872","-122.09356","-8","1"
+"98390","Sumner","WA","47.196364","-122.1887","-8","1"
+"98392","Suquamish","WA","47.735065","-122.55751","-8","1"
+"98393","Tracyton","WA","47.626717","-122.649953","-8","1"
+"98394","Vaughn","WA","47.336226","-122.78309","-8","1"
+"98395","Wauna","WA","47.266017","-122.832799","-8","1"
+"98396","Wilkeson","WA","47.106024","-122.0451","-8","1"
+"98397","Longmire","WA","47.066193","-122.113223","-8","1"
+"98398","Paradise Inn","WA","47.066193","-122.113223","-8","1"
+"98401","Tacoma","WA","47.253671","-122.444335","-8","1"
+"98402","Tacoma","WA","47.247671","-122.43971","-8","1"
+"98403","Tacoma","WA","47.263971","-122.45879","-8","1"
+"98404","Tacoma","WA","47.212421","-122.4156","-8","1"
+"98405","Tacoma","WA","47.248953","-122.46599","-8","1"
+"98406","Tacoma","WA","47.26302","-122.49518","-8","1"
+"98407","Tacoma","WA","47.28392","-122.50433","-8","1"
+"98408","Tacoma","WA","47.209021","-122.44498","-8","1"
+"98409","Tacoma","WA","47.208987","-122.48053","-8","1"
+"98411","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98412","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98413","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98415","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98416","Tacoma","WA","47.264577","-122.482076","-8","1"
+"98418","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98421","Tacoma","WA","47.250681","-122.41213","-8","1"
+"98422","Tacoma","WA","47.296007","-122.39835","-8","1"
+"98424","Tacoma","WA","47.242186","-122.35916","-8","1"
+"98430","Camp Murray","WA","47.066193","-122.113223","-8","1"
+"98431","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98433","Tacoma","WA","47.080682","-122.57987","-8","1"
+"98434","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98438","Tacoma","WA","47.151297","-122.567631","-8","1"
+"98439","Lakewood","WA","47.12562","-122.52294","-8","1"
+"98442","Tacoma","WA","47.308061","-122.418495","-8","1"
+"98443","Tacoma","WA","47.202874","-122.37678","-8","1"
+"98444","Tacoma","WA","47.153571","-122.4485","-8","1"
+"98445","Tacoma","WA","47.148269","-122.41196","-8","1"
+"98446","Tacoma","WA","47.1309","-122.37589","-8","1"
+"98447","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98448","Parkland","WA","47.136544","-122.422431","-8","1"
+"98450","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98455","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98460","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98464","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98465","Tacoma","WA","47.247735","-122.52818","-8","1"
+"98466","Tacoma","WA","47.230402","-122.53272","-8","1"
+"98467","University Place","WA","47.203946","-122.52996","-8","1"
+"98468","Oakville","WA","46.843337","-123.228797","-8","1"
+"98471","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98477","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98481","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98485","South Prairie","WA","47.140655","-122.100892","-8","1"
+"98492","Lakewood","WA","47.066193","-122.113223","-8","1"
+"98493","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98494","Tacoma","WA","47.066193","-122.113223","-8","1"
+"98497","Lakewood","WA","47.066193","-122.113223","-8","1"
+"98498","Lakewood","WA","47.16062","-122.55877","-8","1"
+"98499","Lakewood","WA","47.16632","-122.50844","-8","1"
+"98500","Tumwater","WA","46.985519","-122.907649","-8","1"
+"98501","Olympia","WA","47.014718","-122.8819","-8","1"
+"98502","Olympia","WA","47.071484","-122.97702","-8","1"
+"98503","Lacey","WA","47.027082","-122.80359","-8","1"
+"98504","Olympia","WA","46.978118","-122.702393","-8","1"
+"98505","Olympia","WA","47.065404","-122.976187","-8","1"
+"98506","Olympia","WA","47.069339","-122.87249","-8","1"
+"98507","Olympia","WA","46.978118","-122.702393","-8","1"
+"98508","Olympia","WA","46.978118","-122.702393","-8","1"
+"98509","Lacey","WA","46.978118","-122.702393","-8","1"
+"98512","Olympia","WA","46.969793","-122.99802","-8","1"
+"98513","Olympia","WA","47.00581","-122.75285","-8","1"
+"98516","Olympia","WA","47.085046","-122.78376","-8","1"
+"98520","Aberdeen","WA","46.972965","-123.81923","-8","1"
+"98522","Adna","WA","46.571323","-123.298384","-8","1"
+"98524","Allyn","WA","47.374343","-122.8388","-8","1"
+"98526","Amanda Park","WA","47.463965","-124.02938","-8","1"
+"98527","Bay Center","WA","46.630051","-123.95463","-8","1"
+"98528","Belfair","WA","47.445292","-122.88417","-8","1"
+"98530","Bucoda","WA","46.797382","-122.85123","-8","1"
+"98531","Centralia","WA","46.728383","-122.95142","-8","1"
+"98532","Chehalis","WA","46.630721","-123.01599","-8","1"
+"98533","Cinebar","WA","46.588026","-122.53345","-8","1"
+"98535","Copalis Beach","WA","47.118566","-124.16027","-8","1"
+"98536","Copalis Crossing","WA","47.179475","-124.14241","-8","1"
+"98537","Cosmopolis","WA","46.899189","-123.6907","-8","1"
+"98538","Curtis","WA","46.483547","-123.1016","-8","1"
+"98539","Doty","WA","46.637787","-123.2798","-8","1"
+"98540","East Olympia","WA","46.978118","-122.702393","-8","1"
+"98541","Elma","WA","47.03575","-123.40713","-8","1"
+"98542","Ethel","WA","46.532624","-122.74407","-8","1"
+"98544","Galvin","WA","46.734909","-123.02536","-8","1"
+"98546","Grapeview","WA","47.321442","-122.92935","-8","1"
+"98547","Grayland","WA","46.781978","-124.08111","-8","1"
+"98548","Hoodsport","WA","47.446725","-123.21175","-8","1"
+"98550","Hoquiam","WA","47.026913","-123.91732","-8","1"
+"98552","Humptulips","WA","47.355226","-123.90189","-8","1"
+"98554","Lebam","WA","46.561375","-123.54788","-8","1"
+"98555","Lilliwaup","WA","47.521614","-123.06888","-8","1"
+"98556","Littlerock","WA","46.902376","-123.017043","-8","1"
+"98557","Mccleary","WA","47.054419","-123.2739","-8","1"
+"98558","Mckenna","WA","46.955863","-122.55585","-8","1"
+"98559","Malone","WA","46.959091","-123.32595","-8","1"
+"98560","Matlock","WA","47.26332","-123.43097","-8","1"
+"98561","Menlo","WA","46.514625","-123.76903","-8","1"
+"98562","Moclips","WA","47.254009","-124.20789","-8","1"
+"98563","Montesano","WA","47.034615","-123.60332","-8","1"
+"98564","Mossyrock","WA","46.50494","-122.48668","-8","1"
+"98565","Napavine","WA","46.580105","-122.90699","-8","1"
+"98566","Neilton","WA","47.387674","-123.890317","-8","1"
+"98568","Oakville","WA","46.84066","-123.25649","-8","1"
+"98569","Ocean Shores","WA","46.983877","-124.15607","-8","1"
+"98570","Onalaska","WA","46.593526","-122.65346","-8","1"
+"98571","Pacific Beach","WA","47.216861","-124.1974","-8","1"
+"98572","Pe Ell","WA","46.569107","-123.30578","-8","1"
+"98575","Quinault","WA","47.489864","-123.81031","-8","1"
+"98576","Rainier","WA","46.871178","-122.67573","-8","1"
+"98577","Raymond","WA","46.668744","-123.67708","-8","1"
+"98579","Rochester","WA","46.814438","-123.08647","-8","1"
+"98580","Roy","WA","46.954282","-122.48754","-8","1"
+"98581","Ryderwood","WA","46.373347","-123.05308","-8","1"
+"98582","Salkum","WA","46.513653","-122.62556","-8","1"
+"98583","Satsop","WA","47.002178","-123.483596","-8","1"
+"98584","Shelton","WA","47.224044","-123.10538","-8","1"
+"98585","Silver Creek","WA","46.528282","-122.57616","-8","1"
+"98586","South Bend","WA","46.560786","-123.85214","-8","1"
+"98587","Taholah","WA","47.32251","-124.25814","-8","1"
+"98588","Tahuya","WA","47.433993","-123.02078","-8","1"
+"98589","Tenino","WA","46.857968","-122.8326","-8","1"
+"98590","Tokeland","WA","46.737458","-123.98121","-8","1"
+"98591","Toledo","WA","46.433226","-122.80083","-8","1"
+"98592","Union","WA","47.33179","-123.07403","-8","1"
+"98593","Vader","WA","46.40521","-122.9827","-8","1"
+"98595","Westport","WA","46.887187","-124.10735","-8","1"
+"98596","Winlock","WA","46.493247","-122.92262","-8","1"
+"98597","Yelm","WA","46.893352","-122.56719","-8","1"
+"98599","Olympia","WA","46.978118","-122.702393","-8","1"
+"98601","Amboy","WA","45.935656","-122.43726","-8","1"
+"98602","Appleton","WA","45.844123","-121.29141","-8","1"
+"98603","Ariel","WA","46.001752","-122.45624","-8","1"
+"98604","Battle Ground","WA","45.791345","-122.51789","-8","1"
+"98605","Bingen","WA","45.719294","-121.47838","-8","1"
+"98606","Brush Prairie","WA","45.73451","-122.48034","-8","1"
+"98607","Camas","WA","45.60916","-122.40547","-8","1"
+"98609","Carrolls","WA","46.071482","-122.864838","-8","1"
+"98610","Carson","WA","45.801513","-121.91147","-8","1"
+"98611","Castle Rock","WA","46.308371","-122.8987","-8","1"
+"98612","Cathlamet","WA","46.208318","-123.34624","-8","1"
+"98613","Centerville","WA","45.722786","-120.96163","-8","1"
+"98614","Chinook","WA","46.282397","-123.93844","-8","1"
+"98616","Cougar","WA","46.06517","-122.29411","-8","1"
+"98617","Dallesport","WA","45.632051","-121.16835","-8","1"
+"98619","Glenwood","WA","46.018228","-121.28904","-8","1"
+"98620","Goldendale","WA","45.846697","-120.75703","-8","1"
+"98621","Grays River","WA","46.348706","-123.58307","-8","1"
+"98622","Heisson","WA","45.801586","-122.520347","-8","1"
+"98623","Husum","WA","45.807631","-121.487682","-8","1"
+"98624","Ilwaco","WA","46.312541","-124.02968","-8","1"
+"98625","Kalama","WA","46.015873","-122.79718","-8","1"
+"98626","Kelso","WA","46.150433","-122.88566","-8","1"
+"98628","Klickitat","WA","45.82786","-121.09804","-8","1"
+"98629","La Center","WA","45.8768","-122.62193","-8","1"
+"98631","Long Beach","WA","46.365773","-124.05022","-8","1"
+"98632","Longview","WA","46.156082","-122.98043","-8","1"
+"98635","Lyle","WA","45.726451","-121.19784","-8","1"
+"98637","Nahcotta","WA","46.514625","-123.76903","-8","1"
+"98638","Naselle","WA","46.370075","-123.76506","-8","1"
+"98639","North Bonneville","WA","45.650041","-121.97167","-8","1"
+"98640","Ocean Park","WA","46.501781","-124.04801","-8","1"
+"98641","Oysterville","WA","46.554","-124.02626","-8","1"
+"98642","Ridgefield","WA","45.795825","-122.69804","-8","1"
+"98643","Rosburg","WA","46.302905","-123.62473","-8","1"
+"98644","Seaview","WA","46.332077","-124.05517","-8","1"
+"98645","Silverlake","WA","46.318482","-122.7757","-8","1"
+"98647","Skamokawa","WA","46.296658","-123.46828","-8","1"
+"98648","Stevenson","WA","45.669604","-121.91332","-8","1"
+"98649","Toutle","WA","46.352771","-122.66054","-8","1"
+"98650","Trout Lake","WA","45.981582","-121.5395","-8","1"
+"98651","Underwood","WA","45.730656","-121.57558","-8","1"
+"98653","Lyle","WA","45.694098","-121.286091","-8","1"
+"98655","Hazel Dell North","WA","45.678557","-122.663954","-8","1"
+"98660","Vancouver","WA","45.652255","-122.69009","-8","1"
+"98661","Vancouver","WA","45.63873","-122.62846","-8","1"
+"98662","Vancouver","WA","45.671806","-122.57894","-8","1"
+"98663","Vancouver","WA","45.647667","-122.66162","-8","1"
+"98664","Vancouver","WA","45.62104","-122.57947","-8","1"
+"98665","Vancouver","WA","45.681271","-122.66712","-8","1"
+"98666","Vancouver","WA","45.801586","-122.520347","-8","1"
+"98667","Vancouver","WA","45.801586","-122.520347","-8","1"
+"98668","Vancouver","WA","45.801586","-122.520347","-8","1"
+"98670","Wahkiacus","WA","45.859065","-121.14615","-8","1"
+"98671","Washougal","WA","45.594465","-122.28112","-8","1"
+"98672","White Salmon","WA","45.786727","-121.47523","-8","1"
+"98673","Wishram","WA","45.661878","-120.94997","-8","1"
+"98674","Woodland","WA","45.928662","-122.70284","-8","1"
+"98675","Yacolt","WA","45.843674","-122.39221","-8","1"
+"98682","Vancouver","WA","45.67309","-122.51319","-8","1"
+"98683","Vancouver","WA","45.604075","-122.51035","-8","1"
+"98684","Vancouver","WA","45.627459","-122.52023","-8","1"
+"98685","Vancouver","WA","45.709555","-122.68473","-8","1"
+"98686","Vancouver","WA","45.712623","-122.63419","-8","1"
+"98687","Vancouver","WA","45.801586","-122.520347","-8","1"
+"98731","Waller","WA","47.185462","-122.353089","-8","1"
+"98801","Wenatchee","WA","47.425497","-120.32881","-8","1"
+"98802","East Wenatchee","WA","47.436898","-120.25742","-8","1"
+"98807","Wenatchee","WA","47.905787","-120.520211","-8","1"
+"98811","Ardenvoir","WA","47.737028","-120.37126","-8","1"
+"98812","Brewster","WA","48.112268","-119.75203","-8","1"
+"98813","Bridgeport","WA","47.999618","-119.66129","-8","1"
+"98814","Carlton","WA","48.231421","-120.12065","-8","1"
+"98815","Cashmere","WA","47.522546","-120.48966","-8","1"
+"98816","Chelan","WA","47.880774","-120.08379","-8","1"
+"98817","Chelan Falls","WA","47.79955","-119.98921","-8","1"
+"98819","Conconully","WA","48.559477","-119.75474","-8","1"
+"98821","Dryden","WA","47.541723","-120.5614","-8","1"
+"98822","Entiat","WA","47.782158","-120.35944","-8","1"
+"98823","Ephrata","WA","47.297368","-119.57129","-8","1"
+"98824","George","WA","47.079243","-119.860117","-8","1"
+"98826","Leavenworth","WA","47.728186","-120.73874","-8","1"
+"98827","Loomis","WA","48.885618","-119.68939","-8","1"
+"98828","Malaga","WA","47.333821","-120.19929","-8","1"
+"98829","Malott","WA","48.267188","-119.73538","-8","1"
+"98830","Mansfield","WA","47.880616","-119.54481","-8","1"
+"98831","Manson","WA","47.915227","-120.12934","-8","1"
+"98832","Marlin","WA","47.290624","-119.03268","-8","1"
+"98833","Mazama","WA","48.634796","-120.47681","-8","1"
+"98834","Methow","WA","48.138528","-120.02851","-8","1"
+"98836","Monitor","WA","47.481133","-120.41354","-8","1"
+"98837","Moses Lake","WA","47.133606","-119.28455","-8","1"
+"98840","Okanogan","WA","48.343356","-119.57656","-8","1"
+"98841","Omak","WA","48.403174","-119.39066","-8","1"
+"98843","Orondo","WA","47.745842","-120.09326","-8","1"
+"98844","Oroville","WA","48.9332","-119.38169","-8","1"
+"98845","Palisades","WA","47.466573","-119.82091","-8","1"
+"98846","Pateros","WA","48.03925","-119.9395","-8","1"
+"98847","Peshastin","WA","47.552462","-120.60457","-8","1"
+"98848","Quincy","WA","47.18227","-119.85868","-8","1"
+"98849","Riverside","WA","48.528793","-119.45276","-8","1"
+"98850","Rock Island","WA","47.360902","-120.11338","-8","1"
+"98851","Soap Lake","WA","47.400024","-119.4624","-8","1"
+"98852","Stehekin","WA","48.494944","-120.73348","-8","1"
+"98853","Stratford","WA","47.417461","-119.28312","-8","1"
+"98855","Tonasket","WA","48.689509","-119.32169","-8","1"
+"98856","Twisp","WA","48.359904","-120.13051","-8","1"
+"98857","Warden","WA","46.970666","-119.0672","-8","1"
+"98858","Waterville","WA","47.63205","-119.90423","-8","1"
+"98859","Wauconda","WA","48.810894","-118.93303","-8","1"
+"98860","Wilson Creek","WA","47.458634","-119.13921","-8","1"
+"98862","Winthrop","WA","48.488543","-120.24261","-8","1"
+"98901","Yakima","WA","46.616199","-120.46481","-8","1"
+"98902","Yakima","WA","46.595248","-120.53102","-8","1"
+"98903","Yakima","WA","46.550348","-120.62097","-8","1"
+"98904","Yakima","WA","46.56451","-120.694658","-8","1"
+"98907","Yakima","WA","46.628757","-120.573967","-8","1"
+"98908","Yakima","WA","46.605303","-120.61762","-8","1"
+"98909","Yakima","WA","46.637538","-120.794978","-8","1"
+"98920","Brownstown","WA","46.56451","-120.694658","-8","1"
+"98921","Buena","WA","46.421218","-120.315141","-8","1"
+"98922","Cle Elum","WA","47.19377","-120.91733","-8","1"
+"98923","Cowiche","WA","46.662006","-120.71558","-8","1"
+"98925","Easton","WA","47.3042","-121.24849","-8","1"
+"98926","Ellensburg","WA","47.009726","-120.52364","-8","1"
+"98929","Goose Prairie","WA","46.915735","-121.241591","-8","1"
+"98930","Grandview","WA","46.260129","-119.90614","-8","1"
+"98932","Granger","WA","46.345166","-120.1843","-8","1"
+"98933","Harrah","WA","46.406875","-120.62421","-8","1"
+"98934","Kittitas","WA","46.984565","-120.41782","-8","1"
+"98935","Mabton","WA","46.177732","-120.02966","-8","1"
+"98936","Moxee","WA","46.540842","-120.33322","-8","1"
+"98937","Naches","WA","46.71207","-120.97097","-8","1"
+"98938","Outlook","WA","46.364164","-120.09871","-8","1"
+"98939","Parker","WA","46.56451","-120.694658","-8","1"
+"98940","Ronald","WA","47.33394","-121.02979","-8","1"
+"98941","Roslyn","WA","47.224876","-120.99286","-8","1"
+"98942","Selah","WA","46.726395","-120.56997","-8","1"
+"98943","South Cle Elum","WA","47.186592","-120.95503","-8","1"
+"98944","Sunnyside","WA","46.342102","-119.99","-8","1"
+"98946","Thorp","WA","47.087352","-120.71232","-8","1"
+"98947","Tieton","WA","46.707735","-120.75713","-8","1"
+"98948","Toppenish","WA","46.35653","-120.33462","-8","1"
+"98950","Vantage","WA","46.880413","-119.98939","-8","1"
+"98951","Wapato","WA","46.457731","-120.46721","-8","1"
+"98952","White Swan","WA","46.377579","-120.7144","-8","1"
+"98953","Zillah","WA","46.418933","-120.26699","-8","1"
+"98991","Roslyn","WA","47.221837","-120.993126","-8","1"
+"99001","Airway Heights","WA","47.642922","-117.59149","-8","1"
+"99003","Chattaroy","WA","47.921687","-117.29378","-8","1"
+"99004","Cheney","WA","47.466974","-117.60575","-8","1"
+"99005","Colbert","WA","47.844289","-117.37274","-8","1"
+"99006","Deer Park","WA","47.966471","-117.48145","-8","1"
+"99008","Edwall","WA","47.50505","-117.93432","-8","1"
+"99009","Elk","WA","48.041663","-117.24891","-8","1"
+"99011","Fairchild Air Force Base","WA","47.595572","-117.67344","-8","1"
+"99012","Fairfield","WA","47.383651","-117.18568","-8","1"
+"99013","Ford","WA","47.889348","-117.82325","-8","1"
+"99014","Four Lakes","WA","47.55988","-117.595751","-8","1"
+"99015","Freeman","WA","47.653568","-117.431742","-8","1"
+"99016","Greenacres","WA","47.648693","-117.15116","-8","1"
+"99017","Lamont","WA","47.197445","-117.85558","-8","1"
+"99018","Latah","WA","47.277842","-117.13639","-8","1"
+"99019","Liberty Lake","WA","47.656171","-117.08628","-8","1"
+"99020","Marshall","WA","47.563191","-117.4959","-8","1"
+"99021","Mead","WA","47.81108","-117.22306","-8","1"
+"99022","Medical Lake","WA","47.583754","-117.68812","-8","1"
+"99023","Mica","WA","47.554592","-117.18352","-8","1"
+"99025","Newman Lake","WA","47.751434","-117.06934","-8","1"
+"99026","Nine Mile Falls","WA","47.801194","-117.59325","-8","1"
+"99027","Otis Orchards","WA","47.703698","-117.12007","-8","1"
+"99029","Reardan","WA","47.693129","-117.86164","-8","1"
+"99030","Rockford","WA","47.463725","-117.11319","-8","1"
+"99031","Spangle","WA","47.432691","-117.37449","-8","1"
+"99032","Sprague","WA","47.273264","-117.99082","-8","1"
+"99033","Tekoa","WA","47.222328","-117.08133","-8","1"
+"99034","Tumtum","WA","47.858074","-117.74582","-8","1"
+"99036","Valleyford","WA","47.52507","-117.27054","-8","1"
+"99037","Veradale","WA","47.643346","-117.19993","-8","1"
+"99039","Waverly","WA","47.329704","-117.244981","-8","1"
+"99040","Wellpinit","WA","47.863857","-118.03661","-8","1"
+"99066","Deer Park","WA","47.951939","-117.472694","-8","1"
+"99101","Addy","WA","48.305861","-117.94318","-8","1"
+"99102","Albion","WA","46.793604","-117.25208","-8","1"
+"99103","Almira","WA","47.721863","-118.95554","-8","1"
+"99104","Belmont","WA","47.079345","-117.176954","-8","1"
+"99105","Benge","WA","46.866805","-118.13247","-8","1"
+"99107","Boyds","WA","48.84269","-118.182764","-8","1"
+"99109","Chewelah","WA","48.269784","-117.73437","-8","1"
+"99110","Clayton","WA","48.012084","-117.57306","-8","1"
+"99111","Colfax","WA","46.875136","-117.4092","-8","1"
+"99113","Colton","WA","46.577614","-117.16133","-8","1"
+"99114","Colville","WA","48.658512","-117.7671","-8","1"
+"99115","Coulee City","WA","47.646132","-119.3827","-8","1"
+"99116","Coulee Dam","WA","47.995847","-118.95862","-8","1"
+"99117","Creston","WA","47.757764","-118.49343","-8","1"
+"99118","Curlew","WA","48.890892","-118.64475","-8","1"
+"99119","Cusick","WA","48.504786","-117.31689","-8","1"
+"99121","Danville","WA","48.977629","-118.51457","-8","1"
+"99122","Davenport","WA","47.671143","-118.18938","-8","1"
+"99123","Electric City","WA","47.907923","-119.06531","-8","1"
+"99124","Elmer City","WA","47.998468","-118.95248","-8","1"
+"99125","Endicott","WA","46.941628","-117.7293","-8","1"
+"99126","Evans","WA","48.733324","-117.97348","-8","1"
+"99127","Saint John","WA","46.838747","-117.644337","-8","1"
+"99128","Farmington","ID","47.091551","-116.99158","-8","1"
+"99129","Fruitland","WA","48.003202","-118.21339","-8","1"
+"99130","Garfield","WA","46.983768","-117.19597","-8","1"
+"99131","Gifford","WA","48.290089","-118.09326","-8","1"
+"99133","Grand Coulee","WA","47.947097","-119.00713","-8","1"
+"99134","Harrington","WA","47.460312","-118.38258","-8","1"
+"99135","Hartline","WA","47.641983","-119.08897","-8","1"
+"99136","Hay","WA","46.669207","-117.96015","-8","1"
+"99137","Hunters","WA","48.174649","-118.11361","-8","1"
+"99138","Inchelium","WA","48.207661","-118.2979","-8","1"
+"99139","Ione","WA","48.736168","-117.4111","-8","1"
+"99140","Keller","WA","48.080515","-118.69498","-8","1"
+"99141","Kettle Falls","WA","48.690209","-118.10045","-8","1"
+"99143","Lacrosse","WA","46.792982","-117.91313","-8","1"
+"99144","Lamona","WA","47.60894","-118.399551","-8","1"
+"99146","Laurier","WA","48.92816","-118.2897","-8","1"
+"99147","Lincoln","WA","47.60894","-118.399551","-8","1"
+"99148","Loon Lake","WA","48.102048","-117.6013","-8","1"
+"99149","Malden","WA","47.227436","-117.47364","-8","1"
+"99150","Malo","WA","48.810879","-118.59088","-8","1"
+"99151","Marcus","WA","48.664206","-118.06417","-8","1"
+"99152","Metaline","WA","48.858688","-117.39106","-8","1"
+"99153","Metaline Falls","WA","48.858518","-117.29833","-8","1"
+"99154","Mohler","WA","47.376884","-118.3799","-8","1"
+"99155","Nespelem","WA","48.17266","-119.00126","-8","1"
+"99156","Newport","WA","48.159752","-117.16984","-8","1"
+"99157","Northport","WA","48.897876","-117.81647","-8","1"
+"99158","Oakesdale","WA","47.136249","-117.25463","-8","1"
+"99159","Odessa","WA","47.338736","-118.70235","-8","1"
+"99160","Orient","WA","48.86407","-118.20557","-8","1"
+"99161","Palouse","WA","46.905132","-117.10575","-8","1"
+"99163","Pullman","WA","46.732705","-117.18648","-8","1"
+"99164","Pullman","WA","46.838747","-117.644337","-8","1"
+"99165","Pullman","WA","46.838747","-117.644337","-8","1"
+"99166","Republic","WA","48.657684","-118.72647","-8","1"
+"99167","Rice","WA","48.406582","-118.11029","-8","1"
+"99169","Ritzville","WA","47.107228","-118.43136","-8","1"
+"99170","Rosalia","WA","47.240334","-117.37365","-8","1"
+"99171","Saint John","WA","47.11653","-117.63938","-8","1"
+"99173","Springdale","WA","48.030848","-117.79563","-8","1"
+"99174","Steptoe","WA","46.838747","-117.644337","-8","1"
+"99176","Thornton","WA","47.117965","-117.41047","-8","1"
+"99179","Uniontown","WA","46.516794","-117.08202","-8","1"
+"99180","Usk","WA","48.295497","-117.29236","-8","1"
+"99181","Valley","WA","48.144634","-117.74564","-8","1"
+"99185","Wilbur","WA","47.756616","-118.70628","-8","1"
+"99201","Spokane","WA","47.663945","-117.43185","-8","1"
+"99202","Spokane","WA","47.656692","-117.37899","-8","1"
+"99203","Spokane","WA","47.629091","-117.40636","-8","1"
+"99204","Spokane","WA","47.648941","-117.43174","-8","1"
+"99205","Spokane","WA","47.69399","-117.43979","-8","1"
+"99206","Spokane","WA","47.646994","-117.25912","-8","1"
+"99207","Spokane","WA","47.693741","-117.38829","-8","1"
+"99208","Spokane","WA","47.740491","-117.43916","-8","1"
+"99209","Spokane","WA","47.646148","-117.793734","-8","1"
+"99210","Spokane","WA","47.653568","-117.431742","-8","1"
+"99211","Spokane","WA","47.653568","-117.431742","-8","1"
+"99212","Spokane","WA","47.668926","-117.30668","-8","1"
+"99213","Spokane","WA","47.656726","-117.282483","-8","1"
+"99214","Spokane","WA","47.653568","-117.431742","-8","1"
+"99215","Spokane","WA","47.653568","-117.431742","-8","1"
+"99216","Spokane","WA","47.665819","-117.21699","-8","1"
+"99217","Spokane","WA","47.707542","-117.33776","-8","1"
+"99218","Spokane","WA","47.751674","-117.4124","-8","1"
+"99219","Spokane","WA","47.653568","-117.431742","-8","1"
+"99220","Spokane","WA","47.653568","-117.431742","-8","1"
+"99223","Spokane","WA","47.614744","-117.35892","-8","1"
+"99224","Spokane","WA","47.632573","-117.49326","-8","1"
+"99228","Spokane","WA","47.653568","-117.431742","-8","1"
+"99251","Spokane","WA","47.653568","-117.431742","-8","1"
+"99252","Spokane","WA","47.653568","-117.431742","-8","1"
+"99256","Spokane","WA","47.653568","-117.431742","-8","1"
+"99258","Spokane","WA","47.653568","-117.431742","-8","1"
+"99260","Spokane","WA","47.653568","-117.431742","-8","1"
+"99299","Spokane","WA","47.653568","-117.431742","-8","1"
+"99301","Pasco","WA","46.270249","-119.09462","-8","1"
+"99302","Pasco","WA","46.234957","-119.094271","-8","1"
+"99309","Mattawa","WA","46.731046","-119.901931","-8","1"
+"99319","Desert Aire","WA","46.68039","-119.911288","-8","1"
+"99320","Benton City","WA","46.263399","-119.47909","-8","1"
+"99321","Beverly","WA","46.834349","-119.93088","-8","1"
+"99322","Bickleton","WA","45.963054","-120.25547","-8","1"
+"99323","Burbank","WA","46.191158","-118.87987","-8","1"
+"99324","College Place","WA","46.044936","-118.38466","-8","1"
+"99326","Connell","WA","46.675704","-118.8823","-8","1"
+"99327","Cunningham","WA","46.828931","-118.829153","-8","1"
+"99328","Dayton","WA","46.319087","-117.96887","-8","1"
+"99329","Dixie","WA","46.138753","-118.15325","-8","1"
+"99330","Eltopia","WA","46.467186","-119.06888","-8","1"
+"99332","Hatton","WA","46.776386","-118.82892","-8","1"
+"99333","Hooper","WA","46.838747","-117.644337","-8","1"
+"99335","Kahlotus","WA","46.648121","-118.55652","-8","1"
+"99336","Kennewick","WA","46.210957","-119.16369","-8","1"
+"99337","Kennewick","WA","46.169982","-119.10456","-8","1"
+"99338","Kennewick","WA","46.192356","-119.23982","-8","1"
+"99341","Lind","WA","46.912194","-118.63676","-8","1"
+"99343","Mesa","WA","46.581454","-119.12107","-8","1"
+"99344","Othello","WA","46.843397","-119.17443","-8","1"
+"99345","Paterson","WA","45.922025","-119.67687","-8","1"
+"99346","Plymouth","WA","45.960734","-119.35637","-8","1"
+"99347","Pomeroy","WA","46.44754","-117.57295","-8","1"
+"99348","Prescott","WA","46.408852","-118.44876","-8","1"
+"99349","Mattawa","WA","46.726526","-119.8857","-8","1"
+"99350","Prosser","WA","46.208571","-119.74507","-8","1"
+"99352","Richland","WA","46.279657","-119.28137","-8","1"
+"99353","West Richland","WA","46.297139","-119.35457","-8","1"
+"99356","Roosevelt","WA","45.816528","-120.28372","-8","1"
+"99357","Royal City","WA","46.922079","-119.67175","-8","1"
+"99359","Starbuck","WA","46.523206","-118.19393","-8","1"
+"99360","Touchet","WA","46.059286","-118.67264","-8","1"
+"99361","Waitsburg","WA","46.209202","-118.15884","-8","1"
+"99362","Walla Walla","OR","45.986775","-118.07919","-8","1"
+"99363","Wallula","WA","46.059013","-118.88468","-8","1"
+"99371","Washtucna","WA","46.782783","-118.2869","-8","1"
+"99401","Anatone","WA","46.086657","-117.2491","-8","1"
+"99402","Asotin","WA","46.230508","-117.12916","-8","1"
+"99403","Clarkston","WA","46.400365","-117.08313","-8","1"
+"99501","Anchorage","AK","61.216799","-149.87828","-9","1"
+"99502","Anchorage","AK","61.153693","-149.95932","-9","1"
+"99503","Anchorage","AK","61.19026","-149.89341","-9","1"
+"99504","Anchorage","AK","61.204466","-149.74633","-9","1"
+"99505","Fort Richardson","AK","61.261518","-149.66336","-9","1"
+"99506","Elmendorf AFB","AK","61.224384","-149.77461","-9","1"
+"99507","Anchorage","AK","61.154834","-149.82865","-9","1"
+"99508","Anchorage","AK","61.203953","-149.8144","-9","1"
+"99509","Anchorage","AK","61.108864","-149.440311","-9","1"
+"99510","Anchorage","AK","61.144568","-149.878418","-9","1"
+"99511","Anchorage","AK","61.068324","-149.800476","-9","1"
+"99512","Anchorage","AK","61.203954","-149.808426","-9","1"
+"99513","Anchorage","AK","61.214877","-149.88617","-9","1"
+"99514","Anchorage","AK","61.108864","-149.440311","-9","1"
+"99515","Anchorage","AK","61.122943","-149.88852","-9","1"
+"99516","Anchorage","AK","61.101142","-149.77311","-9","1"
+"99517","Anchorage","AK","61.188276","-149.93438","-9","1"
+"99518","Anchorage","AK","61.156565","-149.88335","-9","1"
+"99519","Anchorage","AK","61.108864","-149.440311","-9","1"
+"99520","Anchorage","AK","61.108864","-149.440311","-9","1"
+"99521","Anchorage","AK","61.108864","-149.440311","-9","1"
+"99522","Anchorage","AK","61.108864","-149.440311","-9","1"
+"99523","Anchorage","AK","61.108864","-149.440311","-9","1"
+"99524","Anchorage","AK","61.108864","-149.440311","-9","1"
+"99536","Kennewick","WA","46.216706","-119.160173","-8","1"
+"99540","Indian","AK","60.973454","-149.4583","-9","1"
+"99546","Adak","AK","51.87957","-176.63675","-10","1"
+"99547","Atka","AK","52.227555","-174.19628","-10","1"
+"99548","Chignik Lake","AK","56.252156","-158.74638","-9","1"
+"99549","Port Heiden","AK","56.946256","-158.62832","-9","1"
+"99550","Port Lions","AK","57.867089","-152.88568","-9","1"
+"99551","Akiachak","AK","60.88981","-161.42393","-9","1"
+"99552","Akiak","AK","60.911865","-161.22577","-9","1"
+"99553","Akutan","AK","54.098693","-165.88176","-9","1"
+"99554","Alakanuk","AK","62.683391","-164.65455","-9","1"
+"99555","Aleknagik","AK","59.269535","-158.62458","-9","1"
+"99556","Anchor Point","AK","59.798363","-151.73566","-9","1"
+"99557","Aniak","AK","61.570981","-158.88072","-9","1"
+"99558","Anvik","AK","62.632905","-160.21336","-9","1"
+"99559","Bethel","AK","60.766603","-161.88006","-9","1"
+"99561","Chefornak","AK","60.143735","-164.25283","-9","1"
+"99563","Chevak","AK","61.527953","-165.57029","-9","1"
+"99564","Chignik","AK","56.298297","-158.4044","-9","1"
+"99565","Chignik Lagoon","AK","56.307535","-158.53502","-9","1"
+"99566","Chitina","AK","61.555701","-144.14233","-9","1"
+"99567","Chugiak","AK","61.413717","-149.42644","-9","1"
+"99568","Clam Gulch","AK","60.23458","-151.3934","-9","1"
+"99569","Clarks Point","AK","58.83256","-158.55254","-9","1"
+"99571","Cold Bay","AK","55.315003","-162.634","-9","1"
+"99572","Cooper Landing","AK","60.484146","-149.78153","-9","1"
+"99573","Copper Center","AK","61.832347","-145.2308","-9","1"
+"99574","Cordova","AK","60.474512","-145.40256","-9","1"
+"99575","Crooked Creek","AK","61.859821","-158.12888","-9","1"
+"99576","Dillingham","AK","59.068709","-158.44407","-9","1"
+"99577","Eagle River","AK","61.310222","-149.51689","-9","1"
+"99578","Eek","AK","60.214239","-162.03799","-9","1"
+"99579","Egegik","AK","58.217621","-157.34841","-9","1"
+"99580","Ekwok","AK","59.360233","-157.4838","-9","1"
+"99581","Emmonak","AK","62.729019","-164.29917","-9","1"
+"99583","False Pass","AK","54.849999","-163.42011","-9","1"
+"99584","Flat","AK","65.226375","-151.025085","-9","1"
+"99585","Marshall","AK","61.878073","-162.08481","-9","1"
+"99586","Gakona","AK","62.667589","-144.49059","-9","1"
+"99587","Girdwood","AK","60.952049","-149.0838","-9","1"
+"99588","Glennallen","AK","62.12042","-145.58592","-9","1"
+"99589","Goodnews Bay","AK","59.125873","-161.59999","-9","1"
+"99590","Grayling","AK","62.90813","-160.06675","-9","1"
+"99591","Saint George Island","AK","56.605546","-169.55958","-10","1"
+"99599","Anchorage","AK","61.187188","-149.880393","-9","1"
+"99602","Holy Cross","AK","62.198048","-159.77341","-9","1"
+"99603","Homer","AK","59.665074","-151.4493","-9","1"
+"99604","Hooper Bay","AK","61.52898","-166.09619","-9","1"
+"99605","Hope","AK","60.911003","-149.62708","-9","1"
+"99606","Iliamna","AK","59.748806","-154.8124","-9","1"
+"99607","Kalskag","AK","61.535511","-160.30165","-9","1"
+"99608","Karluk","AK","57.578081","-154.36255","-9","1"
+"99609","Kasigluk","AK","60.873178","-162.5196","-9","1"
+"99610","Kasilof","AK","60.318451","-151.28948","-9","1"
+"99611","Kenai","AK","60.587598","-151.23355","-9","1"
+"99612","King Cove","AK","55.063736","-162.3124","-9","1"
+"99613","King Salmon","AK","58.687446","-156.64007","-9","1"
+"99614","Kipnuk","AK","59.937619","-164.04392","-9","1"
+"99615","Kodiak","AK","57.74663","-152.51142","-9","1"
+"99619","Kodiak","AK","58.268704","-155.797078","-9","1"
+"99620","Kotlik","AK","62.945434","-163.76142","-9","1"
+"99621","Kwethluk","AK","60.810509","-161.4219","-9","1"
+"99622","Kwigillingok","AK","59.870295","-163.16752","-9","1"
+"99624","Larsen Bay","AK","57.529161","-154.00286","-9","1"
+"99625","Levelock","AK","59.116273","-156.84802","-9","1"
+"99626","Lower Kalskag","AK","61.518175","-160.37019","-9","1"
+"99627","McGrath","AK","62.94914","-155.57265","-9","1"
+"99628","Manokotak","AK","58.981087","-159.0558","-9","1"
+"99630","Mekoryuk","AK","60.364246","-166.28601","-9","1"
+"99631","Moose Pass","AK","60.499602","-149.40247","-9","1"
+"99632","Mountain Village","AK","62.090075","-163.72393","-9","1"
+"99633","Naknek","AK","58.745436","-156.95331","-9","1"
+"99634","Napakiak","AK","60.695049","-161.9909","-9","1"
+"99635","Nikiski","AK","60.784804","-151.06473","-9","1"
+"99636","New Stuyahok","AK","59.452339","-157.31368","-9","1"
+"99637","Toksook Bay","AK","60.532936","-165.10529","-9","1"
+"99638","Nikolski","AK","52.785684","-169.19469","-10","1"
+"99639","Ninilchik","AK","59.992821","-151.54194","-9","1"
+"99640","Nondalton","AK","59.971286","-154.85008","-9","1"
+"99641","Nunapitchuk","AK","60.898967","-162.43712","-9","1"
+"99643","Old Harbor","AK","57.19926","-153.30438","-9","1"
+"99644","Ouzinkie","AK","57.929664","-152.46085","-9","1"
+"99645","Palmer","AK","61.598203","-149.04109","-9","1"
+"99646","Palmer","AK","61.586896","-149.094699","-9","1"
+"99647","Pedro Bay","AK","59.781241","-154.10833","-9","1"
+"99648","Perryville","AK","55.91076","-159.15591","-9","1"
+"99649","Pilot Point","AK","57.508178","-157.39907","-9","1"
+"99650","Pilot Station","AK","61.93605","-162.8834","-9","1"
+"99651","Platinum","AK","59.00689","-161.81529","-9","1"
+"99652","Big Lake","AK","61.556311","-149.89098","-9","1"
+"99653","Port Alsworth","AK","60.102331","-154.55708","-9","1"
+"99654","Wasilla","AK","61.580187","-149.48821","-9","1"
+"99655","Quinhagak","AK","59.754016","-161.90079","-9","1"
+"99656","Red Devil","AK","61.810587","-157.3437","-9","1"
+"99657","Russian Mission","AK","61.785228","-161.36476","-9","1"
+"99658","Saint Marys","AK","62.048263","-163.1937","-9","1"
+"99659","Saint Michael","AK","63.477448","-162.03841","-9","1"
+"99660","Saint Paul Island","AK","57.130894","-170.27203","-10","1"
+"99661","Sand Point","AK","55.311735","-160.48813","-9","1"
+"99662","Scammon Bay","AK","61.783788","-165.53972","-9","1"
+"99663","Seldovia","AK","59.422698","-151.71513","-9","1"
+"99664","Seward","AK","60.151652","-149.41271","-9","1"
+"99665","Shageluk","AK","62.655998","-159.53113","-9","1"
+"99666","Sheldon Point","AK","62.495675","-164.97188","-9","1"
+"99667","Skwentna","AK","61.898872","-151.51587","-9","1"
+"99668","Sleetmute","AK","61.683931","-157.15202","-9","1"
+"99669","Soldotna","AK","60.489536","-151.02091","-9","1"
+"99670","South Naknek","AK","58.71163","-157.01746","-9","1"
+"99671","Stebbins","AK","63.511893","-162.27463","-9","1"
+"99672","Sterling","AK","60.532394","-150.74033","-9","1"
+"99674","Sutton","AK","61.751348","-148.69632","-9","1"
+"99675","Takotna","AK","62.969642","-156.10264","-9","1"
+"99676","Talkeetna","AK","62.298254","-149.87542","-9","1"
+"99677","Tatitlek","AK","60.863764","-146.68013","-9","1"
+"99678","Togiak","AK","59.101934","-160.50353","-9","1"
+"99679","Tuluksak","AK","61.102912","-160.96325","-9","1"
+"99680","Tuntutuliak","AK","60.343879","-162.66587","-9","1"
+"99681","Tununak","AK","60.582127","-165.25645","-9","1"
+"99682","Tyonek","AK","61.067777","-151.14169","-9","1"
+"99683","Trapper Creek","AK","62.415294","-150.37044","-9","1"
+"99684","Unalakleet","AK","63.882081","-160.76294","-9","1"
+"99685","Unalaska","AK","53.872017","-166.52287","-10","1"
+"99686","Valdez","AK","61.128176","-146.2357","-9","1"
+"99687","Wasilla","AK","61.391728","-149.99002","-9","1"
+"99688","Willow","AK","61.796774","-150.07792","-9","1"
+"99689","Yakutat","AK","59.538728","-139.71052","-9","1"
+"99690","Nightmute","AK","60.527618","-164.81976","-9","1"
+"99691","Nikolai","AK","62.999213","-154.41957","-9","1"
+"99692","Dutch Harbor","AK","53.883729","-166.5485","-10","1"
+"99693","Whittier","AK","60.639257","-148.54211","-9","1"
+"99694","Houston","AK","61.629635","-149.79507","-9","1"
+"99695","Anchorage","AK","61.402544","-150.57485","-9","1"
+"99697","Kodiak","AK","57.564289","-153.40755","-9","1"
+"99699","Funny River","AK","60.516935","-150.719924","-9","1"
+"99701","Fairbanks","AK","64.83507","-147.72045","-9","1"
+"99702","Eielson AFB","AK","64.661627","-147.02121","-9","1"
+"99703","Fort Wainwright","AK","64.827164","-147.6265","-9","1"
+"99704","Clear","AK","64.289856","-149.17778","-9","1"
+"99705","North Pole","AK","64.777233","-147.3649","-9","1"
+"99706","Fairbanks","AK","64.852055","-147.937747","-9","1"
+"99707","Fairbanks","AK","64.699839","-147.405134","-9","1"
+"99708","Fairbanks","AK","64.947462","-147.856443","-9","1"
+"99709","Fairbanks","AK","64.854937","-147.87406","-9","1"
+"99710","Fairbanks","AK","64.948648","-147.535549","-9","1"
+"99711","Fairbanks","AK","64.826445","-147.38884","-9","1"
+"99712","Fairbanks","AK","64.926041","-147.49573","-9","1"
+"99714","Salcha","AK","64.464105","-146.91648","-9","1"
+"99716","Two Rivers","AK","64.874591","-146.898195","-9","1"
+"99720","Allakaket","AK","66.557586","-152.6559","-9","1"
+"99721","Anaktuvuk Pass","AK","68.148216","-151.72854","-9","1"
+"99722","Arctic Village","AK","68.121828","-145.52768","-9","1"
+"99723","Barrow","AK","71.299525","-156.74891","-9","1"
+"99724","Beaver","AK","66.359719","-147.39743","-9","1"
+"99725","Ester","AK","64.842326","-148.02197","-9","1"
+"99726","Bettles Field","AK","66.917381","-151.50508","-9","1"
+"99727","Buckland","AK","65.979144","-161.12225","-9","1"
+"99729","Cantwell","AK","63.255516","-148.39873","-9","1"
+"99730","Central","AK","65.551022","-144.71982","-9","1"
+"99732","Chicken","AK","64.070738","-141.87489","-9","1"
+"99733","Circle","AK","65.796306","-144.06388","-9","1"
+"99734","Prudhoe Bay","AK","66.693255","-153.993988","-9","1"
+"99736","Deering","AK","66.075713","-162.71822","-9","1"
+"99737","Delta Junction","AK","63.978355","-145.4623","-9","1"
+"99738","Eagle","AK","64.778099","-141.19257","-9","1"
+"99739","Elim","AK","64.620513","-162.27718","-9","1"
+"99740","Fort Yukon","AK","66.566652","-145.28231","-9","1"
+"99741","Galena","AK","64.739082","-156.89456","-9","1"
+"99742","Gambell","AK","63.776098","-171.70088","-9","1"
+"99743","Healy","AK","64.010218","-149.10712","-9","1"
+"99744","Anderson","AK","64.349263","-149.19265","-9","1"
+"99745","Hughes","AK","66.044094","-154.25703","-9","1"
+"99746","Huslia","AK","65.701858","-156.38713","-9","1"
+"99747","Kaktovik","AK","70.13346","-143.62436","-9","1"
+"99748","Kaltag","AK","64.324887","-158.73204","-9","1"
+"99749","Kiana","AK","66.97172","-160.43016","-9","1"
+"99750","Kivalina","AK","67.733313","-164.54522","-9","1"
+"99751","Kobuk","AK","66.908604","-156.88828","-9","1"
+"99752","Kotzebue","AK","66.897192","-162.58544","-9","1"
+"99753","Koyuk","AK","64.932225","-161.15597","-9","1"
+"99754","Koyukuk","AK","64.881745","-157.70439","-9","1"
+"99755","Denali National Park","AK","63.657441","-148.83396","-9","1"
+"99756","Manley Hot Springs","AK","65.021337","-150.50318","-9","1"
+"99757","Lake Minchumina","AK","63.893902","-152.30201","-9","1"
+"99758","Minto","AK","65.152583","-149.39156","-9","1"
+"99759","Point Lay","AK","69.741023","-163.00861","-9","1"
+"99760","Nenana","AK","64.560888","-149.07674","-9","1"
+"99761","Noatak","AK","67.572031","-162.97508","-9","1"
+"99762","Nome","AK","64.532616","-165.10883","-9","1"
+"99763","Noorvik","AK","66.83713","-161.03664","-9","1"
+"99764","Northway","AK","62.980725","-141.82852","-9","1"
+"99765","Nulato","AK","64.730035","-158.11178","-9","1"
+"99766","Point Hope","AK","68.347052","-166.76291","-9","1"
+"99767","Rampart","AK","65.507883","-150.1636","-9","1"
+"99768","Ruby","AK","64.737306","-155.48769","-9","1"
+"99769","Savoonga","AK","63.686038","-170.4087","-9","1"
+"99770","Selawik","AK","66.597998","-160.01772","-9","1"
+"99771","Shaktoolik","AK","64.343258","-161.16785","-9","1"
+"99772","Shishmaref","AK","66.259417","-165.73202","-9","1"
+"99773","Shungnak","AK","66.887401","-157.14287","-9","1"
+"99774","Stevens Village","AK","66.005296","-149.10303","-9","1"
+"99775","Fairbanks","AK","64.860846","-147.82681","-9","1"
+"99776","Tanacross","AK","63.376206","-143.35699","-9","1"
+"99777","Tanana","AK","65.172029","-152.08258","-9","1"
+"99778","Teller","AK","65.250432","-166.35474","-9","1"
+"99779","Tetlin","AK","63.135294","-142.5323","-9","1"
+"99780","Tok","AK","63.341767","-142.93704","-9","1"
+"99781","Venetie","AK","67.015569","-146.41736","-9","1"
+"99782","Wainwright","AK","70.640902","-160.02481","-9","1"
+"99783","Wales","AK","65.612116","-168.08928","-9","1"
+"99784","White Mountain","AK","64.684323","-163.44257","-9","1"
+"99785","Brevig Mission","AK","65.342744","-166.51023","-9","1"
+"99786","Ambler","AK","67.083658","-157.86225","-9","1"
+"99788","Chalkyitsik","AK","66.653222","-143.72717","-9","1"
+"99789","Nuiqsut","AK","70.215197","-151.02746","-9","1"
+"99790","Fairbanks","AK","64.856055","-146.27598","-9","1"
+"99791","Atqasuk","AK","70.477663","-157.41805","-9","1"
+"99801","Juneau","AK","58.358599","-134.54749","-9","1"
+"99802","Juneau","AK","58.405657","-134.58969","-9","1"
+"99803","Juneau","AK","58.377074","-134.617383","-9","1"
+"99811","Juneau","AK","58.38348","-134.197786","-9","1"
+"99820","Angoon","AK","57.48765","-134.57222","-9","1"
+"99821","Auke Bay","AK","58.449413","-134.700348","-9","1"
+"99824","Douglas","AK","58.276192","-134.39781","-9","1"
+"99825","Elfin Cove","AK","58.068878","-136.27833","-9","1"
+"99826","Gustavus","AK","58.434052","-135.73088","-9","1"
+"99827","Haines","AK","59.279037","-135.6122","-9","1"
+"99829","Hoonah","AK","58.109608","-135.43154","-9","1"
+"99830","Kake","AK","56.975011","-133.9323","-9","1"
+"99832","Pelican","AK","57.959709","-136.22032","-9","1"
+"99833","Petersburg","AK","56.784206","-132.97354","-9","1"
+"99835","Sitka","AK","57.064376","-135.3227","-9","1"
+"99836","Port Alexander","AK","56.53595","-132.827948","-9","1"
+"99840","Skagway","AK","59.465159","-135.31355","-9","1"
+"99841","Tenakee Springs","AK","57.777622","-135.20777","-9","1"
+"99850","Juneau","AK","58.411303","-135.40874","-9","1"
+"99901","Ketchikan","AK","55.368644","-131.6762","-9","1"
+"99903","Meyers Chuck","AK","55.742045","-132.25002","-9","1"
+"99918","Coffman Cove","AK","56.009124","-132.82018","-9","1"
+"99919","Thorne Bay","AK","55.677232","-132.55624","-9","1"
+"99921","Craig","AK","55.456449","-133.02648","-9","1"
+"99922","Hydaburg","AK","55.209339","-132.82545","-9","1"
+"99923","Hyder","AK","55.941442","-130.0545","-9","1"
+"99925","Klawock","AK","55.555164","-133.07316","-9","1"
+"99926","Metlakatla","AK","55.123897","-131.56883","-9","1"
+"99927","Point Baker","AK","56.337957","-133.60689","-9","1"
+"99928","Ward Cove","AK","55.395359","-131.67537","-9","1"
+"99929","Wrangell","AK","56.409507","-132.33822","-9","1"
+"99950","Ketchikan","AK","55.875767","-131.46633","-9","1"
diff --git a/extra/webapps/counter/counter.factor b/extra/webapps/counter/counter.factor
new file mode 100644 (file)
index 0000000..3cc1eb5
--- /dev/null
@@ -0,0 +1,30 @@
+USING: math kernel accessors http.server http.server.actions
+http.server.sessions http.server.templating
+http.server.templating.fhtml locals ;
+IN: webapps.counter
+
+SYMBOL: count
+
+TUPLE: counter-app < dispatcher ;
+
+M: counter-app init-session*
+    drop 0 count sset ;
+
+:: <counter-action> ( quot -- action )
+    <action> [
+        count quot schange
+        "" f <standard-redirect>
+    ] >>display ;
+
+: counter-template ( -- template )
+    "resource:extra/webapps/counter/counter.fhtml" <fhtml> ;
+
+: <display-action> ( -- action )
+    <action> [ counter-template serve-template ] >>display ;
+
+: <counter-app> ( -- responder )
+    counter-app new-dispatcher
+        [ 1+ ] <counter-action> "inc" add-responder
+        [ 1- ] <counter-action> "dec" add-responder
+        <display-action> "" add-responder
+    <sessions> ;
diff --git a/extra/webapps/counter/counter.fhtml b/extra/webapps/counter/counter.fhtml
new file mode 100644 (file)
index 0000000..521096f
--- /dev/null
@@ -0,0 +1,10 @@
+<% USING: io math.parser http.server.sessions webapps.counter ; %>
+
+<html>
+    <body>
+        <h1><% count sget number>string write %></h1>
+
+        <a href="inc">++</a>
+        <a href="dec">--</a>
+    </body>
+</html>
diff --git a/extra/webapps/factor-website/factor-website.factor b/extra/webapps/factor-website/factor-website.factor
new file mode 100644 (file)
index 0000000..9b3ce57
--- /dev/null
@@ -0,0 +1,65 @@
+! Copyright (c) 2008 Slava Pestov
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors kernel sequences assocs io.files io.sockets
+namespaces db db.sqlite smtp
+http.server
+http.server.db
+http.server.flows
+http.server.sessions
+http.server.auth.admin
+http.server.auth.login
+http.server.auth.providers.db
+http.server.boilerplate
+http.server.templating.chloe
+webapps.pastebin
+webapps.planet
+webapps.todo ;
+IN: webapps.factor-website
+
+: test-db "resource:test.db" sqlite-db ;
+
+: factor-template ( path -- template )
+    "resource:extra/webapps/factor-website/" swap ".xml" 3append <chloe> ;
+
+: init-factor-db ( -- )
+    test-db [
+        init-users-table
+        init-sessions-table
+
+        init-pastes-table
+        init-annotations-table
+
+        init-blog-table
+
+        init-todo-table
+    ] with-db ;
+
+: <factor-website> ( -- responder )
+    <dispatcher>
+        <todo-list> "todo" add-responder
+        <pastebin> "pastebin" add-responder
+        <planet-factor> "planet" add-responder
+        <user-admin> "user-admin" add-responder
+    <login>
+        users-in-db >>users
+        allow-registration
+        allow-password-recovery
+        allow-edit-profile
+    <boilerplate>
+        "page" factor-template >>template
+    <flows>
+    <sessions>
+    test-db <db-persistence> ;
+
+: init-factor-website ( -- )
+    "factorcode.org" 25 <inet> smtp-server set-global
+    "todo@factorcode.org" lost-password-from set-global
+
+    init-factor-db
+
+    <factor-website> main-responder set-global ;
+
+: start-factor-website
+    test-db start-expiring-sessions
+    "planet" main-responder get responders>> at test-db start-update-task
+    8812 httpd ;
diff --git a/extra/webapps/factor-website/page.css b/extra/webapps/factor-website/page.css
new file mode 100644 (file)
index 0000000..55721d7
--- /dev/null
@@ -0,0 +1,55 @@
+body, button {
+       font:9pt "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif;
+       color:#444;
+}
+
+.link-button {
+       padding: 0px;
+       background: none;
+       border: none;
+}
+
+a, .link {
+       color: #222;
+       border-bottom:1px dotted #666;
+       text-decoration:none;
+}
+
+a:hover, .link:hover {
+       border-bottom:1px solid #66a;
+}
+
+.error { color: #a00; }
+
+.field-label {
+       text-align: right;
+}
+
+.inline {
+       display: inline;
+}
+
+.navbar {
+       background-color: #eee;
+       padding: 5px;
+       border: 1px solid #ccc;
+}
+
+.big-field-label {
+       vertical-align: top;
+}
+
+.description {
+       border: 1px dashed #ccc;
+       background-color: #f5f5f5;
+       padding: 5px;
+       color: #000;
+}
+
+.description p:first-child {
+       margin-top: 0px;
+}
+
+.description p:last-child {
+       margin-bottom: 0px;
+}
diff --git a/extra/webapps/factor-website/page.xml b/extra/webapps/factor-website/page.xml
new file mode 100644 (file)
index 0000000..f708064
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version='1.0' ?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+       <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+               <head>
+                       <t:write-title />
+
+                       <t:style t:include="resource:extra/xmode/code2html/stylesheet.css" />
+
+                       <t:style t:include="resource:extra/webapps/factor-website/page.css" />
+
+                       <t:write-style />
+               </head>
+
+               <body>
+                       <t:call-next-template />
+               </body>
+
+       </t:chloe>
+
+</html>
diff --git a/extra/webapps/pastebin/annotation.xml b/extra/webapps/pastebin/annotation.xml
new file mode 100644 (file)
index 0000000..d5b4ea8
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <h2>Annotation: <t:view t:component="summary" /></h2>
+
+       <table>
+               <tr><th class="field-label">Author:  </th><td><t:view t:component="author"  /></td></tr>
+               <tr><th class="field-label">Mode:    </th><td><t:view t:component="mode"    /></td></tr>
+               <tr><th class="field-label">Date:    </th><td><t:view t:component="date"    /></td></tr>
+       </table>
+
+       <pre class="description"><t:view t:component="contents" /></pre>
+
+       <t:button t:action="$pastebin/delete-annotation" t:for="aid" class="link-button link">Delete Annotation</t:button>
+
+</t:chloe>
diff --git a/extra/webapps/pastebin/authors.txt b/extra/webapps/pastebin/authors.txt
new file mode 100755 (executable)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/webapps/pastebin/new-annotation.xml b/extra/webapps/pastebin/new-annotation.xml
new file mode 100644 (file)
index 0000000..5d18860
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>New Annotation</t:title>
+
+       <t:form t:action="$pastebin/annotate" t:for="id">
+
+               <table>
+                       <tr><th class="field-label">Summary: </th><td><t:edit t:component="summary" /></td></tr>
+                       <tr><th class="field-label">Author: </th><td><t:edit t:component="author" /></td></tr>
+                       <tr><th class="field-label">Mode: </th><td><t:edit t:component="mode" /></td></tr>
+                       <tr><th class="field-label big-field-label">Description:</th><td><t:edit t:component="contents" /></td></tr>
+                       <tr><th class="field-label">Captcha: </th><td><t:edit t:component="captcha" /></td></tr>
+                       <tr>
+                       <td></td>
+                       <td>Leave the captcha blank. Spam-bots will fill it indiscriminantly, so their attempts to register will be blocked.</td>
+                       </tr>
+               </table>
+
+               <input type="SUBMIT" value="Done" />
+       </t:form>
+
+</t:chloe>
diff --git a/extra/webapps/pastebin/new-paste.xml b/extra/webapps/pastebin/new-paste.xml
new file mode 100644 (file)
index 0000000..86daf09
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>New Paste</t:title>
+
+       <t:form t:action="$pastebin/new-paste">
+
+               <table>
+                       <tr><th class="field-label">Summary: </th><td><t:edit t:component="summary" /></td></tr>
+                       <tr><th class="field-label">Author: </th><td><t:edit t:component="author" /></td></tr>
+                       <tr><th class="field-label">Mode: </th><td><t:edit t:component="mode" /></td></tr>
+                       <tr><th class="field-label big-field-label">Description: </th><td><t:edit t:component="contents" /></td></tr>
+                       <tr><th class="field-label">Captcha: </th><td><t:edit t:component="captcha" /></td></tr>
+                       <tr>
+                       <td></td>
+                       <td>Leave the captcha blank. Spam-bots will fill it indiscriminantly, so their attempts to register will be blocked.</td>
+                       </tr>
+               </table>
+
+               <input type="SUBMIT" value="Submit" />
+       </t:form>
+</t:chloe>
diff --git a/extra/webapps/pastebin/paste-list.xml b/extra/webapps/pastebin/paste-list.xml
new file mode 100644 (file)
index 0000000..c91aa6f
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>Pastebin</t:title>
+
+       <table width="100%">
+               <th align="left" width="50%">Summary:</th>
+               <th align="left" width="100">Paste by:</th>
+               <th align="left" width="200">Date:</th>
+
+               <t:summary t:component="pastes" />
+       </table>
+
+</t:chloe>
diff --git a/extra/webapps/pastebin/paste-summary.xml b/extra/webapps/pastebin/paste-summary.xml
new file mode 100644 (file)
index 0000000..c751b11
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <tr>
+               <td><t:a t:href="$pastebin/view-paste" t:query="id"><t:view t:component="summary" /></t:a></td>
+               <td><t:view t:component="author" /></td>
+               <td><t:view t:component="date" /></td>
+       </tr>
+
+</t:chloe>
diff --git a/extra/webapps/pastebin/paste.xml b/extra/webapps/pastebin/paste.xml
new file mode 100644 (file)
index 0000000..9141ee4
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>Paste: <t:view t:component="summary" /></t:title>
+
+       <table>
+               <tr><th class="field-label">Author:  </th><td><t:view t:component="author"  /></td></tr>
+               <tr><th class="field-label">Mode:    </th><td><t:view t:component="mode"    /></td></tr>
+               <tr><th class="field-label">Date:    </th><td><t:view t:component="date"    /></td></tr>
+       </table>
+
+       <pre class="description"><t:view t:component="contents" /></pre>
+
+       <t:button t:action="$pastebin/delete-paste" t:for="id" class="link-button link">Delete Paste</t:button>
+       |
+       <t:a t:href="$pastebin/annotate" t:query="id">Annotate</t:a>
+
+       <t:view t:component="annotations" />
+</t:chloe>
diff --git a/extra/webapps/pastebin/pastebin.css b/extra/webapps/pastebin/pastebin.css
new file mode 100644 (file)
index 0000000..1681477
--- /dev/null
@@ -0,0 +1,7 @@
+pre.code {
+       border:1px dashed #ccc;
+       background-color:#f5f5f5;
+       padding:5px;
+       font-size:150%;
+       color:#000000;
+}
diff --git a/extra/webapps/pastebin/pastebin.factor b/extra/webapps/pastebin/pastebin.factor
new file mode 100644 (file)
index 0000000..a18eb81
--- /dev/null
@@ -0,0 +1,258 @@
+USING: namespaces assocs sorting sequences kernel accessors
+hashtables sequences.lib locals db.types db.tuples db
+calendar calendar.format rss xml.writer
+xmode.catalog
+http.server
+http.server.crud
+http.server.actions
+http.server.components
+http.server.components.code
+http.server.templating.chloe
+http.server.auth
+http.server.auth.login
+http.server.boilerplate
+http.server.validators
+http.server.forms ;
+IN: webapps.pastebin
+
+: <mode> ( id -- component )
+    modes keys natural-sort <choice> ;
+
+: pastebin-template ( name -- template )
+    "resource:extra/webapps/pastebin/" swap ".xml" 3append <chloe> ;
+
+TUPLE: paste id summary author mode date contents annotations captcha ;
+
+paste "PASTE"
+{
+    { "id" "ID" INTEGER +db-assigned-id+ }
+    { "summary" "SUMMARY" { VARCHAR 256 } +not-null+ }
+    { "author" "AUTHOR" { VARCHAR 256 } +not-null+ }
+    { "mode" "MODE" { VARCHAR 256 } +not-null+ }
+    { "date" "DATE" DATETIME +not-null+ }
+    { "contents" "CONTENTS" TEXT +not-null+ }
+} define-persistent
+
+: <paste> ( id -- paste )
+    paste new
+        swap >>id ;
+
+: pastes ( -- pastes )
+    f <paste> select-tuples ;
+
+TUPLE: annotation aid id summary author mode contents date captcha ;
+
+annotation "ANNOTATION"
+{
+    { "aid" "AID" INTEGER +db-assigned-id+ }
+    { "id" "ID" INTEGER +not-null+ }
+    { "summary" "SUMMARY" { VARCHAR 256 } +not-null+ }
+    { "author" "AUTHOR" { VARCHAR 256 } +not-null+ }
+    { "mode" "MODE" { VARCHAR 256 } +not-null+ }
+    { "date" "DATE" DATETIME +not-null+ }
+    { "contents" "CONTENTS" TEXT +not-null+ }
+} define-persistent
+
+: <annotation> ( id aid -- annotation )
+    annotation new
+        swap >>aid
+        swap >>id ;
+
+: fetch-annotations ( paste -- paste )
+    dup annotations>> [
+        dup id>> f <annotation> select-tuples >>annotations
+    ] unless ;
+
+: <annotation-form> ( -- form )
+    "paste" <form>
+        "id" <integer>
+            hidden >>renderer
+            add-field
+        "aid" <integer>
+            hidden >>renderer
+            add-field
+        "annotation" pastebin-template >>view-template
+        "summary" <string> add-field
+        "author" <string> add-field
+        "mode" <mode> add-field
+        "contents" "mode" <code> add-field
+        "date" <date> add-field ;
+
+: <new-annotation-form> ( -- form )
+    "paste" <form>
+        "new-annotation" pastebin-template >>edit-template
+        "id" <integer>
+            hidden >>renderer
+            t >>required add-field
+        "summary" <string>
+            t >>required add-field
+        "author" <string>
+            t >>required
+            add-field
+        "mode" <mode>
+            "factor" >>default
+            t >>required
+            add-field
+        "contents" "mode" <code>
+            t >>required add-field
+        "captcha" <captcha> add-field ;
+
+: <paste-form> ( -- form )
+    "paste" <form>
+        "paste" pastebin-template >>view-template
+        "paste-summary" pastebin-template >>summary-template
+        "id" <integer>
+            hidden >>renderer add-field
+        "summary" <string> add-field
+        "author" <string> add-field
+        "mode" <mode> add-field
+        "date" <date> add-field
+        "contents" "mode" <code> add-field
+        "annotations" <annotation-form> +plain+ <list> add-field ;
+
+: <new-paste-form> ( -- form )
+    "paste" <form>
+        "new-paste" pastebin-template >>edit-template
+        "summary" <string>
+            t >>required add-field
+        "author" <string>
+            t >>required add-field
+        "mode" <mode>
+            "factor" >>default
+            t >>required
+            add-field
+        "contents" "mode" <code>
+            t >>required add-field
+        "captcha" <captcha> add-field ;
+
+: <paste-list-form> ( -- form )
+    "pastebin" <form>
+        "paste-list" pastebin-template >>view-template
+        "pastes" <paste-form> +plain+ <list> add-field ;
+
+:: <paste-list-action> ( -- action )
+    [let | form [ <paste-list-form> ] |
+        <action>
+            [
+                blank-values
+
+                pastes "pastes" set-value
+
+                form view-form
+            ] >>display
+    ] ;
+
+:: <annotate-action> ( form ctor next -- action )
+    <action>
+        { { "id" [ v-number ] } } >>get-params
+
+        [
+            "id" get f ctor call
+
+            from-tuple form set-defaults
+        ] >>init
+
+        [ form edit-form ] >>display
+
+        [
+            f f ctor call from-tuple
+
+            form validate-form
+
+            values-tuple insert-tuple
+
+            "id" value next <id-redirect>
+        ] >>submit ;
+
+: pastebin-feed-entries ( -- entries )
+    pastes <reversed> 20 short head [
+        [ summary>> ]
+        [ "$pastebin/view-paste" swap id>> "id" associate link>string ]
+        [ date>> ] tri
+        f swap <entry>
+    ] map ;
+
+: pastebin-feed ( -- feed )
+    feed new
+        "Factor Pastebin" >>title
+        "http://paste.factorcode.org" >>link
+        pastebin-feed-entries >>entries ;
+
+: <feed-action> ( -- action )
+    <action>
+        [
+            "text/xml" <content>
+            [ pastebin-feed feed>xml write-xml ] >>body
+        ] >>display ;
+
+:: <view-paste-action> ( form ctor -- action )
+    <action>
+        { { "id" [ v-number ] } } >>get-params
+
+        [ "id" get ctor call select-tuple fetch-annotations from-tuple ] >>init
+
+        [ form view-form ] >>display ;
+
+:: <delete-paste-action> ( ctor next -- action )
+    <action>
+        { { "id" [ v-number ] } } >>post-params
+
+        [
+            "id" get ctor call delete-tuples
+
+            "id" get f <annotation> delete-tuples
+
+            next f <permanent-redirect>
+        ] >>submit ;
+
+:: <delete-annotation-action> ( ctor next -- action )
+    <action>
+        { { "aid" [ v-number ] } } >>post-params
+
+        [
+            f "aid" get ctor call select-tuple
+            [ delete-tuples ] [ id>> next <id-redirect> ] bi
+        ] >>submit ;
+
+:: <new-paste-action> ( form ctor next -- action )
+    <action>
+        [
+            f ctor call from-tuple
+
+            form set-defaults
+        ] >>init
+
+        [ form edit-form ] >>display
+
+        [
+            f ctor call from-tuple
+
+            form validate-form
+
+            values-tuple insert-tuple
+
+            "id" value next <id-redirect>
+        ] >>submit ;
+
+TUPLE: pastebin < dispatcher ;
+
+SYMBOL: can-delete-pastes?
+
+can-delete-pastes? define-capability
+
+: <pastebin> ( -- responder )
+    pastebin new-dispatcher
+        <paste-list-action> "list" add-main-responder
+        <feed-action> "feed.xml" add-responder
+        <paste-form> [ <paste> ] <view-paste-action> "view-paste" add-responder
+        [ <paste> ] "$pastebin/list" <delete-paste-action> { can-delete-pastes? } <protected> "delete-paste" add-responder
+        [ <annotation> ] "$pastebin/view-paste" <delete-annotation-action> { can-delete-pastes? } <protected> "delete-annotation" add-responder
+        <paste-form> [ <paste> ]    <view-paste-action>     "$pastebin/view-paste"   add-responder
+        <new-paste-form> [ <paste> now >>date ] "$pastebin/view-paste" <new-paste-action>     "new-paste"    add-responder
+        <new-annotation-form> [ <annotation> now >>date ] "$pastebin/view-paste" <annotate-action> "annotate" add-responder
+    <boilerplate>
+        "pastebin" pastebin-template >>template ;
+
+: init-pastes-table paste ensure-table ;
+
+: init-annotations-table annotation ensure-table ;
diff --git a/extra/webapps/pastebin/pastebin.xml b/extra/webapps/pastebin/pastebin.xml
new file mode 100644 (file)
index 0000000..7ca4c95
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:atom t:title="Pastebin - Atom" t:href="$pastebin/feed.xml" />
+
+       <t:style t:include="resource:extra/webapps/pastebin/pastebin.css" />
+
+       <div class="navbar">
+                 <t:a t:href="$pastebin/list">Pastes</t:a>
+               | <t:a t:href="$pastebin/new-paste">New Paste</t:a>
+               | <t:a t:href="$pastebin/feed.xml">Atom Feed</t:a>
+
+               <t:if t:code="http.server.sessions:uid">
+
+                       <t:if t:code="http.server.auth.login:allow-edit-profile?">
+                               | <t:a t:href="$login/edit-profile" t:flow="begin">Edit Profile</t:a>
+                       </t:if>
+
+                       | <t:button t:action="$login/logout" t:flow="begin" class="link-button link">Logout</t:button>
+
+               </t:if>
+
+       </div>
+
+       <h1><t:write-title /></h1>
+
+        <t:call-next-template />
+
+</t:chloe>
diff --git a/extra/webapps/planet/admin.xml b/extra/webapps/planet/admin.xml
new file mode 100644 (file)
index 0000000..c79fe2e
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>Planet Factor Administration</t:title>
+
+       <t:summary t:component="blogroll" />
+
+       <p>
+               <t:a t:href="$planet-factor/admin/edit-blog">Add Blog</t:a>
+               | <t:a t:href="$planet-factor/admin/update">Update</t:a>
+       </p>
+
+</t:chloe>
diff --git a/extra/webapps/planet/blog-admin-link.xml b/extra/webapps/planet/blog-admin-link.xml
new file mode 100644 (file)
index 0000000..8d6c890
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:a t:href="$planet-factor/admin/edit-blog" t:query="id"><t:view t:component="name" /></t:a>
+
+</t:chloe>
diff --git a/extra/webapps/planet/blog-summary.xml b/extra/webapps/planet/blog-summary.xml
deleted file mode 100644 (file)
index 712db4b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version='1.0' ?>
-
-<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
-
-       <t:a href="view-blog" query="id"><t:view component="name" /></t:a>
-
-</t:chloe>
index 890b23dcce137594995d5dd4e2bb39cea32e4afd..ebfccc47de901e7584073f97c2ab309c04b012f9 100644 (file)
@@ -4,25 +4,23 @@
 
        <t:title>Edit Blog</t:title>
 
-       <t:form action="edit-blog">
-
-               <t:edit component="id" />
+       <t:form t:action="$planet-factor/admin/edit-blog" t:for="id">
 
                <table>
 
                        <tr>
                                <th class="field-label">Blog name:</th>
-                               <td><t:edit component="name" /></td>
+                               <td><t:edit t:component="name" /></td>
                        </tr>
 
                        <tr>
                                <th class="field-label">Home page:</th>
-                               <td><t:edit component="www-url" /></td>
+                               <td><t:edit t:component="www-url" /></td>
                        </tr>
 
                        <tr>
-                               <th class="field-label">Atom feed:</th>
-                               <td><t:edit component="atom-url" /></td>
+                               <th class="field-label">Feed:</th>
+                               <td><t:edit t:component="feed-url" /></td>
                        </tr>
 
                </table>
 
        </t:form>
 
-       <t:a href="view" query="id">View</t:a>
-       |
-       <t:form action="delete-blog" class="inline">
-               <t:edit component="id" />
-               <button type="submit" class="link-button link">Delete</button>
-       </t:form>
+       <t:button t:action="$planet-factor/admin/delete-blog" t:for="id" class="link-button link">Delete</t:button>
 </t:chloe>
index a87703252c0f1c7887553745d406cf7c8a43977a..741b12345679e59bf8c8c9136be8c72201193f1c 100644 (file)
@@ -3,8 +3,8 @@
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
 
        <p class="news">
-               <strong><t:view component="title" /></strong> <br/>
-               <t:a value="link" class="more">Read More...</t:a>
+               <strong><t:view t:component="title" /></strong> <br/>
+               <t:a value="link" t:session="none" class="more">Read More...</t:a>
        </p>
 
 </t:chloe>
index a9383d16f2c363a2a45ef02532e6ccb011202d20..5e437173849549e961fcb3b3fbde05a385a7d61f 100644 (file)
@@ -2,8 +2,16 @@
 
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
 
-       <h2 class="posting-title"><t:view component="title" /></h2>
-       <p class="posting-body"> <t:view component="description" /> </p>
-       <p class="posting-date"> <t:view component="pub-date" /> </p>
+       <h2 class="posting-title">
+               <t:a t:value="link" t:session="none"><t:view t:component="title" /></t:a>
+       </h2>
+
+       <p class="posting-body">
+               <t:view t:component="description" />
+       </p>
+
+       <p class="posting-date">
+               <t:a t:value="link" t:session="none"><t:view t:component="pub-date" /></t:a>
+       </p>
 
 </t:chloe>
diff --git a/extra/webapps/planet/mini-planet.xml b/extra/webapps/planet/mini-planet.xml
deleted file mode 100644 (file)
index 950191e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version='1.0' ?>
-
-<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
-
-       <t:summary component="postings" />
-
-</t:chloe>
diff --git a/extra/webapps/planet/page.xml b/extra/webapps/planet/page.xml
deleted file mode 100644 (file)
index 1278c81..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version='1.0' ?>
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-       <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
-
-               <head>
-                       <t:write-title />
-
-                       <t:write-atom />
-
-                       <t:style>
-                               .link-button {
-                                       padding: 0px;
-                                       background: none;
-                                       border: none;
-                               }
-
-                               .inline {
-                                       display: inline;
-                               }
-
-                               body, button {
-                                       font:9pt "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif;
-                                       color:#444;
-                               }
-
-                               a, .link {
-                                       color: #222;
-                                       border-bottom:1px dotted #666;
-                                       text-decoration:none;
-                               }
-
-                               h1 a {
-                                       border: none;
-                               }
-
-                               a:hover, .link:hover {
-                                       border-bottom:1px solid #66a;
-                               }
-
-                               .error { color: #a00; }
-                               
-                               .field-label {
-                                       text-align: right;
-                               }
-                       </t:style>
-
-                       <t:write-style />
-               </head>
-
-               <body>
-
-                       <h1><t:a href="planet"><t:write-title /></t:a></h1>
-
-                       <t:call-next-template />
-               </body>
-
-       </t:chloe>
-
-</html>
index 966bcc1d0bc9966446676d9304e3080397992972..c8aeab35a8f8b865b9a7165ec5653ba26b951229 100755 (executable)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel accessors sequences sorting locals math
-calendar alarms logging concurrency.combinators
-db.types db.tuples db
+USING: kernel accessors sequences sorting locals math math.order
+calendar alarms logging concurrency.combinators namespaces
+sequences.lib db.types db.tuples db fry
 rss xml.writer
 http.server
 http.server.crud
@@ -10,17 +10,28 @@ http.server.forms
 http.server.actions
 http.server.boilerplate
 http.server.templating.chloe
-http.server.components ;
+http.server.components
+http.server.auth.login
+http.server.auth ;
 IN: webapps.planet
 
-TUPLE: blog id name www-url atom-url ;
+TUPLE: planet-factor < dispatcher postings ;
+
+: planet-template ( name -- template )
+    "resource:extra/webapps/planet/" swap ".xml" 3append <chloe> ;
+
+TUPLE: blog id name www-url feed-url ;
+
+M: blog link-title name>> ;
+
+M: blog link-href www-url>> ;
 
 blog "BLOGS"
 {
-    { "id" "ID" INTEGER +native-id+ }
+    { "id" "ID" INTEGER +db-assigned-id+ }
     { "name" "NAME" { VARCHAR 256 } +not-null+ }
     { "www-url" "WWWURL" { VARCHAR 256 } +not-null+ }
-    { "atom-url" "ATOMURL" { VARCHAR 256 } +not-null+ }
+    { "feed-url" "FEEDURL" { VARCHAR 256 } +not-null+ }
 } define-persistent
 
 : init-blog-table blog ensure-table ;
@@ -29,8 +40,8 @@ blog "BLOGS"
     blog new
         swap >>id ;
 
-: planet-template ( name -- template )
-    "resource:extra/webapps/planet/" swap ".xml" 3append <chloe> ;
+: blogroll ( -- seq )
+    f <blog> select-tuples [ [ name>> ] compare ] sort ;
 
 : <entry-form> ( -- form )
     "entry" <form>
@@ -43,8 +54,7 @@ blog "BLOGS"
 : <blog-form> ( -- form )
     "blog" <form>
         "edit-blog" planet-template >>edit-template
-        "view-blog" planet-template >>view-template
-        "blog-summary" planet-template >>summary-template
+        "blog-admin-link" planet-template >>summary-template
         "id" <integer>
             hidden >>renderer
             add-field
@@ -54,21 +64,33 @@ blog "BLOGS"
         "www-url" <url>
             t >>required
             add-field
-        "atom-url" <url>
+        "feed-url" <url>
             t >>required
             add-field ;
 
 : <planet-factor-form> ( -- form )
     "planet-factor" <form>
-        "planet" planet-template >>view-template
-        "mini-planet" planet-template >>summary-template
+        "postings" planet-template >>view-template
+        "postings-summary" planet-template >>summary-template
         "postings" <entry-form> +plain+ <list> add-field
+        "blogroll" "blog" <link> +unordered+ <list> add-field ;
+
+: <admin-form> ( -- form )
+    "admin" <form>
+        "admin" planet-template >>view-template
         "blogroll" <blog-form> +unordered+ <list> add-field ;
 
-: blogroll ( -- seq )
-    f <blog> select-tuples [ [ name>> ] compare ] sort ;
+:: <edit-blogroll-action> ( planet -- action )
+    [let | form [ <admin-form> ] |
+        <action>
+            [
+                blank-values
 
-TUPLE: planet-factor < dispatcher postings ;
+                blogroll "blogroll" set-value
+
+                form view-form
+            ] >>display
+    ] ;
 
 :: <planet-action> ( planet -- action )
     [let | form [ <planet-factor-form> ] |
@@ -83,14 +105,11 @@ TUPLE: planet-factor < dispatcher postings ;
             ] >>display
     ] ;
 
-: safe-head ( seq n -- seq' )
-    over length min head ;
-
 :: planet-feed ( planet -- feed )
     feed new
-        "[ planet-factor ]" >>title
+        "Planet Factor" >>title
         "http://planet.factorcode.org" >>link
-        planet postings>> 30 safe-head >>entries ;
+        planet postings>> 16 short head >>entries ;
 
 :: <feed-action> ( planet -- action )
     <action>
@@ -109,7 +128,7 @@ TUPLE: planet-factor < dispatcher postings ;
 
 : fetch-blogroll ( blogroll -- entries )
     dup
-    [ atom-url>> fetch-feed ] parallel-map
+    [ feed-url>> fetch-feed ] parallel-map
     [ >r name>> r> [ <posting> ] with map ] 2map concat ;
 
 : sort-entries ( entries -- entries' )
@@ -117,7 +136,8 @@ TUPLE: planet-factor < dispatcher postings ;
 
 : update-cached-postings ( planet -- )
     "webapps.planet" [
-        blogroll fetch-blogroll sort-entries >>postings drop
+        blogroll fetch-blogroll sort-entries 8 short head
+        >>postings drop
     ] with-logging ;
 
 :: <update-action> ( planet -- action )
@@ -127,48 +147,35 @@ TUPLE: planet-factor < dispatcher postings ;
             "" f <temporary-redirect>
         ] >>display ;
 
-: start-update-task ( planet -- )
-    [ update-cached-postings ] curry 10 minutes every drop ;
-
-:: <planet-factor> ( -- responder )
+:: <planet-factor-admin> ( planet-factor -- responder )
     [let | blog-form [ <blog-form> ]
            blog-ctor [ [ <blog> ] ] |
-        planet-factor new-dispatcher
-            dup <planet-action> >>default
-            dup <feed-action> "feed.xml" add-responder
-            dup <update-action> "update" add-responder
+        <dispatcher>
+            planet-factor <edit-blogroll-action> >>default
+
+            planet-factor <update-action> "update" add-responder
 
             ! Administrative CRUD
-                      blog-ctor ""          <delete-action> "delete-blog" add-responder
-            blog-form blog-ctor             <view-action>   "view-blog"   add-responder
-            blog-form blog-ctor "view-blog" <edit-action>   "edit-blog"   add-responder
+                      blog-ctor "$planet-factor/admin"          <delete-action> "delete-blog" add-responder
+            blog-form blog-ctor "$planet-factor/admin" <edit-action>   "edit-blog"   add-responder
     ] ;
 
-USING: namespaces io.files io.sockets
-db.sqlite smtp
-http.server.db
-http.server.sessions
-http.server.auth.login
-http.server.auth.providers.db
-http.server.sessions.storage.db ;
+SYMBOL: can-administer-planet-factor?
 
-: test-db "planet.db" resource-path sqlite-db ;
+can-administer-planet-factor? define-capability
 
-: <planet-app> ( -- responder )
-    <planet-factor>
+: <planet-factor> ( -- responder )
+    planet-factor new-dispatcher
+        dup <planet-action> "list" add-main-responder
+        dup <feed-action> "feed.xml" add-responder
+        dup <planet-factor-admin> { can-administer-planet-factor? } <protected> "admin" add-responder
     <boilerplate>
-        "page" planet-template >>template
-    ! <url-sessions>
-    !     sessions-in-db >>sessions
-    test-db <db-persistence> ;
-
-: init-planet ( -- )
-    ! test-db [
-    !     init-blog-table
-        ! init-users-table
-        ! init-sessions-table
-    ! ] with-db
-
-    <dispatcher>
-        <planet-app> "planet" add-responder
-    main-responder set-global ;
+        "planet" planet-template >>template ;
+
+: start-update-task ( planet db seq -- )
+    '[
+        , , , [
+            dup filter-responder? [ responder>> ] when
+            update-cached-postings
+        ] with-db
+    ] 10 minutes every drop ;
index dc762fafc6398bdc98dd4425ff9b1902edd59764..29609e12ba6873829d1c980fe7c07399f2495bee 100644 (file)
@@ -2,36 +2,24 @@
 
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
 
-       <t:title>Planet Factor</t:title>
+       <t:style t:include="resource:extra/webapps/planet/planet.css" />
 
-       <t:atom title="Planet Factor - Atom" href="feed.xml" />
+       <div class="navbar">
+                 <t:a t:href="$planet-factor/list">Front Page</t:a>
+               | <t:a t:href="$planet-factor/feed.xml">Atom Feed</t:a>
+               | <t:a t:href="$planet-factor/admin">Admin</t:a>
 
-       <t:style include="resource:extra/webapps/planet/planet.css" />
+               <t:if t:code="http.server.sessions:uid">
+                       <t:if t:code="http.server.auth.login:allow-edit-profile?">
+                               | <t:a t:href="$login/edit-profile" t:flow="begin">Edit Profile</t:a>
+                       </t:if>
+       
+                       | <t:button t:action="$login/logout" t:flow="begin" class="link-button link">Logout</t:button>
+               </t:if>
+       </div>
 
-       <table width="100%" cellpadding="10">
-               <tr>
-                       <td> <t:view component="postings" /> </td>
+       <h1><t:write-title /></h1>
 
-                       <td valign="top" width="25%" class="infobox">
-                               <p>
-                                       <strong>planet-factor</strong> is an Atom feed aggregator that collects the
-                                       contents of <a href="http://factorcode.org/">Factor</a>-related blogs. It was inspired by
-                                       <a href="http://planet.lisp.org">Planet Lisp</a>.
-                               </p>
-                               <p>
-                                       <img src="http://planet.lisp.org/feed-icon-14x14.png" />
-                                       <a href="feed.xml"> Syndicate </a>
-                               </p>
-
-                               <h2>Blogroll</h2>
-
-                               <t:summary component="blogroll" />
-
-                               Admin: <t:a href="edit-blog">Add Blog</t:a>
-                               |
-                               <t:a href="update">Update</t:a>
-                       </td>
-               </tr>
-       </table>
+        <t:call-next-template />
 
 </t:chloe>
diff --git a/extra/webapps/planet/postings-summary.xml b/extra/webapps/planet/postings-summary.xml
new file mode 100644 (file)
index 0000000..765c3a8
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:summary t:component="postings" />
+
+</t:chloe>
diff --git a/extra/webapps/planet/postings.xml b/extra/webapps/planet/postings.xml
new file mode 100644 (file)
index 0000000..c2c73d7
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version='1.0' ?>
+
+<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
+
+       <t:title>Planet Factor</t:title>
+
+       <table width="100%" cellpadding="10">
+                <tr>
+                        <td> <t:view t:component="postings" /> </td>
+  
+                        <td valign="top" width="25%" class="infobox">
+                                <h2>Blogroll</h2>
+  
+                                <t:summary t:component="blogroll" />
+                        </td>
+                </tr>
+        </table>
+
+</t:chloe>
diff --git a/extra/webapps/planet/view-blog.xml b/extra/webapps/planet/view-blog.xml
deleted file mode 100644 (file)
index fbc03af..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version='1.0' ?>
-
-<t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
-
-       <t:title>View Blog</t:title>
-
-       <table>
-
-               <tr>
-                       <th class="field-label">Blog name:</th>
-                       <td><t:view component="name" /></td>
-               </tr>
-
-               <tr>
-                       <th class="field-label">Home page:</th>
-                       <td>
-                               <t:a value="www-url">
-                                       <t:view component="www-url" />
-                               </t:a>
-                       </td>
-               </tr>
-
-               <tr>
-                       <th class="field-label">Atom feed:</th>
-                       <td>
-                               <t:a value="atom-url">
-                                       <t:view component="atom-url" />
-                               </t:a>
-                       </td>
-               </tr>
-
-       </table>
-
-       <t:a href="edit-blog" query="id">Edit</t:a>
-       |
-       <t:form action="delete-blog" class="inline">
-               <t:edit component="id" />
-               <button type="submit" class="link-button link">Delete</button>
-       </t:form>
-
-</t:chloe>
index 71d6900f1a8a16ab9333ab91f3b6dad75bc588bf..e1d4c40e236bb0a372f0c3aa98b8b4b601f4d7c1 100644 (file)
@@ -4,23 +4,22 @@
 
        <t:title>Edit Item</t:title>
 
-       <t:form action="edit">
-               <t:edit component="id" />
-
+       <t:form t:action="$todo-list/edit" t:for="id">
                <table>
-                       <tr><th class="field-label">Summary:    </th><td><t:edit component="summary"     /></td></tr>
-                       <tr><th class="field-label">Priority:   </th><td><t:edit component="priority"    /></td></tr>
-                       <tr><th class="field-label big-field-label">Description:</th><td><t:edit component="description" /></td></tr>
+                       <tr><th class="field-label">Summary: </th><td><t:edit t:component="summary" /></td></tr>
+                       <tr><th class="field-label">Priority: </th><td><t:edit t:component="priority" /></td></tr>
+                       <tr><th class="field-label big-field-label">Description:</th><td><t:edit t:component="description" /></td></tr>
                </table>
 
                <input type="SUBMIT" value="Done" />
        </t:form>
 
-       <t:a href="view" query="id">View</t:a>
-       |
-       <t:form action="delete" class="inline">
-               <t:edit component="id" />
-               <button type="submit" class="link-button link">Delete</button>
-       </t:form>
+       <t:if t:value="id">
+       
+               <t:a t:href="$todo-list/view" t:query="id">View</t:a>
+               |
+               <t:button t:action="$todo-list/delete" t:for="id" class="link-button link">Delete</t:button>
+               
+       </t:if>
 
 </t:chloe>
diff --git a/extra/webapps/todo/page.xml b/extra/webapps/todo/page.xml
deleted file mode 100644 (file)
index f40c79d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version='1.0' ?>
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-
-       <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
-
-               <head>
-                       <t:write-title />
-
-                       <t:style>
-                               body, button {
-                                       font:9pt "Lucida Grande", "Lucida Sans Unicode", verdana, geneva, sans-serif;
-                                       color:#444;
-                               }
-
-                               a, .link {
-                                       color: #222;
-                                       border-bottom:1px dotted #666;
-                                       text-decoration:none;
-                               }
-                               
-                               a:hover, .link:hover {
-                                       border-bottom:1px solid #66a;
-                               }
-
-                               .error { color: #a00; }
-                               
-                               .field-label {
-                                       text-align: right;
-                               }
-                       </t:style>
-
-                       <t:write-style />
-               </head>
-
-               <body>
-                       <t:call-next-template />
-               </body>
-
-       </t:chloe>
-
-</html>
index 1887fccdc1f3cb7ddbc9f95f9b83d1b2ef7593ce..66abeafc868b7a6c5058ce633285b6dc042b7a6d 100644 (file)
@@ -6,7 +6,7 @@
 
        <table class="todo-list">
                <tr><th>Summary</th><th>Priority</th><th>View</th><th>Edit</th></tr>
-               <t:summary component="list" />
+               <t:summary t:component="list" />
        </table>
 
 </t:chloe>
index 9e03b7f1354f0b6f8dd6655f2e3a81d32a3dd1a7..056c9cab0aabc94302847fe99161f039fc87e390 100644 (file)
@@ -4,16 +4,16 @@
 
        <tr>
                <td>
-                       <t:view component="summary" />
+                       <t:view t:component="summary" />
                </td>
                <td>
-                       <t:view component="priority" />
+                       <t:view t:component="priority" />
                </td>
                <td>
-                       <t:a href="view" query="id">View</t:a>
+                       <t:a t:href="$todo-list/view" t:query="id">View</t:a>
                </td>
                <td>
-                       <t:a href="edit" query="id">Edit</t:a>
+                       <t:a t:href="$todo-list/edit" t:query="id">Edit</t:a>
                </td>
        </tr>
 
index c2e8a7fd79cdba6bf242fec3ae4d25264f072b72..26a0fe09607304f1ef4edca6386cf076e8f5b48c 100644 (file)
@@ -1,31 +1,3 @@
-.big-field-label {
-       vertical-align: top;
-}
-
-.description {
-       border: 1px dashed #ccc;
-       background-color: #f5f5f5;
-       padding: 5px;
-       font-size: 150%;
-       color: #000000;
-}
-
-.link-button {
-       padding: 0px;
-       background: none;
-       border: none;
-}
-
-.navbar {
-       background-color: #eeeeee;
-       padding: 5px;
-       border: 1px solid #ccc;
-}
-
-.inline {
-       display: inline;
-}
-
 pre {
        font-size: 75%;
 }
index 917b9bf7a7546850fb18305d5963c803d68e5c85..8bfda1aad563f862c2b7787f00172748e92c6b26 100755 (executable)
@@ -1,11 +1,18 @@
 ! Copyright (c) 2008 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors kernel locals sequences
+USING: accessors kernel locals sequences namespaces
 db db.types db.tuples
-http.server.components http.server.components.farkup
-http.server.forms http.server.templating.chloe
-http.server.boilerplate http.server.crud http.server.auth
-http.server.actions http.server.db
+http.server.sessions
+http.server.components
+http.server.components.farkup
+http.server.forms
+http.server.templating.chloe
+http.server.boilerplate
+http.server.crud
+http.server.auth
+http.server.actions
+http.server.db
+http.server.auth.login
 http.server ;
 IN: webapps.todo
 
@@ -14,7 +21,7 @@ TUPLE: todo uid id priority summary description ;
 todo "TODO"
 {
     { "uid" "UID" { VARCHAR 256 } +not-null+ }
-    { "id" "ID" +native-id+ }
+    { "id" "ID" +db-assigned-id+ }
     { "priority" "PRIORITY" INTEGER +not-null+ }
     { "summary" "SUMMARY" { VARCHAR 256 } +not-null+ }
     { "description" "DESCRIPTION" { VARCHAR 256 } }
@@ -56,58 +63,18 @@ todo "TODO"
         "list" <todo-form> +plain+ <list>
         add-field ;
 
-TUPLE: todo-responder < dispatcher ;
+TUPLE: todo-list < dispatcher ;
 
-:: <todo-responder> ( -- responder )
+:: <todo-list> ( -- responder )
     [let | todo-form [ <todo-form> ]
            list-form [ <todo-list-form> ]
            ctor [ [ <todo> ] ] |
-        todo-responder new-dispatcher
+        todo-list new-dispatcher
             list-form ctor        <list-action>   "list"   add-main-responder
             todo-form ctor        <view-action>   "view"   add-responder
-            todo-form ctor "view" <edit-action>   "edit"   add-responder
-                      ctor "list" <delete-action> "delete" add-responder
+            todo-form ctor "$todo-list/view" <edit-action>   "edit"   add-responder
+                      ctor "$todo-list/list" <delete-action> "delete" add-responder
         <boilerplate>
             "todo" todo-template >>template
+        f <protected>
     ] ;
-
-! What follows below is somewhat akin to a 'deployment descriptor'
-! for the todo application. The <todo-responder> can be integrated
-! into an existing web app that provides session management and
-! login facilities, or <todo-app> can be used to run a
-! self-contained todo instance.
-USING: namespaces io.files io.sockets
-db.sqlite smtp
-http.server.sessions
-http.server.auth.login
-http.server.auth.providers.db
-http.server.sessions.storage.db ;
-
-: test-db "todo.db" resource-path sqlite-db ;
-
-: <todo-app> ( -- responder )
-    <todo-responder>
-    <login>
-        users-in-db >>users
-        allow-registration
-        allow-password-recovery
-        allow-edit-profile
-    <boilerplate>
-        "page" todo-template >>template
-    <url-sessions>
-        sessions-in-db >>sessions
-    test-db <db-persistence> ;
-
-: init-todo ( -- )
-    "factorcode.org" 25 <inet> smtp-server set-global
-    "todo@factorcode.org" lost-password-from set-global
-
-    test-db [
-        init-todo-table
-        init-users-table
-        init-sessions-table
-    ] with-db
-
-    <dispatcher>
-        <todo-app> "todo" add-responder
-    main-responder set-global ;
index 81a5d3a42588aa3908afb29db32906525f76ee53..651e29d867279af213a8d410d8c65cdc26cfb823 100644 (file)
@@ -2,21 +2,17 @@
 
 <t:chloe xmlns:t="http://factorcode.org/chloe/1.0">
 
-       <t:style include="resource:extra/webapps/todo/todo.css" />
-
-       <t:style include="resource:extra/xmode/code2html/stylesheet.css" />
+       <t:style t:include="resource:extra/webapps/todo/todo.css" />
 
        <div class="navbar">
-                 <t:a href="list">List Items</t:a>
-               | <t:a href="edit">Add Item</t:a>
+                 <t:a t:href="$todo-list/list">List Items</t:a>
+               | <t:a t:href="$todo-list/edit">Add Item</t:a>
 
-               <t:if code="http.server.auth.login:allow-edit-profile?">
-                       | <t:a href="edit-profile">Edit Profile</t:a>
+               <t:if t:code="http.server.auth.login:allow-edit-profile?">
+                       | <t:a t:href="$login/edit-profile" t:flow="begin">Edit Profile</t:a>
                </t:if>
 
-               <t:form action="logout" class="inline">
-                       | <button type="submit" class="link-button link">Logout</button>
-               </t:form>
+               <t:button t:action="$login/logout" t:flow="begin" class="link-button link">Logout</t:button>
        </div>
 
        <h1><t:write-title /></h1>
index fea77c1189fa4522e27510ed1ddd9387b3bc8797..8c90ba9056bc7473164494ac81060d5649e76e60 100644 (file)
@@ -5,19 +5,16 @@
        <t:title>View Item</t:title>
 
        <table>
-               <tr><th class="field-label">Summary:    </th><td><t:view component="summary"     /></td></tr>
-               <tr><th class="field-label">Priority:   </th><td><t:view component="priority"    /></td></tr>
+               <tr><th class="field-label">Summary:    </th><td><t:view t:component="summary"     /></td></tr>
+               <tr><th class="field-label">Priority:   </th><td><t:view t:component="priority"    /></td></tr>
        </table>
 
        <div class="description">
-               <t:view component="description" />
+               <t:view t:component="description" />
        </div>
 
-       <t:a href="edit" query="id">Edit</t:a>
+       <t:a t:href="$todo-list/edit" t:query="id">Edit</t:a>
        |
-       <t:form action="delete" class="inline">
-               <t:edit component="id" />
-               <button class="link-button link">Delete</button>
-       </t:form>
+       <t:button t:action="$todo-list/delete" t:for="id" class="link-button link">Delete</t:button>
 
 </t:chloe>
index 901a88675fec4707b33b50fafdb2b9f42cb34481..68663b4cdbc6f1a3377dda975386b321d641ac2d 100644 (file)
@@ -4,7 +4,7 @@ IN: windows.com
 \r
 HELP: com-query-interface\r
 { $values { "interface" "Pointer to a COM interface implementing " { $snippet "IUnknown" } } { "iid" "An interface GUID (IID)" } { "interface'" "Pointer to a COM interface implementing the interface indicated by " { $snippet "iid" } } }\r
-{ $description "A small wrapper around " { $link IUnknown::QueryInterface } ". Queries " { $snippet "interface" } " to see if it implements the interface indicated by " { $snippet "iid" } ". Returns a pointer to the " { $snippet "iid" } " interface if implemented, or raises an error if the object does not implement the interface.\n\nCOM memory management conventions state that the returned pointer must be immediately retained using " { $link com-add-ref } ". The pointer must then be released using " { $link com-release } " when it is no longer needed." } ;\r
+{ $description "A small wrapper around " { $link IUnknown::QueryInterface } ". Queries " { $snippet "interface" } " to see if it implements the interface indicated by " { $snippet "iid" } ". Returns a pointer to the " { $snippet "iid" } " interface if implemented, or raises an error if the object does not implement the interface.\n\nCOM memory management conventions state that the returned pointer must be released using " { $link com-release } " when it is no longer needed." } ;\r
 \r
 HELP: com-add-ref\r
 { $values { "interface" "Pointer to a COM interface implementing " { $snippet "IUnknown" } } }\r
index 4a2f465fefc320ce2a0f2a599bd60a9b1ef228b0..e2685db1d001735377f010b6743ff97617ebb432 100644 (file)
@@ -1,93 +1,91 @@
-USING: kernel windows.com windows.com.syntax windows.ole32\r
-alien alien.syntax tools.test libc alien.c-types arrays.lib \r
-namespaces arrays continuations ;\r
-IN: windows.com.tests\r
-\r
-! Create some test COM interfaces\r
-\r
-COM-INTERFACE: ISimple IUnknown {216fb341-0eb2-44b1-8edb-60b76e353abc}\r
-    HRESULT returnOK ( )\r
-    HRESULT returnError ( ) ;\r
-\r
-COM-INTERFACE: IInherited ISimple {9620ecec-8438-423b-bb14-86f835aa40dd}\r
-    int getX ( )\r
-    void setX ( int newX ) ;\r
-\r
-! Implement the IInherited interface in factor using alien-callbacks\r
-\r
-C-STRUCT: test-implementation\r
-    { "void*" "vtbl" }\r
-    { "int" "x" } ;\r
-\r
-: QueryInterface-callback\r
-    "HRESULT" { "void*" "REFGUID" "void**" } "stdcall" [ nip 0 swap set-void*-nth S_OK ]\r
-    alien-callback ;\r
-: AddRef-callback\r
-    "ULONG" { "void*" } "stdcall" [ drop 2 ]\r
-    alien-callback ;\r
-: Release-callback\r
-    "ULONG" { "void*" } "stdcall" [ drop 1 ]\r
-    alien-callback ;\r
-: returnOK-callback\r
-    "HRESULT" { "void*" } "stdcall" [ drop S_OK ]\r
-    alien-callback ;\r
-: returnError-callback\r
-    "HRESULT" { "void*" } "stdcall" [ drop E_FAIL ]\r
-    alien-callback ;\r
-: getX-callback\r
-    "int" { "void*" } "stdcall" [ test-implementation-x ]\r
-    alien-callback ;\r
-: setX-callback\r
-    "void" { "void*" "int" } "stdcall" [ swap set-test-implementation-x ]\r
-    alien-callback ;\r
-\r
-SYMBOL: +test-implementation-vtbl+\r
-SYMBOL: +guinea-pig-implementation+\r
-\r
-: (make-test-implementation) ( x imp -- imp )\r
-    [ set-test-implementation-x ] keep\r
-    +test-implementation-vtbl+ get over set-test-implementation-vtbl ;\r
-\r
-: <test-implementation> ( x -- imp )\r
-    "test-implementation" <c-object> (make-test-implementation) ;\r
-\r
-: <malloced-test-implementation> ( x -- imp )\r
-    "test-implementation" heap-size malloc (make-test-implementation) ;\r
-\r
-QueryInterface-callback\r
-AddRef-callback\r
-Release-callback\r
-returnOK-callback\r
-returnError-callback\r
-getX-callback\r
-setX-callback\r
-7 narray >c-void*-array\r
-dup byte-length [\r
-    [ byte-array>memory ] keep\r
-    +test-implementation-vtbl+ set\r
-\r
-    ! Test that the words defined by COM-INTERFACE: do their magic\r
-\r
-    "{216fb341-0eb2-44b1-8edb-60b76e353abc}" string>guid 1array [ ISimple-iid ] unit-test\r
-    "{9620ecec-8438-423b-bb14-86f835aa40dd}" string>guid 1array [ IInherited-iid ] unit-test\r
-    "{00000000-0000-0000-C000-000000000046}" string>guid 1array [ IUnknown-iid ] unit-test\r
-    S_OK 1array [ 0 <test-implementation> ISimple::returnOK ] unit-test\r
-    E_FAIL <long> *long 1array [ 0 <test-implementation> ISimple::returnError ] unit-test\r
-    1984 1array [ 0 <test-implementation> dup 1984 IInherited::setX IInherited::getX ] unit-test\r
-\r
-    ! Test that the helper functions for QueryInterface, AddRef, Release work\r
-\r
-    0 <malloced-test-implementation> +guinea-pig-implementation+ set\r
-    [\r
-        +guinea-pig-implementation+ get 1array [\r
-            +guinea-pig-implementation+ get com-add-ref\r
-        ] unit-test\r
-\r
-        { } [ +guinea-pig-implementation+ get com-release ] unit-test\r
-\r
-        +guinea-pig-implementation+ get 1array [\r
-            +guinea-pig-implementation+ get IUnknown-iid com-query-interface\r
-        ] unit-test\r
-\r
-    ] [ +guinea-pig-implementation+ get free ] [ ] cleanup\r
-] with-malloc\r
+USING: kernel windows.com windows.com.syntax windows.ole32
+alien alien.syntax tools.test libc alien.c-types arrays.lib 
+namespaces arrays continuations accessors math windows.com.wrapper
+windows.com.wrapper.private ;
+IN: windows.com.tests
+
+COM-INTERFACE: ISimple IUnknown {216fb341-0eb2-44b1-8edb-60b76e353abc}
+    HRESULT returnOK ( )
+    HRESULT returnError ( ) ;
+
+COM-INTERFACE: IInherited ISimple {9620ecec-8438-423b-bb14-86f835aa40dd}
+    int getX ( )
+    void setX ( int newX ) ;
+
+COM-INTERFACE: IUnrelated IUnknown {b06ac3f4-30e4-406b-a7cd-c29cead4552c}
+    int xPlus ( int y )
+    int xMulAdd ( int mul, int add ) ;
+
+"{216fb341-0eb2-44b1-8edb-60b76e353abc}" string>guid 1array [ ISimple-iid ] unit-test
+"{9620ecec-8438-423b-bb14-86f835aa40dd}" string>guid 1array [ IInherited-iid ] unit-test
+"{00000000-0000-0000-C000-000000000046}" string>guid 1array [ IUnknown-iid ] unit-test
+"{b06ac3f4-30e4-406b-a7cd-c29cead4552c}" string>guid 1array [ IUnrelated-iid ] unit-test
+
+SYMBOL: +test-wrapper+
+SYMBOL: +guinea-pig-implementation+
+SYMBOL: +orig-wrapped-objects+
+
++wrapped-objects+ get-global clone +orig-wrapped-objects+ set-global
+
+TUPLE: test-implementation x ;
+C: <test-implementation> test-implementation 
+
+{
+    { "IInherited" {
+        [ drop S_OK ] ! ISimple::returnOK
+        [ drop E_FAIL ] ! ISimple::returnError
+        [ x>> ] ! IInherited::getX
+        [ >>x drop ] ! IInherited::setX
+    } }
+    { "IUnrelated" {
+        [ swap x>> + ] ! IUnrelated::xPlus
+        [ spin x>> * + ] ! IUnrealted::xMulAdd
+    } }
+} <com-wrapper>
+dup +test-wrapper+ set [
+
+    0 <test-implementation> swap com-wrap
+    dup +guinea-pig-implementation+ set [ drop
+
+        S_OK 1array [ +guinea-pig-implementation+ get ISimple::returnOK ] unit-test
+        E_FAIL <long> *long 1array [ +guinea-pig-implementation+ get ISimple::returnError ] unit-test
+        20 1array [ +guinea-pig-implementation+ get dup 20 IInherited::setX IInherited::getX ] unit-test
+        420 1array [
+            +guinea-pig-implementation+ get
+            IUnrelated-iid com-query-interface
+            [ 20 20 IUnrelated::xMulAdd ] with-com-interface
+        ] unit-test
+        40 1array [
+            +guinea-pig-implementation+ get
+            IUnrelated-iid com-query-interface
+            [ 20 IUnrelated::xPlus ] with-com-interface
+        ] unit-test
+
+        +guinea-pig-implementation+ get 1array [
+            +guinea-pig-implementation+ get com-add-ref
+        ] unit-test
+
+        { } [ +guinea-pig-implementation+ get com-release ] unit-test
+
+        +guinea-pig-implementation+ get 1array [
+            +guinea-pig-implementation+ get IUnknown-iid com-query-interface
+            dup com-release
+        ] unit-test
+        +guinea-pig-implementation+ get 1array [
+            +guinea-pig-implementation+ get ISimple-iid com-query-interface
+            dup com-release
+        ] unit-test
+        "void*" heap-size +guinea-pig-implementation+ get <displaced-alien>
+        +guinea-pig-implementation+ get
+        2array [
+            +guinea-pig-implementation+ get IUnrelated-iid com-query-interface
+            dup ISimple-iid com-query-interface
+            over com-release dup com-release
+        ] unit-test
+
+    ] with-com-interface
+
+] with-disposal
+
+! Ensure that we freed +guinea-pig-implementation
++orig-wrapped-objects+ get-global 1array [ +wrapped-objects+ get-global ] unit-test
index b78d9b5b91df431fd4176f592db1d83a658e0f6d..4833a7412a3e2752ba0cf22036c92dd76645b737 100644 (file)
@@ -1,12 +1,31 @@
 USING: alien alien.c-types windows.com.syntax windows.ole32\r
-windows.types continuations kernel ;\r
+windows.types continuations kernel alien.syntax ;\r
 IN: windows.com\r
 \r
+LIBRARY: ole32\r
+\r
 COM-INTERFACE: IUnknown f {00000000-0000-0000-C000-000000000046}\r
     HRESULT QueryInterface ( REFGUID iid, void** ppvObject )\r
     ULONG AddRef ( )\r
     ULONG Release ( ) ;\r
 \r
+COM-INTERFACE: IDataObject IUnknown {0000010E-0000-0000-C000-000000000046}\r
+    HRESULT GetData ( FORMATETC* pFormatetc, STGMEDIUM* pmedium )\r
+    HRESULT GetDataHere ( FORMATETC* pFormatetc, STGMEDIUM* pmedium )\r
+    HRESULT QueryGetData ( FORMATETC* pFormatetc )\r
+    HRESULT GetCanonicalFormatEtc ( FORMATETC* pFormatetcIn, FORMATETC* pFormatetcOut )\r
+    HRESULT SetData ( FORMATETC* pFormatetc, STGMEDIUM* pmedium, BOOL fRelease )\r
+    HRESULT EnumFormatEtc ( DWORD dwDirection, IEnumFORMATETC** ppenumFormatetc )\r
+    HRESULT DAdvise ( FORMATETC* pFormatetc, DWORD advf, IAdviseSink* pAdvSink, DWORD* pdwConnection )\r
+    HRESULT DUnadvise ( DWORD pdwConnection )\r
+    HRESULT EnumDAdvise ( IEnumSTATDATA** ppenumAdvise ) ;\r
+\r
+COM-INTERFACE: IDropTarget IUnknown {00000122-0000-0000-C000-000000000046}\r
+    HRESULT DragEnter ( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )\r
+    HRESULT DragOver ( DWORD grfKeyState, POINTL pt, DWORD* pdwEffect )\r
+    HRESULT DragLeave ( )\r
+    HRESULT Drop ( IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect ) ;\r
+\r
 : com-query-interface ( interface iid -- interface' )\r
     f <void*>\r
     [ IUnknown::QueryInterface ole32-error ] keep\r
@@ -19,4 +38,4 @@ COM-INTERFACE: IUnknown f {00000000-0000-0000-C000-000000000046}
     IUnknown::Release drop ; inline\r
 \r
 : with-com-interface ( interface quot -- )\r
-    [ keep ] [ com-release ] [ ] cleanup ; inline\r
+    over [ slip ] [ com-release ] [ ] cleanup ; inline\r
index acd3848f102b3c40358a4c3528788f6d0af5bd73..b3c803be2d863185bd57cbea3f94c848b6bf4f28 100755 (executable)
@@ -1,88 +1,92 @@
-USING: alien alien.c-types kernel windows.ole32 combinators.lib\r
-parser splitting sequences.lib sequences namespaces assocs\r
-quotations shuffle accessors words macros alien.syntax fry ;\r
-IN: windows.com.syntax\r
-\r
-<PRIVATE\r
-\r
-C-STRUCT: com-interface\r
-    { "void*" "vtbl" } ;\r
-\r
-MACRO: com-invoke ( n return parameters -- )\r
-    dup length -roll\r
-    '[\r
-        , npick com-interface-vtbl , swap void*-nth , ,\r
-        "stdcall" alien-indirect\r
-    ] ;\r
-\r
-TUPLE: com-interface-definition name parent iid functions ;\r
-C: <com-interface-definition> com-interface-definition\r
-\r
-TUPLE: com-function-definition name return parameters ;\r
-C: <com-function-definition> com-function-definition\r
-\r
-SYMBOL: +com-interface-definitions+\r
-+com-interface-definitions+ get-global\r
-[ H{ } +com-interface-definitions+ set-global ]\r
-unless\r
-\r
-: find-com-interface-definition ( name -- definition )\r
-    dup "f" = [ drop f ] [\r
-        dup +com-interface-definitions+ get-global at*\r
-        [ nip ]\r
-        [ swap " COM interface hasn't been defined" append throw ]\r
-        if\r
-    ] if ;\r
-\r
-: save-com-interface-definition ( definition -- )\r
-    dup name>> +com-interface-definitions+ get-global set-at ;\r
-\r
-: (parse-com-function) ( tokens -- definition )\r
-    [ second ]\r
-    [ first ]\r
-    [ 3 tail 2 group [ first ] map "void*" prefix ]\r
-    tri\r
-    <com-function-definition> ;\r
-\r
-: parse-com-functions ( -- functions )\r
-    ";" parse-tokens { ")" } split\r
-    [ empty? not ] subset\r
-    [ (parse-com-function) ] map ;\r
-\r
-: (iid-word) ( definition -- word )\r
-    name>> "-iid" append create-in ;\r
-\r
-: (function-word) ( function interface -- word )\r
-    name>> "::" rot name>> 3append create-in ;\r
-\r
-: all-functions ( definition -- functions )\r
-    dup parent>> [ all-functions ] [ { } ] if*\r
-    swap functions>> append ;\r
-\r
-: (define-word-for-function) ( function interface n -- )\r
-    -rot [ (function-word) swap ] 2keep drop\r
-    { return>> parameters>> } get-slots\r
-    [ com-invoke ] 3curry\r
-    define ;\r
-\r
-: define-words-for-com-interface ( definition -- )\r
-    [ [ (iid-word) ] [ iid>> 1quotation ] bi define ]\r
-    [ name>> "com-interface" swap typedef ]\r
-    [\r
-        dup all-functions\r
-        [ (define-word-for-function) ] with each-index\r
-    ]\r
-    tri ;\r
-\r
-PRIVATE>\r
-\r
-: COM-INTERFACE:\r
-    scan\r
-    scan find-com-interface-definition\r
-    scan string>guid\r
-    parse-com-functions\r
-    <com-interface-definition>\r
-    dup save-com-interface-definition\r
-    define-words-for-com-interface\r
-    ; parsing\r
-\r
+USING: alien alien.c-types kernel windows.ole32 combinators.lib
+parser splitting sequences.lib sequences namespaces assocs
+quotations shuffle accessors words macros alien.syntax fry ;
+IN: windows.com.syntax
+
+<PRIVATE
+
+C-STRUCT: com-interface
+    { "void*" "vtbl" } ;
+
+MACRO: com-invoke ( n return parameters -- )
+    dup length -roll
+    '[
+        , npick com-interface-vtbl , swap void*-nth , ,
+        "stdcall" alien-indirect
+    ] ;
+
+TUPLE: com-interface-definition name parent iid functions ;
+C: <com-interface-definition> com-interface-definition
+
+TUPLE: com-function-definition name return parameters ;
+C: <com-function-definition> com-function-definition
+
+SYMBOL: +com-interface-definitions+
++com-interface-definitions+ get-global
+[ H{ } +com-interface-definitions+ set-global ]
+unless
+
+: find-com-interface-definition ( name -- definition )
+    dup "f" = [ drop f ] [
+        dup +com-interface-definitions+ get-global at*
+        [ nip ]
+        [ swap " COM interface hasn't been defined" append throw ]
+        if
+    ] if ;
+
+: save-com-interface-definition ( definition -- )
+    dup name>> +com-interface-definitions+ get-global set-at ;
+
+: (parse-com-function) ( tokens -- definition )
+    [ second ]
+    [ first ]
+    [ 3 tail 2 group [ first ] map "void*" prefix ]
+    tri
+    <com-function-definition> ;
+
+: parse-com-functions ( -- functions )
+    ";" parse-tokens { ")" } split
+    [ empty? not ] filter
+    [ (parse-com-function) ] map ;
+
+: (iid-word) ( definition -- word )
+    name>> "-iid" append create-in ;
+
+: (function-word) ( function interface -- word )
+    name>> "::" rot name>> 3append create-in ;
+
+: family-tree ( definition -- definitions )
+    dup parent>> [ family-tree ] [ { } ] if*
+    swap suffix ;
+
+: family-tree-functions ( definition -- functions )
+    dup parent>> [ family-tree-functions ] [ { } ] if*
+    swap functions>> append ;
+
+: (define-word-for-function) ( function interface n -- )
+    -rot [ (function-word) swap ] 2keep drop
+    { return>> parameters>> } get-slots
+    [ com-invoke ] 3curry
+    define ;
+
+: define-words-for-com-interface ( definition -- )
+    [ [ (iid-word) ] [ iid>> 1quotation ] bi define ]
+    [ name>> "com-interface" swap typedef ]
+    [
+        dup family-tree-functions
+        [ (define-word-for-function) ] with each-index
+    ]
+    tri ;
+
+PRIVATE>
+
+: COM-INTERFACE:
+    scan
+    scan find-com-interface-definition
+    scan string>guid
+    parse-com-functions
+    <com-interface-definition>
+    dup save-com-interface-definition
+    define-words-for-com-interface
+    ; parsing
+
diff --git a/extra/windows/com/wrapper/authors.txt b/extra/windows/com/wrapper/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/extra/windows/com/wrapper/summary.txt b/extra/windows/com/wrapper/summary.txt
new file mode 100644 (file)
index 0000000..c439419
--- /dev/null
@@ -0,0 +1 @@
+Wrap Factor objects with implementations of COM interfaces
diff --git a/extra/windows/com/wrapper/tags.txt b/extra/windows/com/wrapper/tags.txt
new file mode 100644 (file)
index 0000000..ffb665d
--- /dev/null
@@ -0,0 +1,3 @@
+windows
+com
+bindings
diff --git a/extra/windows/com/wrapper/wrapper-docs.factor b/extra/windows/com/wrapper/wrapper-docs.factor
new file mode 100644 (file)
index 0000000..51a3549
--- /dev/null
@@ -0,0 +1,40 @@
+USING: help.markup help.syntax io kernel math quotations\r
+multiline alien windows.com windows.com.syntax continuations ;\r
+IN: windows.com.wrapper\r
+\r
+HELP: <com-wrapper>\r
+{ $values { "implementations" "an assoc relating COM interface names to arrays of quotations implementing that interface" } { "wrapper" "a " { $link com-wrapper } " tuple" } }\r
+{ $description "Constructs a " { $link com-wrapper } " tuple. Each key in the " { $snippet "implementations" } " assoc must be the name of an interface defined with " { $link POSTPONE: COM-INTERFACE: } ". The corresponding value must be an array of quotations implementing the methods of that interface in order, including those of its parent interfaces. The " { $snippet "IUnknown" } " methods (" { $link IUnknown::QueryInterface } ", " { $link IUnknown::AddRef } ", and " { $link IUnknown::Release } ") will be defined automatically and must not be specified in the array. These quotations should have stack effects mirroring those of the interface methods being implemented; for example, a method " { $snippet "void foobar ( int foo, int bar )" } " should be implemented with a quotation of effect " { $snippet "( this foo bar -- )" } ". The " { $snippet "this" } " parameter (that is, the leftmost parameter of any COM method) will be automatically converted from an alien pointer to the underlying Factor object before the quotation is invoked.\n\nThe resulting wrapper can be applied to a Factor object using the " { $link com-wrap } " word. The COM interface pointer returned by " { $snippet "com-wrap" } " can then be passed to C functions requiring a COM object as a parameter. The vtables constructed by " { $snippet "<com-wrapper>" } " are stored on the non-GC heap in order to be accessible to C functions; when the wrapper objects and its vtables are no longer needed, the object's resources must be freed using " { $link dispose } ".\n\nExample:" }\r
+{ $code <"\r
+COM-INTERFACE: ISimple IUnknown {216fb341-0eb2-44b1-8edb-60b76e353abc}\r
+    HRESULT returnOK ( )\r
+    HRESULT returnError ( ) ;\r
+\r
+COM-INTERFACE: IInherited ISimple {9620ecec-8438-423b-bb14-86f835aa40dd}\r
+    int getX ( )\r
+    void setX ( int newX ) ;\r
+\r
+COM-INTERFACE: IUnrelated IUnknown {b06ac3f4-30e4-406b-a7cd-c29cead4552c}\r
+    int xPlus ( int y )\r
+    int xMulAdd ( int mul, int add ) ;\r
+\r
+{\r
+    { "IInherited" {\r
+        [ drop S_OK ]    ! ISimple::returnOK\r
+        [ drop E_FAIL ]  ! ISimple::returnError\r
+        [ x>> ]          ! IInherited::getX\r
+        [ >>x drop ]     ! IInherited::setX\r
+    } }\r
+    { "IUnrelated" {\r
+        [ swap x>> + ]   ! IUnrelated::xPlus\r
+        [ spin x>> * + ] ! IUnrealted::xMulAdd\r
+    } }\r
+} <com-wrapper>\r
+"> } ;\r
+\r
+HELP: com-wrap\r
+{ $values { "object" "The factor object to wrap" } { "wrapper" "A " { $link com-wrapper } " object" } { "wrapped-object" "A COM object referencing " { $snippet "object" } } }\r
+{ $description "Allocates a COM object using the implementations in the " { $snippet "wrapper" } " object for the vtables and " { $snippet "object" } " for the \"this\" parameter. The COM object is allocated on the heap with an initial reference count of 1. The object will automatically deallocate itself when its reference count reaches 0 as a result of calling " { $link IUnknown::Release } " or " { $link com-release } " on it.\n\nNote that if " { $snippet "wrapper" } " implements multiple interfaces, you cannot count on the returned COM object pointer implementing any particular interface beyond " { $snippet "IUnknown" } ". You will need to use " { $link com-query-interface } " or " { $link IUnknown::QueryInterface } " to ask the object for the particular interface you need." } ;\r
+\r
+HELP: com-wrapper\r
+{ $class-description "The tuple class used to store COM wrapper information. Objects of this class should be treated as opaque by user code. A com-wrapper can be constructed using the " { $link <com-wrapper> } " constructor and applied to a Factor object using " { $link com-wrap } "." } ;\r
diff --git a/extra/windows/com/wrapper/wrapper.factor b/extra/windows/com/wrapper/wrapper.factor
new file mode 100644 (file)
index 0000000..7f63f52
--- /dev/null
@@ -0,0 +1,111 @@
+USING: alien alien.c-types windows.com.syntax
+windows.com.syntax.private windows.com continuations kernel
+sequences.lib namespaces windows.ole32 libc
+assocs accessors arrays sequences quotations combinators
+math combinators.lib words compiler.units ;
+IN: windows.com.wrapper
+
+TUPLE: com-wrapper vtbls freed? ;
+
+<PRIVATE
+
+SYMBOL: +wrapped-objects+
++wrapped-objects+ get-global
+[ H{ } +wrapped-objects+ set-global ]
+unless
+
+: com-unwrap ( wrapped -- object )
+    +wrapped-objects+ get-global at*
+    [ "invalid COM wrapping pointer" throw ] unless ;
+
+: (free-wrapped-object) ( wrapped -- )
+    [ +wrapped-objects+ get-global delete-at ] keep
+    free ;
+
+: (make-query-interface) ( interfaces -- quot )
+    [
+        [ swap 16 memory>byte-array ] %
+        [
+            >r find-com-interface-definition family-tree
+            r> 1quotation [ >r iid>> r> 2array ] curry map
+        ] map-index concat
+        [ f ] add ,
+        \ case ,
+        "void*" heap-size
+        [ * rot <displaced-alien> com-add-ref 0 rot set-void*-nth S_OK ]
+        curry ,
+        [ nip f 0 rot set-void*-nth E_NOINTERFACE ] ,
+        \ if* ,
+    ] [ ] make ;
+
+: (make-add-ref) ( interfaces -- quot )
+    length "void*" heap-size * [ swap <displaced-alien>
+        0 over ulong-nth
+        1+ [ 0 rot set-ulong-nth ] keep
+    ] curry ;
+
+: (make-release) ( interfaces -- quot )
+    length "void*" heap-size * [ over <displaced-alien>
+        0 over ulong-nth
+        1- [ 0 rot set-ulong-nth ] keep
+        dup zero? [ swap (free-wrapped-object) ] [ nip ] if
+    ] curry ;
+
+: (make-iunknown-methods) ( interfaces -- quots )
+    [ (make-query-interface) ]
+    [ (make-add-ref) ]
+    [ (make-release) ] tri
+    3array ;
+    
+: (thunk) ( n -- quot )
+    dup 0 =
+    [ drop [ ] ]
+    [ "void*" heap-size neg * [ swap <displaced-alien> ] curry ]
+    if ;
+
+: (thunked-quots) ( quots iunknown-methods thunk -- quots' )
+    [ [ swap 2array ] curry map swap ] keep
+    [ com-unwrap ] compose [ swap 2array ] curry map append ;
+
+: compile-alien-callback ( return parameters abi quot -- alien )
+    [ alien-callback ] 4 ncurry
+    [ gensym [ swap define ] keep ] with-compilation-unit
+    execute ;
+
+: (make-vtbl) ( interface-name quots iunknown-methods n -- )
+    (thunk) (thunked-quots)
+    swap find-com-interface-definition family-tree-functions [
+        { return>> parameters>> } get-slots
+        dup length 1- roll [
+            first dup empty?
+            [ 2drop [ ] ]
+            [ swap [ ndip ] 2curry ]
+            if
+        ] [ second ] bi compose
+        "stdcall" swap compile-alien-callback
+    ] 2map >c-void*-array [ byte-length malloc ] keep
+    over byte-array>memory ;
+
+: (make-vtbls) ( implementations -- vtbls )
+    dup [ first ] map (make-iunknown-methods)
+    [ >r >r first2 r> r> swap (make-vtbl) ] curry map-index ;
+
+: (malloc-wrapped-object) ( wrapper -- wrapped-object )
+    vtbls>> length "void*" heap-size *
+    [ "ulong" heap-size + malloc ] keep
+    over <displaced-alien>
+    1 0 rot set-ulong-nth ;
+
+PRIVATE>
+
+: <com-wrapper> ( implementations -- wrapper )
+    (make-vtbls) f com-wrapper construct-boa ;
+
+M: com-wrapper dispose
+    t >>freed?
+    vtbls>> [ free ] each ;
+
+: com-wrap ( object wrapper -- wrapped-object )
+    dup (malloc-wrapped-object) >r vtbls>> r>
+    [ [ set-void*-nth ] curry each-index ] keep
+    [ +wrapped-objects+ get-global set-at ] keep ;
diff --git a/extra/windows/dragdrop-listener/dragdrop-listener.factor b/extra/windows/dragdrop-listener/dragdrop-listener.factor
new file mode 100644 (file)
index 0000000..8384bb1
--- /dev/null
@@ -0,0 +1,68 @@
+USING: windows.com windows.com.wrapper combinators\r
+windows.kernel32 windows.ole32 windows.shell32 kernel accessors\r
+prettyprint namespaces ui.tools.listener ui.tools.workspace\r
+alien.c-types alien sequences math ;\r
+IN: windows.dragdrop-listener\r
+\r
+: filenames-from-hdrop ( hdrop -- filenames )\r
+    dup HEX: FFFFFFFF f 0 DragQueryFile ! get count of files\r
+    [\r
+        2dup f 0 DragQueryFile 1+ ! get size of filename buffer\r
+        dup "WCHAR" <c-array>\r
+        [ swap DragQueryFile drop ] keep\r
+        alien>u16-string\r
+    ] with map ;\r
+\r
+: filenames-from-data-object ( data-object -- filenames )\r
+    "FORMATETC" <c-object>\r
+        CF_HDROP         over set-FORMATETC-cfFormat\r
+        f                over set-FORMATETC-ptd\r
+        DVASPECT_CONTENT over set-FORMATETC-dwAspect\r
+        -1               over set-FORMATETC-lindex\r
+        TYMED_HGLOBAL    over set-FORMATETC-tymed\r
+    "STGMEDIUM" <c-object>\r
+    [ IDataObject::GetData ] keep swap succeeded? [\r
+        dup STGMEDIUM-data\r
+        [ filenames-from-hdrop ] with-global-lock\r
+        swap ReleaseStgMedium\r
+    ] [ drop f ] if ;\r
+\r
+TUPLE: listener-dragdrop hWnd last-drop-effect ;\r
+\r
+: <listener-dragdrop> ( hWnd -- object )\r
+    DROPEFFECT_NONE listener-dragdrop construct-boa ;\r
+\r
+SYMBOL: +listener-dragdrop-wrapper+\r
+{\r
+    { "IDropTarget" {\r
+        [ ! DragEnter\r
+            >r 2drop\r
+            filenames-from-data-object\r
+            length 1 = [ DROPEFFECT_COPY ] [ DROPEFFECT_NONE ] if\r
+            dup 0 r> set-ulong-nth\r
+            >>last-drop-effect drop\r
+            S_OK\r
+        ] [ ! DragOver\r
+            >r 2drop last-drop-effect>> 0 r> set-ulong-nth\r
+            S_OK\r
+        ] [ ! DragLeave\r
+            drop S_OK\r
+        ] [ ! Drop\r
+            >r 2drop nip\r
+            filenames-from-data-object\r
+            dup length 1 = [\r
+                first unparse [ "USE: parser " % % " run-file" % ] "" make\r
+                eval-listener\r
+                DROPEFFECT_COPY\r
+            ] [ 2drop DROPEFFECT_NONE ] if\r
+            0 r> set-ulong-nth\r
+            S_OK\r
+        ]\r
+    } }\r
+} <com-wrapper> +listener-dragdrop-wrapper+ set-global\r
+\r
+: dragdrop-listener-window ( -- )\r
+    get-workspace parent>> handle>> hWnd>>\r
+    dup <listener-dragdrop>\r
+    +listener-dragdrop-wrapper+ get-global com-wrap\r
+    [ RegisterDragDrop ole32-error ] with-com-interface ;\r
index ec70b14e684b1c83254d22d7a486925f2a4a3d31..36f8b51e526460c85d36e0bc8ab819015d2613f4 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2005, 2006 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien alien.syntax windows.types ;
+USING: alien alien.syntax kernel windows.types ;
 IN: windows.kernel32
 
 : MAX_PATH 260 ; inline
@@ -1573,3 +1573,6 @@ FUNCTION: BOOL WriteProcessMemory ( HANDLE hProcess, void* lpBaseAddress, void*
 ! FUNCTION: WriteTapemark
 ! FUNCTION: WTSGetActiveConsoleSessionId
 ! FUNCTION: ZombifyActCtx
+
+: with-global-lock ( HGLOBAL quot -- )
+    swap [ GlobalLock swap call ] keep GlobalUnlock drop ; inline
index 3b0db96d6394857bf654b484c62c0e7bba31f8a7..4c20d0fb42bc97286abf049d7e3a63b14312115d 100644 (file)
@@ -7,7 +7,7 @@ IN: windows.messages
 SYMBOL: windows-messages
 
 "windows.messages" words
-[ word-name "windows-message" head? not ] subset
+[ word-name "windows-message" head? not ] filter
 [ dup execute swap ] { } map>assoc
 windows-messages set-global
 
index 6e06830130151574a21abd830e25e97e68d0f553..a71a569f165a9aa65c0e4110a01dd021e29b2314 100644 (file)
-USING: alien alien.syntax alien.c-types alien.strings math\r
-kernel sequences windows windows.types combinators.lib ;\r
-IN: windows.ole32\r
-\r
-LIBRARY: ole32\r
-\r
-C-STRUCT: GUID\r
-    { "DWORD" "part1" }\r
-    { "DWORD" "part2" }\r
-    { "DWORD" "part3" }\r
-    { "DWORD" "part4" } ;\r
-\r
-TYPEDEF: void* REFGUID\r
-TYPEDEF: void* LPUNKNOWN\r
-TYPEDEF: wchar_t* LPOLESTR\r
-TYPEDEF: wchar_t* LPCOLESTR\r
-\r
-TYPEDEF: REFGUID REFIID\r
-TYPEDEF: REFGUID REFCLSID\r
-\r
-FUNCTION: HRESULT CoCreateInstance ( REFGUID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFGUID riid, LPUNKNOWN out_ppv ) ;\r
-FUNCTION: BOOL IsEqualGUID ( REFGUID rguid1, REFGUID rguid2 ) ;\r
-FUNCTION: int StringFromGUID2 ( REFGUID rguid, LPOLESTR lpsz, int cchMax ) ;\r
-FUNCTION: HRESULT CLSIDFromString ( LPOLESTR lpsz, REFGUID out_rguid ) ;\r
-\r
-: S_OK 0 ; inline\r
-: S_FALSE 1 ; inline\r
-: E_FAIL HEX: 80004005 ; inline\r
-: E_INVALIDARG HEX: 80070057 ; inline\r
-\r
-: MK_ALT HEX: 20 ; inline\r
-: DROPEFFECT_NONE 0 ; inline\r
-: DROPEFFECT_COPY 1 ; inline\r
-: DROPEFFECT_MOVE 2 ; inline\r
-: DROPEFFECT_LINK 4 ; inline\r
-: DROPEFFECT_SCROLL HEX: 80000000 ; inline\r
-: DD_DEFSCROLLINSET 11 ; inline\r
-: DD_DEFSCROLLDELAY 50 ; inline\r
-: DD_DEFSCROLLINTERVAL 50 ; inline\r
-: DD_DEFDRAGDELAY 200 ; inline\r
-: DD_DEFDRAGMINDIST 2 ; inline\r
-\r
-: ole32-error ( n -- )\r
-    dup S_OK = [\r
-        drop\r
-    ] [ (win32-error-string) throw ] if ;\r
-\r
-: guid= ( a b -- ? )\r
-    IsEqualGUID c-bool> ;\r
-\r
-: GUID-STRING-LENGTH\r
-    "{01234567-89ab-cdef-0123-456789abcdef}" length ; inline\r
-\r
-: string>guid ( string -- guid )\r
-    utf16n string>alien "GUID" <c-object> [ CLSIDFromString ole32-error ] keep ;\r
-: guid>string ( guid -- string )\r
-    GUID-STRING-LENGTH 1+ [ "ushort" <c-array> ] keep\r
-    [ StringFromGUID2 drop ] { 2 } multikeep utf16n alien>string ;\r
-\r
+USING: alien alien.syntax alien.c-types alien.strings math
+kernel sequences windows windows.types combinators.lib
+math.order ;
+IN: windows.ole32
+
+LIBRARY: ole32
+
+TYPEDEF: GUID* REFGUID
+TYPEDEF: void* LPUNKNOWN
+TYPEDEF: wchar_t* LPOLESTR
+TYPEDEF: wchar_t* LPCOLESTR
+
+TYPEDEF: REFGUID REFIID
+TYPEDEF: REFGUID REFCLSID
+
+FUNCTION: HRESULT CoCreateInstance ( REFGUID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFGUID riid, LPUNKNOWN out_ppv ) ;
+FUNCTION: BOOL IsEqualGUID ( REFGUID rguid1, REFGUID rguid2 ) ;
+FUNCTION: int StringFromGUID2 ( REFGUID rguid, LPOLESTR lpsz, int cchMax ) ;
+FUNCTION: HRESULT CLSIDFromString ( LPOLESTR lpsz, REFGUID out_rguid ) ;
+
+: S_OK 0 ; inline
+: S_FALSE 1 ; inline
+: E_NOINTERFACE HEX: 80004002 ; inline
+: E_FAIL HEX: 80004005 ; inline
+: E_INVALIDARG HEX: 80070057 ; inline
+
+: MK_ALT HEX: 20 ; inline
+: DROPEFFECT_NONE 0 ; inline
+: DROPEFFECT_COPY 1 ; inline
+: DROPEFFECT_MOVE 2 ; inline
+: DROPEFFECT_LINK 4 ; inline
+: DROPEFFECT_SCROLL HEX: 80000000 ; inline
+: DD_DEFSCROLLINSET 11 ; inline
+: DD_DEFSCROLLDELAY 50 ; inline
+: DD_DEFSCROLLINTERVAL 50 ; inline
+: DD_DEFDRAGDELAY 200 ; inline
+: DD_DEFDRAGMINDIST 2 ; inline
+
+: CF_TEXT             1 ; inline
+: CF_BITMAP           2 ; inline
+: CF_METAFILEPICT     3 ; inline
+: CF_SYLK             4 ; inline
+: CF_DIF              5 ; inline
+: CF_TIFF             6 ; inline
+: CF_OEMTEXT          7 ; inline
+: CF_DIB              8 ; inline
+: CF_PALETTE          9 ; inline
+: CF_PENDATA          10 ; inline
+: CF_RIFF             11 ; inline
+: CF_WAVE             12 ; inline
+: CF_UNICODETEXT      13 ; inline
+: CF_ENHMETAFILE      14 ; inline
+: CF_HDROP            15 ; inline
+: CF_LOCALE           16 ; inline
+: CF_MAX              17 ; inline
+
+: CF_OWNERDISPLAY     HEX: 0080 ; inline
+: CF_DSPTEXT          HEX: 0081 ; inline
+: CF_DSPBITMAP        HEX: 0082 ; inline
+: CF_DSPMETAFILEPICT  HEX: 0083 ; inline
+: CF_DSPENHMETAFILE   HEX: 008E ; inline
+
+: DVASPECT_CONTENT    1 ; inline
+: DVASPECT_THUMBNAIL  2 ; inline
+: DVASPECT_ICON       4 ; inline
+: DVASPECT_DOCPRINT   8 ; inline
+
+: TYMED_HGLOBAL  1 ; inline
+: TYMED_FILE     2 ; inline
+: TYMED_ISTREAM  4 ; inline
+: TYMED_ISTORAGE 8 ; inline
+: TYMED_GDI      16 ; inline
+: TYMED_MFPICT   32 ; inline
+: TYMED_ENHMF    64 ; inline
+: TYMED_NULL     0 ; inline
+
+C-STRUCT: DVTARGETDEVICE
+    { "DWORD" "tdSize" }
+    { "WORD" "tdDriverNameOffset" }
+    { "WORD" "tdDeviceNameOffset" }
+    { "WORD" "tdPortNameOffset" }
+    { "WORD" "tdExtDevmodeOffset" }
+    { "BYTE[1]" "tdData" } ;
+
+TYPEDEF: WORD CLIPFORMAT
+TYPEDEF: POINT POINTL
+
+C-STRUCT: FORMATETC
+    { "CLIPFORMAT" "cfFormat" }
+    { "DVTARGETDEVICE*" "ptd" }
+    { "DWORD" "dwAspect" }
+    { "LONG" "lindex" }
+    { "DWORD" "tymed" } ;
+TYPEDEF: FORMATETC* LPFORMATETC
+
+C-STRUCT: STGMEDIUM
+    { "DWORD" "tymed" }
+    { "void*" "data" }
+    { "LPUNKNOWN" "punkForRelease" } ;
+TYPEDEF: STGMEDIUM* LPSTGMEDIUM
+
+: COINIT_MULTITHREADED     0 ; inline
+: COINIT_APARTMENTTHREADED 2 ; inline
+: COINIT_DISABLE_OLE1DDE   4 ; inline
+: COINIT_SPEED_OVER_MEMORY 8 ; inline
+
+FUNCTION: HRESULT OleInitialize ( void* reserved ) ;
+FUNCTION: HRESULT CoInitializeEx ( void* reserved, DWORD dwCoInit ) ;
+
+FUNCTION: HRESULT RegisterDragDrop ( HWND hWnd, IDropTarget* pDropTarget ) ;
+FUNCTION: HRESULT RevokeDragDrop ( HWND hWnd ) ;
+FUNCTION: void ReleaseStgMedium ( LPSTGMEDIUM pmedium ) ;
+
+: succeeded? ( hresult -- ? )
+    0 HEX: 7FFFFFFF between? ;
+
+: ole32-error ( hresult -- )
+    dup succeeded? [
+        drop
+    ] [ (win32-error-string) throw ] if ;
+
+: ole-initialize ( -- )
+    f OleInitialize ole32-error ;
+
+: guid= ( a b -- ? )
+    IsEqualGUID c-bool> ;
+
+: GUID-STRING-LENGTH
+    "{01234567-89ab-cdef-0123-456789abcdef}" length ; inline
+
+: string>guid ( string -- guid )
+    utf16n string>alien "GUID" <c-object> [ CLSIDFromString ole32-error ] keep ;
+: guid>string ( guid -- string )
+    GUID-STRING-LENGTH 1+ [ "ushort" <c-array> ] keep
+    [ StringFromGUID2 drop ] { 2 } multikeep utf16n alien>string ;
+
index 81ecc35b5f122f80e1ed776b0708b05b62730228..b071bee72a4898c8b452e4e6ae0c627974c49e78 100644 (file)
@@ -1,4 +1,4 @@
-USING: alien alien.c-types alien.syntax combinators
+USING: alien alien.c-types alien.strings alien.syntax combinators
 kernel windows windows.user32 windows.ole32
 windows.com windows.com.syntax io.files ;
 IN: windows.shell32
@@ -167,6 +167,15 @@ TYPEDEF: DWORD SHGDNF
 
 TYPEDEF: ULONG SFGAOF
 
+C-STRUCT: DROPFILES
+    { "DWORD" "pFiles" }
+    { "POINT" "pt" }
+    { "BOOL" "fNC" }
+    { "BOOL" "fWide" } ;
+TYPEDEF: DROPFILES* LPDROPFILES
+TYPEDEF: DROPFILES* LPCDROPFILES
+TYPEDEF: HANDLE HDROP
+
 C-STRUCT: SHITEMID
     { "USHORT" "cb" }
     { "BYTE[1]" "abID" } ;
@@ -210,5 +219,6 @@ COM-INTERFACE: IShellFolder IUnknown {000214E6-0000-0000-C000-000000000046}
 
 FUNCTION: HRESULT SHGetDesktopFolder ( IShellFolder** ppshf ) ;
 
-FUNCTION: HRESULT StrRetToBufW ( STRRET *pstr, PCUITEMID_CHILD pidl, LPWSTR pszBuf, UINT cchBuf ) ;
-: StrRetToBuf StrRetToBufW ; inline
+FUNCTION: UINT DragQueryFileW ( HDROP hDrop, UINT iFile, LPWSTR lpszFile, UINT cch ) ;
+: DragQueryFile DragQueryFileW ; inline
+
old mode 100755 (executable)
new mode 100644 (file)
index 0e555ed7e99a59723e7da0f8131662825fc8af7d..3e7520d4063a33a23b3399813ad071328d32dd64 100644 (file)
@@ -30,10 +30,10 @@ FUNCTION: void* error_message ( DWORD id ) ;
 : win32-error ( -- )
     GetLastError (win32-error) ;
 
-: win32-error=0/f { 0 f } member? [ win32-error ] when ;
-: win32-error>0 0 > [ win32-error ] when ;
-: win32-error<0 0 < [ win32-error ] when ;
-: win32-error<>0 zero? [ win32-error ] unless ;
+: win32-error=0/f ( n -- ) { 0 f } member? [ win32-error ] when ;
+: win32-error>0 ( n -- ) 0 > [ win32-error ] when ;
+: win32-error<0 ( n -- ) 0 < [ win32-error ] when ;
+: win32-error<>0 ( n -- ) zero? [ win32-error ] unless ;
 
 : invalid-handle? ( handle -- )
     INVALID_HANDLE_VALUE = [
index b9f8739a193b717d85ee0bc850351be338adb115..39d11b562b2df28d6e0cd0f8162952d0e84b9f47 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006 Mackenzie Straight, Doug Coleman.
 
-USING: alien alien.c-types alien.syntax arrays byte-arrays
-kernel math sequences windows.types windows.kernel32
+USING: alien alien.c-types alien.strings alien.syntax arrays
+byte-arrays kernel math sequences windows.types windows.kernel32
 windows.errors structs windows math.bitfields ;
 IN: windows.winsock
 
index a2ca25ce6e7980a72698b9274e1f0fe3cf44ebcf..9b1eeede96690b38b7fb5c9d176475d0d7cc2c8b 100644 (file)
@@ -1,4 +1,4 @@
-USING: sequences kernel namespaces splitting math ;
+USING: sequences kernel namespaces splitting math math.order ;
 IN: wrap
 
 ! Very stupid word wrapping/line breaking
@@ -8,7 +8,7 @@ IN: wrap
 SYMBOL: width
 
 : line-chunks ( string -- words-lines )
-    "\n" split [ " \t" split [ empty? not ] subset ] map ;
+    "\n" split [ " \t" split [ empty? not ] filter ] map ;
 
 : (split-chunk) ( words -- )
     -1 over [ length + 1+ dup width get > ] find drop nip
index 2f6882304f495b6e14b26f3d851a98bec4d1f7b6..ff18862d058cc4af69b01c6d24a028dab324322a 100755 (executable)
@@ -37,7 +37,7 @@ dup >r $id   dpy get $window-table   at r> or ;
 
 : circulate-focus ( -- )
 dpy get $default-root <- children
-[ find-in-table ] map [ <- mapped? ] subset   dup length 1 >
+[ find-in-table ] map [ <- mapped? ] filter   dup length 1 >
 [ reverse dup first <- lower drop
   second <- raise
   dup <wm-frame> is? [ $child ] [ ] if
@@ -48,7 +48,7 @@ if ;
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 : managed? ( id -- ? )
-dpy get $window-table values [ <wm-child> is? ] subset [ $id ] map member? ;
+dpy get $window-table values [ <wm-child> is? ] filter [ $id ] map member? ;
 
 : event>keyname ( event -- keyname ) lookup-keysym keysym>name ;
 
index e1b3c5dd820327eb13dedc4836a3135208735e5f..214d45da6ce99465a4ef278873580dbefbe99d04 100644 (file)
@@ -24,7 +24,7 @@ VAR: unmapped-frames-menu
 
 : unmapped-frames ( -- seq )
 dpy get $window-table values
-[ <wm-frame> is? ] subset [ <- mapped? not ] subset ;
+[ <wm-frame> is? ] filter [ <- mapped? not ] filter ;
 
 <unmapped-frames-menu> {
 
index f456c060f96173a9e32a5e4de1e2759c74c306ee..104021706f9f406dad9e013f3aa8e72c97e93977 100644 (file)
@@ -18,7 +18,7 @@ VAR: current-workspace
 : add-workspace ( -- ) { } clone <workspace> workspaces> push ;
 
 : mapped-windows ( -- seq )
-dpy get $default-root <- children [ <- mapped? ] subset ;
+dpy get $default-root <- children [ <- mapped? ] filter ;
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
index e7a5645f81371bc3da58826d38a5b32fa7b2963c..0a389c8034493197fc90037591847e9038e3579e 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2005, 2006 Eduardo Cavazos and Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: alien alien.c-types arrays hashtables io kernel math
-namespaces prettyprint sequences strings combinators x11.xlib ;
+math.order namespaces prettyprint sequences strings combinators
+x11.xlib ;
 IN: x11.events
 
 GENERIC: expose-event ( event window -- )
index d50cfa0d1e9ac8eb940f3a543ccf90d294239b0f..d41f66739cb0469a378d7acb2f46065848f7fcec 100755 (executable)
@@ -1,10 +1,10 @@
 ! Copyright (C) 2005, 2006 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
-IN: xml-rpc
 USING: kernel xml arrays math generic http.client combinators
     hashtables namespaces io base64 sequences strings calendar
     xml.data xml.writer xml.utilities assocs math.parser debugger
-    calendar.format ;
+    calendar.format math.order ;
+IN: xml-rpc
 
 ! * Sending RPC requests
 ! TODO: time
diff --git a/extra/xml/backend/backend.factor b/extra/xml/backend/backend.factor
new file mode 100644 (file)
index 0000000..5dee386
--- /dev/null
@@ -0,0 +1,6 @@
+! Copyright (C) 2008 Daniel Ehrenberg
+! See http://factorcode.org/license.txt for BSD license.
+IN: xml.backend
+
+! A stack of { tag children } pairs
+SYMBOL: xml-stack
index ddf935a30b014241a78f58c06a6f509ecc43a326..4688e20767d3ed4f21f9276dbb2ba2d7f1660d16 100755 (executable)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2005, 2007 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel sequences unicode.syntax math ;
+USING: kernel sequences unicode.syntax math math.order ;
 IN: xml.char-classes
 
 CATEGORY: 1.0name-start* Ll Lu Lo Lt Nl \u000559\u0006E5\u0006E6_ ;
diff --git a/extra/xml/errors/errors-tests.factor b/extra/xml/errors/errors-tests.factor
new file mode 100755 (executable)
index 0000000..402c76d
--- /dev/null
@@ -0,0 +1,28 @@
+USING: continuations xml xml.errors tools.test kernel arrays xml.data state-parser quotations ;
+IN: xml.errors.tests
+
+: xml-error-test ( expected-error xml-string -- )
+    [ string>xml ] curry swap [ = ] curry must-fail-with ;
+
+T{ no-entity f 1 10 "nbsp" } "<x>&nbsp;</x>" xml-error-test
+T{ mismatched f 1 8 T{ name f "" "x" "" } T{ name f "" "y" "" }
+} "<x></y>" xml-error-test
+T{ unclosed f 1 4 V{ T{ name f "" "x" "" } } } "<x>" xml-error-test
+T{ nonexist-ns f 1 5 "x" } "<x:y/>" xml-error-test
+T{ unopened f 1 5 } "</x>" xml-error-test
+T{ not-yes/no f 1 41 "maybe" } "<?xml version='1.0' standalone='maybe'?><x/>" xml-error-test
+T{ extra-attrs f 1 32 V{ T{ name f "" "foo" f } }
+} "<?xml version='1.1' foo='bar'?><x/>" xml-error-test
+T{ bad-version f 1 28 "5 million" } "<?xml version='5 million'?><x/>" xml-error-test
+T{ notags f 1 0 } "" xml-error-test
+T{ multitags } "<x/><y/>" xml-error-test
+T{ bad-prolog  f 1 26 T{ prolog f "1.0" "UTF-8" f }
+} "<x/><?xml version='1.0'?>" xml-error-test
+T{ capitalized-prolog f 1 6 "XmL" } "<?XmL version='1.0'?><x/>"
+xml-error-test
+T{ pre/post-content f "x" t } "x<y/>" xml-error-test
+T{ versionless-prolog f 1 8 } "<?xml?><x/>" xml-error-test
+T{ bad-instruction f 1 11 T{ instruction f "xsl" }
+} "<x><?xsl?></x>" xml-error-test
+T{ bad-directive f 1 15 T{ directive f "DOCTYPE" }
+} "<x/><!DOCTYPE>" xml-error-test
index 5b41a7ff9f1b6051415b9cd67b9845d64b0b870d..53f2046a544c77019cbc2c03ad56078e417ac3dc 100644 (file)
 ! Copyright (C) 2005, 2006 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
 USING: xml.data xml.writer kernel generic io prettyprint math 
-debugger sequences state-parser ;
+debugger sequences state-parser accessors inspector
+namespaces io.streams.string xml.backend ;
 IN: xml.errors
 
-TUPLE: no-entity thing ;
-: <no-entity> ( string -- error )
-    { set-no-entity-thing } no-entity construct-parsing-error ;
-M: no-entity error.
-    dup parsing-error.
-    "Entity does not exist: &" write no-entity-thing write ";" print ;
+TUPLE: multitags ;
+C: <multitags> multitags
+M: multitags summary ( obj -- str )
+    drop "XML document contains multiple main tags" ;
 
-TUPLE: xml-string-error string ; ! this should not exist
+TUPLE: pre/post-content string pre? ;
+C: <pre/post-content> pre/post-content
+M: pre/post-content summary ( obj -- str )
+    [
+        "The text string:" print
+        dup string>> .
+        "was used " write
+        pre?>> "before" "after" ? write
+        " the main tag." print
+    ] with-string-writer ;
+
+TUPLE: no-entity < parsing-error thing ;
+: <no-entity> ( string -- error )
+    \ no-entity parsing-error swap >>thing ;
+M: no-entity summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Entity does not exist: &" write thing>> write ";" print
+    ] with-string-writer ;
+
+TUPLE: xml-string-error < parsing-error string ; ! this should not exist
 : <xml-string-error> ( string -- xml-string-error )
-    { set-xml-string-error-string }
-    xml-string-error construct-parsing-error ;
-M: xml-string-error error.
-    dup parsing-error.
-    xml-string-error-string print ;
-
-TUPLE: mismatched open close ;
+    \ xml-string-error parsing-error swap >>string ;
+M: xml-string-error summary ( obj -- str )
+    [
+        dup call-next-method write
+        string>> print
+    ] with-string-writer ;
+
+TUPLE: mismatched < parsing-error open close ;
 : <mismatched>
-    { set-mismatched-open set-mismatched-close }
-    mismatched construct-parsing-error ;
-M: mismatched error.
-    dup parsing-error.
-    "Mismatched tags" print
-    "Opening tag: <" write dup mismatched-open print-name ">" print
-    "Closing tag: </" write mismatched-close print-name ">" print ;
-
-TUPLE: unclosed tags ;
-! <unclosed> is ( -- unclosed ), see presentation.factor
-M: unclosed error.
-    "Unclosed tags" print
-    "Tags: " print
-    unclosed-tags [ "  <" write print-name ">" print ] each ;
-
-TUPLE: bad-uri string ;
+    \ mismatched parsing-error swap >>close swap >>open ;
+M: mismatched summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Mismatched tags" print
+        "Opening tag: <" write dup open>> print-name ">" print
+        "Closing tag: </" write close>> print-name ">" print
+    ] with-string-writer ;
+
+TUPLE: unclosed < parsing-error tags ;
+: <unclosed> ( -- unclosed )
+    unclosed parsing-error
+        xml-stack get rest-slice [ first opener-name ] map >>tags ;
+M: unclosed summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Unclosed tags" print
+        "Tags: " print
+        tags>> [ "  <" write print-name ">" print ] each
+    ] with-string-writer ;
+
+TUPLE: bad-uri < parsing-error string ;
 : <bad-uri> ( string -- bad-uri )
-    { set-bad-uri-string } bad-uri construct-parsing-error ;
-M: bad-uri error.
-    dup parsing-error.
-    "Bad URI:" print bad-uri-string . ;
-
-TUPLE: nonexist-ns name ;
+    \ bad-uri parsing-error swap >>string ;
+M: bad-uri summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Bad URI:" print string>> .
+    ] with-string-writer ;
+
+TUPLE: nonexist-ns < parsing-error name ;
 : <nonexist-ns> ( name-string -- nonexist-ns )
-    { set-nonexist-ns-name }
-    nonexist-ns construct-parsing-error ;
-M: nonexist-ns error.
-    dup parsing-error.
-    "Namespace " write nonexist-ns-name write " has not been declared" print ;
-
-TUPLE: unopened ; ! this should give which tag was unopened
+    \ nonexist-ns parsing-error swap >>name ;
+M: nonexist-ns summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Namespace " write name>> write " has not been declared" print
+    ] with-string-writer ;
+
+TUPLE: unopened < parsing-error ; ! this should give which tag was unopened
 : <unopened> ( -- unopened )
-    { } unopened construct-parsing-error ;
-M: unopened error.
-    parsing-error.
-    "Closed an unopened tag" print ;
-
-TUPLE: not-yes/no text ;
+    \ unopened parsing-error ;
+M: unopened summary ( obj -- str )
+    [
+        call-next-method write
+        "Closed an unopened tag" print
+    ] with-string-writer ;
+
+TUPLE: not-yes/no < parsing-error text ;
 : <not-yes/no> ( text -- not-yes/no )
-    { set-not-yes/no-text } not-yes/no construct-parsing-error ;
-M: not-yes/no error.
-    dup parsing-error.
-    "standalone must be either yes or no, not \"" write
-    not-yes/no-text write "\"." print ;
-
-TUPLE: extra-attrs attrs ; ! this should actually print the names
+    \ not-yes/no parsing-error swap >>text ;
+M: not-yes/no summary ( obj -- str )
+    [
+        dup call-next-method write
+        "standalone must be either yes or no, not \"" write
+        text>> write "\"." print
+    ] with-string-writer ;
+
+! this should actually print the names
+TUPLE: extra-attrs < parsing-error attrs ;
 : <extra-attrs> ( attrs -- extra-attrs )
-    { set-extra-attrs-attrs }
-    extra-attrs construct-parsing-error ;
-M: extra-attrs error.
-    dup parsing-error.
-    "Extra attributes included in xml version declaration:" print
-    extra-attrs-attrs . ;
-
-TUPLE: bad-version num ;
+    \ extra-attrs parsing-error swap >>attrs ;
+M: extra-attrs summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Extra attributes included in xml version declaration:" print
+        attrs>> .
+    ] with-string-writer ;
+
+TUPLE: bad-version < parsing-error num ;
 : <bad-version>
-    { set-bad-version-num }
-    bad-version construct-parsing-error ;
-M: bad-version error.
-    "XML version must be \"1.0\" or \"1.1\". Version here was " write
-    bad-version-num . ;
+    \ bad-version parsing-error swap >>num ;
+M: bad-version summary ( obj -- str )
+    [
+        "XML version must be \"1.0\" or \"1.1\". Version here was " write
+        num>> .
+    ] with-string-writer ;
 
 TUPLE: notags ;
 C: <notags> notags
-M: notags error.
-    drop "XML document lacks a main tag" print ;
-
-TUPLE: multitags ;
-C: <multitags> multitags
-M: multitags error.
-    drop "XML document contains multiple main tags" print ;
+M: notags summary ( obj -- str )
+    drop "XML document lacks a main tag" ;
 
-TUPLE: bad-prolog prolog ;
+TUPLE: bad-prolog < parsing-error prolog ;
 : <bad-prolog> ( prolog -- bad-prolog )
-    { set-bad-prolog-prolog }
-    bad-prolog construct-parsing-error ;
-M: bad-prolog error.
-    dup parsing-error.
-    "Misplaced XML prolog" print
-    bad-prolog-prolog write-prolog nl ;
-
-TUPLE: capitalized-prolog name ;
+    \ bad-prolog parsing-error swap >>prolog ;
+M: bad-prolog summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Misplaced XML prolog" print
+        prolog>> write-prolog nl
+    ] with-string-writer ;
+
+TUPLE: capitalized-prolog < parsing-error name ;
 : <capitalized-prolog> ( name -- capitalized-prolog )
-    { set-capitalized-prolog-name }
-    capitalized-prolog construct-parsing-error ;
-M: capitalized-prolog error.
-    dup parsing-error.
-    "XML prolog name was partially or totally capitalized, using" print
-    "<?" write capitalized-prolog-name write "...?>" write
-    " instead of <?xml...?>" print ;
-
-TUPLE: pre/post-content string pre? ;
-C: <pre/post-content> pre/post-content
-M: pre/post-content error.
-    "The text string:" print
-    dup pre/post-content-string .
-    "was used " write
-    pre/post-content-pre? "before" "after" ? write
-    " the main tag." print ;
-
-TUPLE: versionless-prolog ;
+    \ capitalized-prolog parsing-error swap >>name ;
+M: capitalized-prolog summary ( obj -- str )
+    [
+        dup call-next-method write
+        "XML prolog name was partially or totally capitalized, using" print
+        "<?" write name>> write "...?>" write
+        " instead of <?xml...?>" print
+    ] with-string-writer ;
+
+TUPLE: versionless-prolog < parsing-error ;
 : <versionless-prolog> ( -- versionless-prolog )
-    { } versionless-prolog construct-parsing-error ;
-M: versionless-prolog error.
-    parsing-error.
-    "XML prolog lacks a version declaration" print ;
-
-TUPLE: bad-instruction inst ;
+    \ versionless-prolog parsing-error ;
+M: versionless-prolog summary ( obj -- str )
+    [
+        call-next-method write
+        "XML prolog lacks a version declaration" print
+    ] with-string-writer ;
+
+TUPLE: bad-instruction < parsing-error instruction ;
 : <bad-instruction> ( instruction -- bad-instruction )
-    { set-bad-instruction-inst }
-    bad-instruction construct-parsing-error ;
-M: bad-instruction error.
-    dup parsing-error.
-    "Misplaced processor instruction:" print
-    bad-instruction-inst write-item nl ;
-
-TUPLE: bad-directive dir ;
+    \ bad-instruction parsing-error swap >>instruction ;
+M: bad-instruction summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Misplaced processor instruction:" print
+        instruction>> write-item nl
+    ] with-string-writer ;
+
+TUPLE: bad-directive < parsing-error dir ;
 : <bad-directive> ( directive -- bad-directive )
-    { set-bad-directive-dir }
-    bad-directive construct-parsing-error ;
-M: bad-directive error.
-    dup parsing-error.
-    "Misplaced directive:" print
-    bad-directive-dir write-item nl ;
+    \ bad-directive parsing-error swap >>dir ;
+M: bad-directive summary ( obj -- str )
+    [
+        dup call-next-method write
+        "Misplaced directive:" print
+        bad-directive-dir write-item nl
+    ] with-string-writer ;
 
 UNION: xml-parse-error multitags notags extra-attrs nonexist-ns
        not-yes/no unclosed mismatched xml-string-error expected no-entity
diff --git a/extra/xml/tests/errors.factor b/extra/xml/tests/errors.factor
deleted file mode 100755 (executable)
index 6ba0b0d..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-USING: continuations xml xml.errors tools.test kernel arrays xml.data state-parser quotations ;
-IN: xml.tests
-
-: xml-error-test ( expected-error xml-string -- )
-    [ string>xml ] curry swap [ = ] curry must-fail-with ;
-
-T{ no-entity T{ parsing-error f 1 10 } "nbsp" } "<x>&nbsp;</x>" xml-error-test
-T{ mismatched T{ parsing-error f 1 8 } T{ name f "" "x" "" } T{ name f "" "y" "" }
-} "<x></y>" xml-error-test
-T{ unclosed f V{ T{ name f "" "x" "" } } } "<x>" xml-error-test
-T{ nonexist-ns T{ parsing-error f 1 5 } "x" } "<x:y/>" xml-error-test
-T{ unopened T{ parsing-error f 1 5 } } "</x>" xml-error-test
-T{ not-yes/no T{ parsing-error f 1 41 } "maybe" } "<?xml version='1.0' standalone='maybe'?><x/>" xml-error-test
-T{ extra-attrs T{ parsing-error f 1 32 } V{ T{ name f "" "foo" f } }
-} "<?xml version='1.1' foo='bar'?><x/>" xml-error-test
-T{ bad-version T{ parsing-error f 1 28 } "5 million" } "<?xml version='5 million'?><x/>" xml-error-test
-T{ notags f } "" xml-error-test
-T{ multitags f } "<x/><y/>" xml-error-test
-T{ bad-prolog T{ parsing-error f 1 26 } T{ prolog f "1.0" "UTF-8" f }
-} "<x/><?xml version='1.0'?>" xml-error-test
-T{ capitalized-prolog T{ parsing-error f 1 6 } "XmL" } "<?XmL version='1.0'?><x/>"
-xml-error-test
-T{ pre/post-content f "x" t } "x<y/>" xml-error-test
-T{ versionless-prolog T{ parsing-error f 1 8 } } "<?xml?><x/>" xml-error-test
-T{ bad-instruction T{ parsing-error f 1 11 } T{ instruction f "xsl" }
-} "<x><?xsl?></x>" xml-error-test
-T{ bad-directive T{ parsing-error f 1 15 } T{ directive f "DOCTYPE" }
-} "<x/><!DOCTYPE>" xml-error-test
index 775930025f0e7769f66f9fc405603b014407df85..c7452bb079f38c51c0c216e88959263bd0ad2b38 100755 (executable)
@@ -10,6 +10,6 @@ IN: xml.tests
     [ assemble-data ] map ;
 
 [ "http://www.foxnews.com/oreilly/" ] [
-    "extra/xml/tests/soap.xml" resource-path file>xml
+    "resource:extra/xml/tests/soap.xml" file>xml
     parse-result first first
 ] unit-test
index 72ab7b1340ec0c411dd1216112994d8781061fa0..77949301440ddfad9c97863030bed8342709957f 100644 (file)
@@ -9,7 +9,7 @@ USING: kernel xml tools.test io namespaces sequences xml.errors xml.entities
 \ read-xml must-infer
 
 SYMBOL: xml-file
-[ ] [ "extra/xml/tests/test.xml" resource-path
+[ ] [ "resource:extra/xml/tests/test.xml"
     [ file>xml ] with-html-entities xml-file set ] unit-test
 [ "1.0" ] [ xml-file get xml-prolog prolog-version ] unit-test
 [ f ] [ xml-file get xml-prolog prolog-standalone ] unit-test
@@ -36,7 +36,7 @@ SYMBOL: xml-file
 ] unit-test
 [ "abcd" ] [
     "<main>a<sub>bc</sub>d<nothing/></main>" string>xml
-    [ string? ] deep-subset concat
+    [ string? ] deep-filter concat
 ] unit-test
 [ "foo" ] [
     "<a><b id='c'>foo</b><d id='e'/></a>" string>xml
index 5ba151c2138518c452e74df51404cb7dfe19ed0c..b4ff3a4ce9feee378dd67b04dab6dc537185412b 100644 (file)
@@ -162,7 +162,7 @@ SYMBOL: ns-stack
         T{ name f "" "version" f }
         T{ name f "" "encoding" f }
         T{ name f "" "standalone" f }
-    } swap diff
+    } diff
     dup empty? [ drop ] [ <extra-attrs> throw ] if ; 
 
 : good-version ( version -- version )
index ed0773bd6fb3823b51e0141b5f8bff25cd0189f5..87a0242412b45081b46e1cd40fb2fa7a80f6a502 100755 (executable)
@@ -54,7 +54,7 @@ M: process-missing error.
     concat ;
 
 : children-tags ( tag -- sequence )
-    tag-children [ tag? ] subset ;
+    tag-children [ tag? ] filter ;
 
 : first-child-tag ( tag -- tag )
     tag-children [ tag? ] find nip ;
@@ -73,7 +73,7 @@ M: process-missing error.
     assure-name [ swap tag-named? ] curry deep-find ;
 
 : deep-tags-named ( tag name/string -- tags-seq )
-    tags@ [ swap tag-named? ] curry deep-subset ;
+    tags@ [ swap tag-named? ] curry deep-filter ;
 
 : tag-named ( tag name/string -- matching-tag )
     ! like get-name-tag but only looks at direct children,
@@ -81,7 +81,7 @@ M: process-missing error.
     assure-name swap [ tag-named? ] with find nip ;
 
 : tags-named ( tag name/string -- tags-seq )
-    tags@ swap [ tag-named? ] with subset ;
+    tags@ swap [ tag-named? ] with filter ;
 
 : tag-with-attr? ( elem attr-value attr-name -- ? )
     rot dup tag? [ at = ] [ 3drop f ] if ;
@@ -90,13 +90,13 @@ M: process-missing error.
     assure-name [ tag-with-attr? ] 2curry find nip ;
 
 : tags-with-attr ( tag attr-value attr-name -- tags-seq )
-    tags@ [ tag-with-attr? ] 2curry subset tag-children ;
+    tags@ [ tag-with-attr? ] 2curry filter tag-children ;
 
 : deep-tag-with-attr ( tag attr-value attr-name -- matching-tag )
     assure-name [ tag-with-attr? ] 2curry deep-find ;
 
 : deep-tags-with-attr ( tag attr-value attr-name -- tags-seq )
-    tags@ [ tag-with-attr? ] 2curry deep-subset ;
+    tags@ [ tag-with-attr? ] 2curry deep-filter ;
 
 : get-id ( tag id -- elem ) ! elem=tag.getElementById(id)
     "id" deep-tag-with-attr ;
index 44c92006a068de2b4681ac3ae34642662bbcc6cb..41e54228309b5de36bd48b9f15cca57145ce9846 100644 (file)
@@ -34,7 +34,7 @@ SYMBOL: indenter
 : ?filter-children ( children -- no-whitespace )\r
     xml-pprint? get [\r
         [ dup string? [ trim-whitespace ] when ] map\r
-        [ dup empty? swap string? and not ] subset\r
+        [ dup empty? swap string? and not ] filter\r
     ] when ;\r
 \r
 : print-name ( name -- )\r
index dd77d7c7665dd2e23ffb01c215d0ec52abc9dd1f..6a2ff1109ec67c8cc076dafa8ee7f15cac06a2af 100644 (file)
@@ -42,17 +42,17 @@ HELP: xml-reprint
 \r
 HELP: write-xml\r
 { $values { "xml" "an XML document" } }\r
-{ $description "prints the contents of an XML document (" { $link xml } ") to stdio" }\r
+{ $description "prints the contents of an XML document (" { $link xml } ") to " { $link output-stream } "." }\r
 { $notes "does not preserve what type of quotes were used or what data was omitted from version declaration" } ;\r
 \r
 HELP: print-xml\r
 { $values { "xml" "an XML document" } }\r
-{ $description "prints the contents of an XML document (" { $link xml } ") to stdio, followed by a newline" }\r
+{ $description "prints the contents of an XML document (" { $link xml } ") to " { $link output-stream } ", followed by a newline" }\r
 { $notes "does not preserve what type of quotes were used or what data was omitted from version declaration" } ;\r
 \r
 HELP: pprint-xml\r
 { $values { "xml" "an XML document" } }\r
-{ $description "prints the contents of an XML document (" { $link xml } ") to stdio in a prettyprinted form." }\r
+{ $description "prints the contents of an XML document (" { $link xml } ") to " { $link output-stream } " in a prettyprinted form." }\r
 { $notes "does not preserve what type of quotes were used or what data was omitted from version declaration" } ;\r
 \r
 HELP: pprint-xml-but\r
@@ -226,7 +226,7 @@ HELP: pull-xml
 \r
 HELP: <pull-xml>\r
 { $values { "pull-xml" "a pull-xml tuple" } }\r
-{ $description "creates an XML pull-based parser which reads from the " { $link stdio } " stream, executing all initial XML commands to set up the parser." }\r
+{ $description "creates an XML pull-based parser which reads from " { $link input-stream } ", executing all initial XML commands to set up the parser." }\r
 { $see-also pull-xml pull-elem pull-event } ;\r
 \r
 HELP: pull-elem\r
@@ -241,12 +241,12 @@ HELP: pull-event
 \r
 HELP: write-item\r
 { $values { "object" "an XML element" } }\r
-{ $description "writes an XML element to the " { $link stdio } " stream." }\r
+{ $description "writes an XML element to " { $link output-stream } "." }\r
 { $see-also write-chunk write-xml } ;\r
 \r
 HELP: write-chunk\r
 { $values { "seq" "an XML document fragment" } }\r
-{ $description "writes an XML document fragment, ie a sequence of XML elements, to the " { $link stdio } " stream." }\r
+{ $description "writes an XML document fragment, ie a sequence of XML elements, to " { $link output-stream } "." }\r
 { $see-also write-item write-xml } ;\r
 \r
 HELP: deep-tag-named\r
index 61ef27b72ef67a7f94fbf84207e3c8af3c03d461..4e2ad7a67231c7234a0af8ecc5f5910dc070e1f8 100644 (file)
@@ -3,18 +3,12 @@
 USING: io io.streams.string io.files kernel math namespaces
 prettyprint sequences arrays generic strings vectors
 xml.char-classes xml.data xml.errors xml.tokenize xml.writer
-xml.utilities state-parser assocs ascii io.encodings.utf8 ;
+xml.utilities state-parser assocs ascii io.encodings.utf8
+accessors xml.backend ;
 IN: xml
 
 !   -- Overall parser with data tree
 
-! A stack of { tag children } pairs
-SYMBOL: xml-stack
-
-: <unclosed> ( -- unclosed )
-    xml-stack get 1 tail-slice [ first opener-name ] map
-    { set-unclosed-tags } unclosed construct ;
-
 : add-child ( object -- )
     xml-stack get peek second push ;
 
@@ -72,7 +66,7 @@ M: closer process
     reset-prolog init-xml-stack init-ns-stack ;
 
 : assert-blanks ( seq pre? -- )
-    swap [ string? ] subset
+    swap [ string? ] filter
     [
         dup [ blank? ] all?
         [ drop ] [ swap <pre/post-content> throw ] if
@@ -93,7 +87,7 @@ M: closer process
 
 : make-xml-doc ( prolog seq -- xml-doc )
     dup [ tag? ] find
-    >r assure-tags cut 1 tail
+    >r assure-tags cut rest
     no-pre/post no-post-tags
     r> swap <xml> ;
 
@@ -104,7 +98,7 @@ SYMBOL: text-now?
 TUPLE: pull-xml scope ;
 : <pull-xml> ( -- pull-xml )
     [
-        stdio [ ] change ! bring stdio var in this scope
+        input-stream [ ] change ! bring var in this scope
         init-parser reset-prolog init-ns-stack
         text-now? on
     ] H{ } make-assoc
index 22d3217ee69c89b3e94514ee2a88a8bdb9a65682..277439c0cdb1bf3241b9693b569c387be9406fda 100755 (executable)
@@ -24,7 +24,7 @@ TAGS>
     ] keep ;
 
 : load-catalog ( -- modes )
-    "extra/xmode/modes/catalog" resource-path
+    "resource:extra/xmode/modes/catalog"
     file>xml parse-modes-tag ;
 
 : modes ( -- assoc )
@@ -38,8 +38,8 @@ TAGS>
 MEMO: (load-mode) ( name -- rule-sets )
     modes at [
         mode-file
-        "extra/xmode/modes/" prepend
-        resource-path utf8 <file-reader> parse-mode
+        "resource:extra/xmode/modes/" prepend
+        utf8 <file-reader> parse-mode
     ] [
         "text" (load-mode)
     ] if* ;
index a13e412afe4366e5d61bbdb5685f513c8f95b001..3977f4277c37a7f0bd9b33881560c59b8c90e319 100755 (executable)
@@ -20,8 +20,8 @@ IN: xmode.code2html
 
 : default-stylesheet ( -- )
     <style>
-        "extra/xmode/code2html/stylesheet.css"
-        resource-path utf8 file-contents write
+        "resource:extra/xmode/code2html/stylesheet.css"
+        utf8 file-contents write
     </style> ;
 
 : htmlize-stream ( path stream -- )
@@ -42,8 +42,7 @@ IN: xmode.code2html
 
 : htmlize-file ( path -- )
     dup utf8 [
-        stdio get
-        over ".html" append utf8 [
-            htmlize-stream
+        dup ".html" append utf8 [
+            input-stream get htmlize-stream
         ] with-file-writer
     ] with-file-reader ;
index 5fabe2b17dc52927e4821930b6850d297320e828..7b2bdd992a59d0a826b04150a16aad5321a2dc8d 100755 (executable)
@@ -9,7 +9,7 @@ IN: xmode.code2html.responder
     [\r
         drop\r
         "text/html" <content> swap\r
-        [ file-http-date "last-modified" set-header ]\r
+        [ "last-modified" set-header ]\r
         [\r
             '[\r
                 ,\r
index a6ef34a1f911fb9867dbe293bbf927eccc263a77..f78620986562f70ae993a7548ca09377194825a7 100644 (file)
@@ -26,7 +26,7 @@ M: keyword-map clear-assoc
 M: keyword-map >alist delegate >alist ;
 
 : (keyword-map-no-word-sep)
-    keys concat [ alpha? not ] subset prune natural-sort ;
+    keys concat [ alpha? not ] filter prune natural-sort ;
 
 : keyword-map-no-word-sep* ( keyword-map -- str )
     dup keyword-map-no-word-sep [ ] [
index 57a8a5ac16753d6a000e4a79900c68a46194f6e0..a2183edbc9f936c88ec0c59a44903fac2ea423d8 100755 (executable)
@@ -35,7 +35,7 @@ TAGS>
         { { "type" >upper set-company-type } }
         init-from-tag dup
     ] keep
-    tag-children [ tag? ] subset
+    tag-children [ tag? ] filter
     [ parse-employee-tag ] with each ;
 
 [
@@ -48,6 +48,6 @@ TAGS>
         "This is a great company"
     }
 ] [
-    "extra/xmode/utilities/test.xml"
-    resource-path file>xml parse-company-tag
+    "resource:extra/xmode/utilities/test.xml"
+    file>xml parse-company-tag
 ] unit-test
index f7c8606420ee21cb5f8b18e22c4c878a6b24a8d8..db59465b7b559e937e5aa5585821d5d55945cc72 100644 (file)
@@ -4,7 +4,7 @@ IN: xmode.utilities
 
 : implies >r not r> or ; inline
 
-: child-tags ( tag -- seq ) tag-children [ tag? ] subset ;
+: child-tags ( tag -- seq ) tag-children [ tag? ] filter ;
 
 : map-find ( seq quot -- result elt )
     f -rot
@@ -13,7 +13,7 @@ IN: xmode.utilities
 
 : tag-init-form ( spec -- quot )
     {
-        { [ dup quotation? ] [ [ object get tag get ] swap compose ] }
+        { [ dup quotation? ] [ [ object get tag get ] prepose ] }
         { [ dup length 2 = ] [
             first2 [
                 >r >r tag get children>string
@@ -29,7 +29,7 @@ IN: xmode.utilities
     } cond ;
 
 : with-tag-initializer ( tag obj quot -- )
-    [ object set tag set ] swap compose with-scope ; inline
+    [ object set tag set ] prepose with-scope ; inline
 
 MACRO: (init-from-tag) ( specs -- )
     [ tag-init-form ] map concat [ ] like
index 197fa4900b3cd68473f158dfa8c39986d8877778..46d05ce720212d02c28526d92c77a12d6a3d1d92 100644 (file)
@@ -6,6 +6,6 @@ USING: tools.test yahoo kernel io.files xml sequences ;
     "Official Foo Fighters"
     "http://www.foofighters.com/"
     "Official site with news, tour dates, discography, store, community, and more."
-} ] [ "extra/yahoo/test-results.xml" resource-path file>xml parse-yahoo first ] unit-test
+} ] [ "resource:extra/yahoo/test-results.xml" file>xml parse-yahoo first ] unit-test
 
 [ "http://search.yahooapis.com/WebSearchService/V1/webSearch?appid=Factor-search&query=hi&results=1" ] [ "hi" 1 query ] unit-test
index 1725c10a44df041e61e9b534aed3f2f84aa8ed2e..89f937d847e0afa27fc974b5ffe5c7494c0e0c15 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
 USING: http.client xml xml.utilities kernel sequences
-namespaces http math.parser help ;
+namespaces http math.parser help math.order ;
 IN: yahoo
 
 TUPLE: result title url summary ;
index 03394b933c04cb7da3b6aae31336b5b808e69179..1bf9a17aa6c26a7e0f83b9b0f33bb4a9a30a3dfa 100644 (file)
@@ -29,7 +29,7 @@
                        <key>begin</key>
                        <string>&lt;%\s</string>
                        <key>end</key>
-                       <string>\s%&gt;</string>
+                       <string>(?&lt;=\s)%&gt;</string>
                        <key>name</key>
                        <string>source.factor.embedded.html</string>
                        <key>patterns</key>
index 93ce3d6bd5d64b084fc8234c8633a3cb70bd0803..d1c46cee0b0ca3a207af5f519e7d73bdad486759 100644 (file)
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:    factor
 " Maintainer:  Alex Chapman <chapman.alex@gmail.com>
-" Last Change: 2007 Jan 18
+" Last Change: 2008 Apr 28
 
 " For version 5.x: Clear all syntax items
 " For version 6.x: Quit when a syntax file was already loaded
@@ -48,17 +48,17 @@ syn keyword factorCompileDirective inline foldable parsing
 
 
 " kernel vocab keywords
-syn keyword factorKeyword or construct-delegate set-slots tuck while wrapper nip hashcode wrapper? both? callstack>array die dupd set-delegate callstack callstack? 3dup pick curry build >boolean ?if clone eq? = ? swapd call-clear 2over 2keep 3keep construct general-t clear 2dup when not tuple? 3compose dup call object wrapped unless* if* 2apply >r curry-quot drop when* retainstack -rot delegate with 3slip construct-boa slip compose-first compose-second 3drop construct-empty either? curry? datastack compare curry-obj over 3curry roll throw swap and 2nip set-retainstack (clone) hashcode* get-slots compose spin if <=> unless compose? tuple keep 2curry object? equal? set-datastack 2slip 2drop most <wrapper> null r> set-callstack dip xor rot -roll 
-syn keyword factorKeyword assoc? assoc-clone-like delete-any assoc= delete-at* new-assoc subassoc? assoc-size map>assoc union search-alist assoc-like key? update at* assoc-empty? at+ set-at assoc-all? assoc-hashcode intersect change-at assoc-each assoc-subset values rename-at value-at (assoc-stack) at cache assoc>map assoc-contains? assoc assoc-map assoc-pusher diff (assoc>map) assoc-push-if remove-all >alist (substitute) substitute-here clear-assoc assoc-stack substitute delete-at assoc-find keys 
-syn keyword factorKeyword case dispatch-case-quot with-datastack alist>quot dispatch-case hash-case-table <buckets> hash-case-quot no-cond no-case? cond distribute-buckets (distribute-buckets) contiguous-range? cond>quot no-cond? no-case recursive-hashcode linear-case-quot hash-dispatch-quot case>quot 
-syn keyword factorKeyword byte-array>bignum sgn >bignum number= each-integer next-power-of-2 before? imaginary-part mod recip float>bits rational >float number? 2^ bignum? integer fixnum? after? fixnum before=? bignum sq neg denominator [-] (all-integers?) times find-last-integer (each-integer) bit? * + - / >= bitand find-integer complex < real > log2 integer? max number bits>double double>bits bitor 2/ zero? rem all-integers? (find-integer) real-part align bits>float float? shift between? float 1+ 1- min fp-nan? ratio? bitxor even? ratio <= /mod >integer odd? rational? bitnot real? >fixnum complex? (next-power-of-2) /i numerator after=? /f 
-syn keyword factorKeyword slice-to append left-trim clone-like 3sequence set-column-seq map-as reversed pad-left cut* nth sequence slice? <slice> tail-slice empty? tail* member? unclip virtual-sequence? set-length last-index* <column> drop-prefix bounds-error? set-slice-seq set-column-col seq-diff map start open-slice midpoint@ add* set-immutable-seq move-forward fourth delete set-slice-to all-eq? monotonic? set-reversed-seq like delete-nth first4 repetition-len (open-slice) column? reverse slice padding virtual@ repetition? index 4sequence max-length set-second first2 first3 (3append) supremum unclip-slice index* move-backward tail 3append sequence-hashcode-step right-trim reversed-seq pad-right concat find* set-slice-from flip sum find-last* immutable? 2sequence delete-all start* immutable-sequence? (append) check-slice column-seq sequence? head set-slice-error-reason reduce set-bounds-error-index reverse-here sequence= halves collapse-slice interleave 2map binary-reduce virtual-seq slice-error? product bounds-check? bounds-check immutable find column remove ((append)) set-fourth peek contains? reversed? shorter? push-new find-last head-slice pop* immutable-seq tail-slice* accumulate each pusher all-equal? new-resizable cut-slice head-slice* 2reverse-each pop memq? set-nth ?nth <flat-slice> second change-each join set-repetition-len <reversed> all? virtual-sequence set-repetition-elt subseq? immutable-sequence slice-error-reason new-like length last-index seq-intersect push-if 2all? lengthen column-col joined-length copy set-bounds-error-seq cache-nth move third first slice-from repetition-elt tail? set-first bounds-error add bounds-error-seq bounds-error-index <repetition> unfold exchange slice-seq cut 2reduce change-nth min-length set-third (delete) push-all head? delete-slice sum-lengths new 2each head* infimum subset slice-error subseq replace-slice repetition push trim sequence-hashcode mismatch 
+syn keyword factorKeyword or construct-delegate set-slots tuck 2bi 2tri while wrapper nip bi* wrapper? hashcode callstack>array both? die set-delegate dupd callstack callstack? 3dup tri@ pick curry build prepose 3bi >boolean ?if clone eq? tri* ? = swapd call-clear 2over 2keep 3keep construct clear 2dup when not tuple? 3compose dup 2bi* call object bi@ wrapped unless* if* >r curry-quot drop when* retainstack -rot 2bi@ delegate boa with 3slip slip compose-first compose-second 3drop either? bi curry? datastack curry-obj over 3curry roll throw swap and 2nip set-retainstack (clone) hashcode* get-slots compose spin if 3tri unless compose? tuple keep 2curry equal? set-datastack 2slip tri 2drop most <wrapper> identity-tuple? null r> new set-callstack dip xor rot -roll identity-tuple 
+syn keyword factorKeyword assoc? assoc-clone-like delete-any assoc= delete-at* new-assoc subassoc? assoc-size map>assoc search-alist assoc-like key? assoc-intersect update assoc-union at* assoc-empty? at+ set-enum-seq set-at assoc-all? assoc-hashcode change-at assoc-each assoc-diff zip values value-at rename-at (assoc-stack) enum? at cache assoc>map assoc-contains? <enum> assoc assoc-map assoc-pusher (assoc>map) enum assoc-push-if remove-all >alist (substitute) substitute-here clear-assoc assoc-stack substitute assoc-filter delete-at assoc-find enum-seq keys 
+syn keyword factorKeyword case dispatch-case-quot with-datastack <buckets> no-cond no-case? 3cleave>quot (distribute-buckets) contiguous-range? 2cleave cond>quot no-cond? cleave>quot no-case recursive-hashcode case>quot 3cleave alist>quot dispatch-case hash-case-table hash-case-quot case-find cond cleave distribute-buckets 2cleave>quot linear-case-quot spread spread>quot hash-dispatch-quot 
+syn keyword factorKeyword byte-array>bignum sgn >bignum number= each-integer next-power-of-2 ?1+ imaginary-part mod recip float>bits rational >float number? 2^ bignum? integer fixnum? neg fixnum sq bignum (all-integers?) times denominator find-last-integer (each-integer) bit? * + power-of-2? - / >= bitand find-integer complex < real > log2 integer? number bits>double double>bits bitor 2/ zero? rem all-integers? (find-integer) real-part align bits>float float? shift float 1+ 1- fp-nan? ratio? bitxor even? ratio <= /mod >integer odd? rational? bitnot real? >fixnum complex? (next-power-of-2) /i numerator /f 
+syn keyword factorKeyword slice-to append left-trim find-last-from clone-like 3sequence map-as last-index-from reversed index-from pad-left cut* nth sequence slice? <slice> tail-slice empty? tail* find-from member? virtual-sequence? unclip set-length drop-prefix bounds-error? set-slice-seq map start open-slice midpoint@ set-immutable-seq move-forward rest-slice prepend fourth delete set-slice-to new-sequence follow all-eq? monotonic? set-reversed-seq like delete-nth first4 repetition-len (open-slice) reverse slice padding virtual@ repetition? index 4sequence max-length set-second first2 first3 (3append) supremum unclip-slice move-backward tail 3append sequence-hashcode-step right-trim reversed-seq pad-right suffix concat set-slice-from flip filter sum immutable? 2sequence delete-all start* immutable-sequence? (append) check-slice sequence? head set-slice-error-reason reduce set-bounds-error-index reverse-here sequence= halves collapse-slice interleave 2map binary-reduce virtual-seq slice-error? product bounds-check? bounds-check immutable find remove ((append)) set-fourth peek contains? reversed? shorter? push-new find-last head-slice pop* immutable-seq tail-slice* accumulate each pusher all-equal? new-resizable cut-slice head-slice* 2reverse-each pop memq? set-nth ?nth <flat-slice> second change-each join set-repetition-len <reversed> all? virtual-sequence set-repetition-elt subseq? immutable-sequence slice-error-reason new-like length last-index push-if 2all? lengthen joined-length copy set-bounds-error-seq cache-nth move third first slice-from repetition-elt tail? set-first prefix bounds-error bounds-error-seq bounds-error-index <repetition> unfold exchange slice-seq cut 2reduce change-nth min-length set-third (delete) push-all head? delete-slice rest sum-lengths 2each head* infimum sequence-hashcode slice-error subseq replace-slice repetition push trim mismatch 
 syn keyword factorKeyword global +@ set-namestack with-variable on set bind dec namestack get get-global change init-namespaces with-scope off set-global namespace % make , inc counter building make-assoc 
 syn keyword factorKeyword <array> 3array >array 4array pair? array pair 2array 1array resize-array array? 
 syn keyword factorKeyword readln stream-read-until stream-read-partial stderr with-stream read with-stream* print contents make-span-stream write1 stream-write1 stream-format make-block-stream stream-copy with-cell stream-write format with-row stream-print stream-read with-nesting (stream-copy) bl write-object nl stream-nl write stdio flush read-until tabular-output make-cell-stream write-cell stream-flush read1 lines stream-read1 stream-write-table with-style stream-readln 
 syn keyword factorKeyword resize-string >string <string> 1string string string? 
 syn keyword factorKeyword vector? <vector> ?push vector >vector 1vector 
-syn keyword factorKeyword rethrow-restarts restarts recover set-restart-name set-continuation-name condition-continuation <restart> ifcc continuation-name set-restart-continuation ignore-errors continuation-retain continue <continuation> restart-continuation with-disposal set-continuation-catch restart-obj error thread-error-hook set-continuation-retain continuation rethrow callcc1 callcc0 condition continuation? continuation-call continuation-data set-condition-restarts set-catchstack >continuation< error-continuation cleanup restart? compute-restarts condition? error-thread set-continuation-call set-condition-continuation <condition> set-restart-obj dispose set-continuation-data throw-restarts catchstack continue-with attempt-all restart restart-name continuation-catch condition-restarts 
+syn keyword factorKeyword rethrow-restarts restarts recover set-restart-name set-continuation-name condition-continuation <restart> ifcc continuation-name condition-error set-restart-continuation ignore-errors continuation-retain continue <continuation> restart-continuation with-disposal set-continuation-catch set-condition-error restart-obj error thread-error-hook set-continuation-retain continuation rethrow callcc1 callcc0 condition continuation? continuation-call continuation-data set-condition-restarts set-catchstack >continuation< error-continuation cleanup restart? compute-restarts condition? error-thread set-continuation-call set-condition-continuation <condition> set-restart-obj dispose set-continuation-data throw-restarts catchstack continue-with attempt-all restart restart-name continuation-catch condition-restarts 
 
 
 syn cluster factorReal   contains=factorInt,factorFloat,factorRatio,factorBinary,factorHex,factorOctal
index 7bcba78cdebfb32943fc1728f89d28dc92765b07..b0d61b8dd0c8cfdc61eb5ecc4dd87f0ac3799638 100644 (file)
@@ -2,7 +2,7 @@
 %>" Vim syntax file
 " Language:    factor
 " Maintainer:  Alex Chapman <chapman.alex@gmail.com>
-" Last Change: 2007 Jan 18
+" Last Change: 2008 Apr 28
 
 " For version 5.x: Clear all syntax items
 " For version 6.x: Quit when a syntax file was already loaded
diff --git a/unmaintained/openssl/authors.txt b/unmaintained/openssl/authors.txt
new file mode 100644 (file)
index 0000000..7c29e7c
--- /dev/null
@@ -0,0 +1 @@
+Elie Chaftari
diff --git a/unmaintained/openssl/libcrypto/libcrypto.factor b/unmaintained/openssl/libcrypto/libcrypto.factor
new file mode 100755 (executable)
index 0000000..312c7b0
--- /dev/null
@@ -0,0 +1,131 @@
+! Copyright (C) 2007 Elie CHAFTARI
+! See http://factorcode.org/license.txt for BSD license.
+!
+! Tested with OpenSSL 0.9.8a_0 on Mac OS X 10.4.9 PowerPC
+!
+! export LD_LIBRARY_PATH=/opt/local/lib
+
+USING: alien alien.syntax combinators kernel system ;
+
+IN: openssl.libcrypto
+
+<<
+"libcrypto" {
+    { [ os winnt? ]  [ "libeay32.dll" "cdecl" ] }
+    { [ os macosx? ] [ "libcrypto.dylib" "cdecl" ] }
+    { [ os unix? ]   [ "libcrypto.so" "cdecl" ] }
+} cond add-library
+>>
+
+C-STRUCT: bio-method
+    { "int" "type" }
+    { "void*" "name" }
+    { "void*" "bwrite" }
+    { "void*" "bread" }
+    { "void*" "bputs" }
+    { "void*" "bgets" }
+    { "void*" "ctrl" }
+    { "void*" "create" }
+    { "void*" "destroy" }
+    { "void*" "callback-ctrl" } ;
+
+C-STRUCT: bio
+    { "void*" "method" }
+    { "void*" "callback" }
+    { "void*" "cb-arg" }
+    { "int" "init" }
+    { "int" "shutdown" }
+    { "int" "flags" }
+    { "int" "retry-reason" }
+    { "int" "num" }
+    { "void*" "ptr" }
+    { "void*" "next-bio" }
+    { "void*" "prev-bio" }
+    { "int" "references" } 
+    { "ulong" "num-read" }
+    { "ulong" "num-write" } 
+    { "void*" "crypto-ex-data-stack" }
+    { "int" "crypto-ex-data-dummy" } ;
+
+: BIO_NOCLOSE       HEX: 00 ; inline
+: BIO_CLOSE         HEX: 01 ; inline
+
+: RSA_3             HEX: 3 ; inline
+: RSA_F4            HEX: 10001 ; inline
+
+: BIO_C_SET_SSL     109 ; inline
+: BIO_C_GET_SSL     110 ; inline
+
+LIBRARY: libcrypto
+
+! ===============================================
+! bio.h
+! ===============================================
+
+FUNCTION: bio* BIO_new_file ( char* filename, char* mode ) ;
+
+FUNCTION: int BIO_printf ( bio* bio, char* format ) ;
+
+FUNCTION: long BIO_ctrl ( void* bio, int cmd, long larg, void* parg ) ;
+
+FUNCTION: void* BIO_new_socket ( int fd, int close-flag ) ;
+
+FUNCTION: void* BIO_new ( void* method ) ;
+
+FUNCTION: int BIO_set ( void* bio, void* method ) ;
+
+FUNCTION: int BIO_free ( void* bio ) ;
+
+FUNCTION: void* BIO_push ( void* bio, void* append ) ;
+
+FUNCTION: int BIO_read ( void* b, void* buf, int len ) ;
+
+FUNCTION: int BIO_gets ( void* b, char* buf, int size ) ;
+
+FUNCTION: int BIO_write ( void* b, void* buf, int len ) ;
+
+FUNCTION: int BIO_puts ( void* bp, char* buf ) ;
+
+FUNCTION: ulong ERR_get_error (  ) ;
+
+FUNCTION: char* ERR_error_string ( ulong e, void* buf ) ;
+
+FUNCTION: void* BIO_f_buffer (  ) ;
+
+! ===============================================
+! evp.h
+! ===============================================
+
+! Initialize ciphers and digest tables
+FUNCTION: void OpenSSL_add_all_ciphers (  ) ;
+
+FUNCTION: void OpenSSL_add_all_digests (  ) ;
+
+! Clean them up before exiting
+FUNCTION: void EVP_cleanup (  ) ;
+
+FUNCTION: void* EVP_get_digestbyname ( char* name ) ;
+
+FUNCTION: void EVP_MD_CTX_init ( void* ctx ) ;
+
+FUNCTION: void* PEM_read_bio_DHparams ( void* bp, void* x, void* cb,
+                                        void* u ) ;
+
+! ===============================================
+! md5.h
+! ===============================================
+
+FUNCTION: uchar* MD5 ( uchar* d, ulong n, uchar* md ) ;
+
+! ===============================================
+! rsa.h
+! ===============================================
+
+FUNCTION: void* RSA_generate_key ( int num, ulong e, void* callback,
+                                   void* cb_arg ) ;
+
+FUNCTION: int RSA_check_key ( void* rsa ) ;
+
+FUNCTION: void RSA_free ( void* rsa ) ;
+
+FUNCTION: int RSA_print_fp ( void* fp, void* x, int offset ) ;
diff --git a/unmaintained/openssl/libssl/libssl.factor b/unmaintained/openssl/libssl/libssl.factor
new file mode 100755 (executable)
index 0000000..0f2e7b3
--- /dev/null
@@ -0,0 +1,174 @@
+! Copyright (C) 2007 Elie CHAFTARI
+! See http://factorcode.org/license.txt for BSD license.
+!
+! Tested with OpenSSL 0.9.8a_0 on Mac OS X 10.4.9 PowerPC
+!
+! export LD_LIBRARY_PATH=/opt/local/lib
+
+USING: alien alien.syntax combinators kernel system ;
+
+IN: openssl.libssl
+
+<< "libssl" {
+    { [ os winnt? ]  [ "ssleay32.dll" "cdecl" ] }
+    { [ os macosx? ] [ "libssl.dylib" "cdecl" ] }
+    { [ os unix? ]   [ "libssl.so" "cdecl" ] }
+} cond add-library >>
+
+: X509_FILETYPE_PEM       1 ; inline
+: X509_FILETYPE_ASN1      2 ; inline
+: X509_FILETYPE_DEFAULT   3 ; inline
+
+: SSL_FILETYPE_ASN1  X509_FILETYPE_ASN1 ; inline
+: SSL_FILETYPE_PEM   X509_FILETYPE_PEM ; inline
+
+: SSL_CTRL_NEED_TMP_RSA      1 ; inline
+: SSL_CTRL_SET_TMP_RSA       2 ; inline
+: SSL_CTRL_SET_TMP_DH        3 ; inline
+: SSL_CTRL_SET_TMP_RSA_CB    4 ; inline
+: SSL_CTRL_SET_TMP_DH_CB     5 ; inline
+
+: SSL_ERROR_NONE             0 ; inline
+: SSL_ERROR_SSL              1 ; inline
+: SSL_ERROR_WANT_READ        2 ; inline
+: SSL_ERROR_WANT_WRITE       3 ; inline
+: SSL_ERROR_WANT_X509_LOOKUP 4 ; inline
+: SSL_ERROR_SYSCALL          5 ; inline ! consult errno for details
+: SSL_ERROR_ZERO_RETURN      6 ; inline
+: SSL_ERROR_WANT_CONNECT     7 ; inline
+: SSL_ERROR_WANT_ACCEPT      8 ; inline
+
+! Error messages table
+: error-messages ( -- hash )
+    H{
+        { 0  "SSL_ERROR_NONE" }
+        { 1  "SSL_ERROR_SSL" }
+        { 2  "SSL_ERROR_WANT_READ" }
+        { 3  "SSL_ERROR_WANT_WRITE" }
+        { 4  "SSL_ERROR_WANT_X509_LOOKUP" }
+        { 5  "SSL_ERROR_SYSCALL" }
+        { 6  "SSL_ERROR_ZERO_RETURN" }
+        { 7  "SSL_ERROR_WANT_CONNECT" }
+        { 8  "SSL_ERROR_WANT_ACCEPT" }
+    } ;
+
+TYPEDEF: void* ssl-method
+TYPEDEF: void* ssl-ctx
+TYPEDEF: void* ssl-pointer
+
+LIBRARY: libssl
+
+! ===============================================
+! ssl.h
+! ===============================================
+
+FUNCTION: char* SSL_get_version ( ssl-pointer ssl ) ;
+
+! Maps OpenSSL errors to strings
+FUNCTION: void SSL_load_error_strings (  ) ;
+
+! Must be called before any other action takes place
+FUNCTION: int SSL_library_init (  ) ;
+
+! Sets the default SSL version
+FUNCTION: ssl-method SSLv2_client_method (  ) ;
+
+FUNCTION: ssl-method SSLv23_client_method (  ) ;
+
+FUNCTION: ssl-method SSLv23_server_method (  ) ;
+
+FUNCTION: ssl-method SSLv23_method (  ) ; ! SSLv3 but can rollback to v2
+
+FUNCTION: ssl-method SSLv3_client_method (  ) ;
+
+FUNCTION: ssl-method SSLv3_server_method (  ) ;
+
+FUNCTION: ssl-method SSLv3_method (  ) ;
+
+FUNCTION: ssl-method TLSv1_client_method (  ) ;
+
+FUNCTION: ssl-method TLSv1_server_method (  ) ;
+
+FUNCTION: ssl-method TLSv1_method (  ) ;
+
+! Creates the context
+FUNCTION: ssl-ctx SSL_CTX_new ( ssl-method method ) ;
+
+! Load the certificates and private keys into the SSL_CTX
+FUNCTION: int SSL_CTX_use_certificate_chain_file ( ssl-ctx ctx,
+                                                   char* file ) ; ! PEM type
+FUNCTION: ssl-pointer SSL_new ( ssl-ctx ctx ) ;
+
+FUNCTION: int SSL_set_fd ( ssl-pointer ssl, int fd ) ;
+
+FUNCTION: void SSL_set_bio ( ssl-pointer ssl, void* rbio, void* wbio ) ;
+
+FUNCTION: int SSL_get_error ( ssl-pointer ssl, int ret ) ;
+
+FUNCTION: void SSL_set_connect_state ( ssl-pointer ssl ) ;
+
+FUNCTION: void SSL_set_accept_state ( ssl-pointer ssl ) ;
+
+FUNCTION: int SSL_connect ( ssl-pointer ssl ) ;
+
+FUNCTION: int SSL_accept ( ssl-pointer ssl ) ;
+
+FUNCTION: int SSL_write ( ssl-pointer ssl, void* buf, int num ) ;
+
+FUNCTION: int SSL_read ( ssl-pointer ssl, void* buf, int num ) ;
+
+FUNCTION: void SSL_shutdown ( ssl-pointer ssl ) ;
+
+FUNCTION: void SSL_free ( ssl-pointer ssl ) ;
+
+FUNCTION: void SSL_CTX_free ( ssl-ctx ctx ) ;
+
+FUNCTION: void RAND_seed ( void* buf, int num ) ;
+
+FUNCTION: int SSL_set_cipher_list ( ssl-pointer ssl, char* str ) ;
+
+FUNCTION: int SSL_use_RSAPrivateKey_file ( ssl-pointer ssl, char* str ) ;
+
+FUNCTION: int SSL_CTX_use_RSAPrivateKey_file ( ssl-ctx ctx, int type ) ;
+
+FUNCTION: int SSL_use_certificate_file ( ssl-pointer ssl,
+                                         char* str, int type ) ;
+
+FUNCTION: int SSL_CTX_load_verify_locations ( ssl-ctx ctx, char* CAfile,
+                                              char* CApath ) ;
+
+FUNCTION: void SSL_CTX_set_client_CA_list ( ssl-ctx ctx, ssl-pointer list ) ;
+
+FUNCTION: ssl-pointer SSL_load_client_CA_file ( char* file ) ;
+
+! Used to manipulate settings of the SSL_CTX and SSL objects.
+! This function should never be called directly
+FUNCTION: long SSL_CTX_ctrl ( ssl-ctx ctx, int cmd, long larg, void* parg ) ;
+
+FUNCTION: void SSL_CTX_set_default_passwd_cb ( ssl-ctx ctx, void* cb ) ;
+
+FUNCTION: void SSL_CTX_set_default_passwd_cb_userdata ( ssl-ctx ctx,
+                                                        void* u ) ;
+
+FUNCTION: int SSL_CTX_use_PrivateKey_file ( ssl-ctx ctx, char* file,
+                                            int type ) ;
+
+! Sets the maximum depth for the allowed ctx certificate chain verification 
+FUNCTION: void SSL_CTX_set_verify_depth ( ssl-ctx ctx, int depth ) ;
+
+! Sets DH parameters to be used to be dh.
+! The key is inherited by all ssl objects created from ctx
+FUNCTION: void SSL_CTX_set_tmp_dh_callback ( ssl-ctx ctx, void* dh ) ;
+
+FUNCTION: void SSL_CTX_set_tmp_rsa_callback ( ssl-ctx ctx, void* rsa ) ;
+
+FUNCTION: void* BIO_f_ssl (  ) ;
+
+! ===============================================
+! sha.h
+! ===============================================
+
+! For a high level interface to message digests
+! use the EVP digest routines in libcrypto.factor
+
+FUNCTION: uchar* SHA1 ( uchar* d, ulong n, uchar* md ) ;
diff --git a/unmaintained/openssl/openssl-docs.factor b/unmaintained/openssl/openssl-docs.factor
new file mode 100644 (file)
index 0000000..dd31bfd
--- /dev/null
@@ -0,0 +1,10 @@
+
+USING: help.syntax help.markup ;
+
+IN: openssl
+
+ARTICLE: "openssl" "OpenSSL"
+
+"Factor on Windows has been tested with this version of OpenSSL: "
+
+{ $url "http://www.openssl.org/related/binaries.html" } ;
\ No newline at end of file
diff --git a/unmaintained/openssl/openssl-tests.factor b/unmaintained/openssl/openssl-tests.factor
new file mode 100755 (executable)
index 0000000..2b840bd
--- /dev/null
@@ -0,0 +1,146 @@
+USING: alien alien.c-types alien.strings assocs bit-arrays
+hashtables io io.files io.encodings.ascii io.sockets kernel
+mirrors openssl.libcrypto openssl.libssl namespaces math
+math.parser openssl prettyprint sequences tools.test ;
+
+! =========================================================
+! Some crypto functions (still to be turned into words)
+! =========================================================
+
+[
+    B{ 201 238 222 100 92 200 182 188 138 255 129 163 115 88 240 136 }
+]
+[ "Hello world from the openssl binding" >md5 ] unit-test
+
+! Not found on netbsd, windows -- why?
+! [
+    ! B{ 63 113 237 255 181 5 152 241 136 181 43 95 160 105 44 87 49
+    ! 82 115 0 }
+! ]
+! [ "Hello world from the openssl binding" >sha1 ] unit-test
+
+! =========================================================
+! Initialize context
+! =========================================================
+
+[ ] [ init load-error-strings ] unit-test
+
+[ ] [ ssl-v23 new-ctx ] unit-test
+
+[ ] [ get-ctx "resource:extra/openssl/test/server.pem" use-cert-chain ] unit-test
+
+! TODO: debug 'Memory protection fault at address 6c'
+! get-ctx 1024 "char" malloc-array 1024 0 f password-cb set-default-passwd
+
+[ ] [ get-ctx "password" ascii string>alien set-default-passwd-userdata ] unit-test
+
+! Enter PEM pass phrase: password
+[ ] [ get-ctx "resource:extra/openssl/test/server.pem"
+SSL_FILETYPE_PEM use-private-key ] unit-test
+
+[ ] [ get-ctx "resource:extra/openssl/test/root.pem" f
+verify-load-locations ] unit-test
+
+[ ] [ get-ctx 1 set-verify-depth ] unit-test
+
+! =========================================================
+! Load Diffie-Hellman parameters
+! =========================================================
+
+[ ] [ "resource:extra/openssl/test/dh1024.pem" "r" bio-new-file ] unit-test
+
+[ ] [ get-bio f f f read-pem-dh-params ] unit-test
+
+[ ] [ get-bio bio-free ] unit-test
+
+! TODO: debug SSL_CTX_set_tmp_dh 'No such symbol'
+[ ] [ get-ctx get-dh set-tmp-dh-callback ] unit-test
+
+! Workaround (this function should never be called directly)
+! [ ] [ get-ctx SSL_CTRL_SET_TMP_DH 0 get-dh set-ctx-ctrl ] unit-test
+
+! =========================================================
+! Generate ephemeral RSA key
+! =========================================================
+
+[ ] [ 512 RSA_F4 f f generate-rsa-key ] unit-test
+
+! TODO: debug SSL_CTX_set_tmp_rsa 'No such symbol'
+! get-ctx get-rsa set-tmp-rsa-callback
+
+! Workaround (this function should never be called directly)
+[ ] [ get-ctx SSL_CTRL_SET_TMP_RSA 0 get-rsa set-ctx-ctrl ] unit-test
+
+[ ] [ get-rsa free-rsa ] unit-test
+
+! =========================================================
+! Listen and accept on socket
+! =========================================================
+
+! SYMBOL: sock
+! SYMBOL: fdset
+! SYMBOL: acset
+! SYMBOL: sbio
+! SYMBOL: ssl
+! 
+! : is-set ( seq -- newseq )
+!     <enum> >alist [ nip ] assoc-filter >hashtable keys ;
+! 
+! ! 1234 server-socket sock set
+! "127.0.0.1" 1234 <inet4> SOCK_STREAM server-fd sock set
+! 
+! FD_SETSIZE 8 * <bit-array> fdset set
+! 
+! FD_SETSIZE 8 * <bit-array> t 8 rot [ set-nth ] keep fdset set
+! 
+! fdset get is-set .
+
+! : loop ( -- )
+!     sock get f f accept
+!     dup -1 = [ drop ] [
+!         dup number>string print flush
+!         ! BIO_NOCLOSE bio-new-socket sbio set
+!         [ get-ctx new-ssl ssl set ] keep
+!         ssl get swap set-ssl-fd
+!         ! ssl get sbio get dup set-ssl-bio
+!         ! ssl get ssl-accept
+!         ! dup 0 <= [ 
+!         !     ssl get swap ssl-get-error 
+!         ! ] [ drop ] if
+!     ] if
+!     loop ;
+
+! { } acset set
+! 
+! : loop ( -- )
+!     ! FD_SETSIZE fdset get f f f select . flush
+!     FD_SETSIZE fdset get f f 10000 make-timeval select 
+!     0 <= [ acset get [ close ] each "timeout" print ] [
+!         fdset get is-set sock get swap member? [ 
+!              sock get f f accept dup . flush 
+!              acset get swap add acset set
+!     ] [ ] if
+!         loop
+!     ] if ;
+! 
+! loop
+! 
+! sock get close
+
+! =========================================================
+! Dump errors to file
+! =========================================================
+
+[ ] [ "resource:extra/openssl/test/errors.txt" "w" bio-new-file ] unit-test
+
+[ 6 ] [ get-bio "Hello\n" bio-print ] unit-test
+
+[ ] [ get-bio bio-free ] unit-test
+
+! =========================================================
+! Clean-up
+! =========================================================
+
+! sock get close
+
+get-ctx destroy-ctx
diff --git a/unmaintained/openssl/openssl.factor b/unmaintained/openssl/openssl.factor
new file mode 100755 (executable)
index 0000000..9b23774
--- /dev/null
@@ -0,0 +1,154 @@
+! Copyright (C) 2007 Elie CHAFTARI
+! See http://factorcode.org/license.txt for BSD license.
+!
+! Tested with OpenSSL 0.9.8a_0 on Mac OS X 10.4.9 PowerPC
+
+USING: alien alien.c-types alien.strings assocs kernel libc
+namespaces openssl.libcrypto openssl.libssl sequences
+io.encodings.ascii ;
+
+IN: openssl
+
+SYMBOL: bio
+SYMBOL: ssl-bio
+
+SYMBOL: ctx
+SYMBOL: dh
+SYMBOL: rsa
+
+! =========================================================
+! Callback routines
+! =========================================================
+
+: password-cb ( -- alien )
+    "int" { "char*" "int" "int" "void*" } "cdecl"
+    [ 3drop "password" ascii string>alien 1023 memcpy
+    "password" length ] alien-callback ;
+
+! =========================================================
+! Error-handling routines
+! =========================================================
+
+: get-error ( -- num )
+    ERR_get_error ;
+
+: error-string ( num -- str )
+    f ERR_error_string ;
+
+: check-result ( result -- )
+    1 = [  ] [
+        get-error error-string throw
+    ] if ;
+
+: ssl-get-error ( ssl ret -- )
+    SSL_get_error error-messages at throw ;
+
+! Write errors to a file
+: bio-new-file ( path mode -- )
+    BIO_new_file bio set ;
+
+: bio-print ( bio str -- n )
+    BIO_printf ;
+
+: bio-free ( bio -- )
+    BIO_free check-result ;
+
+! =========================================================
+! Initialization routines
+! =========================================================
+
+: init ( -- )
+    SSL_library_init drop ; ! always returns 1
+
+: load-error-strings ( -- )
+    SSL_load_error_strings ;
+
+: ssl-v23 ( -- method )
+    SSLv23_method ;
+
+: new-ctx ( method -- )
+    SSL_CTX_new ctx set ;
+
+: use-cert-chain ( ctx file -- )
+    SSL_CTX_use_certificate_chain_file check-result ;
+
+: set-default-passwd ( ctx cb -- )
+    SSL_CTX_set_default_passwd_cb ;
+
+: set-default-passwd-userdata ( ctx passwd -- )
+    SSL_CTX_set_default_passwd_cb_userdata ;
+
+: use-private-key ( ctx file type -- )
+    SSL_CTX_use_PrivateKey_file check-result ;
+
+: verify-load-locations ( ctx file path -- )
+    SSL_CTX_load_verify_locations check-result ;
+
+: set-verify-depth ( ctx depth -- )
+    SSL_CTX_set_verify_depth ;
+
+: read-pem-dh-params ( bio x cb u -- )
+    PEM_read_bio_DHparams dh set ;
+
+: set-tmp-dh-callback ( ctx dh -- )
+    SSL_CTX_set_tmp_dh_callback ;
+
+: set-ctx-ctrl ( ctx cmd larg parg -- )
+    SSL_CTX_ctrl check-result ;
+
+: generate-rsa-key ( n e cb cbarg -- )
+    RSA_generate_key rsa set ;
+
+: set-tmp-rsa-callback ( ctx rsa -- )
+    SSL_CTX_set_tmp_rsa_callback ;
+
+: free-rsa ( rsa -- )
+    RSA_free ;
+
+: bio-new-socket ( fd flag -- sbio )
+    BIO_new_socket ;
+
+: new-ssl ( ctx -- ssl )
+    SSL_new ;
+
+: set-ssl-bio ( ssl bio bio -- )
+    SSL_set_bio ;
+
+: set-ssl-fd ( ssl fd -- )
+    SSL_set_fd check-result ;
+
+: ssl-accept ( ssl -- result )
+    SSL_accept ;
+
+! =========================================================
+! Clean-up and termination routines
+! =========================================================
+
+: destroy-ctx ( ctx -- )
+    SSL_CTX_free ;
+
+! =========================================================
+! Public routines
+! =========================================================
+
+: get-bio ( -- bio )
+    bio get ;
+
+: get-ssl-bio ( -- bio )
+    ssl-bio get ;
+
+: get-ctx ( -- ctx )
+    ctx get ;
+
+: get-dh ( -- dh )
+    dh get ;
+
+: get-rsa ( -- rsa )
+    rsa get ;
+
+: >md5 ( str -- byte-array )
+    dup length 16 "uchar" <c-array> [ MD5 ] keep nip ;
+
+: >sha1 ( str -- byte-array )
+    dup length 20 "uchar" <c-array> [ SHA1 ] keep nip ;
+
diff --git a/unmaintained/openssl/summary.txt b/unmaintained/openssl/summary.txt
new file mode 100755 (executable)
index 0000000..42db29f
--- /dev/null
@@ -0,0 +1 @@
+OpenSSL binding
diff --git a/unmaintained/openssl/tags.txt b/unmaintained/openssl/tags.txt
new file mode 100644 (file)
index 0000000..93e252c
--- /dev/null
@@ -0,0 +1,3 @@
+enterprise
+network
+bindings
diff --git a/unmaintained/openssl/test/dh1024.pem b/unmaintained/openssl/test/dh1024.pem
new file mode 100644 (file)
index 0000000..aa68d98
--- /dev/null
@@ -0,0 +1,5 @@
+-----BEGIN DH PARAMETERS-----
+MIGHAoGBANmAnfkETuKHOCWaE+W+F3kM/e7z5A8hZb7OqwGMQrUOaBEAr4BWeZBn
+G/87hhwZgNP69/KUchm714qd/PpOspCaUJ20x6PcmKujpAgca/f19HGMBjRawQMk
+R9oaBwazuQT0l0rTTKmvpMEcrQQIcVWii3CZI56I56oqF8biGPD7AgEC
+-----END DH PARAMETERS-----
diff --git a/unmaintained/openssl/test/errors.txt b/unmaintained/openssl/test/errors.txt
new file mode 100644 (file)
index 0000000..e965047
--- /dev/null
@@ -0,0 +1 @@
+Hello
diff --git a/unmaintained/openssl/test/root.pem b/unmaintained/openssl/test/root.pem
new file mode 100644 (file)
index 0000000..db0c59f
--- /dev/null
@@ -0,0 +1,14 @@
+-----BEGIN CERTIFICATE-----
+MIICIjCCAYugAwIBAgIBADANBgkqhkiG9w0BAQQFADBXMQswCQYDVQQGEwJVUzET
+MBEGA1UEChMKUlRGTSwgSW5jLjEZMBcGA1UECxMQV2lkZ2V0cyBEaXZpc2lvbjEY
+MBYGA1UEAxMPVGVzdCBDQTIwMDEwNTE3MB4XDTAxMDUxNzE2MDExNFoXDTA2MTIy
+NTE2MDExNFowVzELMAkGA1UEBhMCVVMxEzARBgNVBAoTClJURk0sIEluYy4xGTAX
+BgNVBAsTEFdpZGdldHMgRGl2aXNpb24xGDAWBgNVBAMTD1Rlc3QgQ0EyMDAxMDUx
+NzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAmkX40warmH0+lnwD9YjsJhRz
+ZX6qXadFry0y2trZ6gMs8Mv33IKPwOu8TE7V+3PESEtjI2wr8juV9OkbIPOm+td5
+M8+6vXyIW+JBo3ch99i0QMTf5/jTgsW+3IjV8yEdiGcZFp2NWKLRvZPq2VRbuF7R
+1pvgcaRuBJ0wGOohwnsCAwEAATANBgkqhkiG9w0BAQQFAAOBgQCUB8zMKIlX5io8
+TalbzH9Qke7BcvFAL+wp/5w1ToVsWkNrINSWKv6bl/jcqOD3aPhK7qhaeOU8ZWKL
+PoPPCnRl9Wo+1JtsOO3qIgJP79Bl9ooLGahixF2v/gea5qNISjQvwYllLSa//APP
+6kXHngO0RIRbiTBYHSkAzm6hDdsvVA==
+-----END CERTIFICATE-----
diff --git a/unmaintained/openssl/test/server.pem b/unmaintained/openssl/test/server.pem
new file mode 100644 (file)
index 0000000..87376db
--- /dev/null
@@ -0,0 +1,32 @@
+-----BEGIN RSA PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: DES-EDE3-CBC,5772A2A7BE34B611
+
+1yJ+xAn4MudcIfXXy7ElYngJ9EohIh8yvcyVLmE4kVd0xeaL/Bqhvk25BjYCK5d9
+k1K8cjgnKEBjbC++0xtJxFSbUhwoKTLwn+sBoJDcFzMKkmJXXDbSTOaNr1sVwiAR
+SnB4lhUcHguYoV5zlRJn53ft7t1mjB6RwGH+d1Zx6t95OqM1lnKqwekwmotVAWHj
+ncu3N8qhmoPMppmzEv0fOo2/pK2WohcJykSeN5zBrZCUxoO0NBNEZkFUcVjR+KsA
+1ZeI1mU60szqg+AoU/XtFcow8RtG1QZKQbbXzyfbwaG+6LqkHaWYKHQEI1546yWK
+us1HJ734uUkZoyyyazG6PiGCYV2u/aY0i3qdmyDqTvmVIvve7E4glBrtDS9h7D40
+nPShIvOatoPzIK4Y0QSvrI3G1vTsIZT3IOZto4AWuOkLNfYS2ce7prOreF0KjhV0
+3tggw9pHdDmTjHTiIkXqheZxZ7TVu+pddZW+CuB62I8lCBGPW7os1f21e3eOD/oY
+YPCI44aJvgP+zUORuZBWqaSJ0AAIuVW9S83Yzkz/tlSFHViOebyd8Cug4TlxK1VI
+q6hbSafh4C8ma7YzlvqjMzqFifcIolcbx+1A6ot0UiayJTUra4d6Uc4Rbc9RIiG0
+jfDWC6aii9YkAgRl9WqSd31yASge/HDqVXFwR48qdlYQ57rcHviqxyrwRDnfw/lX
+Mf6LPiDKEco4MKej7SR2kK2c2AgxUzpGZeAY6ePyhxbdhA0eY21nDeFd/RbwSc5s
+eTiCCMr41OB4hfBFXKDKqsM3K7klhoz6D5WsgE6u3lDoTdz76xOSTg==
+-----END RSA PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIICGDCCAYECAgEBMA0GCSqGSIb3DQEBBAUAMFcxCzAJBgNVBAYTAlVTMRMwEQYD
+VQQKEwpSVEZNLCBJbmMuMRkwFwYDVQQLExBXaWRnZXRzIERpdmlzaW9uMRgwFgYD
+VQQDEw9UZXN0IENBMjAwMTA1MTcwHhcNMDEwNTE3MTYxMDU5WhcNMDQwMzA2MTYx
+MDU5WjBRMQswCQYDVQQGEwJVUzETMBEGA1UEChMKUlRGTSwgSW5jLjEZMBcGA1UE
+CxMQV2lkZ2V0cyBEaXZpc2lvbjESMBAGA1UEAxMJbG9jYWxob3N0MIGfMA0GCSqG
+SIb3DQEBAQUAA4GNADCBiQKBgQCiWhMjNOPlPLNW4DJFBiL2fFEIkHuRor0pKw25
+J0ZYHW93lHQ4yxA6afQr99ayRjMY0D26pH41f0qjDgO4OXskBsaYOFzapSZtQMbT
+97OCZ7aHtK8z0ZGNW/cslu+1oOLomgRxJomIFgW1RyUUkQP1n0hemtUdCLOLlO7Q
+CPqZLQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAIumUwl1OoWuyN2xfoBHYAs+lRLY
+KmFLoI5+iMcGxWIsksmA+b0FLRAN43wmhPnums8eXgYbDCrKLv2xWcvKDP3mps7m
+AMivwtu/eFpYz6J8Mo1fsV4Ys08A/uPXkT23jyKo2hMu8mywkqXCXYF2e+7pEeBr
+dsbmkWK5NgoMl8eM
+-----END CERTIFICATE-----
diff --git a/unmaintained/shufflers/authors.txt b/unmaintained/shufflers/authors.txt
new file mode 100644 (file)
index 0000000..f990dd0
--- /dev/null
@@ -0,0 +1 @@
+Daniel Ehrenberg
diff --git a/unmaintained/shufflers/shufflers-docs.factor b/unmaintained/shufflers/shufflers-docs.factor
new file mode 100644 (file)
index 0000000..ac37253
--- /dev/null
@@ -0,0 +1,13 @@
+USING: help.syntax help.markup ;
+IN: shufflers
+
+HELP: SHUFFLE:
+{ $syntax "SHUFFLE: alphabet #" }
+{ $values { "alphabet" "an alphabet of unique letters" } { "#" "the maximum length" } }
+{ $description "Defines stack shufflers of the form abc-bcba where 'abc' describes the inputs and 'bcba' describes the outputs. Given a stack of 1 2 3, this returns 2 3 2 1. The stack shufflers defined are put in the current vocab with the suffix '.shuffle' appended." }
+{ $examples
+"SHUFFLE: abcd 6\n"
+": 4drop abcd- ;\n"
+": 2over abcd-abcdab ;\n"
+": 2swap abcd-cdab ;\n"
+": 3dup abc-abcabc ;\n" } ;
diff --git a/unmaintained/shufflers/shufflers-tests.factor b/unmaintained/shufflers/shufflers-tests.factor
new file mode 100644 (file)
index 0000000..753f35b
--- /dev/null
@@ -0,0 +1,8 @@
+USING: shufflers tools.test ;
+IN: shufflers.tests
+
+SHUFFLE: abcd 4
+[ ] [ 1 2 3 4 abcd- ] unit-test
+[ 1 2 1 2 ] [ 1 2 3 abc-abab ] unit-test
+[ 4 3 2 1 ] [ 1 2 3 4 abcd-dcba ] unit-test
+[ 1 1 1 1 ] [ 1 a-aaaa ] unit-test
diff --git a/unmaintained/shufflers/shufflers.factor b/unmaintained/shufflers/shufflers.factor
new file mode 100644 (file)
index 0000000..b11668a
--- /dev/null
@@ -0,0 +1,36 @@
+USING: kernel sequences words math math.functions arrays 
+shuffle quotations parser math.parser strings namespaces 
+splitting effects sequences.lib ;
+IN: shufflers
+
+: shuffle>string ( names shuffle -- string )
+    swap [ [ nth ] curry map ] curry map
+    first2 "-" swap 3append >string ;
+
+: make-shuffles ( max-out max-in -- shuffles )
+    [ 1+ dup rot strings [ 2array ] with map ]
+    with map concat ;
+
+: shuffle>quot ( shuffle -- quot )
+    [
+        first2 2dup [ - ] with map
+        reverse [ , \ npick , \ >r , ] each
+        swap , \ ndrop , length [ \ r> , ] times
+    ] [ ] make ;
+
+: put-effect ( word -- )
+    dup word-name "-" split1
+    [ >array [ 1string ] map ] bi@
+    <effect> "declared-effect" set-word-prop ;
+
+: in-shuffle ( -- ) in get ".shuffle" append set-in ;
+: out-shuffle ( -- ) in get ".shuffle" ?tail drop set-in ;
+
+: define-shuffles ( names max-out -- )
+    in-shuffle over length make-shuffles [
+        [ shuffle>string create-in ] keep
+        shuffle>quot dupd define put-effect
+    ] with each out-shuffle ;
+
+: SHUFFLE:
+    scan scan string>number define-shuffles ; parsing
diff --git a/unmaintained/shufflers/summary.txt b/unmaintained/shufflers/summary.txt
new file mode 100644 (file)
index 0000000..37b87be
--- /dev/null
@@ -0,0 +1 @@
+Arbitrary stack shuffling operators of the form abc-cbab
diff --git a/unmaintained/shufflers/tags.txt b/unmaintained/shufflers/tags.txt
new file mode 100644 (file)
index 0000000..f427429
--- /dev/null
@@ -0,0 +1 @@
+extensions
index b2cbf9b6b522814da7873e8d429143d20c15778e..5cdfbb2a9e3e131a98b9875850c9c2be3ff5cccc 100755 (executable)
@@ -255,7 +255,7 @@ static int global_var;
 
 void ffi_test_36_point_5(void)
 {
-       printf("int_ffi_test_36_point_5\n");
+       printf("ffi_test_36_point_5\n");
        global_var = 0;
 }
 
index d455d999b10bae14871c8852103dd436affb2b73..0f51092d25036b19fbc6d1cabfa4198c7d0b7a2e 100755 (executable)
@@ -62,7 +62,7 @@ struct test_struct_12 { int a; double x; };
 
 DLLEXPORT double ffi_test_36(struct test_struct_12 x);
 
-DLLEXPORT void int_ffi_test_36_point_5(void);
+DLLEXPORT void ffi_test_36_point_5(void);
 
 DLLEXPORT int ffi_test_37(int (*f)(int, int, int));