From ac5b22dfd6e45874a253fcba860d36e98ab8480a Mon Sep 17 00:00:00 2001 From: sepilqi Date: Wed, 31 Jul 2024 15:49:19 +0800 Subject: [PATCH 1/5] black format python files --- makeMoE.py | 166 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 98 insertions(+), 68 deletions(-) diff --git a/makeMoE.py b/makeMoE.py index 524f930..5461697 100644 --- a/makeMoE.py +++ b/makeMoE.py @@ -4,56 +4,62 @@ from torch.nn import init # hyperparameters -batch_size = 16 # how many independent sequences will we process in parallel? -block_size = 32 # what is the maximum context length for predictions? +batch_size = 16 # how many independent sequences will we process in parallel? +block_size = 32 # what is the maximum context length for predictions? max_iters = 5000 eval_interval = 100 learning_rate = 1e-3 -device = 'cuda' if torch.cuda.is_available() else 'cpu' +device = "cuda" if torch.cuda.is_available() else "cpu" eval_iters = 400 head_size = 16 n_embed = 128 n_head = 8 n_layer = 8 dropout = 0.1 -num_experts = 8 # This can be adjusted depending on the overall number of parameters -top_k = 2 # This controls the number of active parameters +num_experts = 8 # This can be adjusted depending on the overall number of parameters +top_k = 2 # This controls the number of active parameters torch.manual_seed(1337) -with open('input.txt', 'r', encoding='utf-8') as f: +with open("input.txt", "r", encoding="utf-8") as f: text = f.read() # here are all the unique characters that occur in this text chars = sorted(list(set(text))) vocab_size = len(chars) # create a mapping from characters to integers -stoi = { ch:i for i,ch in enumerate(chars) } -itos = { i:ch for i,ch in enumerate(chars) } -encode = lambda s: [stoi[c] for c in s] # encoder: take a string, output a list of integers -decode = lambda l: ''.join([itos[i] for i in l]) # decoder: take a list of integers, output a string +stoi = {ch: i for i, ch in enumerate(chars)} +itos = {i: ch for i, ch in enumerate(chars)} +encode = lambda s: [ + stoi[c] for c in s +] # encoder: take a string, output a list of integers +decode = lambda l: "".join( + [itos[i] for i in l] +) # decoder: take a list of integers, output a string # Train and test splits data = torch.tensor(encode(text), dtype=torch.long) -n = int(0.9*len(data)) # first 90% will be train, rest val +n = int(0.9 * len(data)) # first 90% will be train, rest val train_data = data[:n] val_data = data[n:] + # data loading def get_batch(split): # generate a small batch of data of inputs x and targets y - data = train_data if split == 'train' else val_data + data = train_data if split == "train" else val_data ix = torch.randint(len(data) - block_size, (batch_size,)) - x = torch.stack([data[i:i+block_size] for i in ix]) - y = torch.stack([data[i+1:i+block_size+1] for i in ix]) + x = torch.stack([data[i : i + block_size] for i in ix]) + y = torch.stack([data[i + 1 : i + block_size + 1] for i in ix]) x, y = x.to(device), y.to(device) return x, y + @torch.no_grad() def estimate_loss(model): out = {} model.eval() - for split in ['train', 'val']: + for split in ["train", "val"]: losses = torch.zeros(eval_iters) for k in range(eval_iters): X, Y = get_batch(split) @@ -63,34 +69,36 @@ def estimate_loss(model): model.train() return out + class Head(nn.Module): - """ one head of self-attention """ + """one head of self-attention""" def __init__(self, head_size): super().__init__() self.key = nn.Linear(n_embed, head_size, bias=False) self.query = nn.Linear(n_embed, head_size, bias=False) self.value = nn.Linear(n_embed, head_size, bias=False) - self.register_buffer('tril', torch.tril(torch.ones(block_size, block_size))) + self.register_buffer("tril", torch.tril(torch.ones(block_size, block_size))) self.dropout = nn.Dropout(dropout) def forward(self, x): - B,T,C = x.shape - k = self.key(x) # (B,T,C) - q = self.query(x) # (B,T,C) + B, T, C = x.shape + k = self.key(x) # (B,T,C) + q = self.query(x) # (B,T,C) # compute attention scores ("affinities") - wei = q @ k.transpose(-2,-1) * C**-0.5 # (B, T, C) @ (B, C, T) -> (B, T, T) - wei = wei.masked_fill(self.tril[:T, :T] == 0, float('-inf')) # (B, T, T) - wei = F.softmax(wei, dim=-1) # (B, T, T) + wei = q @ k.transpose(-2, -1) * C**-0.5 # (B, T, C) @ (B, C, T) -> (B, T, T) + wei = wei.masked_fill(self.tril[:T, :T] == 0, float("-inf")) # (B, T, T) + wei = F.softmax(wei, dim=-1) # (B, T, T) wei = self.dropout(wei) # perform the weighted aggregation of the values - v = self.value(x) # (B,T,C) - out = wei @ v # (B, T, T) @ (B, T, C) -> (B, T, C) + v = self.value(x) # (B,T,C) + out = wei @ v # (B, T, T) @ (B, T, C) -> (B, T, C) return out -#Multi-Headed Self Attention + +# Multi-Headed Self Attention class MultiHeadAttention(nn.Module): - """ multiple heads of self-attention in parallel """ + """multiple heads of self-attention in parallel""" def __init__(self, num_heads, head_size): super().__init__() @@ -102,9 +110,11 @@ def forward(self, x): out = torch.cat([h(x) for h in self.heads], dim=-1) out = self.dropout(self.proj(out)) return out -#Expert module + + +# Expert module class Expert(nn.Module): - """ An MLP is a simple linear layer followed by a non-linearity i.e. each Expert """ + """An MLP is a simple linear layer followed by a non-linearity i.e. each Expert""" def __init__(self, n_embed): super().__init__() @@ -118,33 +128,35 @@ def __init__(self, n_embed): def forward(self, x): return self.net(x) -#noisy top-k gating + +# noisy top-k gating class NoisyTopkRouter(nn.Module): def __init__(self, n_embed, num_experts, top_k): super(NoisyTopkRouter, self).__init__() self.top_k = top_k - #layer for router logits + # layer for router logits self.topkroute_linear = nn.Linear(n_embed, num_experts) - self.noise_linear =nn.Linear(n_embed, num_experts) + self.noise_linear = nn.Linear(n_embed, num_experts) def forward(self, mh_output): # mh_ouput is the output tensor from multihead self attention block logits = self.topkroute_linear(mh_output) - #Noise logits + # Noise logits noise_logits = self.noise_linear(mh_output) - #Adding scaled unit gaussian noise to the logits - noise = torch.randn_like(logits)*F.softplus(noise_logits) + # Adding scaled unit gaussian noise to the logits + noise = torch.randn_like(logits) * F.softplus(noise_logits) noisy_logits = logits + noise top_k_logits, indices = noisy_logits.topk(self.top_k, dim=-1) - zeros = torch.full_like(noisy_logits, float('-inf')) + zeros = torch.full_like(noisy_logits, float("-inf")) sparse_logits = zeros.scatter(-1, indices, top_k_logits) router_output = F.softmax(sparse_logits, dim=-1) return router_output, indices -#Now create the sparse mixture of experts module + +# Now create the sparse mixture of experts module class SparseMoE(nn.Module): @@ -155,19 +167,21 @@ def __init__(self, n_embed, num_experts, top_k, capacity_factor=1.0): self.top_k = top_k self.capacity_factor = capacity_factor self.num_experts = num_experts - + def forward(self, x): - # Assuming x has shape [batch_size, seq_len, n_embd] + # Assuming x has shape [batch_size, seq_len, n_embd] batch_size, seq_len, _ = x.shape gating_output, indices = self.router(x) final_output = torch.zeros_like(x) # Flatten the batch and sequence dimensions to treat each token independently - flat_x = x.view(-1, x.size(-1)) + flat_x = x.view(-1, x.size(-1)) flat_gating_output = gating_output.view(-1, gating_output.size(-1)) tokens_per_batch = batch_size * seq_len * self.top_k - expert_capacity = int((tokens_per_batch / self.num_experts) * self.capacity_factor) + expert_capacity = int( + (tokens_per_batch / self.num_experts) * self.capacity_factor + ) updates = torch.zeros_like(flat_x) @@ -175,7 +189,11 @@ def forward(self, x): expert_mask = (indices == i).any(dim=-1) flat_mask = expert_mask.view(-1) selected_indices = torch.nonzero(flat_mask).squeeze(-1) - limited_indices = selected_indices[:expert_capacity] if selected_indices.numel() > expert_capacity else selected_indices + limited_indices = ( + selected_indices[:expert_capacity] + if selected_indices.numel() > expert_capacity + else selected_indices + ) if limited_indices.numel() > 0: expert_input = flat_x[limited_indices] expert_output = expert(expert_input) @@ -187,12 +205,14 @@ def forward(self, x): final_output += updates.view(batch_size, seq_len, -1) return final_output - -#First create a self attention + mixture of experts block, that may be repeated several number of times -#Copy pasting key architecture variables for clarity + + +# First create a self attention + mixture of experts block, that may be repeated several number of times +# Copy pasting key architecture variables for clarity + class Block(nn.Module): - """ Mixture of Experts Transformer block: communication followed by computation (multi-head self attention + SparseMoE) """ + """Mixture of Experts Transformer block: communication followed by computation (multi-head self attention + SparseMoE)""" def __init__(self, n_embed, n_head, num_experts, top_k): # n_embed: embedding dimension, n_head: the number of heads we'd like @@ -207,8 +227,9 @@ def forward(self, x): x = x + self.sa(self.ln1(x)) x = x + self.smoe(self.ln2(x)) return x - -#Finally putting it all together to crease a sparse mixture of experts language model + + +# Finally putting it all together to crease a sparse mixture of experts language model class SparseMoELanguageModel(nn.Module): def __init__(self): @@ -216,27 +237,32 @@ def __init__(self): # each token directly reads off the logits for the next token from a lookup table self.token_embedding_table = nn.Embedding(vocab_size, n_embed) self.position_embedding_table = nn.Embedding(block_size, n_embed) - self.blocks = nn.Sequential(*[Block(n_embed, n_head=n_head, num_experts=num_experts,top_k=top_k) for _ in range(n_layer)]) - self.ln_f = nn.LayerNorm(n_embed) # final layer norm + self.blocks = nn.Sequential( + *[ + Block(n_embed, n_head=n_head, num_experts=num_experts, top_k=top_k) + for _ in range(n_layer) + ] + ) + self.ln_f = nn.LayerNorm(n_embed) # final layer norm self.lm_head = nn.Linear(n_embed, vocab_size) def forward(self, idx, targets=None): B, T = idx.shape # idx and targets are both (B,T) tensor of integers - tok_emb = self.token_embedding_table(idx) # (B,T,C) - pos_emb = self.position_embedding_table(torch.arange(T, device=device)) # (T,C) - x = tok_emb + pos_emb # (B,T,C) - x = self.blocks(x) # (B,T,C) - x = self.ln_f(x) # (B,T,C) - logits = self.lm_head(x) # (B,T,vocab_size) + tok_emb = self.token_embedding_table(idx) # (B,T,C) + pos_emb = self.position_embedding_table(torch.arange(T, device=device)) # (T,C) + x = tok_emb + pos_emb # (B,T,C) + x = self.blocks(x) # (B,T,C) + x = self.ln_f(x) # (B,T,C) + logits = self.lm_head(x) # (B,T,vocab_size) if targets is None: loss = None else: B, T, C = logits.shape - logits = logits.view(B*T, C) - targets = targets.view(B*T) + logits = logits.view(B * T, C) + targets = targets.view(B * T) loss = F.cross_entropy(logits, targets) return logits, loss @@ -249,31 +275,32 @@ def generate(self, idx, max_new_tokens): # get the predictions logits, loss = self(idx_cond) # focus only on the last time step - logits = logits[:, -1, :] # becomes (B, C) + logits = logits[:, -1, :] # becomes (B, C) # apply softmax to get probabilities - probs = F.softmax(logits, dim=-1) # (B, C) + probs = F.softmax(logits, dim=-1) # (B, C) # sample from the distribution - idx_next = torch.multinomial(probs, num_samples=1) # (B, 1) + idx_next = torch.multinomial(probs, num_samples=1) # (B, 1) # append sampled index to the running sequence - idx = torch.cat((idx, idx_next), dim=1) # (B, T+1) + idx = torch.cat((idx, idx_next), dim=1) # (B, T+1) return idx - + def kaiming_init_weights(m): - if isinstance (m, (nn.Linear)): + if isinstance(m, (nn.Linear)): init.kaiming_normal_(m.weight) + def main(): model = SparseMoELanguageModel() model.apply(kaiming_init_weights) model = model.to(device) - print(sum(p.numel() for p in model.parameters()) / 1e6, 'M parameters') + print(sum(p.numel() for p in model.parameters()) / 1e6, "M parameters") optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate) m = model.to(device) # print the number of parameters in the model - print(sum(p.numel() for p in m.parameters())/1e6, 'M parameters') + print(sum(p.numel() for p in m.parameters()) / 1e6, "M parameters") # create a PyTorch optimizer optimizer = torch.optim.AdamW(model.parameters(), lr=learning_rate) @@ -283,10 +310,12 @@ def main(): # every once in a while evaluate the loss on train and val sets if iter % eval_interval == 0 or iter == max_iters - 1: losses = estimate_loss(model) - print(f"step {iter}: train loss {losses['train']:.4f}, val loss {losses['val']:.4f}") + print( + f"step {iter}: train loss {losses['train']:.4f}, val loss {losses['val']:.4f}" + ) # sample a batch of data - xb, yb = get_batch('train') + xb, yb = get_batch("train") # evaluate the loss logits, loss = model(xb, yb) @@ -294,5 +323,6 @@ def main(): loss.backward() optimizer.step() + if __name__ == "__main__": main() From f3996179b793557672916a5c67c32b5832436b4a Mon Sep 17 00:00:00 2001 From: sepilqi Date: Wed, 31 Jul 2024 16:41:32 +0800 Subject: [PATCH 2/5] save checkpoint --- .gitignore | 1 + makeMoE.py | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6702297 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +model.pt \ No newline at end of file diff --git a/makeMoE.py b/makeMoE.py index 5461697..deaf853 100644 --- a/makeMoE.py +++ b/makeMoE.py @@ -292,7 +292,12 @@ def kaiming_init_weights(m): def main(): model = SparseMoELanguageModel() - model.apply(kaiming_init_weights) + try: + model.load_state_dict(torch.load("model.pt").state_dict()) + print("Successfully load checkpoint from model.pt file.") + except FileNotFoundError: + # Kaiming uniform initialization, also known as He initialization,work well with layers that use the ReLU activation function. + model.apply(kaiming_init_weights) model = model.to(device) print(sum(p.numel() for p in model.parameters()) / 1e6, "M parameters") @@ -313,6 +318,7 @@ def main(): print( f"step {iter}: train loss {losses['train']:.4f}, val loss {losses['val']:.4f}" ) + torch.save(model, "model.pt") # sample a batch of data xb, yb = get_batch("train") From 44a3c85d5ae5bcef2d54cf1f23ea0d025e9e2f02 Mon Sep 17 00:00:00 2001 From: sepilqi Date: Wed, 31 Jul 2024 17:24:02 +0800 Subject: [PATCH 3/5] add router output hook --- makeMoE.py | 34 +- router-output.log.csv | 2800 + visualize-router-output.ipynb | 98293 ++++++++++++++++++++++++++++++++ 3 files changed, 101126 insertions(+), 1 deletion(-) create mode 100644 router-output.log.csv create mode 100644 visualize-router-output.ipynb diff --git a/makeMoE.py b/makeMoE.py index deaf853..b772b72 100644 --- a/makeMoE.py +++ b/makeMoE.py @@ -1,3 +1,4 @@ +import numpy as np import torch import torch.nn as nn from torch.nn import functional as F @@ -18,6 +19,7 @@ dropout = 0.1 num_experts = 8 # This can be adjusted depending on the overall number of parameters top_k = 2 # This controls the number of active parameters +hook_router_output = True torch.manual_seed(1337) @@ -290,13 +292,40 @@ def kaiming_init_weights(m): init.kaiming_normal_(m.weight) +class RouterOutputHook: + def __init__(self, block_index): + self.block_index = block_index + + def __call__(self, module, inputs, output): + routed_indices = output[1].detach().cpu().flatten() + expert_indices, token_counts = np.unique(routed_indices, return_counts=True) + # set token count default to 0 + row = ["0"] * 8 + for e, cnt in zip(expert_indices, token_counts): + row[e] = str(cnt) + # row formated: layer_index, token_counts for per expert. + row = [str(self.block_index)] + row + + line = ",".join(row) + "\n" + with open("router-output.log.csv", "a") as f: + f.write(line) + + def main(): model = SparseMoELanguageModel() + # Register hooks with block indices + if hook_router_output: + hooks = [ + b.smoe.router.register_forward_hook(RouterOutputHook(i)) + for i, b in enumerate(model.blocks) + ] + try: model.load_state_dict(torch.load("model.pt").state_dict()) print("Successfully load checkpoint from model.pt file.") - except FileNotFoundError: + except (FileNotFoundError, RuntimeError): # Kaiming uniform initialization, also known as He initialization,work well with layers that use the ReLU activation function. + print("Initialized model parameters using Kaiming uniform initialization.") model.apply(kaiming_init_weights) model = model.to(device) @@ -328,6 +357,9 @@ def main(): optimizer.zero_grad(set_to_none=True) loss.backward() optimizer.step() + # remove hooks + if hook_router_output: + [h.remove() for h in hooks] if __name__ == "__main__": diff --git a/router-output.log.csv b/router-output.log.csv new file mode 100644 index 0000000..7885792 --- /dev/null +++ b/router-output.log.csv @@ -0,0 +1,2800 @@ +0,166,114,122,131,162,110,104,115 +1,92,175,205,150,169,72,110,51 +2,203,117,75,2,148,183,131,165 +3,104,22,36,186,158,175,118,225 +4,22,51,323,0,105,252,5,266 +5,6,1,194,141,1,23,153,505 +6,0,493,378,107,9,19,0,18 +7,0,511,9,156,194,142,0,12 +0,192,117,109,136,161,108,77,124 +1,95,170,191,163,165,68,114,58 +2,196,133,68,2,160,168,130,167 +3,90,56,37,202,133,185,120,201 +4,16,70,328,3,125,226,3,253 +5,4,1,184,126,3,37,164,505 +6,0,480,378,108,16,20,3,19 +7,2,510,6,173,207,107,0,19 +0,182,125,118,111,162,114,102,110 +1,96,165,176,163,174,70,121,59 +2,208,145,62,1,138,177,133,160 +3,106,43,38,179,149,173,129,207 +4,16,63,322,3,103,246,7,264 +5,9,1,179,139,2,29,159,506 +6,0,483,371,122,17,13,3,15 +7,3,512,4,168,199,127,0,11 +0,197,118,104,131,149,116,93,116 +1,94,151,190,162,172,72,133,50 +2,201,130,68,0,153,160,137,175 +3,107,45,31,177,140,175,141,208 +4,21,52,331,1,108,256,5,250 +5,6,0,174,135,3,22,178,506 +6,1,480,373,115,19,15,7,14 +7,1,511,9,158,197,138,1,9 +0,178,148,111,118,173,105,92,99 +1,88,177,190,149,168,69,121,62 +2,203,124,62,2,148,185,139,161 +3,119,34,43,149,142,177,123,237 +4,30,47,339,0,132,240,1,235 +5,2,0,195,133,1,17,169,507 +6,0,489,391,103,13,8,3,17 +7,1,512,7,182,186,122,0,14 +0,200,107,132,144,138,93,103,107 +1,105,174,192,160,159,64,108,62 +2,223,123,97,1,143,167,121,149 +3,110,34,41,175,158,162,124,220 +4,17,57,331,3,119,231,3,263 +5,0,0,219,121,0,14,167,503 +6,0,490,389,110,10,13,0,12 +7,3,511,7,167,209,118,0,9 +0,204,121,107,113,163,109,102,105 +1,102,171,195,151,159,62,129,55 +2,199,137,84,3,145,188,109,159 +3,111,54,34,177,140,181,112,215 +4,14,67,328,0,112,251,3,249 +5,5,0,187,130,1,34,163,504 +6,1,479,349,136,18,16,2,23 +7,2,510,5,154,204,130,0,19 +0,193,124,111,133,161,95,97,110 +1,100,173,180,173,159,52,128,59 +2,190,118,74,2,166,184,143,147 +3,107,69,48,198,127,163,120,192 +4,22,90,311,3,130,238,2,228 +5,8,1,185,133,1,25,167,504 +6,1,476,373,111,17,15,4,27 +7,3,511,14,164,183,123,0,26 +0,194,124,118,129,143,97,98,121 +1,99,188,190,140,177,65,105,60 +2,212,116,70,3,152,172,133,166 +3,109,33,31,180,153,182,118,218 +4,20,53,343,0,117,236,4,251 +5,2,0,197,128,0,21,167,509 +6,1,492,395,95,14,12,2,13 +7,1,511,5,168,197,129,0,13 +0,155,127,116,142,150,115,109,110 +1,98,159,185,173,176,72,101,60 +2,211,116,68,2,158,165,127,177 +3,101,45,31,191,148,175,128,205 +4,23,58,328,3,131,222,4,255 +5,1,0,185,131,1,27,171,508 +6,1,486,389,104,15,14,3,12 +7,0,512,4,171,216,107,1,13 +0,184,115,114,134,152,94,94,137 +1,97,169,174,169,179,67,109,60 +2,205,127,73,2,144,178,122,173 +3,102,34,30,176,147,181,125,229 +4,32,47,328,0,124,245,0,248 +5,8,0,190,116,1,19,182,508 +6,0,491,376,111,14,8,7,17 +7,0,509,8,198,178,120,2,9 +0,171,137,117,124,154,92,110,119 +1,98,180,176,179,159,72,109,51 +2,196,139,52,1,156,186,121,173 +3,89,42,38,185,148,172,121,229 +4,26,55,315,3,133,237,3,252 +5,10,0,182,127,1,19,178,507 +6,1,485,387,101,15,13,3,19 +7,0,510,5,171,182,133,1,22 +0,183,144,107,146,153,97,92,102 +1,94,176,194,153,164,67,120,56 +2,187,129,82,2,169,180,122,153 +3,120,47,41,204,148,151,117,196 +4,26,67,319,0,127,234,6,245 +5,5,0,184,118,0,30,177,510 +6,1,479,385,111,19,12,1,16 +7,2,511,7,168,194,120,0,22 +0,173,110,119,135,171,115,117,84 +1,97,168,169,196,134,57,138,65 +2,179,123,75,3,168,176,132,168 +3,107,62,34,216,133,162,104,206 +4,26,79,315,2,115,253,4,230 +5,6,0,186,106,3,46,169,508 +6,0,474,377,126,22,12,3,10 +7,1,512,8,168,179,126,1,29 +0,204,127,102,131,143,108,93,116 +1,90,176,172,199,159,66,117,45 +2,187,111,90,1,166,171,117,181 +3,102,55,19,194,124,192,106,232 +4,19,64,346,1,86,261,3,244 +5,6,0,182,138,0,28,164,506 +6,1,479,371,115,22,12,4,20 +7,0,511,11,155,199,124,0,24 +0,208,127,102,115,158,98,110,106 +1,98,188,162,152,151,71,133,69 +2,201,140,98,4,124,189,106,162 +3,117,39,39,198,140,160,115,216 +4,18,58,328,2,121,244,5,248 +5,5,1,188,145,1,27,150,507 +6,0,479,364,127,14,17,1,22 +7,0,510,12,155,191,135,2,19 +0,184,123,108,126,170,97,95,121 +1,97,161,209,167,152,72,101,65 +2,189,149,71,3,150,182,111,169 +3,124,32,51,168,142,168,109,230 +4,25,49,312,0,123,257,3,255 +5,4,0,194,130,0,24,167,505 +6,0,486,370,111,18,10,2,27 +7,0,511,8,170,193,132,0,10 +0,189,145,96,122,148,102,108,114 +1,90,174,181,174,167,70,114,54 +2,204,112,72,1,146,186,128,175 +3,119,52,32,200,127,168,108,218 +4,24,62,316,2,119,256,2,243 +5,9,0,181,148,2,29,151,504 +6,1,477,375,117,22,9,3,20 +7,1,510,6,179,189,116,0,23 +0,206,126,100,119,133,101,108,131 +1,94,169,177,154,175,69,120,66 +2,210,106,68,1,140,184,135,180 +3,124,39,33,172,134,189,126,207 +4,16,73,323,1,131,233,5,242 +5,2,0,189,131,1,26,169,506 +6,0,482,389,104,20,12,4,13 +7,1,512,9,182,171,131,1,17 +0,189,121,118,133,149,125,85,104 +1,100,169,193,173,158,63,114,54 +2,205,132,78,1,170,169,111,158 +3,109,48,34,196,149,163,126,199 +4,26,63,314,2,140,223,8,248 +5,2,2,214,133,0,30,138,505 +6,2,481,379,117,18,14,3,10 +7,0,512,3,155,208,131,2,13 +0,208,148,102,103,159,95,100,109 +1,94,204,165,156,157,70,122,56 +2,203,106,75,2,147,195,116,180 +3,119,37,35,176,142,181,116,218 +4,25,57,321,4,110,251,7,249 +5,8,0,197,127,0,32,151,509 +6,3,480,372,115,15,19,2,18 +7,0,509,8,167,183,134,0,23 +0,171,137,102,123,155,117,102,117 +1,103,185,193,139,167,72,106,59 +2,217,128,77,2,128,187,109,176 +3,127,18,41,152,143,191,123,229 +4,22,39,358,0,132,229,2,242 +5,1,0,196,121,0,17,184,505 +6,0,492,381,105,8,15,4,19 +7,0,512,7,149,217,128,1,10 +0,193,128,100,129,169,97,93,115 +1,85,167,187,174,159,70,120,62 +2,189,139,64,3,141,192,130,166 +3,118,47,38,160,139,196,110,216 +4,23,59,327,1,121,260,2,231 +5,2,0,179,122,2,38,176,505 +6,0,480,388,103,19,16,3,15 +7,1,511,10,165,176,138,2,21 +0,203,115,112,131,151,95,109,108 +1,103,177,172,162,142,83,118,67 +2,207,133,86,2,150,173,128,145 +3,134,42,43,174,143,157,125,206 +4,26,68,320,3,119,247,3,238 +5,2,1,190,126,0,35,165,505 +6,1,480,375,108,22,12,7,19 +7,1,510,8,146,189,153,1,16 +0,203,125,91,128,149,100,104,124 +1,84,159,162,209,156,63,140,51 +2,188,113,99,0,159,164,133,168 +3,83,75,28,198,120,167,131,222 +4,22,78,324,5,116,249,7,223 +5,9,1,182,136,0,31,161,504 +6,1,477,368,122,21,13,3,19 +7,2,509,4,175,195,103,0,36 +0,212,109,95,135,153,115,102,103 +1,95,160,168,181,146,66,137,71 +2,175,111,88,1,165,178,148,158 +3,122,80,28,200,112,165,107,210 +4,20,92,311,9,115,255,5,217 +5,13,1,173,147,0,42,144,504 +6,0,452,342,145,41,18,2,24 +7,0,506,16,159,175,127,4,37 +0,213,105,107,141,150,104,85,119 +1,96,184,168,165,170,57,135,49 +2,199,120,93,0,151,178,113,170 +3,116,50,30,165,135,185,127,216 +4,25,65,331,5,116,232,5,245 +5,2,1,186,119,1,34,176,505 +6,1,482,381,107,20,11,3,19 +7,1,512,9,164,192,121,2,23 +0,210,131,94,97,150,122,102,118 +1,90,176,172,186,156,72,115,57 +2,194,121,95,2,151,161,138,162 +3,113,63,43,208,128,158,108,203 +4,22,86,316,1,127,246,5,221 +5,5,0,181,148,1,34,149,506 +6,0,467,363,134,22,16,4,18 +7,0,511,8,178,188,118,0,21 +0,187,123,117,104,162,110,112,109 +1,95,181,189,158,156,79,106,60 +2,190,135,74,3,145,188,120,169 +3,126,38,28,175,147,170,109,231 +4,23,48,318,0,122,263,0,250 +5,5,0,200,134,0,22,157,506 +6,0,486,368,114,14,21,6,15 +7,1,511,9,177,187,123,0,16 +0,177,137,113,119,159,111,104,104 +1,100,176,191,151,150,71,119,66 +2,191,148,74,5,150,182,131,143 +3,122,41,38,197,154,152,112,208 +4,14,52,314,2,124,285,5,228 +5,7,0,205,134,2,23,144,509 +6,1,480,360,124,16,14,5,24 +7,0,510,8,155,185,145,1,20 +0,210,120,105,123,153,109,93,111 +1,93,184,157,163,165,66,133,63 +2,176,132,87,3,142,184,132,168 +3,108,58,39,205,140,151,109,214 +4,22,70,314,2,121,251,6,238 +5,7,0,171,134,1,45,159,507 +6,1,469,363,126,30,14,3,18 +7,0,510,11,177,167,137,1,21 +0,185,133,109,111,173,110,88,115 +1,92,184,176,139,167,78,119,69 +2,197,132,84,1,143,174,133,160 +3,122,48,32,193,140,167,109,213 +4,16,59,330,2,122,239,8,248 +5,6,0,191,109,2,28,178,510 +6,0,483,368,124,18,12,3,16 +7,1,512,6,170,192,127,0,16 +0,204,142,95,116,145,110,94,118 +1,85,187,178,159,156,77,131,51 +2,185,120,82,3,148,173,139,174 +3,119,60,36,191,122,174,107,215 +4,22,80,328,4,120,234,5,231 +5,9,0,176,139,0,39,158,503 +6,0,468,371,118,32,13,4,18 +7,0,507,6,171,191,120,1,28 +0,203,128,106,125,143,100,103,116 +1,100,193,190,138,170,72,100,61 +2,223,121,84,2,128,173,122,171 +3,107,17,33,167,146,182,129,243 +4,20,40,322,0,137,255,2,248 +5,3,0,203,151,0,18,145,504 +6,0,493,397,99,10,12,3,10 +7,0,512,11,155,196,140,1,9 +0,196,125,106,134,165,98,94,106 +1,85,164,184,181,152,62,128,68 +2,192,136,73,1,159,182,120,161 +3,102,68,38,190,136,165,108,217 +4,29,70,321,6,125,237,3,233 +5,21,1,186,115,0,38,162,501 +6,6,468,358,123,25,17,8,19 +7,3,506,9,171,179,113,1,42 +0,197,128,111,122,178,79,98,111 +1,91,180,179,169,154,63,122,66 +2,190,137,74,3,138,197,110,175 +3,120,36,31,185,135,181,109,227 +4,25,50,326,1,113,254,7,248 +5,3,1,198,115,0,29,176,502 +6,0,481,372,125,14,15,2,15 +7,0,510,10,144,177,162,1,20 +0,206,133,108,119,155,98,108,97 +1,99,197,177,137,152,69,136,57 +2,202,119,70,6,152,196,114,165 +3,132,44,40,155,151,161,109,232 +4,20,55,326,4,117,261,3,238 +5,8,1,186,136,1,31,157,504 +6,0,483,373,111,26,9,7,15 +7,1,509,6,144,194,136,1,33 +0,232,120,95,118,144,107,90,118 +1,87,149,181,170,163,59,151,64 +2,187,124,88,1,155,167,142,160 +3,105,72,39,185,133,173,108,209 +4,27,79,316,4,125,252,4,217 +5,6,1,170,139,0,39,165,504 +6,1,466,374,116,27,19,1,20 +7,0,510,10,161,174,135,2,32 +0,180,127,118,123,171,103,95,107 +1,96,174,164,173,152,84,121,60 +2,199,128,74,2,170,169,115,167 +3,126,47,31,175,155,165,98,227 +4,27,54,319,1,122,271,4,226 +5,3,0,211,117,1,33,151,508 +6,1,485,364,126,18,9,5,16 +7,2,510,4,144,182,152,2,28 +0,202,126,110,130,151,85,99,121 +1,87,175,197,158,167,58,103,79 +2,212,151,71,1,128,193,94,174 +3,109,20,43,166,151,176,111,248 +4,25,36,332,0,143,231,3,254 +5,3,0,188,128,0,15,184,506 +6,0,494,407,86,11,9,4,13 +7,1,512,12,156,205,131,0,7 +0,186,118,108,139,140,108,108,117 +1,91,185,195,154,170,61,108,60 +2,232,121,81,2,139,162,111,176 +3,114,19,39,170,140,183,115,244 +4,23,40,344,0,157,211,2,247 +5,2,0,209,145,0,16,148,504 +6,0,491,396,96,12,10,2,17 +7,0,512,8,156,194,145,0,9 +0,162,152,113,122,163,85,98,129 +1,89,173,193,157,162,68,112,70 +2,210,133,63,5,147,188,117,161 +3,123,27,46,187,147,150,119,225 +4,34,48,331,1,116,271,2,221 +5,4,0,204,125,0,21,168,502 +6,0,490,389,101,12,11,1,20 +7,1,511,6,156,190,145,1,14 +0,193,118,105,121,166,100,107,114 +1,96,174,192,152,157,85,110,58 +2,186,138,81,6,148,176,116,173 +3,126,34,34,181,129,183,114,223 +4,27,49,318,1,132,249,4,244 +5,4,0,191,144,1,26,150,508 +6,1,484,351,127,20,9,6,26 +7,2,512,14,177,179,132,1,7 +0,193,140,116,116,143,92,107,117 +1,106,180,176,156,158,78,110,60 +2,198,150,70,1,136,187,108,174 +3,118,19,29,170,150,174,127,237 +4,18,30,336,1,121,252,2,264 +5,3,0,207,134,0,8,164,508 +6,0,492,386,102,10,14,5,15 +7,0,512,7,145,219,129,1,11 +0,205,129,108,117,166,86,87,126 +1,102,182,167,163,148,73,133,56 +2,198,96,91,2,154,172,137,174 +3,105,65,26,184,131,176,98,239 +4,27,70,327,1,104,247,1,247 +5,8,0,187,127,1,38,155,508 +6,0,471,366,124,27,9,5,22 +7,1,508,7,175,179,125,0,29 +0,201,126,103,119,179,90,92,114 +1,94,175,189,164,151,81,101,69 +2,203,126,82,0,145,199,98,171 +3,135,48,36,162,133,178,117,215 +4,28,59,316,4,127,256,6,228 +5,4,0,184,138,1,23,170,504 +6,0,482,369,128,20,6,1,18 +7,0,510,13,168,187,125,4,17 +0,198,137,109,115,153,97,98,117 +1,92,171,181,149,167,60,139,65 +2,197,132,67,0,149,186,120,173 +3,106,45,37,179,144,179,108,226 +4,23,53,311,2,127,252,4,252 +5,4,1,183,123,1,38,174,500 +6,2,480,378,113,20,13,4,14 +7,2,510,15,159,172,139,2,25 +0,205,129,102,122,140,106,85,135 +1,92,180,182,178,171,62,110,49 +2,216,126,60,3,140,187,107,185 +3,116,32,32,163,124,200,142,215 +4,24,51,338,0,122,239,4,246 +5,0,0,182,133,1,27,175,506 +6,0,486,381,113,17,9,4,14 +7,1,512,12,188,193,112,0,6 +0,201,128,89,96,158,120,113,119 +1,88,177,168,186,171,64,112,58 +2,190,112,79,1,140,186,118,198 +3,113,50,34,185,119,186,119,218 +4,29,66,315,7,130,243,3,231 +5,4,2,198,133,2,33,152,500 +6,0,479,383,106,16,11,7,22 +7,1,510,8,164,182,136,0,23 +0,219,112,103,123,139,117,96,115 +1,91,161,183,173,154,81,129,52 +2,194,133,78,0,164,165,135,155 +3,113,63,32,203,134,156,110,213 +4,18,63,333,4,121,259,6,220 +5,10,0,172,160,0,22,157,503 +6,0,479,355,137,18,10,2,23 +7,1,507,6,165,189,124,0,32 +0,193,134,107,135,146,94,95,120 +1,89,182,175,159,180,58,120,61 +2,219,118,75,2,130,174,118,188 +3,95,17,33,175,155,203,124,222 +4,27,45,328,2,146,212,3,261 +5,4,0,187,133,0,16,182,502 +6,1,491,410,91,6,14,0,11 +7,0,512,4,185,196,116,1,10 +0,193,118,108,140,167,111,84,103 +1,93,191,178,162,153,75,113,59 +2,204,140,75,1,143,190,113,158 +3,131,44,39,181,145,153,117,214 +4,22,64,317,3,130,244,3,241 +5,4,1,192,139,1,30,153,504 +6,1,480,378,116,19,11,4,15 +7,0,509,16,146,184,145,2,22 +0,208,117,109,99,177,99,113,102 +1,87,151,180,166,150,77,135,78 +2,179,131,92,1,151,187,138,145 +3,124,73,37,184,126,167,105,208 +4,32,82,297,7,120,272,3,211 +5,10,1,190,119,2,40,159,503 +6,1,467,354,139,25,11,0,27 +7,1,507,11,168,174,127,2,34 +0,187,106,107,122,156,103,121,122 +1,86,165,183,190,159,65,118,58 +2,195,132,79,1,148,175,117,177 +3,110,44,27,205,135,179,110,214 +4,27,68,316,2,118,234,2,257 +5,5,0,173,136,2,42,159,507 +6,0,478,356,133,24,8,7,18 +7,1,512,8,170,201,112,1,19 +0,184,123,106,137,125,110,111,128 +1,96,194,191,147,177,67,103,49 +2,216,125,63,0,135,189,108,188 +3,111,20,36,177,144,184,128,224 +4,19,30,329,1,141,238,5,261 +5,3,0,207,144,3,16,149,502 +6,0,494,387,96,7,18,1,21 +7,0,512,4,161,215,123,0,9 +0,170,147,115,136,127,88,92,149 +1,100,179,187,143,175,72,110,58 +2,215,134,72,2,135,173,121,172 +3,117,23,32,154,159,194,117,228 +4,28,36,340,1,121,226,4,268 +5,1,0,205,128,1,19,162,508 +6,0,493,401,88,10,11,1,20 +7,0,510,12,161,201,128,0,12 +0,196,123,113,138,123,109,106,116 +1,99,182,175,165,171,64,114,54 +2,210,116,73,1,133,197,114,180 +3,120,25,39,155,137,185,122,241 +4,21,49,344,1,119,236,1,253 +5,3,1,189,146,1,23,157,504 +6,1,488,391,99,8,15,3,19 +7,1,510,8,162,206,125,0,12 +0,201,138,101,114,144,118,96,112 +1,92,202,191,162,153,58,106,60 +2,192,116,65,2,163,182,136,168 +3,119,40,38,179,128,183,122,215 +4,26,60,334,0,115,257,2,230 +5,5,1,192,131,1,33,157,504 +6,0,484,382,114,16,15,1,12 +7,0,511,8,163,187,126,1,28 +0,194,132,120,128,135,104,96,115 +1,90,191,159,178,169,63,119,55 +2,206,120,82,0,153,179,115,169 +3,106,46,32,171,144,172,116,237 +4,23,54,322,5,119,248,2,251 +5,13,0,180,136,0,29,162,504 +6,1,481,370,118,18,10,4,22 +7,0,510,9,155,192,133,1,24 +0,195,129,113,134,152,106,87,108 +1,99,163,172,157,172,78,116,67 +2,200,125,69,2,163,177,125,163 +3,108,38,38,173,151,182,109,225 +4,18,64,326,0,131,243,4,238 +5,5,1,186,118,3,27,178,506 +6,1,483,363,126,19,11,0,21 +7,3,512,7,183,182,113,0,24 +0,232,122,105,131,130,103,94,107 +1,97,183,161,173,153,70,141,46 +2,178,121,101,4,178,177,125,140 +3,109,75,26,205,137,153,103,216 +4,13,78,312,4,107,273,2,235 +5,10,0,188,145,2,44,129,506 +6,2,469,352,123,28,20,4,26 +7,0,508,8,149,185,125,1,48 +0,215,125,103,124,146,99,96,116 +1,91,164,193,138,159,77,145,57 +2,196,142,63,2,144,189,120,168 +3,116,31,30,168,134,195,114,236 +4,25,56,331,2,114,232,4,260 +5,5,0,200,140,0,23,150,506 +6,0,489,381,112,16,11,1,14 +7,0,512,7,162,196,129,2,16 +0,181,130,111,124,159,103,102,114 +1,97,149,182,155,173,79,114,75 +2,194,139,73,3,131,184,126,174 +3,125,33,34,160,154,182,113,223 +4,27,39,323,0,125,250,4,256 +5,4,1,191,121,0,26,175,506 +6,0,485,368,124,18,11,5,13 +7,0,512,9,147,203,139,0,14 +0,196,127,107,121,170,97,85,121 +1,98,159,173,160,167,74,120,73 +2,197,131,73,2,137,185,129,170 +3,124,45,35,187,133,177,106,217 +4,27,67,326,0,115,252,6,231 +5,1,0,184,124,1,41,165,508 +6,0,484,372,119,20,11,6,12 +7,2,512,8,167,175,144,0,16 +0,207,129,105,108,154,91,117,113 +1,103,165,192,165,150,64,123,62 +2,190,126,82,1,140,185,132,168 +3,113,68,29,191,129,170,104,220 +4,17,73,319,2,109,271,5,228 +5,9,1,178,124,1,34,172,505 +6,1,473,374,121,22,11,5,17 +7,1,511,11,171,177,125,3,25 +0,227,112,110,141,132,102,99,101 +1,106,185,168,164,160,59,119,63 +2,214,120,77,5,147,184,114,163 +3,106,42,34,179,136,176,122,229 +4,19,63,319,1,128,247,4,243 +5,2,0,211,135,0,28,141,507 +6,1,486,386,105,16,11,5,14 +7,1,510,10,141,221,124,1,16 +0,211,111,110,131,136,102,88,135 +1,93,164,173,175,175,61,125,58 +2,219,118,80,2,149,160,134,162 +3,91,38,33,189,143,180,112,238 +4,23,55,331,1,124,241,4,245 +5,2,0,186,137,0,23,170,506 +6,1,488,386,105,10,15,5,14 +7,0,511,7,181,194,114,0,17 +0,183,144,109,142,133,94,90,129 +1,92,188,180,142,179,63,122,58 +2,197,120,76,0,146,187,118,180 +3,111,32,36,171,143,197,111,223 +4,27,50,334,2,116,257,1,237 +5,0,0,182,144,3,22,168,505 +6,0,492,385,103,12,10,4,18 +7,0,510,10,154,190,143,2,15 +0,206,123,109,123,155,98,92,118 +1,97,160,190,150,167,68,123,69 +2,213,128,81,0,146,167,126,163 +3,108,39,39,180,137,180,109,232 +4,26,62,326,0,133,228,5,244 +5,6,0,190,141,1,19,163,504 +6,0,484,393,97,19,12,5,14 +7,0,512,9,179,174,129,0,21 +0,192,132,106,114,161,97,103,119 +1,90,181,159,180,159,70,119,66 +2,196,125,66,1,138,180,126,192 +3,102,36,37,187,150,184,102,226 +4,31,45,313,3,125,258,3,246 +5,10,0,183,135,0,26,170,500 +6,1,483,383,103,18,11,6,19 +7,0,511,12,151,197,134,0,19 +0,192,149,110,118,151,92,95,117 +1,90,177,176,151,162,66,132,70 +2,195,152,75,3,161,170,126,142 +3,113,47,44,196,148,151,111,214 +4,30,54,296,2,137,251,6,248 +5,9,0,196,126,0,25,160,508 +6,3,473,378,111,25,15,3,16 +7,2,511,11,160,188,137,0,15 +0,211,125,111,151,131,108,96,91 +1,92,172,188,156,163,53,139,61 +2,203,138,76,0,147,177,122,161 +3,117,34,28,201,145,159,125,215 +4,16,59,311,0,138,248,1,251 +5,1,0,199,117,1,40,157,509 +6,0,483,388,103,17,13,1,19 +7,1,512,6,157,213,123,2,10 +0,200,124,102,138,156,107,101,96 +1,90,188,176,168,168,59,117,58 +2,191,121,77,2,157,198,112,166 +3,116,64,31,173,126,171,112,231 +4,20,70,321,6,129,253,1,224 +5,14,1,202,132,1,27,147,500 +6,1,482,370,111,20,11,5,24 +7,1,505,15,162,174,135,0,32 +0,203,112,104,118,162,101,103,121 +1,92,185,180,166,162,72,104,63 +2,202,145,61,2,125,185,123,181 +3,115,40,30,174,135,197,109,224 +4,23,50,347,2,113,247,2,240 +5,9,0,192,127,2,32,158,504 +6,0,493,377,108,12,9,3,22 +7,0,510,7,160,179,143,0,25 +0,212,117,108,125,149,101,93,119 +1,96,171,174,177,150,67,130,59 +2,212,119,69,3,161,173,133,154 +3,110,57,36,169,136,173,119,224 +4,25,66,312,6,127,247,3,238 +5,10,0,187,140,2,30,146,509 +6,0,476,392,107,21,16,4,8 +7,0,512,10,162,193,118,0,29 +0,181,135,117,139,139,112,98,103 +1,109,191,181,154,163,70,104,52 +2,239,123,92,2,138,158,112,160 +3,94,19,21,194,167,167,133,229 +4,15,41,330,1,120,246,0,271 +5,4,0,196,145,0,16,155,508 +6,0,493,392,97,10,13,3,16 +7,1,512,10,136,240,116,0,9 +0,205,129,94,129,146,98,102,121 +1,86,175,180,169,157,69,137,51 +2,185,112,64,0,155,193,124,191 +3,110,55,31,194,125,184,110,215 +4,23,75,323,5,103,265,7,223 +5,5,2,164,132,1,38,178,504 +6,0,475,372,117,21,14,4,21 +7,1,509,5,183,166,126,1,33 +0,215,134,100,114,146,110,97,108 +1,92,171,168,176,157,74,123,63 +2,195,108,84,0,145,188,146,158 +3,121,55,34,186,127,175,109,217 +4,20,76,311,1,127,250,4,235 +5,2,1,193,141,0,32,150,505 +6,0,466,362,123,31,13,4,25 +7,2,510,8,163,173,148,1,19 +0,195,126,110,109,155,105,111,113 +1,94,180,190,140,181,56,115,68 +2,219,141,86,2,129,173,110,164 +3,112,26,31,172,152,178,128,225 +4,23,46,324,1,141,247,3,239 +5,1,1,204,133,1,24,155,505 +6,0,490,393,94,14,10,2,21 +7,0,512,6,178,181,136,0,11 +0,214,126,93,114,148,120,97,112 +1,90,162,192,173,150,71,125,61 +2,193,127,81,1,159,178,140,145 +3,125,59,41,197,134,164,108,196 +4,23,80,316,2,119,250,7,227 +5,3,1,196,125,3,46,144,506 +6,1,470,366,128,26,14,4,15 +7,2,509,10,178,177,121,3,24 +0,176,137,107,130,158,108,89,119 +1,94,180,192,157,154,63,117,67 +2,178,141,86,1,153,176,126,163 +3,118,54,39,181,137,175,101,219 +4,20,64,311,3,134,269,2,221 +5,4,0,175,129,2,35,173,506 +6,1,476,369,116,24,14,5,19 +7,2,510,7,159,174,152,2,18 +0,201,125,95,132,126,100,103,142 +1,90,174,206,129,171,68,116,70 +2,200,132,85,2,131,179,125,170 +3,109,28,39,171,143,188,118,228 +4,16,43,318,0,142,248,3,254 +5,3,0,192,144,0,21,161,503 +6,0,483,376,109,17,12,4,23 +7,0,512,8,140,211,141,0,12 +0,193,122,118,130,151,81,97,132 +1,100,164,206,145,167,77,102,63 +2,191,156,79,0,141,181,129,147 +3,137,29,34,173,151,168,113,219 +4,21,48,316,1,128,261,2,247 +5,1,2,213,125,2,19,157,505 +6,0,484,374,122,15,11,3,15 +7,0,512,10,150,198,142,0,12 +0,213,111,106,142,121,110,105,116 +1,94,185,172,180,166,50,128,49 +2,209,118,73,3,157,173,126,165 +3,113,46,31,201,144,159,117,213 +4,17,67,314,0,119,263,5,239 +5,5,0,190,138,1,28,155,507 +6,0,480,377,110,22,15,4,16 +7,1,511,8,162,183,136,1,22 +0,196,120,118,120,161,103,104,102 +1,102,182,200,170,159,61,84,66 +2,220,134,65,2,139,171,111,182 +3,111,20,36,181,144,183,128,221 +4,16,45,341,2,133,242,2,243 +5,0,0,209,118,0,19,171,507 +6,0,492,405,91,12,10,1,13 +7,0,512,7,164,200,124,1,16 +0,206,118,110,121,157,91,100,121 +1,103,176,182,160,160,73,120,50 +2,191,135,67,2,147,192,119,171 +3,104,38,34,173,152,187,109,227 +4,19,51,323,2,117,245,3,264 +5,3,0,185,138,1,35,157,505 +6,0,486,375,117,19,7,4,16 +7,1,512,8,172,184,126,3,18 +0,183,108,118,150,136,94,100,135 +1,102,178,189,146,163,70,111,65 +2,216,125,77,3,145,157,107,194 +3,93,28,30,189,155,177,110,242 +4,28,39,327,2,133,250,2,243 +5,2,0,187,132,2,29,167,505 +6,0,490,384,113,12,11,4,10 +7,0,512,11,176,198,114,0,13 +0,199,117,116,121,158,105,88,120 +1,96,178,175,166,165,70,108,66 +2,196,153,70,1,150,174,125,155 +3,119,30,41,189,154,164,106,221 +4,30,48,324,0,123,260,3,236 +5,1,1,183,140,0,23,169,507 +6,0,487,380,116,19,6,3,13 +7,3,512,12,159,190,139,1,8 +0,213,124,113,130,145,100,93,106 +1,98,166,185,174,141,65,128,67 +2,187,122,84,1,174,173,136,147 +3,120,69,35,189,130,153,110,218 +4,18,86,309,1,129,242,5,234 +5,7,0,183,122,1,43,164,504 +6,0,465,374,130,24,11,2,18 +7,1,507,4,172,189,119,1,31 +0,213,125,101,129,141,105,89,121 +1,91,173,177,179,166,53,129,56 +2,178,133,66,4,165,183,123,172 +3,102,58,36,192,119,185,119,213 +4,21,76,329,4,116,239,4,235 +5,12,0,174,128,4,38,162,506 +6,1,475,389,97,24,15,2,21 +7,0,508,12,168,183,133,1,19 +0,172,143,113,124,163,79,95,135 +1,98,160,203,145,172,89,87,70 +2,215,145,69,1,124,185,111,174 +3,106,15,41,146,154,187,137,238 +4,23,28,342,0,136,228,1,266 +5,0,1,206,135,1,11,165,505 +6,0,499,382,98,7,11,3,24 +7,0,512,10,168,206,124,0,4 +0,199,132,111,123,155,121,91,92 +1,92,186,169,167,155,61,126,68 +2,191,106,80,1,162,177,137,170 +3,128,58,35,177,129,163,108,226 +4,17,69,319,1,134,250,6,228 +5,6,0,190,129,1,34,158,506 +6,0,468,375,114,33,10,5,19 +7,1,510,10,177,164,138,1,23 +0,198,135,104,116,174,90,91,116 +1,89,154,173,158,158,86,136,70 +2,183,164,79,2,148,177,133,138 +3,127,56,34,194,139,154,114,206 +4,19,64,313,6,118,268,2,234 +5,7,0,177,127,2,34,171,506 +6,1,474,361,134,24,10,1,19 +7,0,512,5,167,191,121,0,28 +0,181,154,114,124,153,91,90,117 +1,102,202,187,132,173,62,106,60 +2,212,130,77,1,124,182,124,174 +3,111,20,27,190,146,184,126,220 +4,24,40,332,1,114,252,2,259 +5,1,0,188,133,2,18,174,508 +6,0,486,384,110,15,13,1,15 +7,0,512,9,173,208,116,1,5 +0,192,129,113,120,159,80,110,121 +1,98,172,175,166,166,68,119,60 +2,196,130,83,1,148,184,113,169 +3,122,41,35,209,149,166,99,203 +4,25,57,315,4,121,240,3,259 +5,9,1,187,126,1,31,164,505 +6,0,487,357,131,17,13,1,18 +7,1,509,8,144,193,147,1,21 +0,210,109,103,120,179,102,94,107 +1,92,173,173,172,159,67,122,66 +2,172,140,76,1,152,178,131,174 +3,122,50,35,184,126,185,105,217 +4,31,70,330,0,125,237,5,226 +5,4,0,185,116,1,33,181,504 +6,2,477,371,109,23,14,8,20 +7,0,510,10,156,183,144,1,20 +0,201,144,100,114,156,80,103,126 +1,94,178,181,162,153,74,115,67 +2,199,136,70,1,148,179,124,167 +3,119,33,30,168,141,183,117,233 +4,20,53,334,1,104,245,3,264 +5,3,0,190,128,2,25,170,506 +6,0,483,384,112,17,12,5,11 +7,1,512,11,172,190,123,0,15 +0,225,119,104,118,131,110,104,113 +1,92,166,179,151,157,81,143,55 +2,194,128,62,1,151,176,132,180 +3,111,53,36,183,127,180,109,225 +4,34,55,325,1,132,254,4,219 +5,12,1,177,128,0,29,171,506 +6,0,478,369,122,19,13,5,18 +7,0,507,12,169,183,130,2,21 +0,206,123,108,127,145,127,96,92 +1,92,183,171,179,165,59,116,59 +2,194,116,83,1,152,176,119,183 +3,97,59,33,183,130,173,118,231 +4,20,69,330,2,112,245,4,242 +5,5,0,183,131,0,37,164,504 +6,1,469,370,121,24,15,2,22 +7,1,509,8,158,184,140,1,23 +0,198,157,108,100,154,94,98,115 +1,105,173,200,143,155,72,107,69 +2,202,137,70,2,151,188,121,153 +3,116,47,37,180,142,167,114,221 +4,26,60,310,3,132,240,4,249 +5,2,1,202,134,0,23,154,508 +6,0,487,376,108,18,9,3,23 +7,0,512,4,155,199,132,1,21 +0,222,123,91,125,159,116,98,90 +1,83,145,170,162,158,74,170,62 +2,162,128,56,3,167,177,146,185 +3,124,73,46,189,122,175,94,201 +4,23,94,326,1,93,258,3,226 +5,5,0,160,134,1,41,179,504 +6,1,453,360,123,38,16,5,28 +7,1,509,11,168,171,139,2,23 +0,191,129,102,109,151,127,112,103 +1,86,152,199,150,166,75,129,67 +2,184,132,66,2,134,194,137,175 +3,126,39,40,174,129,174,115,227 +4,22,56,328,1,127,247,5,238 +5,5,1,186,142,1,30,154,505 +6,0,482,375,109,26,7,5,20 +7,0,510,12,162,174,147,0,19 +0,198,145,100,115,153,114,86,113 +1,86,162,188,163,158,67,136,64 +2,179,121,86,4,166,166,139,163 +3,116,66,39,199,140,163,106,195 +4,21,80,308,3,121,268,4,219 +5,6,0,170,134,3,43,160,508 +6,0,461,365,129,39,11,4,15 +7,1,512,10,173,166,134,1,27 +0,184,116,109,128,135,96,114,142 +1,94,163,189,164,172,58,118,66 +2,208,129,75,1,142,174,121,174 +3,110,38,34,172,147,169,120,234 +4,21,47,322,1,138,242,3,250 +5,5,0,184,145,0,27,160,503 +6,0,484,375,105,15,12,7,26 +7,0,511,5,156,202,132,2,16 +0,207,103,109,126,135,103,111,130 +1,98,185,177,141,165,75,126,57 +2,194,126,88,1,127,192,115,181 +3,117,36,34,160,137,183,108,249 +4,22,50,329,3,125,257,4,234 +5,5,1,183,126,0,33,170,506 +6,0,487,368,113,18,11,6,21 +7,1,510,8,163,183,144,1,14 +0,214,125,91,123,148,101,110,112 +1,82,168,183,163,159,56,139,74 +2,178,140,82,4,149,182,142,147 +3,121,57,46,185,137,160,109,209 +4,27,60,313,3,137,257,3,224 +5,3,0,185,110,1,46,173,506 +6,0,481,375,99,20,21,8,20 +7,2,508,13,167,179,128,1,26 +0,207,134,101,104,139,128,107,104 +1,92,167,184,164,159,57,133,68 +2,203,122,78,3,136,171,136,175 +3,106,49,38,190,127,181,113,220 +4,20,65,323,3,133,249,5,226 +5,5,2,168,147,2,37,161,502 +6,1,469,379,120,25,12,6,12 +7,0,509,14,170,179,127,3,22 +0,217,136,102,122,163,95,88,101 +1,96,174,176,175,154,70,117,62 +2,197,132,78,2,152,176,116,171 +3,110,45,33,190,129,187,105,225 +4,22,61,330,4,130,255,4,218 +5,6,1,193,122,0,31,164,507 +6,1,480,382,111,17,13,4,16 +7,2,509,5,151,192,136,1,28 +0,194,138,106,114,153,114,94,111 +1,94,177,175,182,164,72,109,51 +2,202,116,74,5,169,177,131,150 +3,124,58,31,190,145,150,115,211 +4,26,78,315,2,129,238,2,234 +5,12,2,187,142,1,31,144,505 +6,1,481,369,125,19,11,4,14 +7,0,508,7,177,192,117,2,21 +0,145,164,112,120,154,110,109,110 +1,93,193,189,162,157,76,106,48 +2,200,136,67,2,138,186,116,179 +3,124,26,30,159,149,189,127,220 +4,23,49,332,0,115,255,6,244 +5,2,0,198,122,1,27,167,507 +6,0,489,391,102,15,9,4,14 +7,0,512,4,179,188,132,0,9 +0,196,143,104,107,163,88,92,131 +1,93,185,187,156,153,86,110,54 +2,188,122,80,2,155,188,121,168 +3,118,51,37,180,135,167,116,220 +4,18,57,336,1,104,266,3,239 +5,4,0,189,131,1,41,151,507 +6,0,484,379,107,18,12,3,21 +7,0,511,6,171,174,134,2,26 +0,192,124,105,128,161,102,96,116 +1,85,182,162,184,171,66,126,48 +2,193,116,84,2,144,189,118,178 +3,110,61,27,192,130,169,109,226 +4,23,72,313,3,117,264,3,229 +5,3,0,187,133,0,37,159,505 +6,0,475,364,124,21,14,4,22 +7,0,509,8,173,170,138,2,24 +0,191,149,109,110,148,96,101,120 +1,95,199,195,122,172,79,101,61 +2,207,136,82,1,131,194,108,165 +3,120,32,44,151,142,180,127,228 +4,21,39,335,0,125,241,3,260 +5,1,0,197,151,0,17,155,503 +6,1,491,380,111,12,11,1,17 +7,0,512,6,152,187,151,1,15 +0,176,146,98,143,151,80,88,142 +1,94,167,189,139,194,77,107,57 +2,208,123,55,2,135,187,129,185 +3,110,23,37,148,134,205,116,251 +4,28,37,339,1,134,217,2,266 +5,2,0,192,116,0,18,189,507 +6,0,497,394,96,6,10,3,18 +7,1,510,1,187,196,114,0,15 +0,206,129,95,120,159,111,95,109 +1,96,146,194,168,165,70,111,74 +2,189,128,81,1,155,177,126,167 +3,112,57,43,187,121,164,120,220 +4,23,72,322,2,132,240,6,227 +5,7,0,184,123,1,32,176,501 +6,0,471,373,121,27,11,2,19 +7,0,509,11,176,173,134,1,20 +0,211,113,111,127,159,81,91,131 +1,102,186,172,174,167,50,109,64 +2,195,114,86,2,162,174,119,172 +3,97,58,30,186,144,170,112,227 +4,22,61,315,5,116,236,4,265 +5,4,1,179,124,0,40,170,506 +6,0,483,382,114,17,13,1,14 +7,1,511,8,152,206,122,0,24 +0,184,137,117,110,140,104,116,116 +1,105,180,180,131,165,81,109,73 +2,215,143,80,3,116,202,103,162 +3,125,20,41,168,161,182,98,229 +4,16,35,325,0,143,257,1,247 +5,2,1,199,141,2,16,161,502 +6,0,494,363,124,9,7,2,25 +7,0,512,8,142,186,165,1,10 +0,217,122,103,117,144,104,99,118 +1,86,167,176,174,158,65,128,70 +2,178,128,68,1,149,185,135,180 +3,105,52,48,188,130,180,104,217 +4,29,61,329,3,119,243,6,234 +5,5,0,164,137,1,31,182,504 +6,0,471,367,130,24,13,7,12 +7,2,510,12,170,162,138,2,28 +0,206,110,115,123,159,95,110,106 +1,99,149,180,173,156,71,128,68 +2,186,141,69,2,162,179,133,152 +3,111,53,41,176,148,172,95,228 +4,29,68,323,1,120,235,7,241 +5,10,1,189,117,1,27,174,505 +6,1,477,371,116,25,10,0,24 +7,1,510,13,162,171,138,4,25 +0,208,114,101,115,160,98,103,125 +1,90,166,175,167,167,70,123,66 +2,186,130,63,1,139,200,127,178 +3,110,42,38,166,133,196,109,230 +4,28,54,330,4,118,237,4,249 +5,5,1,183,120,1,25,185,504 +6,1,483,370,124,22,9,3,12 +7,1,512,8,172,184,131,0,16 +0,189,140,105,127,155,115,100,93 +1,102,188,197,153,153,64,109,58 +2,196,115,75,3,153,197,114,171 +3,129,38,35,168,138,176,124,216 +4,17,54,329,2,123,266,1,232 +5,5,0,195,135,1,26,153,509 +6,1,484,373,125,16,9,5,11 +7,0,511,11,168,188,126,1,19 +0,173,123,116,150,153,99,82,128 +1,99,166,205,151,170,77,95,61 +2,228,134,73,3,134,177,110,165 +3,107,25,40,171,141,187,125,228 +4,29,49,343,2,111,240,3,247 +5,2,1,196,120,0,18,180,507 +6,0,489,392,98,13,12,4,16 +7,0,511,9,176,191,128,0,9 +0,220,133,99,115,146,100,101,110 +1,93,163,179,150,157,76,137,69 +2,189,133,71,3,150,190,131,157 +3,121,50,37,169,143,174,112,218 +4,20,56,323,4,131,249,2,239 +5,5,1,185,123,2,40,161,507 +6,0,473,373,117,26,11,3,21 +7,1,512,7,169,177,140,1,17 +0,212,123,108,132,136,105,98,110 +1,103,187,179,161,155,72,114,53 +2,199,119,89,2,146,188,121,160 +3,121,38,31,189,139,163,123,220 +4,15,52,325,0,122,252,3,255 +5,4,0,198,148,2,24,142,506 +6,0,485,372,114,18,11,9,15 +7,1,512,4,163,189,143,1,11 +0,202,124,115,128,148,85,88,134 +1,101,165,192,161,164,72,112,57 +2,208,134,66,1,158,184,107,166 +3,107,27,30,195,146,184,125,210 +4,20,46,334,1,124,242,2,255 +5,4,0,200,115,1,25,172,507 +6,0,481,400,91,17,15,1,19 +7,0,511,8,163,195,136,2,9 +0,197,123,104,118,142,121,110,109 +1,96,165,171,179,160,70,119,64 +2,199,135,72,2,153,170,126,167 +3,112,48,29,187,144,167,120,217 +4,25,63,320,2,109,249,8,248 +5,4,1,187,134,0,37,157,504 +6,0,478,373,118,20,13,4,18 +7,0,509,10,165,201,117,0,22 +0,201,134,95,129,141,121,95,108 +1,96,195,197,147,155,57,125,52 +2,197,112,79,1,144,187,128,176 +3,118,47,34,169,138,185,114,219 +4,21,53,331,1,114,256,4,244 +5,6,1,181,142,1,36,158,499 +6,0,476,378,108,19,15,5,23 +7,0,508,9,174,179,126,1,27 +0,220,118,102,134,136,134,76,104 +1,87,163,179,177,159,58,143,58 +2,184,116,86,0,185,153,143,157 +3,95,69,33,210,136,161,104,216 +4,23,85,317,4,119,231,1,244 +5,4,1,173,136,0,42,164,504 +6,0,478,380,111,24,13,4,14 +7,2,510,8,173,193,110,0,28 +0,226,133,95,100,134,112,101,123 +1,100,167,186,167,164,73,114,53 +2,181,123,87,3,168,171,132,159 +3,120,75,39,200,119,156,128,187 +4,15,90,317,3,110,251,5,233 +5,6,1,177,143,4,45,149,499 +6,2,467,362,125,32,17,5,14 +7,1,509,14,170,168,128,4,30 +0,206,131,101,129,159,81,99,118 +1,93,173,199,167,158,63,107,64 +2,191,142,52,2,152,191,119,175 +3,128,38,35,161,132,180,120,230 +4,20,44,333,4,121,258,6,238 +5,8,0,202,124,1,21,164,504 +6,0,488,378,106,20,8,3,21 +7,0,510,7,156,186,142,0,23 +0,201,144,99,112,166,93,101,108 +1,90,177,187,151,157,75,116,71 +2,203,129,67,5,139,195,114,172 +3,122,47,40,177,127,169,110,232 +4,25,59,326,1,129,245,4,235 +5,11,0,190,130,1,30,158,504 +6,0,480,378,113,20,10,1,22 +7,1,510,8,171,170,139,3,22 +0,202,121,119,133,134,104,97,114 +1,102,180,170,174,166,66,112,54 +2,211,120,84,2,150,179,115,163 +3,112,47,36,188,140,154,125,222 +4,23,55,317,3,116,248,1,261 +5,9,0,208,138,0,25,137,507 +6,0,480,371,124,22,10,4,13 +7,2,511,11,164,197,121,0,18 +0,187,124,119,132,168,93,85,116 +1,101,200,155,167,166,56,110,69 +2,207,132,74,3,144,181,117,166 +3,116,27,34,182,146,177,125,217 +4,27,52,321,1,132,227,3,261 +5,1,0,199,141,0,23,160,500 +6,0,488,389,110,15,9,1,12 +7,1,512,6,154,200,132,1,18 +0,185,142,97,142,152,86,92,128 +1,87,185,178,155,172,79,113,55 +2,198,130,68,0,127,197,112,192 +3,112,30,36,175,134,187,113,237 +4,30,52,331,0,130,233,5,243 +5,3,0,188,131,1,29,166,506 +6,0,491,399,100,12,11,2,9 +7,0,510,2,174,189,131,0,18 +0,211,116,106,159,117,91,80,144 +1,96,161,181,162,170,62,137,55 +2,214,127,58,1,134,172,134,184 +3,113,30,37,170,144,188,109,233 +4,24,49,326,0,130,227,5,263 +5,1,0,189,137,1,28,162,506 +6,1,484,387,106,16,11,3,16 +7,0,512,10,173,179,130,0,20 +0,188,148,115,119,151,97,83,123 +1,104,192,164,163,157,72,106,66 +2,193,146,80,2,149,173,128,153 +3,123,50,39,188,150,160,109,205 +4,20,58,320,4,105,268,3,246 +5,15,0,186,135,0,22,159,507 +6,1,479,374,112,19,15,3,21 +7,0,509,7,174,180,123,0,31 +0,198,117,110,133,159,101,90,116 +1,101,174,177,141,171,83,121,56 +2,200,138,73,0,136,188,119,170 +3,111,34,37,186,146,165,128,217 +4,22,51,324,3,128,245,5,246 +5,0,0,175,147,0,27,166,509 +6,1,480,370,116,24,12,4,17 +7,0,512,13,156,196,136,1,10 +0,205,113,103,124,134,125,103,117 +1,96,177,174,161,178,67,119,52 +2,204,117,70,5,142,180,125,181 +3,117,32,26,177,128,194,115,235 +4,24,55,331,2,124,236,2,250 +5,3,0,180,138,2,33,163,505 +6,0,481,384,109,18,13,6,13 +7,0,512,10,177,188,118,5,14 +0,185,138,115,117,153,111,89,116 +1,100,180,191,155,166,70,89,73 +2,221,129,63,0,135,179,112,185 +3,112,27,36,172,145,184,129,219 +4,26,49,331,0,131,244,4,239 +5,3,0,193,119,1,29,172,507 +6,2,488,399,97,15,8,1,14 +7,0,511,7,174,207,119,0,6 +0,217,97,98,138,131,143,91,109 +1,82,147,169,197,153,63,160,53 +2,169,106,92,3,171,179,128,176 +3,111,87,23,222,130,152,96,203 +4,13,87,314,3,107,276,3,221 +5,9,0,174,132,2,48,152,507 +6,1,460,338,137,36,15,3,34 +7,1,508,11,169,180,120,1,34 +0,212,129,94,125,129,106,122,107 +1,82,187,178,191,156,41,138,51 +2,184,103,78,1,149,188,136,185 +3,103,76,31,181,124,180,108,221 +4,26,68,325,10,107,249,6,233 +5,13,1,179,114,2,36,177,502 +6,2,477,380,111,24,10,2,18 +7,1,510,5,171,173,130,0,34 +0,228,117,101,115,149,123,83,108 +1,99,170,161,195,146,69,130,54 +2,190,118,89,1,171,179,128,148 +3,119,64,37,187,135,157,121,204 +4,20,69,325,6,112,265,2,225 +5,8,0,196,149,0,30,135,506 +6,1,475,352,128,29,11,5,23 +7,0,511,10,166,186,122,0,29 +0,189,116,114,156,145,105,91,108 +1,98,184,182,157,159,73,122,49 +2,197,136,77,2,157,178,122,155 +3,111,35,28,182,149,174,125,220 +4,24,51,312,1,118,249,4,265 +5,4,0,190,133,0,18,168,511 +6,0,489,380,113,15,7,4,16 +7,0,512,7,163,205,121,3,13 +0,214,116,94,124,140,119,108,109 +1,93,175,172,173,149,68,126,68 +2,195,123,80,2,156,184,136,148 +3,116,78,40,179,131,161,106,213 +4,22,86,310,7,122,252,4,221 +5,13,2,178,132,3,40,157,499 +6,4,474,367,115,22,11,5,26 +7,2,509,11,153,188,128,0,33 +0,201,152,107,102,152,93,107,110 +1,99,194,174,153,155,65,119,65 +2,207,136,76,0,130,179,133,163 +3,120,32,40,156,149,189,114,224 +4,33,50,332,5,128,253,3,220 +5,3,0,179,130,2,29,174,507 +6,0,487,393,98,16,13,5,12 +7,0,512,5,173,186,137,1,10 +0,170,135,106,143,146,100,94,130 +1,87,158,201,140,172,74,130,62 +2,198,143,70,1,146,179,130,157 +3,114,41,39,175,144,172,118,221 +4,23,54,328,2,132,235,3,247 +5,1,1,201,119,0,28,166,508 +6,0,482,381,108,17,11,4,21 +7,1,511,7,174,198,113,0,20 +0,204,119,107,130,133,98,102,131 +1,97,150,212,169,159,57,123,57 +2,186,124,88,1,160,169,133,163 +3,124,57,37,192,119,173,117,205 +4,20,60,321,3,128,261,4,227 +5,1,0,182,130,1,40,166,504 +6,0,479,366,124,23,10,5,17 +7,0,509,10,155,176,142,0,32 +0,198,113,111,119,155,110,109,109 +1,100,187,191,141,161,69,103,72 +2,200,126,91,1,140,181,108,177 +3,109,36,41,150,151,191,105,241 +4,32,45,333,3,139,237,4,231 +5,7,0,178,141,0,27,167,504 +6,0,492,380,111,13,11,2,15 +7,1,510,7,150,197,144,2,13 +0,203,132,104,127,149,95,95,119 +1,91,165,195,159,161,66,128,59 +2,195,126,69,1,139,183,134,177 +3,107,37,37,189,128,181,114,231 +4,23,48,334,0,134,246,1,238 +5,4,0,185,122,1,24,182,506 +6,0,482,390,107,17,10,2,16 +7,2,511,7,172,206,118,0,8 +0,196,140,105,129,146,104,93,111 +1,89,182,196,160,164,62,112,59 +2,205,124,90,2,156,180,126,141 +3,121,48,37,198,143,156,114,207 +4,19,73,313,3,142,232,5,237 +5,5,0,196,130,0,33,156,504 +6,0,481,391,96,26,7,2,21 +7,0,509,9,176,185,119,1,25 +0,242,95,101,125,122,128,101,110 +1,96,161,182,152,167,67,138,61 +2,192,112,84,0,157,173,140,166 +3,118,70,36,191,133,157,118,201 +4,16,94,323,1,117,248,4,221 +5,5,0,164,147,1,51,152,504 +6,0,469,362,124,30,13,4,22 +7,0,509,11,183,173,122,2,24 +0,203,127,115,124,139,104,104,108 +1,97,197,175,151,161,77,119,47 +2,197,116,60,0,150,196,123,182 +3,111,35,24,171,143,196,117,227 +4,20,50,329,1,119,260,1,244 +5,2,0,181,161,1,28,155,496 +6,0,486,377,113,17,11,4,16 +7,2,511,8,144,194,147,1,17 +0,213,119,110,127,152,96,93,114 +1,93,160,195,158,156,73,119,70 +2,197,134,67,2,153,192,134,145 +3,127,45,45,192,143,149,110,213 +4,24,66,315,0,131,248,2,238 +5,3,0,198,120,0,33,164,506 +6,0,475,378,110,22,12,7,20 +7,1,512,12,150,181,147,1,20 +0,195,125,102,132,164,95,95,116 +1,82,173,172,161,163,79,127,67 +2,177,144,72,3,142,188,119,179 +3,129,50,32,181,127,173,114,218 +4,27,68,327,1,124,237,4,236 +5,5,0,172,129,0,38,175,505 +6,0,477,387,106,23,12,6,13 +7,0,510,10,163,182,139,4,16 +0,205,106,116,129,158,107,94,109 +1,94,178,176,155,149,77,129,66 +2,192,138,71,1,141,185,118,178 +3,115,38,36,190,152,171,100,222 +4,19,51,322,0,121,265,1,245 +5,4,0,182,144,1,37,152,504 +6,0,473,361,129,27,12,4,18 +7,2,511,11,159,172,149,0,20 +0,207,130,107,133,133,104,95,115 +1,103,182,192,133,175,77,116,46 +2,204,125,80,1,125,184,114,191 +3,120,24,30,149,154,189,116,242 +4,21,32,338,1,131,241,5,255 +5,0,0,196,154,1,24,145,504 +6,0,489,362,126,17,11,2,17 +7,0,512,11,156,192,140,1,12 +0,191,139,107,133,134,85,107,128 +1,99,187,187,151,169,65,113,53 +2,214,120,77,3,144,168,116,182 +3,105,44,33,179,144,169,115,235 +4,26,49,308,3,135,255,3,245 +5,2,0,191,132,0,25,169,505 +6,1,487,388,107,13,12,2,14 +7,1,511,5,182,191,114,1,19 +0,208,121,100,109,162,93,113,118 +1,91,144,182,152,180,83,120,72 +2,189,156,90,3,136,178,114,158 +3,119,30,52,182,141,174,108,218 +4,29,51,325,0,134,227,1,257 +5,3,0,184,145,2,23,160,507 +6,0,485,369,127,18,9,5,11 +7,0,509,8,172,179,139,2,15 +0,208,106,97,149,150,116,83,115 +1,92,186,192,170,158,55,118,53 +2,198,111,82,4,151,175,130,173 +3,107,44,36,188,130,173,123,223 +4,19,59,328,2,139,230,5,242 +5,5,0,172,132,1,37,167,510 +6,1,484,392,101,17,11,2,16 +7,2,511,11,184,184,112,0,20 +0,202,122,106,124,152,94,85,139 +1,94,201,176,169,165,52,114,53 +2,202,117,73,0,150,189,119,174 +3,112,40,35,178,142,179,115,223 +4,26,51,339,2,105,243,4,254 +5,5,0,187,122,2,37,165,506 +6,0,486,373,116,16,12,4,17 +7,1,508,8,167,184,131,2,23 +0,191,129,104,135,154,107,94,110 +1,95,147,186,178,176,63,116,63 +2,209,125,86,3,148,170,122,161 +3,95,34,41,194,144,175,129,212 +4,30,54,312,1,140,235,2,250 +5,4,0,185,121,1,28,175,510 +6,0,486,393,98,12,9,5,21 +7,0,511,6,171,215,109,0,12 +0,213,132,101,95,161,132,86,104 +1,97,181,164,174,162,62,117,67 +2,213,115,86,4,158,166,129,153 +3,109,53,41,183,137,161,124,216 +4,17,80,309,1,152,226,5,234 +5,6,0,187,138,0,35,151,507 +6,0,475,374,113,22,10,4,26 +7,1,511,6,177,192,123,0,14 +0,205,138,101,134,152,96,93,105 +1,88,175,169,163,153,80,127,69 +2,178,134,71,2,165,181,135,158 +3,106,67,44,191,131,170,92,223 +4,26,70,313,4,124,255,1,231 +5,10,0,181,131,0,41,157,504 +6,2,472,368,119,29,11,3,20 +7,2,509,12,164,167,137,1,32 +0,199,130,113,121,144,98,102,117 +1,103,164,183,173,150,75,110,66 +2,195,124,74,2,162,183,118,166 +3,115,49,40,190,147,170,115,198 +4,20,63,314,2,131,248,5,241 +5,5,1,200,108,2,38,164,506 +6,0,474,381,112,22,11,4,20 +7,0,506,3,161,193,134,1,26 +0,217,109,93,131,156,113,111,94 +1,90,171,175,162,154,76,144,52 +2,186,139,78,0,138,199,107,177 +3,105,40,41,194,131,189,107,217 +4,27,49,327,3,124,254,5,235 +5,4,0,179,136,3,27,172,503 +6,0,492,381,116,9,14,2,10 +7,0,508,7,161,178,147,1,22 +0,189,144,106,100,159,117,98,111 +1,92,167,177,176,156,70,123,63 +2,188,136,74,3,159,183,124,157 +3,117,56,49,169,139,159,118,217 +4,26,68,332,5,124,236,4,229 +5,7,0,181,123,0,41,168,504 +6,4,474,363,129,24,14,1,15 +7,0,510,6,149,182,147,0,30 +0,178,138,103,135,161,108,93,108 +1,85,173,189,178,168,68,109,54 +2,190,121,65,2,156,199,126,165 +3,104,68,30,179,135,173,112,223 +4,25,72,319,5,120,247,1,235 +5,15,2,183,132,0,31,159,502 +6,0,471,372,115,29,15,4,18 +7,1,510,10,160,186,131,1,25 +0,167,159,96,112,174,88,117,111 +1,86,165,206,142,163,66,111,85 +2,191,163,60,4,122,196,109,179 +3,118,23,43,165,141,186,104,244 +4,34,37,325,0,143,229,7,249 +5,2,0,202,125,0,21,170,504 +6,0,490,372,105,13,14,3,27 +7,0,512,6,144,206,148,0,8 +0,191,131,104,109,178,104,100,107 +1,80,164,197,171,153,65,122,72 +2,179,137,73,2,153,170,147,163 +3,110,58,46,203,142,165,83,217 +4,25,70,321,2,125,262,4,215 +5,2,0,168,129,1,34,184,506 +6,0,478,395,107,21,8,2,13 +7,0,511,9,170,172,130,2,30 +0,211,116,100,112,136,113,116,120 +1,93,181,173,174,150,65,127,61 +2,194,124,72,1,148,191,114,180 +3,124,33,34,177,134,186,119,217 +4,24,49,335,2,122,246,1,245 +5,3,0,188,138,2,31,157,505 +6,1,489,377,107,13,14,6,17 +7,1,509,10,150,199,140,0,15 +0,212,110,87,136,125,96,114,144 +1,84,165,180,172,168,62,136,57 +2,192,139,84,1,132,175,113,188 +3,107,54,35,193,135,164,103,233 +4,20,56,317,3,123,258,5,242 +5,10,0,171,128,1,34,173,507 +6,0,476,361,124,21,11,4,27 +7,0,509,5,177,172,142,0,19 +0,227,119,97,105,170,79,91,136 +1,90,158,171,156,169,75,131,74 +2,185,148,74,1,137,174,128,177 +3,115,42,31,183,136,196,110,211 +4,23,61,318,1,126,245,2,248 +5,1,0,167,160,1,33,161,501 +6,0,474,349,143,24,11,5,18 +7,0,512,9,175,171,139,3,15 +0,185,138,101,137,136,93,101,133 +1,80,173,189,162,171,68,129,52 +2,189,111,75,2,131,196,128,192 +3,115,32,34,170,132,187,123,231 +4,23,48,339,0,131,246,1,236 +5,2,0,165,132,0,31,189,505 +6,1,488,383,104,13,11,5,19 +7,1,512,5,178,189,128,1,10 +0,185,133,110,128,153,89,104,122 +1,96,168,186,161,166,67,107,73 +2,200,152,65,1,142,170,128,166 +3,115,21,34,163,154,192,109,236 +4,32,46,334,3,143,221,4,241 +5,5,0,199,125,2,20,170,503 +6,0,492,399,91,7,15,6,14 +7,0,512,9,159,200,133,1,10 +0,192,129,104,125,145,94,109,126 +1,95,172,188,167,162,63,109,68 +2,209,136,79,3,136,172,125,164 +3,111,32,43,183,139,180,115,221 +4,27,59,327,1,130,250,6,224 +5,3,0,193,131,2,27,160,508 +6,2,482,381,112,17,12,4,14 +7,3,508,5,166,191,130,3,18 +0,215,107,106,132,139,113,97,115 +1,99,174,176,153,174,61,124,63 +2,203,121,90,3,147,170,137,153 +3,98,55,36,183,138,166,116,232 +4,22,66,319,1,127,220,2,267 +5,6,0,188,142,0,35,150,503 +6,0,480,386,108,23,7,0,20 +7,0,510,10,163,211,111,0,19 +0,197,132,95,117,163,102,98,120 +1,89,166,177,176,153,73,133,57 +2,164,136,67,4,160,182,134,177 +3,106,76,33,207,126,172,106,198 +4,26,77,320,3,107,261,2,228 +5,8,0,161,132,1,47,167,508 +6,4,465,370,125,26,11,4,19 +7,0,502,10,182,180,105,2,43 +0,229,110,102,112,165,97,102,107 +1,100,173,166,172,150,70,129,64 +2,191,125,71,5,148,174,137,173 +3,110,57,32,184,129,180,113,219 +4,25,67,317,2,128,232,3,250 +5,8,0,174,132,0,35,172,503 +6,0,475,374,115,21,14,4,21 +7,1,512,5,175,172,135,2,22 +0,216,122,93,116,126,128,115,108 +1,84,176,169,154,160,65,149,67 +2,175,135,76,0,163,186,135,154 +3,109,67,56,196,124,170,94,208 +4,28,77,326,1,112,246,4,230 +5,6,1,176,132,1,33,169,506 +6,1,464,366,128,23,17,2,23 +7,1,510,10,163,176,135,3,26 +0,192,120,112,120,158,106,102,114 +1,84,165,171,199,139,80,126,60 +2,181,128,75,0,162,172,137,169 +3,119,57,38,198,136,164,104,208 +4,26,87,312,0,107,247,6,239 +5,6,0,187,122,2,41,159,507 +6,1,475,381,115,22,16,2,12 +7,2,511,5,169,195,121,1,20 +0,222,109,109,135,132,106,80,131 +1,99,174,172,159,168,61,132,59 +2,217,132,75,2,138,171,126,163 +3,106,40,42,174,150,175,116,221 +4,28,52,329,1,129,220,1,264 +5,2,0,192,121,5,31,167,506 +6,0,486,394,101,15,14,7,7 +7,0,510,12,167,204,121,0,10 +0,179,140,112,117,149,102,109,116 +1,87,160,183,168,155,77,127,67 +2,175,137,74,2,160,181,137,158 +3,113,60,40,202,139,172,97,201 +4,18,64,331,1,111,268,5,226 +5,4,0,188,114,1,41,171,505 +6,1,472,361,124,18,18,5,25 +7,2,507,11,160,174,141,0,29 +0,192,143,106,108,156,89,97,133 +1,108,171,202,151,165,78,88,61 +2,216,142,68,0,134,183,118,163 +3,122,31,32,194,138,177,118,212 +4,17,50,319,1,138,241,5,253 +5,1,2,212,128,0,19,160,502 +6,0,491,365,118,16,7,5,22 +7,1,511,4,161,203,129,0,15 +0,214,123,100,125,143,99,94,126 +1,94,179,183,178,159,54,127,50 +2,201,130,74,5,141,183,116,174 +3,113,48,31,188,147,181,109,207 +4,23,69,316,3,110,263,6,234 +5,7,0,201,131,0,29,150,506 +6,1,480,371,116,18,14,5,19 +7,0,508,11,186,171,125,0,23 +0,190,105,109,141,158,97,106,118 +1,90,173,176,179,164,45,131,66 +2,189,121,82,2,151,191,118,170 +3,114,46,37,175,134,185,104,229 +4,20,55,323,1,125,256,4,240 +5,3,1,188,123,1,33,168,507 +6,0,482,390,109,20,8,1,14 +7,1,512,12,162,180,142,0,15 +0,193,135,99,110,155,102,119,111 +1,102,175,177,161,168,79,107,55 +2,196,132,79,2,140,183,122,170 +3,124,40,39,183,132,188,114,204 +4,25,46,320,0,123,269,3,238 +5,5,0,203,136,1,26,146,507 +6,0,487,354,121,18,15,4,25 +7,0,512,6,169,180,143,2,12 +0,198,121,109,122,130,124,106,114 +1,88,175,178,189,158,61,123,52 +2,189,84,97,1,170,166,151,166 +3,106,70,36,188,134,181,101,208 +4,20,85,324,4,115,251,6,219 +5,2,0,165,129,1,41,180,506 +6,2,469,374,118,27,11,5,18 +7,2,511,7,178,177,117,2,30 +0,193,125,122,126,151,88,85,134 +1,105,177,185,160,165,73,95,64 +2,206,138,61,3,147,183,109,177 +3,109,28,33,159,143,194,122,236 +4,29,39,334,2,122,224,3,271 +5,6,0,202,123,1,20,166,506 +6,0,490,375,116,16,10,5,12 +7,1,510,5,163,199,133,1,12 +0,197,134,103,110,152,103,103,122 +1,94,166,181,163,155,74,127,64 +2,187,137,70,2,154,193,132,149 +3,143,47,34,173,130,169,121,207 +4,20,56,311,2,125,246,6,258 +5,5,0,189,130,0,34,159,507 +6,1,469,370,126,21,14,1,22 +7,0,509,9,163,188,135,0,20 +0,208,127,102,134,140,79,105,129 +1,94,199,192,140,167,53,119,60 +2,206,132,70,4,139,192,119,162 +3,121,41,37,175,139,170,119,222 +4,23,58,330,0,130,244,4,235 +5,5,0,186,151,1,32,149,500 +6,2,479,379,99,19,18,5,23 +7,0,510,10,144,185,160,4,11 +0,204,142,96,99,168,102,102,111 +1,92,176,188,149,153,74,129,63 +2,185,134,76,3,157,183,118,168 +3,121,59,34,192,137,172,100,209 +4,22,70,314,4,143,244,3,224 +5,1,1,183,132,1,40,163,503 +6,0,480,361,121,21,15,4,22 +7,0,508,3,167,184,130,1,31 +0,171,130,119,125,151,87,116,125 +1,94,175,182,164,177,77,102,53 +2,195,128,74,2,153,182,109,181 +3,102,31,31,193,152,177,115,223 +4,25,46,328,1,112,239,4,269 +5,5,0,197,128,2,31,153,508 +6,0,488,373,116,14,11,6,16 +7,1,509,7,156,204,131,1,15 +0,204,113,104,145,140,95,102,121 +1,97,172,184,172,157,70,113,59 +2,208,121,79,3,140,185,118,170 +3,106,40,35,184,135,190,118,216 +4,22,53,336,1,134,237,4,237 +5,5,0,174,131,0,37,172,505 +6,1,487,383,103,13,18,3,16 +7,0,509,8,176,195,109,0,27 +0,181,115,111,136,148,108,114,111 +1,102,176,192,152,165,67,106,64 +2,212,138,86,1,120,183,110,174 +3,117,26,39,179,145,172,105,241 +4,26,42,342,2,142,226,1,243 +5,4,0,192,134,1,19,166,508 +6,0,486,385,103,14,11,5,20 +7,0,511,6,127,217,154,0,9 +0,187,128,119,127,161,92,91,119 +1,97,170,188,151,173,63,103,79 +2,210,142,79,2,135,170,117,169 +3,121,26,36,179,158,169,110,225 +4,24,44,335,1,136,243,3,238 +5,1,0,203,135,1,22,161,501 +6,0,486,377,107,16,16,3,19 +7,2,512,7,156,201,137,2,7 +0,192,138,106,130,145,94,106,113 +1,90,186,198,160,158,76,105,51 +2,204,120,74,1,140,200,107,178 +3,119,33,31,189,143,175,109,225 +4,17,49,325,0,140,239,4,250 +5,3,0,189,141,1,26,160,504 +6,0,492,376,109,17,9,4,17 +7,1,512,3,173,195,126,2,12 +0,207,131,98,132,134,91,106,125 +1,92,179,179,160,168,67,128,51 +2,198,128,73,1,148,187,120,169 +3,113,33,27,168,128,192,119,244 +4,13,54,328,0,126,257,5,241 +5,2,0,187,135,0,25,174,501 +6,0,484,383,106,14,14,6,17 +7,0,508,6,173,194,122,2,19 +0,209,127,103,108,146,124,96,111 +1,91,188,181,160,161,70,119,54 +2,195,120,67,3,139,189,131,180 +3,119,41,31,177,142,175,112,227 +4,28,54,331,3,117,254,2,235 +5,8,1,197,118,2,34,160,504 +6,0,486,387,101,17,12,7,14 +7,1,512,9,172,169,143,0,18 +0,201,130,102,113,152,102,95,129 +1,90,180,183,175,153,67,122,54 +2,189,117,77,6,160,168,144,163 +3,132,61,37,195,122,166,111,200 +4,20,88,328,3,113,242,8,222 +5,2,0,183,138,0,34,162,505 +6,2,462,360,125,35,10,4,26 +7,2,512,6,183,171,128,2,20 +0,172,146,113,118,154,110,107,104 +1,98,195,199,156,162,59,96,59 +2,196,144,60,0,136,186,121,181 +3,121,36,34,166,150,188,117,212 +4,23,46,323,2,133,244,4,249 +5,4,0,194,136,2,16,167,505 +6,0,491,390,107,14,6,1,15 +7,0,512,8,168,184,144,0,8 +0,183,135,113,134,142,102,103,112 +1,99,155,179,174,161,74,121,61 +2,205,117,82,3,153,169,127,168 +3,106,36,34,189,148,177,109,225 +4,17,56,328,0,120,257,6,240 +5,6,1,176,132,1,27,172,509 +6,0,483,384,113,14,15,5,10 +7,0,508,8,167,194,120,1,26 +0,187,123,99,131,155,112,111,106 +1,78,164,184,181,160,65,126,66 +2,183,138,78,4,153,177,128,163 +3,121,54,38,192,129,184,97,209 +4,31,58,327,3,132,249,4,220 +5,9,0,181,127,0,32,168,507 +6,0,474,372,119,21,11,7,20 +7,1,507,13,174,171,140,0,18 +0,195,147,99,109,146,98,107,123 +1,93,169,198,145,159,71,124,65 +2,198,144,90,1,128,173,129,161 +3,119,53,38,178,137,173,106,220 +4,20,62,329,3,124,252,6,228 +5,4,1,169,155,0,30,162,503 +6,1,476,385,105,21,15,2,19 +7,1,512,10,170,177,128,1,25 +0,188,125,114,150,149,91,84,123 +1,108,177,187,154,178,58,106,56 +2,221,131,70,1,148,186,98,169 +3,124,24,36,172,146,171,135,216 +4,18,45,312,0,148,233,4,264 +5,2,0,223,124,3,19,144,509 +6,0,492,375,113,12,11,2,19 +7,0,511,5,169,214,112,0,13 +0,189,119,103,119,152,108,108,126 +1,86,171,176,171,142,77,139,62 +2,174,128,85,4,164,162,138,169 +3,115,49,31,197,136,175,123,198 +4,27,74,324,2,99,255,6,237 +5,7,0,185,119,0,39,168,506 +6,0,481,382,114,17,14,3,13 +7,0,508,7,177,202,101,2,27 +0,227,116,99,108,128,109,121,116 +1,104,166,176,164,151,72,125,66 +2,203,115,99,3,152,186,116,150 +3,110,71,43,182,136,160,111,211 +4,21,71,316,2,143,246,7,218 +5,6,2,188,133,1,37,154,503 +6,2,477,372,116,23,11,3,20 +7,1,509,11,146,178,152,1,26 +0,199,148,111,134,143,94,89,106 +1,107,174,182,169,153,82,108,49 +2,228,131,67,4,154,185,115,140 +3,123,32,30,184,153,151,135,216 +4,23,60,296,0,138,229,4,274 +5,3,0,226,127,0,25,137,506 +6,1,485,370,114,16,17,0,21 +7,0,511,7,160,216,118,0,12 +0,195,113,119,134,137,101,100,125 +1,101,185,182,158,172,68,99,59 +2,224,125,76,4,142,164,113,176 +3,98,13,33,173,147,184,128,248 +4,23,39,331,0,149,219,2,261 +5,1,0,194,150,1,14,159,505 +6,0,497,403,95,7,11,1,10 +7,1,511,4,157,229,114,0,8 +0,181,153,103,129,139,93,93,133 +1,90,171,198,150,172,63,117,63 +2,205,142,64,1,138,186,115,173 +3,104,25,39,171,133,195,124,233 +4,21,34,330,2,134,261,4,238 +5,2,0,186,133,1,24,176,502 +6,0,493,393,95,8,11,4,20 +7,0,509,8,160,198,138,0,11 +0,180,159,102,128,139,107,95,114 +1,96,184,195,136,153,74,127,59 +2,209,126,71,2,138,199,115,164 +3,141,26,35,144,139,182,137,220 +4,20,49,342,2,121,249,3,238 +5,3,0,193,128,1,25,169,505 +6,0,487,377,110,18,11,5,16 +7,0,512,11,152,195,145,0,9 +0,183,139,107,123,162,95,88,127 +1,96,202,185,147,170,65,96,63 +2,225,135,67,1,128,189,98,181 +3,105,15,37,172,143,192,123,237 +4,30,29,334,1,136,242,2,250 +5,1,0,209,124,0,10,175,505 +6,0,493,396,88,10,11,3,23 +7,0,512,10,159,201,135,0,7 +0,176,151,117,121,164,90,91,114 +1,93,166,192,153,168,71,107,74 +2,207,139,61,1,134,185,120,177 +3,112,39,42,181,153,169,109,219 +4,29,54,327,4,124,230,7,249 +5,4,0,192,119,2,21,177,509 +6,1,482,382,105,18,12,2,22 +7,1,509,11,167,194,124,1,17 +0,173,154,118,116,144,91,103,125 +1,105,157,207,147,154,79,101,74 +2,195,163,56,1,137,189,125,158 +3,130,28,34,169,153,174,119,217 +4,16,37,316,2,136,247,6,264 +5,1,0,213,117,0,26,162,505 +6,0,488,372,111,21,8,3,21 +7,2,511,8,165,194,133,0,11 +0,178,146,114,123,124,118,98,123 +1,104,181,197,159,172,79,81,51 +2,235,127,81,0,144,162,115,160 +3,99,16,34,175,156,177,138,229 +4,20,29,337,1,109,256,5,267 +5,0,0,214,139,3,20,143,505 +6,0,499,389,95,6,15,0,20 +7,0,512,2,165,217,123,0,5 +0,181,129,116,124,145,118,96,115 +1,88,177,197,154,163,73,114,58 +2,194,138,72,0,133,187,106,194 +3,110,24,40,166,147,192,107,238 +4,23,48,331,1,121,249,1,250 +5,1,2,170,134,2,30,179,506 +6,0,490,389,109,15,8,3,10 +7,0,510,10,169,180,142,1,12 +0,194,140,111,111,159,83,106,120 +1,104,187,169,160,177,75,98,54 +2,227,131,72,1,151,180,104,158 +3,128,16,42,187,148,164,125,214 +4,18,53,316,1,139,232,1,264 +5,3,0,221,127,2,19,141,511 +6,0,492,381,99,15,10,5,22 +7,0,511,9,153,202,135,0,14 +0,228,118,106,119,134,88,95,136 +1,94,177,190,150,148,65,135,65 +2,181,126,91,4,157,183,125,157 +3,113,63,31,203,143,171,98,202 +4,16,75,305,0,117,272,2,237 +5,3,0,173,133,1,42,168,504 +6,1,478,358,135,18,12,2,20 +7,2,511,8,176,178,125,1,23 +0,201,141,102,138,160,107,88,87 +1,84,157,179,181,137,70,147,69 +2,170,136,80,3,163,182,132,158 +3,122,60,39,183,134,162,112,212 +4,23,78,317,6,116,263,5,216 +5,2,1,194,113,2,43,163,506 +6,1,470,372,119,29,9,1,23 +7,0,508,10,177,184,120,3,22 +0,210,124,99,115,142,117,92,125 +1,94,173,159,184,161,70,128,55 +2,184,124,85,1,156,179,132,163 +3,115,54,33,205,145,161,107,204 +4,26,83,304,1,123,239,8,240 +5,6,0,176,140,2,47,146,507 +6,0,471,364,133,26,15,3,12 +7,1,512,7,174,165,135,1,29 +0,179,144,120,103,166,104,110,98 +1,99,177,193,154,139,79,105,78 +2,198,143,69,4,137,201,107,165 +3,120,38,44,166,157,171,110,218 +4,24,71,312,0,117,246,4,250 +5,7,0,197,128,1,23,164,504 +6,0,476,374,117,20,13,4,20 +7,0,511,7,157,191,137,2,19 +0,205,120,102,111,150,95,109,132 +1,98,169,173,157,160,72,137,58 +2,187,143,72,3,149,180,120,170 +3,109,35,33,178,138,185,117,229 +4,23,47,325,0,123,259,2,245 +5,2,0,185,135,0,30,166,506 +6,1,481,378,111,15,13,2,23 +7,0,512,8,179,176,129,0,20 +0,180,144,105,108,170,96,106,115 +1,98,165,189,159,172,64,115,62 +2,211,122,69,2,141,175,118,186 +3,126,36,37,184,128,173,119,221 +4,20,42,333,3,137,240,3,246 +5,2,2,188,127,0,29,173,503 +6,0,488,382,97,15,14,5,23 +7,0,511,12,173,183,134,0,11 +0,212,122,102,98,151,104,100,135 +1,94,172,175,170,154,78,116,65 +2,201,140,69,3,141,181,130,159 +3,116,42,40,171,143,179,115,218 +4,20,59,316,2,127,240,4,256 +5,4,0,181,135,0,33,165,506 +6,0,477,375,108,17,14,7,26 +7,0,511,7,177,172,143,1,13 +0,208,121,104,137,169,78,69,138 +1,97,177,174,176,153,71,110,66 +2,189,139,78,6,159,173,125,155 +3,103,61,33,187,131,178,114,217 +4,20,72,325,5,106,256,3,237 +5,11,0,179,137,1,36,151,509 +6,2,465,366,129,29,20,3,10 +7,1,510,6,178,183,110,1,35 +0,203,120,109,135,145,114,102,96 +1,91,169,178,179,150,68,129,60 +2,189,124,82,3,163,179,131,153 +3,119,52,36,197,137,165,105,213 +4,21,78,310,2,135,242,1,235 +5,3,0,182,147,1,39,147,505 +6,0,472,377,116,26,10,2,21 +7,1,509,10,157,193,131,3,20 +0,206,121,101,129,164,94,102,107 +1,84,154,171,172,159,62,147,75 +2,167,123,83,0,165,194,145,147 +3,123,77,43,180,120,164,104,213 +4,25,93,320,3,123,254,8,198 +5,7,1,172,134,1,43,162,504 +6,0,471,365,116,32,14,4,22 +7,3,511,7,162,179,124,1,37 +0,187,135,112,117,153,105,113,102 +1,99,173,181,177,152,73,117,52 +2,198,122,72,2,158,187,119,166 +3,115,40,34,191,144,161,117,222 +4,16,61,314,2,120,263,1,247 +5,7,0,203,122,0,26,160,506 +6,0,483,352,130,13,16,0,30 +7,0,510,10,158,190,139,1,16 +0,206,121,101,133,141,93,90,139 +1,94,184,182,153,162,61,130,58 +2,209,124,77,1,126,177,132,178 +3,107,36,41,165,138,190,112,235 +4,20,48,323,2,138,256,1,236 +5,7,0,184,136,0,30,160,507 +6,0,483,377,112,18,14,3,17 +7,0,512,11,189,164,137,0,11 +0,207,122,93,131,156,101,96,118 +1,82,176,176,175,148,59,146,62 +2,181,118,69,2,156,196,144,158 +3,119,70,32,182,134,175,100,212 +4,25,70,327,5,114,248,5,230 +5,5,1,176,119,1,40,174,508 +6,0,476,367,115,24,14,6,22 +7,1,508,8,193,159,121,1,33 +0,191,124,107,164,130,90,85,133 +1,97,169,175,150,179,75,131,48 +2,208,147,68,1,132,172,106,190 +3,110,24,26,171,148,184,120,241 +4,27,39,325,0,132,241,3,257 +5,2,0,192,136,0,19,168,507 +6,0,488,381,111,11,15,5,13 +7,1,512,7,173,214,112,0,5 +0,216,123,107,133,152,84,96,113 +1,89,186,155,194,160,63,118,59 +2,192,110,69,2,162,181,129,179 +3,100,57,22,181,122,199,111,232 +4,31,62,347,5,94,238,0,247 +5,12,0,177,134,2,34,161,504 +6,0,479,367,122,23,6,5,22 +7,0,509,9,167,186,124,1,28 +0,222,133,90,118,141,100,94,126 +1,87,160,175,179,171,68,134,50 +2,191,115,68,3,151,175,139,182 +3,98,67,27,196,130,180,111,215 +4,22,73,318,2,134,235,4,236 +5,6,1,154,164,0,33,161,505 +6,1,471,367,118,25,13,6,23 +7,2,509,14,189,171,113,0,26 +0,191,143,102,138,150,93,96,111 +1,93,164,207,141,166,79,116,58 +2,187,144,65,3,126,210,127,162 +3,132,31,37,157,153,186,100,228 +4,27,49,327,2,113,251,3,252 +5,5,0,190,134,0,27,163,505 +6,1,482,359,126,18,14,3,21 +7,0,511,10,175,180,135,1,12 +0,205,110,104,120,158,111,98,118 +1,94,169,186,143,164,69,124,75 +2,203,138,76,0,149,180,125,153 +3,119,41,43,174,142,175,109,221 +4,20,60,321,1,137,243,3,239 +5,7,0,192,137,2,29,151,506 +6,1,480,359,120,22,16,3,23 +7,0,511,8,167,175,139,0,24 +0,208,133,106,121,144,119,91,102 +1,96,179,173,162,155,75,123,61 +2,204,126,81,0,140,180,113,180 +3,122,40,39,180,138,162,114,229 +4,16,55,325,0,129,248,5,246 +5,1,0,175,145,2,39,165,497 +6,1,483,389,104,19,11,2,15 +7,3,511,7,161,193,126,2,21 +0,182,137,111,153,141,108,85,107 +1,100,177,174,159,168,65,125,56 +2,203,120,75,1,144,177,129,175 +3,107,39,27,178,155,181,100,237 +4,28,50,333,1,113,243,4,252 +5,2,0,197,125,2,30,160,508 +6,0,483,385,105,14,14,4,19 +7,1,511,4,160,203,127,0,18 +0,188,141,113,123,162,109,86,102 +1,102,178,181,155,162,65,103,78 +2,193,140,81,0,160,165,126,159 +3,106,42,45,178,142,170,119,222 +4,34,50,314,1,132,254,2,237 +5,1,0,209,124,1,29,153,507 +6,0,486,391,102,14,11,1,19 +7,1,510,5,162,206,124,1,15 +0,216,115,119,133,150,109,83,99 +1,107,177,168,152,149,71,139,61 +2,202,117,94,0,162,164,126,159 +3,102,55,30,190,161,159,113,214 +4,16,69,301,0,116,269,5,248 +5,3,0,196,130,2,32,151,510 +6,0,471,390,112,25,11,2,13 +7,1,512,6,146,212,120,1,26 +0,221,114,102,133,122,118,101,113 +1,84,185,177,177,150,65,130,56 +2,184,113,77,4,176,166,147,157 +3,110,77,35,197,131,168,100,206 +4,22,93,309,8,98,272,5,217 +5,11,1,185,131,1,45,145,505 +6,0,471,376,111,30,11,5,20 +7,1,505,9,185,172,114,0,38 +0,196,138,95,130,136,106,96,127 +1,92,186,189,170,165,61,110,51 +2,214,111,66,0,148,175,132,178 +3,115,39,35,173,128,188,128,218 +4,32,57,319,1,131,234,1,249 +5,0,0,190,124,1,35,169,505 +6,1,483,391,94,13,14,3,25 +7,0,510,6,182,197,117,0,12 +0,214,120,108,122,168,110,83,99 +1,92,169,148,176,163,72,136,68 +2,186,133,109,2,161,163,122,148 +3,116,65,30,210,132,151,115,205 +4,25,78,311,3,114,256,2,235 +5,7,1,183,138,3,35,150,507 +6,2,472,345,132,24,19,7,23 +7,1,510,9,167,178,121,2,36 +0,190,128,114,117,143,100,112,120 +1,101,165,164,172,169,75,126,52 +2,206,122,85,2,149,172,135,153 +3,109,45,35,205,147,161,113,209 +4,21,52,314,2,120,255,3,257 +5,5,0,192,143,1,22,152,509 +6,0,480,370,121,21,9,6,17 +7,0,509,5,182,190,120,0,18 +0,186,113,113,135,152,102,91,132 +1,98,170,179,171,170,75,104,57 +2,202,127,68,2,146,179,115,185 +3,125,36,35,166,145,180,115,222 +4,27,48,336,1,129,241,2,240 +5,4,1,195,130,1,23,163,507 +6,0,485,372,118,16,12,3,18 +7,0,511,8,183,168,133,3,18 +0,212,111,101,135,163,98,99,105 +1,97,159,175,186,148,61,135,63 +2,182,124,82,1,172,179,122,162 +3,104,69,37,213,130,163,96,212 +4,23,85,299,1,116,259,5,236 +5,4,0,175,141,1,49,148,506 +6,1,464,359,131,35,13,4,17 +7,0,509,16,163,168,134,2,32 +0,189,138,98,139,153,101,110,96 +1,93,181,165,162,173,63,123,64 +2,205,113,85,4,140,187,97,193 +3,119,35,23,191,135,170,121,230 +4,24,52,330,1,114,246,7,250 +5,6,0,208,120,2,23,163,502 +6,0,481,366,112,18,13,8,26 +7,1,510,7,155,188,151,1,11 +0,211,130,98,103,140,93,119,130 +1,88,157,181,158,162,73,150,55 +2,177,124,86,2,138,185,122,190 +3,120,59,37,186,129,166,104,223 +4,21,57,330,4,126,251,3,232 +5,5,0,179,128,1,43,163,505 +6,0,482,371,121,21,14,2,13 +7,1,509,5,172,175,133,1,28 +0,196,145,105,119,153,106,102,98 +1,101,174,178,150,159,61,133,68 +2,201,125,85,1,149,181,133,149 +3,130,48,43,176,133,159,113,222 +4,20,63,320,3,144,236,6,232 +5,8,0,195,133,2,28,157,501 +6,1,478,371,125,17,13,2,17 +7,1,510,9,145,174,164,1,20 +0,202,136,100,114,146,95,125,106 +1,89,180,185,139,172,63,133,63 +2,200,133,80,2,126,194,124,165 +3,127,29,35,160,138,188,115,232 +4,26,49,342,4,133,225,7,238 +5,4,1,185,140,0,24,166,504 +6,0,487,390,94,20,7,4,22 +7,1,511,10,163,176,148,1,14 +0,221,119,97,118,151,127,97,94 +1,97,179,170,194,135,61,131,57 +2,170,102,89,6,185,190,142,140 +3,123,99,34,220,116,140,107,185 +4,17,124,303,9,106,266,6,193 +5,16,0,170,132,1,58,140,507 +6,2,450,344,144,39,10,3,32 +7,1,507,23,157,158,123,7,48 +0,199,150,96,114,148,89,104,124 +1,90,178,176,158,151,71,134,66 +2,183,128,81,0,151,193,124,164 +3,126,47,30,191,129,170,118,213 +4,25,63,323,1,126,247,4,235 +5,3,0,186,146,0,31,153,505 +6,0,480,366,112,19,12,7,28 +7,0,510,11,161,180,147,0,15 +0,205,133,107,118,152,93,95,121 +1,95,183,168,185,149,61,124,59 +2,177,147,78,1,145,178,124,174 +3,120,42,36,191,128,186,121,200 +4,25,54,324,1,123,254,0,243 +5,7,0,185,137,1,32,159,503 +6,0,487,375,116,13,12,4,17 +7,1,510,8,165,181,140,0,19 +0,188,151,101,121,159,92,93,119 +1,94,171,195,166,147,71,116,64 +2,172,142,70,3,173,195,124,145 +3,123,72,35,207,131,146,111,199 +4,26,81,296,4,115,268,4,230 +5,7,0,195,130,0,43,144,505 +6,0,469,346,139,31,13,4,22 +7,1,509,16,142,172,148,3,33 +0,186,139,115,129,138,85,100,132 +1,100,181,194,145,175,68,92,69 +2,220,145,68,3,139,184,113,152 +3,108,27,41,171,143,171,130,233 +4,27,37,320,2,155,232,4,247 +5,1,0,208,130,2,17,160,506 +6,1,496,409,80,9,13,0,16 +7,0,510,3,164,208,130,0,9 +0,203,127,100,99,166,104,95,130 +1,92,172,187,151,170,75,106,71 +2,194,140,77,1,141,180,128,163 +3,112,43,38,185,138,174,108,226 +4,32,54,313,1,124,251,7,242 +5,3,1,199,136,1,26,154,504 +6,0,476,364,135,20,11,3,15 +7,2,512,8,174,190,124,1,13 +0,177,126,107,125,162,81,95,151 +1,93,179,165,159,184,78,105,61 +2,210,124,76,1,137,187,107,182 +3,103,37,30,180,145,171,128,230 +4,28,49,329,1,128,235,4,250 +5,7,1,196,119,0,26,169,506 +6,2,485,377,107,11,14,7,21 +7,1,510,7,172,189,129,1,15 +0,204,133,109,122,155,91,101,109 +1,102,171,171,158,156,71,131,64 +2,187,130,61,2,168,200,117,159 +3,115,53,32,180,133,181,111,219 +4,19,75,310,0,116,259,2,243 +5,0,0,194,117,1,41,166,505 +6,0,477,351,131,25,11,4,25 +7,1,510,8,170,177,133,2,23 +0,221,102,107,120,157,111,108,98 +1,98,189,182,165,152,66,124,48 +2,201,120,89,1,143,182,109,179 +3,112,50,23,183,138,180,108,230 +4,21,65,329,1,133,230,6,239 +5,1,0,180,150,0,39,150,504 +6,1,475,367,116,24,13,2,26 +7,0,512,11,166,189,127,2,17 +0,200,154,99,117,155,94,96,109 +1,102,182,184,156,150,66,118,66 +2,192,151,70,2,135,195,102,177 +3,115,34,42,164,134,194,126,215 +4,22,61,327,1,125,247,2,239 +5,3,1,194,142,1,31,146,506 +6,0,489,382,113,9,13,4,14 +7,0,512,7,162,182,140,0,21 +0,213,103,108,134,142,114,91,119 +1,98,167,182,175,161,72,103,66 +2,199,129,79,0,159,184,130,144 +3,116,54,45,193,141,170,102,203 +4,30,63,322,3,123,245,0,238 +5,11,0,194,144,2,29,141,503 +6,0,477,362,124,26,9,3,23 +7,1,510,12,149,181,145,0,26 +0,211,127,100,130,152,96,96,112 +1,98,185,175,166,168,60,116,56 +2,206,118,82,4,130,179,125,180 +3,108,44,34,160,131,187,132,228 +4,28,54,330,3,126,225,5,253 +5,1,1,183,133,0,37,169,500 +6,0,479,376,120,15,14,3,17 +7,1,511,11,178,171,135,0,17 +0,202,138,106,123,150,93,99,113 +1,106,183,191,148,162,83,100,51 +2,205,133,73,1,136,192,106,178 +3,125,27,39,161,143,186,128,215 +4,21,45,340,2,128,243,2,243 +5,2,1,195,130,1,19,176,500 +6,0,488,375,111,11,16,1,22 +7,0,512,7,164,197,135,0,9 +0,197,126,105,126,123,87,118,142 +1,84,176,199,163,162,63,130,47 +2,193,124,62,1,138,190,112,204 +3,114,38,35,153,140,194,111,239 +4,21,53,341,1,100,259,7,242 +5,5,0,177,128,1,30,183,500 +6,0,489,381,104,15,15,1,19 +7,2,512,7,168,174,141,1,19 +0,161,123,115,136,145,107,110,127 +1,95,171,174,169,189,65,117,44 +2,215,124,65,0,149,159,116,196 +3,87,25,27,178,154,198,110,245 +4,31,33,342,1,119,231,4,263 +5,2,0,186,130,0,26,172,508 +6,0,496,401,89,8,13,3,14 +7,0,510,10,170,201,117,0,16 +0,182,143,127,129,139,89,90,125 +1,102,198,183,149,163,66,102,61 +2,201,131,75,3,138,186,116,174 +3,110,27,34,170,160,182,114,227 +4,23,39,331,1,113,251,2,264 +5,4,0,195,151,4,21,143,506 +6,0,488,375,112,16,14,4,15 +7,0,510,6,170,198,129,0,11 +0,204,137,102,113,143,106,98,121 +1,94,192,174,154,162,67,119,62 +2,194,136,75,3,141,182,131,162 +3,117,55,38,173,135,178,115,213 +4,24,66,316,2,129,241,7,239 +5,0,0,189,138,1,37,157,502 +6,1,482,390,109,19,11,3,9 +7,1,509,10,163,184,140,0,17 +0,188,134,105,140,117,106,107,127 +1,91,185,188,170,153,65,131,41 +2,204,147,67,1,141,184,113,167 +3,107,32,23,203,143,186,120,210 +4,21,43,334,1,115,254,3,253 +5,8,0,194,126,0,18,171,507 +6,1,488,384,102,12,21,1,15 +7,0,512,5,153,216,123,1,14 +0,185,136,109,127,132,104,111,120 +1,94,163,178,181,159,80,122,47 +2,187,109,65,2,159,185,135,182 +3,104,53,25,195,131,182,106,228 +4,33,53,340,6,97,249,3,243 +5,9,2,175,129,0,39,165,505 +6,1,474,368,122,22,11,4,22 +7,1,504,10,167,192,118,1,31 +0,165,130,121,137,155,97,102,117 +1,93,155,193,174,153,80,113,63 +2,187,152,72,1,143,180,129,160 +3,126,35,34,187,151,156,114,221 +4,31,54,326,0,113,242,1,257 +5,3,0,187,145,4,33,147,505 +6,0,481,367,124,20,12,1,19 +7,0,511,14,169,190,128,1,11 +0,207,141,97,109,159,96,82,133 +1,88,180,175,144,185,78,118,56 +2,200,130,75,1,126,178,120,194 +3,130,29,39,154,133,180,117,242 +4,24,35,339,3,120,243,1,259 +5,4,0,179,137,0,22,183,499 +6,0,490,384,104,15,8,3,20 +7,1,512,4,177,181,134,1,14 +0,186,137,108,136,165,108,75,109 +1,93,178,186,178,152,76,98,63 +2,205,131,65,2,161,173,134,153 +3,120,36,30,188,148,171,127,204 +4,25,49,327,0,132,249,4,238 +5,5,0,209,116,1,22,165,506 +6,1,481,372,122,19,16,2,11 +7,0,512,5,154,203,135,0,15 +0,197,130,104,126,141,108,99,119 +1,97,177,197,159,170,63,105,56 +2,202,137,68,2,153,177,120,165 +3,109,51,35,189,140,167,111,222 +4,21,68,318,1,110,260,3,243 +5,10,0,181,131,2,28,163,509 +6,1,477,373,117,19,8,6,23 +7,1,511,8,173,186,124,1,20 +0,218,156,99,99,141,102,96,113 +1,94,181,169,147,161,77,127,68 +2,198,132,64,0,126,194,125,185 +3,125,35,34,169,151,173,115,222 +4,24,44,324,2,122,255,3,250 +5,4,0,186,152,0,22,153,507 +6,1,491,386,101,11,8,2,24 +7,0,512,6,154,193,142,1,16 +0,191,132,110,124,161,84,103,119 +1,97,161,200,138,170,75,124,59 +2,188,128,78,2,147,180,119,182 +3,108,31,32,174,145,194,103,237 +4,24,46,344,1,97,245,3,264 +5,4,0,180,149,1,21,163,506 +6,0,489,386,104,16,9,2,18 +7,0,511,2,174,193,132,2,10 +0,204,138,115,113,164,87,92,111 +1,100,155,172,157,153,74,137,76 +2,195,124,83,1,146,184,134,157 +3,114,52,50,191,138,159,108,212 +4,27,68,303,2,135,238,7,244 +5,7,1,196,130,0,33,152,505 +6,2,476,383,109,24,12,3,15 +7,1,511,11,158,187,134,1,21 +0,188,120,124,147,144,88,93,120 +1,103,170,167,175,177,68,106,58 +2,213,117,82,0,163,159,113,177 +3,103,37,39,190,139,177,106,233 +4,26,54,316,6,138,205,4,275 +5,8,0,197,121,0,28,164,506 +6,0,493,391,109,14,7,3,7 +7,1,509,8,164,216,111,0,15 +0,198,147,98,114,155,88,91,133 +1,88,154,175,157,180,67,138,65 +2,191,138,64,1,131,178,134,187 +3,104,32,35,191,146,178,119,219 +4,28,45,325,2,121,249,5,249 +5,1,0,182,125,1,31,177,507 +6,0,479,381,104,20,14,4,22 +7,1,511,9,181,173,134,0,15 +0,201,135,102,142,122,104,111,107 +1,95,189,179,137,164,72,144,44 +2,192,121,75,2,140,199,112,183 +3,111,40,23,159,136,192,124,239 +4,13,55,323,2,118,245,4,264 +5,2,0,177,149,1,35,157,503 +6,1,480,367,115,20,16,3,22 +7,2,511,3,146,203,141,2,16 +0,203,125,110,134,155,89,95,113 +1,96,167,184,154,171,65,127,60 +2,208,129,74,2,156,178,116,161 +3,107,42,39,179,134,174,113,236 +4,22,65,314,1,136,234,3,249 +5,2,1,191,130,0,35,161,504 +6,0,482,388,103,23,8,2,18 +7,0,512,12,162,196,128,1,13 +0,195,123,104,131,144,111,99,117 +1,98,169,176,170,164,63,130,54 +2,203,120,68,3,163,170,122,175 +3,112,42,31,196,151,172,104,216 +4,18,53,316,2,115,262,4,254 +5,12,0,184,136,2,26,158,506 +6,0,482,378,113,20,10,3,18 +7,1,508,6,168,199,116,1,25 +0,194,124,104,119,157,101,92,133 +1,88,165,175,166,159,64,136,71 +2,200,133,78,3,152,171,131,156 +3,117,53,33,190,143,166,109,213 +4,24,61,324,3,128,239,6,239 +5,6,1,184,134,2,30,165,502 +6,2,480,376,119,21,6,2,18 +7,1,509,9,173,181,121,2,28 +0,195,129,119,131,138,97,99,116 +1,110,204,196,140,158,75,94,47 +2,215,141,73,1,146,192,89,167 +3,127,32,33,157,143,187,128,217 +4,17,44,334,4,118,244,3,260 +5,4,1,192,159,0,25,140,503 +6,0,489,382,110,21,6,2,14 +7,0,512,9,152,203,136,1,11 +0,246,107,86,141,128,114,97,105 +1,84,167,181,171,145,70,152,54 +2,188,105,71,4,162,188,136,170 +3,127,70,43,195,116,166,112,195 +4,17,85,318,4,99,276,10,215 +5,5,1,180,116,1,42,172,507 +6,0,466,375,115,26,15,2,25 +7,0,510,8,184,181,110,3,28 +0,201,120,112,130,157,83,103,118 +1,107,174,181,160,168,61,106,67 +2,207,141,68,3,140,178,112,175 +3,100,27,36,169,154,198,110,230 +4,24,38,332,2,141,240,4,243 +5,5,0,207,139,0,15,151,507 +6,1,494,384,101,9,11,5,19 +7,0,511,11,162,188,132,0,20 +0,176,132,113,136,153,104,86,124 +1,98,165,188,163,160,74,116,60 +2,200,130,73,0,145,185,123,168 +3,99,41,33,191,149,175,113,223 +4,19,61,320,1,111,239,4,269 +5,3,0,187,131,3,34,161,505 +6,0,481,379,124,17,9,2,12 +7,1,511,7,166,203,112,1,23 +0,207,114,106,124,149,107,93,124 +1,104,166,180,162,155,79,116,62 +2,207,134,69,1,165,151,141,156 +3,98,51,34,209,139,170,122,201 +4,14,67,327,2,123,248,3,240 +5,8,0,184,143,0,32,152,505 +6,1,476,366,126,24,13,0,18 +7,1,511,12,155,191,129,0,25 +0,227,106,97,121,157,111,101,104 +1,93,156,179,179,155,71,121,70 +2,183,138,90,0,147,195,122,149 +3,132,60,36,172,145,171,94,214 +4,16,76,313,3,126,251,3,236 +5,5,0,180,135,1,49,148,506 +6,0,465,353,142,26,18,1,19 +7,2,510,9,149,181,142,2,29 +0,184,163,104,109,166,83,101,114 +1,92,181,183,136,156,83,126,67 +2,206,123,74,1,141,190,125,164 +3,124,47,39,172,142,164,117,219 +4,28,66,334,0,119,232,6,239 +5,3,0,187,133,1,32,163,505 +6,0,473,386,108,21,9,2,25 +7,0,511,8,153,181,149,3,19 +0,179,127,113,136,145,121,96,107 +1,88,159,191,187,151,71,122,55 +2,176,116,79,2,161,188,120,182 +3,115,55,30,206,132,161,110,215 +4,21,67,320,4,104,277,7,224 +5,11,1,190,123,1,39,153,506 +6,2,473,367,122,25,9,3,23 +7,0,509,12,171,182,124,1,25 +0,199,126,106,119,158,112,99,105 +1,89,154,173,189,166,66,125,62 +2,181,121,79,2,143,180,128,190 +3,111,59,29,192,124,187,115,207 +4,26,68,312,0,126,247,4,241 +5,5,0,172,140,1,51,146,509 +6,1,473,367,119,26,14,6,18 +7,1,510,13,179,169,126,1,25 +0,187,147,113,110,153,97,110,107 +1,87,185,183,142,155,65,136,71 +2,189,150,69,2,135,194,116,169 +3,131,31,41,149,147,179,111,235 +4,22,43,327,2,133,255,4,238 +5,5,1,206,136,4,21,145,506 +6,1,482,370,110,16,12,7,26 +7,1,507,13,144,180,160,0,19 +0,181,130,115,117,158,108,106,109 +1,98,184,179,163,158,74,105,63 +2,211,126,72,1,150,171,126,167 +3,109,33,33,184,142,176,128,219 +4,32,54,320,1,127,238,2,250 +5,3,1,207,138,1,27,143,504 +6,0,485,374,119,14,10,6,16 +7,1,512,8,161,199,129,1,13 +0,203,126,110,117,146,102,101,119 +1,92,185,172,153,176,78,112,56 +2,206,125,76,1,140,186,117,173 +3,111,35,36,163,152,180,114,233 +4,16,48,327,0,133,240,7,253 +5,5,0,193,141,0,24,158,503 +6,0,484,385,105,17,11,2,20 +7,2,511,5,175,182,136,1,12 +0,218,114,98,128,142,97,100,127 +1,91,173,173,177,164,60,133,53 +2,182,131,79,3,156,173,133,167 +3,120,52,27,190,133,167,111,224 +4,32,61,323,6,99,245,5,253 +5,4,1,183,136,1,36,160,503 +6,1,480,373,114,22,11,5,18 +7,2,511,9,161,199,119,2,21 +0,188,126,113,115,154,103,104,121 +1,90,182,188,156,170,75,98,65 +2,217,148,75,1,132,178,112,161 +3,114,25,35,185,145,170,122,228 +4,22,38,332,2,152,232,5,241 +5,1,1,195,150,1,21,151,504 +6,0,490,396,96,12,11,5,14 +7,0,512,6,141,211,142,0,12 +0,201,123,108,121,153,102,108,108 +1,90,143,170,176,164,74,145,62 +2,193,122,92,4,155,172,124,162 +3,105,54,41,200,145,156,110,213 +4,25,58,313,2,124,251,3,248 +5,4,0,183,128,2,37,162,508 +6,0,479,365,124,23,12,4,17 +7,0,509,10,153,199,123,1,29 +0,192,134,104,120,148,101,115,110 +1,100,182,181,145,150,72,129,65 +2,201,137,79,1,132,187,111,176 +3,120,41,37,178,144,168,124,212 +4,17,61,317,1,142,227,6,253 +5,4,1,203,138,2,30,137,509 +6,0,481,382,103,21,10,4,23 +7,0,508,10,155,205,130,1,15 +0,206,128,109,115,158,95,94,119 +1,92,196,192,151,158,57,118,60 +2,208,133,65,3,134,186,113,182 +3,110,27,41,153,130,196,127,240 +4,23,45,340,1,129,242,3,241 +5,3,0,208,122,0,30,160,501 +6,0,483,380,114,17,12,4,14 +7,0,512,7,159,187,152,1,6 +0,186,134,102,132,151,97,99,123 +1,95,187,183,148,166,67,129,49 +2,204,112,78,4,145,185,113,183 +3,113,37,35,165,134,188,123,229 +4,28,43,347,2,114,251,6,233 +5,4,0,189,128,0,35,165,503 +6,0,487,385,106,14,14,3,15 +7,0,510,5,163,199,126,1,20 +0,192,129,101,124,145,102,120,111 +1,92,171,188,154,159,70,122,68 +2,197,121,76,2,130,183,126,189 +3,114,43,29,168,125,197,110,238 +4,22,53,340,3,130,233,2,241 +5,12,1,174,133,2,25,174,503 +6,1,481,362,124,20,9,1,26 +7,0,508,8,178,186,128,1,15 +0,194,130,109,135,150,93,90,123 +1,103,191,173,162,173,55,113,54 +2,210,144,72,3,134,195,97,169 +3,112,25,32,182,145,169,128,231 +4,21,38,323,2,132,234,2,272 +5,1,0,199,123,0,26,169,506 +6,0,492,393,100,12,10,2,15 +7,1,512,5,146,218,132,0,10 +0,193,117,101,144,129,104,117,119 +1,88,184,183,168,159,56,128,58 +2,181,137,79,1,160,190,112,164 +3,117,58,38,202,138,154,103,214 +4,21,71,305,3,135,257,3,229 +5,4,0,172,148,1,40,153,506 +6,1,467,363,121,31,22,4,15 +7,0,508,9,183,165,123,3,33 +0,205,123,118,107,141,114,96,120 +1,100,178,169,173,155,73,118,58 +2,201,130,75,2,144,181,132,159 +3,102,41,41,194,152,165,110,219 +4,23,60,326,1,127,245,4,238 +5,3,0,199,139,1,25,153,504 +6,1,481,375,115,20,11,2,19 +7,0,509,15,162,188,134,1,15 +0,182,144,108,110,144,110,100,126 +1,97,198,187,149,167,71,97,58 +2,216,114,70,2,134,188,114,186 +3,109,28,33,167,151,185,129,222 +4,18,44,339,0,116,240,5,262 +5,3,1,195,136,2,21,164,502 +6,0,492,395,90,11,14,3,19 +7,0,512,7,172,196,124,1,12 +0,190,140,97,134,159,102,84,118 +1,88,150,191,163,161,77,120,74 +2,200,124,80,3,140,180,132,165 +3,123,34,38,165,127,168,138,231 +4,23,54,327,2,139,228,3,248 +5,2,0,208,129,0,22,157,506 +6,0,476,379,108,23,16,5,17 +7,0,511,15,181,181,122,1,13 +0,215,114,102,126,141,108,101,117 +1,93,160,170,167,171,71,138,54 +2,195,132,80,2,138,182,102,193 +3,115,45,27,184,138,181,114,220 +4,17,54,334,0,121,264,10,224 +5,4,1,184,141,0,28,159,507 +6,1,481,364,123,21,13,2,19 +7,1,512,14,184,174,126,0,13 +0,195,128,99,125,162,98,98,119 +1,97,162,176,171,169,54,139,56 +2,195,121,77,2,139,180,136,174 +3,112,53,39,200,129,165,118,208 +4,34,60,322,3,99,247,2,257 +5,4,2,183,149,1,25,164,496 +6,0,478,370,122,20,13,2,19 +7,0,512,11,163,186,135,0,17 +0,199,129,118,132,147,92,94,113 +1,95,182,173,146,158,77,127,66 +2,201,126,83,2,148,180,118,166 +3,112,54,32,179,140,169,111,227 +4,25,68,311,1,133,246,3,237 +5,10,0,175,137,0,31,171,500 +6,6,473,364,128,21,10,5,17 +7,0,509,11,153,185,136,3,27 +0,187,124,103,111,168,97,117,117 +1,85,141,174,209,164,70,129,52 +2,183,125,62,3,166,179,130,176 +3,118,80,41,192,123,166,107,197 +4,30,92,311,2,110,240,5,234 +5,6,1,191,114,1,41,163,507 +6,2,465,356,129,29,11,5,27 +7,2,510,17,167,165,135,1,27 +0,179,125,105,139,143,91,109,133 +1,92,171,181,163,168,67,119,63 +2,197,135,75,4,146,170,130,167 +3,114,42,25,183,135,172,112,241 +4,27,59,304,2,128,258,3,243 +5,4,1,196,126,2,19,169,507 +6,1,483,373,102,18,13,9,25 +7,0,508,5,172,191,130,0,18 +0,204,142,102,105,165,103,99,104 +1,87,168,184,147,157,77,143,61 +2,192,134,82,4,137,186,125,164 +3,123,45,44,181,134,176,100,221 +4,20,57,311,0,132,261,4,239 +5,5,0,182,137,1,31,162,506 +6,1,477,363,128,16,14,4,21 +7,0,508,16,163,167,147,1,22 +0,200,135,106,117,120,119,104,123 +1,94,194,195,172,173,56,98,42 +2,217,118,68,1,143,176,125,176 +3,105,47,33,172,140,175,125,227 +4,29,67,333,4,116,233,2,240 +5,4,1,184,143,1,31,157,503 +6,0,488,386,106,15,11,2,16 +7,1,512,6,175,195,115,0,20 +0,187,120,107,120,169,106,104,111 +1,98,188,188,161,150,72,108,59 +2,196,135,71,3,136,179,113,191 +3,121,30,39,170,133,192,117,222 +4,22,39,337,2,125,255,4,240 +5,0,0,204,141,2,28,146,503 +6,0,489,374,118,8,14,3,18 +7,0,511,15,169,173,144,1,11 +0,176,157,120,127,148,90,100,106 +1,99,185,197,165,156,74,102,46 +2,197,148,67,3,147,192,115,155 +3,137,18,30,196,154,155,121,213 +4,19,52,318,0,115,243,3,274 +5,2,0,219,131,0,27,137,508 +6,0,487,366,116,13,19,4,19 +7,1,512,6,167,207,121,2,8 +0,205,127,98,129,150,107,91,117 +1,92,174,181,162,155,69,130,61 +2,182,127,79,2,150,184,140,160 +3,125,51,34,200,121,174,111,208 +4,25,72,319,4,103,263,4,234 +5,4,0,176,122,1,43,167,511 +6,0,476,375,117,23,15,5,13 +7,1,507,5,167,187,129,4,24 +0,187,132,103,114,169,101,115,103 +1,91,184,183,149,165,68,108,76 +2,200,149,84,2,122,188,127,152 +3,120,20,40,175,145,168,123,233 +4,25,33,332,0,160,233,4,237 +5,2,0,182,160,1,21,158,500 +6,1,490,370,115,11,12,6,19 +7,0,512,9,152,199,141,0,11 +0,175,127,110,145,155,107,73,132 +1,95,168,176,171,168,67,120,59 +2,188,126,76,3,170,163,130,168 +3,101,51,27,207,142,164,112,220 +4,28,70,328,1,96,257,3,241 +5,6,0,187,116,1,37,172,505 +6,0,470,380,111,28,16,3,16 +7,0,512,14,162,194,115,1,26 +0,194,134,113,119,157,89,98,120 +1,93,186,184,141,161,71,126,62 +2,204,140,84,3,135,181,115,162 +3,118,28,35,165,148,179,116,235 +4,18,53,329,2,129,244,4,245 +5,4,0,190,140,0,22,160,508 +6,0,490,383,100,12,16,3,20 +7,0,512,6,165,192,138,0,11 +0,190,125,119,129,148,110,83,120 +1,100,166,185,159,174,72,110,58 +2,205,141,78,1,134,168,142,155 +3,107,28,31,191,158,170,125,214 +4,21,51,321,1,119,246,7,258 +5,3,0,183,142,1,24,165,506 +6,0,485,387,110,15,10,3,14 +7,0,512,11,169,209,110,0,13 +0,198,113,110,145,149,81,107,121 +1,84,180,191,152,167,61,132,57 +2,203,106,59,4,132,189,123,208 +3,108,37,28,154,130,206,110,251 +4,27,48,340,1,115,238,5,250 +5,3,0,185,123,1,19,188,505 +6,0,487,412,84,10,17,4,10 +7,0,511,7,192,174,130,2,8 +0,190,121,111,143,141,98,102,118 +1,93,144,175,183,176,62,120,71 +2,200,116,75,1,169,154,138,171 +3,102,56,28,187,140,183,106,222 +4,30,72,321,3,113,246,4,235 +5,9,0,183,117,0,43,163,509 +6,0,479,383,110,21,11,2,18 +7,2,510,7,184,172,124,1,24 +0,209,129,100,113,161,105,88,119 +1,90,172,155,175,164,67,137,64 +2,205,116,75,1,154,179,128,166 +3,116,52,29,199,119,182,119,208 +4,23,78,316,2,116,247,9,233 +5,4,1,173,138,1,37,161,509 +6,1,472,377,120,24,7,6,17 +7,0,512,10,169,191,126,1,15 +0,172,140,109,144,148,86,99,126 +1,102,157,196,164,163,77,104,61 +2,200,136,68,1,146,190,116,167 +3,127,46,43,185,152,149,119,203 +4,22,55,318,5,138,245,5,236 +5,10,0,198,126,1,27,160,502 +6,0,485,368,116,16,12,0,27 +7,0,510,9,149,194,140,1,21 +0,198,113,110,145,155,73,118,112 +1,93,166,181,164,165,67,129,59 +2,198,141,83,2,127,177,115,181 +3,106,32,30,182,134,197,110,233 +4,27,44,335,3,105,255,2,253 +5,7,1,180,130,1,22,180,503 +6,0,493,396,97,11,11,2,14 +7,1,512,8,155,184,152,0,12 +0,168,121,125,134,156,104,102,114 +1,89,167,184,152,168,69,127,68 +2,194,145,73,2,137,183,128,162 +3,118,32,44,177,147,170,109,227 +4,24,54,344,0,116,248,2,236 +5,4,0,182,135,0,25,172,506 +6,0,480,383,109,15,11,4,22 +7,0,509,12,160,190,131,0,22 +0,204,114,108,141,153,89,102,113 +1,96,153,182,170,154,66,143,60 +2,190,134,80,4,157,181,122,156 +3,98,59,35,192,141,170,113,216 +4,20,74,301,2,121,256,3,247 +5,4,2,190,118,0,44,160,506 +6,2,478,368,121,20,9,5,21 +7,1,509,6,155,195,129,1,28 +0,198,135,106,139,143,91,96,116 +1,89,177,189,170,158,66,116,59 +2,211,112,72,2,142,187,129,169 +3,119,42,38,191,134,163,120,217 +4,18,66,331,4,132,226,5,242 +5,4,1,201,134,3,26,146,509 +6,0,481,374,116,19,13,2,19 +7,0,511,11,175,194,117,2,14 +0,180,142,114,111,141,109,111,116 +1,96,188,169,156,165,71,129,50 +2,192,116,83,0,151,177,129,176 +3,97,56,36,175,145,165,120,230 +4,25,51,319,7,123,263,3,233 +5,13,0,195,126,0,31,154,505 +6,0,483,382,105,16,9,9,20 +7,0,507,12,148,177,150,1,29 +0,208,130,100,134,132,103,103,114 +1,90,179,183,175,168,64,124,41 +2,210,112,66,3,140,204,106,183 +3,118,35,32,175,133,188,126,217 +4,19,53,355,1,118,234,2,242 +5,6,0,193,127,0,27,162,509 +6,1,483,382,107,19,14,5,13 +7,2,510,8,159,197,131,0,17 +0,223,99,111,137,138,97,93,126 +1,103,164,177,159,171,66,126,58 +2,209,137,81,0,158,157,121,161 +3,108,53,30,198,149,169,108,209 +4,15,76,307,2,125,238,2,259 +5,6,0,185,142,0,29,158,504 +6,0,480,366,126,21,11,2,18 +7,1,510,8,171,208,107,3,16 +0,192,132,107,115,157,98,96,127 +1,99,186,185,147,160,81,102,64 +2,209,140,79,2,126,191,102,175 +3,132,28,32,165,147,176,124,220 +4,27,48,329,1,130,231,2,256 +5,2,1,206,136,0,25,147,507 +6,0,492,370,117,10,11,7,17 +7,0,512,7,166,200,130,0,9 +0,183,143,109,134,142,75,101,137 +1,99,167,200,137,168,81,112,60 +2,206,147,79,1,140,184,104,163 +3,141,33,39,169,144,164,124,210 +4,19,51,327,1,135,245,2,244 +5,4,0,204,131,0,18,161,506 +6,0,486,383,106,13,15,3,18 +7,0,511,6,162,195,138,0,12 +0,194,140,103,139,130,99,102,117 +1,89,189,205,137,174,56,124,50 +2,217,134,73,2,113,197,109,179 +3,117,26,39,164,144,181,115,238 +4,22,38,330,0,140,225,9,260 +5,3,0,186,146,0,22,162,505 +6,0,488,384,106,14,12,3,17 +7,0,510,11,161,190,138,0,14 +0,188,130,107,123,160,103,108,105 +1,93,168,192,156,162,77,116,60 +2,183,142,78,0,132,193,121,175 +3,141,37,41,174,149,168,101,213 +4,16,55,333,2,111,269,3,235 +5,3,0,196,144,4,30,144,503 +6,0,483,362,123,21,8,4,23 +7,0,509,15,148,175,155,1,21 +0,175,153,122,117,156,96,110,95 +1,88,162,170,158,165,86,128,67 +2,184,128,68,0,155,189,127,173 +3,122,46,37,184,146,154,100,235 +4,31,67,309,2,123,265,4,223 +5,3,0,196,110,0,32,175,508 +6,1,478,374,121,20,8,4,18 +7,0,509,12,164,181,137,1,20 +0,208,121,107,130,145,117,72,124 +1,103,180,179,162,163,57,120,60 +2,210,131,81,2,153,175,121,151 +3,115,39,46,182,142,167,116,217 +4,18,58,326,4,133,235,3,247 +5,3,1,201,141,0,22,152,504 +6,0,482,382,104,19,11,5,21 +7,1,508,17,154,185,139,0,20 +0,188,107,109,127,172,124,93,104 +1,98,161,185,150,160,68,127,75 +2,194,137,88,1,146,174,126,158 +3,126,45,41,194,136,158,114,210 +4,27,62,321,1,127,266,3,217 +5,5,0,189,137,0,34,160,499 +6,0,475,375,110,22,14,3,25 +7,0,509,4,161,181,148,1,20 +0,210,121,113,127,134,92,103,124 +1,91,180,186,151,162,80,114,60 +2,202,130,73,3,141,175,120,180 +3,106,26,38,174,143,178,120,239 +4,15,38,338,1,137,238,6,251 +5,5,1,189,132,0,19,178,500 +6,1,487,404,93,16,8,3,12 +7,0,511,13,160,200,128,1,11 +0,215,119,108,114,174,98,93,103 +1,95,175,174,181,160,64,103,72 +2,201,135,66,2,143,185,126,166 +3,125,36,41,179,144,183,112,204 +4,31,58,308,0,152,244,4,227 +5,2,1,204,129,0,27,154,507 +6,0,480,379,111,22,13,3,16 +7,0,512,15,160,183,146,1,7 +0,184,129,109,135,136,102,105,124 +1,95,173,193,157,173,68,113,52 +2,195,144,67,4,137,186,115,176 +3,112,40,33,172,143,180,121,223 +4,19,50,327,0,124,243,3,258 +5,5,0,195,132,1,22,162,507 +6,1,486,389,105,15,10,3,15 +7,2,511,5,151,214,124,0,17 +0,214,124,99,105,124,115,115,128 +1,95,166,186,162,170,69,124,52 +2,209,124,90,1,133,175,134,158 +3,121,57,39,188,132,160,115,212 +4,11,74,324,0,129,244,3,239 +5,7,0,167,147,0,40,158,505 +6,0,477,368,116,21,17,2,23 +7,1,511,14,152,174,152,1,19 +0,206,135,100,122,152,105,102,102 +1,94,158,184,187,145,68,124,64 +2,173,135,91,2,171,175,126,151 +3,97,75,39,201,130,170,104,208 +4,21,81,314,7,114,247,3,237 +5,15,1,180,130,1,37,155,505 +6,6,473,373,118,18,15,1,20 +7,2,504,13,171,188,107,0,39 +0,178,138,112,143,138,92,102,121 +1,92,192,174,154,174,67,118,53 +2,202,138,66,1,127,189,118,183 +3,122,27,41,167,140,189,108,230 +4,29,36,350,2,111,242,3,251 +5,9,0,174,137,0,23,178,503 +6,0,492,388,107,9,12,1,15 +7,0,511,9,150,199,138,0,17 +0,193,136,107,120,152,100,111,105 +1,91,161,190,161,165,70,118,68 +2,195,124,94,3,157,163,137,151 +3,115,67,41,188,132,169,101,211 +4,20,78,313,4,138,246,2,223 +5,9,0,186,127,2,38,154,508 +6,3,472,373,126,19,13,4,14 +7,1,508,8,160,178,125,2,42 +0,174,125,114,115,178,111,101,106 +1,97,161,169,200,157,76,108,56 +2,194,129,72,1,137,180,131,180 +3,110,24,30,183,150,197,102,228 +4,30,51,339,0,103,251,5,245 +5,1,0,197,117,0,27,174,508 +6,0,487,384,109,17,8,2,17 +7,1,512,10,164,194,127,1,15 +0,211,116,100,118,148,105,101,125 +1,96,175,168,161,172,66,124,62 +2,211,109,86,0,142,176,126,174 +3,119,31,29,159,124,206,116,240 +4,23,50,346,0,109,243,6,247 +5,0,0,190,141,0,21,166,506 +6,0,483,378,110,17,12,3,21 +7,0,512,9,163,207,121,0,12 +0,156,150,102,114,185,88,100,129 +1,92,163,199,158,156,77,112,67 +2,198,138,72,3,130,184,128,171 +3,112,29,28,180,144,190,123,218 +4,36,39,332,0,115,254,3,245 +5,9,0,193,126,0,18,174,504 +6,0,488,382,108,14,12,1,19 +7,1,512,9,162,184,144,1,11 +0,187,142,117,114,148,109,99,108 +1,99,198,184,154,156,66,107,60 +2,200,124,83,1,138,203,103,172 +3,128,43,42,168,151,159,109,224 +4,23,60,330,3,125,245,4,234 +5,2,1,200,129,1,34,154,503 +6,0,487,381,111,20,11,2,12 +7,0,508,6,152,189,150,0,19 +0,182,138,103,124,149,104,99,125 +1,105,178,191,139,170,65,121,55 +2,205,123,86,2,131,174,136,167 +3,115,39,27,186,141,180,112,224 +4,14,53,337,2,123,238,7,250 +5,5,0,171,144,1,24,173,506 +6,0,481,369,119,20,12,4,19 +7,1,511,7,179,190,122,2,12 +0,177,139,110,124,158,104,107,105 +1,90,173,179,163,166,75,113,65 +2,190,144,65,0,136,190,108,191 +3,129,40,40,171,139,176,104,225 +4,36,53,315,1,122,247,2,248 +5,3,0,172,127,0,36,180,506 +6,0,483,386,110,19,12,6,8 +7,0,512,9,164,173,149,1,16 +0,182,124,110,138,138,110,91,131 +1,97,184,177,135,179,73,129,50 +2,208,124,70,4,147,185,108,178 +3,109,26,34,159,153,184,120,239 +4,31,35,329,0,121,265,2,241 +5,5,0,196,138,0,25,154,506 +6,0,491,380,113,14,10,1,15 +7,0,512,9,185,180,126,1,11 diff --git a/visualize-router-output.ipynb b/visualize-router-output.ipynb new file mode 100644 index 0000000..b941f38 --- /dev/null +++ b/visualize-router-output.ipynb @@ -0,0 +1,98293 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
steplayere0e1e2e3e4e5e6e7
000121128126101131110190117
1111021961421271927416427
222242149111519021512478
333134481014516524053229
4442237369319612014263
.................................
30755230755231054242149149190124223
307553307553436573420722701246
307554307554570200113123177503
3075553075556048243469147315
3075563075567351215161188129115
\n", + "

307557 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " step layer e0 e1 e2 e3 e4 e5 e6 e7\n", + "0 0 0 121 128 126 101 131 110 190 117\n", + "1 1 1 102 196 142 127 192 74 164 27\n", + "2 2 2 242 149 11 15 190 215 124 78\n", + "3 3 3 134 48 10 145 165 240 53 229\n", + "4 4 4 22 37 369 3 196 120 14 263\n", + "... ... ... ... ... ... ... ... ... ... ...\n", + "307552 307552 3 105 42 42 149 149 190 124 223\n", + "307553 307553 4 36 57 342 0 72 270 1 246\n", + "307554 307554 5 7 0 200 113 1 23 177 503\n", + "307555 307555 6 0 482 434 69 14 7 3 15\n", + "307556 307556 7 3 512 15 161 188 129 1 15\n", + "\n", + "[307557 rows x 10 columns]" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "pth = \"router-output.log.csv\"\n", + "df = pd.read_csv(pth, header=None)\n", + "df = df.reset_index()\n", + "df.columns = [\"step\", \"layer\", \"e0\", \"e1\", \"e2\", \"e3\", \"e4\", \"e5\", \"e6\", \"e7\"]\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Average token counts for each expert per layer" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
e0e1e2e3e4e5e6e7
0156.633424142.795032113.844037123.804682147.189934113.391364118.411419107.930108
194.317519175.356639177.955001152.263962174.62658373.389309126.85649649.234491
2179.010274144.47725355.83701425.756795144.920042189.987515133.595474150.415633
398.46703149.25784943.154793195.374015138.539134184.365119117.224477197.617584
447.29301656.561139295.92477610.543790102.232982243.8255438.242190259.376564
57.6664244.740870189.410753139.31549819.02564822.297003145.389788496.154016
63.141010482.742196395.55423583.69750812.30452119.0286919.87017517.661664
713.630866504.01732415.960800300.170976100.90079168.3270475.82884215.163354
\n", + "
" + ], + "text/plain": [ + " e0 e1 e2 e3 e4 e5 \\\n", + "0 156.633424 142.795032 113.844037 123.804682 147.189934 113.391364 \n", + "1 94.317519 175.356639 177.955001 152.263962 174.626583 73.389309 \n", + "2 179.010274 144.477253 55.837014 25.756795 144.920042 189.987515 \n", + "3 98.467031 49.257849 43.154793 195.374015 138.539134 184.365119 \n", + "4 47.293016 56.561139 295.924776 10.543790 102.232982 243.825543 \n", + "5 7.666424 4.740870 189.410753 139.315498 19.025648 22.297003 \n", + "6 3.141010 482.742196 395.554235 83.697508 12.304521 19.028691 \n", + "7 13.630866 504.017324 15.960800 300.170976 100.900791 68.327047 \n", + "\n", + " e6 e7 \n", + "0 118.411419 107.930108 \n", + "1 126.856496 49.234491 \n", + "2 133.595474 150.415633 \n", + "3 117.224477 197.617584 \n", + "4 8.242190 259.376564 \n", + "5 145.389788 496.154016 \n", + "6 9.870175 17.661664 \n", + "7 5.828842 15.163354 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokens_by_expert_by_layer = df.groupby('layer').mean().reset_index().drop([\"step\", \"layer\"], axis=1)\n", + "tokens_by_expert_by_layer" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Duplicate key in file PosixPath('/usr/local/lib/python3.10/dist-packages/matplotlib/mpl-data/matplotlibrc'), line 799 ('font.family : sans-serif ')\n", + "Duplicate key in file PosixPath('/usr/local/lib/python3.10/dist-packages/matplotlib/mpl-data/matplotlibrc'), line 800 ('font.sans-serif : SimHei ')\n", + "Duplicate key in file PosixPath('/usr/local/lib/python3.10/dist-packages/matplotlib/mpl-data/matplotlibrc'), line 801 ('axes.unicode_minus : False ')\n" + ] + }, + { + "data": { + "text/plain": [ + "Text(0.5, 0, 'Layer')" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAG8CAYAAADJgD8rAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJiUlEQVR4nO3deVhU9eIG8HfYd4ZFQUQRFQ13I4Q03EsQRaVcyFx4rjdx+2mBBqWCZmrmVl3NXBLrote0W5K7KG5FiksgoeaOaCouzODCiPD9/eHjuU6oMMpwOPB+nmeex7PMmfcwo7ye8z1nVEIIASIiIiIFM5E7ABEREdGLYqEhIiIixWOhISIiIsVjoSEiIiLFY6EhIiIixWOhISIiIsVjoSEiIiLFY6EhIiIixWOhISIiIsVjoaEKtXv3bqhUqic+EhISDNoGVa5Lly4hODgYtra2UKvVWLFihdyRKtTw4cMxfPhwuWPQc2jQoAESExPljkFVnJncAah68fPzQ3p6OgBg2rRp+PPPP5GUlAQA8PDwkDOaYuXn52PhwoWYMGEC1Gq10V7n/fffR1FREbZt2waNRgNTU1OjvRYZ308//QQA6Nu3r6w5iCoLCw1VKHt7e7zyyisAABcXF1hbW0vT9Hzy8/Mxbdo0DB8+3KiF5siRI4iNjcVrr71mtNegysNCQzUNTzkREQCgqKiIR2WISLFYaEgWmzdvRqtWrWBpaYnWrVtj69atT1133759sLGxwVdffSXNKywsxIQJE+Dm5gYnJycMHDgQeXl50vJH59xnzZoFd3d3ODk5Ydy4cTDky+U1Gg3+8Y9/QK1Ww9XVFW+//TauXr2qt86qVavg4+MDKysrtG/fXjrdBgAJCQno3Lmz3vqJiYlo0KABgP+NFbpy5Qp69+4NW1tbNG7cWPpZJCYmQqVSwdvbGwDg7e0NlUpVapubNm1CmzZtYGNjA29vbyxevLjc+3j+/HlpjNOFCxcQGRkpTT+urPfr0b7m5+cjKioK7u7u2LNnT7lzAMCePXsQEBAAa2tr+Pr6Ys2aNXrLT506hZ49e8LR0RFubm549913ce/ePWm5EAKzZs1CvXr1YG9vj06dOuHw4cOlXufnn3+Gr68vbG1tERISguvXr5c7Y0lJCaZPny69RnBwMM6ePSstj4uLg7OzM27evAkAOHr0KExNTbF27Vrp59SiRQt8+OGHUKvVqF+/Pj755BOUlJRI2yjrsw0AKpUKu3fvRnJyMgICAhASEiIta9CgAVQqFVatWoVVq1ZJ7+fu3bvLvZ8NGjTAhAkT0KVLF9jY2MDf3x+//vqr3jqZmZno3r07bGxs0LBhQyxcuFBv+aPPuk6nQ2xsLOrXr4/vvvuu3BnK486dO4iKioKbmxscHR313o/CwkKo1WrMnTtX7zmvv/463nrrLWn6woUL6NevH+zt7eHp6YmPPvoIDx48kJY/+ntaUlKCOXPmwMfHBzNmzKjQ/aAKIoiMZNiwYaJ169al5u/cuVOYmJiIkSNHipSUFDFy5EhhamoqUlNThRBCpKamikcfzczMTKFWq8Unn3yit43hw4eLunXriu+//15s2rRJ+Pr6itdee01a7uXlJVq3bi0CAgLExo0bxcyZMwUA8fPPP5cre0lJiWjfvr3w9vYW69atExs3bhTNmjUTnTp1ktZZuXKlMDExER999JHYsWOHCA8PF7a2tuL48eNCCCHi4+P11n/0HC8vL739bNOmjYiOjhYpKSmia9euolatWqK4uFhcv35dpKeni+TkZAFAJCcni/T0dHHixAlpe3/99ZewtLQUw4cPF3v27BHz5s0TAMSvv/5arv3U6XQiPT1dpKenizp16oj4+Hhp+pGy3q9H+/rqq6+Ktm3bit69e4svv/xS5ObmliuDEEKcPHlSWFhYiHfffVfs2bNHTJ48WQAQKSkp0vvRpEkT0b59e7Fz507x008/iTp16ojp06dL24iNjRU2Njbi888/F6mpqaJv377CxcVFXL9+XQjx8PPYvHlzUbduXfHdd9+JtWvXCgcHBxEdHV3unAkJCcLBwUF88803IiUlRfqMFBUVCSGEuHv3rmjYsKEYP368EEKIzp07i549e+r9nFQqlQgICBDbtm0Tn332mTAzMxOff/65tE5Zn20hhAAgRo0aJdzd3UV8fLz473//Ky3LzMwU6enpolevXqJXr17S+6nVasu9n15eXkKlUokPPvhA7NixQ4SFhQlbW1tx+fJlIYQQ169fFy4uLqJv374iNTVVfP7558LU1FQsX75c2sajz3poaKgICgoSCxculP5uGMrLy0usXLmy1PwRI0YINzc38d///lfs2rVLvPbaa6Jr167S8n/84x/i5ZdflqavXr0qTE1NxYYNG4QQDz//TZo0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YcWKFdi6dasx8hERERGVyeBCU7duXWzfvh3+/v7Izs7GvXv30KJFCxw7dswY+YiIiIjKZPAYmk8//RQREREIDg5G79698corr0AIgddee80Y+YiIiIjKZHCh6dOnDy5fvgx7e3ssXboUq1evRkFBAYYNG2aMfERERERleq7LttVqNQDA1NSURYaIiIhkZ/AYmq1bt+LWrVvGyEJERET0XAwuNFFRUTh06JAxshARERE9F4MLzf/93/9h4cKFePDggTHyEBERERnM4DE0Li4uuHXrFvz8/BAVFQVbW1tp2dChQys0HBEREVF5GFxoEhMTYWlpCUtLS3z//ffSfJVKxUJDREREsjC40KSmphojBxEREdFzM3gMzePu378PIQRKSkoqKg8RERGRwQwuNAUFBXj33Xfh5uYGGxsbZGZmwtPTE4cPHzZGPiIiIqIyGVxoIiMjcf78eaxatQq2trZQq9V47733MGbMGGPkIyIiIiqTwWNoUlJScOzYMdSrVw8mJiZQqVQYNmwYpk+fbox8RERERGUy+AjNSy+9hMTERAAPr2xSqVTYu3cvmjdvXtHZiIiIiMrF4CM0X375JXr27IklS5agoKAAAwYMQE5ODpKTk42Rj4iIiKhMBhcaf39/nD59Ghs3bsSlS5fg6emJ0NBQODo6GiMfERERUZkMLjQ3btyAi4sLBg8ebIw8RERERAYzeAyNp6cnunfvjq+++gpXr141RiYiIiIigxhcaK5cuYKoqCgcPnwY7dq1Q8eOHfHFF18gNzfXGPmIiIiIymRwoXF0dMRbb72F5cuX48KFC1i8eDEOHDgALy8vY+QjIiIiKpPBY2gAQKvVYseOHdiyZQt27tyJpk2bYsmSJRWdjYiIiKhcDD5CExQUhLp162LVqlUICgrCkSNHsHXrVvzzn/8s9zY2bNiAhg0bwszMDG3atMHx48cBAFlZWfD394eTkxMmTpwIIYT0nD179sDX1xeurq6YP3++obGJiIioGjO40IwePRqXL19GcnIyhg0bBicnJ4Oef+bMGURGRmL27Nm4dOkSmjRpghEjRkCn06F3797w8/PDoUOHkJ2dLd3ALy8vD2FhYYiIiEBaWhqSkpL4rd9EREQkMbjQREREwN7eXpouKipCamoq4uLiyvX848ePY/bs2RgwYADc3NwwatQoHD16FFu2bIFGo8H8+fPR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VJn70Dg7OyMrK0tvXkFBASwsLODs7Iy8vLxS85/G0tKyVDkiIiKi6qvKHKHx9/dHWlqaNH3u3DnodDo4OzuXWnb06FHUrVtXjphERERUBVWZQtOxY0dotVqsXLkSADBz5kx0794dpqamCAsLwy+//IKUlBQUFRVhzpw56NGjh8yJawaegiAiIiWoMqeczMzMsHz5ckRERGDixIkwMTHB7t27AQCurq5YsGABevbsCTs7O6jVaukeNURERESyFprH7wQMAGFhYThz5gwOHz6MwMBAuLi4SMuioqLQo0cPnDhxAkFBQbCzs6vsuERERFRFVZkjNI+4u7sjNDT0icu8vb2feMk3ERER1WxVZgwNERER0fNioSEiIiLFY6EhIiIixatyY2iIiIiqiuMv+epN+544LlMSKguP0BAREZHisdAQERGR4rHQEBERkeKx0BAREZHisdAQERGR4rHQEBERkeLxsm2qNPMG9tKbHuj9gUxJiIiouuERGiIiIlI8FhoiIiJSPBYaIiIiUjyOoSEiIiKD/H1MZPTajTIl+R8eoSEiIiLFY6EhIiIixWOhISIiIsVjoSEiIiLFY6EhIiIixWOhISIiIsVjoSEiIiLF431oiIgel+CoP+1dX54cRGQQFhoiA7Vc1VJv+tiwYzIlISKiR3jKiYiIiBSPhYaIiIgUj4WGiIiIFI9jaKjKSEhIeOY0VbK/D45N0MiTg4ioHHiEhoiIiBSPR2iIqMZrELtJ+vN5KxmDENFz4xEaIiIiUjwWGiIiIlI8nnIionL5+w0Fv5cpBxHRk/AIDRERESkeCw0REREpHgsNERERKR4LDRERESkeCw0REREpHgsNERERKR4LDRERESkeCw0REREpHgsNERERKR4LDRERESkeCw0REREpHr/LiegFHX/JV39G50XyBCEiqsF4hIaIiIgUj0doiIjohc0b2EtveqD3BzIloZqKR2iIiIhI8XiEhoiIDLYoapfcEaqEvx+Zil67UaYkxEJDRERkJAkJCc+cporDU05ERESkeDxCQ0REVMO1XNVSb/r7F9yeHEemWGiIiIhqgAaxm6Q/n7eSMYiRsNAQERGVEwdDV10sNEREBuCdoYmqJhYaIiKiCpIbu09/RjU8tVNVsdAQERlRVf4FpzemYnaojEmIXhwv2yYiIiLFU9QRmqysLERGRuL06dMYMWIE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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from matplotlib import pyplot as plt\n", + "\n", + "tokens_by_expert_by_layer.plot(kind='bar')\n", + "plt.title(\"Token counts for each expert per layer\")\n", + "plt.ylabel(\"Average Tokens\")\n", + "plt.xlabel(\"Layer\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Average token by step" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
indexsteplayere0e1e2e3e4e5e6e7iter
00001211281261011311101901170
11801151401261111211091741281
22160143117110991341231701282
33240107164123106140891791163
4432012312912099129961921364
.......................................
3843938439307524775121514317514212938439
3844038440307532795101416417710714238440
3844138441307540775111915417812902638441
3844238442307548745121612620813901938442
3844338443307556735121516118812911538443
\n", + "

307557 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " index step layer e0 e1 e2 e3 e4 e5 e6 e7 iter\n", + "0 0 0 0 121 128 126 101 131 110 190 117 0\n", + "1 1 8 0 115 140 126 111 121 109 174 128 1\n", + "2 2 16 0 143 117 110 99 134 123 170 128 2\n", + "3 3 24 0 107 164 123 106 140 89 179 116 3\n", + "4 4 32 0 123 129 120 99 129 96 192 136 4\n", + "... ... ... ... ... ... ... ... ... ... ... ... ...\n", + "38439 38439 307524 7 7 512 15 143 175 142 1 29 38439\n", + "38440 38440 307532 7 9 510 14 164 177 107 1 42 38440\n", + "38441 38441 307540 7 7 511 19 154 178 129 0 26 38441\n", + "38442 38442 307548 7 4 512 16 126 208 139 0 19 38442\n", + "38443 38443 307556 7 3 512 15 161 188 129 1 15 38443\n", + "\n", + "[307557 rows x 12 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dfs = []\n", + "for l in df.layer.unique():\n", + " msk = df[\"layer\"] == l\n", + " df_ = df[msk]\n", + " df_ = df_.reset_index(drop=True).reset_index(drop=False)\n", + " df_[\"iter\"] = df_[\"index\"]\n", + " df_.drop([\"index\", \"step\"], axis=1)\n", + " dfs.append(df_)\n", + "df2 = pd.concat(dfs)\n", + "df2" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + " \n", + "
\n", + " \n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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hTnhhBPSt2/fDBgwIIsWLar4POI2AAAAAABtMnr06KxYsWKn69OnT8/48ePzxBNPZOzYsenbt2/FZxG3AQAAAAB4w+rq6lJXV9dpz3PmNgAAAAAAxRG3AQAAAAAojrgNAAAAAEBxxG0AAAAAAIojbgMAAAAAUBxxGwAAAACA4lR39QAAAAAAAPze/I+d2KnPm3HbnZ36vI5k5zYAAAAAAG/YU089lUGDBnXa88RtAAAAAADekJ///Oc54YQTsnnz5k57prgNAAAAAMAbctJJJ+VTn/pUpz5T3AYAAAAAoE0efPDBjBkzJv3798+UKVPS0NCQJLnzzjtz6qmnduos4jYAAAAAAHv0wgsvZOLEiZk4cWIeeeSRNDY2ZsaMGUmSurq6Tp+nutOfCAAAAABAcZYuXZoePXpk9uzZqaqqyoUXXpgzzzyzy+YRtwEAAAAA2KONGzemvr4+AwcOTJI0Nzdny5Ytefnll9OrV69On0fcBgAAAABgj2prazNq1KjcdtttSZKWlpY0NDSkR48eXTKPM7cBAAAAANijSZMmZf369XnggQfSu3fv3HHHHZkwYUJaWlq6ZB47twEAAAAA9hIzbruzq0fYrQEDBmTJkiU577zzMm3atIwcOTJLlixJdXXXZGZxGwAAAACANhk9enRWrFixy3vDhw/v1F3cjiUBAAAAAKA44jYAAAAAAMURtwEAAAAAKI64DQAAAABAccRtAAAAAACKI24DAAAAAFAccRsAAAAAgOJUd/UAAAAAAAD83sZL7uvU59VeObZD3ue6667L7Nmz85vf/Cbvf//78+1vfzsHHHBAh7z37ti5DQAAAADA6/bTn/40M2fOzC233JJ169alpaUlF154YcWfK24DAAAAAPC6/exnP8u1116b448/PrW1tZk2bVpWrVpV8eeK2wAAAAAAtMmDDz6YMWPGpH///pkyZUoaGhoybdq0/NVf/VXrmieffDKHHHJIxWcRtwEAAAAA2KMXXnghEydOzMSJE/PII4+ksbExM2bM2GHNb3/721x77bWZPn16xefxgZIAAAAAAOzR0qVL06NHj8yePTtVVVW58MILc+aZZ+6w5txzz8373//+TJw4seLziNsAAAAAAOzRxo0bU19fn4EDByZJmpubs2XLlrz88svp1atXbr755ixbtiyrV6/ulHnEbQAAAAAA9qi2tjaj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AIojbgMAAAAAUBxxGwAAAACA4ojbAAAAAAAUR9wGAAAAAKA4HRK3N2zYkJUrV3bEWwEAAAAAwB61O24fdthheemll3a49vzzz2fSpEkdNhQAAAAAALyWdsftJ554Is3NzTtce/vb354XX3yxw4YCAAAAAIDXUt3WhX/zN3/T+tef/vSnU1NTkyRpaWnJihUrcvLJJ7frwS+88EKefPLJvOtd78rAgQPb9b0AAAAAALy1tXnn9rBhwzJs2LBUVVVl6NChra/f+c535gtf+EJuvvnmNj/09ttvz/Dhw3P22WentrY2t99+e5JkzZo1GT16dAYOHJiLLrooLS0trd9z7733ZsSIERk8eHAWLFjQjh8RAAAAAIA3mzbv3J49e3aS5PLLL8+ll16afv36va4HNjQ05JxzzslPfvKTHHHEEVm0aFEuuuiiTJ48OSeddFLGjx+fb3/72/nsZz+bRYsWZdq0aamvr8/kyZMzY8aMTJ06Naeffnre9773Zdy4ca9rBgAAAAAAytbuM7dvvfXWvO1tb3vdD2xsbMxVV12VI444Iknyp3/6p3n++efzgx/8IA0NDVmwYEEOPvjgzJ07NzfeeGOSZPHixRkyZEhmzpyZQw45JLNmzWq9BwAAAADAW0+bd27/wcc+9rHcc8892bBhww7HhiTJmWeeucfvHzp0aM4444wkyfbt27Nw4cKccsopWb16dY455pj06dMnSXLEEUdk7dq1SZLVq1dn3LhxqaqqSpIcffTRueSSS3b7jKampjQ1NbW+bmxsbN8PCQAAAADAXq3dcfuv//qv853vfCfve9/7Wj9UMkmqqqraFLf/YPXq1TnuuONSU1OTxx9/PF/60pdSV1e3w/t17949mzdvTmNjYw477LDWe/369cumTZt2+95XXHFFLr/88nb+ZAAAAAAAlKLdcfu73/1uli1bljFjxryhBx9xxBG566678rnPfS5nn312Dj744PTs2XOHNb169crWrVtTXV29w70/XN+dSy+9NBdccEHr68bGxgwdOvQNzQsAAAAAwN6j3Wduv/vd786LL774hh9cVVWVUaNG5eabb86//uu/ZtCgQamvr99hzZYtW1JTU7PTvT9c352ePXumX79+O3wBAAAAAPDm0e64PXfu3HzmM5/J1VdfnTVr1mT9+vWtX21x77335qKLLmp9XVNTk6qqqowYMSLLly9vvb5u3bo0NTVl0KBBGT169A73Vq1alQMPPLC9owMAAAAA8CbR7rg9fvz4PPHEE/nMZz6TI444IsOHD8/w4cN3OC/7tbzrXe/Kddddl+uuuy4bNmzI5z//+Xz4wx/OCSeckMbGxtx0001Jfh/Rjz/++HTv3j2TJ0/O/fffn7vvvjvbt2/PvHnzMn78+PaODgAAAADAm0S743Zzc/Muv1599dU2ff8BBxyQO+64I1/96lczcuTIbN26Nd/85jdTXV2dG264Ieedd14GDx6c73//+/nyl7+cJBk8eHAWLlyYE044Ifvtt1+efPLJfOELX2jv6AAAAAAAvEm0+wMlv/nNb+723plnntmm9/jLv/zLPPbYYztdnzx5cp5++umsXLkyxxxzTPbdd9/We9OnT2/dNT527Nj07du3vaMDAAAAAPAm0e64/YdjQ5Jk69ateeKJJ7Jt27b82Z/9WZvj9mvZf//9M2nSpF3eq6ura/PxJwAAAAAAvHm1O24vW7Zsh9cvvfRSvvCFL2TQoEEdNhQAAAAAALyWdp+5/cfe9ra3ZeHChbn99ts7Yh4AAAAAANijdu/cXr9+/Q6vm5ubs3z58mzevLnDhgIAAAAAgNfS7rg9fPjwVFVVpaWlpfVabW1t5s+f36GDAQAAAADA7rQ7bjc3N1diDgAAAAAAaLN2x+0kefbZZ3PLLbdk/fr1GT58eD7xiU9k//337+jZAAAAAABgl9r9gZI//elPc+ihh+buu+/Oq6++mh/+8Ic59NBD83//7/+txHwAAAAAALCTdu/cPv/887NgwYKcffbZrdeuv/76nHfeefl//+//dehwAAAAAACwK+3eub1u3bocf/zxO1z7y7/8yzzzzDMdNRMAAAAAALymdsft8ePH5+///u/zq1/9Kkny3HPP5XOf+1zGjx/f4cMBAAAAAMCutDtuf+Mb38irr76aAw44IH369MmBBx6Y5ubmfOMb36jEfAAAAAAAsJN2n7k9YMCA/Nu//Vuee+65bNiwIQcddFD222+/SswGAAAAAAC71Oa4fc899+TWW2/Ne9/73pxzzjnZf//987d/+7c58MADc9ppp+Uv//IvKzknAAAAAAC0atOxJF/96lfz0Y9+NL17984hhxzSev1DH/pQqqur89GPfjRf//rXKzYkAAAAAAD8T23auf2Vr3wlP/jBDzJq1Kgdrl9wwQVJklNPPTVnnXVWzjnnnI6fEAAAAAAA/kibdm5v27YtW7du3e39vn375ne/+12HDQUAAAAAAK+lTTu3L7744kyZMiWXXnpp/uzP/izveMc70r1797zwwgt56KGH8qUvfSnnnntupWcFAAAAAIAkbYzbF1xwQQ466KB89atfzec///ls27at9d7BBx+c888/v/WIEgAAAAAAqLQ2xe3k9+dqn3rqqWlubs5vfvObbN++Pf3790/fvn0rOR8AAAAAAOykzXH7D7p165Z3vOMdlZgFAAAAAADapE0fKAkAAAAAAHsTcRsAAAAAgOKI2wAAAAAAFEfcBgAAAACgOOI2AAAAAADFEbcBAAAAAChOdXu/oampKbfeems2bNiQlpaWHe7NmjWrwwYDAAAAAIDdaXfc/shHPpKVK1fmuOOOS01NTev1qqqqDh0MAAAAAAB2p91xe9myZXnwwQdz2GGHVWIeAAAAAADYo3afuf1nf/ZnWbNmTSVmAQAAAACANmn3zu2/+7u/y0UXXZQHH3wwxx57bPr169d67wMf+ECHDgcAAAAAALvS7rj9D//wD6mqqsodd9yRO+64o/V6VVVVfv7zn3focAAAAAAAsCvtjtvr1q2rxBwAAAAAANBm7T5zO0l+8Ytf5Jprrslll12WZ599Nl//+tfT0tLS0bMBAAAAAMAutTtu33777Tn00ENz8803Z/78+WlsbMw///M/55JLLqnEfAAAAAAAsJN2x+2LL744t912W5YvX57evXund+/e+e53v5tFixZVYDwAAAAAANhZu+P2yy+/nEMOOWSHaz169Ei3bq/rhBMAAAAAAGi3dhfpT3ziE5k8eXKuvfbavPrqq1m+fHk+85nP5JOf/GQl5gMAAAAAgJ1Ut/cb5s6dm759+2b+/Pl55ZVXMmvWrHzyk5905jYAAAAAAJ2m3XG7uro6s2bNyqxZsyoxDwAAAAAA7FG7jyV57LHHdrr2s5/9LKeeemqHDAQAAAAAAHvS7rj9oQ99KD/5yU+SJL/61a8yffr0jBo1KsOHD+/o2QAAAAAAYJfaHbe/853v5PTTT8/ZZ5+dkSNHpkePHnnyySfzla98pRLzAQAAAADATtp95vYHPvCBLFu2LCeccEL++q//WtQGAAAAAKDTtSluf/GLX9zp2oQJE3LVVVfl17/+df7kT/4kSXzIJAAAAAAAnaJNcXvdunW7vP7JT36y9X5VVVXHTQUAAAAAAK+hTXH7pptuqvQcAAAAAADQZu3+QMkk+drXvpbDDjssffv2zciRI/PP//zPHT0XAAAAAADsVrs/UPLyyy/P4sWLM2fOnBx88MF5+umnM2fOnGzevDkzZ86sxIwAAAAAALCDdsft6667LkuXLs2RRx6ZJBkzZkxGjBiRE088UdwGAAAAAKBTtPtYkpqammzZsmWHa1u2bEmPHj06bCgAAAAAAHgt7d65feGFF+a0007L3//93+ed73xnfv7zn+eqq67KrFmzKjEfAAAAAADspN1x+9xzz83++++f66+/PrfccksOOuigfP3rX8+UKVMqMR8AAAAAAOyk3XE7ST7ykY/kIx/5SEfPAgAAAAAAbdKmM7ff+c535sUXX6z0LAAAAAAA0CZtitvPPPNMWlpaKj0LAAAAAAC0SZuPJfn0pz+dmpqa11zzL//yL294IAAAAAAA2JM2x+1+/fqlZ8+elZwFAAAAAADapM1x+8orr0y/fv0qOQsAAAAAALRJm87cPvbYY1Nd3eYODgAAAAAAFdWmYr1s2bJKzwEAAAAAAG3Wpp3bAAAAAACwNxG3AQAAAAAojrgNAAAAAEBxxG0AAAAAAIojbgMAAAAAUBxxGwAAAACA4ojbAAAAAAAU53XF7W9961s5/fTT8+d//uf52c9+lo9+9KP5zW9+09GzAQAAAADALrU7bl922WW5+OKLU1dXl9WrV6dbt9+/xd/93d91+HAAAAAAALAr1e39huuvvz4/+tGPcvjhh+eaa65Jjx49smDBgowcObIS8wEAAAAAwE7avXN7wIAB2bBhww7XfvnLX2a//fbrsKEAAAAAAOC1tHvn9he+8IWccsopmTJlSpqamrJw4cJ8//vfz+WXX16J+QAAAAAAYCft3rl95pln5oc//GH22WeffPCDH8xLL72Ub37zm/nkJz9ZifkAAAAAAGAn7d65feedd2bcuHH5wAc+UIl5AAAAAABgj9q9c/vcc8/Nc889lxUrVuT5559vvf6P//iPefvb357bb7+9QwcEAAAAAIA/1u64/bGPfSzvfe97c8opp2TYsGH52te+liT5yle+kquvvjr/+I//2OFDAgAAAADA/9TuuL148eLceeed2bRpU1avXp2LL744v/71r/Piiy/mQx/6UJ58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AFAccRsAAAAAgOKI2wAAAAAAFEfcBgAAAACgOOI2AAAAAADFEbcBAAAAACiOuA0AAAAAQHHEbQAAAAAAiiNuAwAAAABQHHEbAAAAAIDiiNsAAAAAABSnS+L297///bzzne9MdXV1jjzyyDz++ONJkjVr1mT06NEZOHBgLrroorS0tLR+z7333psRI0Zk8ODBWbBgQVeMDQAAAADAXqLT4/bTTz+dadOm5corr8wvf/nLvOtd78rZZ5+dpqamnHTSSRk1alQeeuihrF27NosWLUqS1NfXZ/LkyZk6dWqWL1+exYsXZ9myZZ09OgAAAAAAe4lOj9uPP/54rrzyynz0ox/Nfvvtl09/+tNZtWpVfvCDH6ShoSELFizIwQcfnLlz5+bGG29MkixevDhDhgzJzJkzc8ghh2TWrFmt9wAAAAAAeOup7uwHnnjiiTu8fvLJJ3PIIYdk9erVOeaYY9KnT58kyRFHHJG1a9cmSVavXp1x48alqqoqSXL00Ufnkksu2e0zmpqa0tTU1Pq6sbGxo38MAAAAAAC6UJd+oOS2bdsyf/78TJ8+PY2Njamrq2u9V1VVle7du2fz5s073evXr182bdq02/e94oor0r9//9avoUOHVvTnAAAAAACgc3Vp3J49e3be9ra35eyzz051dXV69uy5w/1evXpl69atO937w/XdufTSS9PQ0ND6tWHDhor9DAAAAAAAdL5OP5bkD3784x/n6quvzn/913+lR48eGTRoUNasWbPDmi1btqSmpiaDBg1KfX39Ttd3p2fPnjuFcgAAAAAA3jy6ZOf2unXrMnXq1Fx99dU57LDDkiSjR4/O8uXLd1jT1NSUQYMG7XRv1apVOfDAAzt9bgAAAAAA9g6dHrd/97vf5cQTT8zJJ5+cU045JS+++GJefPHFjB07No2NjbnpppuSJHPnzs3xxx+f7t27Z/Lkybn//vtz9913Z/v27Zk3b17Gjx/f2aMDAAAAALCX6PRjSe66666sXbs2a9euzfXXX996fd26dbnhhhsyderUXHTRRenWrVvuueeeJMngwYOzcOHCnHDCCenbt28GDBiQRYsWdfboAAAAAADsJTo9bp988slpaWnZ5b3hw4fn6aefzsqVK3PMMcdk3333bb03ffr0jB8/Pk888UTGjh2bvn37dtbIAAAAAADsZbrsAyV3Z//998+kSZN2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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import pandas as pd\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib.animation import FuncAnimation\n", + "import numpy as np\n", + "from IPython.display import HTML\n", + "\n", + "\n", + "fig, ax = plt.subplots(figsize=(18, 12))\n", + "\n", + "STEPS = len(df2[\"iter\"].unique())\n", + "STEPS = 2000\n", + "bar_width = 0.06 # Width of each bar\n", + "\n", + "def update_hist(step):\n", + " df_ = df2[df2[\"iter\"] == step]\n", + " \n", + " ax.clear()\n", + " x = np.arange(len(df_['layer'])) # The label locations\n", + " \n", + " for i in range(4):\n", + " ax.bar(x - bar_width * (4-i), df_[f'e{i}'], width=bar_width, label=f'e{i}')\n", + " \n", + " for i in range(4):\n", + " ax.bar(x + bar_width * i, df_[f'e{i}'], width=bar_width, label=f'e{i}')\n", + "\n", + " ax.set_xlabel(\"Layer\")\n", + " ax.set_ylabel(\"Average Token Count\")\n", + " ax.set_title(f\"Step {step + 1}\")\n", + " ax.set_xticks(x)\n", + " ax.set_xticklabels(df_['layer'])\n", + " ax.legend()\n", + "\n", + "ani = FuncAnimation(fig, update_hist, frames=np.arange(0, STEPS, 10), repeat=False)\n", + "\n", + "HTML(ani.to_jshtml())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From dd2be4daea4a8a7e7a2e789265b68704bd88862b Mon Sep 17 00:00:00 2001 From: sepilqi Date: Wed, 31 Jul 2024 17:35:31 +0800 Subject: [PATCH 4/5] add visualize script --- README.md | 17 +- makeMoE.py | 2 +- router-output.log.svg | 1626 +++++++++++++++++++++++++++++++++ visualize-router-output.ipynb | 53 +- 4 files changed, 1672 insertions(+), 26 deletions(-) create mode 100644 router-output.log.svg diff --git a/README.md b/README.md index 0bd558a..a184112 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,9 @@
Developed using Databricks with ❤️ +## Overview - -#### Sparse mixture of experts language model from scratch inspired by (and largely based on) Andrej Karpathy's makemore (https://github.com/karpathy/makemore) :) +**Sparse mixture of experts language model from scratch inspired by (and largely based on) Andrej Karpathy's makemore (https://github.com/karpathy/makemore) :)** HuggingFace Community Blog that walks through this: https://huggingface.co/blog/AviSoori1x/makemoe-from-scratch @@ -55,3 +55,16 @@ makeMoE_Concise.ipynb is the consolidated hackable implementation that I encoura **Please note that the implementation emphasizes readability and hackability vs. performance, so there are many ways in which you could improve this. Please try and let me know!** Hope you find this useful. Happy hacking!! + + +## Usage + +* train + +```bash +python makeMoE.py +``` + +* visualize: [visualize-router-output.ipynb](./visualize-router-output.ipynb) + +![](./router-output.log.svg) diff --git a/makeMoE.py b/makeMoE.py index b772b72..ee30a30 100644 --- a/makeMoE.py +++ b/makeMoE.py @@ -7,7 +7,7 @@ # hyperparameters batch_size = 16 # how many independent sequences will we process in parallel? block_size = 32 # what is the maximum context length for predictions? -max_iters = 5000 +max_iters = 2000 eval_interval = 100 learning_rate = 1e-3 device = "cuda" if torch.cuda.is_available() else "cpu" diff --git a/router-output.log.svg b/router-output.log.svg new file mode 100644 index 0000000..8e93d75 --- /dev/null +++ b/router-output.log.svg @@ -0,0 +1,1626 @@ + + + + + + + + 2024-07-31T17:33:06.385093 + image/svg+xml + + + Matplotlib v3.8.2, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/visualize-router-output.ipynb b/visualize-router-output.ipynb index b941f38..311b7ae 100644 --- a/visualize-router-output.ipynb +++ b/visualize-router-output.ipynb @@ -389,28 +389,9 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 12, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Duplicate key in file PosixPath('/usr/local/lib/python3.10/dist-packages/matplotlib/mpl-data/matplotlibrc'), line 799 ('font.family : sans-serif ')\n", - "Duplicate key in file PosixPath('/usr/local/lib/python3.10/dist-packages/matplotlib/mpl-data/matplotlibrc'), line 800 ('font.sans-serif : SimHei ')\n", - "Duplicate key in file PosixPath('/usr/local/lib/python3.10/dist-packages/matplotlib/mpl-data/matplotlibrc'), line 801 ('axes.unicode_minus : False ')\n" - ] - }, - { - "data": { - "text/plain": [ - "Text(0.5, 0, 'Layer')" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAG8CAYAAADJgD8rAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABJiUlEQVR4nO3deVhU9eIG8HfYd4ZFQUQRFQ13I4Q03EsQRaVcyFx4rjdx+2mBBqWCZmrmVl3NXBLrote0W5K7KG5FiksgoeaOaCouzODCiPD9/eHjuU6oMMpwOPB+nmeex7PMmfcwo7ye8z1nVEIIASIiIiIFM5E7ABEREdGLYqEhIiIixWOhISIiIsVjoSEiIiLFY6EhIiIixWOhISIiIsVjoSEiIiLFY6EhIiIixWOhISIiIsVjoaEKtXv3bqhUqic+EhISDNoGVa5Lly4hODgYtra2UKvVWLFihdyRKtTw4cMxfPhwuWPQc2jQoAESExPljkFVnJncAah68fPzQ3p6OgBg2rRp+PPPP5GUlAQA8PDwkDOaYuXn52PhwoWYMGEC1Gq10V7n/fffR1FREbZt2waNRgNTU1OjvRYZ308//QQA6Nu3r6w5iCoLCw1VKHt7e7zyyisAABcXF1hbW0vT9Hzy8/Mxbdo0DB8+3KiF5siRI4iNjcVrr71mtNegysNCQzUNTzkREQCgqKiIR2WISLFYaEgWmzdvRqtWrWBpaYnWrVtj69atT1133759sLGxwVdffSXNKywsxIQJE+Dm5gYnJycMHDgQeXl50vJH59xnzZoFd3d3ODk5Ydy4cTDky+U1Gg3+8Y9/QK1Ww9XVFW+//TauXr2qt86qVavg4+MDKysrtG/fXjrdBgAJCQno3Lmz3vqJiYlo0KABgP+NFbpy5Qp69+4NW1tbNG7cWPpZJCYmQqVSwdvbGwDg7e0NlUpVapubNm1CmzZtYGNjA29vbyxevLjc+3j+/HlpjNOFCxcQGRkpTT+urPfr0b7m5+cjKioK7u7u2LNnT7lzAMCePXsQEBAAa2tr+Pr6Ys2aNXrLT506hZ49e8LR0RFubm549913ce/ePWm5EAKzZs1CvXr1YG9vj06dOuHw4cOlXufnn3+Gr68vbG1tERISguvXr5c7Y0lJCaZPny69RnBwMM6ePSstj4uLg7OzM27evAkAOHr0KExNTbF27Vrp59SiRQt8+OGHUKvVqF+/Pj755BOUlJRI2yjrsw0AKpUKu3fvRnJyMgICAhASEiIta9CgAVQqFVatWoVVq1ZJ7+fu3bvLvZ8NGjTAhAkT0KVLF9jY2MDf3x+//vqr3jqZmZno3r07bGxs0LBhQyxcuFBv+aPPuk6nQ2xsLOrXr4/vvvuu3BnK486dO4iKioKbmxscHR313o/CwkKo1WrMnTtX7zmvv/463nrrLWn6woUL6NevH+zt7eHp6YmPPvoIDx48kJY/+ntaUlKCOXPmwMfHBzNmzKjQ/aAKIoiMZNiwYaJ169al5u/cuVOYmJiIkSNHipSUFDFy5EhhamoqUlNThRBCpKamikcfzczMTKFWq8Unn3yit43hw4eLunXriu+//15s2rRJ+Pr6itdee01a7uXlJVq3bi0CAgLExo0bxcyZMwUA8fPPP5cre0lJiWjfvr3w9vYW69atExs3bhTNmjUTnTp1ktZZuXKlMDExER999JHYsWOHCA8PF7a2tuL48eNCCCHi4+P11n/0HC8vL739bNOmjYiOjhYpKSmia9euolatWqK4uFhcv35dpKeni+TkZAFAJCcni/T0dHHixAlpe3/99ZewtLQUw4cPF3v27BHz5s0TAMSvv/5arv3U6XQiPT1dpKenizp16oj4+Hhp+pGy3q9H+/rqq6+Ktm3bit69e4svv/xS5ObmliuDEEKcPHlSWFhYiHfffVfs2bNHTJ48WQAQKSkp0vvRpEkT0b59e7Fz507x008/iTp16ojp06dL24iNjRU2Njbi888/F6mpqaJv377CxcVFXL9+XQjx8PPYvHlzUbduXfHdd9+JtWvXCgcHBxEdHV3unAkJCcLBwUF88803IiUlRfqMFBUVCSGEuHv3rmjYsKEYP368EEKIzp07i549e+r9nFQqlQgICBDbtm0Tn332mTAzMxOff/65tE5Zn20hhAAgRo0aJdzd3UV8fLz473//Ky3LzMwU6enpolevXqJXr17S+6nVasu9n15eXkKlUokPPvhA7NixQ4SFhQlbW1tx+fJlIYQQ169fFy4uLqJv374iNTVVfP7558LU1FQsX75c2sajz3poaKgICgoSCxculP5uGMrLy0usXLmy1PwRI0YINzc38d///lfs2rVLvPbaa6Jr167S8n/84x/i5ZdflqavXr0qTE1NxYYNG4QQDz//TZo0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YcWKFdi6dasx8hERERGVyeBCU7duXWzfvh3+/v7Izs7GvXv30KJFCxw7dswY+YiIiIjKZPAYmk8//RQREREIDg5G79698corr0AIgddee80Y+YiIiIjKZHCh6dOnDy5fvgx7e3ssXboUq1evRkFBAYYNG2aMfERERERleq7LttVqNQDA1NSURYaIiIhkZ/AYmq1bt+LWrVvGyEJERET0XAwuNFFRUTh06JAxshARERE9F4MLzf/93/9h4cKFePDggTHyEBERERnM4DE0Li4uuHXrFvz8/BAVFQVbW1tp2dChQys0HBEREVF5GFxoEhMTYWlpCUtLS3z//ffSfJVKxUJDREREsjC40KSmphojBxEREdFzM3gMzePu378PIQRKSkoqKg8RERGRwQwuNAUFBXj33Xfh5uYGGxsbZGZmwtPTE4cPHzZGPiIiIqIyGVxoIiMjcf78eaxatQq2trZQq9V47733MGbMGGPkIyIiIiqTwWNoUlJScOzYMdSrVw8mJiZQqVQYNmwYpk+fbox8RERERGUy+AjNSy+9hMTERAAPr2xSqVTYu3cvmjdvXtHZiIiIiMrF4CM0X375JXr27IklS5agoKAAAwYMQE5ODpKTk42Rj4iIiKhMBhcaf39/nD59Ghs3bsSlS5fg6emJ0NBQODo6GiMfERERUZkMLjQ3btyAi4sLBg8ebIw8RERERAYzeAyNp6cnunfvjq+++gpXr141RiYiIiIigxhcaK5cuYKoqCgcPnwY7dq1Q8eOHfHFF18gNzfXGPmIiIiIymRwoXF0dMRbb72F5cuX48KFC1i8eDEOHDgALy8vY+QjIiIiKpPBY2gAQKvVYseOHdiyZQt27tyJpk2bYsmSJRWdjYiIiKhcDD5CExQUhLp162LVqlUICgrCkSNHsHXrVvzzn/8s9zY2bNiAhg0bwszMDG3atMHx48cBAFlZWfD394eTkxMmTpwIIYT0nD179sDX1xeurq6YP3++obGJiIioGjO40IwePRqXL19GcnIyhg0bBicnJ4Oef+bMGURGRmL27Nm4dOkSmjRpghEjRkCn06F3797w8/PDoUOHkJ2dLd3ALy8vD2FhYYiIiEBaWhqSkpL4rd9EREQkMbjQREREwN7eXpouKipCamoq4uLiyvX848ePY/bs2RgwYADc3NwwatQoHD16FFu2bIFGo8H8+fPR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VJn70Dg7OyMrK0tvXkFBASwsLODs7Iy8vLxS85/G0tKyVDkiIiKi6qvKHKHx9/dHWlqaNH3u3DnodDo4OzuXWnb06FHUrVtXjphERERUBVWZQtOxY0dotVqsXLkSADBz5kx0794dpqamCAsLwy+//IKUlBQUFRVhzpw56NGjh8yJawaegiAiIiWoMqeczMzMsHz5ckRERGDixIkwMTHB7t27AQCurq5YsGABevbsCTs7O6jVaukeNURERESyFprH7wQMAGFhYThz5gwOHz6MwMBAuLi4SMuioqLQo0cPnDhxAkFBQbCzs6vsuERERFRFVZkjNI+4u7sjNDT0icu8vb2feMk3ERER1WxVZgwNERER0fNioSEiIiLFY6EhIiIixatyY2iIiIiqiuMv+epN+544LlMSKguP0BAREZHisdAQERGR4rHQEBERkeKx0BAREZHisdAQERGR4rHQEBERkeLxsm2qNPMG9tKbHuj9gUxJiIiouuERGiIiIlI8FhoiIiJSPBYaIiIiUjyOoSEiIiKD/H1MZPTajTIl+R8eoSEiIiLFY6EhIiIixWOhISIiIsVjoSEiIiLFY6EhIiIixWOhISIiIsVjoSEiIiLF431oiIgel+CoP+1dX54cRGQQFhoiA7Vc1VJv+tiwYzIlISKiR3jKiYiIiBSPhYaIiIgUj4WGiIiIFI9jaKjKSEhIeOY0VbK/D45N0MiTg4ioHHiEhoiIiBSPR2iIqMZrELtJ+vN5KxmDENFz4xEaIiIiUjwWGiIiIlI8nnIionL5+w0Fv5cpBxHRk/AIDRERESkeCw0REREpHgsNERERKR4LDRERESkeCw0REREpHgsNERERKR4LDRERESkeCw0REREpHgsNERERKR4LDRERESkeCw0REREpHr/LiegFHX/JV39G50XyBCEiqsF4hIaIiIgUj0doiIjohc0b2EtveqD3BzIloZqKR2iIiIhI8XiEhoiIDLYoapfcEaqEvx+Zil67UaYkxEJDRERkJAkJCc+cporDU05ERESkeDxCQ0REVMO1XNVSb/r7F9yeHEemWGiIiIhqgAaxm6Q/n7eSMYiRsNAQERGVEwdDV10sNEREBuCdoYmqJhYaIiKiCpIbu09/RjU8tVNVsdAQERlRVf4FpzemYnaojEmIXhwv2yYiIiLFU9QRmqysLERGRuL06dMYMWIE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", @@ -428,16 +409,41 @@ "tokens_by_expert_by_layer.plot(kind='bar')\n", "plt.title(\"Token counts for each expert per layer\")\n", "plt.ylabel(\"Average Tokens\")\n", - "plt.xlabel(\"Layer\")" + "plt.xlabel(\"Layer\")\n", + "plt.savefig(\"router-output.log.svg\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.savefig(\"router-output.log.svg\")" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -98258,7 +98264,8 @@ "\n", "ani = FuncAnimation(fig, update_hist, frames=np.arange(0, STEPS, 10), repeat=False)\n", "\n", - "HTML(ani.to_jshtml())\n" + "HTML(ani.to_jshtml())\n", + "plt.savefig(\"router-output.log.svg\")" ] }, { From d0b572109ff67601629f5d6294a277c0a2be25ad Mon Sep 17 00:00:00 2001 From: sepilqi Date: Wed, 31 Jul 2024 17:39:31 +0800 Subject: [PATCH 5/5] update title for FuncAnimation content --- visualize-router-output.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visualize-router-output.ipynb b/visualize-router-output.ipynb index 311b7ae..f3125d3 100644 --- a/visualize-router-output.ipynb +++ b/visualize-router-output.ipynb @@ -448,7 +448,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Average token by step" + "### Average token by step (FuncAnimation)" ] }, {