diff --git a/.sconsign.dblite b/.sconsign.dblite new file mode 100644 index 00000000..4f32bc28 Binary files /dev/null and b/.sconsign.dblite differ diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..168aca44 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +www.lpenz.org diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..438196de --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +FROM debian:bookworm +MAINTAINER Leandro Lisboa Penz + +# install debian packages: +ENV DEBIAN_FRONTEND noninteractive +RUN set -e -x; \ + apt-get update; \ + apt-get install -y --no-install-recommends locales \ + graphviz txt2tags \ + ghc \ + r-cran-ggplot2 r-cran-reshape \ + pandoc \ + inkscape \ + python3-pip python3-setuptools python3-wheel \ + python3-mako python3-yaml python3-nose flake8 black \ + sudo python3-pexpect \ + cryptsetup fdisk udftools \ + gnupg gpg gpg-agent \ + linkchecker \ + scons \ + git + +# setup locales, sudo and su +RUN set -e -x; \ + echo 'en_US.UTF-8 UTF-8' >> /etc/locale.gen; locale-gen; \ + echo 'ALL ALL=NOPASSWD:ALL' > /etc/sudoers.d/all; \ + chmod 0400 /etc/sudoers.d/all; \ + sed -i '/drop_privileges/d' /usr/bin/linkchecker; \ + sed -i '/pam_rootok.so$/aauth sufficient pam_permit.so' /etc/pam.d/su +ENV LC_ALL=en_US.UTF-8 \ + HOME=/tmp + +COPY entrypoint / +CMD /entrypoint diff --git a/README.md b/README.md new file mode 100644 index 00000000..5748b37a --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +[![CI](https://github.com/lpenz/lpenz.github.io/workflows/CI/badge.svg?branch=publish)](https://github.com/lpenz/lpenz.github.io/actions/) + +# www.lpenz.org + +This repository has the contents of my web page at http://www.lpenz.org/ + +The source itself is in the *devel* branch. After making changes, it is merged +on master, built and commited. + +There is a lot of files generated with R, haskell, python, etc. Travis tests +everything before the merge is performed. Unfortunately, the build and commit +that follows the merge is manual. + diff --git a/SConstruct b/SConstruct new file mode 100644 index 00000000..29a77825 --- /dev/null +++ b/SConstruct @@ -0,0 +1,71 @@ +import os +import glob + +if False: + Environment = None +env = Environment(ENV=os.environ, TOP=os.path.abspath(os.path.curdir)) +env.HTMLSITEFILES = set() +env.Export("env") + +for t in ["haskell", "pandoc", "t2tbhtml", "mako", "R", "gcc"]: + env.Tool(t) + +# infotree: + + +def infotreeProcDir(d, infofiles): + if not os.path.isdir(d): + return + i = os.path.join(d, "info.yaml") + if os.path.isfile(i): + infofiles.append(os.path.relpath(i)) + for s in glob.glob(os.path.join(d, "*")): + infotreeProcDir(s, infofiles) + + +infofiles = [] +infotreeProcDir(".", infofiles) +env.Command("infotree.yaml", infofiles, "tools/infotreebuild $TARGET $SOURCES") +env.Depends("infotree.yaml", "tools/infotreebuild") + +# Main page: +env.Command("index.t2t", "index.bt2t", "tools/mako $SOURCE $TARGET") +env.Depends("index.t2t", "infotree.yaml") +env.T2TBHTML("index.bhtml.mako", "index.t2t") +env.MAKO("index.html", "index.bhtml.mako", MAKOFLAGS="-t htmlpage") +env.HTMLSITEFILES.add("index.html") + +# Logo: +env.Command( + "media/logo-black.png", + "media/logo-black.svg", + "inkscape -z --export-type=png -o $TARGET -w 14 -h 14 $SOURCE", +) +env.HTMLSITEFILES.add("media/logo-white.png") +env.Command( + "media/logo-white.png", + "media/logo-white.svg", + "inkscape -z --export-type=png -o $TARGET -w 14 -h 14 $SOURCE", +) +env.HTMLSITEFILES.add("media/logo-black.png") + +# About me: +env.SConscript("about/SConscript") + +# Articles: +env.SConscript("articles/SConscript") + +# Debian: +env.SConscript("debian/SConscript") + +# Feeds: +env.SConscript("feeds/SConscript") + +# Final touches: +env.Command( + "_linkchecker_ok.txt", + list(env.HTMLSITEFILES), + "linkchecker -flinkcheckerrc " "index.html && md5sum $SOURCES > $TARGET", +) +env.Command("sitemap.xml", list(env.HTMLSITEFILES), "tools/sitemapper $TARGET $SOURCES") +env.Depends("sitemap.xml", "tools/sitemapper") diff --git a/_linkchecker_ok.txt b/_linkchecker_ok.txt new file mode 100644 index 00000000..83330a0c --- /dev/null +++ b/_linkchecker_ok.txt @@ -0,0 +1,49 @@ +13a081ec39c6d4374371cf425a4d0ebe articles/df0pred-3/mcsdaydens.png +55e2a238fe5565c13bc92f5e9d23ad18 articles/df0pred-2/deltabox.png +8814f5c80738f8ee3de1e8efeb7c6a5b about/index.html +f72d984ccb806aefd2495c54c3192b40 articles/gpg/index.html +37790a5397a62cf5f5f7c7b3b31eed50 articles/cryptusb/index.html +2917c6084b2e07d2a0ef537be28bd7db articles/bugprobhunt/after5000.png +36f07de6c60909e0421b428de9a0b45c articles/df0pred-3/mcspf1.png +1eff040838258f87f8265a9ddcd8255e articles/bugprobhunt/tbyn.png +016576b94c2b57ea95fd7253ae389b29 articles/nixchannel/index.html +6b3fad22f59d51b512caf73f57e68546 articles/df0pred-3/mcsquant.png +36e693e461b554cb8ea27042637a7102 articles/df0pred-3/mcsquantbar.png +09b0de3b1473d31d05fb2e5eac65ebca articles/df0pred-2/daysleft.png +19a77daf7f26c93df76b1ae437718576 debian/index.html +fe7adee5ef6bee08454c79e631d1fb75 articles/bugprobhunt/r1w3_dens.png +f20a99cacf58254afe4bba8cf6a47433 articles/df0pred-3/index.html +1e3edd57047539d5cc7623ee385bc6b3 articles/df0pred-3/mcs.png +47ec7ff4cf0948ad702ad4bde744db04 articles/ansiblerpi/index.html +101c76edcc66f576729fc8c45ea9976f articles/df0pred-2/df0ecdf.png +3b9519f64e0780ce40b52ef24f4bbb49 index.html +204981bd59fbcf5a07cd205036c69b5c articles/luksfile/index.html +3ea7e821c72a4fc847840478d230ff98 articles/df0pred-3/mcsbox.png +f78993be9dde45a5233b8e5b9b308812 articles/df0pred-3/usd.png +ff46c0f42d2f3c65fe3927ed6b0e38ed articles/df0pred-3/mcsquantheat.png +7c6f6a318c77aaafa6170488d1ae1464 articles/bugprobhunt/pdens_many.png +e99b1296df2a6d5e5ee200109df74a36 articles/df0pred-2/deltakd.png +835c9015088e56a111bdcd163a6d3e87 articles/df0pred-2/df0first.txt +64279e581ab091c21aef8f95b6f8b491 articles/df0pred-3/mcscv1.png +503f8beb6f8201d8db65271eb865b9b4 articles/df0pred-2/delta.png +cf99d67b8721f02f33266962e17a0812 articles/df0pred-2/index.html +7d848b484238efceaaa97e41b443600b articles/index.html +51dafa9cb979597301bee62944973bf6 articles/bugprobhunt/r1w3_n4_results.html +9023e2c6b90a692a3732d4a4b27f8ca5 articles/df0pred-1/index.html +e89e499a2ac417e3809e3b9126cd18a1 media/logo-white.png +b843f78597cdad66ef5d809fd3796053 articles/df0pred-3/mcscv2.png +677ab90e33dedb67c6a8cace4c114035 articles/df0pred-2/lm.png +b3dae0cae3bcbe59ae9f3c7a218716af articles/df0pred-2/df0above5.txt +6af948d0164eff648d43bcf610cdcbbc articles/liveusb/index.html +7b36524dabca5f329a169e992a5815b8 articles/bugprobhunt/after20.png +f1539d6bfc8aa487807543f2b0c59816 articles/github-project-struct/index.html +5a4522d5cc79661ce82e5cdeebef3ce8 articles/df0pred-3/mcs3.png +2e799c5076db46ef11740b2b51657428 articles/rust-snippets/index.html +ffa88286214d6127490bf6db2eb221cc articles/bugprobhunt/index.html +5739ee4c4155cdbe8e2369b0fc7663a8 articles/bugprobhunt/trials20.png +04876bbc44f3f0bf56bef863a8841bfd media/logo-black.png +667ac247d1e9b5f5e8e445b2cdff02b4 articles/hedsl-sharedexpenses/index.html +071d39762cd78a105e2a133f8dc9faf3 articles/debgit/index.html +d445085f51ade5b2ebfea65fce75510b articles/bugprobhunt/r1w3_dist.png +3faf6038330f5d82c57bc4412835375b articles/bugprobhunt/trials5000.png +401b21c636a098b7980610823514794a articles/df0pred-2/deltasummary.txt diff --git a/about/SConscript b/about/SConscript new file mode 100644 index 00000000..6b7d0bd7 --- /dev/null +++ b/about/SConscript @@ -0,0 +1,7 @@ +if False: + Import = None + env = None +Import(["env"]) +env.T2TBHTML("index.bhtml.mako", "index.t2t") +env.MAKO("index.html", "index.bhtml.mako", MAKOFLAGS="-t htmlpage") +env.HTMLSITEFILES.add("about/index.html") diff --git a/about/index.bhtml.mako b/about/index.bhtml.mako new file mode 100644 index 00000000..cfbc692e --- /dev/null +++ b/about/index.bhtml.mako @@ -0,0 +1,27 @@ +
+ +
+

About me

+ +

+I keep my Curriculum Vitae in the subdomain http://cv.lpenz.org/, rendered +from http://github.com/lpenz/cv with continuous deployment. +

+

+For professional and academic formation in general, you can check my +LinkedIn profile. +

+

+For more specific academic details, there is my +Lattes academic curriculum. +

+

+To check software that I built, there is my +software repositories at github. Only small snippets +there - no big free projects. +

+

+Email contact: lpenz at lpenz.org. +

+
+
diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..61aa0a38 --- /dev/null +++ b/about/index.html @@ -0,0 +1,164 @@ + + + + + +About + + + + + + + + + + + + + + + + + + + + + + + +
+ +

About

+ + +
+ +
+

About me

+ +

+I keep my Curriculum Vitae in the subdomain http://cv.lpenz.org/, rendered +from http://github.com/lpenz/cv with continuous deployment. +

+

+For professional and academic formation in general, you can check my +LinkedIn profile. +

+

+For more specific academic details, there is my +Lattes academic curriculum. +

+

+To check software that I built, there is my +software repositories at github. Only small snippets +there - no big free projects. +

+

+Email contact: lpenz at lpenz.org. +

+
+
+ + +
+ + + + + + + + + + + + + + + diff --git a/about/index.t2t b/about/index.t2t new file mode 100644 index 00000000..18788c28 --- /dev/null +++ b/about/index.t2t @@ -0,0 +1,20 @@ +About + + + += About me = + +I keep my Curriculum Vitae in the subdomain http://cv.lpenz.org/, rendered +from http://github.com/lpenz/cv with continuous deployment. + +For professional and academic formation in general, you can check my +[LinkedIn profile https://www.linkedin.com/in/leandro-penz-4a41502a]. + +For more specific academic details, there is my +[Lattes academic curriculum http://lattes.cnpq.br/0824061646899870]. + +To check software that I built, there is my +[software repositories at github https://github.com/lpenz]. Only small snippets +there - no big free projects. + +Email contact: lpenz at lpenz.org. diff --git a/about/info.yaml b/about/info.yaml new file mode 100644 index 00000000..229b50a5 --- /dev/null +++ b/about/info.yaml @@ -0,0 +1,3 @@ +title: About +tab: about + diff --git a/articles/SConscript b/articles/SConscript new file mode 100644 index 00000000..b66b642a --- /dev/null +++ b/articles/SConscript @@ -0,0 +1,30 @@ +import os +import glob + +if False: + Import = None + env = None +Import(["env"]) + +articles = [] + +# Articles: +for i in glob.glob("*"): + if not os.path.isdir(i): + continue + if not os.path.exists(os.path.join(i, "info.yaml")): + continue + env.SConscript("%s/SConscript" % i) + articles.append("%s" % i) + +# Index: +indexbuild = env.File("indexbuild") +env.Command( + "index.t2t", + [a + "/info.yaml" for a in articles], + indexbuild.abspath + " $TARGET $SOURCES", +) + +env.T2TBHTML("index.bhtml.mako", "index.t2t") +env.MAKO("index.html", "index.bhtml.mako", MAKOFLAGS="-t htmlpage") +env.HTMLSITEFILES.add("articles/index.html") diff --git a/articles/ansiblerpi/SConscript b/articles/ansiblerpi/SConscript new file mode 100644 index 00000000..b6ddc992 --- /dev/null +++ b/articles/ansiblerpi/SConscript @@ -0,0 +1,12 @@ +import os + +pjoin = os.path.join + +if False: + Import = None + env = None +Import(["env"]) + +env.T2TBHTML("index.bhtml.mako", "index.t2t") +env.MAKO("index.html", "index.bhtml.mako", MAKOFLAGS="-t htmlpage") +env.HTMLSITEFILES.add("articles/ansiblerpi/index.html") diff --git a/articles/ansiblerpi/apt-pinning b/articles/ansiblerpi/apt-pinning new file mode 100644 index 00000000..888029b6 --- /dev/null +++ b/articles/ansiblerpi/apt-pinning @@ -0,0 +1,23 @@ +Package: * +Pin: release o=Raspberry Pi Foundation +Pin-Priority: 600 + +Package: * +Pin: release o=Raspbian +Pin-Priority: 600 + +Package: * +Pin: release a=stable +Pin-Priority: 510 + +Package: * +Pin: release a=testing +Pin-Priority: 520 + +Package: * +Pin: release a=unstable +Pin-Priority: 150 + +Package: * +Pin: release a=experimental +Pin-Priority: 120 diff --git a/articles/ansiblerpi/index.bhtml.mako b/articles/ansiblerpi/index.bhtml.mako new file mode 100644 index 00000000..7d345c5f --- /dev/null +++ b/articles/ansiblerpi/index.bhtml.mako @@ -0,0 +1,295 @@ +
+

+These are my notes on how to get started provisioning Raspbian with +ansible. +

+ +
+

Before using ansible

+ +

+We have to get a working Raspbian installation before using ansible on +the device. +

+ +
+

Installing Raspbian

+ +

+The first step is downloading and installing Raspbian in the SD card +you're going to use in the Pi. You can find the Raspbian image here: +https://www.raspberrypi.org/downloads/raspbian/. Prefer the "lite" +image, as it allows you to start from a cleaner point. +

+

+To install the image, use an adapter to plug the SD card into a +computer. You can figure out the /dev/ device that got assigned by +using lsblk before and after plugging the card. Let's assume it +got assigned to /dev/sdc, for the sake of illustration. The next +step is writting the Raspbian image to it: +

+ +
+unzip -p *-raspbian-stretch-lite.zip | sudo dd of=/dev/sdc bs=4M oflag=dsync status=progress
+
+ +

+You can now insert the card into the Raspberry Pi board. +

+ +
+
+

Initial Raspbian setup

+ +

+Raspbian comes with a initial user pi, password raspberry, +that can use sudo freely. ssh is installed, but +disabled. Changing the password and enabling ssh are the next steps, +in a console session that should look like the following: +

+ +
+> raspberrypi login: pi
+> Password:
+passwd
+> Changing password for pi.
+> (current) UNIX password:
+> Enter new UNIX password:
+> Retype new UNIX password:
+> passwd: password updated successfully
+sudo systemctl enable ssh.service
+(...)
+
+ +
+
+

Alternative initial setup

+ +

+Another way to do the initial image setup is by mounting in your system and +changing the required files before writting it in the SD card. To mount the +image: +

+ +
    +
  • Extract it from the zip file: + + +
    +unzip *-raspbian-*-lite.zip
    +
    + + +
  • +
  • Using losetup, map the file to a loopback device, and list the loopback + devices to figure out where it was mapped: + + +
    +sudo losetup -f *-raspbian-*-lite.img
    +sudo losetup -l
    +> NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE             DIO LOG-SEC
    +> /dev/loop0         0      0         0  0 *-raspbian-*-lite.img   0     512
    +
    + + +From here on we assume that the file was mapped to /dev/loop0. + +
  • +
  • Tell the kernel to make the partitions available at /dev/ using + partx, figure out where they are using lsblk: + + +
    +sudo partx -a /dev/loop0
    +lsblk /dev/loop0
    +> NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    +> loop0       7:0    0  1.8G  0 loop
    +> ├─loop0p1 259:0    0 43.8M  0 loop
    +> └─loop0p2 259:1    0  1.7G  0 loop
    +
    + + +
  • +
  • Mount the partition in a temporary directory: + + +
    +mkdir rpi
    +sudo mount /dev/loop0p2 rpi
    +
    + + +
  • +
  • You can now modify the files in the rpi directory. Use + openssl passwd -1 <password> to get the string to use in the + etc/shadow file as the password of the pi user. You can also change + also change the name of the user, just be careful to change it everywhere + needed: +
      +
    • /etc/passwd +
    • +
    • /etc/shadow +
    • +
    • /etc/subuid +
    • +
    • /etc/group +
    • +
    • /etc/gshadow +
    • +
    • /etc/subgid +
    • +
    • And rename /home/pi +
    • +
    + + To enable ssh, you should create init and systemd links: + + +
    +sudo ln -s /lib/systemd/system/ssh.service rpi/etc/systemd/system/sshd.service
    +sudo ln -s /lib/systemd/system/ssh.service rpi/etc/systemd/system/multi-user.target.wants/ssh.service
    +for d in rc2.d rc3.d rc4.d rc5.d; do (cd rpi/etc/$d; sudo ln -sf ../init.d/ssh S01ssh); done
    +find rpi/etc/rc* -name 'K*ssh' -exec sudo rm {} +
    +
    + + + Other, security related things to do: + + +
    +sudo rm rpi/etc/sudoers.d/010_pi-nopasswd
    +
    + + + You can also change other things if you want. When you are done, proceed to + the next item. + +
  • +
  • Unmount the partition, remove the temporary directory and unmap the loopback + device: + + +
    +sudo umount rpi
    +rmdir rpi
    +sudo losetup -d /dev/loop0
    +
    + + +
  • +
  • Write the image to the SD card as before: + + +
    +sudo dd if=*-raspbian-*-lite.img of=/dev/sdc bs=4M oflag=dsync status=progress
    +
    + +
  • +
+ +
+
+
+

Using ansible

+ +

+You can now use ansible from any computer to provision the Pi. I'd +recommend, though, using python3 as the interpreter on the Pi, as +it has more modules available - *apt_repository*, for instance, is not +directly usable with the default python2 interpreter. +

+

+A basic playbook that runs tasks as root looks like the following +(save it as playbook-sudo-rpi.yml): +

+ +
+---
+- hosts: all
+  become: yes
+  become_user: root
+  vars:
+    ansible_python_interpreter: /usr/bin/python3
+  tasks:
+    - debug: msg="Ansible running in {{ansible_lsb.id}}!"
+
+ +

+Assuming that the playbook as available as playbook.yml, and that +raspberrypi is a name that can be resolved to the device, you can +run the playbook with the following command: +

+ +
+ansible-playbook -i raspberrypi, -u pi playbook-sudo-rpi.yml -K
+
+ +

+(you can also replace raspberrypi with the actual IP address of +the device) +

+ +
+

Setting up Debian repositories

+ +

+Because Raspbian is based on Debian and upstream Debian has support for the +architecture of the Raspberry Pi B+, you can configure and use upstream Debian +repositories and packages in the Pi. To do that, use the follwing snippet: +

+ +
+(...)
+  tasks:
+    - name: install apt pinning config
+      copy: src=apt-pinning dest=/etc/apt/preferences.d/99pinning owner=root group=root mode=0644
+    - name: install Debian apt key
+      apt_key: url='https://ftp-master.debian.org/keys/archive-key-9.asc' id='E1CF20DDFFE4B89E802658F1E0B11894F66AEC98' state=present
+      notify: apt-update
+    - name: install Debian apt repositories
+      apt_repository: repo='deb http://ftp.debian.org/debian {{item}} main contrib non-free' state=present
+      with_items:
+        - stable
+        - testing
+        - unstable
+        - experimental
+      notify: apt-update
+  handlers:
+    - name: apt-update
+      apt: update-cache=yes
+
+ +

+The apt-pinning file should contain something like the following: +

+ +
+Package: *
+Pin: release o=Raspberry Pi Foundation
+Pin-Priority: 600
+
+Package: *
+Pin: release o=Raspbian
+Pin-Priority: 600
+
+Package: *
+Pin: release a=stable
+Pin-Priority: 510
+
+Package: *
+Pin: release a=testing
+Pin-Priority: 520
+
+Package: *
+Pin: release a=unstable
+Pin-Priority: 150
+
+Package: *
+Pin: release a=experimental
+Pin-Priority: 120
+
+ +
+
+
diff --git a/articles/ansiblerpi/index.html b/articles/ansiblerpi/index.html new file mode 100644 index 00000000..45afa1fd --- /dev/null +++ b/articles/ansiblerpi/index.html @@ -0,0 +1,432 @@ + + + + + +Provisioning a Raspberry Pi using ansible + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Provisioning a Raspberry Pi using ansible

+ + +
+

+These are my notes on how to get started provisioning Raspbian with +ansible. +

+ +
+

Before using ansible

+ +

+We have to get a working Raspbian installation before using ansible on +the device. +

+ +
+

Installing Raspbian

+ +

+The first step is downloading and installing Raspbian in the SD card +you're going to use in the Pi. You can find the Raspbian image here: +https://www.raspberrypi.org/downloads/raspbian/. Prefer the "lite" +image, as it allows you to start from a cleaner point. +

+

+To install the image, use an adapter to plug the SD card into a +computer. You can figure out the /dev/ device that got assigned by +using lsblk before and after plugging the card. Let's assume it +got assigned to /dev/sdc, for the sake of illustration. The next +step is writting the Raspbian image to it: +

+ +
+unzip -p *-raspbian-stretch-lite.zip | sudo dd of=/dev/sdc bs=4M oflag=dsync status=progress
+
+ +

+You can now insert the card into the Raspberry Pi board. +

+ +
+
+

Initial Raspbian setup

+ +

+Raspbian comes with a initial user pi, password raspberry, +that can use sudo freely. ssh is installed, but +disabled. Changing the password and enabling ssh are the next steps, +in a console session that should look like the following: +

+ +
+> raspberrypi login: pi
+> Password:
+passwd
+> Changing password for pi.
+> (current) UNIX password:
+> Enter new UNIX password:
+> Retype new UNIX password:
+> passwd: password updated successfully
+sudo systemctl enable ssh.service
+(...)
+
+ +
+
+

Alternative initial setup

+ +

+Another way to do the initial image setup is by mounting in your system and +changing the required files before writting it in the SD card. To mount the +image: +

+ +
    +
  • Extract it from the zip file: + + +
    +unzip *-raspbian-*-lite.zip
    +
    + + +
  • +
  • Using losetup, map the file to a loopback device, and list the loopback + devices to figure out where it was mapped: + + +
    +sudo losetup -f *-raspbian-*-lite.img
    +sudo losetup -l
    +> NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE             DIO LOG-SEC
    +> /dev/loop0         0      0         0  0 *-raspbian-*-lite.img   0     512
    +
    + + +From here on we assume that the file was mapped to /dev/loop0. + +
  • +
  • Tell the kernel to make the partitions available at /dev/ using + partx, figure out where they are using lsblk: + + +
    +sudo partx -a /dev/loop0
    +lsblk /dev/loop0
    +> NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    +> loop0       7:0    0  1.8G  0 loop
    +> ├─loop0p1 259:0    0 43.8M  0 loop
    +> └─loop0p2 259:1    0  1.7G  0 loop
    +
    + + +
  • +
  • Mount the partition in a temporary directory: + + +
    +mkdir rpi
    +sudo mount /dev/loop0p2 rpi
    +
    + + +
  • +
  • You can now modify the files in the rpi directory. Use + openssl passwd -1 <password> to get the string to use in the + etc/shadow file as the password of the pi user. You can also change + also change the name of the user, just be careful to change it everywhere + needed: +
      +
    • /etc/passwd +
    • +
    • /etc/shadow +
    • +
    • /etc/subuid +
    • +
    • /etc/group +
    • +
    • /etc/gshadow +
    • +
    • /etc/subgid +
    • +
    • And rename /home/pi +
    • +
    + + To enable ssh, you should create init and systemd links: + + +
    +sudo ln -s /lib/systemd/system/ssh.service rpi/etc/systemd/system/sshd.service
    +sudo ln -s /lib/systemd/system/ssh.service rpi/etc/systemd/system/multi-user.target.wants/ssh.service
    +for d in rc2.d rc3.d rc4.d rc5.d; do (cd rpi/etc/$d; sudo ln -sf ../init.d/ssh S01ssh); done
    +find rpi/etc/rc* -name 'K*ssh' -exec sudo rm {} +
    +
    + + + Other, security related things to do: + + +
    +sudo rm rpi/etc/sudoers.d/010_pi-nopasswd
    +
    + + + You can also change other things if you want. When you are done, proceed to + the next item. + +
  • +
  • Unmount the partition, remove the temporary directory and unmap the loopback + device: + + +
    +sudo umount rpi
    +rmdir rpi
    +sudo losetup -d /dev/loop0
    +
    + + +
  • +
  • Write the image to the SD card as before: + + +
    +sudo dd if=*-raspbian-*-lite.img of=/dev/sdc bs=4M oflag=dsync status=progress
    +
    + +
  • +
+ +
+
+
+

Using ansible

+ +

+You can now use ansible from any computer to provision the Pi. I'd +recommend, though, using python3 as the interpreter on the Pi, as +it has more modules available - *apt_repository*, for instance, is not +directly usable with the default python2 interpreter. +

+

+A basic playbook that runs tasks as root looks like the following +(save it as playbook-sudo-rpi.yml): +

+ +
+---
+- hosts: all
+  become: yes
+  become_user: root
+  vars:
+    ansible_python_interpreter: /usr/bin/python3
+  tasks:
+    - debug: msg="Ansible running in {{ansible_lsb.id}}!"
+
+ +

+Assuming that the playbook as available as playbook.yml, and that +raspberrypi is a name that can be resolved to the device, you can +run the playbook with the following command: +

+ +
+ansible-playbook -i raspberrypi, -u pi playbook-sudo-rpi.yml -K
+
+ +

+(you can also replace raspberrypi with the actual IP address of +the device) +

+ +
+

Setting up Debian repositories

+ +

+Because Raspbian is based on Debian and upstream Debian has support for the +architecture of the Raspberry Pi B+, you can configure and use upstream Debian +repositories and packages in the Pi. To do that, use the follwing snippet: +

+ +
+(...)
+  tasks:
+    - name: install apt pinning config
+      copy: src=apt-pinning dest=/etc/apt/preferences.d/99pinning owner=root group=root mode=0644
+    - name: install Debian apt key
+      apt_key: url='https://ftp-master.debian.org/keys/archive-key-9.asc' id='E1CF20DDFFE4B89E802658F1E0B11894F66AEC98' state=present
+      notify: apt-update
+    - name: install Debian apt repositories
+      apt_repository: repo='deb http://ftp.debian.org/debian {{item}} main contrib non-free' state=present
+      with_items:
+        - stable
+        - testing
+        - unstable
+        - experimental
+      notify: apt-update
+  handlers:
+    - name: apt-update
+      apt: update-cache=yes
+
+ +

+The apt-pinning file should contain something like the following: +

+ +
+Package: *
+Pin: release o=Raspberry Pi Foundation
+Pin-Priority: 600
+
+Package: *
+Pin: release o=Raspbian
+Pin-Priority: 600
+
+Package: *
+Pin: release a=stable
+Pin-Priority: 510
+
+Package: *
+Pin: release a=testing
+Pin-Priority: 520
+
+Package: *
+Pin: release a=unstable
+Pin-Priority: 150
+
+Package: *
+Pin: release a=experimental
+Pin-Priority: 120
+
+ +
+
+
+ + +
+ + + + + + + + + + + + + + + diff --git a/articles/ansiblerpi/index.t2t b/articles/ansiblerpi/index.t2t new file mode 100644 index 00000000..fff7d76b --- /dev/null +++ b/articles/ansiblerpi/index.t2t @@ -0,0 +1,215 @@ +Provisioning a Raspberry Pi using ansible +From first steps +2019-01-08 + + + +These are my notes on how to get started provisioning Raspbian with +ansible. + + + += Before using ansible = + +We have to get a working Raspbian installation before using ansible on +the device. + + + +== Installing Raspbian == + +The first step is downloading and installing Raspbian in the SD card +you're going to use in the Pi. You can find the Raspbian image here: +https://www.raspberrypi.org/downloads/raspbian/. Prefer the "lite" +image, as it allows you to start from a cleaner point. + +To install the image, use an adapter to plug the SD card into a +computer. You can figure out the ``/dev/`` device that got assigned by +using ``lsblk`` before and after plugging the card. Let's assume it +got assigned to ``/dev/sdc``, for the sake of illustration. The next +step is writting the Raspbian image to it: + +``` +unzip -p *-raspbian-stretch-lite.zip | sudo dd of=/dev/sdc bs=4M oflag=dsync status=progress +``` + +You can now insert the card into the Raspberry Pi board. + + + +== Initial Raspbian setup == + +Raspbian comes with a initial user **pi**, password **raspberry**, +that can use sudo freely. **ssh** is installed, but +disabled. Changing the password and enabling ssh are the next steps, +in a console session that should look like the following: + +``` +> raspberrypi login: pi +> Password: +passwd +> Changing password for pi. +> (current) UNIX password: +> Enter new UNIX password: +> Retype new UNIX password: +> passwd: password updated successfully +sudo systemctl enable ssh.service +(...) +``` + + + +== Alternative initial setup == + +Another way to do the initial image setup is by mounting in your system and +changing the required files before writting it in the SD card. To mount the +image: +- Extract it from the zip file: + +``` +unzip *-raspbian-*-lite.zip +``` + +- Using ``losetup``, map the file to a loopback device, and list the loopback + devices to figure out where it was mapped: + +``` +sudo losetup -f *-raspbian-*-lite.img +sudo losetup -l +> NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO LOG-SEC +> /dev/loop0 0 0 0 0 *-raspbian-*-lite.img 0 512 +``` + +From here on we assume that the file was mapped to ``/dev/loop0``. + +- Tell the kernel to make the partitions available at ``/dev/`` using + ``partx``, figure out where they are using ``lsblk``: + +``` +sudo partx -a /dev/loop0 +lsblk /dev/loop0 +> NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT +> loop0 7:0 0 1.8G 0 loop +> ├─loop0p1 259:0 0 43.8M 0 loop +> └─loop0p2 259:1 0 1.7G 0 loop +``` + +- Mount the partition in a temporary directory: + +``` +mkdir rpi +sudo mount /dev/loop0p2 rpi +``` + +- You can now modify the files in the ``rpi`` directory. Use + ``openssl passwd -1 `` to get the string to use in the + ``etc/shadow`` file as the password of the ``pi`` user. You can also change + also change the name of the user, just be careful to change it everywhere + needed: + - ``/etc/passwd`` + - ``/etc/shadow`` + - ``/etc/subuid`` + - ``/etc/group`` + - ``/etc/gshadow`` + - ``/etc/subgid`` + - And rename ``/home/pi`` + - + + To enable ssh, you should create init and systemd links: + +``` +sudo ln -s /lib/systemd/system/ssh.service rpi/etc/systemd/system/sshd.service +sudo ln -s /lib/systemd/system/ssh.service rpi/etc/systemd/system/multi-user.target.wants/ssh.service +for d in rc2.d rc3.d rc4.d rc5.d; do (cd rpi/etc/$d; sudo ln -sf ../init.d/ssh S01ssh); done +find rpi/etc/rc* -name 'K*ssh' -exec sudo rm {} + +``` + + Other, security related things to do: + +``` +sudo rm rpi/etc/sudoers.d/010_pi-nopasswd +``` + + You can also change other things if you want. When you are done, proceed to + the next item. + +- Unmount the partition, remove the temporary directory and unmap the loopback + device: + +``` +sudo umount rpi +rmdir rpi +sudo losetup -d /dev/loop0 +``` + +- Write the image to the SD card as before: + +``` +sudo dd if=*-raspbian-*-lite.img of=/dev/sdc bs=4M oflag=dsync status=progress +``` + + + += Using ansible = + +You can now use ansible from any computer to provision the Pi. I'd +recommend, though, using //python3// as the interpreter on the Pi, as +it has more modules available - *apt_repository*, for instance, is not +directly usable with the default python2 interpreter. + +A basic playbook that runs tasks as root looks like the following +(save it as ``playbook-sudo-rpi.yml``): + +``` +--- +- hosts: all + become: yes + become_user: root + vars: + ansible_python_interpreter: /usr/bin/python3 + tasks: + - debug: msg="Ansible running in {{ansible_lsb.id}}!" +``` + +Assuming that the playbook as available as ``playbook.yml``, and that +``raspberrypi`` is a name that can be resolved to the device, you can +run the playbook with the following command: +``` +ansible-playbook -i raspberrypi, -u pi playbook-sudo-rpi.yml -K +``` +(you can also replace ``raspberrypi`` with the actual IP address of +the device) + + + +== Setting up Debian repositories == + +Because Raspbian is based on Debian and upstream Debian has support for the +architecture of the Raspberry Pi B+, you can configure and use upstream Debian +repositories and packages in the Pi. To do that, use the follwing snippet: +``` +(...) + tasks: + - name: install apt pinning config + copy: src=apt-pinning dest=/etc/apt/preferences.d/99pinning owner=root group=root mode=0644 + - name: install Debian apt key + apt_key: url='https://ftp-master.debian.org/keys/archive-key-9.asc' id='E1CF20DDFFE4B89E802658F1E0B11894F66AEC98' state=present + notify: apt-update + - name: install Debian apt repositories + apt_repository: repo='deb http://ftp.debian.org/debian {{item}} main contrib non-free' state=present + with_items: + - stable + - testing + - unstable + - experimental + notify: apt-update + handlers: + - name: apt-update + apt: update-cache=yes +``` + +The [apt-pinning apt-pinning] file should contain something like the following: + +%!include: ``apt-pinning`` + + diff --git a/articles/ansiblerpi/info.yaml b/articles/ansiblerpi/info.yaml new file mode 100644 index 00000000..2755fddf --- /dev/null +++ b/articles/ansiblerpi/info.yaml @@ -0,0 +1,6 @@ +title: Provisioning a Raspberry Pi using ansible +tab: articles +date: 2019-01-08 +tags: +- linux +- raspberrypi diff --git a/articles/bugprobhunt/SConscript b/articles/bugprobhunt/SConscript new file mode 100644 index 00000000..33b05ba5 --- /dev/null +++ b/articles/bugprobhunt/SConscript @@ -0,0 +1,77 @@ +import os + +pjoin = os.path.join + +if False: + Import = None + env = None +Import(["env"]) + +env.Program("hasbug.c", CPPFLAGS="-g -Wall -Werror -Wextra -W") + +env.Command( + "r1w3_n4_results.csv", + ["box"], + "$SOURCE -r 1 -w 3 -n 4 --output-results $TARGET", + chdir=False, +) +env.Command( + "r1w3_n4_results.t2t", + ["r1w3_n4_results.csv"], + "./tools/csvt2ttable $SOURCE $TARGET", +) +env.Depends("r1w3_n4_results.t2t", "../../tools/csvt2ttable") +env.T2TBHTML("r1w3_n4_results.bhtml.mako", "r1w3_n4_results.t2t") +env.MAKO("r1w3_n4_results.html", "r1w3_n4_results.bhtml.mako", MAKOFLAGS="-t htmlbare") +env.HTMLSITEFILES.add(pjoin("articles/bugprobhunt", "r1w3_n4_results.html")) + +for rw in [(1, 3), (1, 2), (1, 1)]: + b = "r%dw%d_n4_probabilities" % rw + env.Command( + b + ".csv", + ["box"], + "$SOURCE -r %d -w %d -n 4 --output-probabilities $TARGET" % rw, + chdir=False, + ) + env.Command(b + ".t2t", [b + ".csv"], "./tools/csvt2ttable $SOURCE $TARGET") + env.Depends(b + ".t2t", "../../tools/csvt2ttable") + env.Depends("index.bhtml", b + ".t2t") + +env.T2TBHTML("index.bhtml.mako", "index.t2t") +env.MAKO("index.html", "index.bhtml.mako", MAKOFLAGS="-t htmlpage") +env.HTMLSITEFILES.add("articles/bugprobhunt/index.html") + + +def envcmd(t, s, c): + env.Command(t, s, c) + env.HTMLSITEFILES.add(pjoin("articles/bugprobhunt", t)) + + +envcmd("r1w3_dist.png", "pdistplot.R", "$SOURCE 1 3 $TARGET") +envcmd("r1w3_dens.png", "pdensplot.R", "$SOURCE 1 3 $TARGET") + +# envcmd('trials.csv', +# [], +# 'articles/bugprobhunt/trialdoer articles/bugprobhunt/hasbug 5000 $TARGET') +# env.Depends('trials.csv',['trialdoer','hasbug']) + +envcmd("trials20.png", ["trialplot.R", "trials.csv"], "$SOURCES $TARGET 20") + +envcmd("after20.png", ["afterplot.R", "trials.csv"], "$SOURCES $TARGET 20") + +envcmd("trials5000.png", ["trialplot.R", "trials.csv"], "$SOURCES $TARGET 5000") + +envcmd("after5000.png", ["afterplot.R", "trials.csv"], "$SOURCES $TARGET 5000") + +envcmd("tbyn.png", ["tbyn.R", "trials.csv"], "$SOURCES $TARGET 200 300") + +if False: + envcmd( + "boxballs.png", + "boxballs.pov", + "runsilent povray ${SOURCE.file}" + + " -V +FN +O${TARGET.file} +Q11 +AM2 +H240 +W320 -D", + chdir=True, + ) + +envcmd("pdens_many.png", "pdensplot_many.R", "$SOURCE 1 3 $TARGET") diff --git a/articles/bugprobhunt/after20.png b/articles/bugprobhunt/after20.png new file mode 100644 index 00000000..f2f23576 Binary files /dev/null and b/articles/bugprobhunt/after20.png differ diff --git a/articles/bugprobhunt/after5000.png b/articles/bugprobhunt/after5000.png new file mode 100644 index 00000000..edffa748 Binary files /dev/null and b/articles/bugprobhunt/after5000.png differ diff --git a/articles/bugprobhunt/afterplot.R b/articles/bugprobhunt/afterplot.R new file mode 100755 index 00000000..a8de7f6d --- /dev/null +++ b/articles/bugprobhunt/afterplot.R @@ -0,0 +1,28 @@ +#!/usr/bin/Rscript + +library('reshape', quietly=TRUE, warn.conflicts=FALSE) +library('ggplot2', quietly=TRUE) + +a <- commandArgs(TRUE) + +input <- a[1] +output <- a[2] +num <- as.integer(a[3]) + +dat <- read.table(input, header=T, sep=',') +dat <- dat[0:num,] + +pmin <- tail(dat$p, 1) + +dat <- data.frame(t = seq(1, 40)) +dat$significance <- 1 - (1-pmin) ^ dat$t + +png(output, width=800) +ggplot(data=dat, aes(x=t)) + + geom_line(aes(y=significance, color="significance")) + + geom_hline(aes(yintercept=0.95, color="95%")) + + geom_hline(aes(yintercept=0.99, color="99%")) + + scale_y_continuous(limits = c(0, 1)) + + theme(legend.title = element_blank()) + + labs(title = 'Significance for t') + diff --git a/articles/bugprobhunt/box b/articles/bugprobhunt/box new file mode 100755 index 00000000..bbc0c8d6 --- /dev/null +++ b/articles/bugprobhunt/box @@ -0,0 +1,101 @@ +#!/usr/bin/python3 + +import sys +import os +from optparse import OptionParser + + +def buildresults(opts): + balls = [] + i = 0 + for _ in range(0, opts.red): + balls.append((i, "red")) + i = i + 1 + for _ in range(0, opts.green): + balls.append((i, "green")) + i = i + 1 + results = [[b] for b in balls] + for t in range(1, opts.n): + results0 = list(results) + results = [] + for r0 in results0: + for b in balls: + r = list(r0) + r.append(b) + results.append(r) + probs = {} + if opts.outprobabilities: + for trial in results: + k = 0 + for t in trial: + if t[1] == "red": + k = k + 1 + probs.setdefault(k, 0) + probs[k] = probs[k] + 1 + return balls, results, probs + + +def outputResults(opts, balls, results): + if opts.outresults == "-": + out = sys.stdout + elif opts.outresults: + out = open(opts.outresults + ".tmp", "w") + for i in range(1, opts.n + 1): + out.write('"trial %d",' % i) + out.write(r'"\(p\) estimate"\n') + for trial in results: + k = 0 + for t in trial: + if t[1] == "red": + k = k + 1 + out.write('"%d-%s",' % t) + out.write('"%d%%"\n' % (100.0 * k / 4)) + if opts.outresults != "-": + out.close() + os.rename(opts.outresults + ".tmp", opts.outresults) + + +def outputProbabilities(opts, balls, results, probs): + if opts.outprobabilities == "-": + out = sys.stdout + elif opts.outprobabilities: + out = open(opts.outprobabilities + ".tmp", "w") + out.write('"k","rows","%"\n') + for k, rows in probs.items(): + out.write('%d,%d,"%0.2f%%"\n' % (k, rows, 100.0 * rows / len(results))) + if opts.outprobabilities != "-": + out.close() + os.rename(opts.outprobabilities + ".tmp", opts.outprobabilities) + + +def main(): + parser = OptionParser("usage: %prog") + parser.add_option("-r", "--red", dest="red", type="int", help="Number of red balls") + parser.add_option( + "-w", "--green", dest="green", type="int", help="Number of green balls" + ) + parser.add_option("-n", "", dest="n", type="int", help="Number trials") + parser.add_option( + "", + "--output-results", + dest="outresults", + help="Output file for results, or - for stdout", + ) + parser.add_option( + "", + "--output-probabilities", + dest="outprobabilities", + help="Output file for probabilities, or - for stdout", + ) + opts, args = parser.parse_args() + if len(args) != 0: + parser.error("wrong number of arguments") + balls, results, probs = buildresults(opts) + if opts.outresults: + outputResults(opts, balls, results) + if opts.outprobabilities: + outputProbabilities(opts, balls, results, probs) + + +if __name__ == "__main__": + main() diff --git a/articles/bugprobhunt/boxballs.png b/articles/bugprobhunt/boxballs.png new file mode 100644 index 00000000..c3eb0eaa Binary files /dev/null and b/articles/bugprobhunt/boxballs.png differ diff --git a/articles/bugprobhunt/boxballs.pov b/articles/bugprobhunt/boxballs.pov new file mode 100644 index 00000000..3157391f --- /dev/null +++ b/articles/bugprobhunt/boxballs.pov @@ -0,0 +1,24 @@ +#include "colors.inc" +#include "woods.inc" + +global_settings { ambient_light <1,1,1> } + +//camera { location <0, 0, -6> look_at <0, 0, 0> } +//camera { location <5, 0, 0> look_at <0, 0, 0> rotate -x*90} +camera { location <5, 1, -2.5> look_at <0, 0, 0> sky <0,0,-10> } // rotate <-50,-10,100> } +light_source { <2, 5, -3> color White} + +plane { z,1 texture { T_Wood25 scale 4 } } + +//sphere { <0, 0, 0>, 0.5 texture { pigment { color Blue } } } +sphere { <-1, -1, 0>, 1 pigment { color Green } finish { specular 0.7 roughness 0.03 } } +sphere { <-1, 1, 0>, 1 pigment { color Green } finish { specular 0.7 roughness 0.03 } } +sphere { < 1, 1, 0>, 1 pigment { color Green } finish { specular 0.7 roughness 0.03 } } +sphere { < 1, -1, 0>, 1 pigment { color Red } finish { specular 0.7 roughness 0.03 } } + +box { < 2, 2, 1 >, < -2 , -2 , 1.1 > texture { T_Wood35 scale 4 } } +box { < 2, 2, 1 >, < -2 , 2.1, -0.3 > texture { T_Wood35 scale 4 } } +box { < -2, 2, 1 >, < -2.1, -2 , -0.3 > texture { T_Wood35 scale 4 } } +box { < -2, -2, 1 >, < 2 , -2.1, -0.3 > texture { T_Wood35 scale 4 } } +box { < 2, -2, 1 >, < 2.1, 2 , -0.3 > texture { T_Wood35 scale 4 } } + diff --git a/articles/bugprobhunt/hasbug b/articles/bugprobhunt/hasbug new file mode 100755 index 00000000..501bc875 Binary files /dev/null and b/articles/bugprobhunt/hasbug differ diff --git a/articles/bugprobhunt/hasbug.c b/articles/bugprobhunt/hasbug.c new file mode 100644 index 00000000..0e6d326c --- /dev/null +++ b/articles/bugprobhunt/hasbug.c @@ -0,0 +1,37 @@ + +#include +#include +#include + +/* Returns -1 if error, other number if ok. */ +int get_random_chars(char *r1, char*r2) +{ + int f = open("/dev/urandom", O_RDONLY); + + if (f < 0) + return -1; + if (read(f, r1, sizeof(*r1)) < 0) + return -1; + if (read(f, r2, sizeof(*r2)) < 0) + return -1; + close(f); + + return *r1 & *r2; +} + +int main(void) +{ + char r1; + char r2; + int ret; + + ret = get_random_chars(&r1, &r2); + + if (ret < 0) + fprintf(stderr, "error"); + else + printf("%d %d\n", r1, r2); + + return ret < 0; +} + diff --git a/articles/bugprobhunt/hasbug.o b/articles/bugprobhunt/hasbug.o new file mode 100644 index 00000000..b91050c6 Binary files /dev/null and b/articles/bugprobhunt/hasbug.o differ diff --git a/articles/bugprobhunt/index.bhtml.mako b/articles/bugprobhunt/index.bhtml.mako new file mode 100644 index 00000000..8c5c718e --- /dev/null +++ b/articles/bugprobhunt/index.bhtml.mako @@ -0,0 +1,646 @@ +
+

+Have you ever run into a bug that, no matter how careful you are trying to +reproduce it, it only happens sometimes? And then, you think you've got it, and +finally solved it - and tested a couple of times without any manifestation. How +do you know that you have tested enough? Are you sure you were not "lucky" in +your tests? +

+

+In this article we will see how to answer those questions and the math +behind it without going into too much detail. This is a pragmatic guide. +

+ + +

+
+

The Bug

+ +

+The following program is supposed to generate two random 8-bit integer and print +them on stdout: +

+ +
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Returns -1 if error, other number if ok. */
+int get_random_chars(char *r1, char*r2)
+{
+	int f = open("/dev/urandom", O_RDONLY);
+
+	if (f < 0)
+		return -1;
+	if (read(f, r1, sizeof(*r1)) < 0)
+		return -1;
+	if (read(f, r2, sizeof(*r2)) < 0)
+		return -1;
+	close(f);
+
+	return *r1 & *r2;
+}
+
+int main(void)
+{
+	char r1;
+	char r2;
+	int ret;
+
+	ret = get_random_chars(&r1, &r2);
+
+	if (ret < 0)
+		fprintf(stderr, "error");
+	else
+		printf("%d %d\n", r1, r2);
+
+	return ret < 0;
+}
+
+
+ +

+On my architecture (Linux on IA-32) it has a bug that makes it print "error" +instead of the numbers sometimes. +

+ +
+ +
+

The Model

+ +

+Every time we run the program, the bug can either show up or not. It has a +non-deterministic behaviour that requires statistical analysis. +

+

+We will model a single program run as a +Bernoulli trial, with success +defined as "seeing the bug", as that is the event we are interested in. We have +the following parameters when using this model: +

+ +
    +
  • \(n\): the number of tests made; +
  • +
  • \(k\): the number of times the bug was observed in the \(n\) tests; +
  • +
  • \(p\): the unknown (and, most of the time, unknowable) probability of seeing + the bug. +
  • +
+ +

+As a Bernoulli trial, the number of errors \(k\) of running the program \(n\) +times follows a +binomial distribution +\(k \sim B(n,p)\). We will use this model to estimate \(p\) and to confirm the +hypotheses that the bug no longer exists, after fixing the bug in whichever +way we can. +

+

+By using this model we are implicitly assuming that all our tests are performed +independently and identically. In order words: if the bug happens more ofter in +one environment, we either test always in that environment or never; if the bug +gets more and more frequent the longer the computer is running, we reset the +computer after each trial. If we don't do that, we are effectively estimating +the value of \(p\) with trials from different experiments, while in truth each +experiment has its own \(p\). We will find a single value anyway, but it has no +meaning and can lead us to wrong conclusions. +

+ +
+

Physical analogy

+ +

+Another way of thinking about the model and the strategy is by creating a +physical analogy with a box that has an unknown number of green and red balls: +

+ +
    +
  • Bernoulli trial: taking a single ball out of the box and looking at its + color - if it is red, we have observed the bug, otherwise we haven't. We then + put the ball back in the box. +
  • +
  • \(n\): the total number of trials we have performed. +
  • +
  • \(k\): the total number of red balls seen. +
  • +
  • \(p\): the total number of red balls in the box divided by the total number of + green balls in the box. +
  • +
+ +

+Some things become clearer when we think about this analogy: +

+ +
    +
  • If we open the box and count the balls, we can know \(p\), in contrast with + our original problem. +
  • +
  • Without opening the box, we can estimate \(p\) by repeating the trial. As + \(n\) increases, our estimate for \(p\) improves. Mathematically: + \[p = \lim_{n\to\infty}\frac{k}{n}\] +
  • +
  • Performing the trials in different conditions is like taking balls out of + several different boxes. The results tell us nothing about any single box. +
  • +
+ +

+ +

+ +
+
+
+

Estimating \(p\)

+ +

+Before we try fixing anything, we have to know more about the bug, starting by +the probability \(p\) of reproducing it. We can estimate this probability by +dividing the number of times we see the bug \(k\) by the number of times we +tested for it \(n\). Let's try that with our sample bug: +

+ +
+$ ./hasbug
+67 -68
+$ ./hasbug
+79 -101
+$ ./hasbug
+error
+
+ +

+We know from the source code that \(p=25%\), but let's pretend that we don't, as +will be the case with practically every non-deterministic bug. We tested 3 +times, so \(k=1, n=3 \Rightarrow p \sim 33%\), right? It would be better if we +tested more, but how much more, and exactly what would be better? +

+ +
+

\(p\) precision

+ +

+Let's go back to our box analogy: imagine that there are 4 balls in the box, one +red and three green. That means that \(p = 1/4\). What are the possible results +when we test three times? +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Red ballsGreen balls\(p\) estimate
030%
1233%
2166%
30100%
+ +

+The less we test, the smaller our precision is. Roughly, \(p\) precision will +be at most \(1/n\) - in this case, 33%. That's the step of values we can find +for \(p\), and the minimal value for it. +

+

+Testing more improves the precision of our estimate. +

+ +
+
+

\(p\) likelihood

+ +

+Let's now approach the problem from another angle: if \(p = 1/4\), what are the +odds of seeing one error in four tests? Let's name the 4 balls as 0-red, +1-green, 2-green and 3-green: +

+

+ +

+

+The table above has all the possible results for getting 4 balls out of the +box. That's \(4^4=256\) rows, generated by this python script. +The same script counts the number of red balls in each row, and outputs the +following table: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
krows%
410.39%
3124.69%
25421.09%
110842.19%
08131.64%
+ +

+That means that, for \(p=1/4\), we see 1 red ball and 3 green balls only 42% of +the time when getting out 4 balls. +

+

+What if \(p = 1/3\) - one red ball and two green balls? We would get the +following table: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
krows%
411.23%
389.88%
22429.63%
13239.51%
01619.75%
+ +

+What about \(p = 1/2\)? +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
krows%
416.25%
3425.00%
2637.50%
1425.00%
016.25%
+ +

+So, let's assume that you've seen the bug once in 4 trials. What is the value of +\(p\)? You know that can happen 42% of the time if \(p=1/4\), but you also know +it can happen 39% of the time if \(p=1/3\), and 25% of the time if \(p=1/2\). +Which one is it? +

+

+The graph bellow shows the discrete likelihood for all \(p\) percentual values +for getting 1 red and 3 green balls: +

+

+ +

+

+The fact is that, given the data, the estimate for \(p\) +follows a beta distribution +\(Beta(k+1, n-k+1) = Beta(2, 4)\) +(1) +The graph below shows the probability distribution density of \(p\): +

+

+ +

+

+The R script used to generate the first plot is here, the +one used for the second plot is here. +

+ +
+
+

Increasing \(n\), narrowing down the interval

+ +

+What happens when we test more? We obviously increase our precision, as it is at +most \(1/n\), as we said before - there is no way to estimate that \(p=1/3\) when we +only test twice. But there is also another effect: the distribution for \(p\) +gets taller and narrower around the observed ratio \(k/n\): +

+

+ +

+ +
+
+

Investigation framework

+ +

+So, which value will we use for \(p\)? +

+ +
    +
  • The smaller the value of \(p\), the more we have to test to reach a given + confidence in the bug solution. +
  • +
  • We must, then, choose the probability of error that we want to tolerate, and + take the smallest value of \(p\) that we can. + + A usual value for the probability of error is 5% (2.5% on each side). +
  • +
  • That means that we take the value of \(p\) that leaves 2.5% of the area of the + density curve out on the left side. Let's call this value + \(p_{min}\). +
  • +
  • That way, if the observed \(k/n\) remains somewhat constant, + \(p_{min}\) will raise, converging to the "real" \(p\) value. +
  • +
  • As \(p_{min}\) raises, the amount of testing we have to do after fixing the + bug decreases. +
  • +
+ +

+By using this framework we have direct, visual and tangible incentives to test +more. We can objectively measure the potential contribution of each test. +

+

+In order to calculate \(p_{min}\) with the mentioned properties, we have +to solve the following equation: +

+

+\[\sum_{k=0}^{k}{n\choose{k}}p_{min} ^k(1-p_{min})^{n-k}=\frac{\alpha}{2} \] +

+

+\(alpha\) here is twice the error we want to tolerate: 5% for an error of 2.5%. +

+

+That's not a trivial equation to solve for \(p_{min}\). Fortunately, that's +the formula for the confidence interval of the binomial distribution, and there +are a lot of sites that can calculate it: +

+ + + +
+
+
+

Is the bug fixed?

+ +

+So, you have tested a lot and calculated \(p_{min}\). The next step is fixing +the bug. +

+

+After fixing the bug, you will want to test again, in order to +confirm that the bug is fixed. How much testing is enough testing? +

+

+Let's say that \(t\) is the number of times we test the bug after it is fixed. +Then, if our fix is not effective and the bug still presents itself with +a probability greater than the \(p_{min}\) that we calculated, the probability +of not seeing the bug after \(t\) tests is: +

+

+\[\alpha = (1-p_{min})^t \] +

+

+Here, \(\alpha\) is also the probability of making a +type I error, +while \(1 - \alpha\) is the statistical significance of our tests. +

+

+We now have two options: +

+ +
    +
  • arbitrarily determining a standard statistical significance and testing enough + times to assert it. +
  • +
  • test as much as we can and report the achieved statistical significance. +
  • +
+ +

+Both options are valid. The first one is not always feasible, as the cost of +each trial can be high in time and/or other kind of resources. +

+

+The standard statistical significance in the industry is 5%, we recommend either +that or less. +

+

+Formally, this is very similar to a +statistical hypothesis testing. +

+ +
+
+

Back to the Bug

+ +
+

Testing 20 times

+ +

+This file has the results found after running our program 5000 +times. We must never throw out data, but let's pretend that we have tested our +program only 20 times. The observed \(k/n\) ration and the calculated +\(p_{min}\) evolved as shown in the following graph: +

+

+ +

+

+After those 20 tests, our \(p_{min}\) is about 12%. +

+

+Suppose that we fix the bug and test it again. The following graph shows the +statistical significance corresponding to the number of tests we do: +

+

+ +

+

+In words: we have to test 24 times after fixing the bug to reach 95% statistical +significance, and 35 to reach 99%. +

+

+Now, what happens if we test more before fixing the bug? +

+ +
+
+

Testing 5000 times

+ +

+Let's now use all the results and assume that we tested 5000 times before fixing +the bug. The graph bellow shows \(k/n\) and \(p_{min}\): +

+

+ +

+

+After those 5000 tests, our \(p_{min}\) is about 23% - much closer +to the real \(p\). +

+

+The following graph shows the statistical significance corresponding to the +number of tests we do after fixing the bug: +

+

+ +

+

+We can see in that graph that after about 11 tests we reach 95%, and after about +16 we get to 99%. As we have tested more before fixing the bug, we found a +higher \(p_{min}\), and that allowed us to test less after fixing the +bug. +

+ +
+
+
+

Optimal testing

+ +

+We have seen that we decrease \(t\) as we increase \(n\), as that can +potentially increases our lower estimate for \(p\). Of course, that value can +decrease as we test, but that means that we "got lucky" in the first trials and +we are getting to know the bug better - the estimate is approaching the real +value in a non-deterministic way, after all. +

+

+But, how much should we test before fixing the bug? Which value is an ideal +value for \(n\)? +

+

+To define an optimal value for \(n\), we will minimize the sum \(n+t\). This +objective gives us the benefit of minimizing the total amount of testing without +compromising our guarantees. Minimizing the testing can be fundamental if each +test costs significant time and/or resources. +

+

+The graph bellow shows us the evolution of the value of \(t\) and \(t+n\) using +the data we generated for our bug: +

+

+ +

+

+We can see clearly that there are some low values of \(n\) and \(t\) that give +us the guarantees we need. Those values are \(n = 15\) and \(t = 24\), which +gives us \(t+n = 39\). +

+

+While you can use this technique to minimize the total number of tests performed +(even more so when testing is expensive), testing more is always a good thing, +as it always improves our guarantee, be it in \(n\) by providing us with a +better \(p\) or in \(t\) by increasing the statistical significance of the +conclusion that the bug is fixed. So, before fixing the bug, test until you see +the bug at least once, and then at least the amount specified by this +technique - but also test more if you can, there is no upper bound, specially +after fixing the bug. You can then report a higher confidence in the solution. +

+ +
+
+

Conclusions

+ +

+When a programmer finds a bug that behaves in a non-deterministic way, he +knows he should test enough to know more about the bug, and then even more +after fixing it. In this article we have presented a framework that provides +criteria to define numerically how much testing is "enough" and "even more." The +same technique also provides a method to objectively measure the guarantee that +the amount of testing performed provides, when it is not possible to test +"enough." +

+

+We have also provided a real example (even though the bug itself is artificial) +where the framework is applied. +

+

+As usual, the source code of this page (R scripts, etc) can be found and +downloaded in https://github.com/lpenz/lpenz.github.io +

+
+
diff --git a/articles/bugprobhunt/index.html b/articles/bugprobhunt/index.html new file mode 100644 index 00000000..bf6d48df --- /dev/null +++ b/articles/bugprobhunt/index.html @@ -0,0 +1,784 @@ + + + + + +Probabilistic bug hunting + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Probabilistic bug hunting

+ + +
+

+Have you ever run into a bug that, no matter how careful you are trying to +reproduce it, it only happens sometimes? And then, you think you've got it, and +finally solved it - and tested a couple of times without any manifestation. How +do you know that you have tested enough? Are you sure you were not "lucky" in +your tests? +

+

+In this article we will see how to answer those questions and the math +behind it without going into too much detail. This is a pragmatic guide. +

+ + +

+
+

The Bug

+ +

+The following program is supposed to generate two random 8-bit integer and print +them on stdout: +

+ +
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+/* Returns -1 if error, other number if ok. */
+int get_random_chars(char *r1, char*r2)
+{
+	int f = open("/dev/urandom", O_RDONLY);
+
+	if (f < 0)
+		return -1;
+	if (read(f, r1, sizeof(*r1)) < 0)
+		return -1;
+	if (read(f, r2, sizeof(*r2)) < 0)
+		return -1;
+	close(f);
+
+	return *r1 & *r2;
+}
+
+int main(void)
+{
+	char r1;
+	char r2;
+	int ret;
+
+	ret = get_random_chars(&r1, &r2);
+
+	if (ret < 0)
+		fprintf(stderr, "error");
+	else
+		printf("%d %d\n", r1, r2);
+
+	return ret < 0;
+}
+
+
+ +

+On my architecture (Linux on IA-32) it has a bug that makes it print "error" +instead of the numbers sometimes. +

+ +
+ +
+

The Model

+ +

+Every time we run the program, the bug can either show up or not. It has a +non-deterministic behaviour that requires statistical analysis. +

+

+We will model a single program run as a +Bernoulli trial, with success +defined as "seeing the bug", as that is the event we are interested in. We have +the following parameters when using this model: +

+ +
    +
  • \(n\): the number of tests made; +
  • +
  • \(k\): the number of times the bug was observed in the \(n\) tests; +
  • +
  • \(p\): the unknown (and, most of the time, unknowable) probability of seeing + the bug. +
  • +
+ +

+As a Bernoulli trial, the number of errors \(k\) of running the program \(n\) +times follows a +binomial distribution +\(k \sim B(n,p)\). We will use this model to estimate \(p\) and to confirm the +hypotheses that the bug no longer exists, after fixing the bug in whichever +way we can. +

+

+By using this model we are implicitly assuming that all our tests are performed +independently and identically. In order words: if the bug happens more ofter in +one environment, we either test always in that environment or never; if the bug +gets more and more frequent the longer the computer is running, we reset the +computer after each trial. If we don't do that, we are effectively estimating +the value of \(p\) with trials from different experiments, while in truth each +experiment has its own \(p\). We will find a single value anyway, but it has no +meaning and can lead us to wrong conclusions. +

+ +
+

Physical analogy

+ +

+Another way of thinking about the model and the strategy is by creating a +physical analogy with a box that has an unknown number of green and red balls: +

+ +
    +
  • Bernoulli trial: taking a single ball out of the box and looking at its + color - if it is red, we have observed the bug, otherwise we haven't. We then + put the ball back in the box. +
  • +
  • \(n\): the total number of trials we have performed. +
  • +
  • \(k\): the total number of red balls seen. +
  • +
  • \(p\): the total number of red balls in the box divided by the total number of + green balls in the box. +
  • +
+ +

+Some things become clearer when we think about this analogy: +

+ +
    +
  • If we open the box and count the balls, we can know \(p\), in contrast with + our original problem. +
  • +
  • Without opening the box, we can estimate \(p\) by repeating the trial. As + \(n\) increases, our estimate for \(p\) improves. Mathematically: + \[p = \lim_{n\to\infty}\frac{k}{n}\] +
  • +
  • Performing the trials in different conditions is like taking balls out of + several different boxes. The results tell us nothing about any single box. +
  • +
+ +

+ +

+ +
+
+
+

Estimating \(p\)

+ +

+Before we try fixing anything, we have to know more about the bug, starting by +the probability \(p\) of reproducing it. We can estimate this probability by +dividing the number of times we see the bug \(k\) by the number of times we +tested for it \(n\). Let's try that with our sample bug: +

+ +
+$ ./hasbug
+67 -68
+$ ./hasbug
+79 -101
+$ ./hasbug
+error
+
+ +

+We know from the source code that \(p=25%\), but let's pretend that we don't, as +will be the case with practically every non-deterministic bug. We tested 3 +times, so \(k=1, n=3 \Rightarrow p \sim 33%\), right? It would be better if we +tested more, but how much more, and exactly what would be better? +

+ +
+

\(p\) precision

+ +

+Let's go back to our box analogy: imagine that there are 4 balls in the box, one +red and three green. That means that \(p = 1/4\). What are the possible results +when we test three times? +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Red ballsGreen balls\(p\) estimate
030%
1233%
2166%
30100%
+ +

+The less we test, the smaller our precision is. Roughly, \(p\) precision will +be at most \(1/n\) - in this case, 33%. That's the step of values we can find +for \(p\), and the minimal value for it. +

+

+Testing more improves the precision of our estimate. +

+ +
+
+

\(p\) likelihood

+ +

+Let's now approach the problem from another angle: if \(p = 1/4\), what are the +odds of seeing one error in four tests? Let's name the 4 balls as 0-red, +1-green, 2-green and 3-green: +

+

+ +

+

+The table above has all the possible results for getting 4 balls out of the +box. That's \(4^4=256\) rows, generated by this python script. +The same script counts the number of red balls in each row, and outputs the +following table: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
krows%
410.39%
3124.69%
25421.09%
110842.19%
08131.64%
+ +

+That means that, for \(p=1/4\), we see 1 red ball and 3 green balls only 42% of +the time when getting out 4 balls. +

+

+What if \(p = 1/3\) - one red ball and two green balls? We would get the +following table: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
krows%
411.23%
389.88%
22429.63%
13239.51%
01619.75%
+ +

+What about \(p = 1/2\)? +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
krows%
416.25%
3425.00%
2637.50%
1425.00%
016.25%
+ +

+So, let's assume that you've seen the bug once in 4 trials. What is the value of +\(p\)? You know that can happen 42% of the time if \(p=1/4\), but you also know +it can happen 39% of the time if \(p=1/3\), and 25% of the time if \(p=1/2\). +Which one is it? +

+

+The graph bellow shows the discrete likelihood for all \(p\) percentual values +for getting 1 red and 3 green balls: +

+

+ +

+

+The fact is that, given the data, the estimate for \(p\) +follows a beta distribution +\(Beta(k+1, n-k+1) = Beta(2, 4)\) +(1) +The graph below shows the probability distribution density of \(p\): +

+

+ +

+

+The R script used to generate the first plot is here, the +one used for the second plot is here. +

+ +
+
+

Increasing \(n\), narrowing down the interval

+ +

+What happens when we test more? We obviously increase our precision, as it is at +most \(1/n\), as we said before - there is no way to estimate that \(p=1/3\) when we +only test twice. But there is also another effect: the distribution for \(p\) +gets taller and narrower around the observed ratio \(k/n\): +

+

+ +

+ +
+
+

Investigation framework

+ +

+So, which value will we use for \(p\)? +

+ +
    +
  • The smaller the value of \(p\), the more we have to test to reach a given + confidence in the bug solution. +
  • +
  • We must, then, choose the probability of error that we want to tolerate, and + take the smallest value of \(p\) that we can. + + A usual value for the probability of error is 5% (2.5% on each side). +
  • +
  • That means that we take the value of \(p\) that leaves 2.5% of the area of the + density curve out on the left side. Let's call this value + \(p_{min}\). +
  • +
  • That way, if the observed \(k/n\) remains somewhat constant, + \(p_{min}\) will raise, converging to the "real" \(p\) value. +
  • +
  • As \(p_{min}\) raises, the amount of testing we have to do after fixing the + bug decreases. +
  • +
+ +

+By using this framework we have direct, visual and tangible incentives to test +more. We can objectively measure the potential contribution of each test. +

+

+In order to calculate \(p_{min}\) with the mentioned properties, we have +to solve the following equation: +

+

+\[\sum_{k=0}^{k}{n\choose{k}}p_{min} ^k(1-p_{min})^{n-k}=\frac{\alpha}{2} \] +

+

+\(alpha\) here is twice the error we want to tolerate: 5% for an error of 2.5%. +

+

+That's not a trivial equation to solve for \(p_{min}\). Fortunately, that's +the formula for the confidence interval of the binomial distribution, and there +are a lot of sites that can calculate it: +

+ + + +
+
+
+

Is the bug fixed?

+ +

+So, you have tested a lot and calculated \(p_{min}\). The next step is fixing +the bug. +

+

+After fixing the bug, you will want to test again, in order to +confirm that the bug is fixed. How much testing is enough testing? +

+

+Let's say that \(t\) is the number of times we test the bug after it is fixed. +Then, if our fix is not effective and the bug still presents itself with +a probability greater than the \(p_{min}\) that we calculated, the probability +of not seeing the bug after \(t\) tests is: +

+

+\[\alpha = (1-p_{min})^t \] +

+

+Here, \(\alpha\) is also the probability of making a +type I error, +while \(1 - \alpha\) is the statistical significance of our tests. +

+

+We now have two options: +

+ +
    +
  • arbitrarily determining a standard statistical significance and testing enough + times to assert it. +
  • +
  • test as much as we can and report the achieved statistical significance. +
  • +
+ +

+Both options are valid. The first one is not always feasible, as the cost of +each trial can be high in time and/or other kind of resources. +

+

+The standard statistical significance in the industry is 5%, we recommend either +that or less. +

+

+Formally, this is very similar to a +statistical hypothesis testing. +

+ +
+
+

Back to the Bug

+ +
+

Testing 20 times

+ +

+This file has the results found after running our program 5000 +times. We must never throw out data, but let's pretend that we have tested our +program only 20 times. The observed \(k/n\) ration and the calculated +\(p_{min}\) evolved as shown in the following graph: +

+

+ +

+

+After those 20 tests, our \(p_{min}\) is about 12%. +

+

+Suppose that we fix the bug and test it again. The following graph shows the +statistical significance corresponding to the number of tests we do: +

+

+ +

+

+In words: we have to test 24 times after fixing the bug to reach 95% statistical +significance, and 35 to reach 99%. +

+

+Now, what happens if we test more before fixing the bug? +

+ +
+
+

Testing 5000 times

+ +

+Let's now use all the results and assume that we tested 5000 times before fixing +the bug. The graph bellow shows \(k/n\) and \(p_{min}\): +

+

+ +

+

+After those 5000 tests, our \(p_{min}\) is about 23% - much closer +to the real \(p\). +

+

+The following graph shows the statistical significance corresponding to the +number of tests we do after fixing the bug: +

+

+ +

+

+We can see in that graph that after about 11 tests we reach 95%, and after about +16 we get to 99%. As we have tested more before fixing the bug, we found a +higher \(p_{min}\), and that allowed us to test less after fixing the +bug. +

+ +
+
+
+

Optimal testing

+ +

+We have seen that we decrease \(t\) as we increase \(n\), as that can +potentially increases our lower estimate for \(p\). Of course, that value can +decrease as we test, but that means that we "got lucky" in the first trials and +we are getting to know the bug better - the estimate is approaching the real +value in a non-deterministic way, after all. +

+

+But, how much should we test before fixing the bug? Which value is an ideal +value for \(n\)? +

+

+To define an optimal value for \(n\), we will minimize the sum \(n+t\). This +objective gives us the benefit of minimizing the total amount of testing without +compromising our guarantees. Minimizing the testing can be fundamental if each +test costs significant time and/or resources. +

+

+The graph bellow shows us the evolution of the value of \(t\) and \(t+n\) using +the data we generated for our bug: +

+

+ +

+

+We can see clearly that there are some low values of \(n\) and \(t\) that give +us the guarantees we need. Those values are \(n = 15\) and \(t = 24\), which +gives us \(t+n = 39\). +

+

+While you can use this technique to minimize the total number of tests performed +(even more so when testing is expensive), testing more is always a good thing, +as it always improves our guarantee, be it in \(n\) by providing us with a +better \(p\) or in \(t\) by increasing the statistical significance of the +conclusion that the bug is fixed. So, before fixing the bug, test until you see +the bug at least once, and then at least the amount specified by this +technique - but also test more if you can, there is no upper bound, specially +after fixing the bug. You can then report a higher confidence in the solution. +

+ +
+
+

Conclusions

+ +

+When a programmer finds a bug that behaves in a non-deterministic way, he +knows he should test enough to know more about the bug, and then even more +after fixing it. In this article we have presented a framework that provides +criteria to define numerically how much testing is "enough" and "even more." The +same technique also provides a method to objectively measure the guarantee that +the amount of testing performed provides, when it is not possible to test +"enough." +

+

+We have also provided a real example (even though the bug itself is artificial) +where the framework is applied. +

+

+As usual, the source code of this page (R scripts, etc) can be found and +downloaded in https://github.com/lpenz/lpenz.github.io +

+
+
+ + +
+ + + + + + + + + + + + + + + diff --git a/articles/bugprobhunt/index.t2t b/articles/bugprobhunt/index.t2t new file mode 100644 index 00000000..783c79f5 --- /dev/null +++ b/articles/bugprobhunt/index.t2t @@ -0,0 +1,374 @@ +Probabilistic bug hunting +Basic statistics for programmers +2013-12-09 + +%!postproc: '!!r1w3_n4_results!!' + + + +Have you ever run into a bug that, no matter how careful you are trying to +reproduce it, it only happens sometimes? And then, you think you've got it, and +finally solved it - and tested a couple of times without any manifestation. How +do you know that you have tested enough? Are you sure you were not "lucky" in +your tests? + +In this article we will see how to answer those questions and the math +behind it without going into too much detail. This is a pragmatic guide. + + + +== The Bug ==[thebug] + +The following program is supposed to generate two random 8-bit integer and print +them on stdout: + +%!include: ``hasbug.c`` + +On my architecture (Linux on IA-32) it has a bug that makes it print "error" +instead of the numbers sometimes. + + + += The Model = + +Every time we run the program, the bug can either show up or not. It has a +non-deterministic behaviour that requires statistical analysis. + +We will model a single program run as a +[Bernoulli trial https://en.wikipedia.org/wiki/Bernoulli_trial], with success +defined as "seeing the bug", as that is the event we are interested in. We have +the following parameters when using this model: +- \(n\): the number of tests made; +- \(k\): the number of times the bug was observed in the \(n\) tests; +- \(p\): the unknown (and, most of the time, unknowable) probability of seeing + the bug. + + +As a Bernoulli trial, the number of errors \(k\) of running the program \(n\) +times follows a +[binomial distribution https://en.wikipedia.org/wiki/Binomial_distribution] +\(k \sim B(n,p)\). We will use this model to estimate \(p\) and to confirm the +hypotheses that the bug no longer exists, after fixing the bug in whichever +way we can. + +By using this model we are implicitly assuming that all our tests are performed +independently and identically. In order words: if the bug happens more ofter in +one environment, we either test always in that environment or never; if the bug +gets more and more frequent the longer the computer is running, we reset the +computer after each trial. If we don't do that, we are effectively estimating +the value of \(p\) with trials from different experiments, while in truth each +experiment has its own \(p\). We will find a single value anyway, but it has no +meaning and can lead us to wrong conclusions. + + + +== Physical analogy == + +Another way of thinking about the model and the strategy is by creating a +physical analogy with a box that has an unknown number of green and red balls: +- Bernoulli trial: taking a single ball out of the box and looking at its + color - if it is red, we have observed the bug, otherwise we haven't. We then + put the ball back in the box. +- \(n\): the total number of trials we have performed. +- \(k\): the total number of red balls seen. +- \(p\): the total number of red balls in the box divided by the total number of + green balls in the box. + + +Some things become clearer when we think about this analogy: +- If we open the box and count the balls, we can know \(p\), in contrast with + our original problem. +- Without opening the box, we can estimate \(p\) by repeating the trial. As + \(n\) increases, our estimate for \(p\) improves. Mathematically: + \[p = \lim_{n\to\infty}\frac{k}{n}\] +- Performing the trials in different conditions is like taking balls out of + several different boxes. The results tell us nothing about any single box. + + + [boxballs.png] + + + += Estimating \(p\) = + +Before we try fixing anything, we have to know more about the bug, starting by +the probability \(p\) of reproducing it. We can estimate this probability by +dividing the number of times we see the bug \(k\) by the number of times we +tested for it \(n\). Let's try that with our sample bug: + +``` +$ ./hasbug +67 -68 +$ ./hasbug +79 -101 +$ ./hasbug +error +``` + +We know from the source code that \(p=25%\), but let's pretend that we don't, as +will be the case with practically every non-deterministic bug. We tested 3 +times, so \(k=1, n=3 \Rightarrow p \sim 33%\), right? It would be better if we +tested more, but how much more, and exactly what would be better? + + + +== \(p\) precision == + +Let's go back to our box analogy: imagine that there are 4 balls in the box, one +red and three green. That means that \(p = 1/4\). What are the possible results +when we test three times? + +|| Red balls | Green balls | \(p\) estimate | +| 0 | 3 | 0% | +| 1 | 2 | 33% | +| 2 | 1 | 66% | +| 3 | 0 | 100% | + +The less we test, the smaller our precision is. Roughly, \(p\) precision will +be at most \(1/n\) - in this case, 33%. That's the step of values we can find +for \(p\), and the minimal value for it. + +Testing more improves the precision of our estimate. + + + +== \(p\) likelihood == + +Let's now approach the problem from another angle: if \(p = 1/4\), what are the +odds of seeing one error in four tests? Let's name the 4 balls as 0-red, +1-green, 2-green and 3-green: + +!!r1w3_n4_results!! + +The table above has all the possible results for getting 4 balls out of the +box. That's \(4^4=256\) rows, generated by [this $cwd$/box] python script. +The same script counts the number of red balls in each row, and outputs the +following table: + +%!include: r1w3_n4_probabilities.t2t + +That means that, for \(p=1/4\), we see 1 red ball and 3 green balls only 42% of +the time when getting out 4 balls. + +What if \(p = 1/3\) - one red ball and two green balls? We would get the +following table: + +%!include: r1w2_n4_probabilities.t2t + +What about \(p = 1/2\)? + +%!include: r1w1_n4_probabilities.t2t + +So, let's assume that you've seen the bug once in 4 trials. What is the value of +\(p\)? You know that can happen 42% of the time if \(p=1/4\), but you also know +it can happen 39% of the time if \(p=1/3\), and 25% of the time if \(p=1/2\). +Which one is it? + +The graph bellow shows the discrete likelihood for all \(p\) percentual values +for getting 1 red and 3 green balls: + + [r1w3_dist.png] + + +The fact is that, //given the data//, the estimate for \(p\) +follows a [beta distribution https://en.wikipedia.org/wiki/Beta_distribution] +\(Beta(k+1, n-k+1) = Beta(2, 4)\) +([1 http://stats.stackexchange.com/questions/13225/what-is-the-distribution-of-the-binomial-distribution-parameter-p-given-a-samp]) +The graph below shows the probability distribution density of \(p\): + + [r1w3_dens.png] + +The R script used to generate the first plot is [here $cwd$/pdistplot.R], the +one used for the second plot is [here $cwd$/pdensplot.R]. + + + +== Increasing \(n\), narrowing down the interval == + +What happens when we test more? We obviously increase our precision, as it is at +most \(1/n\), as we said before - there is no way to estimate that \(p=1/3\) when we +only test twice. But there is also another effect: the distribution for \(p\) +gets taller and narrower around the observed ratio \(k/n\): + + [pdens_many.png] + + + +== Investigation framework == + +So, which value will we use for \(p\)? +- The smaller the value of \(p\), the more we have to test to reach a given + confidence in the bug solution. +- We must, then, choose the probability of error that we want to tolerate, and + take the //smallest// value of \(p\) that we can. + + A usual value for the probability of error is 5% (2.5% on each side). +- That means that we take the value of \(p\) that leaves 2.5% of the area of the + density curve out on the left side. Let's call this value + \(p_{min}\). +- That way, if the observed \(k/n\) remains somewhat constant, + \(p_{min}\) will raise, converging to the "real" \(p\) value. +- As \(p_{min}\) raises, the amount of testing we have to do after fixing the + bug decreases. + + +By using this framework we have direct, visual and tangible incentives to test +more. We can objectively measure the potential contribution of each test. + +In order to calculate \(p_{min}\) with the mentioned properties, we have +to solve the following equation: + +\[\sum_{k=0}^{k}{n\choose{k}}p_{min} ^k(1-p_{min})^{n-k}=\frac{\alpha}{2} \] + +\(alpha\) here is twice the error we want to tolerate: 5% for an error of 2.5%. + +That's not a trivial equation to solve for \(p_{min}\). Fortunately, that's +the formula for the confidence interval of the binomial distribution, and there +are a lot of sites that can calculate it: +- http://statpages.info/confint.html: \(\alpha\) here is 5%. +- http://www.danielsoper.com/statcalc3/calc.aspx?id=85: results for \(\alpha\) + 1%, 5% and 10%. +- https://www.google.com.br/search?q=binomial+confidence+interval+calculator: + google search. + + + += Is the bug fixed? = + +So, you have tested a lot and calculated \(p_{min}\). The next step is fixing +the bug. + +After fixing the bug, you will want to test again, in order to +confirm that the bug is fixed. How much testing is enough testing? + +Let's say that \(t\) is the number of times we test the bug after it is fixed. +Then, if our fix is not effective and the bug still presents itself with +a probability greater than the \(p_{min}\) that we calculated, the probability +of //not// seeing the bug after \(t\) tests is: + +\[\alpha = (1-p_{min})^t \] + +Here, \(\alpha\) is also the probability of making a +[type I error https://en.wikipedia.org/wiki/Type_I_and_type_II_errors#Type_I_error], +while \(1 - \alpha\) is the //statistical significance// of our tests. + +We now have two options: +- arbitrarily determining a standard statistical significance and testing enough + times to assert it. +- test as much as we can and report the achieved statistical significance. + + +Both options are valid. The first one is not always feasible, as the cost of +each trial can be high in time and/or other kind of resources. + +The standard statistical significance in the industry is 5%, we recommend either +that or less. + +Formally, this is very similar to a +[statistical hypothesis testing https://en.wikipedia.org/wiki/Hypothesis_testing]. + + + += Back to the Bug = + + + +== Testing 20 times == + +[This file trials.csv] has the results found after running our program 5000 +times. We must never throw out data, but let's pretend that we have tested our +program only 20 times. The observed \(k/n\) ration and the calculated +\(p_{min}\) evolved as shown in the following graph: + + [trials20.png] + +After those 20 tests, our \(p_{min}\) is about 12%. + +Suppose that we fix the bug and test it again. The following graph shows the +statistical significance corresponding to the number of tests we do: + + [after20.png] + +In words: we have to test 24 times after fixing the bug to reach 95% statistical +significance, and 35 to reach 99%. + +Now, what happens if we test more before fixing the bug? + + + +== Testing 5000 times == + +Let's now use all the results and assume that we tested 5000 times before fixing +the bug. The graph bellow shows \(k/n\) and \(p_{min}\): + + [trials5000.png] + +After those 5000 tests, our \(p_{min}\) is about 23% - much closer +to the real \(p\). + +The following graph shows the statistical significance corresponding to the +number of tests we do after fixing the bug: + + [after5000.png] + +We can see in that graph that after about 11 tests we reach 95%, and after about +16 we get to 99%. As we have tested more before fixing the bug, we found a +higher \(p_{min}\), and that allowed us to test less after fixing the +bug. + + + += Optimal testing = + +We have seen that we decrease \(t\) as we increase \(n\), as that can +potentially increases our lower estimate for \(p\). Of course, that value can +decrease as we test, but that means that we "got lucky" in the first trials and +we are getting to know the bug better - the estimate is approaching the real +value in a non-deterministic way, after all. + +But, how much should we test before fixing the bug? Which value is an ideal +value for \(n\)? + +To define an optimal value for \(n\), we will minimize the sum \(n+t\). This +objective gives us the benefit of minimizing the total amount of testing without +compromising our guarantees. Minimizing the testing can be fundamental if each +test costs significant time and/or resources. + +The graph bellow shows us the evolution of the value of \(t\) and \(t+n\) using +the data we generated for our bug: + + [tbyn.png] + +We can see clearly that there are some low values of \(n\) and \(t\) that give +us the guarantees we need. Those values are \(n = 15\) and \(t = 24\), which +gives us \(t+n = 39\). + +While you can use this technique to minimize the total number of tests performed +(even more so when testing is expensive), testing more is always a good thing, +as it always improves our guarantee, be it in \(n\) by providing us with a +better \(p\) or in \(t\) by increasing the statistical significance of the +conclusion that the bug is fixed. So, before fixing the bug, test until you see +the bug at least once, and then at least the amount specified by this +technique - but also test more if you can, there is no upper bound, specially +after fixing the bug. You can then report a higher confidence in the solution. + + + += Conclusions = + +When a programmer finds a bug that behaves in a non-deterministic way, he +knows he should test enough to know more about the bug, and then even more +after fixing it. In this article we have presented a framework that provides +criteria to define numerically how much testing is "enough" and "even more." The +same technique also provides a method to objectively measure the guarantee that +the amount of testing performed provides, when it is not possible to test +"enough." + +We have also provided a real example (even though the bug itself is artificial) +where the framework is applied. + +As usual, the source code of this page (R scripts, etc) can be found and +downloaded in https://github.com/lpenz/lpenz.github.io + + + diff --git a/articles/bugprobhunt/info.yaml b/articles/bugprobhunt/info.yaml new file mode 100644 index 00000000..e196a561 --- /dev/null +++ b/articles/bugprobhunt/info.yaml @@ -0,0 +1,8 @@ +title: Probabilistic bug hunting +tab: articles +date: 2013-12-09 +mathjax: True +tags: +- programming +- R +- statistics diff --git a/articles/bugprobhunt/pdens_many.png b/articles/bugprobhunt/pdens_many.png new file mode 100644 index 00000000..de48e6ed Binary files /dev/null and b/articles/bugprobhunt/pdens_many.png differ diff --git a/articles/bugprobhunt/pdensplot.R b/articles/bugprobhunt/pdensplot.R new file mode 100755 index 00000000..7d82aa6b --- /dev/null +++ b/articles/bugprobhunt/pdensplot.R @@ -0,0 +1,21 @@ +#!/usr/bin/Rscript + +library('reshape', quietly=TRUE, warn.conflicts=FALSE) +library('ggplot2', quietly=TRUE) + +a <- commandArgs(TRUE) + +red <- as.integer(a[1]) +green <- as.integer(a[2]) +output <- a[3] + +k <- red +n <- red+green + +x <- seq(0, 1, 0.001) +#y <- dbeta(x, k+1, n-k+1) +y <- dbeta(x, k+1, n-k+1) + +png(output, width=800) +qplot(x, y, geom='line', xlab='p', ylab='L(p)', main=paste('p density given k', k, 'n', n)) + diff --git a/articles/bugprobhunt/pdensplot_many.R b/articles/bugprobhunt/pdensplot_many.R new file mode 100755 index 00000000..35859893 --- /dev/null +++ b/articles/bugprobhunt/pdensplot_many.R @@ -0,0 +1,54 @@ +#!/usr/bin/Rscript + +library('reshape', quietly=TRUE, warn.conflicts=FALSE) +library('ggplot2', quietly=TRUE) + +a <- commandArgs(TRUE) + +red <- as.integer(a[1]) +green <- as.integer(a[2]) +output <- a[3] + +x <- seq(0, 1, 0.001) + +calc <- function(mult) { + k <- mult * red + n <- mult * (red+green) + dbeta(x, k+1, n-k+1) +} + +labl <- function(mult) { + k <- mult * red + n <- mult * (red+green) + paste('k',k,'n',n) +} + +d <- data.frame(x = c(x,x,x,x,x,x,x,x,x), + y = c( + calc(1), + calc(2), + calc(3), + calc(4), + calc(5), + calc(6), + calc(7), + calc(8), + calc(9)), + params=c( + replicate(1001, labl(1)), + replicate(1001, labl(2)), + replicate(1001, labl(3)), + replicate(1001, labl(4)), + replicate(1001, labl(5)), + replicate(1001, labl(6)), + replicate(1001, labl(7)), + replicate(1001, labl(8)), + replicate(1001, labl(9))) + ) + +png(output, width=800) +ggplot(data=d, aes(x=x, y=y)) + geom_line(aes(color=params)) + + ggtitle(paste('p density for k=n/4')) + + scale_x_continuous(name='p') + + scale_y_continuous(name='PDF B(k=1, n=4, p=p)') + diff --git a/articles/bugprobhunt/pdistplot.R b/articles/bugprobhunt/pdistplot.R new file mode 100755 index 00000000..0d47ba37 --- /dev/null +++ b/articles/bugprobhunt/pdistplot.R @@ -0,0 +1,25 @@ +#!/usr/bin/Rscript + +library('reshape', quietly=TRUE, warn.conflicts=FALSE) +library('ggplot2', quietly=TRUE) + +a <- commandArgs(TRUE) + +red <- as.integer(a[1]) +green <- as.integer(a[2]) +output <- a[3] + +k <- red +n <- red+green + +x <- seq(0, 1, 0.01) +df <- data.frame(x=x, y=dbinom(k, n, x)) + +png(output, width=800) +ggplot(df, aes(x = x, y = y)) + + ggtitle(paste('p distribution for', red, 'red and', green, 'green balls')) + + scale_x_continuous(name='p') + + scale_y_continuous(name='L(k=1, n=4, p=p)') + + geom_point(size=2) + geom_linerange(aes(ymin = 0, ymax = y)) +#qplot(x, y, geom='line', xlab='p', ylab='P(p)', main=paste('p distribution for', red, 'red and', green, 'green balls')) + diff --git a/articles/bugprobhunt/r1w1_n4_probabilities.csv b/articles/bugprobhunt/r1w1_n4_probabilities.csv new file mode 100644 index 00000000..05c0f2d2 --- /dev/null +++ b/articles/bugprobhunt/r1w1_n4_probabilities.csv @@ -0,0 +1,6 @@ +"k","rows","%" +4,1,"6.25%" +3,4,"25.00%" +2,6,"37.50%" +1,4,"25.00%" +0,1,"6.25%" diff --git a/articles/bugprobhunt/r1w1_n4_probabilities.t2t b/articles/bugprobhunt/r1w1_n4_probabilities.t2t new file mode 100644 index 00000000..b3758fe6 --- /dev/null +++ b/articles/bugprobhunt/r1w1_n4_probabilities.t2t @@ -0,0 +1,10 @@ + + + + +|| k | rows | % | +| 4 | 1 | 6.25% | +| 3 | 4 | 25.00% | +| 2 | 6 | 37.50% | +| 1 | 4 | 25.00% | +| 0 | 1 | 6.25% | diff --git a/articles/bugprobhunt/r1w2_n4_probabilities.csv b/articles/bugprobhunt/r1w2_n4_probabilities.csv new file mode 100644 index 00000000..f985f94c --- /dev/null +++ b/articles/bugprobhunt/r1w2_n4_probabilities.csv @@ -0,0 +1,6 @@ +"k","rows","%" +4,1,"1.23%" +3,8,"9.88%" +2,24,"29.63%" +1,32,"39.51%" +0,16,"19.75%" diff --git a/articles/bugprobhunt/r1w2_n4_probabilities.t2t b/articles/bugprobhunt/r1w2_n4_probabilities.t2t new file mode 100644 index 00000000..ba8e6f36 --- /dev/null +++ b/articles/bugprobhunt/r1w2_n4_probabilities.t2t @@ -0,0 +1,10 @@ + + + + +|| k | rows | % | +| 4 | 1 | 1.23% | +| 3 | 8 | 9.88% | +| 2 | 24 | 29.63% | +| 1 | 32 | 39.51% | +| 0 | 16 | 19.75% | diff --git a/articles/bugprobhunt/r1w3_dens.png b/articles/bugprobhunt/r1w3_dens.png new file mode 100644 index 00000000..b98bb3c5 Binary files /dev/null and b/articles/bugprobhunt/r1w3_dens.png differ diff --git a/articles/bugprobhunt/r1w3_dist.png b/articles/bugprobhunt/r1w3_dist.png new file mode 100644 index 00000000..09436107 Binary files /dev/null and b/articles/bugprobhunt/r1w3_dist.png differ diff --git a/articles/bugprobhunt/r1w3_n4_probabilities.csv b/articles/bugprobhunt/r1w3_n4_probabilities.csv new file mode 100644 index 00000000..df4d33cb --- /dev/null +++ b/articles/bugprobhunt/r1w3_n4_probabilities.csv @@ -0,0 +1,6 @@ +"k","rows","%" +4,1,"0.39%" +3,12,"4.69%" +2,54,"21.09%" +1,108,"42.19%" +0,81,"31.64%" diff --git a/articles/bugprobhunt/r1w3_n4_probabilities.t2t b/articles/bugprobhunt/r1w3_n4_probabilities.t2t new file mode 100644 index 00000000..41bdb743 --- /dev/null +++ b/articles/bugprobhunt/r1w3_n4_probabilities.t2t @@ -0,0 +1,10 @@ + + + + +|| k | rows | % | +| 4 | 1 | 0.39% | +| 3 | 12 | 4.69% | +| 2 | 54 | 21.09% | +| 1 | 108 | 42.19% | +| 0 | 81 | 31.64% | diff --git a/articles/bugprobhunt/r1w3_n4_results.bhtml.mako b/articles/bugprobhunt/r1w3_n4_results.bhtml.mako new file mode 100644 index 00000000..6c292f40 --- /dev/null +++ b/articles/bugprobhunt/r1w3_n4_results.bhtml.mako @@ -0,0 +1,1802 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
trial 1trial 2trial 3trial 4\(p\) estimate\n"0-red"0-red0-red0-red100%
0-red0-red0-red1-green75%
0-red0-red0-red2-green75%
0-red0-red0-red3-green75%
0-red0-red1-green0-red75%
0-red0-red1-green1-green50%
0-red0-red1-green2-green50%
0-red0-red1-green3-green50%
0-red0-red2-green0-red75%
0-red0-red2-green1-green50%
0-red0-red2-green2-green50%
0-red0-red2-green3-green50%
0-red0-red3-green0-red75%
0-red0-red3-green1-green50%
0-red0-red3-green2-green50%
0-red0-red3-green3-green50%
0-red1-green0-red0-red75%
0-red1-green0-red1-green50%
0-red1-green0-red2-green50%
0-red1-green0-red3-green50%
0-red1-green1-green0-red50%
0-red1-green1-green1-green25%
0-red1-green1-green2-green25%
0-red1-green1-green3-green25%
0-red1-green2-green0-red50%
0-red1-green2-green1-green25%
0-red1-green2-green2-green25%
0-red1-green2-green3-green25%
0-red1-green3-green0-red50%
0-red1-green3-green1-green25%
0-red1-green3-green2-green25%
0-red1-green3-green3-green25%
0-red2-green0-red0-red75%
0-red2-green0-red1-green50%
0-red2-green0-red2-green50%
0-red2-green0-red3-green50%
0-red2-green1-green0-red50%
0-red2-green1-green1-green25%
0-red2-green1-green2-green25%
0-red2-green1-green3-green25%
0-red2-green2-green0-red50%
0-red2-green2-green1-green25%
0-red2-green2-green2-green25%
0-red2-green2-green3-green25%
0-red2-green3-green0-red50%
0-red2-green3-green1-green25%
0-red2-green3-green2-green25%
0-red2-green3-green3-green25%
0-red3-green0-red0-red75%
0-red3-green0-red1-green50%
0-red3-green0-red2-green50%
0-red3-green0-red3-green50%
0-red3-green1-green0-red50%
0-red3-green1-green1-green25%
0-red3-green1-green2-green25%
0-red3-green1-green3-green25%
0-red3-green2-green0-red50%
0-red3-green2-green1-green25%
0-red3-green2-green2-green25%
0-red3-green2-green3-green25%
0-red3-green3-green0-red50%
0-red3-green3-green1-green25%
0-red3-green3-green2-green25%
0-red3-green3-green3-green25%
1-green0-red0-red0-red75%
1-green0-red0-red1-green50%
1-green0-red0-red2-green50%
1-green0-red0-red3-green50%
1-green0-red1-green0-red50%
1-green0-red1-green1-green25%
1-green0-red1-green2-green25%
1-green0-red1-green3-green25%
1-green0-red2-green0-red50%
1-green0-red2-green1-green25%
1-green0-red2-green2-green25%
1-green0-red2-green3-green25%
1-green0-red3-green0-red50%
1-green0-red3-green1-green25%
1-green0-red3-green2-green25%
1-green0-red3-green3-green25%
1-green1-green0-red0-red50%
1-green1-green0-red1-green25%
1-green1-green0-red2-green25%
1-green1-green0-red3-green25%
1-green1-green1-green0-red25%
1-green1-green1-green1-green0%
1-green1-green1-green2-green0%
1-green1-green1-green3-green0%
1-green1-green2-green0-red25%
1-green1-green2-green1-green0%
1-green1-green2-green2-green0%
1-green1-green2-green3-green0%
1-green1-green3-green0-red25%
1-green1-green3-green1-green0%
1-green1-green3-green2-green0%
1-green1-green3-green3-green0%
1-green2-green0-red0-red50%
1-green2-green0-red1-green25%
1-green2-green0-red2-green25%
1-green2-green0-red3-green25%
1-green2-green1-green0-red25%
1-green2-green1-green1-green0%
1-green2-green1-green2-green0%
1-green2-green1-green3-green0%
1-green2-green2-green0-red25%
1-green2-green2-green1-green0%
1-green2-green2-green2-green0%
1-green2-green2-green3-green0%
1-green2-green3-green0-red25%
1-green2-green3-green1-green0%
1-green2-green3-green2-green0%
1-green2-green3-green3-green0%
1-green3-green0-red0-red50%
1-green3-green0-red1-green25%
1-green3-green0-red2-green25%
1-green3-green0-red3-green25%
1-green3-green1-green0-red25%
1-green3-green1-green1-green0%
1-green3-green1-green2-green0%
1-green3-green1-green3-green0%
1-green3-green2-green0-red25%
1-green3-green2-green1-green0%
1-green3-green2-green2-green0%
1-green3-green2-green3-green0%
1-green3-green3-green0-red25%
1-green3-green3-green1-green0%
1-green3-green3-green2-green0%
1-green3-green3-green3-green0%
2-green0-red0-red0-red75%
2-green0-red0-red1-green50%
2-green0-red0-red2-green50%
2-green0-red0-red3-green50%
2-green0-red1-green0-red50%
2-green0-red1-green1-green25%
2-green0-red1-green2-green25%
2-green0-red1-green3-green25%
2-green0-red2-green0-red50%
2-green0-red2-green1-green25%
2-green0-red2-green2-green25%
2-green0-red2-green3-green25%
2-green0-red3-green0-red50%
2-green0-red3-green1-green25%
2-green0-red3-green2-green25%
2-green0-red3-green3-green25%
2-green1-green0-red0-red50%
2-green1-green0-red1-green25%
2-green1-green0-red2-green25%
2-green1-green0-red3-green25%
2-green1-green1-green0-red25%
2-green1-green1-green1-green0%
2-green1-green1-green2-green0%
2-green1-green1-green3-green0%
2-green1-green2-green0-red25%
2-green1-green2-green1-green0%
2-green1-green2-green2-green0%
2-green1-green2-green3-green0%
2-green1-green3-green0-red25%
2-green1-green3-green1-green0%
2-green1-green3-green2-green0%
2-green1-green3-green3-green0%
2-green2-green0-red0-red50%
2-green2-green0-red1-green25%
2-green2-green0-red2-green25%
2-green2-green0-red3-green25%
2-green2-green1-green0-red25%
2-green2-green1-green1-green0%
2-green2-green1-green2-green0%
2-green2-green1-green3-green0%
2-green2-green2-green0-red25%
2-green2-green2-green1-green0%
2-green2-green2-green2-green0%
2-green2-green2-green3-green0%
2-green2-green3-green0-red25%
2-green2-green3-green1-green0%
2-green2-green3-green2-green0%
2-green2-green3-green3-green0%
2-green3-green0-red0-red50%
2-green3-green0-red1-green25%
2-green3-green0-red2-green25%
2-green3-green0-red3-green25%
2-green3-green1-green0-red25%
2-green3-green1-green1-green0%
2-green3-green1-green2-green0%
2-green3-green1-green3-green0%
2-green3-green2-green0-red25%
2-green3-green2-green1-green0%
2-green3-green2-green2-green0%
2-green3-green2-green3-green0%
2-green3-green3-green0-red25%
2-green3-green3-green1-green0%
2-green3-green3-green2-green0%
2-green3-green3-green3-green0%
3-green0-red0-red0-red75%
3-green0-red0-red1-green50%
3-green0-red0-red2-green50%
3-green0-red0-red3-green50%
3-green0-red1-green0-red50%
3-green0-red1-green1-green25%
3-green0-red1-green2-green25%
3-green0-red1-green3-green25%
3-green0-red2-green0-red50%
3-green0-red2-green1-green25%
3-green0-red2-green2-green25%
3-green0-red2-green3-green25%
3-green0-red3-green0-red50%
3-green0-red3-green1-green25%
3-green0-red3-green2-green25%
3-green0-red3-green3-green25%
3-green1-green0-red0-red50%
3-green1-green0-red1-green25%
3-green1-green0-red2-green25%
3-green1-green0-red3-green25%
3-green1-green1-green0-red25%
3-green1-green1-green1-green0%
3-green1-green1-green2-green0%
3-green1-green1-green3-green0%
3-green1-green2-green0-red25%
3-green1-green2-green1-green0%
3-green1-green2-green2-green0%
3-green1-green2-green3-green0%
3-green1-green3-green0-red25%
3-green1-green3-green1-green0%
3-green1-green3-green2-green0%
3-green1-green3-green3-green0%
3-green2-green0-red0-red50%
3-green2-green0-red1-green25%
3-green2-green0-red2-green25%
3-green2-green0-red3-green25%
3-green2-green1-green0-red25%
3-green2-green1-green1-green0%
3-green2-green1-green2-green0%
3-green2-green1-green3-green0%
3-green2-green2-green0-red25%
3-green2-green2-green1-green0%
3-green2-green2-green2-green0%
3-green2-green2-green3-green0%
3-green2-green3-green0-red25%
3-green2-green3-green1-green0%
3-green2-green3-green2-green0%
3-green2-green3-green3-green0%
3-green3-green0-red0-red50%
3-green3-green0-red1-green25%
3-green3-green0-red2-green25%
3-green3-green0-red3-green25%
3-green3-green1-green0-red25%
3-green3-green1-green1-green0%
3-green3-green1-green2-green0%
3-green3-green1-green3-green0%
3-green3-green2-green0-red25%
3-green3-green2-green1-green0%
3-green3-green2-green2-green0%
3-green3-green2-green3-green0%
3-green3-green3-green0-red25%
3-green3-green3-green1-green0%
3-green3-green3-green2-green0%
3-green3-green3-green3-green0%
+ +
diff --git a/articles/bugprobhunt/r1w3_n4_results.csv b/articles/bugprobhunt/r1w3_n4_results.csv new file mode 100644 index 00000000..bc444315 --- /dev/null +++ b/articles/bugprobhunt/r1w3_n4_results.csv @@ -0,0 +1,256 @@ +"trial 1","trial 2","trial 3","trial 4","\(p\) estimate"\n"0-red","0-red","0-red","0-red","100%" +"0-red","0-red","0-red","1-green","75%" +"0-red","0-red","0-red","2-green","75%" +"0-red","0-red","0-red","3-green","75%" +"0-red","0-red","1-green","0-red","75%" +"0-red","0-red","1-green","1-green","50%" +"0-red","0-red","1-green","2-green","50%" +"0-red","0-red","1-green","3-green","50%" +"0-red","0-red","2-green","0-red","75%" +"0-red","0-red","2-green","1-green","50%" +"0-red","0-red","2-green","2-green","50%" +"0-red","0-red","2-green","3-green","50%" +"0-red","0-red","3-green","0-red","75%" +"0-red","0-red","3-green","1-green","50%" +"0-red","0-red","3-green","2-green","50%" +"0-red","0-red","3-green","3-green","50%" +"0-red","1-green","0-red","0-red","75%" +"0-red","1-green","0-red","1-green","50%" +"0-red","1-green","0-red","2-green","50%" +"0-red","1-green","0-red","3-green","50%" +"0-red","1-green","1-green","0-red","50%" +"0-red","1-green","1-green","1-green","25%" +"0-red","1-green","1-green","2-green","25%" +"0-red","1-green","1-green","3-green","25%" +"0-red","1-green","2-green","0-red","50%" +"0-red","1-green","2-green","1-green","25%" +"0-red","1-green","2-green","2-green","25%" +"0-red","1-green","2-green","3-green","25%" +"0-red","1-green","3-green","0-red","50%" +"0-red","1-green","3-green","1-green","25%" +"0-red","1-green","3-green","2-green","25%" +"0-red","1-green","3-green","3-green","25%" +"0-red","2-green","0-red","0-red","75%" +"0-red","2-green","0-red","1-green","50%" +"0-red","2-green","0-red","2-green","50%" +"0-red","2-green","0-red","3-green","50%" +"0-red","2-green","1-green","0-red","50%" +"0-red","2-green","1-green","1-green","25%" +"0-red","2-green","1-green","2-green","25%" +"0-red","2-green","1-green","3-green","25%" +"0-red","2-green","2-green","0-red","50%" +"0-red","2-green","2-green","1-green","25%" +"0-red","2-green","2-green","2-green","25%" +"0-red","2-green","2-green","3-green","25%" +"0-red","2-green","3-green","0-red","50%" +"0-red","2-green","3-green","1-green","25%" +"0-red","2-green","3-green","2-green","25%" +"0-red","2-green","3-green","3-green","25%" +"0-red","3-green","0-red","0-red","75%" +"0-red","3-green","0-red","1-green","50%" +"0-red","3-green","0-red","2-green","50%" +"0-red","3-green","0-red","3-green","50%" +"0-red","3-green","1-green","0-red","50%" +"0-red","3-green","1-green","1-green","25%" +"0-red","3-green","1-green","2-green","25%" +"0-red","3-green","1-green","3-green","25%" +"0-red","3-green","2-green","0-red","50%" +"0-red","3-green","2-green","1-green","25%" +"0-red","3-green","2-green","2-green","25%" +"0-red","3-green","2-green","3-green","25%" +"0-red","3-green","3-green","0-red","50%" +"0-red","3-green","3-green","1-green","25%" +"0-red","3-green","3-green","2-green","25%" +"0-red","3-green","3-green","3-green","25%" +"1-green","0-red","0-red","0-red","75%" +"1-green","0-red","0-red","1-green","50%" +"1-green","0-red","0-red","2-green","50%" +"1-green","0-red","0-red","3-green","50%" +"1-green","0-red","1-green","0-red","50%" +"1-green","0-red","1-green","1-green","25%" +"1-green","0-red","1-green","2-green","25%" +"1-green","0-red","1-green","3-green","25%" +"1-green","0-red","2-green","0-red","50%" +"1-green","0-red","2-green","1-green","25%" +"1-green","0-red","2-green","2-green","25%" +"1-green","0-red","2-green","3-green","25%" +"1-green","0-red","3-green","0-red","50%" +"1-green","0-red","3-green","1-green","25%" +"1-green","0-red","3-green","2-green","25%" +"1-green","0-red","3-green","3-green","25%" +"1-green","1-green","0-red","0-red","50%" +"1-green","1-green","0-red","1-green","25%" +"1-green","1-green","0-red","2-green","25%" +"1-green","1-green","0-red","3-green","25%" +"1-green","1-green","1-green","0-red","25%" +"1-green","1-green","1-green","1-green","0%" +"1-green","1-green","1-green","2-green","0%" +"1-green","1-green","1-green","3-green","0%" +"1-green","1-green","2-green","0-red","25%" +"1-green","1-green","2-green","1-green","0%" +"1-green","1-green","2-green","2-green","0%" +"1-green","1-green","2-green","3-green","0%" +"1-green","1-green","3-green","0-red","25%" +"1-green","1-green","3-green","1-green","0%" +"1-green","1-green","3-green","2-green","0%" +"1-green","1-green","3-green","3-green","0%" +"1-green","2-green","0-red","0-red","50%" +"1-green","2-green","0-red","1-green","25%" +"1-green","2-green","0-red","2-green","25%" +"1-green","2-green","0-red","3-green","25%" +"1-green","2-green","1-green","0-red","25%" +"1-green","2-green","1-green","1-green","0%" +"1-green","2-green","1-green","2-green","0%" +"1-green","2-green","1-green","3-green","0%" +"1-green","2-green","2-green","0-red","25%" +"1-green","2-green","2-green","1-green","0%" +"1-green","2-green","2-green","2-green","0%" +"1-green","2-green","2-green","3-green","0%" +"1-green","2-green","3-green","0-red","25%" +"1-green","2-green","3-green","1-green","0%" +"1-green","2-green","3-green","2-green","0%" +"1-green","2-green","3-green","3-green","0%" +"1-green","3-green","0-red","0-red","50%" +"1-green","3-green","0-red","1-green","25%" +"1-green","3-green","0-red","2-green","25%" +"1-green","3-green","0-red","3-green","25%" +"1-green","3-green","1-green","0-red","25%" +"1-green","3-green","1-green","1-green","0%" +"1-green","3-green","1-green","2-green","0%" +"1-green","3-green","1-green","3-green","0%" +"1-green","3-green","2-green","0-red","25%" +"1-green","3-green","2-green","1-green","0%" +"1-green","3-green","2-green","2-green","0%" +"1-green","3-green","2-green","3-green","0%" +"1-green","3-green","3-green","0-red","25%" +"1-green","3-green","3-green","1-green","0%" +"1-green","3-green","3-green","2-green","0%" +"1-green","3-green","3-green","3-green","0%" +"2-green","0-red","0-red","0-red","75%" +"2-green","0-red","0-red","1-green","50%" +"2-green","0-red","0-red","2-green","50%" +"2-green","0-red","0-red","3-green","50%" +"2-green","0-red","1-green","0-red","50%" +"2-green","0-red","1-green","1-green","25%" +"2-green","0-red","1-green","2-green","25%" +"2-green","0-red","1-green","3-green","25%" +"2-green","0-red","2-green","0-red","50%" +"2-green","0-red","2-green","1-green","25%" +"2-green","0-red","2-green","2-green","25%" +"2-green","0-red","2-green","3-green","25%" +"2-green","0-red","3-green","0-red","50%" +"2-green","0-red","3-green","1-green","25%" +"2-green","0-red","3-green","2-green","25%" +"2-green","0-red","3-green","3-green","25%" +"2-green","1-green","0-red","0-red","50%" +"2-green","1-green","0-red","1-green","25%" +"2-green","1-green","0-red","2-green","25%" +"2-green","1-green","0-red","3-green","25%" +"2-green","1-green","1-green","0-red","25%" +"2-green","1-green","1-green","1-green","0%" +"2-green","1-green","1-green","2-green","0%" +"2-green","1-green","1-green","3-green","0%" +"2-green","1-green","2-green","0-red","25%" +"2-green","1-green","2-green","1-green","0%" +"2-green","1-green","2-green","2-green","0%" +"2-green","1-green","2-green","3-green","0%" +"2-green","1-green","3-green","0-red","25%" +"2-green","1-green","3-green","1-green","0%" +"2-green","1-green","3-green","2-green","0%" +"2-green","1-green","3-green","3-green","0%" +"2-green","2-green","0-red","0-red","50%" +"2-green","2-green","0-red","1-green","25%" +"2-green","2-green","0-red","2-green","25%" +"2-green","2-green","0-red","3-green","25%" +"2-green","2-green","1-green","0-red","25%" +"2-green","2-green","1-green","1-green","0%" +"2-green","2-green","1-green","2-green","0%" +"2-green","2-green","1-green","3-green","0%" +"2-green","2-green","2-green","0-red","25%" +"2-green","2-green","2-green","1-green","0%" +"2-green","2-green","2-green","2-green","0%" +"2-green","2-green","2-green","3-green","0%" +"2-green","2-green","3-green","0-red","25%" +"2-green","2-green","3-green","1-green","0%" +"2-green","2-green","3-green","2-green","0%" +"2-green","2-green","3-green","3-green","0%" +"2-green","3-green","0-red","0-red","50%" +"2-green","3-green","0-red","1-green","25%" +"2-green","3-green","0-red","2-green","25%" +"2-green","3-green","0-red","3-green","25%" +"2-green","3-green","1-green","0-red","25%" +"2-green","3-green","1-green","1-green","0%" +"2-green","3-green","1-green","2-green","0%" +"2-green","3-green","1-green","3-green","0%" +"2-green","3-green","2-green","0-red","25%" +"2-green","3-green","2-green","1-green","0%" +"2-green","3-green","2-green","2-green","0%" +"2-green","3-green","2-green","3-green","0%" +"2-green","3-green","3-green","0-red","25%" +"2-green","3-green","3-green","1-green","0%" +"2-green","3-green","3-green","2-green","0%" +"2-green","3-green","3-green","3-green","0%" +"3-green","0-red","0-red","0-red","75%" +"3-green","0-red","0-red","1-green","50%" +"3-green","0-red","0-red","2-green","50%" +"3-green","0-red","0-red","3-green","50%" +"3-green","0-red","1-green","0-red","50%" +"3-green","0-red","1-green","1-green","25%" +"3-green","0-red","1-green","2-green","25%" +"3-green","0-red","1-green","3-green","25%" +"3-green","0-red","2-green","0-red","50%" +"3-green","0-red","2-green","1-green","25%" +"3-green","0-red","2-green","2-green","25%" +"3-green","0-red","2-green","3-green","25%" +"3-green","0-red","3-green","0-red","50%" +"3-green","0-red","3-green","1-green","25%" +"3-green","0-red","3-green","2-green","25%" +"3-green","0-red","3-green","3-green","25%" +"3-green","1-green","0-red","0-red","50%" +"3-green","1-green","0-red","1-green","25%" +"3-green","1-green","0-red","2-green","25%" +"3-green","1-green","0-red","3-green","25%" +"3-green","1-green","1-green","0-red","25%" +"3-green","1-green","1-green","1-green","0%" +"3-green","1-green","1-green","2-green","0%" +"3-green","1-green","1-green","3-green","0%" +"3-green","1-green","2-green","0-red","25%" +"3-green","1-green","2-green","1-green","0%" +"3-green","1-green","2-green","2-green","0%" +"3-green","1-green","2-green","3-green","0%" +"3-green","1-green","3-green","0-red","25%" +"3-green","1-green","3-green","1-green","0%" +"3-green","1-green","3-green","2-green","0%" +"3-green","1-green","3-green","3-green","0%" +"3-green","2-green","0-red","0-red","50%" +"3-green","2-green","0-red","1-green","25%" +"3-green","2-green","0-red","2-green","25%" +"3-green","2-green","0-red","3-green","25%" +"3-green","2-green","1-green","0-red","25%" +"3-green","2-green","1-green","1-green","0%" +"3-green","2-green","1-green","2-green","0%" +"3-green","2-green","1-green","3-green","0%" +"3-green","2-green","2-green","0-red","25%" +"3-green","2-green","2-green","1-green","0%" +"3-green","2-green","2-green","2-green","0%" +"3-green","2-green","2-green","3-green","0%" +"3-green","2-green","3-green","0-red","25%" +"3-green","2-green","3-green","1-green","0%" +"3-green","2-green","3-green","2-green","0%" +"3-green","2-green","3-green","3-green","0%" +"3-green","3-green","0-red","0-red","50%" +"3-green","3-green","0-red","1-green","25%" +"3-green","3-green","0-red","2-green","25%" +"3-green","3-green","0-red","3-green","25%" +"3-green","3-green","1-green","0-red","25%" +"3-green","3-green","1-green","1-green","0%" +"3-green","3-green","1-green","2-green","0%" +"3-green","3-green","1-green","3-green","0%" +"3-green","3-green","2-green","0-red","25%" +"3-green","3-green","2-green","1-green","0%" +"3-green","3-green","2-green","2-green","0%" +"3-green","3-green","2-green","3-green","0%" +"3-green","3-green","3-green","0-red","25%" +"3-green","3-green","3-green","1-green","0%" +"3-green","3-green","3-green","2-green","0%" +"3-green","3-green","3-green","3-green","0%" diff --git a/articles/bugprobhunt/r1w3_n4_results.html b/articles/bugprobhunt/r1w3_n4_results.html new file mode 100644 index 00000000..32d66477 --- /dev/null +++ b/articles/bugprobhunt/r1w3_n4_results.html @@ -0,0 +1,1895 @@ + + + + + +Probabilistic bug hunting + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
trial 1trial 2trial 3trial 4\(p\) estimate\n"0-red"0-red0-red0-red100%
0-red0-red0-red1-green75%
0-red0-red0-red2-green75%
0-red0-red0-red3-green75%
0-red0-red1-green0-red75%
0-red0-red1-green1-green50%
0-red0-red1-green2-green50%
0-red0-red1-green3-green50%
0-red0-red2-green0-red75%
0-red0-red2-green1-green50%
0-red0-red2-green2-green50%
0-red0-red2-green3-green50%
0-red0-red3-green0-red75%
0-red0-red3-green1-green50%
0-red0-red3-green2-green50%
0-red0-red3-green3-green50%
0-red1-green0-red0-red75%
0-red1-green0-red1-green50%
0-red1-green0-red2-green50%
0-red1-green0-red3-green50%
0-red1-green1-green0-red50%
0-red1-green1-green1-green25%
0-red1-green1-green2-green25%
0-red1-green1-green3-green25%
0-red1-green2-green0-red50%
0-red1-green2-green1-green25%
0-red1-green2-green2-green25%
0-red1-green2-green3-green25%
0-red1-green3-green0-red50%
0-red1-green3-green1-green25%
0-red1-green3-green2-green25%
0-red1-green3-green3-green25%
0-red2-green0-red0-red75%
0-red2-green0-red1-green50%
0-red2-green0-red2-green50%
0-red2-green0-red3-green50%
0-red2-green1-green0-red50%
0-red2-green1-green1-green25%
0-red2-green1-green2-green25%
0-red2-green1-green3-green25%
0-red2-green2-green0-red50%
0-red2-green2-green1-green25%
0-red2-green2-green2-green25%
0-red2-green2-green3-green25%
0-red2-green3-green0-red50%
0-red2-green3-green1-green25%
0-red2-green3-green2-green25%
0-red2-green3-green3-green25%
0-red3-green0-red0-red75%
0-red3-green0-red1-green50%
0-red3-green0-red2-green50%
0-red3-green0-red3-green50%
0-red3-green1-green0-red50%
0-red3-green1-green1-green25%
0-red3-green1-green2-green25%
0-red3-green1-green3-green25%
0-red3-green2-green0-red50%
0-red3-green2-green1-green25%
0-red3-green2-green2-green25%
0-red3-green2-green3-green25%
0-red3-green3-green0-red50%
0-red3-green3-green1-green25%
0-red3-green3-green2-green25%
0-red3-green3-green3-green25%
1-green0-red0-red0-red75%
1-green0-red0-red1-green50%
1-green0-red0-red2-green50%
1-green0-red0-red3-green50%
1-green0-red1-green0-red50%
1-green0-red1-green1-green25%
1-green0-red1-green2-green25%
1-green0-red1-green3-green25%
1-green0-red2-green0-red50%
1-green0-red2-green1-green25%
1-green0-red2-green2-green25%
1-green0-red2-green3-green25%
1-green0-red3-green0-red50%
1-green0-red3-green1-green25%
1-green0-red3-green2-green25%
1-green0-red3-green3-green25%
1-green1-green0-red0-red50%
1-green1-green0-red1-green25%
1-green1-green0-red2-green25%
1-green1-green0-red3-green25%
1-green1-green1-green0-red25%
1-green1-green1-green1-green0%
1-green1-green1-green2-green0%
1-green1-green1-green3-green0%
1-green1-green2-green0-red25%
1-green1-green2-green1-green0%
1-green1-green2-green2-green0%
1-green1-green2-green3-green0%
1-green1-green3-green0-red25%
1-green1-green3-green1-green0%
1-green1-green3-green2-green0%
1-green1-green3-green3-green0%
1-green2-green0-red0-red50%
1-green2-green0-red1-green25%
1-green2-green0-red2-green25%
1-green2-green0-red3-green25%
1-green2-green1-green0-red25%
1-green2-green1-green1-green0%
1-green2-green1-green2-green0%
1-green2-green1-green3-green0%
1-green2-green2-green0-red25%
1-green2-green2-green1-green0%
1-green2-green2-green2-green0%
1-green2-green2-green3-green0%
1-green2-green3-green0-red25%
1-green2-green3-green1-green0%
1-green2-green3-green2-green0%
1-green2-green3-green3-green0%
1-green3-green0-red0-red50%
1-green3-green0-red1-green25%
1-green3-green0-red2-green25%
1-green3-green0-red3-green25%
1-green3-green1-green0-red25%
1-green3-green1-green1-green0%
1-green3-green1-green2-green0%
1-green3-green1-green3-green0%
1-green3-green2-green0-red25%
1-green3-green2-green1-green0%
1-green3-green2-green2-green0%
1-green3-green2-green3-green0%
1-green3-green3-green0-red25%
1-green3-green3-green1-green0%
1-green3-green3-green2-green0%
1-green3-green3-green3-green0%
2-green0-red0-red0-red75%
2-green0-red0-red1-green50%
2-green0-red0-red2-green50%
2-green0-red0-red3-green50%
2-green0-red1-green0-red50%
2-green0-red1-green1-green25%
2-green0-red1-green2-green25%
2-green0-red1-green3-green25%
2-green0-red2-green0-red50%
2-green0-red2-green1-green25%
2-green0-red2-green2-green25%
2-green0-red2-green3-green25%
2-green0-red3-green0-red50%
2-green0-red3-green1-green25%
2-green0-red3-green2-green25%
2-green0-red3-green3-green25%
2-green1-green0-red0-red50%
2-green1-green0-red1-green25%
2-green1-green0-red2-green25%
2-green1-green0-red3-green25%
2-green1-green1-green0-red25%
2-green1-green1-green1-green0%
2-green1-green1-green2-green0%
2-green1-green1-green3-green0%
2-green1-green2-green0-red25%
2-green1-green2-green1-green0%
2-green1-green2-green2-green0%
2-green1-green2-green3-green0%
2-green1-green3-green0-red25%
2-green1-green3-green1-green0%
2-green1-green3-green2-green0%
2-green1-green3-green3-green0%
2-green2-green0-red0-red50%
2-green2-green0-red1-green25%
2-green2-green0-red2-green25%
2-green2-green0-red3-green25%
2-green2-green1-green0-red25%
2-green2-green1-green1-green0%
2-green2-green1-green2-green0%
2-green2-green1-green3-green0%
2-green2-green2-green0-red25%
2-green2-green2-green1-green0%
2-green2-green2-green2-green0%
2-green2-green2-green3-green0%
2-green2-green3-green0-red25%
2-green2-green3-green1-green0%
2-green2-green3-green2-green0%
2-green2-green3-green3-green0%
2-green3-green0-red0-red50%
2-green3-green0-red1-green25%
2-green3-green0-red2-green25%
2-green3-green0-red3-green25%
2-green3-green1-green0-red25%
2-green3-green1-green1-green0%
2-green3-green1-green2-green0%
2-green3-green1-green3-green0%
2-green3-green2-green0-red25%
2-green3-green2-green1-green0%
2-green3-green2-green2-green0%
2-green3-green2-green3-green0%
2-green3-green3-green0-red25%
2-green3-green3-green1-green0%
2-green3-green3-green2-green0%
2-green3-green3-green3-green0%
3-green0-red0-red0-red75%
3-green0-red0-red1-green50%
3-green0-red0-red2-green50%
3-green0-red0-red3-green50%
3-green0-red1-green0-red50%
3-green0-red1-green1-green25%
3-green0-red1-green2-green25%
3-green0-red1-green3-green25%
3-green0-red2-green0-red50%
3-green0-red2-green1-green25%
3-green0-red2-green2-green25%
3-green0-red2-green3-green25%
3-green0-red3-green0-red50%
3-green0-red3-green1-green25%
3-green0-red3-green2-green25%
3-green0-red3-green3-green25%
3-green1-green0-red0-red50%
3-green1-green0-red1-green25%
3-green1-green0-red2-green25%
3-green1-green0-red3-green25%
3-green1-green1-green0-red25%
3-green1-green1-green1-green0%
3-green1-green1-green2-green0%
3-green1-green1-green3-green0%
3-green1-green2-green0-red25%
3-green1-green2-green1-green0%
3-green1-green2-green2-green0%
3-green1-green2-green3-green0%
3-green1-green3-green0-red25%
3-green1-green3-green1-green0%
3-green1-green3-green2-green0%
3-green1-green3-green3-green0%
3-green2-green0-red0-red50%
3-green2-green0-red1-green25%
3-green2-green0-red2-green25%
3-green2-green0-red3-green25%
3-green2-green1-green0-red25%
3-green2-green1-green1-green0%
3-green2-green1-green2-green0%
3-green2-green1-green3-green0%
3-green2-green2-green0-red25%
3-green2-green2-green1-green0%
3-green2-green2-green2-green0%
3-green2-green2-green3-green0%
3-green2-green3-green0-red25%
3-green2-green3-green1-green0%
3-green2-green3-green2-green0%
3-green2-green3-green3-green0%
3-green3-green0-red0-red50%
3-green3-green0-red1-green25%
3-green3-green0-red2-green25%
3-green3-green0-red3-green25%
3-green3-green1-green0-red25%
3-green3-green1-green1-green0%
3-green3-green1-green2-green0%
3-green3-green1-green3-green0%
3-green3-green2-green0-red25%
3-green3-green2-green1-green0%
3-green3-green2-green2-green0%
3-green3-green2-green3-green0%
3-green3-green3-green0-red25%
3-green3-green3-green1-green0%
3-green3-green3-green2-green0%
3-green3-green3-green3-green0%
+ +
+ + + + + + + diff --git a/articles/bugprobhunt/r1w3_n4_results.t2t b/articles/bugprobhunt/r1w3_n4_results.t2t new file mode 100644 index 00000000..05f24ae1 --- /dev/null +++ b/articles/bugprobhunt/r1w3_n4_results.t2t @@ -0,0 +1,260 @@ + + + + +|| trial 1 | trial 2 | trial 3 | trial 4 | \(p\) estimate\n"0-red" | 0-red | 0-red | 0-red | 100% | +| 0-red | 0-red | 0-red | 1-green | 75% | +| 0-red | 0-red | 0-red | 2-green | 75% | +| 0-red | 0-red | 0-red | 3-green | 75% | +| 0-red | 0-red | 1-green | 0-red | 75% | +| 0-red | 0-red | 1-green | 1-green | 50% | +| 0-red | 0-red | 1-green | 2-green | 50% | +| 0-red | 0-red | 1-green | 3-green | 50% | +| 0-red | 0-red | 2-green | 0-red | 75% | +| 0-red | 0-red | 2-green | 1-green | 50% | +| 0-red | 0-red | 2-green | 2-green | 50% | +| 0-red | 0-red | 2-green | 3-green | 50% | +| 0-red | 0-red | 3-green | 0-red | 75% | +| 0-red | 0-red | 3-green | 1-green | 50% | +| 0-red | 0-red | 3-green | 2-green | 50% | +| 0-red | 0-red | 3-green | 3-green | 50% | +| 0-red | 1-green | 0-red | 0-red | 75% | +| 0-red | 1-green | 0-red | 1-green | 50% | +| 0-red | 1-green | 0-red | 2-green | 50% | +| 0-red | 1-green | 0-red | 3-green | 50% | +| 0-red | 1-green | 1-green | 0-red | 50% | +| 0-red | 1-green | 1-green | 1-green | 25% | +| 0-red | 1-green | 1-green | 2-green | 25% | +| 0-red | 1-green | 1-green | 3-green | 25% | +| 0-red | 1-green | 2-green | 0-red | 50% | +| 0-red | 1-green | 2-green | 1-green | 25% | +| 0-red | 1-green | 2-green | 2-green | 25% | +| 0-red | 1-green | 2-green | 3-green | 25% | +| 0-red | 1-green | 3-green | 0-red | 50% | +| 0-red | 1-green | 3-green | 1-green | 25% | +| 0-red | 1-green | 3-green | 2-green | 25% | +| 0-red | 1-green | 3-green | 3-green | 25% | +| 0-red | 2-green | 0-red | 0-red | 75% | +| 0-red | 2-green | 0-red | 1-green | 50% | +| 0-red | 2-green | 0-red | 2-green | 50% | +| 0-red | 2-green | 0-red | 3-green | 50% | +| 0-red | 2-green | 1-green | 0-red | 50% | +| 0-red | 2-green | 1-green | 1-green | 25% | +| 0-red | 2-green | 1-green | 2-green | 25% | +| 0-red | 2-green | 1-green | 3-green | 25% | +| 0-red | 2-green | 2-green | 0-red | 50% | +| 0-red | 2-green | 2-green | 1-green | 25% | +| 0-red | 2-green | 2-green | 2-green | 25% | +| 0-red | 2-green | 2-green | 3-green | 25% | +| 0-red | 2-green | 3-green | 0-red | 50% | +| 0-red | 2-green | 3-green | 1-green | 25% | +| 0-red | 2-green | 3-green | 2-green | 25% | +| 0-red | 2-green | 3-green | 3-green | 25% | +| 0-red | 3-green | 0-red | 0-red | 75% | +| 0-red | 3-green | 0-red | 1-green | 50% | +| 0-red | 3-green | 0-red | 2-green | 50% | +| 0-red | 3-green | 0-red | 3-green | 50% | +| 0-red | 3-green | 1-green | 0-red | 50% | +| 0-red | 3-green | 1-green | 1-green | 25% | +| 0-red | 3-green | 1-green | 2-green | 25% | +| 0-red | 3-green | 1-green | 3-green | 25% | +| 0-red | 3-green | 2-green | 0-red | 50% | +| 0-red | 3-green | 2-green | 1-green | 25% | +| 0-red | 3-green | 2-green | 2-green | 25% | +| 0-red | 3-green | 2-green | 3-green | 25% | +| 0-red | 3-green | 3-green | 0-red | 50% | +| 0-red | 3-green | 3-green | 1-green | 25% | +| 0-red | 3-green | 3-green | 2-green | 25% | +| 0-red | 3-green | 3-green | 3-green | 25% | +| 1-green | 0-red | 0-red | 0-red | 75% | +| 1-green | 0-red | 0-red | 1-green | 50% | +| 1-green | 0-red | 0-red | 2-green | 50% | +| 1-green | 0-red | 0-red | 3-green | 50% | +| 1-green | 0-red | 1-green | 0-red | 50% | +| 1-green | 0-red | 1-green | 1-green | 25% | +| 1-green | 0-red | 1-green | 2-green | 25% | +| 1-green | 0-red | 1-green | 3-green | 25% | +| 1-green | 0-red | 2-green | 0-red | 50% | +| 1-green | 0-red | 2-green | 1-green | 25% | +| 1-green | 0-red | 2-green | 2-green | 25% | +| 1-green | 0-red | 2-green | 3-green | 25% | +| 1-green | 0-red | 3-green | 0-red | 50% | +| 1-green | 0-red | 3-green | 1-green | 25% | +| 1-green | 0-red | 3-green | 2-green | 25% | +| 1-green | 0-red | 3-green | 3-green | 25% | +| 1-green | 1-green | 0-red | 0-red | 50% | +| 1-green | 1-green | 0-red | 1-green | 25% | +| 1-green | 1-green | 0-red | 2-green | 25% | +| 1-green | 1-green | 0-red | 3-green | 25% | +| 1-green | 1-green | 1-green | 0-red | 25% | +| 1-green | 1-green | 1-green | 1-green | 0% | +| 1-green | 1-green | 1-green | 2-green | 0% | +| 1-green | 1-green | 1-green | 3-green | 0% | +| 1-green | 1-green | 2-green | 0-red | 25% | +| 1-green | 1-green | 2-green | 1-green | 0% | +| 1-green | 1-green | 2-green | 2-green | 0% | +| 1-green | 1-green | 2-green | 3-green | 0% | +| 1-green | 1-green | 3-green | 0-red | 25% | +| 1-green | 1-green | 3-green | 1-green | 0% | +| 1-green | 1-green | 3-green | 2-green | 0% | +| 1-green | 1-green | 3-green | 3-green | 0% | +| 1-green | 2-green | 0-red | 0-red | 50% | +| 1-green | 2-green | 0-red | 1-green | 25% | +| 1-green | 2-green | 0-red | 2-green | 25% | +| 1-green | 2-green | 0-red | 3-green | 25% | +| 1-green | 2-green | 1-green | 0-red | 25% | +| 1-green | 2-green | 1-green | 1-green | 0% | +| 1-green | 2-green | 1-green | 2-green | 0% | +| 1-green | 2-green | 1-green | 3-green | 0% | +| 1-green | 2-green | 2-green | 0-red | 25% | +| 1-green | 2-green | 2-green | 1-green | 0% | +| 1-green | 2-green | 2-green | 2-green | 0% | +| 1-green | 2-green | 2-green | 3-green | 0% | +| 1-green | 2-green | 3-green | 0-red | 25% | +| 1-green | 2-green | 3-green | 1-green | 0% | +| 1-green | 2-green | 3-green | 2-green | 0% | +| 1-green | 2-green | 3-green | 3-green | 0% | +| 1-green | 3-green | 0-red | 0-red | 50% | +| 1-green | 3-green | 0-red | 1-green | 25% | +| 1-green | 3-green | 0-red | 2-green | 25% | +| 1-green | 3-green | 0-red | 3-green | 25% | +| 1-green | 3-green | 1-green | 0-red | 25% | +| 1-green | 3-green | 1-green | 1-green | 0% | +| 1-green | 3-green | 1-green | 2-green | 0% | +| 1-green | 3-green | 1-green | 3-green | 0% | +| 1-green | 3-green | 2-green | 0-red | 25% | +| 1-green | 3-green | 2-green | 1-green | 0% | +| 1-green | 3-green | 2-green | 2-green | 0% | +| 1-green | 3-green | 2-green | 3-green | 0% | +| 1-green | 3-green | 3-green | 0-red | 25% | +| 1-green | 3-green | 3-green | 1-green | 0% | +| 1-green | 3-green | 3-green | 2-green | 0% | +| 1-green | 3-green | 3-green | 3-green | 0% | +| 2-green | 0-red | 0-red | 0-red | 75% | +| 2-green | 0-red | 0-red | 1-green | 50% | +| 2-green | 0-red | 0-red | 2-green | 50% | +| 2-green | 0-red | 0-red | 3-green | 50% | +| 2-green | 0-red | 1-green | 0-red | 50% | +| 2-green | 0-red | 1-green | 1-green | 25% | +| 2-green | 0-red | 1-green | 2-green | 25% | +| 2-green | 0-red | 1-green | 3-green | 25% | +| 2-green | 0-red | 2-green | 0-red | 50% | +| 2-green | 0-red | 2-green | 1-green | 25% | +| 2-green | 0-red | 2-green | 2-green | 25% | +| 2-green | 0-red | 2-green | 3-green | 25% | +| 2-green | 0-red | 3-green | 0-red | 50% | +| 2-green | 0-red | 3-green | 1-green | 25% | +| 2-green | 0-red | 3-green | 2-green | 25% | +| 2-green | 0-red | 3-green | 3-green | 25% | +| 2-green | 1-green | 0-red | 0-red | 50% | +| 2-green | 1-green | 0-red | 1-green | 25% | +| 2-green | 1-green | 0-red | 2-green | 25% | +| 2-green | 1-green | 0-red | 3-green | 25% | +| 2-green | 1-green | 1-green | 0-red | 25% | +| 2-green | 1-green | 1-green | 1-green | 0% | +| 2-green | 1-green | 1-green | 2-green | 0% | +| 2-green | 1-green | 1-green | 3-green | 0% | +| 2-green | 1-green | 2-green | 0-red | 25% | +| 2-green | 1-green | 2-green | 1-green | 0% | +| 2-green | 1-green | 2-green | 2-green | 0% | +| 2-green | 1-green | 2-green | 3-green | 0% | +| 2-green | 1-green | 3-green | 0-red | 25% | +| 2-green | 1-green | 3-green | 1-green | 0% | +| 2-green | 1-green | 3-green | 2-green | 0% | +| 2-green | 1-green | 3-green | 3-green | 0% | +| 2-green | 2-green | 0-red | 0-red | 50% | +| 2-green | 2-green | 0-red | 1-green | 25% | +| 2-green | 2-green | 0-red | 2-green | 25% | +| 2-green | 2-green | 0-red | 3-green | 25% | +| 2-green | 2-green | 1-green | 0-red | 25% | +| 2-green | 2-green | 1-green | 1-green | 0% | +| 2-green | 2-green | 1-green | 2-green | 0% | +| 2-green | 2-green | 1-green | 3-green | 0% | +| 2-green | 2-green | 2-green | 0-red | 25% | +| 2-green | 2-green | 2-green | 1-green | 0% | +| 2-green | 2-green | 2-green | 2-green | 0% | +| 2-green | 2-green | 2-green | 3-green | 0% | +| 2-green | 2-green | 3-green | 0-red | 25% | +| 2-green | 2-green | 3-green | 1-green | 0% | +| 2-green | 2-green | 3-green | 2-green | 0% | +| 2-green | 2-green | 3-green | 3-green | 0% | +| 2-green | 3-green | 0-red | 0-red | 50% | +| 2-green | 3-green | 0-red | 1-green | 25% | +| 2-green | 3-green | 0-red | 2-green | 25% | +| 2-green | 3-green | 0-red | 3-green | 25% | +| 2-green | 3-green | 1-green | 0-red | 25% | +| 2-green | 3-green | 1-green | 1-green | 0% | +| 2-green | 3-green | 1-green | 2-green | 0% | +| 2-green | 3-green | 1-green | 3-green | 0% | +| 2-green | 3-green | 2-green | 0-red | 25% | +| 2-green | 3-green | 2-green | 1-green | 0% | +| 2-green | 3-green | 2-green | 2-green | 0% | +| 2-green | 3-green | 2-green | 3-green | 0% | +| 2-green | 3-green | 3-green | 0-red | 25% | +| 2-green | 3-green | 3-green | 1-green | 0% | +| 2-green | 3-green | 3-green | 2-green | 0% | +| 2-green | 3-green | 3-green | 3-green | 0% | +| 3-green | 0-red | 0-red | 0-red | 75% | +| 3-green | 0-red | 0-red | 1-green | 50% | +| 3-green | 0-red | 0-red | 2-green | 50% | +| 3-green | 0-red | 0-red | 3-green | 50% | +| 3-green | 0-red | 1-green | 0-red | 50% | +| 3-green | 0-red | 1-green | 1-green | 25% | +| 3-green | 0-red | 1-green | 2-green | 25% | +| 3-green | 0-red | 1-green | 3-green | 25% | +| 3-green | 0-red | 2-green | 0-red | 50% | +| 3-green | 0-red | 2-green | 1-green | 25% | +| 3-green | 0-red | 2-green | 2-green | 25% | +| 3-green | 0-red | 2-green | 3-green | 25% | +| 3-green | 0-red | 3-green | 0-red | 50% | +| 3-green | 0-red | 3-green | 1-green | 25% | +| 3-green | 0-red | 3-green | 2-green | 25% | +| 3-green | 0-red | 3-green | 3-green | 25% | +| 3-green | 1-green | 0-red | 0-red | 50% | +| 3-green | 1-green | 0-red | 1-green | 25% | +| 3-green | 1-green | 0-red | 2-green | 25% | +| 3-green | 1-green | 0-red | 3-green | 25% | +| 3-green | 1-green | 1-green | 0-red | 25% | +| 3-green | 1-green | 1-green | 1-green | 0% | +| 3-green | 1-green | 1-green | 2-green | 0% | +| 3-green | 1-green | 1-green | 3-green | 0% | +| 3-green | 1-green | 2-green | 0-red | 25% | +| 3-green | 1-green | 2-green | 1-green | 0% | +| 3-green | 1-green | 2-green | 2-green | 0% | +| 3-green | 1-green | 2-green | 3-green | 0% | +| 3-green | 1-green | 3-green | 0-red | 25% | +| 3-green | 1-green | 3-green | 1-green | 0% | +| 3-green | 1-green | 3-green | 2-green | 0% | +| 3-green | 1-green | 3-green | 3-green | 0% | +| 3-green | 2-green | 0-red | 0-red | 50% | +| 3-green | 2-green | 0-red | 1-green | 25% | +| 3-green | 2-green | 0-red | 2-green | 25% | +| 3-green | 2-green | 0-red | 3-green | 25% | +| 3-green | 2-green | 1-green | 0-red | 25% | +| 3-green | 2-green | 1-green | 1-green | 0% | +| 3-green | 2-green | 1-green | 2-green | 0% | +| 3-green | 2-green | 1-green | 3-green | 0% | +| 3-green | 2-green | 2-green | 0-red | 25% | +| 3-green | 2-green | 2-green | 1-green | 0% | +| 3-green | 2-green | 2-green | 2-green | 0% | +| 3-green | 2-green | 2-green | 3-green | 0% | +| 3-green | 2-green | 3-green | 0-red | 25% | +| 3-green | 2-green | 3-green | 1-green | 0% | +| 3-green | 2-green | 3-green | 2-green | 0% | +| 3-green | 2-green | 3-green | 3-green | 0% | +| 3-green | 3-green | 0-red | 0-red | 50% | +| 3-green | 3-green | 0-red | 1-green | 25% | +| 3-green | 3-green | 0-red | 2-green | 25% | +| 3-green | 3-green | 0-red | 3-green | 25% | +| 3-green | 3-green | 1-green | 0-red | 25% | +| 3-green | 3-green | 1-green | 1-green | 0% | +| 3-green | 3-green | 1-green | 2-green | 0% | +| 3-green | 3-green | 1-green | 3-green | 0% | +| 3-green | 3-green | 2-green | 0-red | 25% | +| 3-green | 3-green | 2-green | 1-green | 0% | +| 3-green | 3-green | 2-green | 2-green | 0% | +| 3-green | 3-green | 2-green | 3-green | 0% | +| 3-green | 3-green | 3-green | 0-red | 25% | +| 3-green | 3-green | 3-green | 1-green | 0% | +| 3-green | 3-green | 3-green | 2-green | 0% | +| 3-green | 3-green | 3-green | 3-green | 0% | diff --git a/articles/bugprobhunt/tbyn.R b/articles/bugprobhunt/tbyn.R new file mode 100755 index 00000000..83462f4b --- /dev/null +++ b/articles/bugprobhunt/tbyn.R @@ -0,0 +1,26 @@ +#!/usr/bin/Rscript + +library('reshape', quietly=TRUE, warn.conflicts=FALSE) +library('ggplot2', quietly=TRUE) + +a <- commandArgs(TRUE) + +input <- a[1] +output <- a[2] +num <- as.integer(a[3]) +maxy <- as.integer(a[4]) + +dat <- read.table(input, header=T, sep=',') +dat <- dat[0:num,] + +dat$t <- log(0.05) / log(1 - dat$p) +dat$tn <- dat$t + dat$n + +png(output, width=800) +ggplot(data=dat, aes(x=n)) + + geom_line(aes(y=t, color="t")) + + geom_line(aes(y=t+n, color="t+n")) + + scale_y_continuous(limits = c(0, maxy)) + + theme(legend.title = element_blank()) + + labs(title = 't by n for 95% significance') + diff --git a/articles/bugprobhunt/tbyn.png b/articles/bugprobhunt/tbyn.png new file mode 100644 index 00000000..b19c35a9 Binary files /dev/null and b/articles/bugprobhunt/tbyn.png differ diff --git a/articles/bugprobhunt/trialdoer b/articles/bugprobhunt/trialdoer new file mode 100755 index 00000000..e4b4b306 --- /dev/null +++ b/articles/bugprobhunt/trialdoer @@ -0,0 +1,114 @@ +#!/usr/bin/python3 + +import sys +import os +import subprocess + + +# From http://stackoverflow.com/questions/13059011/is-there-any-python-function-library-for-calculate-binomial-confidence-intervals # noqa: E501 + + +def binP(N, p, x1, x2): + p = float(p) + q = p / (1 - p) + k = 0.0 + v = 1.0 + s = 0.0 + tot = 0.0 + + while k <= N: + tot += v + if k >= x1 and k <= x2: + s += v + if tot > 10**30: + s = s / 10**30 + tot = tot / 10**30 + v = v / 10**30 + k += 1 + v = v * q * (N + 1 - k) / k + return s / tot + + +def calcBin(vx, vN, vCL=95): + """ + Calculate the exact confidence interval for a binomial proportion + + Usage: + >>> calcBin(13,100) + (0.07107391357421874, 0.21204372406005856) + >>> calcBin(4,7) + (0.18405151367187494, 0.9010086059570312) + """ + vx = float(vx) + vN = float(vN) + # Set the confidence bounds + vTU = (100 - float(vCL)) / 2 + vTL = vTU + + vP = vx / vN + if vx == 0: + dl = 0.0 + else: + v = vP / 2 + vsL = 0 + vsH = vP + p = vTL / 100 + + while (vsH - vsL) > 10**-5: + if binP(vN, v, vx, vN) > p: + vsH = v + v = (vsL + v) / 2 + else: + vsL = v + v = (v + vsH) / 2 + dl = v + + if vx == vN: + ul = 1.0 + else: + v = (1 + vP) / 2 + vsL = vP + vsH = 1 + p = vTU / 100 + while (vsH - vsL) > 10**-5: + if binP(vN, v, 0, vx) < p: + vsH = v + v = (vsL + v) / 2 + else: + vsL = v + v = (v + vsH) / 2 + ul = v + return (dl, ul) + + +# Main: ###################################################################### + + +def main(): + from optparse import OptionParser + + parser = OptionParser("usage: %prog ") + opts, args = parser.parse_args(sys.argv[1:]) + if len(args) != 3: + parser.error("wrong number of arguments") # Will exit + + cmd = args[0] + nmax = int(args[1]) + ofilename = args[2] + + o = open(ofilename + ".tmp", "w") + o.write('"k","n","ksn","p"\n') + null = open("/dev/null", "w") + k = 0 + for n in range(1, nmax + 1): + r = subprocess.call(cmd, shell=True, stderr=null, stdout=null) + if r != 0: + k += 1 + (dl, ul) = calcBin(k, n) + o.write("%d,%d,%f,%f\n" % (k, n, 1.0 * k / n, dl)) + o.close() + os.rename(ofilename + ".tmp", ofilename) + + +if __name__ == "__main__": + main() diff --git a/articles/bugprobhunt/trialplot.R b/articles/bugprobhunt/trialplot.R new file mode 100755 index 00000000..b47b9ed2 --- /dev/null +++ b/articles/bugprobhunt/trialplot.R @@ -0,0 +1,22 @@ +#!/usr/bin/Rscript + +library('reshape', quietly=TRUE, warn.conflicts=FALSE) +library('ggplot2', quietly=TRUE) + +a <- commandArgs(TRUE) + +input <- a[1] +output <- a[2] +num <- as.integer(a[3]) + +dat <- read.table(input, header=T, sep=',') +dat <- dat[0:num,] + +png(output, width=800) +ggplot(data=dat, aes(x=n)) + + geom_line(aes(y=ksn, color="k/n")) + + geom_line(aes(y=p, color="p min")) + + geom_hline(aes(yintercept=0.25, color="true p")) + + theme(legend.title = element_blank()) + ylab('k/n') + + labs(title = 'k/n and p min estimate evolution') + diff --git a/articles/bugprobhunt/trials.csv b/articles/bugprobhunt/trials.csv new file mode 100644 index 00000000..ba690e98 --- /dev/null +++ b/articles/bugprobhunt/trials.csv @@ -0,0 +1,5001 @@ +"k","n","ksn","p" +0,1,0.000000,0.000000 +0,2,0.000000,0.000000 +1,3,0.333333,0.008405 +1,4,0.250000,0.006306 +1,5,0.200000,0.005051 +1,6,0.166667,0.004209 +2,7,0.285714,0.036695 +2,8,0.250000,0.031857 +3,9,0.333333,0.074857 +3,10,0.300000,0.066737 +3,11,0.272727,0.060221 +4,12,0.333333,0.099246 +4,13,0.307692,0.090919 +4,14,0.285714,0.083893 +5,15,0.333333,0.118243 +5,16,0.312500,0.110173 +5,17,0.294118,0.103136 +5,18,0.277778,0.096948 +5,19,0.263158,0.091468 +6,20,0.300000,0.118932 +6,21,0.285714,0.112806 +6,22,0.272727,0.107287 +6,23,0.260870,0.102288 +6,24,0.250000,0.097729 +6,25,0.240000,0.093563 +6,26,0.230769,0.089739 +6,27,0.222222,0.086219 +6,28,0.214286,0.082963 +6,29,0.206897,0.079944 +6,30,0.200000,0.077133 +7,31,0.225806,0.095941 +8,32,0.250000,0.114613 +8,33,0.242424,0.110925 +8,34,0.235294,0.107461 +8,35,0.228571,0.104210 +8,36,0.222222,0.101152 +8,37,0.216216,0.098267 +8,38,0.210526,0.095539 +8,39,0.205128,0.092964 +8,40,0.200000,0.090524 +8,41,0.195122,0.088203 +8,42,0.190476,0.086004 +8,43,0.186047,0.083913 +8,44,0.181818,0.081918 +8,45,0.177778,0.080016 +8,46,0.173913,0.078202 +8,47,0.170213,0.076471 +8,48,0.166667,0.074811 +8,49,0.163265,0.073227 +8,50,0.160000,0.071704 +8,51,0.156863,0.070241 +8,52,0.153846,0.068843 +8,53,0.150943,0.067489 +8,54,0.148148,0.066194 +8,55,0.145455,0.064955 +8,56,0.142857,0.063751 +8,57,0.140351,0.062599 +8,58,0.137931,0.061477 +8,59,0.135593,0.060402 +8,60,0.133333,0.059363 +8,61,0.131148,0.058358 +9,62,0.145161,0.068589 +9,63,0.142857,0.067466 +9,64,0.140625,0.066377 +9,65,0.138462,0.065322 +10,66,0.151515,0.075124 +10,67,0.149254,0.073966 +10,68,0.147059,0.072843 +10,69,0.144928,0.071752 +11,70,0.157143,0.081147 +11,71,0.154930,0.079956 +11,72,0.152778,0.078809 +11,73,0.150685,0.077692 +11,74,0.148649,0.076606 +11,75,0.146667,0.075558 +11,76,0.144737,0.074528 +11,77,0.142857,0.073534 +12,78,0.153846,0.082102 +12,79,0.151899,0.081025 +12,80,0.150000,0.079985 +12,81,0.148148,0.078961 +12,82,0.146341,0.077972 +12,83,0.144578,0.076997 +12,84,0.142857,0.076054 +12,85,0.141176,0.075134 +12,86,0.139535,0.074234 +12,87,0.137931,0.073356 +12,88,0.136364,0.072497 +13,89,0.146067,0.080135 +13,90,0.144444,0.079209 +14,91,0.153846,0.086740 +14,92,0.152174,0.085770 +14,93,0.150538,0.084820 +14,94,0.148936,0.083890 +15,95,0.157895,0.091153 +15,96,0.156250,0.090175 +16,97,0.164948,0.097327 +16,98,0.163265,0.096296 +16,99,0.161616,0.095294 +16,100,0.160000,0.094312 +16,101,0.158416,0.093349 +16,102,0.156863,0.092405 +16,103,0.155340,0.091479 +16,104,0.153846,0.090571 +16,105,0.152381,0.089681 +16,106,0.150943,0.088807 +16,107,0.149533,0.087959 +16,108,0.148148,0.087118 +16,109,0.146789,0.086291 +16,110,0.145455,0.085489 +17,111,0.153153,0.091827 +18,112,0.160714,0.098117 +18,113,0.159292,0.097229 +19,114,0.166667,0.103432 +19,115,0.165217,0.102502 +20,116,0.172414,0.108614 +20,117,0.170940,0.107654 +20,118,0.169492,0.106711 +21,119,0.176471,0.112683 +21,120,0.175000,0.111717 +21,121,0.173554,0.110762 +21,122,0.172131,0.109822 +22,123,0.178862,0.115618 +22,124,0.177419,0.114658 +22,125,0.176000,0.113709 +22,126,0.174603,0.112780 +22,127,0.173228,0.111860 +23,128,0.179688,0.117451 +23,129,0.178295,0.116508 +23,130,0.176923,0.115585 +23,131,0.175573,0.114676 +23,132,0.174242,0.113780 +23,133,0.172932,0.112898 +23,134,0.171642,0.112030 +23,135,0.170370,0.111174 +23,136,0.169118,0.110331 +24,137,0.175182,0.115586 +24,138,0.173913,0.114722 +24,139,0.172662,0.113871 +25,140,0.178571,0.119021 +25,141,0.177305,0.118150 +25,142,0.176056,0.117297 +25,143,0.174825,0.116450 +26,144,0.180556,0.121468 +26,145,0.179310,0.120603 +26,146,0.178082,0.119750 +27,147,0.183673,0.124670 +27,148,0.182432,0.123799 +27,149,0.181208,0.122946 +27,150,0.180000,0.122099 +27,151,0.178808,0.121269 +27,152,0.177632,0.120444 +28,153,0.183007,0.125183 +28,154,0.181818,0.124348 +28,155,0.180645,0.123524 +28,156,0.179487,0.122705 +29,157,0.184713,0.127331 +29,158,0.183544,0.126503 +29,159,0.182390,0.125685 +29,160,0.181250,0.124872 +29,161,0.180124,0.124075 +29,162,0.179012,0.123287 +29,163,0.177914,0.122509 +29,164,0.176829,0.121740 +29,165,0.175758,0.120981 +30,166,0.180723,0.125380 +30,167,0.179641,0.124608 +30,168,0.178571,0.123844 +30,169,0.177515,0.123090 +31,170,0.182353,0.127391 +31,171,0.181287,0.126623 +31,172,0.180233,0.125865 +31,173,0.179191,0.125116 +31,174,0.178161,0.124380 +31,175,0.177143,0.123648 +31,176,0.176136,0.122924 +31,177,0.175141,0.122208 +31,178,0.174157,0.121506 +31,179,0.173184,0.120806 +31,180,0.172222,0.120119 +31,181,0.171271,0.119434 +31,182,0.170330,0.118762 +31,183,0.169399,0.118093 +31,184,0.168478,0.117436 +31,185,0.167568,0.116785 +31,186,0.166667,0.116137 +31,187,0.165775,0.115501 +31,188,0.164894,0.114871 +31,189,0.164021,0.114249 +32,190,0.168421,0.118141 +32,191,0.167539,0.117507 +32,192,0.166667,0.116880 +32,193,0.165803,0.116259 +32,194,0.164948,0.115645 +32,195,0.164103,0.115037 +33,196,0.168367,0.118823 +33,197,0.167513,0.118204 +33,198,0.166667,0.117587 +34,199,0.170854,0.121318 +34,200,0.170000,0.120696 +35,201,0.174129,0.124388 +35,202,0.173267,0.123756 +35,203,0.172414,0.123131 +35,204,0.171569,0.122511 +36,205,0.175610,0.126131 +36,206,0.174757,0.125503 +36,207,0.173913,0.124881 +36,208,0.173077,0.124264 +36,209,0.172249,0.123654 +36,210,0.171429,0.123049 +37,211,0.175355,0.126575 +37,212,0.174528,0.125962 +38,213,0.178404,0.129450 +38,214,0.177570,0.128829 +38,215,0.176744,0.128213 +38,216,0.175926,0.127604 +38,217,0.175115,0.127000 +38,218,0.174312,0.126406 +38,219,0.173516,0.125813 +38,220,0.172727,0.125226 +38,221,0.171946,0.124643 +39,222,0.175676,0.128007 +39,223,0.174888,0.127417 +39,224,0.174107,0.126832 +40,225,0.177778,0.130151 +40,226,0.176991,0.129559 +40,227,0.176211,0.128972 +40,228,0.175439,0.128391 +40,229,0.174672,0.127819 +40,230,0.173913,0.127248 +41,231,0.177489,0.130482 +41,232,0.176724,0.129909 +41,233,0.175966,0.129335 +41,234,0.175214,0.128766 +41,235,0.174468,0.128208 +41,236,0.173729,0.127648 +41,237,0.172996,0.127099 +41,238,0.172269,0.126549 +41,239,0.171548,0.126009 +41,240,0.170833,0.125469 +41,241,0.170124,0.124938 +41,242,0.169421,0.124406 +41,243,0.168724,0.123884 +41,244,0.168033,0.123366 +41,245,0.167347,0.122847 +41,246,0.166667,0.122337 +42,247,0.170040,0.125385 +42,248,0.169355,0.124864 +42,249,0.168675,0.124352 +42,250,0.168000,0.123844 +43,251,0.171315,0.126842 +43,252,0.170635,0.126328 +43,253,0.169960,0.125813 +43,254,0.169291,0.125308 +43,255,0.168627,0.124806 +43,256,0.167969,0.124308 +43,257,0.167315,0.123809 +43,258,0.166667,0.123319 +43,259,0.166023,0.122833 +43,260,0.165385,0.122350 +43,261,0.164751,0.121871 +43,262,0.164122,0.121396 +43,263,0.163498,0.120922 +43,264,0.162879,0.120454 +43,265,0.162264,0.119990 +43,266,0.161654,0.119529 +44,267,0.164794,0.122366 +44,268,0.164179,0.121899 +44,269,0.163569,0.121434 +45,270,0.166667,0.124240 +45,271,0.166052,0.123771 +46,272,0.169118,0.126557 +46,273,0.168498,0.126083 +46,274,0.167883,0.125613 +46,275,0.167273,0.125146 +47,276,0.170290,0.127886 +48,277,0.173285,0.130617 +48,278,0.172662,0.130137 +48,279,0.172043,0.129660 +48,280,0.171429,0.129186 +48,281,0.170819,0.128716 +48,282,0.170213,0.128249 +48,283,0.169611,0.127786 +48,284,0.169014,0.127325 +48,285,0.168421,0.126868 +48,286,0.167832,0.126414 +48,287,0.167247,0.125964 +48,288,0.166667,0.125516 +48,289,0.166090,0.125072 +48,290,0.165517,0.124630 +48,291,0.164948,0.124192 +49,292,0.167808,0.126801 +49,293,0.167235,0.126358 +49,294,0.166667,0.125918 +50,295,0.169492,0.128492 +50,296,0.168919,0.128053 +51,297,0.171717,0.130609 +51,298,0.171141,0.130160 +51,299,0.170569,0.129714 +51,300,0.170000,0.129272 +51,301,0.169435,0.128832 +51,302,0.168874,0.128400 +51,303,0.168317,0.127966 +51,304,0.167763,0.127535 +51,305,0.167213,0.127107 +52,306,0.169935,0.129595 +53,307,0.172638,0.132074 +53,308,0.172078,0.131634 +53,309,0.171521,0.131198 +53,310,0.170968,0.130769 +53,311,0.170418,0.130338 +53,312,0.169872,0.129910 +53,313,0.169329,0.129485 +53,314,0.168790,0.129067 +53,315,0.168254,0.128647 +53,316,0.167722,0.128230 +54,317,0.170347,0.130638 +55,318,0.172956,0.133034 +56,319,0.175549,0.135420 +56,320,0.175000,0.134986 +56,321,0.174455,0.134555 +57,322,0.177019,0.136916 +57,323,0.176471,0.136481 +57,324,0.175926,0.136054 +57,325,0.175385,0.135625 +57,326,0.174847,0.135198 +57,327,0.174312,0.134779 +57,328,0.173780,0.134358 +57,329,0.173252,0.133939 +57,330,0.172727,0.133528 +57,331,0.172205,0.133114 +57,332,0.171687,0.132703 +57,333,0.171171,0.132299 +57,334,0.170659,0.131892 +58,335,0.173134,0.134170 +58,336,0.172619,0.133766 +58,337,0.172107,0.133358 +58,338,0.171598,0.132958 +58,339,0.171091,0.132556 +58,340,0.170588,0.132155 +58,341,0.170088,0.131763 +58,342,0.169591,0.131367 +59,343,0.172012,0.133599 +59,344,0.171512,0.133200 +59,345,0.171014,0.132809 +59,346,0.170520,0.132415 +60,347,0.172911,0.134619 +60,348,0.172414,0.134227 +60,349,0.171920,0.133832 +60,350,0.171429,0.133439 +61,351,0.173789,0.135622 +61,352,0.173295,0.135226 +62,353,0.175637,0.137391 +62,354,0.175141,0.136997 +62,355,0.174648,0.136601 +62,356,0.174157,0.136212 +62,357,0.173669,0.135820 +62,358,0.173184,0.135435 +62,359,0.172702,0.135047 +62,360,0.172222,0.134667 +63,361,0.174515,0.136785 +63,362,0.174033,0.136402 +63,363,0.173554,0.136015 +63,364,0.173077,0.135636 +63,365,0.172603,0.135254 +63,366,0.172131,0.134879 +64,367,0.174387,0.136966 +64,368,0.173913,0.136589 +64,369,0.173442,0.136208 +64,370,0.172973,0.135835 +64,371,0.172507,0.135458 +65,372,0.174731,0.137519 +66,373,0.176944,0.139574 +66,374,0.176471,0.139190 +67,375,0.178667,0.141233 +67,376,0.178191,0.140846 +68,377,0.180371,0.142872 +69,378,0.182540,0.144896 +69,379,0.182058,0.144502 +69,380,0.181579,0.144117 +69,381,0.181102,0.143727 +69,382,0.180628,0.143346 +69,383,0.180157,0.142960 +69,384,0.179688,0.142583 +70,385,0.181818,0.144567 +70,386,0.181347,0.144187 +70,387,0.180879,0.143804 +70,388,0.180412,0.143428 +71,389,0.182519,0.145392 +71,390,0.182051,0.145008 +72,391,0.184143,0.146961 +72,392,0.183673,0.146581 +72,393,0.183206,0.146196 +73,394,0.185279,0.148133 +74,395,0.187342,0.150063 +74,396,0.186869,0.149678 +74,397,0.186398,0.149290 +74,398,0.185930,0.148909 +74,399,0.185464,0.148530 +75,400,0.187500,0.150435 +76,401,0.189526,0.152333 +76,402,0.189055,0.151942 +76,403,0.188586,0.151560 +76,404,0.188119,0.151179 +77,405,0.190123,0.153057 +78,406,0.192118,0.154926 +78,407,0.191646,0.154540 +78,408,0.191176,0.154155 +78,409,0.190709,0.153767 +78,410,0.190244,0.153386 +78,411,0.189781,0.153007 +78,412,0.189320,0.152624 +78,413,0.188862,0.152249 +78,414,0.188406,0.151875 +79,415,0.190361,0.153707 +79,416,0.189904,0.153332 +79,417,0.189448,0.152958 +80,418,0.191388,0.154775 +80,419,0.190931,0.154400 +81,420,0.192857,0.156211 +81,421,0.192399,0.155834 +81,422,0.191943,0.155453 +81,423,0.191489,0.155080 +81,424,0.191038,0.154708 +81,425,0.190588,0.154338 +81,426,0.190141,0.153964 +82,427,0.192037,0.155752 +83,428,0.193925,0.157526 +83,429,0.193473,0.157153 +84,430,0.195349,0.158921 +84,431,0.194896,0.158540 +84,432,0.194444,0.158167 +85,433,0.196305,0.159920 +86,434,0.198157,0.161671 +86,435,0.197701,0.161293 +86,436,0.197248,0.160911 +87,437,0.199085,0.162646 +87,438,0.198630,0.162269 +87,439,0.198178,0.161893 +88,440,0.200000,0.163614 +88,441,0.199546,0.163237 +89,442,0.201357,0.164946 +89,443,0.200903,0.164567 +89,444,0.200450,0.164190 +90,445,0.202247,0.165890 +90,446,0.201794,0.165506 +91,447,0.203579,0.167201 +92,448,0.205357,0.168886 +92,449,0.204900,0.168498 +92,450,0.204444,0.168117 +92,451,0.203991,0.167738 +93,452,0.205752,0.169406 +93,453,0.205298,0.169026 +94,454,0.207048,0.170688 +94,455,0.206593,0.170307 +95,456,0.208333,0.171957 +96,457,0.210066,0.173605 +96,458,0.209607,0.173213 +96,459,0.209150,0.172829 +96,460,0.208696,0.172447 +96,461,0.208243,0.172067 +96,462,0.207792,0.171682 +96,463,0.207343,0.171304 +96,464,0.206897,0.170929 +96,465,0.206452,0.170555 +96,466,0.206009,0.170183 +96,467,0.205567,0.169806 +97,468,0.207265,0.171423 +97,469,0.206823,0.171045 +97,470,0.206383,0.170675 +97,471,0.205945,0.170306 +98,472,0.207627,0.171906 +98,473,0.207188,0.171537 +99,474,0.208861,0.173125 +99,475,0.208421,0.172755 +99,476,0.207983,0.172379 +99,477,0.207547,0.172011 +99,478,0.207113,0.171645 +100,479,0.208768,0.173221 +100,480,0.208333,0.172853 +101,481,0.209979,0.174418 +101,482,0.209544,0.174049 +101,483,0.209110,0.173683 +102,484,0.210744,0.175239 +102,485,0.210309,0.174872 +102,486,0.209877,0.174499 +102,487,0.209446,0.174134 +102,488,0.209016,0.173771 +103,489,0.210634,0.175315 +103,490,0.210204,0.174944 +104,491,0.211813,0.176484 +104,492,0.211382,0.176112 +104,493,0.210953,0.175748 +104,494,0.210526,0.175386 +105,495,0.212121,0.176909 +106,496,0.213710,0.178423 +107,497,0.215292,0.179934 +107,498,0.214859,0.179566 +107,499,0.214429,0.179200 +107,500,0.214000,0.178835 +107,501,0.213573,0.178465 +107,502,0.213147,0.178103 +107,503,0.212724,0.177743 +107,504,0.212302,0.177383 +107,505,0.211881,0.177026 +107,506,0.211462,0.176669 +107,507,0.211045,0.176314 +107,508,0.210630,0.175961 +107,509,0.210216,0.175602 +107,510,0.209804,0.175252 +107,511,0.209393,0.174902 +108,512,0.210938,0.176379 +109,513,0.212476,0.177847 +110,514,0.214008,0.179312 +111,515,0.215534,0.180768 +112,516,0.217054,0.182222 +112,517,0.216634,0.181863 +112,518,0.216216,0.181505 +112,519,0.215800,0.181149 +112,520,0.215385,0.180794 +112,521,0.214971,0.180441 +113,522,0.216475,0.181875 +113,523,0.216061,0.181520 +113,524,0.215649,0.181167 +114,525,0.217143,0.182601 +114,526,0.216730,0.182241 +115,527,0.218216,0.183671 +116,528,0.219697,0.185084 +116,529,0.219282,0.184728 +116,530,0.218868,0.184373 +117,531,0.220339,0.185780 +117,532,0.219925,0.185424 +117,533,0.219512,0.185069 +117,534,0.219101,0.184716 +118,535,0.220561,0.186115 +118,536,0.220149,0.185761 +118,537,0.219739,0.185408 +118,538,0.219331,0.185057 +118,539,0.218924,0.184707 +118,540,0.218519,0.184358 +118,541,0.218115,0.184011 +118,542,0.217712,0.183665 +118,543,0.217311,0.183320 +118,544,0.216912,0.182976 +118,545,0.216514,0.182634 +118,546,0.216117,0.182293 +118,547,0.215722,0.181953 +118,548,0.215328,0.181614 +119,549,0.216758,0.182985 +119,550,0.216364,0.182646 +120,551,0.217786,0.184006 +120,552,0.217391,0.183666 +120,553,0.216998,0.183327 +120,554,0.216606,0.182990 +120,555,0.216216,0.182653 +120,556,0.215827,0.182318 +121,557,0.217235,0.183667 +121,558,0.216846,0.183331 +122,559,0.218247,0.184675 +123,560,0.219643,0.186017 +124,561,0.221034,0.187351 +124,562,0.220641,0.187011 +125,563,0.222025,0.188340 +125,564,0.221631,0.187999 +125,565,0.221239,0.187659 +125,566,0.220848,0.187321 +126,567,0.222222,0.188643 +126,568,0.221831,0.188304 +126,569,0.221441,0.187966 +127,570,0.222807,0.189282 +128,571,0.224168,0.190589 +128,572,0.223776,0.190249 +128,573,0.223386,0.189910 +128,574,0.222997,0.189572 +128,575,0.222609,0.189236 +129,576,0.223958,0.190533 +130,577,0.225303,0.191829 +130,578,0.224913,0.191490 +130,579,0.224525,0.191153 +130,580,0.224138,0.190816 +131,581,0.225473,0.192098 +131,582,0.225086,0.191761 +131,583,0.224700,0.191432 +131,584,0.224315,0.191097 +131,585,0.223932,0.190764 +132,586,0.225256,0.192036 +132,587,0.224872,0.191702 +132,588,0.224490,0.191369 +132,589,0.224109,0.191037 +133,590,0.225424,0.192303 +134,591,0.226734,0.193566 +135,592,0.228041,0.194828 +136,593,0.229342,0.196080 +137,594,0.230640,0.197330 +137,595,0.230252,0.196991 +138,596,0.231544,0.198237 +138,597,0.231156,0.197898 +138,598,0.230769,0.197567 +138,599,0.230384,0.197230 +139,600,0.231667,0.198463 +139,601,0.231281,0.198126 +140,602,0.232558,0.199361 +140,603,0.232172,0.199024 +140,604,0.231788,0.198687 +140,605,0.231405,0.198352 +140,606,0.231023,0.198017 +140,607,0.230643,0.197684 +140,608,0.230263,0.197352 +140,609,0.229885,0.197021 +140,610,0.229508,0.196698 +140,611,0.229133,0.196369 +141,612,0.230392,0.197582 +141,613,0.230016,0.197253 +141,614,0.229642,0.196924 +141,615,0.229268,0.196597 +141,616,0.228896,0.196271 +141,617,0.228525,0.195946 +141,618,0.228155,0.195629 +141,619,0.227787,0.195306 +141,620,0.227419,0.194984 +141,621,0.227053,0.194663 +141,622,0.226688,0.194343 +141,623,0.226324,0.194024 +141,624,0.225962,0.193706 +141,625,0.225600,0.193390 +141,626,0.225240,0.193074 +142,627,0.226475,0.194271 +142,628,0.226115,0.193955 +142,629,0.225755,0.193640 +142,630,0.225397,0.193326 +142,631,0.225040,0.193012 +143,632,0.226266,0.194195 +143,633,0.225908,0.193881 +143,634,0.225552,0.193569 +143,635,0.225197,0.193264 +143,636,0.224843,0.192953 +144,637,0.226060,0.194122 +144,638,0.225705,0.193817 +144,639,0.225352,0.193507 +145,640,0.226562,0.194671 +145,641,0.226209,0.194360 +145,642,0.225857,0.194058 +145,643,0.225505,0.193749 +146,644,0.226708,0.194907 +146,645,0.226357,0.194598 +147,646,0.227554,0.195759 +147,647,0.227202,0.195450 +147,648,0.226852,0.195141 +147,649,0.226502,0.194834 +147,650,0.226154,0.194527 +147,651,0.225806,0.194221 +147,652,0.225460,0.193923 +147,653,0.225115,0.193620 +147,654,0.224771,0.193317 +147,655,0.224427,0.193015 +147,656,0.224085,0.192714 +148,657,0.225266,0.193853 +148,658,0.224924,0.193551 +148,659,0.224583,0.193258 +149,660,0.225758,0.194393 +149,661,0.225416,0.194092 +149,662,0.225076,0.193792 +149,663,0.224736,0.193493 +149,664,0.224398,0.193194 +149,665,0.224060,0.192897 +149,666,0.223724,0.192607 +149,667,0.223388,0.192312 +149,668,0.223054,0.192017 +149,669,0.222720,0.191723 +149,670,0.222388,0.191437 +150,671,0.223547,0.192551 +151,672,0.224702,0.193669 +152,673,0.225854,0.194779 +153,674,0.227003,0.195888 +154,675,0.228148,0.196994 +154,676,0.227811,0.196696 +154,677,0.227474,0.196405 +154,678,0.227139,0.196109 +154,679,0.226804,0.195813 +154,680,0.226471,0.195518 +155,681,0.227606,0.196617 +155,682,0.227273,0.196322 +155,683,0.226940,0.196034 +155,684,0.226608,0.195741 +156,685,0.227737,0.196834 +156,686,0.227405,0.196540 +157,687,0.228530,0.197624 +157,688,0.228198,0.197337 +157,689,0.227866,0.197043 +157,690,0.227536,0.196751 +157,691,0.227207,0.196459 +158,692,0.228324,0.197543 +158,693,0.227994,0.197251 +159,694,0.229107,0.198325 +159,695,0.228777,0.198033 +159,696,0.228448,0.197748 +159,697,0.228121,0.197458 +159,698,0.227794,0.197168 +159,699,0.227468,0.196879 +159,700,0.227143,0.196598 +159,701,0.226819,0.196310 +159,702,0.226496,0.196024 +159,703,0.226174,0.195738 +159,704,0.225852,0.195460 +160,705,0.226950,0.196521 +160,706,0.226629,0.196236 +160,707,0.226308,0.195951 +160,708,0.225989,0.195668 +160,709,0.225670,0.195392 +160,710,0.225352,0.195110 +161,711,0.226442,0.196163 +161,712,0.226124,0.195881 +161,713,0.225806,0.195599 +161,714,0.225490,0.195326 +162,715,0.226573,0.196368 +162,716,0.226257,0.196093 +162,717,0.225941,0.195813 +163,718,0.227019,0.196858 +163,719,0.226704,0.196577 +164,720,0.227778,0.197613 +164,721,0.227462,0.197339 +165,722,0.228532,0.198372 +165,723,0.228216,0.198090 +165,724,0.227901,0.197817 +165,725,0.227586,0.197537 +165,726,0.227273,0.197258 +166,727,0.228336,0.198285 +166,728,0.228022,0.198013 +167,729,0.229081,0.199037 +168,730,0.230137,0.200060 +168,731,0.229822,0.199779 +168,732,0.229508,0.199499 +168,733,0.229195,0.199227 +169,734,0.230245,0.200245 +170,735,0.231293,0.201255 +171,736,0.232337,0.202270 +171,737,0.232022,0.201989 +171,738,0.231707,0.201715 +171,739,0.231394,0.201435 +171,740,0.231081,0.201156 +171,741,0.230769,0.200877 +172,742,0.231806,0.201886 +172,743,0.231494,0.201607 +172,744,0.231183,0.201329 +172,745,0.230872,0.201059 +173,746,0.231903,0.202056 +173,747,0.231593,0.201778 +173,748,0.231283,0.201508 +173,749,0.230975,0.201232 +174,750,0.232000,0.202225 +174,751,0.231691,0.201955 +174,752,0.231383,0.201680 +174,753,0.231076,0.201405 +174,754,0.230769,0.201138 +174,755,0.230464,0.200864 +175,756,0.231481,0.201850 +176,757,0.232497,0.202835 +176,758,0.232190,0.202560 +176,759,0.231884,0.202294 +176,760,0.231579,0.202020 +176,761,0.231275,0.201748 +177,762,0.232283,0.202727 +177,763,0.231979,0.202454 +177,764,0.231675,0.202189 +177,765,0.231373,0.201918 +177,766,0.231070,0.201647 +177,767,0.230769,0.201384 +177,768,0.230469,0.201115 +178,769,0.231469,0.202087 +178,770,0.231169,0.201818 +178,771,0.230869,0.201549 +178,772,0.230570,0.201288 +178,773,0.230272,0.201020 +178,774,0.229974,0.200754 +178,775,0.229677,0.200495 +178,776,0.229381,0.200229 +179,777,0.230373,0.201193 +179,778,0.230077,0.200928 +179,779,0.229782,0.200670 +179,780,0.229487,0.200406 +179,781,0.229193,0.200142 +179,782,0.228900,0.199886 +179,783,0.228608,0.199624 +179,784,0.228316,0.199362 +179,785,0.228025,0.199108 +180,786,0.229008,0.200057 +180,787,0.228717,0.199796 +181,788,0.229695,0.200749 +181,789,0.229404,0.200487 +181,790,0.229114,0.200233 +181,791,0.228824,0.199973 +181,792,0.228535,0.199714 +181,793,0.228247,0.199462 +181,794,0.227960,0.199204 +181,795,0.227673,0.198946 +181,796,0.227387,0.198696 +182,797,0.228356,0.199634 +183,798,0.229323,0.200570 +184,799,0.230288,0.201505 +184,800,0.230000,0.201254 +184,801,0.229713,0.200995 +185,802,0.230673,0.201927 +185,803,0.230386,0.201676 +185,804,0.230100,0.201418 +185,805,0.229814,0.201161 +185,806,0.229529,0.200911 +185,807,0.229244,0.200655 +185,808,0.228960,0.200400 +185,809,0.228677,0.200152 +185,810,0.228395,0.199898 +186,811,0.229346,0.200822 +187,812,0.230296,0.201744 +187,813,0.230012,0.201489 +187,814,0.229730,0.201241 +187,815,0.229448,0.200987 +187,816,0.229167,0.200734 +187,817,0.228886,0.200488 +188,818,0.229829,0.201405 +188,819,0.229548,0.201152 +188,820,0.229268,0.200900 +188,821,0.228989,0.200655 +189,822,0.229927,0.201562 +189,823,0.229648,0.201317 +189,824,0.229369,0.201065 +189,825,0.229091,0.200822 +189,826,0.228814,0.200571 +189,827,0.228537,0.200322 +189,828,0.228261,0.200080 +189,829,0.227986,0.199832 +190,830,0.228916,0.200738 +190,831,0.228640,0.200489 +190,832,0.228365,0.200241 +191,833,0.229292,0.201145 +191,834,0.229017,0.200896 +191,835,0.228743,0.200656 +191,836,0.228469,0.200409 +191,837,0.228196,0.200162 +191,838,0.227924,0.199924 +191,839,0.227652,0.199678 +191,840,0.227381,0.199441 +192,841,0.228300,0.200330 +192,842,0.228029,0.200085 +192,843,0.227758,0.199848 +192,844,0.227488,0.199604 +192,845,0.227219,0.199368 +192,846,0.226950,0.199125 +193,847,0.227863,0.200009 +193,848,0.227594,0.199774 +193,849,0.227326,0.199531 +193,850,0.227059,0.199297 +194,851,0.227967,0.200177 +194,852,0.227700,0.199935 +194,853,0.227433,0.199701 +195,854,0.228337,0.200579 +195,855,0.228070,0.200337 +196,856,0.228972,0.201213 +196,857,0.228705,0.200972 +196,858,0.228438,0.200737 +196,859,0.228172,0.200497 +196,860,0.227907,0.200264 +196,861,0.227642,0.200024 +196,862,0.227378,0.199792 +197,863,0.228273,0.200655 +197,864,0.228009,0.200423 +197,865,0.227746,0.200184 +198,866,0.228637,0.201052 +198,867,0.228374,0.200813 +198,868,0.228111,0.200582 +198,869,0.227848,0.200344 +198,870,0.227586,0.200114 +198,871,0.227325,0.199877 +199,872,0.228211,0.200740 +199,873,0.227950,0.200503 +199,874,0.227689,0.200273 +200,875,0.228571,0.201127 +201,876,0.229452,0.201985 +201,877,0.229190,0.201748 +201,878,0.228929,0.201518 +201,879,0.228669,0.201282 +202,880,0.229545,0.202138 +202,881,0.229285,0.201901 +202,882,0.229025,0.201672 +202,883,0.228766,0.201437 +202,884,0.228507,0.201202 +202,885,0.228249,0.200975 +202,886,0.227991,0.200741 +203,887,0.228861,0.201591 +204,888,0.229730,0.202433 +204,889,0.229471,0.202198 +204,890,0.229213,0.201971 +204,891,0.228956,0.201738 +204,892,0.228700,0.201511 +205,893,0.229563,0.202350 +206,894,0.230425,0.203187 +206,895,0.230168,0.202960 +206,896,0.229911,0.202726 +206,897,0.229654,0.202493 +206,898,0.229399,0.202267 +206,899,0.229143,0.202035 +206,900,0.228889,0.201811 +206,901,0.228635,0.201580 +206,902,0.228381,0.201357 +206,903,0.228128,0.201127 +207,904,0.228982,0.201956 +207,905,0.228729,0.201733 +208,906,0.229581,0.202561 +208,907,0.229327,0.202331 +208,908,0.229075,0.202108 +209,909,0.229923,0.202933 +209,910,0.229670,0.202703 +209,911,0.229418,0.202474 +209,912,0.229167,0.202252 +209,913,0.228916,0.202023 +209,914,0.228665,0.201802 +209,915,0.228415,0.201575 +209,916,0.228166,0.201355 +209,917,0.227917,0.201128 +210,918,0.228758,0.201947 +211,919,0.229597,0.202765 +212,920,0.230435,0.203582 +212,921,0.230185,0.203354 +212,922,0.229935,0.203126 +213,923,0.230769,0.203941 +214,924,0.231602,0.204754 +214,925,0.231351,0.204526 +214,926,0.231102,0.204305 +214,927,0.230852,0.204077 +214,928,0.230603,0.203851 +214,929,0.230355,0.203631 +215,930,0.231183,0.204433 +215,931,0.230934,0.204214 +216,932,0.231760,0.205014 +216,933,0.231511,0.204794 +217,934,0.232334,0.205593 +218,935,0.233155,0.206391 +218,936,0.232906,0.206170 +219,937,0.233725,0.206966 +219,938,0.233475,0.206739 +219,939,0.233227,0.206518 +219,940,0.232979,0.206292 +219,941,0.232731,0.206072 +219,942,0.232484,0.205846 +220,943,0.233298,0.206638 +221,944,0.234110,0.207429 +221,945,0.233862,0.207210 +221,946,0.233615,0.206983 +221,947,0.233369,0.206765 +221,948,0.233122,0.206540 +221,949,0.232877,0.206322 +222,950,0.233684,0.207109 +223,951,0.234490,0.207894 +224,952,0.235294,0.208679 +225,953,0.236097,0.209456 +225,954,0.235849,0.209236 +226,955,0.236649,0.210018 +226,956,0.236402,0.209791 +226,957,0.236155,0.209572 +226,958,0.235908,0.209346 +226,959,0.235662,0.209128 +226,960,0.235417,0.208903 +227,961,0.236212,0.209681 +227,962,0.235967,0.209456 +227,963,0.235722,0.209238 +228,964,0.236515,0.210007 +228,965,0.236269,0.209789 +228,966,0.236025,0.209565 +229,967,0.236815,0.210339 +230,968,0.237603,0.211104 +231,969,0.238390,0.211876 +232,970,0.239175,0.212640 +232,971,0.238929,0.212421 +232,972,0.238683,0.212195 +232,973,0.238438,0.211977 +232,974,0.238193,0.211752 +232,975,0.237949,0.211535 +232,976,0.237705,0.211311 +232,977,0.237462,0.211094 +232,978,0.237219,0.210871 +232,979,0.236977,0.210656 +232,980,0.236735,0.210434 +232,981,0.236493,0.210219 +233,982,0.237271,0.210975 +233,983,0.237030,0.210754 +234,984,0.237805,0.211516 +234,985,0.237563,0.211294 +235,986,0.238337,0.212047 +235,987,0.238095,0.211832 +235,988,0.237854,0.211610 +235,989,0.237614,0.211396 +236,990,0.238384,0.212147 +236,991,0.238143,0.211926 +237,992,0.238911,0.212682 +237,993,0.238671,0.212460 +237,994,0.238431,0.212247 +237,995,0.238191,0.212026 +237,996,0.237952,0.211813 +237,997,0.237713,0.211594 +237,998,0.237475,0.211382 +237,999,0.237237,0.211163 +237,1000,0.237000,0.210952 +237,1001,0.236763,0.210734 +237,1002,0.236527,0.210523 +238,1003,0.237288,0.211266 +238,1004,0.237052,0.211048 +239,1005,0.237811,0.211789 +239,1006,0.237575,0.211579 +239,1007,0.237339,0.211362 +239,1008,0.237103,0.211152 +240,1009,0.237859,0.211891 +241,1010,0.238614,0.212628 +242,1011,0.239367,0.213358 +242,1012,0.239130,0.213147 +242,1013,0.238894,0.212929 +242,1014,0.238659,0.212719 +242,1015,0.238424,0.212502 +242,1016,0.238189,0.212293 +243,1017,0.238938,0.213027 +244,1018,0.239686,0.213752 +245,1019,0.240432,0.214483 +246,1020,0.241176,0.215214 +246,1021,0.240940,0.214996 +246,1022,0.240705,0.214785 +246,1023,0.240469,0.214568 +246,1024,0.240234,0.214358 +246,1025,0.240000,0.214142 +246,1026,0.239766,0.213933 +246,1027,0.239533,0.213718 +246,1028,0.239300,0.213510 +246,1029,0.239067,0.213295 +246,1030,0.238835,0.213088 +246,1031,0.238603,0.212881 +246,1032,0.238372,0.212668 +246,1033,0.238141,0.212462 +246,1034,0.237911,0.212249 +246,1035,0.237681,0.212044 +246,1036,0.237452,0.211832 +246,1037,0.237223,0.211628 +246,1038,0.236994,0.211417 +246,1039,0.236766,0.211213 +246,1040,0.236538,0.211003 +246,1041,0.236311,0.210800 +247,1042,0.237044,0.211519 +248,1043,0.237776,0.212230 +248,1044,0.237548,0.212026 +249,1045,0.238278,0.212736 +249,1046,0.238050,0.212525 +249,1047,0.237822,0.212322 +249,1048,0.237595,0.212120 +249,1049,0.237369,0.211910 +249,1050,0.237143,0.211708 +250,1051,0.237869,0.212414 +250,1052,0.237643,0.212212 +251,1053,0.238367,0.212917 +251,1054,0.238140,0.212715 +251,1055,0.237915,0.212506 +251,1056,0.237689,0.212305 +251,1057,0.237465,0.212097 +251,1058,0.237240,0.211896 +251,1059,0.237016,0.211689 +251,1060,0.236792,0.211489 +251,1061,0.236569,0.211283 +251,1062,0.236347,0.211084 +251,1063,0.236124,0.210885 +251,1064,0.235902,0.210680 +251,1065,0.235681,0.210482 +252,1066,0.236398,0.211180 +252,1067,0.236176,0.210982 +252,1068,0.235955,0.210778 +252,1069,0.235734,0.210580 +252,1070,0.235514,0.210376 +252,1071,0.235294,0.210180 +252,1072,0.235075,0.209977 +253,1073,0.235788,0.210678 +253,1074,0.235568,0.210475 +253,1075,0.235349,0.210279 +253,1076,0.235130,0.210076 +253,1077,0.234912,0.209881 +253,1078,0.234694,0.209680 +253,1079,0.234476,0.209485 +254,1080,0.235185,0.210176 +255,1081,0.235893,0.210866 +255,1082,0.235675,0.210671 +255,1083,0.235457,0.210469 +255,1084,0.235240,0.210275 +255,1085,0.235023,0.210081 +255,1086,0.234807,0.209881 +255,1087,0.234591,0.209688 +256,1088,0.235294,0.210374 +256,1089,0.235078,0.210173 +256,1090,0.234862,0.209981 +256,1091,0.234647,0.209788 +256,1092,0.234432,0.209589 +256,1093,0.234218,0.209397 +256,1094,0.234004,0.209199 +256,1095,0.233790,0.209008 +257,1096,0.234489,0.209690 +257,1097,0.234275,0.209499 +257,1098,0.234062,0.209301 +257,1099,0.233849,0.209110 +257,1100,0.233636,0.208913 +257,1101,0.233424,0.208723 +258,1102,0.234120,0.209402 +258,1103,0.233908,0.209213 +258,1104,0.233696,0.209016 +258,1105,0.233484,0.208827 +258,1106,0.233273,0.208631 +259,1107,0.233966,0.209307 +259,1108,0.233755,0.209119 +259,1109,0.233544,0.208923 +259,1110,0.233333,0.208735 +259,1111,0.233123,0.208547 +259,1112,0.232914,0.208352 +259,1113,0.232704,0.208165 +260,1114,0.233393,0.208838 +260,1115,0.233184,0.208644 +260,1116,0.232975,0.208457 +260,1117,0.232766,0.208263 +260,1118,0.232558,0.208077 +260,1119,0.232350,0.207891 +260,1120,0.232143,0.207698 +260,1121,0.231936,0.207513 +260,1122,0.231729,0.207321 +260,1123,0.231523,0.207136 +260,1124,0.231317,0.206952 +261,1125,0.232000,0.207620 +261,1126,0.231794,0.207428 +261,1127,0.231588,0.207244 +261,1128,0.231383,0.207053 +261,1129,0.231178,0.206870 +261,1130,0.230973,0.206687 +262,1131,0.231653,0.207345 +262,1132,0.231449,0.207162 +262,1133,0.231244,0.206979 +262,1134,0.231041,0.206789 +262,1135,0.230837,0.206607 +262,1136,0.230634,0.206418 +262,1137,0.230431,0.206237 +262,1138,0.230228,0.206055 +262,1139,0.230026,0.205868 +262,1140,0.229825,0.205687 +262,1141,0.229623,0.205500 +263,1142,0.230298,0.206160 +264,1143,0.230971,0.206819 +265,1144,0.231643,0.207477 +265,1145,0.231441,0.207289 +265,1146,0.231239,0.207108 +265,1147,0.231037,0.206921 +265,1148,0.230836,0.206740 +266,1149,0.231506,0.207396 +266,1150,0.231304,0.207209 +267,1151,0.231972,0.207864 +267,1152,0.231771,0.207683 +267,1153,0.231570,0.207496 +267,1154,0.231369,0.207316 +267,1155,0.231169,0.207130 +267,1156,0.230969,0.206951 +267,1157,0.230769,0.206772 +267,1158,0.230570,0.206586 +268,1159,0.231234,0.207238 +268,1160,0.231034,0.207052 +268,1161,0.230835,0.206873 +268,1162,0.230637,0.206695 +269,1163,0.231298,0.207338 +269,1164,0.231100,0.207160 +269,1165,0.230901,0.206975 +269,1166,0.230703,0.206797 +269,1167,0.230506,0.206620 +269,1168,0.230308,0.206436 +269,1169,0.230111,0.206259 +270,1170,0.230769,0.206899 +270,1171,0.230572,0.206722 +270,1172,0.230375,0.206546 +270,1173,0.230179,0.206362 +271,1174,0.230835,0.207007 +272,1175,0.231489,0.207643 +273,1176,0.232143,0.208279 +274,1177,0.232795,0.208921 +274,1178,0.232598,0.208737 +275,1179,0.233249,0.209378 +275,1180,0.233051,0.209193 +276,1181,0.233700,0.209826 +276,1182,0.233503,0.209648 +277,1183,0.234150,0.210280 +277,1184,0.233953,0.210103 +277,1185,0.233755,0.209918 +277,1186,0.233558,0.209741 +278,1187,0.234204,0.210371 +279,1188,0.234848,0.211000 +279,1189,0.234651,0.210823 +279,1190,0.234454,0.210646 +279,1191,0.234257,0.210462 +280,1192,0.234899,0.211089 +281,1193,0.235541,0.211716 +281,1194,0.235343,0.211538 +281,1195,0.235146,0.211361 +282,1196,0.235786,0.211986 +282,1197,0.235589,0.211802 +283,1198,0.236227,0.212426 +283,1199,0.236030,0.212249 +284,1200,0.236667,0.212872 +284,1201,0.236470,0.212688 +284,1202,0.236273,0.212511 +285,1203,0.236908,0.213132 +286,1204,0.237542,0.213753 +286,1205,0.237344,0.213569 +286,1206,0.237148,0.213392 +286,1207,0.236951,0.213215 +286,1208,0.236755,0.213031 +286,1209,0.236559,0.212855 +287,1210,0.237190,0.213473 +287,1211,0.236994,0.213290 +288,1212,0.237624,0.213907 +288,1213,0.237428,0.213731 +288,1214,0.237232,0.213555 +288,1215,0.237037,0.213372 +288,1216,0.236842,0.213196 +288,1217,0.236647,0.213014 +289,1218,0.237274,0.213629 +289,1219,0.237080,0.213453 +289,1220,0.236885,0.213278 +290,1221,0.237510,0.213885 +291,1222,0.238134,0.214497 +292,1223,0.238757,0.215109 +292,1224,0.238562,0.214926 +292,1225,0.238367,0.214751 +292,1226,0.238173,0.214569 +292,1227,0.237979,0.214394 +293,1228,0.238599,0.215004 +294,1229,0.239219,0.215606 +294,1230,0.239024,0.215431 +294,1231,0.238830,0.215256 +294,1232,0.238636,0.215073 +294,1233,0.238443,0.214899 +294,1234,0.238250,0.214725 +294,1235,0.238057,0.214544 +294,1236,0.237864,0.214370 +294,1237,0.237672,0.214197 +294,1238,0.237480,0.214017 +294,1239,0.237288,0.213844 +294,1240,0.237097,0.213664 +294,1241,0.236906,0.213492 +294,1242,0.236715,0.213320 +294,1243,0.236525,0.213141 +294,1244,0.236334,0.212970 +294,1245,0.236145,0.212799 +294,1246,0.235955,0.212621 +294,1247,0.235766,0.212450 +294,1248,0.235577,0.212280 +294,1249,0.235388,0.212103 +294,1250,0.235200,0.211933 +294,1251,0.235012,0.211764 +295,1252,0.235623,0.212358 +296,1253,0.236233,0.212958 +297,1254,0.236842,0.213550 +297,1255,0.236653,0.213380 +297,1256,0.236465,0.213210 +297,1257,0.236277,0.213033 +297,1258,0.236089,0.212864 +297,1259,0.235902,0.212688 +297,1260,0.235714,0.212519 +297,1261,0.235527,0.212351 +297,1262,0.235341,0.212175 +298,1263,0.235946,0.212771 +298,1264,0.235759,0.212603 +299,1265,0.236364,0.213191 +300,1266,0.236967,0.213779 +300,1267,0.236780,0.213610 +300,1268,0.236593,0.213441 +300,1269,0.236407,0.213266 +300,1270,0.236220,0.213098 +300,1271,0.236035,0.212930 +301,1272,0.236635,0.213515 +301,1273,0.236449,0.213348 +301,1274,0.236264,0.213173 +301,1275,0.236078,0.213006 +301,1276,0.235893,0.212839 +301,1277,0.235709,0.212665 +302,1278,0.236307,0.213255 +302,1279,0.236122,0.213081 +302,1280,0.235937,0.212915 +302,1281,0.235753,0.212749 +302,1282,0.235569,0.212575 +303,1283,0.236165,0.213163 +303,1284,0.235981,0.212990 +304,1285,0.236576,0.213577 +304,1286,0.236392,0.213404 +305,1287,0.236985,0.213990 +305,1288,0.236801,0.213817 +305,1289,0.236618,0.213651 +305,1290,0.236434,0.213486 +305,1291,0.236251,0.213313 +305,1292,0.236068,0.213148 +305,1293,0.235886,0.212983 +306,1294,0.236476,0.213559 +306,1295,0.236293,0.213387 +306,1296,0.236111,0.213223 +307,1297,0.236700,0.213798 +308,1298,0.237288,0.214373 +309,1299,0.237875,0.214954 +309,1300,0.237692,0.214781 +310,1301,0.238278,0.215354 +311,1302,0.238863,0.215927 +311,1303,0.238680,0.215761 +312,1304,0.239264,0.216333 +313,1305,0.239847,0.216904 +313,1306,0.239663,0.216738 +314,1307,0.240245,0.217308 +314,1308,0.240061,0.217134 +314,1309,0.239878,0.216968 +314,1310,0.239695,0.216803 +314,1311,0.239512,0.216630 +314,1312,0.239329,0.216465 +315,1313,0.239909,0.217033 +316,1314,0.240487,0.217600 +316,1315,0.240304,0.217435 +316,1316,0.240122,0.217262 +316,1317,0.239939,0.217097 +316,1318,0.239757,0.216932 +317,1319,0.240334,0.217498 +317,1320,0.240152,0.217326 +317,1321,0.239970,0.217161 +317,1322,0.239788,0.216997 +318,1323,0.240363,0.217554 +318,1324,0.240181,0.217389 +319,1325,0.240755,0.217953 +319,1326,0.240573,0.217788 +319,1327,0.240392,0.217617 +320,1328,0.240964,0.218179 +320,1329,0.240783,0.218014 +320,1330,0.240602,0.217843 +320,1331,0.240421,0.217680 +321,1332,0.240991,0.218240 +321,1333,0.240810,0.218076 +322,1334,0.241379,0.218628 +322,1335,0.241199,0.218465 +322,1336,0.241018,0.218301 +322,1337,0.240838,0.218131 +322,1338,0.240658,0.217968 +322,1339,0.240478,0.217805 +323,1340,0.241045,0.218362 +324,1341,0.241611,0.218912 +324,1342,0.241431,0.218749 +324,1343,0.241251,0.218586 +324,1344,0.241071,0.218416 +324,1345,0.240892,0.218253 +324,1346,0.240713,0.218091 +324,1347,0.240535,0.217922 +324,1348,0.240356,0.217760 +324,1349,0.240178,0.217599 +324,1350,0.240000,0.217430 +325,1351,0.240563,0.217984 +326,1352,0.241124,0.218537 +326,1353,0.240946,0.218368 +326,1354,0.240768,0.218207 +326,1355,0.240590,0.218046 +326,1356,0.240413,0.217878 +326,1357,0.240236,0.217717 +327,1358,0.240795,0.218268 +328,1359,0.241354,0.218812 +328,1360,0.241176,0.218651 +328,1361,0.240999,0.218490 +328,1362,0.240822,0.218322 +328,1363,0.240646,0.218162 +328,1364,0.240469,0.218002 +328,1365,0.240293,0.217843 +328,1366,0.240117,0.217676 +328,1367,0.239941,0.217517 +328,1368,0.239766,0.217358 +329,1369,0.240321,0.217898 +329,1370,0.240146,0.217739 +329,1371,0.239971,0.217580 +330,1372,0.240525,0.218119 +330,1373,0.240350,0.217960 +330,1374,0.240175,0.217801 +330,1375,0.240000,0.217635 +330,1376,0.239826,0.217477 +330,1377,0.239651,0.217319 +330,1378,0.239478,0.217154 +330,1379,0.239304,0.216997 +330,1380,0.239130,0.216840 +330,1381,0.238957,0.216675 +330,1382,0.238784,0.216519 +330,1383,0.238612,0.216362 +330,1384,0.238439,0.216206 +330,1385,0.238267,0.216042 +330,1386,0.238095,0.215886 +330,1387,0.237924,0.215731 +330,1388,0.237752,0.215568 +330,1389,0.237581,0.215413 +330,1390,0.237410,0.215258 +331,1391,0.237958,0.215791 +331,1392,0.237787,0.215636 +331,1393,0.237617,0.215481 +331,1394,0.237446,0.215320 +331,1395,0.237276,0.215165 +331,1396,0.237106,0.215011 +331,1397,0.236936,0.214850 +331,1398,0.236767,0.214696 +331,1399,0.236598,0.214543 +332,1400,0.237143,0.215074 +332,1401,0.236974,0.214920 +332,1402,0.236805,0.214767 +332,1403,0.236636,0.214606 +332,1404,0.236467,0.214454 +333,1405,0.237011,0.214990 +333,1406,0.236842,0.214830 +333,1407,0.236674,0.214677 +333,1408,0.236506,0.214525 +333,1409,0.236338,0.214372 +333,1410,0.236170,0.214213 +333,1411,0.236003,0.214061 +333,1412,0.235836,0.213910 +333,1413,0.235669,0.213751 +334,1414,0.236209,0.214285 +334,1415,0.236042,0.214133 +334,1416,0.235876,0.213975 +334,1417,0.235709,0.213824 +334,1418,0.235543,0.213673 +334,1419,0.235377,0.213515 +334,1420,0.235211,0.213365 +334,1421,0.235046,0.213215 +334,1422,0.234880,0.213058 +335,1423,0.235418,0.213588 +335,1424,0.235253,0.213438 +335,1425,0.235088,0.213281 +335,1426,0.234923,0.213132 +335,1427,0.234758,0.212982 +335,1428,0.234594,0.212826 +335,1429,0.234430,0.212677 +335,1430,0.234266,0.212529 +335,1431,0.234102,0.212380 +335,1432,0.233939,0.212225 +336,1433,0.234473,0.212752 +336,1434,0.234310,0.212597 +336,1435,0.234146,0.212449 +336,1436,0.233983,0.212301 +336,1437,0.233820,0.212153 +336,1438,0.233658,0.211998 +336,1439,0.233495,0.211851 +336,1440,0.233333,0.211704 +336,1441,0.233171,0.211557 +336,1442,0.233010,0.211403 +336,1443,0.232848,0.211257 +336,1444,0.232687,0.211110 +336,1445,0.232526,0.210957 +336,1446,0.232365,0.210811 +336,1447,0.232205,0.210666 +336,1448,0.232044,0.210520 +336,1449,0.231884,0.210368 +337,1450,0.232414,0.210891 +337,1451,0.232254,0.210739 +337,1452,0.232094,0.210593 +338,1453,0.232622,0.211108 +338,1454,0.232462,0.210963 +338,1455,0.232302,0.210818 +338,1456,0.232143,0.210673 +338,1457,0.231984,0.210522 +338,1458,0.231824,0.210377 +338,1459,0.231666,0.210233 +338,1460,0.231507,0.210089 +338,1461,0.231348,0.209938 +338,1462,0.231190,0.209795 +338,1463,0.231032,0.209651 +338,1464,0.230874,0.209501 +339,1465,0.231399,0.210020 +339,1466,0.231241,0.209877 +339,1467,0.231084,0.209727 +339,1468,0.230926,0.209584 +340,1469,0.231450,0.210094 +340,1470,0.231293,0.209951 +340,1471,0.231135,0.209808 +340,1472,0.230978,0.209659 +340,1473,0.230821,0.209517 +340,1474,0.230665,0.209374 +340,1475,0.230508,0.209232 +341,1476,0.231030,0.209741 +341,1477,0.230873,0.209599 +341,1478,0.230717,0.209450 +341,1479,0.230561,0.209308 +341,1480,0.230405,0.209167 +341,1481,0.230250,0.209026 +341,1482,0.230094,0.208878 +341,1483,0.229939,0.208737 +342,1484,0.230458,0.209243 +342,1485,0.230303,0.209102 +342,1486,0.230148,0.208961 +343,1487,0.230666,0.209467 +343,1488,0.230511,0.209326 +343,1489,0.230356,0.209185 +344,1490,0.230872,0.209690 +344,1491,0.230718,0.209542 +344,1492,0.230563,0.209402 +344,1493,0.230409,0.209261 +344,1494,0.230254,0.209121 +345,1495,0.230769,0.209624 +346,1496,0.231283,0.210126 +346,1497,0.231129,0.209986 +346,1498,0.230975,0.209846 +346,1499,0.230821,0.209699 +346,1500,0.230667,0.209559 +346,1501,0.230513,0.209419 +346,1502,0.230360,0.209273 +346,1503,0.230206,0.209134 +346,1504,0.230053,0.208995 +346,1505,0.229900,0.208856 +346,1506,0.229748,0.208710 +346,1507,0.229595,0.208572 +347,1508,0.230106,0.209071 +347,1509,0.229954,0.208932 +348,1510,0.230464,0.209431 +348,1511,0.230311,0.209292 +348,1512,0.230159,0.209154 +348,1513,0.230007,0.209009 +348,1514,0.229855,0.208870 +348,1515,0.229703,0.208733 +348,1516,0.229551,0.208595 +348,1517,0.229400,0.208450 +348,1518,0.229249,0.208313 +349,1519,0.229756,0.208809 +349,1520,0.229605,0.208672 +349,1521,0.229454,0.208535 +349,1522,0.229304,0.208391 +350,1523,0.229810,0.208893 +351,1524,0.230315,0.209387 +352,1525,0.230820,0.209881 +352,1526,0.230668,0.209737 +353,1527,0.231172,0.210230 +353,1528,0.231021,0.210092 +353,1529,0.230870,0.209955 +354,1530,0.231373,0.210447 +354,1531,0.231221,0.210310 +354,1532,0.231070,0.210166 +354,1533,0.230920,0.210029 +354,1534,0.230769,0.209892 +355,1535,0.231270,0.210383 +355,1536,0.231120,0.210246 +355,1537,0.230969,0.210102 +355,1538,0.230819,0.209965 +355,1539,0.230669,0.209829 +355,1540,0.230519,0.209693 +355,1541,0.230370,0.209550 +355,1542,0.230220,0.209414 +356,1543,0.230719,0.209903 +356,1544,0.230570,0.209767 +356,1545,0.230421,0.209631 +356,1546,0.230272,0.209488 +357,1547,0.230769,0.209976 +358,1548,0.231266,0.210464 +358,1549,0.231117,0.210328 +359,1550,0.231613,0.210815 +359,1551,0.231464,0.210679 +359,1552,0.231314,0.210536 +359,1553,0.231165,0.210400 +359,1554,0.231017,0.210265 +359,1555,0.230868,0.210130 +359,1556,0.230720,0.209988 +359,1557,0.230572,0.209853 +359,1558,0.230424,0.209718 +359,1559,0.230276,0.209583 +359,1560,0.230128,0.209442 +359,1561,0.229981,0.209308 +359,1562,0.229834,0.209174 +359,1563,0.229687,0.209040 +359,1564,0.229540,0.208899 +359,1565,0.229393,0.208766 +359,1566,0.229246,0.208633 +359,1567,0.229100,0.208499 +360,1568,0.229592,0.208975 +360,1569,0.229446,0.208842 +361,1570,0.229936,0.209324 +361,1571,0.229790,0.209190 +362,1572,0.230280,0.209672 +362,1573,0.230134,0.209531 +363,1574,0.230623,0.210012 +363,1575,0.230476,0.209878 +363,1576,0.230330,0.209745 +364,1577,0.230818,0.210225 +364,1578,0.230672,0.210085 +364,1579,0.230526,0.209952 +365,1580,0.231013,0.210430 +365,1581,0.230867,0.210297 +365,1582,0.230721,0.210157 +366,1583,0.231207,0.210635 +366,1584,0.231061,0.210502 +367,1585,0.231546,0.210980 +368,1586,0.232030,0.211449 +368,1587,0.231884,0.211316 +368,1588,0.231738,0.211183 +368,1589,0.231592,0.211050 +369,1590,0.232075,0.211519 +370,1591,0.232558,0.211994 +371,1592,0.233040,0.212469 +372,1593,0.233522,0.212937 +372,1594,0.233375,0.212803 +372,1595,0.233229,0.212670 +372,1596,0.233083,0.212536 +372,1597,0.232937,0.212396 +372,1598,0.232791,0.212263 +372,1599,0.232645,0.212131 +372,1600,0.232500,0.211998 +372,1601,0.232355,0.211859 +372,1602,0.232210,0.211726 +372,1603,0.232065,0.211594 +372,1604,0.231920,0.211462 +372,1605,0.231776,0.211323 +372,1606,0.231631,0.211192 +372,1607,0.231487,0.211060 +372,1608,0.231343,0.210929 +372,1609,0.231200,0.210791 +372,1610,0.231056,0.210660 +372,1611,0.230912,0.210529 +372,1612,0.230769,0.210399 +373,1613,0.231246,0.210862 +373,1614,0.231103,0.210731 +373,1615,0.230960,0.210601 +373,1616,0.230817,0.210470 +373,1617,0.230674,0.210333 +373,1618,0.230532,0.210203 +373,1619,0.230389,0.210073 +373,1620,0.230247,0.209944 +373,1621,0.230105,0.209807 +373,1622,0.229963,0.209678 +374,1623,0.230437,0.210145 +375,1624,0.230911,0.210606 +375,1625,0.230769,0.210476 +376,1626,0.231242,0.210943 +376,1627,0.231100,0.210813 +376,1628,0.230958,0.210677 +376,1629,0.230816,0.210547 +377,1630,0.231288,0.211013 +377,1631,0.231147,0.210877 +378,1632,0.231618,0.211342 +378,1633,0.231476,0.211212 +378,1634,0.231334,0.211076 +378,1635,0.231193,0.210947 +378,1636,0.231051,0.210818 +379,1637,0.231521,0.211275 +380,1638,0.231990,0.211739 +380,1639,0.231849,0.211609 +380,1640,0.231707,0.211480 +381,1641,0.232176,0.211936 +381,1642,0.232034,0.211807 +382,1643,0.232502,0.212262 +382,1644,0.232360,0.212133 +382,1645,0.232219,0.212004 +382,1646,0.232078,0.211875 +382,1647,0.231937,0.211739 +383,1648,0.232403,0.212200 +383,1649,0.232262,0.212072 +384,1650,0.232727,0.212525 +384,1651,0.232586,0.212396 +385,1652,0.233051,0.212849 +385,1653,0.232910,0.212720 +386,1654,0.233374,0.213172 +386,1655,0.233233,0.213043 +387,1656,0.233696,0.213495 +388,1657,0.234158,0.213953 +388,1658,0.234017,0.213824 +389,1659,0.234479,0.214274 +389,1660,0.234337,0.214145 +390,1661,0.234798,0.214595 +390,1662,0.234657,0.214466 +390,1663,0.234516,0.214337 +390,1664,0.234375,0.214201 +390,1665,0.234234,0.214073 +391,1666,0.234694,0.214521 +391,1667,0.234553,0.214393 +391,1668,0.234412,0.214264 +391,1669,0.234272,0.214136 +391,1670,0.234132,0.214007 +391,1671,0.233992,0.213872 +391,1672,0.233852,0.213744 +392,1673,0.234310,0.214192 +392,1674,0.234170,0.214064 +392,1675,0.234030,0.213936 +392,1676,0.233890,0.213808 +392,1677,0.233751,0.213681 +392,1678,0.233611,0.213546 +392,1679,0.233472,0.213419 +392,1680,0.233333,0.213292 +392,1681,0.233195,0.213165 +392,1682,0.233056,0.213031 +393,1683,0.233512,0.213483 +393,1684,0.233373,0.213349 +393,1685,0.233234,0.213223 +393,1686,0.233096,0.213096 +393,1687,0.232958,0.212970 +394,1688,0.233412,0.213414 +395,1689,0.233866,0.213858 +395,1690,0.233728,0.213731 +395,1691,0.233590,0.213605 +395,1692,0.233452,0.213478 +395,1693,0.233314,0.213345 +395,1694,0.233176,0.213219 +395,1695,0.233038,0.213093 +396,1696,0.233491,0.213535 +396,1697,0.233353,0.213410 +396,1698,0.233216,0.213284 +396,1699,0.233078,0.213158 +397,1700,0.233529,0.213599 +398,1701,0.233980,0.214040 +398,1702,0.233843,0.213914 +398,1703,0.233705,0.213789 +399,1704,0.234155,0.214229 +399,1705,0.234018,0.214096 +399,1706,0.233880,0.213970 +399,1707,0.233743,0.213845 +400,1708,0.234192,0.214284 +400,1709,0.234055,0.214159 +400,1710,0.233918,0.214034 +400,1711,0.233781,0.213908 +400,1712,0.233645,0.213776 +401,1713,0.234092,0.214214 +401,1714,0.233956,0.214089 +401,1715,0.233819,0.213964 +401,1716,0.233683,0.213840 +401,1717,0.233547,0.213715 +401,1718,0.233411,0.213584 +401,1719,0.233275,0.213459 +401,1720,0.233140,0.213335 +402,1721,0.233585,0.213772 +403,1722,0.234030,0.214207 +403,1723,0.233894,0.214083 +403,1724,0.233759,0.213959 +403,1725,0.233623,0.213835 +403,1726,0.233488,0.213704 +404,1727,0.233932,0.214139 +404,1728,0.233796,0.214015 +404,1729,0.233661,0.213891 +405,1730,0.234104,0.214325 +406,1731,0.234547,0.214759 +406,1732,0.234411,0.214635 +406,1733,0.234276,0.214511 +406,1734,0.234141,0.214387 +406,1735,0.234006,0.214257 +407,1736,0.234447,0.214689 +408,1737,0.234888,0.215121 +408,1738,0.234753,0.214998 +409,1739,0.235193,0.215429 +409,1740,0.235057,0.215306 +409,1741,0.234922,0.215182 +409,1742,0.234788,0.215058 +410,1743,0.235227,0.215489 +410,1744,0.235092,0.215358 +410,1745,0.234957,0.215235 +410,1746,0.234822,0.215112 +410,1747,0.234688,0.214989 +410,1748,0.234554,0.214866 +410,1749,0.234420,0.214736 +411,1750,0.234857,0.215165 +411,1751,0.234723,0.215042 +412,1752,0.235160,0.215471 +412,1753,0.235026,0.215348 +412,1754,0.234892,0.215225 +412,1755,0.234758,0.215103 +412,1756,0.234624,0.214973 +413,1757,0.235060,0.215401 +413,1758,0.234926,0.215278 +413,1759,0.234792,0.215156 +413,1760,0.234659,0.215034 +413,1761,0.234526,0.214912 +413,1762,0.234393,0.214783 +413,1763,0.234260,0.214661 +413,1764,0.234127,0.214539 +413,1765,0.233994,0.214417 +413,1766,0.233862,0.214289 +413,1767,0.233729,0.214168 +413,1768,0.233597,0.214046 +413,1769,0.233465,0.213925 +413,1770,0.233333,0.213805 +413,1771,0.233202,0.213677 +413,1772,0.233070,0.213556 +413,1773,0.232939,0.213436 +413,1774,0.232807,0.213315 +414,1775,0.233239,0.213740 +414,1776,0.233108,0.213620 +415,1777,0.233540,0.214036 +416,1778,0.233971,0.214460 +416,1779,0.233839,0.214340 +416,1780,0.233708,0.214219 +416,1781,0.233577,0.214099 +417,1782,0.234007,0.214522 +417,1783,0.233875,0.214401 +418,1784,0.234305,0.214816 +418,1785,0.234174,0.214696 +419,1786,0.234602,0.215118 +419,1787,0.234471,0.214998 +419,1788,0.234340,0.214877 +419,1789,0.234209,0.214757 +420,1790,0.234637,0.215171 +420,1791,0.234506,0.215051 +420,1792,0.234375,0.214931 +420,1793,0.234244,0.214811 +420,1794,0.234114,0.214691 +421,1795,0.234540,0.215104 +421,1796,0.234410,0.214984 +421,1797,0.234279,0.214865 +421,1798,0.234149,0.214745 +421,1799,0.234019,0.214626 +421,1800,0.233889,0.214499 +422,1801,0.234314,0.214918 +423,1802,0.234739,0.215336 +424,1803,0.235164,0.215754 +424,1804,0.235033,0.215635 +424,1805,0.234903,0.215515 +425,1806,0.235327,0.215926 +425,1807,0.235196,0.215806 +425,1808,0.235066,0.215687 +426,1809,0.235489,0.216103 +426,1810,0.235359,0.215984 +426,1811,0.235229,0.215858 +426,1812,0.235099,0.215739 +426,1813,0.234970,0.215620 +426,1814,0.234840,0.215501 +426,1815,0.234711,0.215382 +426,1816,0.234581,0.215256 +426,1817,0.234452,0.215138 +426,1818,0.234323,0.215019 +426,1819,0.234195,0.214901 +426,1820,0.234066,0.214783 +426,1821,0.233937,0.214658 +426,1822,0.233809,0.214540 +426,1823,0.233681,0.214422 +426,1824,0.233553,0.214305 +426,1825,0.233425,0.214187 +426,1826,0.233297,0.214063 +426,1827,0.233169,0.213946 +427,1828,0.233589,0.214359 +427,1829,0.233461,0.214242 +428,1830,0.233880,0.214648 +428,1831,0.233752,0.214531 +428,1832,0.233624,0.214414 +428,1833,0.233497,0.214297 +428,1834,0.233370,0.214180 +429,1835,0.233787,0.214585 +429,1836,0.233660,0.214468 +430,1837,0.234077,0.214879 +431,1838,0.234494,0.215290 +432,1839,0.234910,0.215694 +433,1840,0.235326,0.216105 +433,1841,0.235198,0.215987 +433,1842,0.235071,0.215870 +434,1843,0.235486,0.216273 +435,1844,0.235900,0.216682 +435,1845,0.235772,0.216565 +435,1846,0.235645,0.216447 +435,1847,0.235517,0.216330 +436,1848,0.235931,0.216732 +436,1849,0.235803,0.216615 +436,1850,0.235676,0.216498 +436,1851,0.235548,0.216381 +437,1852,0.235961,0.216781 +437,1853,0.235834,0.216664 +437,1854,0.235707,0.216548 +437,1855,0.235580,0.216431 +437,1856,0.235453,0.216314 +438,1857,0.235864,0.216714 +438,1858,0.235737,0.216597 +438,1859,0.235611,0.216481 +438,1860,0.235484,0.216364 +439,1861,0.235895,0.216764 +439,1862,0.235768,0.216647 +439,1863,0.235641,0.216531 +439,1864,0.235515,0.216415 +440,1865,0.235925,0.216813 +440,1866,0.235798,0.216697 +440,1867,0.235672,0.216581 +440,1868,0.235546,0.216465 +441,1869,0.235955,0.216862 +441,1870,0.235829,0.216746 +441,1871,0.235703,0.216630 +442,1872,0.236111,0.217034 +442,1873,0.235985,0.216911 +442,1874,0.235859,0.216796 +442,1875,0.235733,0.216680 +443,1876,0.236141,0.217083 +443,1877,0.236015,0.216960 +443,1878,0.235889,0.216845 +443,1879,0.235764,0.216729 +443,1880,0.235638,0.216614 +443,1881,0.235513,0.216499 +443,1882,0.235388,0.216377 +444,1883,0.235794,0.216779 +445,1884,0.236200,0.217181 +445,1885,0.236074,0.217058 +445,1886,0.235949,0.216943 +445,1887,0.235824,0.216828 +445,1888,0.235699,0.216713 +445,1889,0.235574,0.216599 +445,1890,0.235450,0.216477 +445,1891,0.235325,0.216362 +445,1892,0.235201,0.216248 +445,1893,0.235077,0.216134 +446,1894,0.235480,0.216527 +446,1895,0.235356,0.216412 +446,1896,0.235232,0.216298 +447,1897,0.235635,0.216698 +447,1898,0.235511,0.216576 +447,1899,0.235387,0.216462 +447,1900,0.235263,0.216348 +448,1901,0.235665,0.216740 +449,1902,0.236067,0.217138 +449,1903,0.235943,0.217024 +449,1904,0.235819,0.216910 +449,1905,0.235696,0.216789 +449,1906,0.235572,0.216675 +449,1907,0.235448,0.216562 +450,1908,0.235849,0.216959 +450,1909,0.235726,0.216838 +450,1910,0.235602,0.216725 +451,1911,0.236002,0.217121 +451,1912,0.235879,0.217001 +451,1913,0.235755,0.216887 +451,1914,0.235632,0.216774 +452,1915,0.236031,0.217170 +452,1916,0.235908,0.217049 +452,1917,0.235785,0.216936 +452,1918,0.235662,0.216823 +452,1919,0.235539,0.216710 +452,1920,0.235417,0.216597 +452,1921,0.235294,0.216477 +452,1922,0.235172,0.216365 +452,1923,0.235049,0.216252 +452,1924,0.234927,0.216140 +452,1925,0.234805,0.216028 +452,1926,0.234683,0.215915 +453,1927,0.235080,0.216302 +454,1928,0.235477,0.216689 +454,1929,0.235355,0.216577 +454,1930,0.235233,0.216464 +454,1931,0.235111,0.216352 +454,1932,0.234990,0.216240 +454,1933,0.234868,0.216128 +454,1934,0.234747,0.216009 +454,1935,0.234625,0.215898 +454,1936,0.234504,0.215786 +454,1937,0.234383,0.215675 +454,1938,0.234262,0.215564 +454,1939,0.234141,0.215445 +454,1940,0.234021,0.215334 +454,1941,0.233900,0.215223 +454,1942,0.233780,0.215112 +454,1943,0.233659,0.215002 +454,1944,0.233539,0.214891 +454,1945,0.233419,0.214774 +454,1946,0.233299,0.214663 +454,1947,0.233179,0.214553 +454,1948,0.233060,0.214443 +454,1949,0.232940,0.214333 +454,1950,0.232821,0.214216 +455,1951,0.233214,0.214606 +455,1952,0.233094,0.214496 +455,1953,0.232975,0.214386 +455,1954,0.232856,0.214269 +455,1955,0.232737,0.214160 +455,1956,0.232618,0.214050 +455,1957,0.232499,0.213941 +456,1958,0.232891,0.214323 +457,1959,0.233282,0.214712 +457,1960,0.233163,0.214595 +458,1961,0.233554,0.214984 +458,1962,0.233435,0.214874 +458,1963,0.233316,0.214765 +458,1964,0.233198,0.214648 +458,1965,0.233079,0.214539 +458,1966,0.232960,0.214430 +458,1967,0.232842,0.214321 +458,1968,0.232724,0.214212 +458,1969,0.232605,0.214096 +458,1970,0.232487,0.213987 +458,1971,0.232369,0.213879 +458,1972,0.232252,0.213770 +458,1973,0.232134,0.213662 +458,1974,0.232016,0.213554 +458,1975,0.231899,0.213438 +458,1976,0.231781,0.213330 +458,1977,0.231664,0.213222 +458,1978,0.231547,0.213115 +459,1979,0.231935,0.213493 +459,1980,0.231818,0.213385 +459,1981,0.231701,0.213278 +459,1982,0.231584,0.213170 +459,1983,0.231467,0.213063 +459,1984,0.231351,0.212948 +460,1985,0.231738,0.213333 +460,1986,0.231621,0.213226 +461,1987,0.232008,0.213603 +462,1988,0.232394,0.213980 +462,1989,0.232278,0.213872 +462,1990,0.232161,0.213765 +463,1991,0.232546,0.214141 +463,1992,0.232430,0.214034 +463,1993,0.232313,0.213926 +464,1994,0.232698,0.214302 +464,1995,0.232581,0.214195 +465,1996,0.232966,0.214577 +466,1997,0.233350,0.214952 +466,1998,0.233233,0.214845 +466,1999,0.233117,0.214737 +466,2000,0.233000,0.214623 +466,2001,0.232884,0.214515 +466,2002,0.232767,0.214408 +467,2003,0.233150,0.214782 +467,2004,0.233034,0.214675 +468,2005,0.233416,0.215049 +469,2006,0.233799,0.215430 +470,2007,0.234180,0.215803 +470,2008,0.234064,0.215695 +470,2009,0.233947,0.215588 +470,2010,0.233831,0.215474 +470,2011,0.233715,0.215366 +470,2012,0.233598,0.215259 +471,2013,0.233979,0.215632 +471,2014,0.233863,0.215525 +472,2015,0.234243,0.215904 +472,2016,0.234127,0.215789 +472,2017,0.234011,0.215682 +472,2018,0.233895,0.215576 +472,2019,0.233779,0.215469 +472,2020,0.233663,0.215362 +472,2021,0.233548,0.215248 +472,2022,0.233432,0.215142 +472,2023,0.233317,0.215036 +473,2024,0.233696,0.215406 +473,2025,0.233580,0.215300 +473,2026,0.233465,0.215193 +474,2027,0.233843,0.215563 +474,2028,0.233728,0.215457 +474,2029,0.233613,0.215351 +474,2030,0.233498,0.215245 +474,2031,0.233383,0.215139 +475,2032,0.233760,0.215508 +476,2033,0.234137,0.215877 +476,2034,0.234022,0.215771 +477,2035,0.234398,0.216139 +477,2036,0.234283,0.216033 +477,2037,0.234168,0.215927 +477,2038,0.234053,0.215821 +477,2039,0.233938,0.215708 +477,2040,0.233824,0.215602 +477,2041,0.233709,0.215497 +477,2042,0.233595,0.215391 +478,2043,0.233970,0.215759 +478,2044,0.233855,0.215653 +479,2045,0.234230,0.216020 +479,2046,0.234115,0.215914 +479,2047,0.234001,0.215809 +479,2048,0.233887,0.215704 +480,2049,0.234261,0.216070 +480,2050,0.234146,0.215964 +480,2051,0.234032,0.215852 +480,2052,0.233918,0.215747 +480,2053,0.233804,0.215642 +481,2054,0.234177,0.216007 +481,2055,0.234063,0.215902 +481,2056,0.233949,0.215797 +482,2057,0.234322,0.216162 +482,2058,0.234208,0.216057 +482,2059,0.234094,0.215952 +482,2060,0.233981,0.215847 +483,2061,0.234352,0.216212 +483,2062,0.234239,0.216107 +483,2063,0.234125,0.215995 +483,2064,0.234012,0.215890 +483,2065,0.233898,0.215786 +483,2066,0.233785,0.215681 +483,2067,0.233672,0.215577 +483,2068,0.233559,0.215473 +484,2069,0.233929,0.215836 +484,2070,0.233816,0.215731 +485,2071,0.234186,0.216094 +485,2072,0.234073,0.215990 +485,2073,0.233960,0.215879 +486,2074,0.234330,0.216248 +486,2075,0.234217,0.216137 +486,2076,0.234104,0.216033 +486,2077,0.233991,0.215929 +486,2078,0.233879,0.215825 +487,2079,0.234247,0.216186 +487,2080,0.234135,0.216082 +487,2081,0.234022,0.215978 +487,2082,0.233910,0.215868 +487,2083,0.233797,0.215764 +487,2084,0.233685,0.215660 +487,2085,0.233573,0.215557 +487,2086,0.233461,0.215454 +488,2087,0.233828,0.215814 +488,2088,0.233716,0.215711 +489,2089,0.234083,0.216071 +489,2090,0.233971,0.215967 +489,2091,0.233859,0.215864 +489,2092,0.233748,0.215754 +489,2093,0.233636,0.215650 +489,2094,0.233524,0.215548 +489,2095,0.233413,0.215445 +489,2096,0.233302,0.215342 +490,2097,0.233667,0.215701 +491,2098,0.234032,0.216059 +491,2099,0.233921,0.215956 +491,2100,0.233810,0.215854 +491,2101,0.233698,0.215744 +491,2102,0.233587,0.215641 +491,2103,0.233476,0.215538 +491,2104,0.233365,0.215436 +491,2105,0.233254,0.215334 +491,2106,0.233143,0.215231 +491,2107,0.233033,0.215122 +492,2108,0.233397,0.215487 +492,2109,0.233286,0.215377 +493,2110,0.233649,0.215734 +494,2111,0.234012,0.216091 +494,2112,0.233902,0.215988 +495,2113,0.234264,0.216345 +495,2114,0.234153,0.216242 +495,2115,0.234043,0.216140 +495,2116,0.233932,0.216038 +495,2117,0.233821,0.215936 +495,2118,0.233711,0.215834 +495,2119,0.233601,0.215725 +495,2120,0.233491,0.215623 +495,2121,0.233380,0.215522 +495,2122,0.233270,0.215420 +495,2123,0.233161,0.215319 +496,2124,0.233522,0.215673 +496,2125,0.233412,0.215572 +496,2126,0.233302,0.215463 +496,2127,0.233192,0.215362 +496,2128,0.233083,0.215261 +496,2129,0.232973,0.215160 +496,2130,0.232864,0.215059 +497,2131,0.233224,0.215412 +497,2132,0.233114,0.215311 +498,2133,0.233474,0.215665 +498,2134,0.233365,0.215564 +499,2135,0.233724,0.215917 +499,2136,0.233614,0.215809 +499,2137,0.233505,0.215708 +499,2138,0.233396,0.215607 +500,2139,0.233754,0.215959 +500,2140,0.233645,0.215858 +500,2141,0.233536,0.215758 +501,2142,0.233894,0.216110 +502,2143,0.234251,0.216461 +502,2144,0.234142,0.216360 +502,2145,0.234033,0.216252 +502,2146,0.233924,0.216152 +503,2147,0.234280,0.216503 +503,2148,0.234171,0.216402 +503,2149,0.234062,0.216301 +504,2150,0.234419,0.216652 +504,2151,0.234310,0.216551 +504,2152,0.234201,0.216451 +504,2153,0.234092,0.216343 +504,2154,0.233983,0.216242 +504,2155,0.233875,0.216142 +505,2156,0.234230,0.216492 +505,2157,0.234121,0.216392 +505,2158,0.234013,0.216291 +505,2159,0.233905,0.216191 +505,2160,0.233796,0.216084 +505,2161,0.233688,0.215984 +506,2162,0.234043,0.216333 +506,2163,0.233934,0.216233 +506,2164,0.233826,0.216133 +506,2165,0.233718,0.216033 +507,2166,0.234072,0.216382 +507,2167,0.233964,0.216275 +507,2168,0.233856,0.216175 +507,2169,0.233748,0.216075 +507,2170,0.233641,0.215976 +507,2171,0.233533,0.215876 +507,2172,0.233425,0.215777 +507,2173,0.233318,0.215677 +507,2174,0.233211,0.215571 +507,2175,0.233103,0.215472 +507,2176,0.232996,0.215373 +507,2177,0.232889,0.215274 +507,2178,0.232782,0.215175 +507,2179,0.232676,0.215076 +507,2180,0.232569,0.214971 +508,2181,0.232921,0.215317 +508,2182,0.232814,0.215219 +509,2183,0.233165,0.215565 +509,2184,0.233059,0.215466 +510,2185,0.233410,0.215812 +510,2186,0.233303,0.215713 +510,2187,0.233196,0.215615 +510,2188,0.233090,0.215509 +511,2189,0.233440,0.215854 +511,2190,0.233333,0.215756 +511,2191,0.233227,0.215657 +512,2192,0.233577,0.216002 +512,2193,0.233470,0.215904 +512,2194,0.233364,0.215805 +512,2195,0.233257,0.215700 +513,2196,0.233607,0.216044 +514,2197,0.233955,0.216388 +514,2198,0.233849,0.216290 +514,2199,0.233743,0.216191 +514,2200,0.233636,0.216093 +514,2201,0.233530,0.215995 +514,2202,0.233424,0.215890 +515,2203,0.233772,0.216233 +515,2204,0.233666,0.216135 +516,2205,0.234014,0.216478 +516,2206,0.233908,0.216379 +516,2207,0.233802,0.216281 +516,2208,0.233696,0.216183 +516,2209,0.233590,0.216078 +516,2210,0.233484,0.215981 +516,2211,0.233379,0.215883 +517,2212,0.233725,0.216225 +517,2213,0.233620,0.216127 +517,2214,0.233514,0.216030 +518,2215,0.233860,0.216371 +518,2216,0.233755,0.216266 +518,2217,0.233649,0.216169 +518,2218,0.233544,0.216071 +518,2219,0.233438,0.215974 +519,2220,0.233784,0.216315 +519,2221,0.233679,0.216218 +519,2222,0.233573,0.216113 +520,2223,0.233918,0.216454 +520,2224,0.233813,0.216356 +520,2225,0.233708,0.216259 +521,2226,0.234052,0.216599 +522,2227,0.234396,0.216939 +522,2228,0.234291,0.216834 +522,2229,0.234186,0.216737 +522,2230,0.234081,0.216640 +522,2231,0.233976,0.216543 +522,2232,0.233871,0.216446 +522,2233,0.233766,0.216349 +523,2234,0.234109,0.216687 +524,2235,0.234452,0.217019 +524,2236,0.234347,0.216922 +524,2237,0.234242,0.216825 +524,2238,0.234138,0.216728 +524,2239,0.234033,0.216631 +524,2240,0.233929,0.216535 +525,2241,0.234270,0.216865 +525,2242,0.234166,0.216769 +525,2243,0.234062,0.216672 +525,2244,0.233957,0.216575 +525,2245,0.233853,0.216479 +526,2246,0.234194,0.216816 +526,2247,0.234090,0.216712 +526,2248,0.233986,0.216616 +526,2249,0.233882,0.216520 +526,2250,0.233778,0.216424 +527,2251,0.234118,0.216760 +527,2252,0.234014,0.216664 +528,2253,0.234354,0.216993 +528,2254,0.234250,0.216897 +528,2255,0.234146,0.216800 +528,2256,0.234043,0.216704 +528,2257,0.233939,0.216608 +528,2258,0.233835,0.216512 +528,2259,0.233732,0.216409 +528,2260,0.233628,0.216314 +529,2261,0.233967,0.216649 +529,2262,0.233864,0.216553 +529,2263,0.233760,0.216457 +529,2264,0.233657,0.216362 +529,2265,0.233554,0.216266 +529,2266,0.233451,0.216164 +529,2267,0.233348,0.216068 +529,2268,0.233245,0.215973 +529,2269,0.233142,0.215878 +530,2270,0.233480,0.216212 +530,2271,0.233377,0.216117 +530,2272,0.233275,0.216015 +531,2273,0.233612,0.216348 +531,2274,0.233509,0.216253 +531,2275,0.233407,0.216158 +531,2276,0.233304,0.216063 +531,2277,0.233202,0.215968 +531,2278,0.233099,0.215866 +531,2279,0.232997,0.215772 +532,2280,0.233333,0.216105 +532,2281,0.233231,0.216010 +532,2282,0.233129,0.215915 +532,2283,0.233027,0.215821 +532,2284,0.232925,0.215719 +532,2285,0.232823,0.215625 +532,2286,0.232721,0.215530 +532,2287,0.232619,0.215436 +532,2288,0.232517,0.215342 +533,2289,0.232853,0.215674 +533,2290,0.232751,0.215572 +534,2291,0.233086,0.215904 +534,2292,0.232984,0.215810 +534,2293,0.232883,0.215716 +534,2294,0.232781,0.215622 +534,2295,0.232680,0.215528 +534,2296,0.232578,0.215427 +534,2297,0.232477,0.215333 +534,2298,0.232376,0.215239 +535,2299,0.232710,0.215570 +535,2300,0.232609,0.215476 +535,2301,0.232508,0.215382 +536,2302,0.232841,0.215706 +536,2303,0.232740,0.215612 +537,2304,0.233073,0.215942 +537,2305,0.232972,0.215848 +537,2306,0.232871,0.215754 +537,2307,0.232770,0.215654 +538,2308,0.233102,0.215983 +539,2309,0.233434,0.216312 +539,2310,0.233333,0.216219 +540,2311,0.233665,0.216540 +540,2312,0.233564,0.216447 +540,2313,0.233463,0.216353 +541,2314,0.233794,0.216681 +541,2315,0.233693,0.216588 +542,2316,0.234024,0.216909 +542,2317,0.233923,0.216815 +542,2318,0.233822,0.216722 +542,2319,0.233721,0.216628 +542,2320,0.233621,0.216535 +542,2321,0.233520,0.216434 +542,2322,0.233419,0.216341 +542,2323,0.233319,0.216248 +542,2324,0.233219,0.216155 +542,2325,0.233118,0.216062 +542,2326,0.233018,0.215969 +542,2327,0.232918,0.215876 +543,2328,0.233247,0.216196 +544,2329,0.233577,0.216522 +544,2330,0.233476,0.216430 +545,2331,0.233805,0.216749 +545,2332,0.233705,0.216656 +545,2333,0.233605,0.216563 +546,2334,0.233933,0.216889 +546,2335,0.233833,0.216796 +546,2336,0.233733,0.216703 +546,2337,0.233633,0.216603 +546,2338,0.233533,0.216510 +546,2339,0.233433,0.216418 +547,2340,0.233761,0.216743 +548,2341,0.234088,0.217061 +549,2342,0.234415,0.217385 +549,2343,0.234315,0.217293 +549,2344,0.234215,0.217200 +549,2345,0.234115,0.217107 +549,2346,0.234015,0.217008 +549,2347,0.233916,0.216915 +549,2348,0.233816,0.216823 +549,2349,0.233716,0.216731 +550,2350,0.234043,0.217054 +551,2351,0.234368,0.217371 +551,2352,0.234269,0.217278 +551,2353,0.234169,0.217186 +551,2354,0.234070,0.217094 +551,2355,0.233970,0.217002 +551,2356,0.233871,0.216902 +552,2357,0.234196,0.217225 +552,2358,0.234097,0.217133 +552,2359,0.233997,0.217041 +552,2360,0.233898,0.216949 +552,2361,0.233799,0.216857 +552,2362,0.233700,0.216758 +552,2363,0.233601,0.216667 +552,2364,0.233503,0.216575 +552,2365,0.233404,0.216483 +552,2366,0.233305,0.216392 +552,2367,0.233207,0.216300 +553,2368,0.233530,0.216615 +553,2369,0.233432,0.216524 +554,2370,0.233755,0.216845 +554,2371,0.233657,0.216754 +554,2372,0.233558,0.216655 +554,2373,0.233460,0.216564 +555,2374,0.233783,0.216885 +556,2375,0.234105,0.217198 +556,2376,0.234007,0.217107 +557,2377,0.234329,0.217427 +557,2378,0.234230,0.217336 +558,2379,0.234552,0.217649 +558,2380,0.234454,0.217557 +559,2381,0.234775,0.217877 +559,2382,0.234677,0.217786 +560,2383,0.234998,0.218098 +560,2384,0.234899,0.218007 +560,2385,0.234801,0.217915 +560,2386,0.234702,0.217824 +560,2387,0.234604,0.217733 +560,2388,0.234506,0.217634 +561,2389,0.234826,0.217953 +561,2390,0.234728,0.217862 +561,2391,0.234630,0.217771 +561,2392,0.234532,0.217680 +561,2393,0.234434,0.217582 +561,2394,0.234336,0.217491 +561,2395,0.234238,0.217400 +562,2396,0.234558,0.217718 +562,2397,0.234460,0.217620 +562,2398,0.234362,0.217529 +563,2399,0.234681,0.217847 +563,2400,0.234583,0.217756 +563,2401,0.234486,0.217666 +564,2402,0.234804,0.217976 +564,2403,0.234707,0.217885 +564,2404,0.234609,0.217794 +564,2405,0.234511,0.217704 +564,2406,0.234414,0.217613 +564,2407,0.234317,0.217516 +565,2408,0.234635,0.217832 +566,2409,0.234952,0.218142 +566,2410,0.234855,0.218051 +566,2411,0.234757,0.217961 +566,2412,0.234660,0.217870 +566,2413,0.234563,0.217780 +566,2414,0.234466,0.217690 +566,2415,0.234369,0.217600 +567,2416,0.234685,0.217908 +567,2417,0.234588,0.217818 +567,2418,0.234491,0.217728 +567,2419,0.234394,0.217638 +567,2420,0.234298,0.217548 +568,2421,0.234614,0.217856 +568,2422,0.234517,0.217766 +569,2423,0.234833,0.218074 +569,2424,0.234736,0.217984 +569,2425,0.234639,0.217894 +569,2426,0.234542,0.217804 +569,2427,0.234446,0.217715 +569,2428,0.234349,0.217625 +569,2429,0.234253,0.217535 +570,2430,0.234568,0.217842 +571,2431,0.234883,0.218156 +572,2432,0.235197,0.218463 +573,2433,0.235512,0.218769 +573,2434,0.235415,0.218679 +573,2435,0.235318,0.218589 +573,2436,0.235222,0.218500 +573,2437,0.235125,0.218410 +573,2438,0.235029,0.218320 +573,2439,0.234932,0.218231 +573,2440,0.234836,0.218141 +573,2441,0.234740,0.218045 +574,2442,0.235053,0.218357 +574,2443,0.234957,0.218268 +574,2444,0.234861,0.218179 +574,2445,0.234765,0.218082 +574,2446,0.234669,0.217993 +574,2447,0.234573,0.217904 +574,2448,0.234477,0.217815 +574,2449,0.234381,0.217726 +575,2450,0.234694,0.218031 +575,2451,0.234598,0.217942 +575,2452,0.234502,0.217853 +575,2453,0.234407,0.217764 +575,2454,0.234311,0.217675 +575,2455,0.234216,0.217587 +575,2456,0.234121,0.217498 +575,2457,0.234025,0.217403 +575,2458,0.233930,0.217314 +576,2459,0.234242,0.217625 +576,2460,0.234146,0.217536 +576,2461,0.234051,0.217441 +577,2462,0.234362,0.217751 +577,2463,0.234267,0.217663 +577,2464,0.234172,0.217575 +577,2465,0.234077,0.217479 +577,2466,0.233982,0.217391 +578,2467,0.234293,0.217701 +578,2468,0.234198,0.217613 +579,2469,0.234508,0.217915 +579,2470,0.234413,0.217827 +579,2471,0.234318,0.217739 +580,2472,0.234628,0.218041 +580,2473,0.234533,0.217953 +580,2474,0.234438,0.217865 +580,2475,0.234343,0.217777 +580,2476,0.234249,0.217689 +581,2477,0.234558,0.217990 +581,2478,0.234463,0.217902 +581,2479,0.234369,0.217815 +581,2480,0.234274,0.217727 +581,2481,0.234180,0.217639 +581,2482,0.234085,0.217544 +581,2483,0.233991,0.217457 +581,2484,0.233897,0.217369 +581,2485,0.233803,0.217282 +582,2486,0.234111,0.217582 +582,2487,0.234017,0.217495 +583,2488,0.234325,0.217802 +583,2489,0.234231,0.217715 +583,2490,0.234137,0.217620 +583,2491,0.234043,0.217533 +584,2492,0.234350,0.217840 +584,2493,0.234256,0.217753 +584,2494,0.234162,0.217658 +585,2495,0.234469,0.217965 +585,2496,0.234375,0.217878 +585,2497,0.234281,0.217790 +585,2498,0.234187,0.217696 +585,2499,0.234094,0.217609 +585,2500,0.234000,0.217522 +585,2501,0.233906,0.217435 +585,2502,0.233813,0.217348 +586,2503,0.234119,0.217647 +586,2504,0.234026,0.217560 +586,2505,0.233932,0.217473 +586,2506,0.233839,0.217386 +587,2507,0.234144,0.217685 +587,2508,0.234051,0.217598 +587,2509,0.233958,0.217511 +588,2510,0.234263,0.217809 +588,2511,0.234170,0.217722 +588,2512,0.234076,0.217636 +588,2513,0.233983,0.217549 +588,2514,0.233890,0.217463 +589,2515,0.234195,0.217760 +589,2516,0.234102,0.217674 +589,2517,0.234009,0.217587 +589,2518,0.233916,0.217501 +589,2519,0.233823,0.217414 +589,2520,0.233730,0.217328 +590,2521,0.234034,0.217625 +590,2522,0.233941,0.217539 +590,2523,0.233849,0.217453 +590,2524,0.233756,0.217366 +590,2525,0.233663,0.217273 +591,2526,0.233967,0.217577 +592,2527,0.234270,0.217873 +592,2528,0.234177,0.217787 +592,2529,0.234085,0.217701 +592,2530,0.233992,0.217615 +593,2531,0.234295,0.217910 +593,2532,0.234202,0.217824 +594,2533,0.234505,0.218120 +594,2534,0.234412,0.218034 +594,2535,0.234320,0.217948 +594,2536,0.234227,0.217862 +595,2537,0.234529,0.218157 +595,2538,0.234437,0.218071 +595,2539,0.234344,0.217985 +596,2540,0.234646,0.218280 +596,2541,0.234553,0.218194 +596,2542,0.234461,0.218108 +596,2543,0.234369,0.218022 +596,2544,0.234277,0.217936 +596,2545,0.234185,0.217851 +596,2546,0.234093,0.217765 +596,2547,0.234001,0.217673 +597,2548,0.234301,0.217974 +598,2549,0.234602,0.218267 +598,2550,0.234510,0.218182 +598,2551,0.234418,0.218096 +599,2552,0.234718,0.218390 +600,2553,0.235018,0.218683 +600,2554,0.234926,0.218597 +600,2555,0.234834,0.218512 +600,2556,0.234742,0.218426 +600,2557,0.234650,0.218341 +600,2558,0.234558,0.218256 +600,2559,0.234467,0.218170 +601,2560,0.234766,0.218463 +602,2561,0.235064,0.218755 +602,2562,0.234973,0.218670 +602,2563,0.234881,0.218585 +603,2564,0.235179,0.218877 +603,2565,0.235088,0.218791 +603,2566,0.234996,0.218706 +603,2567,0.234905,0.218621 +604,2568,0.235202,0.218912 +604,2569,0.235111,0.218827 +604,2570,0.235019,0.218742 +604,2571,0.234928,0.218657 +604,2572,0.234837,0.218572 +605,2573,0.235134,0.218863 +605,2574,0.235043,0.218778 +606,2575,0.235340,0.219069 +606,2576,0.235248,0.218984 +607,2577,0.235545,0.219275 +607,2578,0.235454,0.219190 +607,2579,0.235363,0.219105 +608,2580,0.235659,0.219395 +608,2581,0.235568,0.219310 +608,2582,0.235476,0.219225 +609,2583,0.235772,0.219515 +609,2584,0.235681,0.219430 +609,2585,0.235590,0.219345 +609,2586,0.235499,0.219260 +609,2587,0.235408,0.219175 +610,2588,0.235703,0.219465 +611,2589,0.235998,0.219754 +611,2590,0.235907,0.219669 +611,2591,0.235816,0.219584 +611,2592,0.235725,0.219500 +611,2593,0.235634,0.219415 +611,2594,0.235544,0.219331 +611,2595,0.235453,0.219239 +612,2596,0.235747,0.219535 +613,2597,0.236042,0.219823 +613,2598,0.235951,0.219738 +613,2599,0.235860,0.219654 +614,2600,0.236154,0.219942 +614,2601,0.236063,0.219857 +614,2602,0.235972,0.219773 +615,2603,0.236266,0.220061 +615,2604,0.236175,0.219976 +615,2605,0.236084,0.219892 +615,2606,0.235994,0.219800 +615,2607,0.235903,0.219716 +615,2608,0.235813,0.219632 +615,2609,0.235722,0.219548 +616,2610,0.236015,0.219835 +617,2611,0.236308,0.220122 +617,2612,0.236217,0.220037 +617,2613,0.236127,0.219953 +617,2614,0.236037,0.219869 +617,2615,0.235946,0.219785 +617,2616,0.235856,0.219701 +617,2617,0.235766,0.219617 +618,2618,0.236058,0.219903 +618,2619,0.235968,0.219819 +618,2620,0.235878,0.219735 +619,2621,0.236169,0.220021 +619,2622,0.236079,0.219937 +619,2623,0.235989,0.219854 +619,2624,0.235899,0.219763 +619,2625,0.235810,0.219679 +619,2626,0.235720,0.219595 +619,2627,0.235630,0.219512 +619,2628,0.235540,0.219428 +619,2629,0.235451,0.219345 +619,2630,0.235361,0.219261 +619,2631,0.235272,0.219178 +619,2632,0.235182,0.219095 +619,2633,0.235093,0.219004 +619,2634,0.235004,0.218921 +619,2635,0.234915,0.218838 +620,2636,0.235205,0.219123 +621,2637,0.235495,0.219415 +622,2638,0.235785,0.219699 +622,2639,0.235695,0.219616 +623,2640,0.235985,0.219900 +624,2641,0.236274,0.220184 +624,2642,0.236185,0.220101 +625,2643,0.236474,0.220384 +625,2644,0.236384,0.220301 +625,2645,0.236295,0.220218 +625,2646,0.236206,0.220134 +625,2647,0.236116,0.220044 +626,2648,0.236405,0.220335 +627,2649,0.236693,0.220618 +628,2650,0.236981,0.220901 +628,2651,0.236892,0.220817 +628,2652,0.236802,0.220734 +628,2653,0.236713,0.220651 +629,2654,0.237001,0.220933 +629,2655,0.236911,0.220850 +629,2656,0.236822,0.220760 +629,2657,0.236733,0.220677 +629,2658,0.236644,0.220594 +629,2659,0.236555,0.220511 +629,2660,0.236466,0.220428 +629,2661,0.236377,0.220345 +629,2662,0.236289,0.220262 +629,2663,0.236200,0.220179 +629,2664,0.236111,0.220097 +630,2665,0.236398,0.220378 +631,2666,0.236684,0.220660 +632,2667,0.236970,0.220941 +632,2668,0.236882,0.220858 +632,2669,0.236793,0.220776 +633,2670,0.237079,0.221057 +633,2671,0.236990,0.220974 +633,2672,0.236901,0.220891 +633,2673,0.236813,0.220801 +633,2674,0.236724,0.220719 +633,2675,0.236636,0.220636 +633,2676,0.236547,0.220554 +634,2677,0.236832,0.220834 +634,2678,0.236744,0.220752 +635,2679,0.237029,0.221032 +636,2680,0.237313,0.221312 +637,2681,0.237598,0.221592 +637,2682,0.237509,0.221509 +637,2683,0.237421,0.221426 +638,2684,0.237705,0.221706 +638,2685,0.237616,0.221623 +638,2686,0.237528,0.221541 +638,2687,0.237440,0.221458 +638,2688,0.237351,0.221376 +638,2689,0.237263,0.221294 +639,2690,0.237546,0.221573 +639,2691,0.237458,0.221490 +640,2692,0.237741,0.221769 +641,2693,0.238025,0.222047 +641,2694,0.237936,0.221965 +641,2695,0.237848,0.221883 +641,2696,0.237760,0.221793 +642,2697,0.238042,0.222071 +642,2698,0.237954,0.221989 +642,2699,0.237866,0.221907 +642,2700,0.237778,0.221825 +643,2701,0.238060,0.222102 +643,2702,0.237972,0.222020 +643,2703,0.237884,0.221938 +643,2704,0.237796,0.221856 +643,2705,0.237708,0.221774 +643,2706,0.237620,0.221692 +643,2707,0.237532,0.221610 +644,2708,0.237814,0.221887 +644,2709,0.237726,0.221798 +644,2710,0.237638,0.221716 +644,2711,0.237551,0.221635 +644,2712,0.237463,0.221553 +644,2713,0.237376,0.221471 +644,2714,0.237288,0.221390 +644,2715,0.237201,0.221308 +645,2716,0.237482,0.221584 +645,2717,0.237394,0.221503 +645,2718,0.237307,0.221421 +645,2719,0.237220,0.221340 +646,2720,0.237500,0.221616 +646,2721,0.237413,0.221527 +646,2722,0.237325,0.221446 +646,2723,0.237238,0.221365 +646,2724,0.237151,0.221284 +647,2725,0.237431,0.221559 +647,2726,0.237344,0.221478 +647,2727,0.237257,0.221397 +647,2728,0.237170,0.221316 +647,2729,0.237083,0.221234 +648,2730,0.237363,0.221510 +649,2731,0.237642,0.221785 +649,2732,0.237555,0.221704 +649,2733,0.237468,0.221623 +649,2734,0.237381,0.221534 +649,2735,0.237294,0.221453 +649,2736,0.237208,0.221372 +649,2737,0.237121,0.221291 +649,2738,0.237034,0.221211 +649,2739,0.236948,0.221130 +649,2740,0.236861,0.221049 +649,2741,0.236775,0.220968 +649,2742,0.236689,0.220888 +650,2743,0.236967,0.221162 +650,2744,0.236880,0.221074 +651,2745,0.237158,0.221348 +652,2746,0.237436,0.221629 +652,2747,0.237350,0.221541 +652,2748,0.237263,0.221461 +652,2749,0.237177,0.221380 +652,2750,0.237091,0.221300 +652,2751,0.237005,0.221219 +652,2752,0.236919,0.221139 +652,2753,0.236833,0.221058 +652,2754,0.236747,0.220978 +653,2755,0.237024,0.221251 +653,2756,0.236938,0.221171 +654,2757,0.237214,0.221444 +654,2758,0.237128,0.221356 +654,2759,0.237042,0.221276 +654,2760,0.236957,0.221196 +654,2761,0.236871,0.221116 +655,2762,0.237147,0.221388 +655,2763,0.237061,0.221308 +656,2764,0.237337,0.221580 +656,2765,0.237251,0.221500 +656,2766,0.237166,0.221420 +656,2767,0.237080,0.221340 +656,2768,0.236994,0.221260 +656,2769,0.236909,0.221173 +656,2770,0.236823,0.221093 +656,2771,0.236738,0.221013 +656,2772,0.236652,0.220933 +657,2773,0.236928,0.221205 +657,2774,0.236842,0.221125 +658,2775,0.237117,0.221396 +659,2776,0.237392,0.221667 +659,2777,0.237306,0.221588 +659,2778,0.237221,0.221508 +659,2779,0.237136,0.221428 +659,2780,0.237050,0.221349 +659,2781,0.236965,0.221262 +659,2782,0.236880,0.221182 +660,2783,0.237154,0.221453 +660,2784,0.237069,0.221373 +660,2785,0.236984,0.221294 +660,2786,0.236899,0.221214 +661,2787,0.237173,0.221484 +661,2788,0.237088,0.221405 +662,2789,0.237361,0.221675 +663,2790,0.237634,0.221945 +663,2791,0.237549,0.221865 +664,2792,0.237822,0.222135 +664,2793,0.237737,0.222055 +665,2794,0.238010,0.222325 +665,2795,0.237925,0.222238 +666,2796,0.238197,0.222507 +667,2797,0.238470,0.222776 +667,2798,0.238385,0.222696 +667,2799,0.238299,0.222617 +668,2800,0.238571,0.222885 +668,2801,0.238486,0.222806 +668,2802,0.238401,0.222726 +668,2803,0.238316,0.222647 +668,2804,0.238231,0.222567 +669,2805,0.238503,0.222836 +669,2806,0.238418,0.222749 +669,2807,0.238333,0.222670 +669,2808,0.238248,0.222590 +669,2809,0.238163,0.222511 +669,2810,0.238078,0.222432 +669,2811,0.237994,0.222353 +669,2812,0.237909,0.222274 +669,2813,0.237824,0.222195 +670,2814,0.238095,0.222462 +670,2815,0.238011,0.222383 +670,2816,0.237926,0.222297 +670,2817,0.237842,0.222218 +670,2818,0.237757,0.222139 +670,2819,0.237673,0.222060 +671,2820,0.237943,0.222328 +671,2821,0.237859,0.222249 +671,2822,0.237775,0.222170 +671,2823,0.237690,0.222091 +671,2824,0.237606,0.222013 +671,2825,0.237522,0.221934 +672,2826,0.237792,0.222193 +673,2827,0.238062,0.222460 +673,2828,0.237977,0.222381 +674,2829,0.238247,0.222647 +674,2830,0.238163,0.222569 +675,2831,0.238432,0.222835 +675,2832,0.238347,0.222756 +675,2833,0.238263,0.222677 +675,2834,0.238179,0.222599 +675,2835,0.238095,0.222520 +675,2836,0.238011,0.222435 +675,2837,0.237927,0.222356 +675,2838,0.237844,0.222278 +675,2839,0.237760,0.222200 +675,2840,0.237676,0.222121 +675,2841,0.237592,0.222043 +675,2842,0.237509,0.221965 +675,2843,0.237425,0.221887 +675,2844,0.237342,0.221809 +676,2845,0.237610,0.222074 +676,2846,0.237526,0.221989 +676,2847,0.237443,0.221911 +676,2848,0.237360,0.221833 +676,2849,0.237276,0.221755 +676,2850,0.237193,0.221677 +677,2851,0.237461,0.221942 +677,2852,0.237377,0.221864 +678,2853,0.237645,0.222128 +678,2854,0.237561,0.222050 +678,2855,0.237478,0.221973 +679,2856,0.237745,0.222229 +679,2857,0.237662,0.222152 +679,2858,0.237579,0.222074 +680,2859,0.237845,0.222338 +680,2860,0.237762,0.222260 +680,2861,0.237679,0.222182 +680,2862,0.237596,0.222105 +680,2863,0.237513,0.222027 +680,2864,0.237430,0.221950 +680,2865,0.237347,0.221865 +680,2866,0.237264,0.221787 +680,2867,0.237182,0.221710 +680,2868,0.237099,0.221633 +680,2869,0.237016,0.221555 +680,2870,0.236934,0.221478 +680,2871,0.236851,0.221401 +681,2872,0.237117,0.221664 +681,2873,0.237034,0.221587 +681,2874,0.236952,0.221510 +681,2875,0.236870,0.221425 +681,2876,0.236787,0.221348 +681,2877,0.236705,0.221272 +681,2878,0.236623,0.221195 +682,2879,0.236888,0.221457 +682,2880,0.236806,0.221380 +682,2881,0.236723,0.221303 +682,2882,0.236641,0.221226 +682,2883,0.236559,0.221150 +682,2884,0.236477,0.221066 +682,2885,0.236395,0.220989 +682,2886,0.236313,0.220913 +683,2887,0.236578,0.221174 +684,2888,0.236842,0.221436 +684,2889,0.236760,0.221359 +685,2890,0.237024,0.221621 +685,2891,0.236942,0.221544 +685,2892,0.236860,0.221467 +685,2893,0.236778,0.221391 +686,2894,0.237042,0.221645 +686,2895,0.236960,0.221568 +686,2896,0.236878,0.221492 +687,2897,0.237142,0.221752 +688,2898,0.237405,0.222013 +688,2899,0.237323,0.221936 +689,2900,0.237586,0.222197 +690,2901,0.237849,0.222457 +691,2902,0.238112,0.222710 +691,2903,0.238030,0.222633 +691,2904,0.237948,0.222557 +691,2905,0.237866,0.222480 +691,2906,0.237784,0.222404 +691,2907,0.237702,0.222327 +691,2908,0.237620,0.222251 +691,2909,0.237539,0.222174 +692,2910,0.237801,0.222434 +693,2911,0.238063,0.222686 +694,2912,0.238324,0.222945 +694,2913,0.238242,0.222869 +694,2914,0.238161,0.222792 +694,2915,0.238079,0.222716 +694,2916,0.237997,0.222639 +695,2917,0.238258,0.222898 +695,2918,0.238177,0.222822 +695,2919,0.238095,0.222738 +695,2920,0.238014,0.222662 +695,2921,0.237932,0.222586 +695,2922,0.237851,0.222510 +695,2923,0.237769,0.222434 +695,2924,0.237688,0.222357 +696,2925,0.237949,0.222616 +696,2926,0.237867,0.222540 +696,2927,0.237786,0.222464 +696,2928,0.237705,0.222380 +696,2929,0.237624,0.222305 +696,2930,0.237543,0.222229 +696,2931,0.237462,0.222153 +697,2932,0.237722,0.222411 +697,2933,0.237641,0.222335 +697,2934,0.237560,0.222259 +698,2935,0.237819,0.222517 +699,2936,0.238079,0.222767 +699,2937,0.237998,0.222691 +699,2938,0.237917,0.222615 +699,2939,0.237836,0.222539 +699,2940,0.237755,0.222464 +700,2941,0.238014,0.222721 +700,2942,0.237933,0.222645 +701,2943,0.238192,0.222902 +701,2944,0.238111,0.222819 +701,2945,0.238031,0.222743 +701,2946,0.237950,0.222668 +701,2947,0.237869,0.222592 +701,2948,0.237788,0.222517 +701,2949,0.237708,0.222441 +701,2950,0.237627,0.222366 +701,2951,0.237547,0.222290 +702,2952,0.237805,0.222547 +702,2953,0.237724,0.222464 +702,2954,0.237644,0.222389 +702,2955,0.237563,0.222313 +702,2956,0.237483,0.222238 +703,2957,0.237741,0.222494 +703,2958,0.237661,0.222419 +703,2959,0.237580,0.222344 +703,2960,0.237500,0.222268 +703,2961,0.237420,0.222193 +703,2962,0.237340,0.222111 +704,2963,0.237597,0.222367 +704,2964,0.237517,0.222292 +704,2965,0.237437,0.222217 +704,2966,0.237357,0.222142 +704,2967,0.237277,0.222067 +704,2968,0.237197,0.221992 +704,2969,0.237117,0.221917 +705,2970,0.237374,0.222165 +705,2971,0.237294,0.222090 +705,2972,0.237214,0.222015 +705,2973,0.237134,0.221941 +705,2974,0.237054,0.221866 +705,2975,0.236975,0.221791 +706,2976,0.237231,0.222046 +706,2977,0.237151,0.221971 +706,2978,0.237072,0.221897 +706,2979,0.236992,0.221815 +707,2980,0.237248,0.222069 +708,2981,0.237504,0.222323 +708,2982,0.237425,0.222249 +709,2983,0.237680,0.222502 +710,2984,0.237936,0.222756 +710,2985,0.237856,0.222674 +711,2986,0.238111,0.222928 +711,2987,0.238031,0.222853 +711,2988,0.237952,0.222778 +711,2989,0.237872,0.222704 +711,2990,0.237793,0.222629 +711,2991,0.237713,0.222555 +712,2992,0.237968,0.222801 +712,2993,0.237888,0.222726 +712,2994,0.237809,0.222652 +712,2995,0.237730,0.222578 +712,2996,0.237650,0.222503 +713,2997,0.237905,0.222756 +713,2998,0.237825,0.222682 +713,2999,0.237746,0.222607 +713,3000,0.237667,0.222533 +713,3001,0.237587,0.222452 +713,3002,0.237508,0.222378 +713,3003,0.237429,0.222304 +714,3004,0.237683,0.222556 +714,3005,0.237604,0.222482 +714,3006,0.237525,0.222408 +715,3007,0.237779,0.222660 +716,3008,0.238032,0.222904 +717,3009,0.238285,0.223156 +717,3010,0.238206,0.223082 +718,3011,0.238459,0.223333 +718,3012,0.238380,0.223259 +718,3013,0.238301,0.223185 +718,3014,0.238222,0.223104 +718,3015,0.238143,0.223030 +718,3016,0.238064,0.222956 +719,3017,0.238316,0.223207 +719,3018,0.238237,0.223133 +719,3019,0.238158,0.223059 +719,3020,0.238079,0.222985 +719,3021,0.238001,0.222911 +719,3022,0.237922,0.222838 +719,3023,0.237843,0.222757 +720,3024,0.238095,0.223007 +720,3025,0.238017,0.222933 +720,3026,0.237938,0.222860 +720,3027,0.237859,0.222786 +720,3028,0.237781,0.222713 +720,3029,0.237702,0.222639 +720,3030,0.237624,0.222566 +721,3031,0.237875,0.222808 +721,3032,0.237797,0.222735 +722,3033,0.238048,0.222985 +722,3034,0.237970,0.222911 +722,3035,0.237891,0.222838 +723,3036,0.238142,0.223088 +723,3037,0.238064,0.223007 +723,3038,0.237986,0.222933 +723,3039,0.237907,0.222860 +723,3040,0.237829,0.222787 +723,3041,0.237751,0.222714 +723,3042,0.237673,0.222640 +723,3043,0.237594,0.222567 +724,3044,0.237845,0.222816 +725,3045,0.238095,0.223058 +725,3046,0.238017,0.222985 +725,3047,0.237939,0.222912 +725,3048,0.237861,0.222839 +725,3049,0.237783,0.222765 +725,3050,0.237705,0.222692 +725,3051,0.237627,0.222619 +726,3052,0.237877,0.222861 +727,3053,0.238126,0.223109 +728,3054,0.238376,0.223357 +728,3055,0.238298,0.223284 +728,3056,0.238220,0.223211 +728,3057,0.238142,0.223138 +729,3058,0.238391,0.223379 +729,3059,0.238313,0.223306 +729,3060,0.238235,0.223233 +729,3061,0.238157,0.223160 +729,3062,0.238080,0.223087 +729,3063,0.238002,0.223014 +729,3064,0.237924,0.222941 +729,3065,0.237847,0.222869 +729,3066,0.237769,0.222796 +729,3067,0.237692,0.222716 +729,3068,0.237614,0.222644 +729,3069,0.237537,0.222571 +729,3070,0.237459,0.222499 +729,3071,0.237382,0.222426 +729,3072,0.237305,0.222354 +729,3073,0.237227,0.222281 +730,3074,0.237476,0.222528 +731,3075,0.237724,0.222768 +731,3076,0.237646,0.222695 +731,3077,0.237569,0.222623 +732,3078,0.237817,0.222870 +733,3079,0.238064,0.223116 +733,3080,0.237987,0.223037 +733,3081,0.237910,0.222964 +733,3082,0.237833,0.222892 +733,3083,0.237755,0.222820 +734,3084,0.238003,0.223066 +734,3085,0.237925,0.222993 +734,3086,0.237848,0.222921 +734,3087,0.237771,0.222849 +734,3088,0.237694,0.222769 +735,3089,0.237941,0.223015 +735,3090,0.237864,0.222943 +735,3091,0.237787,0.222871 +736,3092,0.238034,0.223117 +736,3093,0.237957,0.223044 +737,3094,0.238203,0.223283 +737,3095,0.238126,0.223210 +738,3096,0.238372,0.223456 +738,3097,0.238295,0.223383 +738,3098,0.238218,0.223311 +738,3099,0.238141,0.223239 +738,3100,0.238065,0.223160 +739,3101,0.238310,0.223405 +740,3102,0.238556,0.223650 +741,3103,0.238801,0.223894 +742,3104,0.239046,0.224132 +742,3105,0.238969,0.224059 +743,3106,0.239214,0.224304 +743,3107,0.239137,0.224231 +743,3108,0.239060,0.224159 +743,3109,0.238984,0.224080 +743,3110,0.238907,0.224008 +744,3111,0.239151,0.224252 +744,3112,0.239075,0.224180 +744,3113,0.238998,0.224108 +744,3114,0.238921,0.224036 +744,3115,0.238844,0.223964 +745,3116,0.239089,0.224200 +745,3117,0.239012,0.224128 +745,3118,0.238935,0.224056 +746,3119,0.239179,0.224300 +747,3120,0.239423,0.224536 +747,3121,0.239346,0.224464 +747,3122,0.239270,0.224392 +747,3123,0.239193,0.224320 +747,3124,0.239117,0.224248 +747,3125,0.239040,0.224177 +747,3126,0.238964,0.224105 +747,3127,0.238887,0.224033 +747,3128,0.238811,0.223962 +747,3129,0.238734,0.223890 +747,3130,0.238658,0.223818 +747,3131,0.238582,0.223740 +748,3132,0.238825,0.223982 +748,3133,0.238749,0.223911 +748,3134,0.238673,0.223839 +748,3135,0.238596,0.223768 +749,3136,0.238839,0.224003 +749,3137,0.238763,0.223932 +749,3138,0.238687,0.223860 +750,3139,0.238930,0.224102 +750,3140,0.238854,0.224031 +750,3141,0.238777,0.223960 +751,3142,0.239020,0.224194 +751,3143,0.238944,0.224123 +752,3144,0.239186,0.224364 +752,3145,0.239110,0.224293 +752,3146,0.239034,0.224222 +753,3147,0.239276,0.224456 +753,3148,0.239199,0.224385 +753,3149,0.239124,0.224313 +753,3150,0.239048,0.224242 +753,3151,0.238972,0.224171 +753,3152,0.238896,0.224100 +754,3153,0.239137,0.224341 +754,3154,0.239062,0.224262 +754,3155,0.238986,0.224191 +754,3156,0.238910,0.224120 +755,3157,0.239151,0.224361 +756,3158,0.239392,0.224594 +756,3159,0.239316,0.224523 +757,3160,0.239557,0.224764 +757,3161,0.239481,0.224693 +757,3162,0.239405,0.224622 +757,3163,0.239330,0.224551 +757,3164,0.239254,0.224480 +757,3165,0.239179,0.224409 +757,3166,0.239103,0.224331 +757,3167,0.239027,0.224260 +757,3168,0.238952,0.224189 +757,3169,0.238877,0.224118 +757,3170,0.238801,0.224047 +757,3171,0.238726,0.223977 +757,3172,0.238651,0.223906 +757,3173,0.238575,0.223836 +757,3174,0.238500,0.223765 +758,3175,0.238740,0.223997 +758,3176,0.238665,0.223927 +758,3177,0.238590,0.223856 +759,3178,0.238829,0.224096 +759,3179,0.238754,0.224025 +759,3180,0.238679,0.223955 +759,3181,0.238604,0.223884 +759,3182,0.238529,0.223807 +759,3183,0.238454,0.223736 +759,3184,0.238379,0.223666 +759,3185,0.238305,0.223596 +759,3186,0.238230,0.223526 +759,3187,0.238155,0.223456 +760,3188,0.238394,0.223694 +760,3189,0.238319,0.223617 +760,3190,0.238245,0.223547 +760,3191,0.238170,0.223477 +760,3192,0.238095,0.223407 +760,3193,0.238021,0.223337 +760,3194,0.237946,0.223267 +760,3195,0.237872,0.223197 +760,3196,0.237797,0.223127 +760,3197,0.237723,0.223057 +760,3198,0.237649,0.222988 +760,3199,0.237574,0.222918 +760,3200,0.237500,0.222841 +760,3201,0.237426,0.222771 +760,3202,0.237352,0.222702 +760,3203,0.237278,0.222632 +760,3204,0.237203,0.222563 +760,3205,0.237129,0.222493 +760,3206,0.237056,0.222424 +760,3207,0.236982,0.222355 +760,3208,0.236908,0.222285 +760,3209,0.236834,0.222216 +761,3210,0.237072,0.222446 +761,3211,0.236998,0.222377 +761,3212,0.236924,0.222308 +761,3213,0.236850,0.222239 +761,3214,0.236777,0.222170 +762,3215,0.237014,0.222407 +762,3216,0.236940,0.222330 +762,3217,0.236867,0.222261 +762,3218,0.236793,0.222192 +763,3219,0.237030,0.222429 +764,3220,0.237267,0.222659 +764,3221,0.237193,0.222590 +764,3222,0.237120,0.222521 +764,3223,0.237046,0.222451 +764,3224,0.236973,0.222382 +764,3225,0.236899,0.222314 +764,3226,0.236826,0.222245 +764,3227,0.236752,0.222176 +764,3228,0.236679,0.222107 +764,3229,0.236606,0.222038 +764,3230,0.236533,0.221969 +765,3231,0.236769,0.222198 +766,3232,0.237005,0.222434 +766,3233,0.236932,0.222366 +766,3234,0.236858,0.222297 +767,3235,0.237094,0.222526 +767,3236,0.237021,0.222457 +767,3237,0.236948,0.222388 +768,3238,0.237183,0.222624 +768,3239,0.237110,0.222555 +768,3240,0.237037,0.222479 +768,3241,0.236964,0.222410 +769,3242,0.237199,0.222646 +770,3243,0.237434,0.222881 +770,3244,0.237361,0.222805 +770,3245,0.237288,0.222736 +770,3246,0.237215,0.222668 +770,3247,0.237142,0.222599 +771,3248,0.237377,0.222834 +771,3249,0.237304,0.222766 +771,3250,0.237231,0.222697 +771,3251,0.237158,0.222621 +771,3252,0.237085,0.222553 +771,3253,0.237012,0.222484 +771,3254,0.236939,0.222416 +771,3255,0.236866,0.222348 +772,3256,0.237101,0.222582 +772,3257,0.237028,0.222514 +772,3258,0.236955,0.222446 +772,3259,0.236882,0.222370 +772,3260,0.236810,0.222302 +772,3261,0.236737,0.222234 +772,3262,0.236665,0.222166 +772,3263,0.236592,0.222098 +772,3264,0.236520,0.222029 +773,3265,0.236753,0.222263 +773,3266,0.236681,0.222188 +773,3267,0.236609,0.222120 +773,3268,0.236536,0.222052 +773,3269,0.236464,0.221984 +773,3270,0.236391,0.221916 +773,3271,0.236319,0.221849 +773,3272,0.236247,0.221781 +773,3273,0.236175,0.221713 +773,3274,0.236103,0.221645 +773,3275,0.236031,0.221578 +774,3276,0.236264,0.221804 +775,3277,0.236497,0.222037 +775,3278,0.236425,0.221969 +776,3279,0.236658,0.222195 +776,3280,0.236585,0.222127 +776,3281,0.236513,0.222060 +776,3282,0.236441,0.221992 +776,3283,0.236369,0.221924 +777,3284,0.236602,0.222157 +777,3285,0.236530,0.222082 +777,3286,0.236458,0.222015 +777,3287,0.236386,0.221947 +777,3288,0.236314,0.221880 +777,3289,0.236242,0.221812 +777,3290,0.236170,0.221745 +777,3291,0.236098,0.221677 +778,3292,0.236330,0.221902 +779,3293,0.236562,0.222135 +779,3294,0.236491,0.222067 +779,3295,0.236419,0.222000 +779,3296,0.236347,0.221932 +779,3297,0.236275,0.221865 +779,3298,0.236204,0.221798 +780,3299,0.236435,0.222022 +780,3300,0.236364,0.221955 +780,3301,0.236292,0.221888 +780,3302,0.236220,0.221821 +781,3303,0.236452,0.222045 +781,3304,0.236380,0.221978 +781,3305,0.236309,0.221911 +781,3306,0.236237,0.221844 +781,3307,0.236166,0.221777 +781,3308,0.236094,0.221709 +781,3309,0.236023,0.221642 +782,3310,0.236254,0.221866 +782,3311,0.236182,0.221799 +783,3312,0.236413,0.222030 +784,3313,0.236644,0.222254 +784,3314,0.236572,0.222187 +784,3315,0.236501,0.222120 +784,3316,0.236429,0.222053 +785,3317,0.236660,0.222284 +786,3318,0.236890,0.222507 +786,3319,0.236818,0.222440 +786,3320,0.236747,0.222373 +787,3321,0.236977,0.222603 +787,3322,0.236905,0.222536 +787,3323,0.236834,0.222462 +787,3324,0.236763,0.222395 +787,3325,0.236692,0.222328 +787,3326,0.236621,0.222261 +787,3327,0.236549,0.222195 +787,3328,0.236478,0.222128 +788,3329,0.236708,0.222358 +788,3330,0.236637,0.222284 +788,3331,0.236566,0.222217 +788,3332,0.236495,0.222150 +788,3333,0.236424,0.222084 +788,3334,0.236353,0.222017 +788,3335,0.236282,0.221950 +788,3336,0.236211,0.221884 +789,3337,0.236440,0.222106 +790,3338,0.236669,0.222336 +790,3339,0.236598,0.222269 +791,3340,0.236826,0.222491 +792,3341,0.237055,0.222720 +793,3342,0.237283,0.222942 +794,3343,0.237511,0.223171 +795,3344,0.237739,0.223392 +795,3345,0.237668,0.223325 +796,3346,0.237896,0.223554 +796,3347,0.237825,0.223487 +796,3348,0.237754,0.223420 +797,3349,0.237981,0.223641 +797,3350,0.237910,0.223575 +798,3351,0.238138,0.223803 +798,3352,0.238067,0.223736 +798,3353,0.237996,0.223662 +798,3354,0.237925,0.223595 +798,3355,0.237854,0.223529 +798,3356,0.237783,0.223462 +798,3357,0.237712,0.223396 +798,3358,0.237641,0.223329 +798,3359,0.237571,0.223263 +798,3360,0.237500,0.223196 +798,3361,0.237429,0.223130 +799,3362,0.237656,0.223350 +799,3363,0.237585,0.223284 +799,3364,0.237515,0.223217 +799,3365,0.237444,0.223151 +800,3366,0.237671,0.223379 +800,3367,0.237600,0.223305 +800,3368,0.237530,0.223239 +800,3369,0.237459,0.223172 +801,3370,0.237685,0.223400 +801,3371,0.237615,0.223333 +801,3372,0.237544,0.223267 +801,3373,0.237474,0.223201 +801,3374,0.237404,0.223127 +801,3375,0.237333,0.223061 +802,3376,0.237559,0.223288 +803,3377,0.237785,0.223508 +803,3378,0.237715,0.223441 +803,3379,0.237644,0.223375 +803,3380,0.237574,0.223309 +803,3381,0.237504,0.223243 +803,3382,0.237433,0.223177 +803,3383,0.237363,0.223111 +803,3384,0.237293,0.223045 +803,3385,0.237223,0.222979 +803,3386,0.237153,0.222914 +803,3387,0.237083,0.222848 +803,3388,0.237013,0.222775 +803,3389,0.236943,0.222709 +804,3390,0.237168,0.222935 +804,3391,0.237098,0.222869 +804,3392,0.237028,0.222804 +804,3393,0.236958,0.222738 +804,3394,0.236889,0.222672 +805,3395,0.237113,0.222891 +806,3396,0.237338,0.223109 +806,3397,0.237268,0.223044 +806,3398,0.237198,0.222978 +806,3399,0.237129,0.222912 +807,3400,0.237353,0.223138 +807,3401,0.237283,0.223072 +807,3402,0.237213,0.223007 +807,3403,0.237144,0.222934 +807,3404,0.237074,0.222868 +807,3405,0.237004,0.222803 +808,3406,0.237228,0.223028 +808,3407,0.237159,0.222962 +808,3408,0.237089,0.222897 +808,3409,0.237020,0.222832 +808,3410,0.236950,0.222759 +808,3411,0.236881,0.222694 +808,3412,0.236811,0.222628 +808,3413,0.236742,0.222563 +808,3414,0.236673,0.222498 +809,3415,0.236896,0.222723 +809,3416,0.236827,0.222650 +809,3417,0.236757,0.222585 +810,3418,0.236981,0.222809 +810,3419,0.236911,0.222744 +811,3420,0.237135,0.222961 +812,3421,0.237357,0.223185 +813,3422,0.237580,0.223402 +814,3423,0.237803,0.223626 +814,3424,0.237734,0.223561 +814,3425,0.237664,0.223488 +814,3426,0.237595,0.223423 +815,3427,0.237817,0.223647 +815,3428,0.237748,0.223582 +816,3429,0.237970,0.223798 +816,3430,0.237901,0.223733 +817,3431,0.238123,0.223956 +817,3432,0.238054,0.223884 +817,3433,0.237984,0.223818 +817,3434,0.237915,0.223753 +818,3435,0.238137,0.223976 +818,3436,0.238068,0.223911 +819,3437,0.238289,0.224127 +819,3438,0.238220,0.224062 +819,3439,0.238151,0.223997 +819,3440,0.238081,0.223932 +819,3441,0.238012,0.223866 +820,3442,0.238234,0.224082 +820,3443,0.238164,0.224017 +821,3444,0.238386,0.224239 +821,3445,0.238316,0.224174 +822,3446,0.238537,0.224390 +822,3447,0.238468,0.224324 +823,3448,0.238689,0.224540 +824,3449,0.238910,0.224762 +825,3450,0.239130,0.224977 +825,3451,0.239061,0.224911 +825,3452,0.238992,0.224846 +825,3453,0.238923,0.224781 +826,3454,0.239143,0.224996 +826,3455,0.239074,0.224931 +826,3456,0.239005,0.224866 +826,3457,0.238935,0.224800 +826,3458,0.238866,0.224735 +826,3459,0.238797,0.224670 +826,3460,0.238728,0.224606 +827,3461,0.238948,0.224820 +827,3462,0.238879,0.224755 +828,3463,0.239099,0.224976 +828,3464,0.239030,0.224911 +829,3465,0.239250,0.225125 +829,3466,0.239181,0.225060 +830,3467,0.239400,0.225274 +830,3468,0.239331,0.225209 +831,3469,0.239550,0.225430 +832,3470,0.239769,0.225644 +832,3471,0.239700,0.225579 +832,3472,0.239631,0.225514 +833,3473,0.239850,0.225727 +833,3474,0.239781,0.225662 +834,3475,0.240000,0.225883 +834,3476,0.239931,0.225818 +834,3477,0.239862,0.225745 +835,3478,0.240081,0.225966 +835,3479,0.240011,0.225901 +835,3480,0.239943,0.225836 +835,3481,0.239874,0.225771 +835,3482,0.239805,0.225706 +836,3483,0.240023,0.225919 +837,3484,0.240241,0.226131 +838,3485,0.240459,0.226351 +838,3486,0.240390,0.226286 +838,3487,0.240321,0.226222 +838,3488,0.240252,0.226149 +839,3489,0.240470,0.226369 +839,3490,0.240401,0.226304 +839,3491,0.240332,0.226239 +839,3492,0.240263,0.226175 +840,3493,0.240481,0.226387 +840,3494,0.240412,0.226322 +840,3495,0.240343,0.226257 +840,3496,0.240275,0.226192 +840,3497,0.240206,0.226128 +841,3498,0.240423,0.226339 +841,3499,0.240354,0.226275 +841,3500,0.240286,0.226210 +841,3501,0.240217,0.226146 +842,3502,0.240434,0.226357 +843,3503,0.240651,0.226576 +843,3504,0.240582,0.226511 +843,3505,0.240514,0.226439 +843,3506,0.240445,0.226375 +844,3507,0.240662,0.226593 +844,3508,0.240593,0.226529 +844,3509,0.240524,0.226464 +844,3510,0.240456,0.226400 +844,3511,0.240387,0.226328 +844,3512,0.240319,0.226263 +844,3513,0.240250,0.226199 +844,3514,0.240182,0.226135 +845,3515,0.240398,0.226353 +846,3516,0.240614,0.226564 +846,3517,0.240546,0.226499 +846,3518,0.240478,0.226435 +846,3519,0.240409,0.226370 +847,3520,0.240625,0.226581 +847,3521,0.240557,0.226517 +848,3522,0.240772,0.226727 +848,3523,0.240704,0.226663 +848,3524,0.240636,0.226598 +848,3525,0.240567,0.226534 +848,3526,0.240499,0.226470 +849,3527,0.240714,0.226680 +849,3528,0.240646,0.226616 +850,3529,0.240861,0.226833 +850,3530,0.240793,0.226769 +850,3531,0.240725,0.226705 +851,3532,0.240940,0.226914 +851,3533,0.240872,0.226850 +852,3534,0.241087,0.227060 +852,3535,0.241018,0.226996 +852,3536,0.240950,0.226931 +852,3537,0.240882,0.226867 +852,3538,0.240814,0.226803 +853,3539,0.241029,0.227012 +853,3540,0.240960,0.226948 +854,3541,0.241175,0.227165 +854,3542,0.241107,0.227093 +854,3543,0.241039,0.227029 +854,3544,0.240971,0.226965 +854,3545,0.240903,0.226901 +854,3546,0.240835,0.226837 +854,3547,0.240767,0.226773 +855,3548,0.240981,0.226982 +855,3549,0.240913,0.226918 +855,3550,0.240845,0.226854 +855,3551,0.240777,0.226790 +855,3552,0.240709,0.226727 +855,3553,0.240642,0.226663 +856,3554,0.240855,0.226871 +856,3555,0.240788,0.226808 +856,3556,0.240720,0.226744 +856,3557,0.240652,0.226680 +857,3558,0.240866,0.226888 +857,3559,0.240798,0.226825 +858,3560,0.241011,0.227040 +859,3561,0.241224,0.227248 +859,3562,0.241157,0.227185 +859,3563,0.241089,0.227121 +860,3564,0.241302,0.227329 +861,3565,0.241515,0.227544 +861,3566,0.241447,0.227480 +862,3567,0.241660,0.227688 +863,3568,0.241872,0.227896 +863,3569,0.241804,0.227832 +863,3570,0.241737,0.227768 +863,3571,0.241669,0.227704 +864,3572,0.241881,0.227912 +865,3573,0.242093,0.228126 +865,3574,0.242026,0.228062 +865,3575,0.241958,0.227999 +865,3576,0.241890,0.227928 +866,3577,0.242102,0.228142 +866,3578,0.242035,0.228078 +867,3579,0.242246,0.228285 +867,3580,0.242179,0.228221 +867,3581,0.242111,0.228158 +867,3582,0.242044,0.228094 +867,3583,0.241976,0.228030 +867,3584,0.241908,0.227967 +867,3585,0.241841,0.227903 +867,3586,0.241774,0.227832 +868,3587,0.241985,0.228046 +868,3588,0.241918,0.227983 +868,3589,0.241850,0.227919 +868,3590,0.241783,0.227856 +868,3591,0.241715,0.227785 +868,3592,0.241648,0.227721 +868,3593,0.241581,0.227658 +868,3594,0.241514,0.227595 +868,3595,0.241446,0.227531 +868,3596,0.241379,0.227468 +868,3597,0.241312,0.227405 +868,3598,0.241245,0.227342 +868,3599,0.241178,0.227278 +869,3600,0.241389,0.227484 +869,3601,0.241322,0.227421 +869,3602,0.241255,0.227358 +870,3603,0.241465,0.227564 +870,3604,0.241398,0.227501 +870,3605,0.241331,0.227438 +870,3606,0.241265,0.227375 +870,3607,0.241198,0.227312 +870,3608,0.241131,0.227249 +870,3609,0.241064,0.227186 +871,3610,0.241274,0.227391 +872,3611,0.241484,0.227604 +872,3612,0.241417,0.227533 +873,3613,0.241627,0.227746 +873,3614,0.241561,0.227683 +873,3615,0.241494,0.227620 +873,3616,0.241427,0.227557 +874,3617,0.241637,0.227762 +874,3618,0.241570,0.227699 +874,3619,0.241503,0.227636 +874,3620,0.241436,0.227573 +874,3621,0.241370,0.227511 +874,3622,0.241303,0.227440 +874,3623,0.241237,0.227378 +874,3624,0.241170,0.227315 +875,3625,0.241379,0.227527 +875,3626,0.241313,0.227464 +875,3627,0.241246,0.227394 +876,3628,0.241455,0.227606 +876,3629,0.241389,0.227543 +876,3630,0.241322,0.227481 +877,3631,0.241531,0.227685 +877,3632,0.241465,0.227622 +878,3633,0.241674,0.227826 +879,3634,0.241882,0.228031 +879,3635,0.241816,0.227968 +879,3636,0.241749,0.227905 +880,3637,0.241958,0.228116 +881,3638,0.242166,0.228320 +881,3639,0.242099,0.228258 +882,3640,0.242308,0.228461 +883,3641,0.242516,0.228665 +883,3642,0.242449,0.228602 +883,3643,0.242383,0.228539 +883,3644,0.242316,0.228477 +883,3645,0.242250,0.228414 +883,3646,0.242183,0.228351 +883,3647,0.242117,0.228289 +883,3648,0.242050,0.228226 +883,3649,0.241984,0.228164 +883,3650,0.241918,0.228101 +883,3651,0.241852,0.228039 +883,3652,0.241785,0.227976 +883,3653,0.241719,0.227906 +883,3654,0.241653,0.227844 +883,3655,0.241587,0.227782 +884,3656,0.241794,0.227992 +884,3657,0.241728,0.227930 +884,3658,0.241662,0.227860 +884,3659,0.241596,0.227798 +885,3660,0.241803,0.228008 +885,3661,0.241737,0.227945 +885,3662,0.241671,0.227883 +885,3663,0.241605,0.227814 +885,3664,0.241539,0.227751 +885,3665,0.241473,0.227689 +885,3666,0.241408,0.227627 +885,3667,0.241342,0.227565 +885,3668,0.241276,0.227503 +885,3669,0.241210,0.227441 +885,3670,0.241144,0.227379 +886,3671,0.241351,0.227581 +887,3672,0.241558,0.227791 +887,3673,0.241492,0.227722 +887,3674,0.241426,0.227660 +888,3675,0.241633,0.227869 +888,3676,0.241567,0.227807 +888,3677,0.241501,0.227738 +888,3678,0.241436,0.227676 +888,3679,0.241370,0.227614 +888,3680,0.241304,0.227552 +888,3681,0.241239,0.227490 +888,3682,0.241173,0.227428 +888,3683,0.241108,0.227367 +888,3684,0.241042,0.227305 +889,3685,0.241248,0.227507 +889,3686,0.241183,0.227445 +889,3687,0.241117,0.227383 +889,3688,0.241052,0.227321 +889,3689,0.240987,0.227260 +889,3690,0.240921,0.227198 +890,3691,0.241127,0.227400 +890,3692,0.241062,0.227338 +890,3693,0.240996,0.227276 +890,3694,0.240931,0.227215 +891,3695,0.241137,0.227416 +891,3696,0.241071,0.227354 +892,3697,0.241277,0.227555 +893,3698,0.241482,0.227764 +893,3699,0.241417,0.227702 +893,3700,0.241351,0.227641 +893,3701,0.241286,0.227572 +893,3702,0.241221,0.227510 +893,3703,0.241156,0.227449 +894,3704,0.241361,0.227657 +895,3705,0.241565,0.227857 +895,3706,0.241500,0.227796 +895,3707,0.241435,0.227734 +895,3708,0.241370,0.227673 +895,3709,0.241305,0.227611 +895,3710,0.241240,0.227543 +895,3711,0.241175,0.227481 +895,3712,0.241110,0.227420 +895,3713,0.241045,0.227359 +896,3714,0.241249,0.227566 +896,3715,0.241184,0.227498 +896,3716,0.241119,0.227437 +896,3717,0.241055,0.227375 +896,3718,0.240990,0.227314 +897,3719,0.241194,0.227514 +897,3720,0.241129,0.227453 +897,3721,0.241064,0.227392 +898,3722,0.241268,0.227599 +898,3723,0.241203,0.227538 +898,3724,0.241139,0.227469 +898,3725,0.241074,0.227408 +898,3726,0.241009,0.227347 +898,3727,0.240944,0.227286 +898,3728,0.240880,0.227225 +898,3729,0.240815,0.227164 +898,3730,0.240751,0.227103 +899,3731,0.240954,0.227303 +899,3732,0.240890,0.227242 +899,3733,0.240825,0.227181 +899,3734,0.240761,0.227120 +899,3735,0.240696,0.227059 +899,3736,0.240632,0.226998 +899,3737,0.240567,0.226938 +899,3738,0.240503,0.226877 +899,3739,0.240439,0.226816 +899,3740,0.240374,0.226756 +900,3741,0.240577,0.226955 +901,3742,0.240780,0.227153 +901,3743,0.240716,0.227093 +901,3744,0.240652,0.227032 +901,3745,0.240587,0.226971 +902,3746,0.240790,0.227170 +902,3747,0.240726,0.227109 +902,3748,0.240662,0.227049 +902,3749,0.240597,0.226988 +903,3750,0.240800,0.227187 +903,3751,0.240736,0.227126 +903,3752,0.240672,0.227066 +903,3753,0.240608,0.227005 +903,3754,0.240543,0.226945 +903,3755,0.240479,0.226884 +903,3756,0.240415,0.226824 +904,3757,0.240618,0.227022 +905,3758,0.240820,0.227220 +905,3759,0.240756,0.227159 +905,3760,0.240691,0.227099 +906,3761,0.240893,0.227297 +906,3762,0.240829,0.227236 +906,3763,0.240765,0.227176 +906,3764,0.240701,0.227116 +907,3765,0.240903,0.227313 +907,3766,0.240839,0.227253 +907,3767,0.240775,0.227193 +907,3768,0.240711,0.227132 +908,3769,0.240913,0.227330 +908,3770,0.240849,0.227269 +908,3771,0.240785,0.227209 +908,3772,0.240721,0.227149 +908,3773,0.240657,0.227089 +908,3774,0.240594,0.227029 +908,3775,0.240530,0.226968 +908,3776,0.240466,0.226908 +908,3777,0.240402,0.226848 +908,3778,0.240339,0.226788 +908,3779,0.240275,0.226728 +909,3780,0.240476,0.226925 +910,3781,0.240677,0.227122 +910,3782,0.240613,0.227062 +910,3783,0.240550,0.227002 +911,3784,0.240751,0.227199 +911,3785,0.240687,0.227139 +911,3786,0.240623,0.227079 +911,3787,0.240560,0.227019 +911,3788,0.240496,0.226959 +911,3789,0.240433,0.226899 +911,3790,0.240369,0.226839 +911,3791,0.240306,0.226779 +911,3792,0.240243,0.226719 +911,3793,0.240179,0.226660 +911,3794,0.240116,0.226600 +911,3795,0.240053,0.226533 +911,3796,0.239989,0.226473 +911,3797,0.239926,0.226414 +911,3798,0.239863,0.226354 +911,3799,0.239800,0.226294 +911,3800,0.239737,0.226235 +911,3801,0.239674,0.226175 +911,3802,0.239611,0.226116 +911,3803,0.239548,0.226056 +912,3804,0.239748,0.226252 +912,3805,0.239685,0.226193 +912,3806,0.239622,0.226133 +912,3807,0.239559,0.226074 +912,3808,0.239496,0.226015 +912,3809,0.239433,0.225955 +912,3810,0.239370,0.225896 +913,3811,0.239570,0.226092 +914,3812,0.239769,0.226287 +915,3813,0.239969,0.226483 +916,3814,0.240168,0.226685 +916,3815,0.240105,0.226626 +917,3816,0.240304,0.226821 +917,3817,0.240241,0.226762 +917,3818,0.240178,0.226703 +917,3819,0.240115,0.226643 +918,3820,0.240314,0.226838 +918,3821,0.240251,0.226779 +918,3822,0.240188,0.226720 +918,3823,0.240126,0.226660 +918,3824,0.240063,0.226594 +918,3825,0.240000,0.226534 +918,3826,0.239937,0.226475 +918,3827,0.239875,0.226416 +918,3828,0.239812,0.226357 +918,3829,0.239749,0.226298 +919,3830,0.239948,0.226492 +919,3831,0.239885,0.226433 +919,3832,0.239823,0.226374 +919,3833,0.239760,0.226315 +919,3834,0.239697,0.226256 +919,3835,0.239635,0.226197 +920,3836,0.239833,0.226392 +920,3837,0.239771,0.226333 +920,3838,0.239708,0.226274 +920,3839,0.239646,0.226215 +920,3840,0.239583,0.226156 +920,3841,0.239521,0.226097 +920,3842,0.239459,0.226038 +920,3843,0.239396,0.225979 +920,3844,0.239334,0.225920 +920,3845,0.239272,0.225862 +920,3846,0.239210,0.225803 +920,3847,0.239147,0.225737 +920,3848,0.239085,0.225678 +921,3849,0.239283,0.225879 +921,3850,0.239221,0.225821 +921,3851,0.239159,0.225755 +921,3852,0.239097,0.225696 +921,3853,0.239035,0.225638 +922,3854,0.239232,0.225839 +922,3855,0.239170,0.225773 +922,3856,0.239108,0.225714 +922,3857,0.239046,0.225656 +922,3858,0.238984,0.225597 +923,3859,0.239181,0.225791 +924,3860,0.239378,0.225991 +924,3861,0.239316,0.225933 +925,3862,0.239513,0.226126 +925,3863,0.239451,0.226068 +925,3864,0.239389,0.226009 +925,3865,0.239327,0.225951 +925,3866,0.239265,0.225892 +925,3867,0.239204,0.225826 +925,3868,0.239142,0.225768 +925,3869,0.239080,0.225710 +925,3870,0.239018,0.225651 +926,3871,0.239215,0.225844 +926,3872,0.239153,0.225786 +926,3873,0.239091,0.225728 +927,3874,0.239288,0.225928 +927,3875,0.239226,0.225862 +927,3876,0.239164,0.225804 +927,3877,0.239102,0.225746 +927,3878,0.239041,0.225687 +927,3879,0.238979,0.225629 +927,3880,0.238918,0.225571 +928,3881,0.239114,0.225763 +928,3882,0.239052,0.225705 +929,3883,0.239248,0.225898 +929,3884,0.239186,0.225839 +929,3885,0.239125,0.225781 +930,3886,0.239321,0.225974 +930,3887,0.239259,0.225915 +930,3888,0.239198,0.225857 +931,3889,0.239393,0.226057 +931,3890,0.239332,0.225991 +932,3891,0.239527,0.226190 +933,3892,0.239723,0.226382 +933,3893,0.239661,0.226324 +933,3894,0.239599,0.226266 +934,3895,0.239795,0.226458 +934,3896,0.239733,0.226400 +934,3897,0.239672,0.226341 +934,3898,0.239610,0.226283 +934,3899,0.239549,0.226225 +934,3900,0.239487,0.226167 +934,3901,0.239426,0.226102 +934,3902,0.239364,0.226044 +934,3903,0.239303,0.225986 +934,3904,0.239242,0.225928 +934,3905,0.239181,0.225870 +935,3906,0.239375,0.226062 +935,3907,0.239314,0.226004 +935,3908,0.239253,0.225946 +935,3909,0.239192,0.225888 +935,3910,0.239130,0.225830 +936,3911,0.239325,0.226021 +936,3912,0.239264,0.225964 +936,3913,0.239203,0.225906 +936,3914,0.239142,0.225848 +936,3915,0.239080,0.225791 +936,3916,0.239019,0.225733 +936,3917,0.238958,0.225675 +936,3918,0.238897,0.225618 +937,3919,0.239092,0.225808 +937,3920,0.239031,0.225751 +938,3921,0.239225,0.225941 +938,3922,0.239164,0.225884 +938,3923,0.239103,0.225826 +938,3924,0.239042,0.225769 +939,3925,0.239236,0.225959 +939,3926,0.239175,0.225901 +939,3927,0.239114,0.225844 +939,3928,0.239053,0.225786 +939,3929,0.238992,0.225729 +939,3930,0.238931,0.225672 +940,3931,0.239125,0.225862 +940,3932,0.239064,0.225804 +940,3933,0.239003,0.225747 +940,3934,0.238943,0.225689 +940,3935,0.238882,0.225632 +940,3936,0.238821,0.225575 +941,3937,0.239014,0.225765 +942,3938,0.239208,0.225954 +942,3939,0.239147,0.225897 +942,3940,0.239086,0.225840 +942,3941,0.239026,0.225782 +942,3942,0.238965,0.225725 +942,3943,0.238904,0.225668 +943,3944,0.239097,0.225858 +943,3945,0.239037,0.225800 +943,3946,0.238976,0.225743 +944,3947,0.239169,0.225933 +944,3948,0.239108,0.225875 +944,3949,0.239048,0.225818 +944,3950,0.238987,0.225761 +944,3951,0.238927,0.225704 +945,3952,0.239119,0.225893 +945,3953,0.239059,0.225836 +945,3954,0.238998,0.225779 +945,3955,0.238938,0.225722 +945,3956,0.238878,0.225657 +945,3957,0.238817,0.225600 +945,3958,0.238757,0.225543 +945,3959,0.238697,0.225486 +945,3960,0.238636,0.225429 +945,3961,0.238576,0.225372 +945,3962,0.238516,0.225316 +946,3963,0.238708,0.225504 +947,3964,0.238900,0.225693 +947,3965,0.238840,0.225636 +947,3966,0.238780,0.225579 +947,3967,0.238719,0.225522 +947,3968,0.238659,0.225466 +947,3969,0.238599,0.225409 +947,3970,0.238539,0.225352 +947,3971,0.238479,0.225295 +948,3972,0.238671,0.225484 +948,3973,0.238611,0.225427 +949,3974,0.238802,0.225615 +949,3975,0.238742,0.225558 +949,3976,0.238682,0.225502 +950,3977,0.238874,0.225690 +950,3978,0.238813,0.225633 +950,3979,0.238753,0.225576 +951,3980,0.238945,0.225764 +951,3981,0.238885,0.225708 +951,3982,0.238825,0.225651 +952,3983,0.239016,0.225839 +952,3984,0.238956,0.225782 +952,3985,0.238896,0.225726 +952,3986,0.238836,0.225669 +952,3987,0.238776,0.225612 +952,3988,0.238716,0.225556 +953,3989,0.238907,0.225743 +953,3990,0.238847,0.225687 +954,3991,0.239038,0.225874 +954,3992,0.238978,0.225818 +954,3993,0.238918,0.225761 +955,3994,0.239109,0.225948 +956,3995,0.239299,0.226136 +957,3996,0.239489,0.226323 +958,3997,0.239680,0.226517 +958,3998,0.239620,0.226461 +958,3999,0.239560,0.226397 +958,4000,0.239500,0.226340 +958,4001,0.239440,0.226284 +958,4002,0.239380,0.226227 +958,4003,0.239321,0.226171 +958,4004,0.239261,0.226114 +958,4005,0.239201,0.226058 +959,4006,0.239391,0.226244 +959,4007,0.239331,0.226188 +959,4008,0.239271,0.226132 +960,4009,0.239461,0.226318 +960,4010,0.239401,0.226262 +960,4011,0.239342,0.226205 +960,4012,0.239282,0.226149 +960,4013,0.239223,0.226093 +960,4014,0.239163,0.226036 +960,4015,0.239103,0.225980 +960,4016,0.239044,0.225924 +960,4017,0.238984,0.225867 +960,4018,0.238925,0.225811 +960,4019,0.238865,0.225755 +960,4020,0.238806,0.225699 +961,4021,0.238995,0.225885 +961,4022,0.238936,0.225829 +961,4023,0.238876,0.225773 +962,4024,0.239066,0.225959 +962,4025,0.239006,0.225903 +962,4026,0.238947,0.225847 +962,4027,0.238888,0.225783 +962,4028,0.238828,0.225727 +963,4029,0.239017,0.225920 +963,4030,0.238958,0.225857 +963,4031,0.238899,0.225801 +963,4032,0.238839,0.225745 +963,4033,0.238780,0.225689 +963,4034,0.238721,0.225633 +964,4035,0.238910,0.225819 +964,4036,0.238850,0.225763 +965,4037,0.239039,0.225948 +965,4038,0.238980,0.225892 +965,4039,0.238921,0.225836 +965,4040,0.238861,0.225780 +965,4041,0.238802,0.225725 +965,4042,0.238743,0.225669 +965,4043,0.238684,0.225613 +965,4044,0.238625,0.225557 +965,4045,0.238566,0.225501 +965,4046,0.238507,0.225446 +965,4047,0.238448,0.225390 +966,4048,0.238636,0.225575 +966,4049,0.238577,0.225519 +966,4050,0.238519,0.225464 +967,4051,0.238706,0.225649 +967,4052,0.238648,0.225593 +967,4053,0.238589,0.225537 +968,4054,0.238777,0.225722 +968,4055,0.238718,0.225666 +969,4056,0.238905,0.225851 +969,4057,0.238846,0.225795 +970,4058,0.239034,0.225980 +971,4059,0.239221,0.226165 +971,4060,0.239163,0.226109 +971,4061,0.239104,0.226053 +972,4062,0.239291,0.226238 +972,4063,0.239232,0.226182 +972,4064,0.239173,0.226126 +972,4065,0.239114,0.226071 +972,4066,0.239056,0.226015 +972,4067,0.238997,0.225959 +972,4068,0.238938,0.225904 +973,4069,0.239125,0.226088 +973,4070,0.239066,0.226033 +973,4071,0.239008,0.225977 +973,4072,0.238949,0.225922 +973,4073,0.238890,0.225866 +973,4074,0.238832,0.225811 +974,4075,0.239018,0.225994 +974,4076,0.238960,0.225939 +975,4077,0.239146,0.226123 +975,4078,0.239088,0.226067 +976,4079,0.239274,0.226251 +976,4080,0.239216,0.226196 +976,4081,0.239157,0.226140 +977,4082,0.239343,0.226324 +977,4083,0.239285,0.226268 +977,4084,0.239226,0.226213 +978,4085,0.239412,0.226396 +979,4086,0.239599,0.226580 +979,4087,0.239540,0.226524 +980,4088,0.239726,0.226707 +980,4089,0.239667,0.226652 +980,4090,0.239609,0.226597 +980,4091,0.239550,0.226541 +980,4092,0.239492,0.226486 +980,4093,0.239433,0.226431 +980,4094,0.239375,0.226368 +980,4095,0.239316,0.226313 +981,4096,0.239502,0.226503 +982,4097,0.239688,0.226686 +982,4098,0.239629,0.226630 +982,4099,0.239571,0.226575 +983,4100,0.239756,0.226758 +984,4101,0.239941,0.226940 +985,4102,0.240127,0.227123 +985,4103,0.240068,0.227068 +985,4104,0.240010,0.227012 +986,4105,0.240195,0.227195 +986,4106,0.240136,0.227140 +987,4107,0.240321,0.227322 +987,4108,0.240263,0.227267 +987,4109,0.240204,0.227211 +987,4110,0.240146,0.227156 +987,4111,0.240088,0.227101 +987,4112,0.240029,0.227038 +988,4113,0.240214,0.227228 +989,4114,0.240399,0.227410 +990,4115,0.240583,0.227592 +991,4116,0.240768,0.227773 +992,4117,0.240952,0.227955 +992,4118,0.240894,0.227900 +993,4119,0.241078,0.228082 +993,4120,0.241019,0.228026 +993,4121,0.240961,0.227971 +993,4122,0.240902,0.227916 +993,4123,0.240844,0.227860 +993,4124,0.240786,0.227805 +993,4125,0.240727,0.227750 +993,4126,0.240669,0.227695 +993,4127,0.240611,0.227632 +993,4128,0.240552,0.227577 +994,4129,0.240736,0.227758 +995,4130,0.240920,0.227947 +995,4131,0.240862,0.227884 +996,4132,0.241045,0.228073 +996,4133,0.240987,0.228018 +996,4134,0.240929,0.227955 +996,4135,0.240871,0.227900 +996,4136,0.240812,0.227845 +996,4137,0.240754,0.227790 +997,4138,0.240938,0.227971 +997,4139,0.240879,0.227916 +997,4140,0.240821,0.227861 +997,4141,0.240763,0.227806 +997,4142,0.240705,0.227751 +997,4143,0.240647,0.227696 +997,4144,0.240589,0.227641 +997,4145,0.240531,0.227586 +997,4146,0.240473,0.227531 +997,4147,0.240415,0.227476 +997,4148,0.240357,0.227421 +997,4149,0.240299,0.227367 +997,4150,0.240241,0.227312 +998,4151,0.240424,0.227492 +998,4152,0.240366,0.227437 +999,4153,0.240549,0.227618 +999,4154,0.240491,0.227563 +999,4155,0.240433,0.227508 +999,4156,0.240375,0.227446 +1000,4157,0.240558,0.227634 +1000,4158,0.240500,0.227572 +1000,4159,0.240442,0.227517 +1000,4160,0.240385,0.227462 +1000,4161,0.240327,0.227408 +1000,4162,0.240269,0.227353 +1000,4163,0.240211,0.227298 +1001,4164,0.240394,0.227478 +1002,4165,0.240576,0.227658 +1002,4166,0.240518,0.227604 +1003,4167,0.240701,0.227783 +1004,4168,0.240883,0.227963 +1004,4169,0.240825,0.227909 +1004,4170,0.240767,0.227854 +1004,4171,0.240710,0.227799 +1004,4172,0.240652,0.227745 +1004,4173,0.240594,0.227690 +1004,4174,0.240537,0.227636 +1004,4175,0.240479,0.227581 +1004,4176,0.240421,0.227527 +1004,4177,0.240364,0.227472 +1004,4178,0.240306,0.227418 +1004,4179,0.240249,0.227363 +1004,4180,0.240191,0.227309 +1004,4181,0.240134,0.227254 +1004,4182,0.240077,0.227200 +1004,4183,0.240019,0.227138 +1004,4184,0.239962,0.227084 +1004,4185,0.239904,0.227030 +1004,4186,0.239847,0.226976 +1004,4187,0.239790,0.226921 +1004,4188,0.239733,0.226867 +1004,4189,0.239675,0.226813 +1004,4190,0.239618,0.226759 +1004,4191,0.239561,0.226705 +1004,4192,0.239504,0.226651 +1005,4193,0.239685,0.226830 +1005,4194,0.239628,0.226776 +1005,4195,0.239571,0.226722 +1005,4196,0.239514,0.226668 +1005,4197,0.239457,0.226614 +1005,4198,0.239400,0.226560 +1005,4199,0.239343,0.226506 +1005,4200,0.239286,0.226452 +1005,4201,0.239229,0.226391 +1005,4202,0.239172,0.226337 +1005,4203,0.239115,0.226283 +1005,4204,0.239058,0.226229 +1005,4205,0.239001,0.226175 +1005,4206,0.238944,0.226121 +1005,4207,0.238888,0.226068 +1005,4208,0.238831,0.226014 +1005,4209,0.238774,0.225960 +1006,4210,0.238955,0.226139 +1007,4211,0.239136,0.226317 +1007,4212,0.239079,0.226263 +1007,4213,0.239022,0.226210 +1007,4214,0.238965,0.226156 +1007,4215,0.238909,0.226102 +1007,4216,0.238852,0.226049 +1007,4217,0.238795,0.225995 +1007,4218,0.238739,0.225941 +1007,4219,0.238682,0.225888 +1007,4220,0.238626,0.225834 +1007,4221,0.238569,0.225781 +1007,4222,0.238513,0.225720 +1008,4223,0.238693,0.225905 +1008,4224,0.238636,0.225844 +1008,4225,0.238580,0.225791 +1008,4226,0.238523,0.225738 +1008,4227,0.238467,0.225684 +1008,4228,0.238411,0.225631 +1008,4229,0.238354,0.225577 +1008,4230,0.238298,0.225524 +1008,4231,0.238242,0.225471 +1008,4232,0.238185,0.225418 +1008,4233,0.238129,0.225364 +1008,4234,0.238073,0.225311 +1008,4235,0.238017,0.225258 +1008,4236,0.237960,0.225205 +1008,4237,0.237904,0.225152 +1008,4238,0.237848,0.225098 +1009,4239,0.238028,0.225276 +1009,4240,0.237972,0.225223 +1009,4241,0.237916,0.225170 +1009,4242,0.237860,0.225117 +1009,4243,0.237803,0.225056 +1009,4244,0.237747,0.225003 +1009,4245,0.237691,0.224950 +1009,4246,0.237635,0.224897 +1009,4247,0.237579,0.224844 +1010,4248,0.237759,0.225021 +1010,4249,0.237703,0.224968 +1010,4250,0.237647,0.224915 +1010,4251,0.237591,0.224863 +1011,4252,0.237770,0.225039 +1012,4253,0.237950,0.225216 +1012,4254,0.237894,0.225163 +1012,4255,0.237838,0.225111 +1012,4256,0.237782,0.225058 +1012,4257,0.237726,0.225005 +1012,4258,0.237670,0.224952 +1012,4259,0.237614,0.224899 +1013,4260,0.237793,0.225076 +1013,4261,0.237738,0.225023 +1013,4262,0.237682,0.224970 +1013,4263,0.237626,0.224917 +1013,4264,0.237570,0.224865 +1014,4265,0.237749,0.225041 +1014,4266,0.237693,0.224988 +1014,4267,0.237638,0.224936 +1014,4268,0.237582,0.224883 +1014,4269,0.237526,0.224823 +1014,4270,0.237471,0.224770 +1015,4271,0.237649,0.224947 +1015,4272,0.237594,0.224894 +1015,4273,0.237538,0.224841 +1015,4274,0.237482,0.224789 +1015,4275,0.237427,0.224736 +1015,4276,0.237371,0.224684 +1016,4277,0.237550,0.224860 +1016,4278,0.237494,0.224807 +1016,4279,0.237439,0.224754 +1016,4280,0.237383,0.224702 +1016,4281,0.237328,0.224649 +1017,4282,0.237506,0.224825 +1017,4283,0.237450,0.224773 +1017,4284,0.237395,0.224720 +1017,4285,0.237340,0.224668 +1018,4286,0.237517,0.224844 +1019,4287,0.237695,0.225019 +1019,4288,0.237640,0.224967 +1019,4289,0.237585,0.224914 +1019,4290,0.237529,0.224862 +1019,4291,0.237474,0.224809 +1019,4292,0.237418,0.224757 +1019,4293,0.237363,0.224705 +1019,4294,0.237308,0.224652 +1019,4295,0.237253,0.224593 +1019,4296,0.237197,0.224541 +1019,4297,0.237142,0.224488 +1019,4298,0.237087,0.224436 +1019,4299,0.237032,0.224384 +1019,4300,0.236977,0.224332 +1019,4301,0.236922,0.224280 +1019,4302,0.236867,0.224227 +1019,4303,0.236812,0.224175 +1019,4304,0.236757,0.224123 +1019,4305,0.236702,0.224071 +1020,4306,0.236879,0.224246 +1021,4307,0.237056,0.224421 +1021,4308,0.237001,0.224369 +1021,4309,0.236946,0.224317 +1021,4310,0.236891,0.224265 +1021,4311,0.236836,0.224213 +1022,4312,0.237013,0.224388 +1022,4313,0.236958,0.224336 +1023,4314,0.237135,0.224510 +1024,4315,0.237312,0.224685 +1025,4316,0.237488,0.224860 +1025,4317,0.237433,0.224807 +1026,4318,0.237610,0.224982 +1026,4319,0.237555,0.224930 +1027,4320,0.237731,0.225104 +1028,4321,0.237908,0.225278 +1028,4322,0.237853,0.225226 +1028,4323,0.237798,0.225174 +1029,4324,0.237974,0.225348 +1030,4325,0.238150,0.225523 +1031,4326,0.238326,0.225697 +1031,4327,0.238271,0.225644 +1031,4328,0.238216,0.225592 +1031,4329,0.238161,0.225540 +1031,4330,0.238106,0.225481 +1031,4331,0.238051,0.225429 +1031,4332,0.237996,0.225377 +1032,4333,0.238172,0.225551 +1033,4334,0.238348,0.225724 +1034,4335,0.238524,0.225898 +1035,4336,0.238699,0.226072 +1036,4337,0.238875,0.226245 +1036,4338,0.238820,0.226193 +1036,4339,0.238765,0.226141 +1036,4340,0.238710,0.226089 +1037,4341,0.238885,0.226262 +1037,4342,0.238830,0.226210 +1037,4343,0.238775,0.226158 +1037,4344,0.238720,0.226106 +1037,4345,0.238665,0.226054 +1037,4346,0.238610,0.226002 +1038,4347,0.238785,0.226175 +1038,4348,0.238730,0.226123 +1039,4349,0.238905,0.226296 +1039,4350,0.238851,0.226244 +1039,4351,0.238796,0.226192 +1039,4352,0.238741,0.226140 +1039,4353,0.238686,0.226088 +1039,4354,0.238631,0.226036 +1039,4355,0.238576,0.225984 +1039,4356,0.238522,0.225932 +1039,4357,0.238467,0.225881 +1040,4358,0.238642,0.226053 +1040,4359,0.238587,0.225994 +1040,4360,0.238532,0.225942 +1040,4361,0.238477,0.225891 +1040,4362,0.238423,0.225839 +1040,4363,0.238368,0.225787 +1040,4364,0.238313,0.225735 +1040,4365,0.238259,0.225684 +1041,4366,0.238433,0.225856 +1041,4367,0.238379,0.225804 +1041,4368,0.238324,0.225753 +1042,4369,0.238499,0.225925 +1043,4370,0.238673,0.226097 +1044,4371,0.238847,0.226270 +1044,4372,0.238792,0.226218 +1044,4373,0.238738,0.226166 +1044,4374,0.238683,0.226115 +1044,4375,0.238629,0.226063 +1044,4376,0.238574,0.226011 +1044,4377,0.238520,0.225960 +1044,4378,0.238465,0.225908 +1044,4379,0.238411,0.225856 +1044,4380,0.238356,0.225805 +1044,4381,0.238302,0.225746 +1045,4382,0.238476,0.225918 +1045,4383,0.238421,0.225866 +1046,4384,0.238595,0.226038 +1046,4385,0.238540,0.225987 +1046,4386,0.238486,0.225935 +1046,4387,0.238432,0.225884 +1047,4388,0.238605,0.226055 +1047,4389,0.238551,0.226004 +1048,4390,0.238724,0.226175 +1048,4391,0.238670,0.226124 +1048,4392,0.238616,0.226072 +1048,4393,0.238561,0.226021 +1048,4394,0.238507,0.225970 +1048,4395,0.238453,0.225918 +1048,4396,0.238399,0.225867 +1048,4397,0.238344,0.225815 +1048,4398,0.238290,0.225764 +1048,4399,0.238236,0.225713 +1048,4400,0.238182,0.225661 +1049,4401,0.238355,0.225833 +1049,4402,0.238301,0.225781 +1049,4403,0.238247,0.225730 +1049,4404,0.238193,0.225672 +1050,4405,0.238365,0.225843 +1050,4406,0.238311,0.225791 +1050,4407,0.238257,0.225740 +1050,4408,0.238203,0.225689 +1050,4409,0.238149,0.225638 +1051,4410,0.238322,0.225809 +1051,4411,0.238268,0.225758 +1051,4412,0.238214,0.225706 +1051,4413,0.238160,0.225655 +1051,4414,0.238106,0.225604 +1052,4415,0.238279,0.225775 +1052,4416,0.238225,0.225724 +1052,4417,0.238171,0.225673 +1053,4418,0.238343,0.225843 +1053,4419,0.238289,0.225792 +1053,4420,0.238235,0.225741 +1053,4421,0.238181,0.225690 +1053,4422,0.238128,0.225639 +1053,4423,0.238074,0.225588 +1054,4424,0.238246,0.225759 +1055,4425,0.238418,0.225929 +1055,4426,0.238364,0.225878 +1056,4427,0.238536,0.226048 +1057,4428,0.238708,0.226218 +1057,4429,0.238654,0.226160 +1057,4430,0.238600,0.226109 +1057,4431,0.238547,0.226058 +1057,4432,0.238493,0.226007 +1057,4433,0.238439,0.225956 +1057,4434,0.238385,0.225905 +1057,4435,0.238331,0.225854 +1057,4436,0.238278,0.225803 +1057,4437,0.238224,0.225752 +1058,4438,0.238396,0.225922 +1058,4439,0.238342,0.225871 +1058,4440,0.238288,0.225820 +1058,4441,0.238235,0.225770 +1058,4442,0.238181,0.225719 +1058,4443,0.238127,0.225668 +1058,4444,0.238074,0.225617 +1059,4445,0.238245,0.225787 +1059,4446,0.238192,0.225736 +1059,4447,0.238138,0.225685 +1060,4448,0.238309,0.225855 +1060,4449,0.238256,0.225797 +1060,4450,0.238202,0.225746 +1060,4451,0.238149,0.225695 +1060,4452,0.238095,0.225645 +1060,4453,0.238042,0.225594 +1060,4454,0.237988,0.225543 +1060,4455,0.237935,0.225493 +1060,4456,0.237882,0.225442 +1060,4457,0.237828,0.225392 +1060,4458,0.237775,0.225341 +1060,4459,0.237721,0.225291 +1060,4460,0.237668,0.225240 +1060,4461,0.237615,0.225190 +1061,4462,0.237786,0.225359 +1061,4463,0.237732,0.225308 +1062,4464,0.237903,0.225477 +1062,4465,0.237850,0.225427 +1062,4466,0.237797,0.225376 +1062,4467,0.237743,0.225326 +1063,4468,0.237914,0.225488 +1064,4469,0.238085,0.225656 +1064,4470,0.238031,0.225606 +1064,4471,0.237978,0.225556 +1065,4472,0.238148,0.225724 +1065,4473,0.238095,0.225674 +1065,4474,0.238042,0.225623 +1065,4475,0.237989,0.225573 +1065,4476,0.237936,0.225523 +1065,4477,0.237883,0.225472 +1065,4478,0.237829,0.225422 +1066,4479,0.238000,0.225590 +1066,4480,0.237946,0.225540 +1067,4481,0.238116,0.225709 +1067,4482,0.238063,0.225658 +1067,4483,0.238010,0.225608 +1068,4484,0.238180,0.225776 +1068,4485,0.238127,0.225726 +1068,4486,0.238074,0.225676 +1068,4487,0.238021,0.225625 +1068,4488,0.237968,0.225575 +1068,4489,0.237915,0.225517 +1068,4490,0.237862,0.225467 +1068,4491,0.237809,0.225417 +1069,4492,0.237979,0.225585 +1070,4493,0.238148,0.225753 +1071,4494,0.238318,0.225921 +1071,4495,0.238265,0.225871 +1071,4496,0.238212,0.225821 +1071,4497,0.238159,0.225770 +1071,4498,0.238106,0.225720 +1071,4499,0.238053,0.225670 +1071,4500,0.238000,0.225620 +1071,4501,0.237947,0.225570 +1071,4502,0.237894,0.225520 +1072,4503,0.238064,0.225687 +1072,4504,0.238011,0.225637 +1073,4505,0.238180,0.225805 +1073,4506,0.238127,0.225755 +1074,4507,0.238296,0.225922 +1075,4508,0.238465,0.226090 +1075,4509,0.238412,0.226040 +1076,4510,0.238581,0.226200 +1076,4511,0.238528,0.226150 +1076,4512,0.238475,0.226099 +1077,4513,0.238644,0.226267 +1077,4514,0.238591,0.226217 +1077,4515,0.238538,0.226167 +1078,4516,0.238707,0.226334 +1078,4517,0.238654,0.226284 +1078,4518,0.238601,0.226233 +1078,4519,0.238548,0.226183 +1078,4520,0.238496,0.226133 +1079,4521,0.238664,0.226300 +1080,4522,0.238832,0.226467 +1080,4523,0.238780,0.226417 +1081,4524,0.238948,0.226584 +1082,4525,0.239116,0.226751 +1082,4526,0.239063,0.226701 +1082,4527,0.239010,0.226651 +1082,4528,0.238958,0.226601 +1083,4529,0.239126,0.226767 +1083,4530,0.239073,0.226710 +1083,4531,0.239020,0.226660 +1084,4532,0.239188,0.226826 +1084,4533,0.239135,0.226776 +1084,4534,0.239082,0.226726 +1084,4535,0.239030,0.226676 +1085,4536,0.239198,0.226843 +1085,4537,0.239145,0.226793 +1085,4538,0.239092,0.226743 +1086,4539,0.239260,0.226909 +1086,4540,0.239207,0.226859 +1086,4541,0.239154,0.226809 +1086,4542,0.239102,0.226759 +1086,4543,0.239049,0.226709 +1086,4544,0.238996,0.226659 +1087,4545,0.239164,0.226825 +1087,4546,0.239111,0.226776 +1088,4547,0.239279,0.226942 +1088,4548,0.239226,0.226892 +1088,4549,0.239173,0.226834 +1089,4550,0.239341,0.227000 +1089,4551,0.239288,0.226951 +1089,4552,0.239236,0.226901 +1090,4553,0.239403,0.227066 +1090,4554,0.239350,0.227017 +1090,4555,0.239297,0.226967 +1090,4556,0.239245,0.226917 +1090,4557,0.239192,0.226867 +1090,4558,0.239140,0.226817 +1091,4559,0.239307,0.226983 +1091,4560,0.239254,0.226933 +1091,4561,0.239202,0.226883 +1091,4562,0.239149,0.226834 +1092,4563,0.239316,0.226999 +1092,4564,0.239264,0.226949 +1092,4565,0.239211,0.226900 +1093,4566,0.239378,0.227065 +1093,4567,0.239326,0.227008 +1093,4568,0.239273,0.226958 +1093,4569,0.239221,0.226909 +1094,4570,0.239387,0.227074 +1095,4571,0.239554,0.227239 +1095,4572,0.239501,0.227189 +1095,4573,0.239449,0.227140 +1095,4574,0.239397,0.227090 +1095,4575,0.239344,0.227040 +1095,4576,0.239292,0.226991 +1096,4577,0.239458,0.227156 +1096,4578,0.239406,0.227106 +1097,4579,0.239572,0.227271 +1097,4580,0.239520,0.227221 +1097,4581,0.239467,0.227172 +1098,4582,0.239633,0.227336 +1098,4583,0.239581,0.227287 +1099,4584,0.239747,0.227444 +1099,4585,0.239695,0.227395 +1099,4586,0.239642,0.227345 +1099,4587,0.239590,0.227296 +1099,4588,0.239538,0.227246 +1099,4589,0.239486,0.227196 +1100,4590,0.239651,0.227361 +1100,4591,0.239599,0.227311 +1101,4592,0.239765,0.227476 +1101,4593,0.239713,0.227426 +1101,4594,0.239660,0.227377 +1102,4595,0.239826,0.227541 +1102,4596,0.239774,0.227492 +1102,4597,0.239722,0.227442 +1102,4598,0.239669,0.227393 +1102,4599,0.239617,0.227343 +1102,4600,0.239565,0.227294 +1102,4601,0.239513,0.227244 +1103,4602,0.239678,0.227401 +1103,4603,0.239626,0.227352 +1103,4604,0.239574,0.227302 +1104,4605,0.239739,0.227466 +1104,4606,0.239687,0.227417 +1104,4607,0.239635,0.227368 +1104,4608,0.239583,0.227318 +1105,4609,0.239748,0.227482 +1105,4610,0.239696,0.227433 +1106,4611,0.239861,0.227597 +1106,4612,0.239809,0.227547 +1106,4613,0.239757,0.227498 +1106,4614,0.239705,0.227449 +1106,4615,0.239653,0.227399 +1106,4616,0.239601,0.227350 +1107,4617,0.239766,0.227514 +1107,4618,0.239714,0.227464 +1107,4619,0.239662,0.227408 +1108,4620,0.239827,0.227571 +1108,4621,0.239775,0.227522 +1108,4622,0.239723,0.227473 +1108,4623,0.239671,0.227424 +1108,4624,0.239619,0.227374 +1108,4625,0.239568,0.227325 +1108,4626,0.239516,0.227276 +1108,4627,0.239464,0.227227 +1109,4628,0.239628,0.227390 +1110,4629,0.239793,0.227553 +1111,4630,0.239957,0.227717 +1111,4631,0.239905,0.227667 +1111,4632,0.239853,0.227618 +1111,4633,0.239801,0.227569 +1111,4634,0.239750,0.227520 +1112,4635,0.239914,0.227676 +1112,4636,0.239862,0.227627 +1112,4637,0.239810,0.227577 +1112,4638,0.239759,0.227528 +1113,4639,0.239922,0.227691 +1113,4640,0.239871,0.227642 +1113,4641,0.239819,0.227593 +1113,4642,0.239767,0.227544 +1113,4643,0.239716,0.227495 +1113,4644,0.239664,0.227446 +1114,4645,0.239828,0.227609 +1115,4646,0.239991,0.227771 +1116,4647,0.240155,0.227934 +1116,4648,0.240103,0.227885 +1117,4649,0.240267,0.228047 +1117,4650,0.240215,0.227991 +1118,4651,0.240378,0.228153 +1118,4652,0.240327,0.228104 +1118,4653,0.240275,0.228055 +1118,4654,0.240223,0.228006 +1119,4655,0.240387,0.228169 +1119,4656,0.240335,0.228120 +1119,4657,0.240283,0.228071 +1120,4658,0.240447,0.228233 +1120,4659,0.240395,0.228184 +1121,4660,0.240558,0.228346 +1121,4661,0.240506,0.228297 +1122,4662,0.240669,0.228459 +1122,4663,0.240618,0.228410 +1122,4664,0.240566,0.228361 +1123,4665,0.240729,0.228515 +1124,4666,0.240892,0.228677 +1124,4667,0.240840,0.228628 +1124,4668,0.240788,0.228579 +1125,4669,0.240951,0.228741 +1125,4670,0.240899,0.228692 +1125,4671,0.240848,0.228643 +1126,4672,0.241010,0.228805 +1126,4673,0.240959,0.228756 +1126,4674,0.240907,0.228707 +1126,4675,0.240856,0.228658 +1127,4676,0.241018,0.228819 +1127,4677,0.240966,0.228770 +1127,4678,0.240915,0.228721 +1127,4679,0.240863,0.228673 +1128,4680,0.241026,0.228827 +1128,4681,0.240974,0.228778 +1128,4682,0.240923,0.228729 +1128,4683,0.240871,0.228680 +1128,4684,0.240820,0.228631 +1129,4685,0.240982,0.228792 +1129,4686,0.240930,0.228743 +1129,4687,0.240879,0.228695 +1130,4688,0.241041,0.228856 +1131,4689,0.241203,0.229017 +1131,4690,0.241151,0.228968 +1131,4691,0.241100,0.228919 +1132,4692,0.241262,0.229080 +1132,4693,0.241210,0.229031 +1133,4694,0.241372,0.229185 +1134,4695,0.241534,0.229346 +1134,4696,0.241482,0.229297 +1134,4697,0.241431,0.229248 +1134,4698,0.241379,0.229199 +1135,4699,0.241541,0.229360 +1135,4700,0.241489,0.229311 +1136,4701,0.241651,0.229472 +1137,4702,0.241812,0.229632 +1137,4703,0.241761,0.229583 +1137,4704,0.241709,0.229534 +1137,4705,0.241658,0.229486 +1137,4706,0.241606,0.229437 +1137,4707,0.241555,0.229381 +1137,4708,0.241504,0.229332 +1137,4709,0.241453,0.229283 +1137,4710,0.241401,0.229235 +1138,4711,0.241562,0.229395 +1138,4712,0.241511,0.229346 +1138,4713,0.241460,0.229298 +1138,4714,0.241409,0.229249 +1138,4715,0.241357,0.229200 +1138,4716,0.241306,0.229152 +1138,4717,0.241255,0.229103 +1138,4718,0.241204,0.229055 +1138,4719,0.241153,0.229006 +1138,4720,0.241102,0.228958 +1139,4721,0.241262,0.229118 +1139,4722,0.241211,0.229069 +1140,4723,0.241372,0.229222 +1141,4724,0.241533,0.229382 +1141,4725,0.241481,0.229333 +1141,4726,0.241430,0.229284 +1141,4727,0.241379,0.229236 +1142,4728,0.241540,0.229396 +1143,4729,0.241700,0.229555 +1143,4730,0.241649,0.229507 +1143,4731,0.241598,0.229458 +1143,4732,0.241547,0.229410 +1144,4733,0.241707,0.229569 +1144,4734,0.241656,0.229521 +1144,4735,0.241605,0.229472 +1144,4736,0.241554,0.229424 +1144,4737,0.241503,0.229368 +1144,4738,0.241452,0.229320 +1144,4739,0.241401,0.229271 +1144,4740,0.241350,0.229223 +1144,4741,0.241299,0.229175 +1144,4742,0.241248,0.229126 +1144,4743,0.241198,0.229078 +1144,4744,0.241147,0.229030 +1145,4745,0.241307,0.229189 +1145,4746,0.241256,0.229141 +1145,4747,0.241205,0.229092 +1145,4748,0.241154,0.229044 +1145,4749,0.241103,0.228996 +1146,4750,0.241263,0.229155 +1146,4751,0.241212,0.229107 +1146,4752,0.241162,0.229059 +1146,4753,0.241111,0.229010 +1146,4754,0.241060,0.228955 +1146,4755,0.241009,0.228907 +1146,4756,0.240959,0.228859 +1146,4757,0.240908,0.228811 +1146,4758,0.240858,0.228762 +1146,4759,0.240807,0.228714 +1146,4760,0.240756,0.228666 +1146,4761,0.240706,0.228618 +1146,4762,0.240655,0.228570 +1146,4763,0.240605,0.228522 +1147,4764,0.240764,0.228681 +1147,4765,0.240714,0.228633 +1147,4766,0.240663,0.228585 +1147,4767,0.240613,0.228537 +1148,4768,0.240772,0.228696 +1149,4769,0.240931,0.228847 +1149,4770,0.240881,0.228799 +1149,4771,0.240830,0.228751 +1149,4772,0.240780,0.228703 +1149,4773,0.240729,0.228655 +1149,4774,0.240679,0.228607 +1150,4775,0.240838,0.228766 +1151,4776,0.240997,0.228924 +1151,4777,0.240946,0.228876 +1151,4778,0.240896,0.228828 +1151,4779,0.240845,0.228780 +1151,4780,0.240795,0.228732 +1151,4781,0.240745,0.228685 +1151,4782,0.240694,0.228637 +1152,4783,0.240853,0.228795 +1153,4784,0.241012,0.228946 +1153,4785,0.240961,0.228898 +1153,4786,0.240911,0.228850 +1153,4787,0.240861,0.228802 +1153,4788,0.240810,0.228754 +1154,4789,0.240969,0.228912 +1154,4790,0.240919,0.228865 +1155,4791,0.241077,0.229022 +1155,4792,0.241027,0.228975 +1156,4793,0.241185,0.229132 +1156,4794,0.241135,0.229085 +1156,4795,0.241084,0.229037 +1156,4796,0.241034,0.228989 +1156,4797,0.240984,0.228934 +1156,4798,0.240934,0.228886 +1156,4799,0.240884,0.228839 +1156,4800,0.240833,0.228791 +1157,4801,0.240991,0.228949 +1157,4802,0.240941,0.228901 +1157,4803,0.240891,0.228853 +1157,4804,0.240841,0.228806 +1157,4805,0.240791,0.228758 +1157,4806,0.240741,0.228710 +1157,4807,0.240691,0.228663 +1157,4808,0.240641,0.228615 +1157,4809,0.240591,0.228568 +1157,4810,0.240541,0.228520 +1157,4811,0.240491,0.228473 +1157,4812,0.240441,0.228425 +1157,4813,0.240391,0.228378 +1158,4814,0.240548,0.228528 +1158,4815,0.240498,0.228480 +1159,4816,0.240656,0.228637 +1159,4817,0.240606,0.228590 +1159,4818,0.240556,0.228542 +1159,4819,0.240506,0.228495 +1159,4820,0.240456,0.228448 +1159,4821,0.240407,0.228400 +1159,4822,0.240357,0.228353 +1159,4823,0.240307,0.228305 +1159,4824,0.240257,0.228258 +1160,4825,0.240415,0.228415 +1160,4826,0.240365,0.228368 +1160,4827,0.240315,0.228320 +1160,4828,0.240265,0.228273 +1160,4829,0.240215,0.228226 +1161,4830,0.240373,0.228375 +1162,4831,0.240530,0.228532 +1162,4832,0.240480,0.228485 +1163,4833,0.240637,0.228641 +1163,4834,0.240588,0.228594 +1163,4835,0.240538,0.228547 +1163,4836,0.240488,0.228500 +1164,4837,0.240645,0.228656 +1164,4838,0.240595,0.228609 +1165,4839,0.240752,0.228765 +1165,4840,0.240702,0.228718 +1165,4841,0.240653,0.228663 +1165,4842,0.240603,0.228616 +1165,4843,0.240553,0.228569 +1165,4844,0.240504,0.228522 +1165,4845,0.240454,0.228475 +1165,4846,0.240404,0.228428 +1165,4847,0.240355,0.228380 +1165,4848,0.240305,0.228333 +1166,4849,0.240462,0.228489 +1166,4850,0.240412,0.228442 +1166,4851,0.240363,0.228395 +1166,4852,0.240313,0.228348 +1167,4853,0.240470,0.228504 +1167,4854,0.240420,0.228457 +1168,4855,0.240577,0.228606 +1168,4856,0.240527,0.228559 +1168,4857,0.240478,0.228512 +1168,4858,0.240428,0.228465 +1168,4859,0.240379,0.228418 +1168,4860,0.240329,0.228371 +1168,4861,0.240280,0.228324 +1168,4862,0.240230,0.228277 +1169,4863,0.240387,0.228433 +1169,4864,0.240337,0.228386 +1170,4865,0.240493,0.228541 +1170,4866,0.240444,0.228494 +1171,4867,0.240600,0.228650 +1171,4868,0.240551,0.228603 +1171,4869,0.240501,0.228549 +1171,4870,0.240452,0.228502 +1172,4871,0.240608,0.228657 +1172,4872,0.240558,0.228610 +1172,4873,0.240509,0.228563 +1172,4874,0.240460,0.228517 +1172,4875,0.240410,0.228470 +1173,4876,0.240566,0.228625 +1173,4877,0.240517,0.228578 +1173,4878,0.240467,0.228531 +1173,4879,0.240418,0.228485 +1173,4880,0.240369,0.228438 +1173,4881,0.240320,0.228391 +1173,4882,0.240270,0.228344 +1173,4883,0.240221,0.228297 +1173,4884,0.240172,0.228251 +1173,4885,0.240123,0.228197 +1173,4886,0.240074,0.228150 +1174,4887,0.240229,0.228305 +1175,4888,0.240385,0.228460 +1175,4889,0.240335,0.228413 +1176,4890,0.240491,0.228568 +1176,4891,0.240442,0.228522 +1177,4892,0.240597,0.228676 +1177,4893,0.240548,0.228630 +1177,4894,0.240499,0.228583 +1177,4895,0.240449,0.228536 +1177,4896,0.240400,0.228490 +1177,4897,0.240351,0.228436 +1177,4898,0.240302,0.228389 +1177,4899,0.240253,0.228342 +1177,4900,0.240204,0.228296 +1178,4901,0.240359,0.228450 +1178,4902,0.240310,0.228404 +1178,4903,0.240261,0.228357 +1178,4904,0.240212,0.228311 +1178,4905,0.240163,0.228264 +1179,4906,0.240318,0.228419 +1179,4907,0.240269,0.228372 +1179,4908,0.240220,0.228326 +1180,4909,0.240375,0.228480 +1180,4910,0.240326,0.228426 +1180,4911,0.240277,0.228380 +1180,4912,0.240228,0.228333 +1180,4913,0.240179,0.228287 +1180,4914,0.240130,0.228240 +1180,4915,0.240081,0.228194 +1180,4916,0.240033,0.228147 +1181,4917,0.240187,0.228302 +1181,4918,0.240138,0.228255 +1181,4919,0.240089,0.228209 +1181,4920,0.240041,0.228162 +1182,4921,0.240195,0.228317 +1182,4922,0.240146,0.228270 +1182,4923,0.240098,0.228224 +1182,4924,0.240049,0.228177 +1182,4925,0.240000,0.228131 +1183,4926,0.240154,0.228278 +1184,4927,0.240309,0.228432 +1184,4928,0.240260,0.228385 +1184,4929,0.240211,0.228339 +1184,4930,0.240162,0.228293 +1185,4931,0.240316,0.228446 +1186,4932,0.240470,0.228600 +1186,4933,0.240422,0.228554 +1187,4934,0.240576,0.228700 +1188,4935,0.240729,0.228854 +1188,4936,0.240681,0.228808 +1189,4937,0.240835,0.228961 +1190,4938,0.240988,0.229115 +1190,4939,0.240939,0.229068 +1190,4940,0.240891,0.229022 +1190,4941,0.240842,0.228976 +1190,4942,0.240793,0.228929 +1190,4943,0.240744,0.228883 +1191,4944,0.240898,0.229036 +1192,4945,0.241052,0.229182 +1192,4946,0.241003,0.229136 +1192,4947,0.240954,0.229090 +1193,4948,0.241108,0.229243 +1193,4949,0.241059,0.229196 +1194,4950,0.241212,0.229350 +1194,4951,0.241163,0.229303 +1194,4952,0.241115,0.229257 +1194,4953,0.241066,0.229211 +1194,4954,0.241017,0.229164 +1194,4955,0.240969,0.229118 +1194,4956,0.240920,0.229072 +1194,4957,0.240871,0.229026 +1194,4958,0.240823,0.228972 +1194,4959,0.240774,0.228926 +1194,4960,0.240726,0.228880 +1194,4961,0.240677,0.228834 +1194,4962,0.240629,0.228788 +1194,4963,0.240580,0.228741 +1194,4964,0.240532,0.228695 +1195,4965,0.240685,0.228848 +1195,4966,0.240636,0.228802 +1195,4967,0.240588,0.228756 +1196,4968,0.240741,0.228909 +1196,4969,0.240692,0.228863 +1196,4970,0.240644,0.228817 +1196,4971,0.240595,0.228771 +1196,4972,0.240547,0.228725 +1196,4973,0.240499,0.228671 +1196,4974,0.240450,0.228625 +1197,4975,0.240603,0.228778 +1197,4976,0.240555,0.228732 +1197,4977,0.240506,0.228686 +1197,4978,0.240458,0.228640 +1197,4979,0.240410,0.228594 +1198,4980,0.240562,0.228746 +1198,4981,0.240514,0.228700 +1198,4982,0.240466,0.228654 +1198,4983,0.240417,0.228609 +1198,4984,0.240369,0.228563 +1198,4985,0.240321,0.228517 +1199,4986,0.240473,0.228662 +1199,4987,0.240425,0.228616 +1199,4988,0.240377,0.228570 +1199,4989,0.240329,0.228524 +1200,4990,0.240481,0.228676 +1200,4991,0.240433,0.228631 +1200,4992,0.240385,0.228585 +1200,4993,0.240336,0.228539 +1201,4994,0.240489,0.228691 +1201,4995,0.240440,0.228645 +1202,4996,0.240592,0.228797 +1202,4997,0.240544,0.228751 +1202,4998,0.240496,0.228698 +1202,4999,0.240448,0.228652 +1202,5000,0.240400,0.228607 diff --git a/articles/bugprobhunt/trials20.png b/articles/bugprobhunt/trials20.png new file mode 100644 index 00000000..123a9d04 Binary files /dev/null and b/articles/bugprobhunt/trials20.png differ diff --git a/articles/bugprobhunt/trials5000.png b/articles/bugprobhunt/trials5000.png new file mode 100644 index 00000000..ade15d87 Binary files /dev/null and b/articles/bugprobhunt/trials5000.png differ diff --git a/articles/cryptusb/SConscript b/articles/cryptusb/SConscript new file mode 100644 index 00000000..450d94c6 --- /dev/null +++ b/articles/cryptusb/SConscript @@ -0,0 +1,32 @@ +import os + +pjoin = os.path.join + +if False: + Import = None + env = None +Import(["env"]) + +# env["SESSION_YAML"] = env.File("_session.yaml") +# env.Command("_session.yaml", "session", "./$SOURCE $CONF $TARGET") +env["SESSION_YAML"] = env.File("session.yaml") + +env.MAKO("_index.md", "index.md.mako", MAKOFLAGS="-i $SESSION_YAML") +env.Depends("_index.md", env["SESSION_YAML"]) + +env["PANDOC_TEMPLATE"] = env.File("../../templates/pandoctoc.tmpl.html") + +env.PANDOC( + "_index.bhtml.mako.sed", + "_index.md", + PANDOCFLAGS="-N -s --toc --template=$PANDOC_TEMPLATE", +) +env.Depends("_index.bhtml.mako.sed", env["PANDOC_TEMPLATE"]) +env.Command( + "_index.bhtml.mako", + "_index.bhtml.mako.sed", + r"""sed -e 's@{\(.\?\)b}@<\1b>@g' $SOURCE > $TARGET""", +) +env.MAKO("index.html", "_index.bhtml.mako", MAKOFLAGS="-t htmlpage -r '#dollar#=$'") + +env.HTMLSITEFILES.add("articles/cryptusb/index.html") diff --git a/articles/cryptusb/_index.bhtml.mako b/articles/cryptusb/_index.bhtml.mako new file mode 100644 index 00000000..651e0b22 --- /dev/null +++ b/articles/cryptusb/_index.bhtml.mako @@ -0,0 +1,191 @@ + +

1 Why pmount

+

There are many ways to set up how removable media is mounted (or even +auto-mounted) in linux. Out of those, pmount provides the +following advantages:

+
    +
  • users can mount drives
  • +
  • out-of-the-box LUKS (encrypted) support
  • +
  • no configuration, even for encrypted partitions
  • +
+

These are my short notes on how to format a USB drive in a way that +is compatible with pmount.

+

2 Identifying the USB drive

+

lsblk -f shows all block devices in the system. If we +run it before inserting the drive, and then after, the inserted drive is +the new device in the output:

+
$ lsblk -f
+NAME   FSTYPE      FSVER LABEL       UUID                                 FSAVAIL FSUSE% MOUNTPOINT
+sda
+|-sda1
+|-sda2 ext4        1.0   sddroot     38e24d86-4374-4042-aebe-eeaec2317b6f    5.5G    84% /
+sdb
+

We can also use watch +(1) or ogle (shameless +plug) to monitor the output of lsblk and get an immediate +feedback when the drive is detected.

+

3 Creating the luks-encrypted +partition

+

All examples assume that an empty USB drive was inserted and +identified as /dev/sdb. The commands below are dangerous, +do not use them if you don’t understand what they are doing.

+

3.1 Partition the drive

+

We can use fdisk or any other partitioning tool. An +example session:

+
$ sudo fdisk /dev/sdb
+Welcome to fdisk (util-linux 2.36.1).
+Changes will remain in memory only, until you decide to write them.
+Be careful before using the write command.
+Device does not contain a recognized partition table.
+Created a new DOS disklabel with disk identifier 0x0677b040.
+Command (m for help): n
+Partition type
+   p   primary (0 primary, 0 extended, 4 free)
+   e   extended (container for logical partitions)
+Select (default p): p
+Partition number (1-4, default 1): 
+First sector (2048-102399, default 2048): 
+Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-102399, default 102399): 
+Created a new partition 1 of type 'Linux' and of size 49 MiB.
+Command (m for help): w
+The partition table has been altered.
+Syncing disks.
+

The partition type doesn’t matter much, it has no relation with the +file system in linux. Use 83 (Linux) if in doubt.

+

3.2 Format the partition

+

Use cryptsetup luksFormat to format the partition; we also +choose the passphrase in this step. Let’s create a variable with the +partition (/dev/sdb1 in this example) and format it:

+
$ part=/dev/sdb1
+$ sudo cryptsetup luksFormat --label cryptflash "$part"
+WARNING: Device /dev/sdb1 already contains a 'dos' partition signature.
+WARNING!
+========
+This will overwrite data on /dev/sdb1 irrevocably.
+Are you sure? (Type 'yes' in capital letters): YES
+Enter passphrase for /dev/sdb1: mypassphrase
+
+Verify passphrase: mypassphrase
+

3.3 Create the filesystem

+

This is a two-step process: we first “open” the luks partition, +creating a pseudo-device; and then we create the filesystem we want on +top of that. The filesystem layer doesn’t care if the device is an +abstract cryptographic engine or a real partition.

+

Let’s open the luks partition in the pseudo-device +cryptdev:

+
$ sudo cryptsetup luksOpen "$part" cryptdev
+Enter passphrase for /dev/sdb1: mypassphrase
+

We now have to create the filesystem. The pmount manual has a list +of supported filesystems. ext4 is the most popular one for +non-removable drives, but it’s not great for drives that we want to use +in multiple systems, as the UIDs are hard-coded in the FS. That means +that we don’t have the proper permissions when we plug the drive in +other systems where our UID has a different numerical value. We’d then +have to use sudo, which nullifies one of the advantages of +pmount.

+

For this reason, we are using UDF for +the partition:

+
$ sudo mkfs.udf -l cryptflash /dev/mapper/cryptdev
+filename=/dev/mapper/cryptdev
+label=cryptflash
+uuid=61d338188d37bb6e
+blocksize=512
+blocks=69632
+udfrev=2.01
+start=0, blocks=64, type=ERASE
+start=64, blocks=13, type=VRS
+start=77, blocks=19, type=ERASE
+start=96, blocks=16, type=MVDS
+start=112, blocks=16, type=ERASE
+start=128, blocks=16, type=LVID
+start=144, blocks=112, type=ERASE
+start=256, blocks=1, type=ANCHOR
+start=257, blocks=69112, type=PSPACE
+start=69369, blocks=6, type=ERASE
+start=69375, blocks=1, type=ANCHOR
+start=69376, blocks=96, type=ERASE
+start=69472, blocks=16, type=RVDS
+start=69488, blocks=143, type=ERASE
+start=69631, blocks=1, type=ANCHOR
+mkudffs: Warning: Creating new UDF filesystem on partition, and not on whole disk device
+mkudffs: Warning: UDF filesystem on partition cannot be read on Apple systems
+

At last, we close the luks layer with:

+
$ sudo cryptsetup luksClose cryptdev
+

4 Mounting/unmounting the +drive

+

We could luksOpen the device and just use the regular +mount to access the files - but using pmount is much more +convenient, as it takes care of doing both steps and doesn’t require any +configuration or permissions.

+

All partitions in block devices pop up in +/dev/disk/by-label/ as symbolic links to the underlying +/dev entry. We can simply use that path as the argument to +pmount to get the corresponding filesystem mounted at +/media/:

+
$ pmount /dev/disk/by-label/cryptflash
+

To unmount:

+
$ pumount /media/disk_by-label_cryptflash/
+

We can also create a simple script that does that when given the +label:

+
#!/bin/bash
+
+label=#dollar#{1?Usage $0 <label>}
+
+set -e -x
+
+pmount "/dev/disk/by-label/$label"
+: mounted at "/media/disk_by-label_#dollar#{label}"
+

5 References

+ diff --git a/articles/cryptusb/_index.bhtml.mako.sed b/articles/cryptusb/_index.bhtml.mako.sed new file mode 100644 index 00000000..00cefe33 --- /dev/null +++ b/articles/cryptusb/_index.bhtml.mako.sed @@ -0,0 +1,191 @@ + +

1 Why pmount

+

There are many ways to set up how removable media is mounted (or even +auto-mounted) in linux. Out of those, pmount provides the +following advantages:

+
    +
  • users can mount drives
  • +
  • out-of-the-box LUKS (encrypted) support
  • +
  • no configuration, even for encrypted partitions
  • +
+

These are my short notes on how to format a USB drive in a way that +is compatible with pmount.

+

2 Identifying the USB drive

+

lsblk -f shows all block devices in the system. If we +run it before inserting the drive, and then after, the inserted drive is +the new device in the output:

+
$ lsblk -f
+NAME   FSTYPE      FSVER LABEL       UUID                                 FSAVAIL FSUSE% MOUNTPOINT
+sda
+|-sda1
+|-sda2 ext4        1.0   sddroot     38e24d86-4374-4042-aebe-eeaec2317b6f    5.5G    84% /
+sdb
+

We can also use watch +(1) or ogle (shameless +plug) to monitor the output of lsblk and get an immediate +feedback when the drive is detected.

+

3 Creating the luks-encrypted +partition

+

All examples assume that an empty USB drive was inserted and +identified as /dev/sdb. The commands below are dangerous, +do not use them if you don’t understand what they are doing.

+

3.1 Partition the drive

+

We can use fdisk or any other partitioning tool. An +example session:

+
$ {b}sudo fdisk /dev/sdb{/b}
+Welcome to fdisk (util-linux 2.36.1).
+Changes will remain in memory only, until you decide to write them.
+Be careful before using the write command.
+Device does not contain a recognized partition table.
+Created a new DOS disklabel with disk identifier 0x0677b040.
+Command (m for help): {b}n{/b}
+Partition type
+   p   primary (0 primary, 0 extended, 4 free)
+   e   extended (container for logical partitions)
+Select (default p): {b}p{/b}
+Partition number (1-4, default 1): {b}{/b}
+First sector (2048-102399, default 2048): {b}{/b}
+Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-102399, default 102399): {b}{/b}
+Created a new partition 1 of type 'Linux' and of size 49 MiB.
+Command (m for help): {b}w{/b}
+The partition table has been altered.
+Syncing disks.
+

The partition type doesn’t matter much, it has no relation with the +file system in linux. Use 83 (Linux) if in doubt.

+

3.2 Format the partition

+

Use cryptsetup luksFormat to format the partition; we also +choose the passphrase in this step. Let’s create a variable with the +partition (/dev/sdb1 in this example) and format it:

+
$ {b}part=/dev/sdb1{/b}
+$ {b}sudo cryptsetup luksFormat --label cryptflash "$part"{/b}
+WARNING: Device /dev/sdb1 already contains a 'dos' partition signature.
+WARNING!
+========
+This will overwrite data on /dev/sdb1 irrevocably.
+Are you sure? (Type 'yes' in capital letters): {b}YES{/b}
+Enter passphrase for /dev/sdb1: {b}mypassphrase{/b}
+
+Verify passphrase: {b}mypassphrase{/b}
+

3.3 Create the filesystem

+

This is a two-step process: we first “open” the luks partition, +creating a pseudo-device; and then we create the filesystem we want on +top of that. The filesystem layer doesn’t care if the device is an +abstract cryptographic engine or a real partition.

+

Let’s open the luks partition in the pseudo-device +cryptdev:

+
$ {b}sudo cryptsetup luksOpen "$part" cryptdev{/b}
+Enter passphrase for /dev/sdb1: {b}mypassphrase{/b}
+

We now have to create the filesystem. The pmount manual has a list +of supported filesystems. ext4 is the most popular one for +non-removable drives, but it’s not great for drives that we want to use +in multiple systems, as the UIDs are hard-coded in the FS. That means +that we don’t have the proper permissions when we plug the drive in +other systems where our UID has a different numerical value. We’d then +have to use sudo, which nullifies one of the advantages of +pmount.

+

For this reason, we are using UDF for +the partition:

+
$ {b}sudo mkfs.udf -l cryptflash /dev/mapper/cryptdev{/b}
+filename=/dev/mapper/cryptdev
+label=cryptflash
+uuid=61d338188d37bb6e
+blocksize=512
+blocks=69632
+udfrev=2.01
+start=0, blocks=64, type=ERASE
+start=64, blocks=13, type=VRS
+start=77, blocks=19, type=ERASE
+start=96, blocks=16, type=MVDS
+start=112, blocks=16, type=ERASE
+start=128, blocks=16, type=LVID
+start=144, blocks=112, type=ERASE
+start=256, blocks=1, type=ANCHOR
+start=257, blocks=69112, type=PSPACE
+start=69369, blocks=6, type=ERASE
+start=69375, blocks=1, type=ANCHOR
+start=69376, blocks=96, type=ERASE
+start=69472, blocks=16, type=RVDS
+start=69488, blocks=143, type=ERASE
+start=69631, blocks=1, type=ANCHOR
+mkudffs: Warning: Creating new UDF filesystem on partition, and not on whole disk device
+mkudffs: Warning: UDF filesystem on partition cannot be read on Apple systems
+

At last, we close the luks layer with:

+
$ {b}sudo cryptsetup luksClose cryptdev{/b}
+

4 Mounting/unmounting the +drive

+

We could luksOpen the device and just use the regular +mount to access the files - but using pmount is much more +convenient, as it takes care of doing both steps and doesn’t require any +configuration or permissions.

+

All partitions in block devices pop up in +/dev/disk/by-label/ as symbolic links to the underlying +/dev entry. We can simply use that path as the argument to +pmount to get the corresponding filesystem mounted at +/media/:

+
$ {b}pmount /dev/disk/by-label/cryptflash{/b}
+

To unmount:

+
$ {b}pumount /media/disk_by-label_cryptflash/{/b}
+

We can also create a simple script that does that when given the +label:

+
#!/bin/bash
+
+label=#dollar#{1?Usage $0 <label>}
+
+set -e -x
+
+pmount "/dev/disk/by-label/$label"
+: mounted at "/media/disk_by-label_#dollar#{label}"
+

5 References

+ diff --git a/articles/cryptusb/_index.md b/articles/cryptusb/_index.md new file mode 100644 index 00000000..63694696 --- /dev/null +++ b/articles/cryptusb/_index.md @@ -0,0 +1,201 @@ +--- +title: Creating a pmount-compatible encrypted USB drive +subtitle: Using the Linux Unified Key Setup (LUKS) +date: 2021-06-05 +... + +# Why pmount + +There are many ways to set up how removable media is mounted (or even +auto-mounted) in linux. Out of those, *pmount* provides the following +advantages: + +- users can mount drives +- out-of-the-box LUKS (encrypted) support +- no configuration, even for encrypted partitions + + +These are my short notes on how to format a USB drive in a way that is +compatible with pmount. + + +# Identifying the USB drive + +`lsblk -f` shows all block devices in the system. If we run it before inserting +the drive, and then after, the inserted drive is the new device in the output: + +``` +$ lsblk -f +NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINT +sda +|-sda1 +|-sda2 ext4 1.0 sddroot 38e24d86-4374-4042-aebe-eeaec2317b6f 5.5G 84% / +sdb +``` + +We can also use +[watch (1)](https://linux.die.net/man/1/watch) or +[ogle](https://github.com/lpenz/ogle/) (shameless plug) to monitor the output +of `lsblk` and get an immediate feedback when the drive is detected. + + +# Creating the luks-encrypted partition + +All examples assume that an empty USB drive was inserted and identified as +`/dev/sdb`. The commands below are dangerous, do not use them if you don't +understand what they are doing. + + +## Partition the drive + +We can use `fdisk` or any other partitioning tool. An example session: + +``` +$ {b}sudo fdisk /dev/sdb{/b} +Welcome to fdisk (util-linux 2.36.1). +Changes will remain in memory only, until you decide to write them. +Be careful before using the write command. +Device does not contain a recognized partition table. +Created a new DOS disklabel with disk identifier 0x0677b040. +Command (m for help): {b}n{/b} +Partition type + p primary (0 primary, 0 extended, 4 free) + e extended (container for logical partitions) +Select (default p): {b}p{/b} +Partition number (1-4, default 1): {b}{/b} +First sector (2048-102399, default 2048): {b}{/b} +Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-102399, default 102399): {b}{/b} +Created a new partition 1 of type 'Linux' and of size 49 MiB. +Command (m for help): {b}w{/b} +The partition table has been altered. +Syncing disks. +``` + +The partition type doesn't matter much, it has no relation with the file system +in linux. Use `83` (Linux) if in doubt. + + +## Format the partition + +Use *cryptsetup luksFormat* to format the partition; we also choose the +passphrase in this step. Let's create a variable with the partition +(`/dev/sdb1` in this example) and format it: + +``` +$ {b}part=/dev/sdb1{/b} +$ {b}sudo cryptsetup luksFormat --label cryptflash "$part"{/b} +WARNING: Device /dev/sdb1 already contains a 'dos' partition signature. +WARNING! +======== +This will overwrite data on /dev/sdb1 irrevocably. +Are you sure? (Type 'yes' in capital letters): {b}YES{/b} +Enter passphrase for /dev/sdb1: {b}mypassphrase{/b} + +Verify passphrase: {b}mypassphrase{/b} +``` + + +## Create the filesystem + +This is a two-step process: we first "open" the luks partition, creating a +pseudo-device; and then we create the filesystem we want on top of that. The +filesystem layer doesn't care if the device is an abstract cryptographic engine +or a real partition. + +Let's open the luks partition in the pseudo-device `cryptdev`: + +``` +$ {b}sudo cryptsetup luksOpen "$part" cryptdev{/b} +Enter passphrase for /dev/sdb1: {b}mypassphrase{/b} +``` + +We now have to create the filesystem. The +[pmount manual](https://linux.die.net/man/1/pmount) has a list of supported +filesystems. *ext4* is the most popular one for non-removable drives, but it's +not great for drives that we want to use in multiple systems, as the UIDs are +hard-coded in the FS. That means that we don't have the proper permissions when +we plug the drive in other systems where our UID has a different numerical +value. We'd then have to use *sudo*, which nullifies one of the advantages of +*pmount*. + +For this reason, we are using +[UDF](https://en.wikipedia.org/wiki/Universal_Disk_Format) for the partition: + +``` +$ {b}sudo mkfs.udf -l cryptflash /dev/mapper/cryptdev{/b} +filename=/dev/mapper/cryptdev +label=cryptflash +uuid=61d338188d37bb6e +blocksize=512 +blocks=69632 +udfrev=2.01 +start=0, blocks=64, type=ERASE +start=64, blocks=13, type=VRS +start=77, blocks=19, type=ERASE +start=96, blocks=16, type=MVDS +start=112, blocks=16, type=ERASE +start=128, blocks=16, type=LVID +start=144, blocks=112, type=ERASE +start=256, blocks=1, type=ANCHOR +start=257, blocks=69112, type=PSPACE +start=69369, blocks=6, type=ERASE +start=69375, blocks=1, type=ANCHOR +start=69376, blocks=96, type=ERASE +start=69472, blocks=16, type=RVDS +start=69488, blocks=143, type=ERASE +start=69631, blocks=1, type=ANCHOR +mkudffs: Warning: Creating new UDF filesystem on partition, and not on whole disk device +mkudffs: Warning: UDF filesystem on partition cannot be read on Apple systems +``` + +At last, we close the luks layer with: + +``` +$ {b}sudo cryptsetup luksClose cryptdev{/b} +``` + + +# Mounting/unmounting the drive + +We could *luksOpen* the device and just use the regular *mount* to access the +files - but using pmount is much more convenient, as it takes care of doing both +steps and doesn't require any configuration or permissions. + +All partitions in block devices pop up in `/dev/disk/by-label/` as symbolic +links to the underlying `/dev` entry. We can simply use that path as the +argument to pmount to get the corresponding filesystem mounted at `/media/`: + +``` +$ {b}pmount /dev/disk/by-label/cryptflash{/b} +``` + +To unmount: + +``` +$ {b}pumount /media/disk_by-label_cryptflash/{/b} +``` + +We can also create a simple script that does that when given the label: + +``` +#!/bin/bash + +label=#dollar#{1?Usage $0