text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1}
surface = _dictdraw.draw_dictionary(d, [5])
surface.write_to_png(sys.argv[1])

repo_language: Jupyter Notebook


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858}
surface = _dictdraw.draw_dictionary(d, [3, 1])
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
del d["snow"]
surface = _dictdraw.draw_dictionary(d, None, True)
surface.write_to_png(sys.argv[1])


text:
"""Routines that examine the internals of a CPython dictionary."""

from ctypes import Structure, c_ulong, POINTER, cast, py_object
from math import log

UMAX = 2 ** 32

def cbin(n):
    """Return `n` as a clean 32-bit binary number, without a leading '0b'."""
    if n < 0:
        n = UMAX + n
    return '{0:0>32}'.format(bin(n)[2:])

# Create a singleton with which the dictionary routines below can
# represent null C pointers.

class NULL(object):
    def __repr__(self):
        return 'NULL'

NULL = NULL()

# Create Structures representing the dictionary object and entries, and
# give them useful methods making them easier to use.

class PyDictEntry(Structure):
    """An entry in a dictionary."""
    _fields_ = [
        ('me_hash', c_ulong),
        ('me_key', py_object),
        ('me_value', py_object),
        ]

class PyDictObject(Structure):
    """A dictionary object."""
    _fields_ = [
        ('ob_refcnt', c_ulong),
        ('ob_type', c_ulong),
        ('ma_fill', c_ulong),
        ('ma_used', c_ulong),
        ('ma_mask', c_ulong),
        ('ma_table', POINTER(PyDictEntry)),
        ]

    def __len__(self):
        """Return the number of dictionary entry slots."""
        return self.ma_mask + 1

    def slot_of(self, key):
        """Find and return the slot at which `key` is stored."""
        for i in range(len(self)):
            try:
                k = self.ma_table[i].me_key
            except ValueError:
                continue  # me_key is NULL
            if (k is key) or (k == key):
                return i
        raise KeyError('cannot find key %r' % (key,))

    def slot_map(self):
        """Return a mapping of keys to their integer slot numbers."""
        m = {}
        for i in range(len(self)):
            entry = self.ma_table[i]
            try:
                entry.me_value
            except:
                continue  # me_value is NULL
            m[entry.me_key] = i
        return m

def dictobject(d):
    """Return the PyDictObject lying behind the Python dict `d`."""
    if not isinstance(d, dict):
        raise TypeError('cannot create a dictobject from %r' % (d,))
    return cast(id(d), POINTER(PyDictObject)).contents

# Retrieve the secret dummy object (it is a simple string, in current
# versions of Python) used internally by dictionaries to represent a
# previously occupied slot.

dummy = None
d = {0: 0}
del d[0]
dummy = dictobject(d).ma_table[0].me_key
del d

#

def _probe_steps(dummydict, key, final_slot):
    """Find the slots searched to put `key` in `final_slot` of `dummydict`.

    The `dummydict` should be a dictionary in which `key` once resided
    in position `final_slot`, but whose entries have all been deleted,
    leaving dummy entries.  This routine will repeatedly try to insert
    `key` into the dictionary, and each time that it does not land at
    `final_slot` an obstacle is placed where it has landed instead,
    until finally the obstacles make `key` land in the `final_slot`.

    A list of the slots searched is returned.  The last element of this
    list will always be `final_slot`.

    """
    o = dictobject(dummydict)

    # Compute the first slot rather than do an expensive search.
    slot = hash(key) & o.ma_mask
    slots = [ int(slot) ]   # since slot often arrives as a long

    # Keep adding obstacles until `key` winds up in `final_slot`.
    while slots[-1] != final_slot:
        if slot == key:  # make sure the integer `slot` is not `key` itself
            slot += len(o)
        dummydict[slot] = None  # add the obstacle

        dummydict[key] = None  # add the key
        slot = o.slot_of(key)
        slots.append(slot)
        del dummydict[key]

    # Return the sequence of slots that we searched.
    return slots

def probe_steps(keys, key):
    """Return the search sequence for `key` for a dict built with `keys`.

    `keys` - Dictionary keys, in order of their insertion, including `key`.
    `key` - The key whose collision path we want to explore.
    """
    # Create a dictionary with the given `keys` and figure out at which
    # slot the target `key` wound up.
    d = dict.fromkeys(keys)
    o = dictobject(d)
    final_slot = o.slot_of(key)

    # Empty the dictionary so that it contains only dummy entries, then
    # pass it to the internal _probe_steps() routine.
    for k in list(d):
        del d[k]
    return _probe_steps(d, key, final_slot)

def probe_all_steps(keys):
    """Return the search sequence for each key in a dict built with `keys`.

    `keys` - Dictionary keys, in order of their insertion, including `key`.

    The return value looks like ``{key: [slot, slot, slot], ...}``.

    """
    # Create a dictionary with the given `keys` and find out in which
    # slot each key wound up.
    d = dict.fromkeys(keys)
    o = dictobject(d)
    m = o.slot_map()

    # For each key in the dictionary, find its probe list.
    for key, final_slot in m.items():
        for k in list(d):
            del d[k]  # empty the dictionary
        m[key] = _probe_steps(d, key, final_slot)
    return m

def display_dictionary(d):
    """Print a dictionary hash table to the screen."""
    do = dictobject(d)
    bits = int(log(do.ma_mask + 1, 2))
    for i in range(len(do)):
        entry = do.ma_table[i]
        entry_bits = cbin(i)[-bits:]
        try:
            key = entry.me_key
        except ValueError:  # me_key is NULL
            print '   ' + entry_bits, 'empty'
            continue

        hash_bits = cbin(entry.me_hash)[-bits:]
        if hash_bits == entry_bits:
            print '...' + entry_bits,
        else:
            print '***' + hash_bits,
        print '[%r] =' % (entry.me_key),
        if entry.me_value:
            print '%r' % entry.me_value
        else:
            print

if __name__ == '__main__':

    # Two tiny tests.
    steps = probe_steps([2, 3, 10, 18, 1], 10)
    assert steps == [2, 5]

    stepmap = probe_all_steps([2, 3, 10, 18, 1])
    assert stepmap == {1: [1], 2: [2], 3: [3], 10: [2, 5], 18: [2, 5, 3, 0]}


text:
import _dictdraw, sys

wordfile = open('../../words')
text = wordfile.read().decode('utf-8')
words = [ w for w in text.split()
          if w == w.lower() and len(w) < 6 ]

d = dict.fromkeys(words[:22])
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
del d["snow"], d['john'], d['arya'], d['alive']
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

wordfile = open('../../words')
text = wordfile.read().decode('utf-8')
words = [ w for w in text.split()
          if w == w.lower() and len(w) < 6 ]

d = dict.fromkeys(words[:5] + ["izadi"])

surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'ali': 6, 'reza': 9, 'nasim': 8}
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'ali': 6, 'reza': 9, 'nasim': 8}
surface = _dictdraw.draw_dictionary(d, [5])
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {}
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
del d["snow"]
surface = _dictdraw.draw_dictionary(d, [6, 5], True)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'ali': 9}
surface = _dictdraw.draw_dictionary(d, [7])
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666}
surface = _dictdraw.draw_dictionary(d, [3])
surface.write_to_png(sys.argv[1])


text:
import sys
import matplotlib.pyplot as plt

xa, ya1, ya2 = [], [], []
for line in open('data/average_probes.txt'):
    x, y1, y2 = line.split()
    xa.append(float(x)*2)
    ya1.append(float(y1))
    ya2.append(float(y2))

plt.figure(figsize=(8, 6))
plt.plot(xa, ya1, 'c', lw=3)
plt.text(2600, 2.5, 'average', color='c', fontsize=18)

plt.plot(xa, ya2, 'r', lw=3)
plt.text(2600, 9, 'worst', color='r', fontsize=18)

plt.plot([0, 6000], [1, 1], 'k--', lw=1)
plt.plot([0, 6000], [2, 2], 'k--', lw=1)
plt.axis([0, 6000, 0, 20])
plt.title('Probes per getitem vs. dictionary size', fontsize=16)
plt.savefig(sys.argv[1], dpi=96)


text:
import _dictdraw, sys

d = {'nasim': 8, 'reza': 9, 'ali': 6}
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from math import ceil, pi
import cairo, sys
import _dictinfo

cr = None

from contextlib import contextmanager

def bits(n):
    sign = '1' if n < 0 else '0'
    m = n if n >= 0 else (n + 2**31)
    s = '%31s' % bin(m)[2:][-31:]
    return sign + s.replace(' ', '0')

def myrepr(obj):
    if isinstance(obj, unicode):
        return u"'%s'" % (obj,)
    return repr(obj)

@contextmanager
def save(cr):
    cr.save()
    p = cr.get_current_point()
    yield
    cr.restore()
    cr.move_to(*p)

pat = cairo.LinearGradient(0.0, 0.0, 0.0, 1.0)
pat.add_color_stop_rgba(1, 0.7, 0, 0, 1) # First stop, 100% opacity
pat.add_color_stop_rgba(0, 0.9, 0.7, 0.2, 1) # Last stop, 100% opacity

def center_text(cr, x, y, text):
    tx, ty, twidth, theight = cr.text_extents(text)[:4]
    cr.move_to(x - tx - twidth / 2, y - ty - theight / 2)
    cr.show_text(text)
    cr.fill()

def draw_textbox(texts, rectcolor):
    global cr

    with save(cr):
        colors = [ a for i, a in enumerate(texts) if i%2 == 0 ]
        texts = [ a for i, a in enumerate(texts) if i%2 == 1 ]

        x, y = cr.get_current_point()
        cr.translate(x, y)

        extents = cr.text_extents('M' * len(''.join(texts)))
        ty = ceil(extents[1])
        twidth = ceil(extents[2])
        theight = ceil(extents[3])

        padding = ceil(theight / 3)

        width = twidth + 2 * padding
        height = theight + 2 * padding
        cr.rectangle(0,0, width,height)
        cr.set_source_rgb(*rectcolor)
        cr.fill()

        cr.move_to(padding, padding + -ceil(ty))
        for i in range(len(colors)):
            cr.set_source_rgb(*colors[i])
            if texts[i] == '/':  # special code for not-equals
                with save(cr):   # so the '/' will display atop the '='
                    cr.show_text('=')
            cr.show_text(texts[i])

    cr.rel_move_to(width, 0)
    return height

def draw_arrowhead(x, y):
    with save(cr):
        cr.translate(x, y)
        cr.move_to(0, -10)
        cr.line_to(20, 0)
        cr.line_to(0, 10)
        cr.fill()

#

black = (0, 0, 0)
white = (1, 1, 1)
red = (0.7, 0, 0)
green = (0, 0.7, 0)
gold = (1, 0.9, 0.5)
gray = (0.5, 0.5, 0.5)
lightgray = (0.8, 0.8, 0.8)

def draw_button(cr, x, y, is_collision=True):
    """Draw a green or red circle showing a hit or a collision."""
    with save(cr):
        cr.translate(x, y)

        if is_collision:
            cr.set_source_rgb(*red)
        else:
            cr.set_source_rgb(*green)

        cr.set_font_size(32)
        cr.arc(0, 0, 13.5, 0, pi * 2)  # red or green circle
        cr.fill()

        if is_collision:
            cr.set_source_rgb(*white)
            center_text(cr, 0.8, -1, '×')

def draw_dictionary(d, lookup_paths = None, show_dummy=False):
    """Supply `d` a Python dictionary."""
    global cr

    o = _dictinfo.dictobject(d)

    WIDTH=960
    if len(o) == 8:
        HEIGHT=406
    else:
        HEIGHT=480

    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
    cr = cairo.Context(surface)

    cr.select_font_face('Inconsolata',
                        cairo.FONT_SLANT_NORMAL,
                        cairo.FONT_WEIGHT_BOLD)

    cr.rectangle(0,0, WIDTH,HEIGHT)
    cr.set_source_rgb(1,1,1)
    cr.fill()

    with save(cr):

        mask = o.ma_mask
        sigbits = 0
        while mask:
            sigbits += 1
            mask >>= 1

        if len(o) == 8:
            xoffset = 140
            hashwidth = 9 # width of the hash field
            font_size = 40
            gap = 2
            show_value = True
        else:
            if len(o) == 32:
                xoffset = 360
                hashwidth = 16 # width of the hash field
                show_value = True
                font_size = 12
            else:
                xoffset = 140
                hashwidth = sigbits + 1 # width of the hash field
                show_value = False
                font_size = 10

            gap = 0

        yoffset = font_size # room for header at top

        cr.set_font_size(font_size)
        charwidth = cr.text_extents(u'M')[2]
        width = 100 #actually compute from font size later

        cr.translate(xoffset, yoffset)  # upper-left corner of the dictionary

        with save(cr):
            cr.set_source_rgb(0,0,0)
            cr.translate(2,-6)
            if len(o) == 8:
                cr.show_text(u'Idx      Hash     Key   Value')

        height = 0

        for i in range(len(o)):
            if i == 0 or i % 32:
                cr.rel_move_to(0, height + gap)
            else:
                cr.rel_move_to(176, -31 * height + -30 * gap)

            with save(cr):
                entry = o.ma_table[i]

                height = draw_textbox([gold, bits(i)[-sigbits:]], gray)
                cr.rel_move_to(gap, 0)

                try:
                    k = entry.me_key
                except ValueError:
                    # This is a completely empty entry.
                    draw_textbox([white, u' '], lightgray)
                    cr.rel_move_to(gap, 0)
                    draw_textbox([white, u' ' * hashwidth], lightgray)
                    cr.rel_move_to(gap, 0)
                    draw_textbox([white, u' ' * 7], lightgray)
                    if show_value:
                        cr.rel_move_to(gap, 0)
                        draw_textbox([white, u' ' * 6], lightgray)
                    continue

                if k is _dictinfo.dummy:
                    if not show_dummy:
                        draw_textbox([white, u'!'], red)
                        cr.rel_move_to(gap, 0)
                        draw_textbox([white, u' ' * hashwidth], gray)
                        cr.rel_move_to(gap, 0)
                        draw_textbox([white, u'<dummy>'], gray)
                        if show_value:
                            cr.rel_move_to(gap, 0)
                            draw_textbox([white, u' ' * 6], gray)
                    else:
                        draw_textbox([white, u' '], black)
                        cr.rel_move_to(gap, 0)
                        draw_textbox([white, u' ' * hashwidth], black)
                        cr.rel_move_to(gap, 0)
                        draw_textbox([white, u' ' * 7], black)
                        if show_value:
                            cr.rel_move_to(gap, 0)
                            draw_textbox([white, u' ' * 6], black)
                    continue

                h = entry.me_hash
                v = entry.me_value

                if h & o.ma_mask == i:
                    draw_textbox([white, u'='], green)
                else:
                    draw_textbox([white, u'/'], red)
                cr.rel_move_to(gap, 0)
                bstr = bits(h)[-hashwidth+1:]
                texts = [lightgray, u'…' + bstr[:-sigbits],
                         gold, bstr[-sigbits:]]
                draw_textbox(texts, gray)
                cr.rel_move_to(gap, 0)
                draw_textbox([white, u'%-7s' % myrepr(k)], gray)
                if show_value:
                    cr.rel_move_to(gap, 0)
                    draw_textbox([white, u'%-6s' % myrepr(v)], gray)

    if lookup_paths is None:
        lookup_paths = ()
    else:
        lookup_paths = (lookup_paths, )
    for lookup_path in lookup_paths:
        with save(cr):
            n = lookup_path[0]
            cr.translate(xoffset, yoffset)

            y = 2 + n * (height + gap + 0.5) + height / 2
            cr.set_source_rgb(*black)
            cr.set_line_width(6)
            cr.move_to(-100, y)
            cr.rel_line_to(40, 0)
            cr.stroke()
            draw_arrowhead(-60, y)

            draw_button(cr, -20, y, len(lookup_path) > 1)

            if len(lookup_path) > 1:
                cr.move_to(650, y)
                cr.rel_line_to(40, 0)
                cr.stroke()

            for i in range(1, len(lookup_path)):
                from_slot = lookup_path[i - 1]
                dest_slot = lookup_path[i]

                yf = 2 + from_slot * (height + gap + 0.5) + height / 2
                yd = 2 + dest_slot * (height + gap + 0.5) + height / 2
                y0 = min(yf, yd)
                y1 = max(yf, yd)

                cr.set_source_rgb(*black)
                cr.set_line_width(6)
                cr.move_to(690, y0)
                cr.arc(690, (y0 + y1) / 2, (y1 - y0) / 2, 3 * pi / 2, pi / 2)
                cr.stroke()

                draw_button(cr, 652, yd, i + 1 < len(lookup_path))

                with save(cr):
                    cr.translate(690, yd)
                    cr.rotate(pi)
                    draw_arrowhead(0, 0)

    return surface
#

if __name__ == '__main__':
    d = {'ftp': 21}
    surface = draw_dictionary(d, [1])
    # surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {3: 1, 3+8: 2, 3+16: 3, 3+24: 4, 3+32: 5}
surface = _dictdraw.draw_dictionary(d, [3, 1, 6, 7])
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

wordfile = open('../../words')
text = wordfile.read().decode('utf-8')
words = [ w for w in text.split()
          if w == w.lower() and len(w) < 6 ]

d = dict.fromkeys(words[:5])
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

wordfile = open('../../words')
text = wordfile.read().decode('utf-8')
words = [ w for w in text.split()
          if w == w.lower() and len(w) < 6 ]

d = dict.fromkeys(words[:85])
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
del d["snow"]
surface = _dictdraw.draw_dictionary(d, None)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys, _dictinfo

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
b = ['arya', 'john', 'snow', 'alive', 'dead']
l = [1, 'snow', 'alive', 'dead']
print _dictinfo.probe_all_steps(b)
print _dictinfo.probe_all_steps(l + ["fire"])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
del d["snow"]
surface = _dictdraw.draw_dictionary(d, [6, 5, 0])
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'ali': 6, 'reza': 9}
surface = _dictdraw.draw_dictionary(d, [4])
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
surface = _dictdraw.draw_dictionary(d, [6, 5, 0])
surface.write_to_png(sys.argv[1])


text:
import os
for s in os.listdir(os.getcwd()):
    if s[-3:] == ".py" != -1 and s[0] != '_' and s[0] != 'a':
        png = s.replace("py", "png")
        os.system("py -2.6 " + s + " "+ png)
        print s


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2}
surface = _dictdraw.draw_dictionary(d, [6])
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
surface = _dictdraw.draw_dictionary(d, [0, 1, 6, 4])
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'john': 858, 'snow': 1, 'arya':666, 'dead':3, 'alive': 2}
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'smtp': 21, 'svn': 3690, 'dict': 2628, 'ircd': 6667, 'zope': 9673,
     'fido': 60179}
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import sys
import matplotlib.pyplot as plt

t1 = 66.5
t16 = 116.8
tper = (t16 - t1) / (16 - 1)
t0 = t1 - tper

def probes_to_time(n):
    """Given a number of probes, return the time getitem should take."""
    # Based on tests with timeit() on my Dell Latitude D630 laptop.
    return t0 + n * tper

xa, ya1, ya2 = [], [], []
for line in open('data/average_probes.txt'):
    x, y1, y2 = line.split()
    xa.append(float(x)*2)
    ya1.append(probes_to_time(float(y1)))
    ya2.append(probes_to_time(float(y2)))

plt.figure(figsize=(8, 6))
plt.plot(xa, ya1, 'c', lw=2)
plt.text(2600, 70, 'average', color='c', fontsize=18)

plt.plot(xa, ya2, 'r', lw=2)
plt.text(2600, 95, 'worst', color='r', fontsize=18)

plt.plot([0, 6000], [t1, t1], 'b', lw=2)
plt.text(2600, 55, 'best', color='b', fontsize=18)

plt.axis([0, 6000, 0, 140])
plt.title('Duration of getitem call (ns) vs. dictionary size', fontsize=16)
plt.savefig(sys.argv[1], dpi=96)


text:
import _dictdraw, sys

wordfile = open('../../words')
text = wordfile.read().decode('utf-8')
words = [ w for w in text.split()
          if w == w.lower() and len(w) < 6 ]

d = dict.fromkeys(words[:21])
surface = _dictdraw.draw_dictionary(d)
surface.write_to_png(sys.argv[1])


text:
import _dictdraw, sys

d = {'arya': 666, 'john': 858, 'snow':1, 'alive': 2, 'dead':3}
del d["snow"], d['john'], d['arya'], d['alive']
surface = _dictdraw.draw_dictionary(d, [6, 5, 0])
surface.write_to_png(sys.argv[1])


text:
import sys
import my_inspect

words = open('/usr/share/dict/words').read().split()
output = open(sys.argv[1], 'w')
for n in range(1, 3000):
    probe_map = my_inspect.probe_all_steps(words[:n*2])
    seqlens = [ len(seq) for seq in probe_map.values() ]
    a = float(sum( seqlens )) / len(seqlens)
    m = max( seqlens )
    output.write('%d %f %d\n' % (n, a, m))


text:
1 1.000000 1
2 1.250000 2
3 1.166667 2
4 1.250000 2
5 1.300000 2
6 1.416667 2
7 1.357143 2
8 1.312500 2
9 1.333333 2
10 1.350000 2
11 1.090909 2
12 1.125000 2
13 1.115385 2
14 1.107143 2
15 1.133333 2
16 1.125000 2
17 1.147059 2
18 1.166667 2
19 1.157895 2
20 1.175000 2
21 1.166667 2
22 1.159091 2
23 1.195652 3
24 1.291667 4
25 1.280000 4
26 1.307692 4
27 1.296296 4
28 1.357143 4
29 1.362069 4
30 1.350000 4
31 1.370968 4
32 1.390625 4
33 1.409091 4
34 1.441176 4
35 1.528571 6
36 1.513889 6
37 1.500000 6
38 1.539474 6
39 1.538462 6
40 1.587500 6
41 1.621951 6
42 1.666667 6
43 1.104651 2
44 1.113636 2
45 1.133333 3
46 1.152174 3
47 1.159574 3
48 1.156250 3
49 1.153061 3
50 1.170000 3
51 1.166667 3
52 1.163462 3
53 1.160377 3
54 1.157407 3
55 1.163636 3
56 1.178571 3
57 1.175439 3
58 1.172414 3
59 1.186441 3
60 1.191667 3
61 1.188525 3
62 1.193548 3
63 1.190476 3
64 1.187500 3
65 1.184615 3
66 1.196970 3
67 1.194030 3
68 1.205882 3
69 1.224638 3
70 1.228571 3
71 1.225352 3
72 1.222222 3
73 1.219178 3
74 1.216216 3
75 1.226667 3
76 1.223684 3
77 1.220779 3
78 1.217949 3
79 1.215190 3
80 1.218750 3
81 1.234568 3
82 1.243902 3
83 1.246988 3
84 1.244048 3
85 1.258824 4
86 1.255814 4
87 1.264368 4
88 1.267045 4
89 1.269663 4
90 1.272222 4
91 1.280220 4
92 1.293478 4
93 1.295699 4
94 1.292553 4
95 1.294737 4
96 1.291667 4
97 1.288660 4
98 1.290816 4
99 1.292929 4
100 1.300000 4
101 1.301980 4
102 1.313725 4
103 1.315534 4
104 1.331731 4
105 1.328571 4
106 1.330189 4
107 1.341121 4
108 1.337963 4
109 1.339450 4
110 1.336364 4
111 1.333333 4
112 1.334821 4
113 1.336283 4
114 1.333333 4
115 1.339130 4
116 1.340517 4
117 1.337607 4
118 1.351695 4
119 1.352941 4
120 1.358333 4
121 1.359504 4
122 1.356557 4
123 1.365854 4
124 1.375000 4
125 1.376000 4
126 1.384921 4
127 1.385827 4
128 1.386719 4
129 1.383721 4
130 1.388462 4
131 1.385496 4
132 1.386364 4
133 1.383459 4
134 1.384328 4
135 1.392593 4
136 1.393382 4
137 1.390511 4
138 1.398551 4
139 1.395683 4
140 1.400000 4
141 1.414894 4
142 1.440141 9
143 1.440559 9
144 1.444444 9
145 1.455172 9
146 1.465753 9
147 1.493197 9
148 1.493243 9
149 1.489933 9
150 1.496667 9
151 1.513245 9
152 1.509868 9
153 1.526144 9
154 1.529221 9
155 1.532258 9
156 1.528846 9
157 1.525478 9
158 1.528481 9
159 1.525157 9
160 1.528125 9
161 1.531056 9
162 1.540123 9
163 1.542945 9
164 1.539634 9
165 1.548485 9
166 1.560241 9
167 1.562874 9
168 1.565476 9
169 1.568047 9
170 1.576471 9
171 1.093567 3
172 1.095930 3
173 1.095376 3
174 1.097701 3
175 1.097143 3
176 1.102273 3
177 1.101695 3
178 1.101124 3
179 1.100559 3
180 1.102778 3
181 1.102210 3
182 1.101648 3
183 1.103825 3
184 1.103261 3
185 1.102703 3
186 1.107527 3
187 1.106952 3
188 1.106383 3
189 1.105820 3
190 1.105263 3
191 1.104712 3
192 1.104167 3
193 1.103627 3
194 1.103093 3
195 1.102564 3
196 1.102041 3
197 1.101523 3
198 1.108586 3
199 1.108040 3
200 1.107500 3
201 1.106965 3
202 1.106436 3
203 1.108374 3
204 1.107843 3
205 1.107317 3
206 1.109223 3
207 1.111111 3
208 1.110577 3
209 1.110048 3
210 1.109524 3
211 1.109005 3
212 1.108491 3
213 1.107981 3
214 1.109813 3
215 1.109302 3
216 1.108796 3
217 1.110599 3
218 1.112385 3
219 1.114155 3
220 1.113636 3
221 1.113122 3
222 1.114865 3
223 1.118834 3
224 1.120536 3
225 1.120000 3
226 1.119469 3
227 1.118943 3
228 1.120614 3
229 1.122271 3
230 1.123913 3
231 1.123377 3
232 1.122845 3
233 1.122318 3
234 1.121795 3
235 1.121277 3
236 1.120763 3
237 1.122363 3
238 1.121849 3
239 1.121339 3
240 1.122917 3
241 1.122407 3
242 1.123967 3
243 1.125514 3
244 1.125000 3
245 1.124490 3
246 1.128049 3
247 1.127530 3
248 1.133065 3
249 1.132530 3
250 1.132000 3
251 1.131474 3
252 1.132937 3
253 1.132411 3
254 1.135827 3
255 1.137255 3
256 1.138672 3
257 1.138132 3
258 1.141473 3
259 1.148649 5
260 1.150000 5
261 1.151341 5
262 1.150763 5
263 1.152091 5
264 1.151515 5
265 1.150943 5
266 1.150376 5
267 1.151685 5
268 1.160448 5
269 1.159851 5
270 1.161111 5
271 1.166052 5
272 1.167279 5
273 1.166667 5
274 1.171533 5
275 1.172727 5
276 1.172101 5
277 1.171480 5
278 1.170863 5
279 1.170251 5
280 1.171429 5
281 1.170819 5
282 1.170213 5
283 1.169611 5
284 1.169014 5
285 1.173684 5
286 1.173077 5
287 1.174216 5
288 1.175347 5
289 1.174740 5
290 1.175862 5
291 1.175258 5
292 1.174658 5
293 1.174061 5
294 1.173469 5
295 1.172881 5
296 1.172297 5
297 1.171717 5
298 1.174497 5
299 1.173913 5
300 1.173333 5
301 1.172757 5
302 1.172185 5
303 1.171617 5
304 1.171053 5
305 1.177049 5
306 1.176471 5
307 1.175896 5
308 1.176948 5
309 1.177994 5
310 1.179032 5
311 1.180064 5
312 1.179487 5
313 1.180511 5
314 1.183121 5
315 1.185714 5
316 1.185127 5
317 1.184543 5
318 1.185535 5
319 1.184953 5
320 1.185938 5
321 1.186916 5
322 1.187888 5
323 1.187307 5
324 1.188272 5
325 1.187692 5
326 1.187117 5
327 1.188073 5
328 1.187500 5
329 1.186930 5
330 1.187879 5
331 1.188822 5
332 1.189759 5
333 1.192192 5
334 1.191617 5
335 1.191045 5
336 1.190476 5
337 1.194362 5
338 1.195266 5
339 1.194690 5
340 1.195588 5
341 1.197947 5
342 1.197368 5
343 1.196793 5
344 1.197674 5
345 1.198551 5
346 1.197977 5
347 1.201729 5
348 1.201149 5
349 1.203438 5
350 1.202857 5
351 1.202279 5
352 1.201705 5
353 1.201133 5
354 1.200565 5
355 1.200000 5
356 1.200843 5
357 1.204482 5
358 1.208101 5
359 1.210306 5
360 1.209722 5
361 1.216066 5
362 1.216851 5
363 1.217631 5
364 1.217033 5
365 1.216438 5
366 1.218579 5
367 1.220708 5
368 1.225543 5
369 1.226287 5
370 1.225676 5
371 1.227763 5
372 1.228495 5
373 1.229223 5
374 1.228610 5
375 1.229333 5
376 1.228723 5
377 1.230769 5
378 1.231481 5
379 1.233509 5
380 1.234211 5
381 1.237533 5
382 1.238220 5
383 1.246736 5
384 1.246094 5
385 1.245455 5
386 1.246114 5
387 1.246770 5
388 1.246134 5
389 1.249357 5
390 1.252564 5
391 1.255754 5
392 1.257653 5
393 1.256997 5
394 1.257614 5
395 1.264557 7
396 1.263889 7
397 1.264484 7
398 1.267588 7
399 1.268170 7
400 1.268750 7
401 1.271820 7
402 1.271144 7
403 1.277916 7
404 1.280941 7
405 1.283951 7
406 1.284483 7
407 1.288698 7
408 1.290441 7
409 1.289731 7
410 1.290244 7
411 1.290754 7
412 1.292476 7
413 1.291768 7
414 1.291063 7
415 1.297590 7
416 1.296875 7
417 1.298561 7
418 1.302632 7
419 1.301909 7
420 1.303571 7
421 1.306413 7
422 1.309242 7
423 1.310875 7
424 1.312500 7
425 1.315294 7
426 1.319249 7
427 1.323185 7
428 1.323598 7
429 1.327506 7
430 1.326744 7
431 1.327146 7
432 1.326389 7
433 1.326790 7
434 1.327189 7
435 1.327586 7
436 1.330275 7
437 1.329519 7
438 1.328767 7
439 1.328018 7
440 1.328409 7
441 1.329932 7
442 1.329186 7
443 1.329571 7
444 1.329955 7
445 1.329213 7
446 1.334081 7
447 1.334452 7
448 1.335938 7
449 1.336303 7
450 1.337778 7
451 1.339246 7
452 1.341814 7
453 1.344371 7
454 1.349119 7
455 1.348352 7
456 1.350877 7
457 1.352298 7
458 1.355895 7
459 1.358388 7
460 1.360870 7
461 1.360087 7
462 1.360390 7
463 1.361771 7
464 1.362069 7
465 1.365591 7
466 1.369099 7
467 1.370450 7
468 1.372863 7
469 1.374200 7
470 1.374468 7
471 1.375796 7
472 1.378178 7
473 1.378436 7
474 1.379747 7
475 1.380000 7
476 1.381303 7
477 1.384696 7
478 1.385983 7
479 1.389353 7
480 1.393750 7
481 1.395010 7
482 1.397303 7
483 1.396480 7
484 1.398760 7
485 1.398969 7
486 1.406379 9
487 1.407598 9
488 1.407787 9
489 1.408998 9
490 1.410204 9
491 1.409369 9
492 1.412602 9
493 1.411765 9
494 1.411943 9
495 1.413131 9
496 1.414315 9
497 1.413481 9
498 1.414659 9
499 1.413828 9
500 1.414000 9
501 1.422156 10
502 1.422311 10
503 1.421471 10
504 1.424603 10
505 1.425743 10
506 1.424901 10
507 1.432939 10
508 1.437008 10
509 1.440079 10
510 1.442157 10
511 1.442270 10
512 1.441406 10
513 1.440546 10
514 1.441634 10
515 1.440777 10
516 1.441860 10
517 1.442940 10
518 1.442085 10
519 1.444123 10
520 1.446154 10
521 1.447217 10
522 1.452107 10
523 1.451243 10
524 1.458015 10
525 1.460000 10
526 1.462928 10
527 1.467742 10
528 1.466856 10
529 1.465974 10
530 1.468868 10
531 1.467985 10
532 1.467105 10
533 1.466229 10
534 1.469101 10
535 1.470093 10
536 1.472015 10
537 1.473929 10
538 1.473048 10
539 1.474954 10
540 1.475000 10
541 1.476895 10
542 1.480627 10
543 1.481584 10
544 1.484375 10
545 1.483486 10
546 1.483516 10
547 1.485375 10
548 1.487226 10
549 1.489071 10
550 1.490000 10
551 1.496370 10
552 1.495471 10
553 1.494575 10
554 1.497292 10
555 1.500000 10
556 1.500899 10
557 1.500000 10
558 1.500896 10
559 1.500000 10
560 1.500893 10
561 1.500000 10
562 1.501779 10
563 1.502664 10
564 1.505319 10
565 1.507965 10
566 1.507067 10
567 1.507937 10
568 1.509683 10
569 1.509666 10
570 1.513158 10
571 1.513135 10
572 1.516608 10
573 1.516579 10
574 1.515679 10
575 1.514783 10
576 1.517361 10
577 1.519931 10
578 1.524221 10
579 1.523316 10
580 1.522414 10
581 1.521515 10
582 1.520619 10
583 1.521441 10
584 1.522260 10
585 1.523077 10
586 1.525597 10
587 1.526405 10
588 1.525510 10
589 1.526316 10
590 1.527966 10
591 1.529611 10
592 1.531250 10
593 1.536256 10
594 1.535354 10
595 1.536975 10
596 1.536074 10
597 1.536013 10
598 1.540134 10
599 1.551753 12
600 1.550833 12
601 1.550749 12
602 1.550664 12
603 1.555556 12
604 1.556291 12
605 1.558678 12
606 1.559406 12
607 1.567545 12
608 1.566612 12
609 1.567323 12
610 1.566393 12
611 1.567921 12
612 1.571078 12
613 1.572594 12
614 1.573290 12
615 1.575610 12
616 1.578734 12
617 1.581037 12
618 1.582524 12
619 1.583199 12
620 1.583065 12
621 1.587762 12
622 1.587621 12
623 1.587480 12
624 1.590545 12
625 1.589600 12
626 1.589457 12
627 1.590909 12
628 1.590764 12
629 1.590620 12
630 1.593651 12
631 1.592710 12
632 1.592563 12
633 1.596367 12
634 1.597003 12
635 1.600000 12
636 1.604560 12
637 1.609105 12
638 1.611285 12
639 1.612676 12
640 1.614062 12
641 1.616225 12
642 1.622274 12
643 1.625194 12
644 1.629658 12
645 1.630233 12
646 1.633127 12
647 1.635240 12
648 1.636574 12
649 1.637134 12
650 1.643846 12
651 1.645929 12
652 1.647239 12
653 1.646248 12
654 1.648318 12
655 1.650382 12
656 1.650915 12
657 1.652968 12
658 1.653495 12
659 1.654780 12
660 1.662879 13
661 1.666415 13
662 1.666918 13
663 1.671946 13
664 1.673193 13
665 1.672180 13
666 1.671922 13
667 1.682909 16
668 1.681886 16
669 1.680867 16
670 1.685821 16
671 1.692996 16
672 1.691964 16
673 1.691679 16
674 1.695846 16
675 1.697778 16
676 1.701183 16
677 1.700886 16
678 1.710914 16
679 1.717231 16
680 1.716176 16
681 1.718062 16
682 1.722141 16
683 1.092972 4
684 1.092836 4
685 1.093431 4
686 1.095481 4
687 1.095342 4
688 1.095203 4
689 1.095791 4
690 1.097101 4
691 1.097685 4
692 1.099711 4
693 1.100289 4
694 1.101585 4
695 1.101439 4
696 1.101293 4
697 1.102582 4
698 1.103152 4
699 1.103004 4
700 1.102857 4
701 1.102710 4
702 1.102564 4
703 1.102418 4
704 1.102273 4
705 1.102837 4
706 1.102691 4
707 1.102546 4
708 1.102401 4
709 1.102257 4
710 1.102817 4
711 1.102672 4
712 1.103230 4
713 1.103086 4
714 1.102941 4
715 1.102797 4
716 1.102654 4
717 1.102510 4
718 1.102368 4
719 1.102921 4
720 1.102778 4
721 1.103329 4
722 1.103186 4
723 1.103734 4
724 1.103591 4
725 1.103448 4
726 1.103306 4
727 1.104539 4
728 1.104396 4
729 1.104252 4
730 1.105479 4
731 1.105335 4
732 1.105191 4
733 1.105048 4
734 1.105586 4
735 1.105442 4
736 1.106658 4
737 1.107191 4
738 1.107046 4
739 1.107578 4
740 1.108108 4
741 1.107962 4
742 1.107817 4
743 1.107672 4
744 1.107527 4
745 1.107383 4
746 1.107239 4
747 1.107095 4
748 1.107620 4
749 1.107477 4
750 1.107333 4
751 1.107190 4
752 1.107048 4
753 1.106906 4
754 1.106764 4
755 1.106623 4
756 1.106481 4
757 1.106341 4
758 1.106201 4
759 1.106061 4
760 1.105921 4
761 1.105782 4
762 1.105643 4
763 1.105505 4
764 1.106021 4
765 1.105882 4
766 1.105744 4
767 1.105606 4
768 1.105469 4
769 1.106632 4
770 1.106494 4
771 1.107652 4
772 1.108161 4
773 1.108021 4
774 1.107881 4
775 1.107742 4
776 1.107603 4
777 1.107465 4
778 1.107326 4
779 1.108472 4
780 1.108974 4
781 1.108835 4
782 1.110614 4
783 1.111111 4
784 1.110969 4
785 1.110828 4
786 1.110687 4
787 1.111817 4
788 1.112310 4
789 1.112167 4
790 1.112025 4
791 1.113148 4
792 1.113005 4
793 1.114124 4
794 1.114610 4
795 1.114465 4
796 1.115578 4
797 1.115433 4
798 1.116541 4
799 1.116395 4
800 1.116875 4
801 1.117353 4
802 1.117830 4
803 1.117684 4
804 1.117537 4
805 1.118012 4
806 1.119107 4
807 1.120818 4
808 1.120668 4
809 1.120519 4
810 1.120370 4
811 1.120838 4
812 1.120690 4
813 1.120541 4
814 1.120393 4
815 1.120245 4
816 1.120098 4
817 1.119951 4
818 1.119804 4
819 1.120269 4
820 1.120122 4
821 1.119976 4
822 1.120438 4
823 1.120292 4
824 1.120752 4
825 1.120606 4
826 1.120460 4
827 1.121524 4
828 1.121377 4
829 1.121834 4
830 1.121687 4
831 1.122744 4
832 1.122596 4
833 1.123049 4
834 1.123501 4
835 1.123353 4
836 1.123206 4
837 1.123656 4
838 1.123508 4
839 1.123957 4
840 1.125000 4
841 1.125446 4
842 1.126485 4
843 1.126335 4
844 1.126185 4
845 1.126036 4
846 1.125887 4
847 1.125738 4
848 1.125590 4
849 1.125442 4
850 1.125294 4
851 1.125147 4
852 1.125000 4
853 1.126612 4
854 1.126464 4
855 1.126316 4
856 1.129089 6
857 1.128938 6
858 1.128788 6
859 1.129220 6
860 1.129070 6
861 1.128920 6
862 1.128770 6
863 1.128621 6
864 1.128472 6
865 1.128324 6
866 1.129330 6
867 1.130334 6
868 1.130184 6
869 1.130035 6
870 1.129885 6
871 1.129736 6
872 1.129587 6
873 1.130011 6
874 1.129863 6
875 1.130286 6
876 1.131279 6
877 1.131129 6
878 1.131549 6
879 1.131399 6
880 1.131250 6
881 1.131101 6
882 1.131519 6
883 1.131370 6
884 1.131787 6
885 1.131638 6
886 1.132054 6
887 1.131905 6
888 1.131757 6
889 1.132733 6
890 1.133146 6
891 1.132997 6
892 1.132848 6
893 1.132699 6
894 1.132550 6
895 1.132402 6
896 1.132254 6
897 1.133779 6
898 1.133630 6
899 1.133482 6
900 1.134444 6
901 1.134850 6
902 1.134701 6
903 1.135105 6
904 1.134956 6
905 1.134807 6
906 1.134658 6
907 1.134509 6
908 1.134361 6
909 1.134213 6
910 1.134066 6
911 1.133919 6
912 1.133772 6
913 1.133625 6
914 1.133479 6
915 1.133333 6
916 1.133734 6
917 1.133588 6
918 1.135076 6
919 1.135473 6
920 1.135326 6
921 1.135179 6
922 1.135033 6
923 1.135428 6
924 1.135281 6
925 1.135135 6
926 1.135529 6
927 1.135383 6
928 1.135776 6
929 1.135630 6
930 1.135484 6
931 1.135875 6
932 1.136803 6
933 1.136656 6
934 1.136510 6
935 1.136898 6
936 1.137286 6
937 1.137140 6
938 1.138060 6
939 1.138445 6
940 1.139362 6
941 1.139214 6
942 1.139066 6
943 1.138918 6
944 1.138771 6
945 1.139153 6
946 1.139006 6
947 1.139916 6
948 1.139768 6
949 1.139621 6
950 1.139474 6
951 1.139853 6
952 1.139706 6
953 1.139559 6
954 1.140461 6
955 1.140314 6
956 1.140167 6
957 1.140021 6
958 1.139875 6
959 1.140250 6
960 1.140625 6
961 1.140479 6
962 1.142412 6
963 1.143302 6
964 1.143154 6
965 1.143005 6
966 1.142857 6
967 1.143226 6
968 1.143079 6
969 1.142931 6
970 1.142784 6
971 1.142636 6
972 1.143519 6
973 1.143371 6
974 1.143224 6
975 1.143077 6
976 1.143443 6
977 1.143296 6
978 1.144172 6
979 1.145046 6
980 1.144898 6
981 1.146279 6
982 1.146130 6
983 1.146490 6
984 1.146341 6
985 1.147208 6
986 1.147566 6
987 1.147923 6
988 1.147773 6
989 1.147624 6
990 1.147475 6
991 1.147830 6
992 1.147681 6
993 1.148540 6
994 1.148390 6
995 1.148241 6
996 1.148092 6
997 1.148445 6
998 1.148297 6
999 1.148148 6
1000 1.148500 6
1001 1.148352 6
1002 1.148204 6
1003 1.149551 6
1004 1.149402 6
1005 1.149254 6
1006 1.149105 6
1007 1.148957 6
1008 1.148810 6
1009 1.149158 6
1010 1.149505 6
1011 1.149357 6
1012 1.149209 6
1013 1.149062 6
1014 1.149901 6
1015 1.150246 6
1016 1.150098 6
1017 1.149951 6
1018 1.149804 6
1019 1.149657 6
1020 1.149510 6
1021 1.149363 6
1022 1.150196 6
1023 1.150538 6
1024 1.151367 6
1025 1.151220 6
1026 1.151072 6
1027 1.150925 6
1028 1.152237 6
1029 1.153061 6
1030 1.153883 6
1031 1.153734 6
1032 1.153585 6
1033 1.153437 6
1034 1.153772 6
1035 1.153623 6
1036 1.153958 6
1037 1.153809 6
1038 1.153661 6
1039 1.153994 6
1040 1.153846 6
1041 1.153698 6
1042 1.154031 6
1043 1.153883 6
1044 1.153736 6
1045 1.153589 6
1046 1.153920 6
1047 1.153773 6
1048 1.153626 6
1049 1.154433 6
1050 1.154286 6
1051 1.155090 6
1052 1.154943 6
1053 1.154796 6
1054 1.154649 6
1055 1.155450 6
1056 1.155303 6
1057 1.155156 6
1058 1.155482 6
1059 1.155335 6
1060 1.155660 6
1061 1.155985 6
1062 1.156309 6
1063 1.156162 6
1064 1.156485 6
1065 1.156338 6
1066 1.156660 6
1067 1.157451 6
1068 1.157303 6
1069 1.157156 6
1070 1.157477 6
1071 1.159197 6
1072 1.159515 6
1073 1.160764 6
1074 1.161546 6
1075 1.161395 6
1076 1.161245 6
1077 1.161096 6
1078 1.160946 6
1079 1.160797 6
1080 1.161111 6
1081 1.161887 6
1082 1.161738 6
1083 1.161588 6
1084 1.162823 6
1085 1.162673 6
1086 1.162983 6
1087 1.162833 6
1088 1.162684 6
1089 1.162534 6
1090 1.162385 6
1091 1.162236 6
1092 1.162546 6
1093 1.163312 6
1094 1.163620 6
1095 1.163470 6
1096 1.163777 6
1097 1.163628 6
1098 1.164390 6
1099 1.164240 6
1100 1.165000 6
1101 1.166213 6
1102 1.166062 6
1103 1.166818 6
1104 1.168025 6
1105 1.167873 6
1106 1.167722 6
1107 1.168925 6
1108 1.168773 6
1109 1.169071 6
1110 1.169369 6
1111 1.169667 6
1112 1.169514 6
1113 1.169362 6
1114 1.169659 6
1115 1.169955 6
1116 1.169803 6
1117 1.169651 6
1118 1.169499 6
1119 1.169794 6
1120 1.170536 6
1121 1.170830 6
1122 1.171123 6
1123 1.170971 6
1124 1.171263 6
1125 1.171111 6
1126 1.170959 6
1127 1.171251 6
1128 1.172429 6
1129 1.172276 6
1130 1.172124 6
1131 1.172414 6
1132 1.172703 6
1133 1.172551 6
1134 1.173280 6
1135 1.173128 6
1136 1.174296 6
1137 1.174142 6
1138 1.173989 6
1139 1.173837 6
1140 1.174561 6
1141 1.174408 6
1142 1.175131 6
1143 1.175416 6
1144 1.176573 6
1145 1.178166 6
1146 1.178010 6
1147 1.177855 6
1148 1.177700 6
1149 1.177546 6
1150 1.177391 6
1151 1.177237 6
1152 1.177517 6
1153 1.177797 6
1154 1.178510 6
1155 1.178788 6
1156 1.178633 6
1157 1.179343 6
1158 1.180052 6
1159 1.181191 6
1160 1.181034 6
1161 1.181309 6
1162 1.182444 6
1163 1.182287 6
1164 1.182560 6
1165 1.182403 6
1166 1.182247 6
1167 1.182948 6
1168 1.182791 6
1169 1.184346 6
1170 1.185043 6
1171 1.185739 6
1172 1.185580 6
1173 1.185422 6
1174 1.185264 6
1175 1.185106 6
1176 1.184949 6
1177 1.185217 6
1178 1.185908 6
1179 1.185751 6
1180 1.185593 6
1181 1.185859 6
1182 1.185702 6
1183 1.186391 6
1184 1.186655 6
1185 1.186498 6
1186 1.186762 6
1187 1.188290 6
1188 1.188131 6
1189 1.188394 6
1190 1.188235 6
1191 1.188497 6
1192 1.188339 6
1193 1.188181 6
1194 1.188442 6
1195 1.188285 6
1196 1.188127 6
1197 1.187970 6
1198 1.189065 6
1199 1.189741 6
1200 1.189583 6
1201 1.189842 6
1202 1.189684 6
1203 1.189526 6
1204 1.189784 6
1205 1.189627 6
1206 1.189469 6
1207 1.190969 6
1208 1.191225 6
1209 1.191894 6
1210 1.192149 6
1211 1.193642 6
1212 1.195132 6
1213 1.194971 6
1214 1.194811 6
1215 1.195062 6
1216 1.195312 6
1217 1.196385 6
1218 1.197455 6
1219 1.198523 6
1220 1.198361 6
1221 1.198198 6
1222 1.198036 6
1223 1.198283 6
1224 1.198938 6
1225 1.200000 6
1226 1.199837 6
1227 1.200489 6
1228 1.200733 6
1229 1.200570 6
1230 1.200407 6
1231 1.200244 6
1232 1.200081 6
1233 1.200730 6
1234 1.201783 6
1235 1.202429 6
1236 1.202265 6
1237 1.202506 6
1238 1.203554 6
1239 1.204197 6
1240 1.205242 6
1241 1.205077 6
1242 1.204911 6
1243 1.204747 6
1244 1.204582 6
1245 1.205221 6
1246 1.205457 6
1247 1.205293 6
1248 1.205128 6
1249 1.204964 6
1250 1.204800 6
1251 1.204636 6
1252 1.205671 6
1253 1.205906 6
1254 1.206140 6
1255 1.206375 6
1256 1.206210 6
1257 1.206046 6
1258 1.205882 6
1259 1.206116 6
1260 1.205952 6
1261 1.205789 6
1262 1.205626 6
1263 1.205463 6
1264 1.206487 6
1265 1.206324 6
1266 1.206161 6
1267 1.205998 6
1268 1.207019 6
1269 1.207250 6
1270 1.207087 6
1271 1.207710 6
1272 1.208333 6
1273 1.209348 6
1274 1.209184 6
1275 1.209412 6
1276 1.210031 6
1277 1.210258 6
1278 1.210485 6
1279 1.210321 6
1280 1.210938 6
1281 1.211944 6
1282 1.211778 6
1283 1.212003 6
1284 1.213396 6
1285 1.213230 6
1286 1.213064 6
1287 1.212898 6
1288 1.213509 6
1289 1.214119 6
1290 1.213953 6
1291 1.214175 6
1292 1.214009 6
1293 1.213844 6
1294 1.214838 6
1295 1.215058 6
1296 1.215278 6
1297 1.217039 6
1298 1.217257 6
1299 1.217475 6
1300 1.217308 6
1301 1.217909 6
1302 1.218894 6
1303 1.218726 6
1304 1.218558 6
1305 1.220690 6
1306 1.222052 6
1307 1.221882 6
1308 1.221713 6
1309 1.221543 6
1310 1.221374 6
1311 1.221587 6
1312 1.221799 6
1313 1.221630 6
1314 1.221461 6
1315 1.222053 6
1316 1.222264 6
1317 1.222855 6
1318 1.223065 6
1319 1.222896 6
1320 1.222727 6
1321 1.225208 8
1322 1.225416 8
1323 1.225246 8
1324 1.225076 8
1325 1.224906 8
1326 1.224736 8
1327 1.224943 8
1328 1.224774 8
1329 1.224605 8
1330 1.224436 8
1331 1.225394 8
1332 1.226351 8
1333 1.226557 8
1334 1.227136 8
1335 1.227715 8
1336 1.227545 8
1337 1.227749 8
1338 1.227578 8
1339 1.227409 8
1340 1.227239 8
1341 1.227069 8
1342 1.226900 8
1343 1.227848 8
1344 1.227679 8
1345 1.227881 8
1346 1.228455 8
1347 1.228656 8
1348 1.228487 8
1349 1.228317 8
1350 1.229259 8
1351 1.229460 8
1352 1.229290 8
1353 1.229120 8
1354 1.229690 8
1355 1.230996 8
1356 1.232301 8
1357 1.232498 8
1358 1.232327 8
1359 1.234364 8
1360 1.234926 8
1361 1.234754 8
1362 1.235683 8
1363 1.235877 8
1364 1.236070 8
1365 1.235897 8
1366 1.237189 8
1367 1.237015 8
1368 1.236842 8
1369 1.238130 8
1370 1.238321 8
1371 1.239241 8
1372 1.239067 8
1373 1.238893 8
1374 1.238719 8
1375 1.239636 8
1376 1.239826 8
1377 1.239651 8
1378 1.239478 8
1379 1.240029 8
1380 1.240217 8
1381 1.240043 8
1382 1.239870 8
1383 1.240058 8
1384 1.240246 8
1385 1.240433 8
1386 1.240260 8
1387 1.240807 8
1388 1.240634 8
1389 1.240461 8
1390 1.241007 8
1391 1.240834 8
1392 1.240661 8
1393 1.240488 8
1394 1.240316 8
1395 1.240143 8
1396 1.239971 8
1397 1.240157 8
1398 1.240343 8
1399 1.242316 8
1400 1.242143 8
1401 1.241970 8
1402 1.242511 8
1403 1.242338 8
1404 1.242165 8
1405 1.242349 8
1406 1.242532 8
1407 1.242360 8
1408 1.242188 8
1409 1.242725 8
1410 1.244326 8
1411 1.244507 8
1412 1.244334 8
1413 1.244161 8
1414 1.243989 8
1415 1.244170 8
1416 1.244350 8
1417 1.244884 8
1418 1.244711 8
1419 1.244538 8
1420 1.245070 8
1421 1.245602 8
1422 1.246132 8
1423 1.246311 8
1424 1.246138 8
1425 1.246667 8
1426 1.246844 8
1427 1.246671 8
1428 1.246499 8
1429 1.247376 8
1430 1.247203 8
1431 1.247030 8
1432 1.246858 8
1433 1.246685 8
1434 1.248257 8
1435 1.248084 8
1436 1.248607 8
1437 1.248782 8
1438 1.248609 8
1439 1.248784 8
1440 1.248611 8
1441 1.248786 8
1442 1.248613 8
1443 1.248441 8
1444 1.248615 8
1445 1.248443 8
1446 1.248271 8
1447 1.248445 8
1448 1.248273 8
1449 1.248447 8
1450 1.248966 8
1451 1.248794 8
1452 1.248623 8
1453 1.249140 8
1454 1.249312 8
1455 1.249141 8
1456 1.248970 8
1457 1.248799 8
1458 1.248971 8
1459 1.250514 8
1460 1.250685 8
1461 1.250513 8
1462 1.251026 8
1463 1.251538 8
1464 1.251366 8
1465 1.251536 8
1466 1.253070 8
1467 1.253579 8
1468 1.253747 8
1469 1.253574 8
1470 1.253741 8
1471 1.253569 8
1472 1.253397 8
1473 1.253904 8
1474 1.254071 8
1475 1.253898 8
1476 1.255081 8
1477 1.255586 8
1478 1.256089 8
1479 1.256254 8
1480 1.256081 8
1481 1.256921 8
1482 1.256748 8
1483 1.256575 8
1484 1.256739 8
1485 1.256902 8
1486 1.257066 8
1487 1.256893 8
1488 1.258065 8
1489 1.257891 8
1490 1.258725 8
1491 1.258551 8
1492 1.258378 8
1493 1.258875 8
1494 1.258701 8
1495 1.260201 8
1496 1.260027 8
1497 1.260855 8
1498 1.261015 8
1499 1.261174 8
1500 1.261667 8
1501 1.262492 8
1502 1.262650 8
1503 1.262475 8
1504 1.263298 8
1505 1.263455 8
1506 1.263944 8
1507 1.263769 8
1508 1.263594 8
1509 1.263419 8
1510 1.263576 8
1511 1.263402 8
1512 1.264220 8
1513 1.264706 8
1514 1.264531 8
1515 1.265677 8
1516 1.265501 8
1517 1.265326 8
1518 1.265152 8
1519 1.264977 8
1520 1.265461 8
1521 1.265943 8
1522 1.266097 8
1523 1.266579 8
1524 1.266732 8
1525 1.266885 8
1526 1.267693 8
1527 1.268500 8
1528 1.268325 8
1529 1.268149 8
1530 1.269281 8
1531 1.269758 8
1532 1.269909 8
1533 1.269733 8
1534 1.269883 8
1535 1.270033 8
1536 1.270508 8
1537 1.270982 8
1538 1.270806 8
1539 1.270955 8
1540 1.270779 8
1541 1.270928 8
1542 1.271077 8
1543 1.271873 8
1544 1.271697 8
1545 1.272492 8
1546 1.272316 8
1547 1.273432 8
1548 1.273256 8
1549 1.273079 8
1550 1.272903 8
1551 1.272727 8
1552 1.273196 8
1553 1.273664 8
1554 1.274131 8
1555 1.274920 8
1556 1.276028 8
1557 1.276493 8
1558 1.276637 8
1559 1.278704 8
1560 1.278526 8
1561 1.278347 8
1562 1.278169 8
1563 1.277991 8
1564 1.278133 8
1565 1.277955 8
1566 1.278736 8
1567 1.279196 8
1568 1.279018 8
1569 1.280115 8
1570 1.280573 8
1571 1.280713 8
1572 1.281170 8
1573 1.280992 8
1574 1.281131 8
1575 1.282540 8
1576 1.282678 8
1577 1.282498 8
1578 1.282319 8
1579 1.282457 8
1580 1.282278 8
1581 1.282100 8
1582 1.282554 8
1583 1.282375 8
1584 1.282197 8
1585 1.282650 8
1586 1.283417 8
1587 1.284499 8
1588 1.284320 8
1589 1.284456 8
1590 1.284277 8
1591 1.284098 8
1592 1.284548 8
1593 1.285311 8
1594 1.285759 8
1595 1.286207 8
1596 1.286028 8
1597 1.286162 8
1598 1.286295 8
1599 1.286742 8
1600 1.286563 8
1601 1.286696 8
1602 1.286517 8
1603 1.286338 8
1604 1.286160 8
1605 1.286293 8
1606 1.287671 8
1607 1.287803 8
1608 1.287624 8
1609 1.287446 8
1610 1.288509 8
1611 1.288641 8
1612 1.290323 8
1613 1.290453 8
1614 1.290892 8
1615 1.291022 8
1616 1.292079 8
1617 1.291899 8
1618 1.291718 8
1619 1.291538 8
1620 1.291975 8
1621 1.292412 8
1622 1.292848 8
1623 1.293592 8
1624 1.293719 8
1625 1.294462 8
1626 1.294588 8
1627 1.294714 8
1628 1.294840 8
1629 1.295273 8
1630 1.295399 8
1631 1.295831 8
1632 1.296875 8
1633 1.296693 8
1634 1.298042 8
1635 1.298165 8
1636 1.298900 8
1637 1.298717 8
1638 1.298840 8
1639 1.298963 8
1640 1.300915 8
1641 1.302559 8
1642 1.302680 8
1643 1.302800 8
1644 1.303224 8
1645 1.303040 8
1646 1.303463 8
1647 1.303582 8
1648 1.303398 8
1649 1.303517 8
1650 1.303636 8
1651 1.304361 8
1652 1.304177 8
1653 1.304598 8
1654 1.305018 8
1655 1.304834 8
1656 1.304650 8
1657 1.304768 8
1658 1.305187 8
1659 1.305606 8
1660 1.306325 8
1661 1.306141 8
1662 1.305957 8
1663 1.305773 8
1664 1.305589 8
1665 1.306006 8
1666 1.305822 8
1667 1.305639 8
1668 1.305456 8
1669 1.305872 8
1670 1.305689 8
1671 1.305805 8
1672 1.306220 8
1673 1.306037 8
1674 1.306153 8
1675 1.305970 8
1676 1.306086 8
1677 1.305903 8
1678 1.306019 8
1679 1.305837 8
1680 1.306250 8
1681 1.306960 8
1682 1.306778 8
1683 1.307487 8
1684 1.308789 8
1685 1.308605 8
1686 1.309015 8
1687 1.309425 8
1688 1.309538 8
1689 1.309355 8
1690 1.309763 8
1691 1.309580 8
1692 1.309397 8
1693 1.311282 8
1694 1.311688 8
1695 1.312094 8
1696 1.312205 8
1697 1.312316 8
1698 1.312132 8
1699 1.311948 8
1700 1.312059 8
1701 1.312463 8
1702 1.312867 8
1703 1.314151 8
1704 1.313967 8
1705 1.313783 8
1706 1.313599 8
1707 1.313415 8
1708 1.314110 8
1709 1.314511 8
1710 1.315205 8
1711 1.315020 8
1712 1.314836 8
1713 1.314653 8
1714 1.316511 8
1715 1.316327 8
1716 1.316142 8
1717 1.316832 8
1718 1.317811 8
1719 1.317917 8
1720 1.318314 8
1721 1.318420 8
1722 1.318235 8
1723 1.318630 8
1724 1.319026 8
1725 1.319130 8
1726 1.319815 8
1727 1.319919 8
1728 1.319734 8
1729 1.320127 8
1730 1.320520 8
1731 1.322357 8
1732 1.322460 8
1733 1.322562 8
1734 1.322953 8
1735 1.323343 8
1736 1.323733 8
1737 1.323546 8
1738 1.324511 8
1739 1.325187 8
1740 1.325287 8
1741 1.326249 8
1742 1.326349 8
1743 1.327022 8
1744 1.329702 8
1745 1.331232 8
1746 1.331329 8
1747 1.331712 8
1748 1.331808 8
1749 1.331904 8
1750 1.332000 8
1751 1.332096 8
1752 1.332477 8
1753 1.332288 8
1754 1.332668 8
1755 1.333048 8
1756 1.332859 8
1757 1.332954 8
1758 1.333049 8
1759 1.333144 8
1760 1.332955 8
1761 1.332765 8
1762 1.333428 8
1763 1.333239 8
1764 1.333617 8
1765 1.333428 8
1766 1.333805 8
1767 1.334748 8
1768 1.334559 8
1769 1.334370 8
1770 1.335876 8
1771 1.335968 8
1772 1.337190 8
1773 1.337281 8
1774 1.337655 8
1775 1.337465 8
1776 1.337838 8
1777 1.338773 8
1778 1.338583 8
1779 1.338673 8
1780 1.338764 8
1781 1.338855 8
1782 1.338664 8
1783 1.339316 8
1784 1.339966 8
1785 1.342017 8
1786 1.341825 8
1787 1.341634 8
1788 1.341443 8
1789 1.341252 8
1790 1.341061 8
1791 1.340871 8
1792 1.340960 8
1793 1.341327 8
1794 1.341695 8
1795 1.341783 8
1796 1.341592 8
1797 1.341681 8
1798 1.341491 8
1799 1.341301 8
1800 1.341667 8
1801 1.341477 8
1802 1.342120 8
1803 1.341930 8
1804 1.341741 8
1805 1.341551 8
1806 1.341639 8
1807 1.341450 8
1808 1.342091 8
1809 1.343007 8
1810 1.343094 8
1811 1.343457 8
1812 1.343819 8
1813 1.343905 8
1814 1.344542 8
1815 1.344904 8
1816 1.344714 8
1817 1.344524 8
1818 1.345710 8
1819 1.345794 8
1820 1.345604 8
1821 1.346513 8
1822 1.346597 8
1823 1.346956 8
1824 1.346765 8
1825 1.346575 8
1826 1.346659 8
1827 1.346743 8
1828 1.346827 8
1829 1.346638 8
1830 1.347541 8
1831 1.347351 8
1832 1.347707 8
1833 1.347791 8
1834 1.348146 8
1835 1.348229 8
1836 1.348856 8
1837 1.348938 8
1838 1.349293 8
1839 1.349375 8
1840 1.350000 8
1841 1.350081 8
1842 1.351249 8
1843 1.351601 8
1844 1.351410 8
1845 1.351491 8
1846 1.351300 8
1847 1.352463 8
1848 1.353355 8
1849 1.355327 8
1850 1.355405 8
1851 1.355213 8
1852 1.355562 8
1853 1.356179 8
1854 1.356526 8
1855 1.357412 8
1856 1.357489 8
1857 1.357566 8
1858 1.358450 8
1859 1.358795 8
1860 1.360215 8
1861 1.360021 8
1862 1.360902 8
1863 1.360709 8
1864 1.360783 8
1865 1.362198 8
1866 1.363344 8
1867 1.363149 8
1868 1.363758 8
1869 1.363563 8
1870 1.364171 8
1871 1.364511 8
1872 1.365118 8
1873 1.365456 8
1874 1.365261 8
1875 1.365867 8
1876 1.365672 8
1877 1.365477 8
1878 1.365282 8
1879 1.365088 8
1880 1.365691 8
1881 1.365763 8
1882 1.366366 8
1883 1.366702 8
1884 1.367569 8
1885 1.368170 8
1886 1.367975 8
1887 1.369899 9
1888 1.369703 9
1889 1.369508 9
1890 1.369577 9
1891 1.369381 9
1892 1.369979 9
1893 1.369783 9
1894 1.370380 9
1895 1.370449 9
1896 1.370253 9
1897 1.372430 9
1898 1.373551 9
1899 1.373618 9
1900 1.373421 9
1901 1.373225 9
1902 1.373028 9
1903 1.373358 9
1904 1.373950 9
1905 1.374278 9
1906 1.375393 9
1907 1.375197 9
1908 1.376310 9
1909 1.376899 9
1910 1.376702 9
1911 1.378074 9
1912 1.379184 9
1913 1.378986 9
1914 1.379572 9
1915 1.379634 9
1916 1.379958 9
1917 1.379760 9
1918 1.379562 9
1919 1.379625 9
1920 1.380208 9
1921 1.380010 9
1922 1.380333 9
1923 1.380135 9
1924 1.379938 9
1925 1.380260 9
1926 1.380841 9
1927 1.381162 9
1928 1.381743 9
1929 1.381545 9
1930 1.382642 9
1931 1.382703 9
1932 1.383023 9
1933 1.383342 9
1934 1.383402 9
1935 1.383979 9
1936 1.383781 9
1937 1.383841 9
1938 1.384417 9
1939 1.384219 9
1940 1.385567 9
1941 1.385368 9
1942 1.385942 9
1943 1.385744 9
1944 1.385545 9
1945 1.385347 9
1946 1.385920 9
1947 1.386235 9
1948 1.386294 9
1949 1.388148 9
1950 1.389231 9
1951 1.389544 9
1952 1.390113 9
1953 1.391449 9
1954 1.391505 9
1955 1.392583 9
1956 1.392894 9
1957 1.393204 9
1958 1.393258 9
1959 1.393313 9
1960 1.393622 9
1961 1.393677 9
1962 1.393476 9
1963 1.393785 9
1964 1.394603 9
1965 1.394911 9
1966 1.395219 9
1967 1.395018 9
1968 1.396087 9
1969 1.396648 9
1970 1.398223 9
1971 1.398782 9
1972 1.399087 9
1973 1.398885 9
1974 1.399949 9
1975 1.400759 9
1976 1.400810 9
1977 1.400607 9
1978 1.400404 9
1979 1.400202 9
1980 1.400253 9
1981 1.400555 9
1982 1.400858 9
1983 1.400908 9
1984 1.400706 9
1985 1.400504 9
1986 1.400806 9
1987 1.401107 9
1988 1.400905 9
1989 1.401709 9
1990 1.402010 9
1991 1.401808 9
1992 1.401857 9
1993 1.402408 9
1994 1.402708 9
1995 1.403258 9
1996 1.404810 9
1997 1.405358 9
1998 1.405405 9
1999 1.405203 9
2000 1.406000 9
2001 1.408296 10
2002 1.408092 10
2003 1.407888 10
2004 1.408683 10
2005 1.409476 10
2006 1.409521 10
2007 1.409317 10
2008 1.409861 10
2009 1.410652 10
2010 1.411940 10
2011 1.412233 10
2012 1.412028 10
2013 1.413065 10
2014 1.412860 10
2015 1.412655 10
2016 1.412698 10
2017 1.414973 10
2018 1.414767 10
2019 1.415305 10
2020 1.415842 10
2021 1.416131 10
2022 1.415925 10
2023 1.415966 10
2024 1.416255 10
2025 1.417284 10
2026 1.418065 10
2027 1.419832 10
2028 1.421598 10
2029 1.422376 10
2030 1.423892 10
2031 1.423683 10
2032 1.423474 10
2033 1.424004 10
2034 1.424041 10
2035 1.423833 10
2036 1.424853 10
2037 1.425135 10
2038 1.425172 10
2039 1.425454 10
2040 1.425245 10
2041 1.425282 10
2042 1.425073 10
2043 1.426334 10
2044 1.428327 10
2045 1.430318 10
2046 1.431818 10
2047 1.431607 10
2048 1.432129 10
2049 1.433382 10
2050 1.433415 10
2051 1.433203 10
2052 1.433967 10
2053 1.434973 10
2054 1.435492 10
2055 1.435523 10
2056 1.436284 10
2057 1.436315 10
2058 1.436346 10
2059 1.438320 10
2060 1.438350 10
2061 1.438137 10
2062 1.438652 10
2063 1.438924 10
2064 1.439922 10
2065 1.441162 10
2066 1.441675 10
2067 1.441461 10
2068 1.441731 10
2069 1.444176 10
2070 1.444928 10
2071 1.444713 10
2072 1.445222 10
2073 1.445490 10
2074 1.445275 10
2075 1.445060 10
2076 1.445809 10
2077 1.447039 10
2078 1.446824 10
2079 1.446849 10
2080 1.447115 10
2081 1.448582 10
2082 1.448847 10
2083 1.449112 10
2084 1.449376 10
2085 1.449400 10
2086 1.449664 10
2087 1.449689 10
2088 1.449713 10
2089 1.449976 10
2090 1.450478 10
2091 1.450980 10
2092 1.450765 10
2093 1.450549 10
2094 1.450334 10
2095 1.451074 10
2096 1.451813 10
2097 1.451836 10
2098 1.451859 10
2099 1.451644 10
2100 1.452619 10
2101 1.452404 10
2102 1.452664 10
2103 1.452687 10
2104 1.453422 10
2105 1.455107 10
2106 1.455603 10
2107 1.455387 10
2108 1.456120 10
2109 1.456377 10
2110 1.456872 10
2111 1.457129 10
2112 1.457386 10
2113 1.458590 10
2114 1.459319 10
2115 1.459102 10
2116 1.458885 10
2117 1.458904 10
2118 1.459160 10
2119 1.459887 10
2120 1.459670 10
2121 1.459689 10
2122 1.459472 10
2123 1.460198 10
2124 1.460452 10
2125 1.460235 10
2126 1.460724 10
2127 1.460978 10
2128 1.460761 10
2129 1.460780 10
2130 1.461268 10
2131 1.462224 10
2132 1.462711 10
2133 1.463666 10
2134 1.464620 10
2135 1.464403 10
2136 1.464185 10
2137 1.465372 10
2138 1.466090 10
2139 1.466106 10
2140 1.465888 10
2141 1.465904 10
2142 1.466853 10
2143 1.467102 10
2144 1.467817 10
2145 1.468531 10
2146 1.468313 10
2147 1.468095 10
2148 1.468343 10
2149 1.468590 10
2150 1.469302 10
2151 1.469549 10
2152 1.469331 10
2153 1.469113 10
2154 1.469127 10
2155 1.470766 10
2156 1.471475 10
2157 1.471952 10
2158 1.471965 10
2159 1.471978 10
2160 1.472222 10
2161 1.472698 10
2162 1.473867 10
2163 1.474341 10
2164 1.474353 10
2165 1.474365 10
2166 1.474377 10
2167 1.474158 10
2168 1.474631 10
2169 1.474412 10
2170 1.474424 10
2171 1.475587 10
2172 1.476059 10
2173 1.477681 10
2174 1.477691 10
2175 1.478161 10
2176 1.478860 10
2177 1.479100 10
2178 1.478880 10
2179 1.479578 10
2180 1.479587 10
2181 1.479367 10
2182 1.479606 10
2183 1.479615 10
2184 1.480311 10
2185 1.480092 10
2186 1.479872 10
2187 1.480110 10
2188 1.480119 10
2189 1.480356 10
2190 1.481050 10
2191 1.480831 10
2192 1.480839 10
2193 1.481076 10
2194 1.481313 10
2195 1.481321 10
2196 1.481785 10
2197 1.483614 10
2198 1.484759 10
2199 1.484993 10
2200 1.485000 10
2201 1.485007 10
2202 1.485014 10
2203 1.485474 10
2204 1.485935 10
2205 1.485941 10
2206 1.486174 10
2207 1.486633 10
2208 1.487319 10
2209 1.489588 11
2210 1.490271 11
2211 1.490050 11
2212 1.490958 11
2213 1.490737 11
2214 1.490515 11
2215 1.490293 11
2216 1.490072 11
2217 1.492106 11
2218 1.492335 11
2219 1.492790 11
2220 1.493018 11
2221 1.494372 11
2222 1.495050 11
2223 1.494827 11
2224 1.494604 11
2225 1.494831 11
2226 1.495058 11
2227 1.495510 11
2228 1.495736 11
2229 1.496411 11
2230 1.496413 11
2231 1.496638 11
2232 1.496640 11
2233 1.497089 11
2234 1.497538 11
2235 1.498881 11
2236 1.500000 11
2237 1.501118 11
2238 1.501117 11
2239 1.501563 11
2240 1.501786 11
2241 1.502008 11
2242 1.502230 11
2243 1.502452 11
2244 1.502228 11
2245 1.502450 11
2246 1.502449 11
2247 1.502893 11
2248 1.502669 11
2249 1.502446 11
2250 1.503556 11
2251 1.504665 11
2252 1.504663 11
2253 1.504660 11
2254 1.505102 11
2255 1.506430 11
2256 1.506206 11
2257 1.505981 11
2258 1.506643 11
2259 1.506861 11
2260 1.507080 11
2261 1.508182 11
2262 1.509063 11
2263 1.509943 11
2264 1.510601 11
2265 1.511700 11
2266 1.511915 11
2267 1.513454 11
2268 1.514330 11
2269 1.514103 11
2270 1.514097 11
2271 1.514971 11
2272 1.514965 11
2273 1.515618 11
2274 1.516051 11
2275 1.516264 11
2276 1.516696 11
2277 1.516469 11
2278 1.516462 11
2279 1.517990 11
2280 1.518202 11
2281 1.517975 11
2282 1.518405 11
2283 1.518616 11
2284 1.520140 11
2285 1.520350 11
2286 1.520560 11
2287 1.523612 11
2288 1.523820 11
2289 1.524028 11
2290 1.524017 11
2291 1.524225 11
2292 1.524215 11
2293 1.524204 11
2294 1.525719 11
2295 1.526580 11
2296 1.527003 11
2297 1.527209 11
2298 1.527198 11
2299 1.527403 11
2300 1.527174 11
2301 1.528683 11
2302 1.528454 11
2303 1.529744 11
2304 1.531684 11
2305 1.531670 11
2306 1.532090 11
2307 1.531860 11
2308 1.531629 11
2309 1.532265 11
2310 1.532900 11
2311 1.532886 11
2312 1.533304 11
2313 1.534155 11
2314 1.533924 11
2315 1.534557 11
2316 1.534326 11
2317 1.535175 11
2318 1.535591 11
2319 1.536869 11
2320 1.537500 11
2321 1.537915 11
2322 1.538975 11
2323 1.539389 11
2324 1.540017 11
2325 1.539785 11
2326 1.540413 11
2327 1.540180 11
2328 1.539948 11
2329 1.541863 11
2330 1.542060 11
2331 1.542042 11
2332 1.542453 11
2333 1.543078 11
2334 1.543488 11
2335 1.544325 11
2336 1.544092 11
2337 1.544074 11
2338 1.544910 11
2339 1.544677 11
2340 1.545299 11
2341 1.545707 11
2342 1.545901 11
2343 1.546522 11
2344 1.546928 11
2345 1.548188 11
2346 1.548593 11
2347 1.549851 11
2348 1.550894 11
2349 1.551511 11
2350 1.551702 11
2351 1.551680 11
2352 1.551871 11
2353 1.553124 11
2354 1.552889 11
2355 1.554352 11
2356 1.556239 11
2357 1.557276 11
2358 1.557252 11
2359 1.557440 11
2360 1.558051 11
2361 1.558450 11
2362 1.558425 11
2363 1.558612 11
2364 1.558587 11
2365 1.559197 11
2366 1.559383 11
2367 1.559569 11
2368 1.560389 11
2369 1.560152 11
2370 1.560338 11
2371 1.561156 11
2372 1.561551 11
2373 1.561947 11
2374 1.562131 11
2375 1.562316 11
2376 1.563552 11
2377 1.563736 11
2378 1.564130 11
2379 1.565574 11
2380 1.565546 11
2381 1.565309 11
2382 1.566121 11
2383 1.566303 11
2384 1.566485 11
2385 1.567505 11
2386 1.567896 11
2387 1.567658 11
2388 1.568677 11
2389 1.568648 11
2390 1.569665 11
2391 1.569427 11
2392 1.569189 11
2393 1.568951 11
2394 1.569131 11
2395 1.571190 12
2396 1.571160 12
2397 1.571756 12
2398 1.571726 12
2399 1.573572 12
2400 1.573542 12
2401 1.574344 12
2402 1.574938 12
2403 1.575531 12
2404 1.576955 12
2405 1.576715 12
2406 1.577722 12
2407 1.577482 12
2408 1.577243 12
2409 1.578456 12
2410 1.578838 12
2411 1.579428 12
2412 1.580017 12
2413 1.579776 12
2414 1.580365 12
2415 1.580124 12
2416 1.580505 12
2417 1.580679 12
2418 1.580438 12
2419 1.581439 12
2420 1.581198 12
2421 1.581784 12
2422 1.582576 12
2423 1.582336 12
2424 1.582921 12
2425 1.583093 12
2426 1.584501 12
2427 1.584466 12
2428 1.584226 12
2429 1.584191 12
2430 1.584362 12
2431 1.584944 12
2432 1.585732 12
2433 1.585902 12
2434 1.586072 12
2435 1.587064 12
2436 1.587644 12
2437 1.587813 12
2438 1.587982 12
2439 1.587741 12
2440 1.587705 12
2441 1.587669 12
2442 1.588043 12
2443 1.588416 12
2444 1.589198 12
2445 1.590389 12
2446 1.590352 12
2447 1.590315 12
2448 1.590074 12
2449 1.591670 12
2450 1.592041 12
2451 1.592819 12
2452 1.592781 12
2453 1.592947 12
2454 1.593928 12
2455 1.593890 12
2456 1.593852 12
2457 1.593814 12
2458 1.593979 12
2459 1.594754 12
2460 1.594512 12
2461 1.595286 12
2462 1.597279 12
2463 1.597036 12
2464 1.596794 12
2465 1.596957 12
2466 1.597526 12
2467 1.597284 12
2468 1.598055 12
2469 1.598015 12
2470 1.597773 12
2471 1.597531 12
2472 1.597492 12
2473 1.597250 12
2474 1.597413 12
2475 1.597778 12
2476 1.597738 12
2477 1.598103 12
2478 1.598467 12
2479 1.598628 12
2480 1.598589 12
2481 1.598347 12
2482 1.598711 12
2483 1.599678 12
2484 1.599436 12
2485 1.600201 12
2486 1.601368 12
2487 1.603136 12
2488 1.603899 12
2489 1.604661 12
2490 1.605622 12
2491 1.606584 12
2492 1.607143 12
2493 1.609306 12
2494 1.609864 12
2495 1.610020 12
2496 1.610377 12
2497 1.610132 12
2498 1.610488 12
2499 1.612245 12
2500 1.612800 12
2501 1.613355 12
2502 1.613509 12
2503 1.613664 12
2504 1.614217 12
2505 1.614571 12
2506 1.615323 12
2507 1.615876 12
2508 1.615829 12
2509 1.618972 12
2510 1.619721 12
2511 1.619873 12
2512 1.619825 12
2513 1.619777 12
2514 1.620525 12
2515 1.620875 12
2516 1.621224 12
2517 1.621573 12
2518 1.621525 12
2519 1.621278 12
2520 1.621627 12
2521 1.623165 12
2522 1.623315 12
2523 1.623662 12
2524 1.624406 12
2525 1.624554 12
2526 1.625099 12
2527 1.625049 12
2528 1.629351 16
2529 1.629696 16
2530 1.630040 16
2531 1.629988 16
2532 1.629739 16
2533 1.631070 16
2534 1.632597 16
2535 1.632347 16
2536 1.632098 16
2537 1.634214 16
2538 1.634161 16
2539 1.634502 16
2540 1.634449 16
2541 1.634593 16
2542 1.634933 16
2543 1.635470 16
2544 1.635613 16
2545 1.636149 16
2546 1.636292 16
2547 1.636042 16
2548 1.636774 16
2549 1.637113 16
2550 1.637059 16
2551 1.637397 16
2552 1.637735 16
2553 1.639248 16
2554 1.639585 16
2555 1.639726 16
2556 1.639867 16
2557 1.640203 16
2558 1.640539 16
2559 1.640680 16
2560 1.643359 16
2561 1.645061 16
2562 1.644809 16
2563 1.645533 16
2564 1.646451 16
2565 1.647173 16
2566 1.648675 16
2567 1.651149 16
2568 1.652064 16
2569 1.652978 16
2570 1.654280 16
2571 1.654804 16
2572 1.655132 16
2573 1.656627 16
2574 1.657925 16
2575 1.658058 16
2576 1.658773 16
2577 1.658518 16
2578 1.658650 16
2579 1.658589 16
2580 1.658721 16
2581 1.659047 16
2582 1.659373 16
2583 1.659698 16
2584 1.660604 16
2585 1.662089 16
2586 1.661833 16
2587 1.662157 16
2588 1.661901 16
2589 1.662611 16
2590 1.662741 16
2591 1.662486 16
2592 1.662230 16
2593 1.663710 16
2594 1.664418 16
2595 1.664933 16
2596 1.665062 16
2597 1.665576 16
2598 1.665319 16
2599 1.665448 16
2600 1.665192 16
2601 1.665705 16
2602 1.666987 16
2603 1.667307 16
2604 1.667051 16
2605 1.667946 16
2606 1.667882 16
2607 1.668393 16
2608 1.669287 16
2609 1.669222 16
2610 1.669157 16
2611 1.669475 16
2612 1.670368 16
2613 1.671068 16
2614 1.671194 16
2615 1.671702 16
2616 1.673356 16
2617 1.673290 16
2618 1.673415 16
2619 1.674303 16
2620 1.675000 16
2621 1.675315 16
2622 1.676583 16
2623 1.677087 16
2624 1.677020 16
2625 1.677905 16
2626 1.678027 16
2627 1.678150 16
2628 1.678463 16
2629 1.679156 16
2630 1.679278 16
2631 1.679780 16
2632 1.680851 16
2633 1.681162 16
2634 1.681663 16
2635 1.681784 16
2636 1.682663 16
2637 1.684111 16
2638 1.684230 16
2639 1.686245 16
2640 1.686364 16
2641 1.686861 16
2642 1.686790 16
2643 1.687666 16
2644 1.687784 16
2645 1.689414 16
2646 1.690476 16
2647 1.690593 16
2648 1.692221 16
2649 1.694035 16
2650 1.694906 16
2651 1.694644 16
2652 1.694570 16
2653 1.694308 16
2654 1.695742 16
2655 1.696234 16
2656 1.696348 16
2657 1.696462 16
2658 1.697893 16
2659 1.698195 16
2660 1.698120 16
2661 1.698610 16
2662 1.698535 16
2663 1.700338 16
2664 1.701014 16
2665 1.700750 16
2666 1.701050 16
2667 1.700787 16
2668 1.701837 16
2669 1.702885 16
2670 1.702996 16
2671 1.704792 16
2672 1.704903 16
2673 1.705761 16
2674 1.705497 16
2675 1.705981 16
2676 1.706839 16
2677 1.706761 16
2678 1.706871 16
2679 1.706794 16
2680 1.706903 16
2681 1.707572 16
2682 1.710477 16
2683 1.710585 16
2684 1.710879 16
2685 1.710615 16
2686 1.710722 16
2687 1.711388 16
2688 1.711124 16
2689 1.711603 16
2690 1.713011 16
2691 1.714604 16
2692 1.716382 16
2693 1.717973 16
2694 1.718820 16
2695 1.718738 16
2696 1.720141 16
2697 1.720801 16
2698 1.720719 16
2699 1.720823 16
2700 1.720741 16
2701 1.721029 16
2702 1.721132 16
2703 1.722716 16
2704 1.723003 16
2705 1.723290 16
2706 1.723947 16
2707 1.723864 16
2708 1.723781 16
2709 1.724622 16
2710 1.725461 16
2711 1.727960 16
2712 1.729167 16
2713 1.729635 16
2714 1.729366 16
2715 1.730203 16
2716 1.730670 16
2717 1.730953 16
2718 1.731972 16
2719 1.732071 16
2720 1.733088 16
2721 1.734105 16
2722 1.735856 16
2723 1.736320 16
2724 1.736050 16
2725 1.736697 16
2726 1.737711 16
2727 1.737807 16
2728 1.738087 16
2729 1.738366 16
2730 1.738828 16
2731 1.105822 5
2732 1.105783 5
2733 1.105928 5
2734 1.106072 5
2735 1.106216 5
2736 1.106177 5
2737 1.106138 5
2738 1.106099 5
2739 1.106061 5
2740 1.106752 5
2741 1.106895 5
2742 1.107039 5
2743 1.107364 5
2744 1.107325 5
2745 1.107286 5
2746 1.107429 5
2747 1.107390 5
2748 1.107351 5
2749 1.107312 5
2750 1.107455 5
2751 1.107415 5
2752 1.107376 5
2753 1.107519 5
2754 1.107662 5
2755 1.107804 5
2756 1.107946 5
2757 1.107907 5
2758 1.107868 5
2759 1.107829 5
2760 1.107790 5
2761 1.107932 5
2762 1.108436 5
2763 1.108397 5
2764 1.108357 5
2765 1.108318 5
2766 1.108279 5
2767 1.108240 5
2768 1.108382 5
2769 1.108523 5
2770 1.108484 5
2771 1.108445 5
2772 1.108405 5
2773 1.108366 5
2774 1.108327 5
2775 1.108649 5
2776 1.108610 5
2777 1.108931 5
2778 1.109071 5
2779 1.109032 5
2780 1.108993 5
2781 1.108954 5
2782 1.108914 5
2783 1.108875 5
2784 1.108836 5
2785 1.108977 5
2786 1.108938 5
2787 1.108898 5
2788 1.109039 5
2789 1.109179 5
2790 1.109140 5
2791 1.109101 5
2792 1.109062 5
2793 1.109023 5
2794 1.108984 5
2795 1.109123 5
2796 1.109084 5
2797 1.109045 5
2798 1.109185 5
2799 1.109146 5
2800 1.109107 5
2801 1.109247 5
2802 1.109386 5
2803 1.109347 5
2804 1.109308 5
2805 1.109269 5
2806 1.109230 5
2807 1.109548 5
2808 1.109687 5
2809 1.109648 5
2810 1.109609 5
2811 1.109747 5
2812 1.109886 5
2813 1.109847 5
2814 1.109808 5
2815 1.109769 5
2816 1.109730 5
2817 1.109869 5
2818 1.109830 5
2819 1.109791 5
2820 1.109752 5
2821 1.109713 5
2822 1.110028 5
2823 1.109989 5
2824 1.110127 5
2825 1.110088 5
2826 1.110050 5
2827 1.110011 5
2828 1.110856 6
2829 1.110817 6
2830 1.110954 6
2831 1.110915 6
2832 1.110876 6
2833 1.110837 6
2834 1.110797 6
2835 1.110935 6
2836 1.111425 6
2837 1.111385 6
2838 1.111346 6
2839 1.111659 6
2840 1.111620 6
2841 1.111580 6
2842 1.111717 6
2843 1.111854 6
2844 1.111814 6
2845 1.112127 6
2846 1.112087 6
2847 1.112048 6
2848 1.112008 6
2849 1.111969 6
2850 1.112105 6
2851 1.112066 6
2852 1.112027 6
2853 1.111987 6
2854 1.111948 6
2855 1.111909 6
2856 1.111870 6
2857 1.111831 6
2858 1.111791 6
2859 1.111927 6
2860 1.111888 6
2861 1.112024 6
2862 1.111985 6
2863 1.112295 6
2864 1.112256 6
2865 1.112216 6
2866 1.112352 6
2867 1.112487 6
2868 1.112448 6
2869 1.112409 6
2870 1.112369 6
2871 1.112330 6
2872 1.112291 6
2873 1.112252 6
2874 1.112387 6
2875 1.112522 6
2876 1.112656 6
2877 1.112617 6
2878 1.112578 6
2879 1.112539 6
2880 1.112500 6
2881 1.112461 6
2882 1.112422 6
2883 1.112383 6
2884 1.112344 6
2885 1.112305 6
2886 1.112266 6
2887 1.112227 6
2888 1.112188 6
2889 1.112150 6
2890 1.112284 6
2891 1.112245 6
2892 1.112206 6
2893 1.112167 6
2894 1.112301 6
2895 1.112263 6
2896 1.112224 6
2897 1.112358 6
2898 1.112319 6
2899 1.112280 6
2900 1.112414 6
2901 1.112375 6
2902 1.112336 6
2903 1.112298 6
2904 1.112431 6
2905 1.112392 6
2906 1.112354 6
2907 1.112487 6
2908 1.112620 6
2909 1.112582 6
2910 1.112543 6
2911 1.112504 6
2912 1.112466 6
2913 1.112427 6
2914 1.112388 6
2915 1.112521 6
2916 1.112654 6
2917 1.112616 6
2918 1.112748 6
2919 1.112710 6
2920 1.112671 6
2921 1.112804 6
2922 1.113279 6
2923 1.113582 6
2924 1.113714 6
2925 1.113846 6
2926 1.113807 6
2927 1.113768 6
2928 1.113730 6
2929 1.114032 6
2930 1.113993 6
2931 1.113954 6
2932 1.113915 6
2933 1.114218 6
2934 1.114179 6
2935 1.114140 6
2936 1.114101 6
2937 1.114062 6
2938 1.114023 6
2939 1.113984 6
2940 1.113946 6
2941 1.113907 6
2942 1.113868 6
2943 1.113829 6
2944 1.114130 6
2945 1.114431 6
2946 1.114392 6
2947 1.114354 6
2948 1.114315 6
2949 1.114276 6
2950 1.114237 6
2951 1.114199 6
2952 1.114160 6
2953 1.114460 6
2954 1.114421 6
2955 1.114382 6
2956 1.114344 6
2957 1.114474 6
2958 1.114773 6
2959 1.114904 6
2960 1.115034 6
2961 1.114995 6
2962 1.115125 6
2963 1.115255 6
2964 1.115385 6
2965 1.115346 6
2966 1.115307 6
2967 1.115268 6
2968 1.115229 6
2969 1.115190 6
2970 1.115152 6
2971 1.115113 6
2972 1.115074 6
2973 1.115035 6
2974 1.114997 6
2975 1.114958 6
2976 1.114919 6
2977 1.114881 6
2978 1.114842 6
2979 1.114971 6
2980 1.114933 6
2981 1.115062 6
2982 1.115023 6
2983 1.114985 6
2984 1.115114 6
2985 1.115075 6
2986 1.115037 6
2987 1.115166 6
2988 1.115127 6
2989 1.115256 6
2990 1.115217 6
2991 1.115346 6
2992 1.115307 6
2993 1.115269 6
2994 1.115564 6
2995 1.115693 6
2996 1.115654 6
2997 1.115616 6
2998 1.115744 6
2999 1.115705 6


text:
import os
import re

def tester(problem_name, f):
	input_path = "src/tests/" + problem_name + "/input/"
	output_path = "src/tests/" + problem_name + "/output/"
	regex = re.compile(r'input(\d+).txt')
	co = 1;
	num_tests = 0
	num_wrong = 0
	for file_name in os.listdir(input_path):
		m = regex.match(file_name)
		if not m:
			continue
		n = m.groups()[0]
		input_file_path = os.path.join(input_path, file_name)
		output_file_path = os.path.join(output_path, "output" + n + ".txt")
		if not os.path.isfile(output_file_path):
			print("output for input file " + input_file_path + "does not exist!")
			continue
		num_tests += 1
		with open(input_file_path) as input_file:
			with open(output_file_path) as output_file:
				input_params = []
				output = eval(output_file.readlines()[0])
				for line in input_file.readlines():
					input_params.append(eval(line))
				if not f(*input_params.copy()) == output:
					num_wrong += 1
	if num_wrong != 0:
		print("Your code get wrong answer in " + str(num_wrong) + " test(s) from " + str(num_tests) + " test(s).")
	else:
		print("Your code passes all " + str(num_tests) + " test(s).")


text:
def insertion_sort(A):
    res = A[:]
    for k in range(1, len(res)):
        item = res[k]
        i = k
        while i > 0 and res[i-1] > item:
            res[i] = res[i-1]
            i -= 1
        res[i] = item
    return res

def selection_sort(A):
    res = A[:]
    n = len(res)
    for i in range(n - 1):
        index = i
        for j in range(i + 1, n):
            if res[index] > res[j]:
                index = j
        res[i], res[index] = res[index], res[i]
    return res

def bubble_sort(A):
    res = A[:]
    n = len(res)
    for i in range(n-1):
        bubble_found = False
        for j in range(n-1, i, -1):
            if res[j] < res[j-1]:
                res[j], res[j-1] = res[j-1], res[j]
                bubble_found = True
        if not bubble_found:
            break
    return res

def bucket_sort(A):
    res = A[:]
    max_num = max(res)
    bucket_num = max_num // 10 + 1
    buckets = [[] for i in range(bucket_num)]

    for i in res:
        buckets[i // 10] += [i]

    for i in range(bucket_num):
        buckets[i] = selection_sort(buckets[i])

    res = []
    for i in range(bucket_num):
        res += buckets[i]

    return res

def radix_sort(A):
    res = A[:]
    max_num = max(res)
    radix = 1
    while radix <= max_num:
        B = [[] for i in range(10)]
        for i in res:
            B[int((i / radix) % 10)] += [i]
        res = []
        for i in range(10):
            res += B[i]
        radix *= 10
    return res


text:
class TreeNode:
    def __init__(self, label):
        self.parent = None
        self.left_child = None
        self.right_sibling = None
        self.label = label

    def __str__(self):
        return "TreeNode(%s)" % str(self.label)

class Tree:
    def __init__(self):
        self.root = None

    def assign_root(self, label):
        assert self.root is None
        self.root = TreeNode(label)

    def is_empty(self):
        return self.root is None

    def add_new_node_1(self, parent, label):
        new_node = TreeNode(label)
        left_child = parent.left_child
        parent.left_child = new_node
        new_node.right_sibling = left_child
        new_node.parent = parent
        return new_node

    def add_new_node_2(self, parent, label):
        new_node = TreeNode(label)
        new_node.parent = parent
        if parent.left_child is None:
            parent.left_child = new_node
        else:
            left_child = parent.left_child
            while left_child.right_sibling is not None:
                left_child = left_child.right_sibling
            left_child.right_sibling = new_node
        return new_node

    def add_new_node(self, parent, label):
        return self.add_new_node_2(parent, label)

    def find_in_subtree(self, label, node):
        if node.label == label:
            return node

        child = node.left_child
        while child is not None:
            result = self.find_in_subtree(label, child)
            if result is not None:
                return result
            child = child.right_sibling
        return None

    def find_by_label(self, label):
        if self.is_empty():
            return None
        return self.find_in_subtree(label, self.root)

    def add_new_node_by_label(self, parent_label, label):
        self.add_new_node(self.find_by_label(parent_label), label)

    def get_subtree_size(self, node):
        if node is None:
            return 0

        count = 1
        child = node.left_child
        while child is not None:
            count += self.get_subtree_size(child)
            child = child.right_sibling

        return count

    def get_size(self):
        if self.is_empty():
            return 0
        return self.get_subtree_size(self.root)

    def pre_order(self, node):
        order_list = list()
        if node is None:
            return order_list

        order_list.append(node.label)
        child = node.left_child
        while child is not None:
            order_list.extend(self.pre_order(child))
            child = child.right_sibling
        return order_list

    def post_order(self, node):
        order_list = list()
        if node is None:
            return order_list

        child = node.left_child
        while child is not None:
            order_list.extend(self.post_order(child))
            child = child.right_sibling
        order_list.append(node.label)
        return order_list

    def in_order(self, node):
        order_list = list()
        if node is None:
            return order_list
        child = node.left_child
        order_list.extend(self.in_order(child))
        order_list.append(node.label)
        while child is not None:
            child = child.right_sibling
            order_list.extend(self.in_order(child))
        return order_list

import 	sys
from random import shuffle, randint
argv = sys.argv
n = int(argv[1])
file_name = int(argv[2])

node_list = [i for i in range(n)]
shuffle(node_list)
node_degree = [0 for i in range(n)]
t = Tree()
t.assign_root(node_list[0] + 1)
node_degree[node_list[0]] += 1

for i in range(n - 1):
    ind = randint(0, i)
    t.add_new_node_by_label(node_list[ind] + 1, node_list[i + 1] + 1)
target_node = node_list[randint(0, n - 1)] + 1

with open("input/input" + str(file_name) + ".txt", "w") as input_file:
	input_file.write(str(t.pre_order(t.root)) + "\n")
	input_file.write(str(t.in_order(t.root)) + "\n")
	input_file.write(str(target_node) + "\n")
with open("output/output" + str(file_name) + ".txt", "w") as output_file:
    output_file.write(str(t.get_subtree_size(t.find_by_label(target_node).left_child)) + "\n")


text:
class TreeNode:
    def __init__(self, label):
        self.parent = None
        self.left_child = None
        self.right_sibling = None
        self.label = label

    def __str__(self):
        return "TreeNode(%s)" % str(self.label)

class Tree:
    def __init__(self):
        self.root = None

    def assign_root(self, label):
        assert self.root is None
        self.root = TreeNode(label)

    def is_empty(self):
        return self.root is None

    def add_new_node_1(self, parent, label):
        new_node = TreeNode(label)
        left_child = parent.left_child
        parent.left_child = new_node
        new_node.right_sibling = left_child
        new_node.parent = parent
        return new_node

    def add_new_node_2(self, parent, label):
        new_node = TreeNode(label)
        new_node.parent = parent
        if parent.left_child is None:
            parent.left_child = new_node
        else:
            left_child = parent.left_child
            while left_child.right_sibling is not None:
                left_child = left_child.right_sibling
            left_child.right_sibling = new_node
        return new_node

    def add_new_node(self, parent, label):
        return self.add_new_node_2(parent, label)

    def find_in_subtree(self, label, node):
        if node.label == label:
            return node

        child = node.left_child
        while child is not None:
            result = self.find_in_subtree(label, child)
            if result is not None:
                return result
            child = child.right_sibling
        return None

    def find_by_label(self, label):
        if self.is_empty():
            return None
        return self.find_in_subtree(label, self.root)

    def add_new_node_by_label(self, parent_label, label):
        self.add_new_node(self.find_by_label(parent_label), label)

    def get_subtree_size(self, node):
        if node is None:
            return 0

        count = 1
        child = node.left_child
        while child is not None:
            count += self.get_subtree_size(child)
            child = child.right_sibling

        return count

    def get_size(self):
        if self.is_empty():
            return 0
        return self.get_subtree_size(self.root)

    def pre_order(self, node):
        order_list = list()
        if node is None:
            return order_list

        order_list.append(node.label)
        child = node.left_child
        while child is not None:
            order_list.extend(self.pre_order(child))
            child = child.right_sibling
        return order_list

    def post_order(self, node):
        order_list = list()
        if node is None:
            return order_list

        child = node.left_child
        while child is not None:
            order_list.extend(self.post_order(child))
            child = child.right_sibling
        order_list.append(node.label)
        return order_list

    def in_order(self, node):
        order_list = list()
        if node is None:
            return order_list
        child = node.left_child
        order_list.extend(self.in_order(child))
        order_list.append(node.label)
        while child is not None:
            child = child.right_sibling
            order_list.extend(self.in_order(child))
        return order_list

import 	sys
from random import shuffle, randint
argv = sys.argv
n = int(argv[1])
file_name = int(argv[2])

node_list = [i for i in range(n)]
shuffle(node_list)
node_degree = [0 for i in range(n)]
t = Tree()
t.assign_root(node_list[0] + 1)
node_degree[node_list[0]] += 1

for i in range(n - 1):
    ind = randint(0, i)
    t.add_new_node_by_label(node_list[ind] + 1, node_list[i + 1] + 1)

with open("input/input" + str(file_name) + ".txt", "w") as input_file:
	input_file.write(str(t.pre_order(t.root)) + "\n")
	input_file.write(str(t.in_order(t.root)) + "\n")
with open("output/output" + str(file_name) + ".txt", "w") as output_file:
    output_file.write(str(t.get_subtree_size(t.root.left_child)) + "\n")


text:
class TreeNode:
    def __init__(self, label):
        self.parent = None
        self.left_child = None
        self.right_sibling = None
        self.label = label

    def __str__(self):
        return "TreeNode(%s)" % str(self.label)

class Tree:
    def __init__(self):
        self.root = None

    def assign_root(self, label):
        assert self.root is None
        self.root = TreeNode(label)

    def is_empty(self):
        return self.root is None

    def add_new_node_1(self, parent, label):
        new_node = TreeNode(label)
        left_child = parent.left_child
        parent.left_child = new_node
        new_node.right_sibling = left_child
        new_node.parent = parent
        return new_node

    def add_new_node_2(self, parent, label):
        new_node = TreeNode(label)
        new_node.parent = parent
        if parent.left_child is None:
            parent.left_child = new_node
        else:
            left_child = parent.left_child
            while left_child.right_sibling is not None:
                left_child = left_child.right_sibling
            left_child.right_sibling = new_node
        return new_node

    def add_new_node(self, parent, label):
        return self.add_new_node_2(parent, label)

    def find_in_subtree(self, label, node):
        if node.label == label:
            return node

        child = node.left_child
        while child is not None:
            result = self.find_in_subtree(label, child)
            if result is not None:
                return result
            child = child.right_sibling
        return None

    def find_by_label(self, label):
        if self.is_empty():
            return None
        return self.find_in_subtree(label, self.root)

    def add_new_node_by_label(self, parent_label, label):
        self.add_new_node(self.find_by_label(parent_label), label)

    def get_subtree_size(self, node):
        if node is None:
            return 0

        count = 1
        child = node.left_child
        while child is not None:
            count += self.get_subtree_size(child)
            child = child.right_sibling

        return count

    def get_size(self):
        if self.is_empty():
            return 0
        return self.get_subtree_size(self.root)

    def pre_order(self, node):
        order_list = list()
        if node is None:
            return order_list

        order_list.append(node.label)
        child = node.left_child
        while child is not None:
            order_list.extend(self.pre_order(child))
            child = child.right_sibling
        return order_list

    def post_order(self, node):
        order_list = list()
        if node is None:
            return order_list

        child = node.left_child
        while child is not None:
            order_list.extend(self.post_order(child))
            child = child.right_sibling
        order_list.append(node.label)
        return order_list

    def in_order(self, node):
        order_list = list()
        if node is None:
            return order_list
        child = node.left_child
        order_list.extend(self.in_order(child))
        order_list.append(node.label)
        while child is not None:
            child = child.right_sibling
            order_list.extend(self.in_order(child))
        return order_list

import 	sys
from random import shuffle, randint
argv = sys.argv
n = int(argv[1])
file_name = int(argv[2])

node_list = [i for i in range(n)]
shuffle(node_list)
node_degree = [0 for i in range(n)]
t = Tree()
t.assign_root(node_list[0] + 1)

for i in range(n - 1):
    ind = randint(0, i)
    while node_degree[ind] >= 2:
        ind = randint(0, i)
    t.add_new_node_by_label(node_list[ind] + 1, node_list[i + 1] + 1)
    node_degree[ind] += 1

with open("input/input" + str(file_name) + ".txt", "w") as input_file:
	input_file.write(str(t.pre_order(t.root)) + "\n")
	input_file.write(str(t.in_order(t.root)) + "\n")
with open("output/output" + str(file_name) + ".txt", "w") as output_file:
    output_file.write(str(t.post_order(t.root)) + "\n")


text:
record & replay or time travel debugging

# framework

* [Django: kolo](https://kolo.app/)
* [Redux: DevTools](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd)
* https://meiosis.js.org/tracer/
* https://elm-lang.org/news/time-travel-made-easy

# python

* http://pythontutor.com/
* https://pytrace.com/
* https://viztracer.readthedocs.io/en/latest/
* https://revdebug.gitbook.io/revdebug/supported-langauges/python

# java

* https://undo.io/solutions/products/java/
* https://arthas.aliyun.com/doc/tt
* https://www.cs.cmu.edu/~NatProg/whyline-java.html
* https://revdebug.gitbook.io/revdebug/supported-langauges/java
* https://github.com/alibaba/jvm-sandbox-repeater
* https://chrononsystems.com/

# c#

* https://revdebug.gitbook.io/revdebug/supported-langauges/c

# golang

* https://github.com/didi/sharingan

# javascript & browser

* https://wallabyjs.com/docs/intro/time-travel-debugger.html
* https://logrocket.com/
* https://revdebug.gitbook.io/revdebug/supported-langauges/javascript
* https://replay.io/
* https://developer.chrome.com/docs/devtools/recorder/
*  https://www.highlight.io/

# c / libc

* https://rr-project.org/
* https://pernos.co/
* https://github.com/didi/rdebug
* https://azmr.itch.io/whitebox
* https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/time-travel-debugging-overview
* https://totalview.io/products/totalview
* http://www.simulics.com/index_en.php
* https://lldb.llvm.org/use/intel_pt.html

# virtual machine

* https://wiki.qemu.org/Features/record-replay
* https://github.com/panda-re/panda/blob/dev/panda/docs/time-travel.md

# GPU

* PIX: https://devblogs.microsoft.com/pix/download/
* nsight: https://developer.nvidia.com/nsight-graphics
* spector.js: https://spector.babylonjs.com/
* webgl-recorder: https://github.com/evanw/webgl-recorder
* safari: https://webkit.org/blog/8452/canvas-debugging/
* https://renderdoc.org/

# article

* Reverse History Part One http://jakob.engbloms.se/archives/1547
* Reverse History Part Two – Research http://jakob.engbloms.se/archives/1554
* Reverse History Part Three – Products http://jakob.engbloms.se/archives/1564
* Studying the Advancement in Debugging Practice https://jakob.engbloms.se/archives/3077
* If I Only Changed the Software, why is the Phone on Fire http://jakob.engbloms.se/archives/1917
* Debugging – the 9 Indispensable Rules for Finding Even the Most Elusive Software and Hardware Problems https://jakob.engbloms.se/archives/1923
* My Hairiest Bug War Stories https://www.researchgate.net/publication/27297655_My_Hairiest_Bug_War_Stories
* Scientific Debugging
  * https://medium.com/machine-words/scientific-debugging-part-1-8890b73b6c4c
  * https://medium.com/machine-words/scientific-debugging-part-2-difficult-observations-bba84772d3d1
  * https://medium.com/machine-words/scientific-debugging-part-3-space-and-time-75ae28a7b9d7

repo_name: taowen/awesome-debugger

mime_type: text/plain


text:
const webpack = require("webpack");
const paths = require("./config/paths");
const path = require("path");
const ManifestPlugin = require("webpack-manifest-plugin");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const HTMLWebpackPlugin = require("html-webpack-plugin");
const CopyWebpackPlugin = require("copy-webpack-plugin");
const { merge } = require("webpack-merge");
const loadPreset = require("./config/presets/loadPreset");
const loadConfig = (mode) => require(`./config/webpack.${mode}.js`)(mode);

module.exports = function (env) {
  const { mode = "production" } = env || {};
  return merge(
    {
      mode,
      entry: `${paths.srcPath}/index.js`,
      output: {
        path: paths.distPath,
        filename: "[name].bundle.js",
        publicPath: "/",
      },
      module: {
        rules: [
          {
            test: /\.m?js/,
            resolve: {
              fullySpecified: false,
            },
          },
          {
            test: /\.js$/,
            use: ["babel-loader"],
            exclude: path.resolve(__dirname, "node_modules"),
          },
          // Images: Copy image files to build folder
          { test: /\.(?:ico|gif|png|jpg|jpeg)$/i, type: "asset/resource" },

          // Fonts and SVGs: Inline files
          { test: /\.(woff(2)?|eot|ttf|otf|svg|)$/, type: "asset/inline" },
        ],
      },
      resolve: {
        modules: [paths.srcPath, "node_modules"],
        extensions: [".js", ".jsx", ".json"],
        fallback: {
          crypto: require.resolve("crypto-browserify"),
          stream: require.resolve("stream-browserify"),
          http: require.resolve("stream-http"),
          https: require.resolve("https-browserify"),
          fs: false,
          path: require.resolve("path-browserify"),
          zlib: require.resolve("browserify-zlib"),
        },
        // Fix for using `yarn link "near-social-vm"`
        alias: {
          react: path.resolve(__dirname, "./node_modules/react"),
          "react-dom": path.resolve(__dirname, "./node_modules/react-dom"),
          "near-api-js": path.resolve(__dirname, "./node_modules/near-api-js"),
        },
      },
      plugins: [
        new webpack.EnvironmentPlugin({
          // Configure environment variables here.
          ENVIRONMENT: "browser",
        }),
        new CleanWebpackPlugin(),
        // Copies files from target to destination folder
        new CopyWebpackPlugin({
          patterns: [
            {
              from: paths.publicPath,
              to: "assets",
              globOptions: {
                ignore: ["*.DS_Store"],
              },
              noErrorOnMissing: true,
            },
          ],
        }),
        new HTMLWebpackPlugin({
          template: `${paths.publicPath}/index.html`,
          favicon: `${paths.publicPath}/favicon.png`,
          robots: `${paths.publicPath}/robots.txt`,
          publicPath: "/",
        }),
        new webpack.ProgressPlugin(),
        new webpack.ProvidePlugin({
          process: "process/browser",
          Buffer: [require.resolve("buffer/"), "Buffer"],
        }),
        new ManifestPlugin.WebpackManifestPlugin(),
      ],
    },
    loadConfig(mode),
    loadPreset(env)
  );
};

repo_name: NearSocial/viewer

repo_language: JavaScript

mime_type: text/html


text:
# Browser

A framework for reusable components to render and modify SocialDB by Near Social.

## Setup & Development

Initialize repo:
```
yarn
```

Start development version:
```
yarn start
```

## Widget example

Profile view

```jsx
let accountId = props.accountId || "eugenethedream";
let profile = socialGetr(`${accountId}/profile`);

(
  <div>
    <img src={profile.image.url}/>
    <span>{profile.name}</span> <span>(@{accountId})</span>
  </div>
);
```

Profile editor

```jsx
let accountId = context.accountId;

if (!accountId) {
  return "Please sign in with NEAR wallet";
}

const profile = socialGetr(`${accountId}/profile`);

if (profile === null) {
  return "Loading";
}

initState({
  name: profile.name,
  url: profile.image.url,
});

const data = {
  profile: {
    name: state.name,
    image: {
      url: state.url,
    },
  },
};

return (
  <div>
    <div>account = {accountId}</div>
    <div>
      Name:
      <input type="text" value={state.name} />
    </div>
    <div>
      Image URL:
      <input type="text" value={state.url} />
    </div>
    <div>Preview</div>
    <div>
      <img src={state.url} alt="profile image" /> {state.name}
    </div>
    <div>
      <CommitButton data={data}>Save profile</CommitButton>
    </div>
  </div>
);

```


text:
import React, { useCallback, useEffect, useState } from "react";
import "error-polyfill";
import "bootstrap-icons/font/bootstrap-icons.css";
import "@near-wallet-selector/modal-ui/styles.css";
import "react-bootstrap-typeahead/css/Typeahead.css";
import "react-bootstrap-typeahead/css/Typeahead.bs5.css";
import "bootstrap/dist/js/bootstrap.bundle";
import "App.scss";
import { BrowserRouter as Router, Link, Route, Switch } from "react-router-dom";
import EditorPage from "./pages/EditorPage";
import ViewPage from "./pages/ViewPage";
import { setupWalletSelector } from "@near-wallet-selector/core";
import { setupNearWallet } from "@near-wallet-selector/near-wallet";
import { setupMyNearWallet } from "@near-wallet-selector/my-near-wallet";
import { setupSender } from "@near-wallet-selector/sender";
import { setupHereWallet } from "@near-wallet-selector/here-wallet";
import { setupMeteorWallet } from "@near-wallet-selector/meteor-wallet";
import { setupNeth } from "@near-wallet-selector/neth";
import { setupModal } from "@near-wallet-selector/modal-ui";
import EmbedPage from "./pages/EmbedPage";
import { sanitizeUrl } from "@braintree/sanitize-url";
import {
  useAccount,
  useInitNear,
  useNear,
  utils,
  EthersProviderContext,
} from "near-social-vm";
import Big from "big.js";
import { NavigationWrapper } from "./components/navigation/NavigationWrapper";
import { NetworkId, Widgets } from "./data/widgets";
import { useEthersProviderContext } from "./data/web3";

export const refreshAllowanceObj = {};
const documentationHref = "https://social.near-docs.io/";

function App(props) {
  const [connected, setConnected] = useState(false);
  const [signedIn, setSignedIn] = useState(false);
  const [signedAccountId, setSignedAccountId] = useState(null);
  const [availableStorage, setAvailableStorage] = useState(null);
  const [walletModal, setWalletModal] = useState(null);
  const [widgetSrc, setWidgetSrc] = useState(null);

  const ethersProviderContext = useEthersProviderContext();

  const { initNear } = useInitNear();
  const near = useNear();
  const account = useAccount();

  const accountId = account.accountId;

  useEffect(() => {
    initNear &&
      initNear({
        networkId: NetworkId,
        selector: setupWalletSelector({
          network: NetworkId,
          modules: [
            setupNearWallet(),
            setupMyNearWallet(),
            setupSender(),
            setupHereWallet(),
            setupMeteorWallet(),
            setupNeth({
              gas: "300000000000000",
              bundle: false,
            }),
          ],
        }),
        customElements: {
          Link: (props) => {
            if (!props.to && props.href) {
              props.to = props.href;
              delete props.href;
            }
            if (props.to) {
              props.to = sanitizeUrl(props.to);
            }
            return <Link {...props} />;
          },
        },
        config: {
          defaultFinality: undefined,
        },
      });
  }, [initNear]);

  useEffect(() => {
    if (!near) {
      return;
    }
    near.selector.then((selector) => {
      setWalletModal(
        setupModal(selector, { contractId: near.config.contractName })
      );
    });
  }, [near]);

  const requestSignIn = useCallback(
    (e) => {
      e && e.preventDefault();
      walletModal.show();
      return false;
    },
    [walletModal]
  );

  const logOut = useCallback(async () => {
    if (!near) {
      return;
    }
    const wallet = await (await near.selector).wallet();
    wallet.signOut();
    near.accountId = null;
    setSignedIn(false);
    setSignedAccountId(null);
  }, [near]);

  const refreshAllowance = useCallback(async () => {
    alert(
      "You're out of access key allowance. Need sign in again to refresh it"
    );
    await logOut();
    requestSignIn();
  }, [logOut, requestSignIn]);
  refreshAllowanceObj.refreshAllowance = refreshAllowance;

  useEffect(() => {
    if (!near) {
      return;
    }
    setSignedIn(!!accountId);
    setSignedAccountId(accountId);
    setConnected(true);
  }, [near, accountId]);

  useEffect(() => {
    setAvailableStorage(
      account.storageBalance
        ? Big(account.storageBalance.available).div(utils.StorageCostPerByte)
        : Big(0)
    );
  }, [account]);

  const passProps = {
    refreshAllowance: () => refreshAllowance(),
    setWidgetSrc,
    signedAccountId,
    signedIn,
    connected,
    availableStorage,
    widgetSrc,
    logOut,
    requestSignIn,
    widgets: Widgets,
    documentationHref,
  };

  return (
    <div className="App">
      <EthersProviderContext.Provider value={ethersProviderContext}>
        <Router basename={process.env.PUBLIC_URL}>
          <Switch>
            <Route path={"/embed/:widgetSrc*"}>
              <EmbedPage {...passProps} />
            </Route>
            <Route path={"/edit/:widgetSrc*"}>
              <NavigationWrapper {...passProps} />
              <EditorPage {...passProps} />
            </Route>
            <Route path={"/:widgetSrc*"}>
              <NavigationWrapper {...passProps} />
              <ViewPage {...passProps} />
            </Route>
          </Switch>
        </Router>
      </EthersProviderContext.Provider>
    </div>
  );
}

export default App;


text:
import React from "react";
import { createRoot } from "react-dom/client";
import "./index.css";
import App from "./App";

const container = document.getElementById("root");
const root = createRoot(container);
root.render(<App />);


text:
@import "bootstrap";

body, html {
  -webkit-font-smoothing: antialiased;
}

.pointer {
  cursor: pointer;
}

.btn-success, .btn-primary {
  .text-muted {
    color: #fff !important;
  };
}

.outline-none {
  outline: 0 !important;
}

a {
  text-decoration: none;
  &:hover {
    text-decoration: underline;
  }
  &.btn {
    text-decoration: none;
  }
}

.sidebar-items {
  &> div {
    border-right: 1px solid #e5e5e5;
    text-align: center;
    min-height: 4rem;
    max-height: 4rem;
    display: flex;
  }

  &> div:not(.apps) {
    min-width: 4rem;
    align-items: center !important;
    justify-content: center !important;
  }
}


text:
:root {
  --slate-dark-1: #151718;
  --slate-dark-5: #2B2F31;
  --slate-dark-6: #313538;
  --slate-dark-8: #4C5155;
  --slate-dark-9: #697177;
  --slate-dark-11: #9BA1A6;
  --slate-dark-12: #ECEDEE;
  --blue-light-9: #0091FF;

  --font-weight-medium: 500;
  --font-weight-bold: 600;

  /* For web3 onboard */
  --account-center-z-index: 999;
  --account-center-position-top: 64px;
  --account-center-position-right: -10px;
}