시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
3 초 128 MB 42 11 3 13.636%

문제

데이터를 압축하는 방법 중에서 상대적으로 간단한 방법은 허프만 트리를 이용하는 것이다. 허프만 트리를 이용하면 한 파일이 포함하고 있는 데이터를 압축하고 압축 해제하는 작업을 손쉽게 할 수 있다. 많은 응용프로그램은 바이너리 허프만 트리를 사용한다. (각 노드는 리프이거나 두 서브 노드를 갖는 경우) 이 문제에서는 임의의 서브 트리의 개수를 갖는 허프만 트리를 사용한다. (N-ary tree)

파일의 내용에 총 Z개의 서로 다른 글자가 있는 경우에 리프 노드의 개수는 Z개이다. 루트에서 리프로 향하는 경로 상에 써 있는 숫자가 그 글자를 어떻게 인코딩할 것인지를 나타낸다. 노드에 써 있는 숫자는 0부터 N-1까지이다.

자주 사용하는 글자를 루트와 가까운 곳에 놓고, 잘 사용하지 않는 글자를 먼 곳에 놓으면, 압축 효율을 늘릴 수 있다. 즉, 한 파일을 압축하는데 있어서 최소 개수의 N-ary 심볼을 사용한 트리를 허프만 트리라고 한다.

이 문제에서, 사용할 허프만 트리는 각 노드가 내부 노드이거나, 글자를 인코딩하는 리프 노드이다. 아무 글자도 인코딩하지 않는 dangling leave는 존재하지 않는다.

아래 그림은 N=3인 경우의 허프만 트리 예시이다. 'a'와 'e'는 심볼 1개로 인코딩 되며, 덜 사용하지 글자인 's'와 'p'는 심볼 2개, 드물게 사용하는 글자인 'x','q','y'는 세 개로 인코딩한다.

디코딩을 해야 원래 파일로 복원할 수 있기 때문에, 한 데이터를 인코딩하는데 사용한 트리를 기억하는 것이 중요하다. 트리를 저장하는 방법에는 여러가지가 있다. 이 문제에서는 모든 Z개의 문자가 사전순으로 하나씩 써있는 파일을 인코딩한 결과를 저장하는 방식으로 트리를 저장할 것이다.

N과 위에서 저장한 트리가 주어졌을 때, 각각의 글자가 어떤 심볼로 인코딩 되는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 아래와 같이 세 줄로 이루어져 있다.

  • 파일에 들어있는 서로 다른 글자의 개수 2 ≤ Z ≤ 20
  • 허프만 트리의 arity를 나타내는 2 ≤ N ≤ 10 (N진 트리로 생각하면 됩니다. N = 2인 경우엔 binary, 3인 경우엔 ternary)
  • 모든 글자가 사전 순으로 한 번씩 나타난 파일을 인코딩 한 결과. 길이는 200을 넘지 않으며, 항상 [0, (N-1)]에 들어있는 숫자로만 이루어져 있다.

Z=5, N=2인 경우에 010011101100은 여러 가지 정답이 나올 수 있다. 하지만, 이 문제에서는 답이 유일한 경우만 입력으로 주어진다.

출력

각각의 테스트 케이스에 대해서, Z줄을 출력해야 한다. 각 줄은 original->encoding 형식이고, original은 글자, encoding은 허프만 트리에 의해서 인코딩된 결과이다. 

예제 입력 1

3
3
2
10011
4
2
000111010
19
10
01234678950515253545556575859

예제 출력 1

0->10
1->0
2->11
0->00
1->011
2->1
3->010
0->0
1->1
2->2
3->3
4->4
5->6
6->7
7->8
8->9
9->50
10->51
11->52
12->53
13->54
14->55
15->56
16->57
17->58
18->59
W3sicHJvYmxlbV9pZCI6Ijc5MDQiLCJwcm9ibGVtX2xhbmciOiIwIiwidGl0bGUiOiJcdWQ1YzhcdWQ1MDRcdWI5Y2MgXHVkMmI4XHViOWFjIiwiZGVzY3JpcHRpb24iOiI8cD5cdWIzNzBcdWM3NzRcdWQxMzBcdWI5N2MgXHVjNTU1XHVjZDk1XHVkNTU4XHViMjk0IFx1YmMyOVx1YmM5NSBcdWM5MTFcdWM1ZDBcdWMxMWMgXHVjMGMxXHViMzAwXHVjODAxXHVjNzNjXHViODVjIFx1YWMwNFx1YjJlOFx1ZDU1YyBcdWJjMjlcdWJjOTVcdWM3NDAgXHVkNWM4XHVkNTA0XHViOWNjIFx1ZDJiOFx1YjlhY1x1Yjk3YyBcdWM3NzRcdWM2YTlcdWQ1NThcdWIyOTQgXHVhYzgzXHVjNzc0XHViMmU0LiBcdWQ1YzhcdWQ1MDRcdWI5Y2MgXHVkMmI4XHViOWFjXHViOTdjIFx1Yzc3NFx1YzZhOVx1ZDU1OFx1YmE3NCBcdWQ1NWMgXHVkMzBjXHVjNzdjXHVjNzc0IFx1ZDNlY1x1ZDU2OFx1ZDU1OFx1YWNlMCBcdWM3ODhcdWIyOTQgXHViMzcwXHVjNzc0XHVkMTMwXHViOTdjIFx1YzU1NVx1Y2Q5NVx1ZDU1OFx1YWNlMCBcdWM1NTVcdWNkOTUgXHVkNTc0XHVjODFjXHVkNTU4XHViMjk0IFx1Yzc5MVx1YzVjNVx1Yzc0NCBcdWMxOTBcdWMyN2RcdWFjOGMgXHVkNTYwIFx1YzIxOCBcdWM3ODhcdWIyZTQuIFx1YjljZVx1Yzc0MCBcdWM3NTFcdWM2YTlcdWQ1MDRcdWI4NWNcdWFkZjhcdWI3YThcdWM3NDAgXHViYzE0XHVjNzc0XHViMTA4XHViOWFjIFx1ZDVjOFx1ZDUwNFx1YjljYyBcdWQyYjhcdWI5YWNcdWI5N2MgXHVjMGFjXHVjNmE5XHVkNTVjXHViMmU0LiAoXHVhYzAxIFx1YjE3OFx1YjRkY1x1YjI5NCBcdWI5YWNcdWQ1MDRcdWM3NzRcdWFjNzBcdWIwOTggXHViNDUwIFx1YzExY1x1YmUwYyBcdWIxNzhcdWI0ZGNcdWI5N2MgXHVhYzE2XHViMjk0IFx1YWNiZFx1YzZiMCkgXHVjNzc0IFx1YmIzOFx1YzgxY1x1YzVkMFx1YzExY1x1YjI5NCBcdWM3ODRcdWM3NThcdWM3NTggXHVjMTFjXHViZTBjIFx1ZDJiOFx1YjlhY1x1Yzc1OCBcdWFjMWNcdWMyMThcdWI5N2MgXHVhYzE2XHViMjk0IFx1ZDVjOFx1ZDUwNFx1YjljYyBcdWQyYjhcdWI5YWNcdWI5N2MgXHVjMGFjXHVjNmE5XHVkNTVjXHViMmU0LiAoTi1hcnkgdHJlZSk8XC9wPlxyXG5cclxuPHA+XHVkMzBjXHVjNzdjXHVjNzU4IFx1YjBiNFx1YzZhOVx1YzVkMCBcdWNkMWQgWlx1YWMxY1x1Yzc1OCBcdWMxMWNcdWI4NWMgXHViMmU0XHViOTc4IFx1YWUwMFx1Yzc5MFx1YWMwMCBcdWM3ODhcdWIyOTQgXHVhY2JkXHVjNmIwXHVjNWQwIFx1YjlhY1x1ZDUwNCBcdWIxNzhcdWI0ZGNcdWM3NTggXHVhYzFjXHVjMjE4XHViMjk0IFpcdWFjMWNcdWM3NzRcdWIyZTQuIFx1YjhlOFx1ZDJiOFx1YzVkMFx1YzExYyBcdWI5YWNcdWQ1MDRcdWI4NWMgXHVkNWE1XHVkNTU4XHViMjk0IFx1YWNiZFx1Yjg1YyBcdWMwYzFcdWM1ZDAgXHVjMzY4IFx1Yzc4OFx1YjI5NCBcdWMyMmJcdWM3OTBcdWFjMDAgXHVhZGY4IFx1YWUwMFx1Yzc5MFx1Yjk3YyBcdWM1YjRcdWI1YmJcdWFjOGMgXHVjNzc4XHVjZjU0XHViNTI5XHVkNTYwIFx1YWM4M1x1Yzc3OFx1YzljMFx1Yjk3YyBcdWIwOThcdWQwYzBcdWIwYjhcdWIyZTQuIFx1YjE3OFx1YjRkY1x1YzVkMCBcdWMzNjggXHVjNzg4XHViMjk0IFx1YzIyYlx1Yzc5MFx1YjI5NCAwXHViZDgwXHVkMTMwIE4tMVx1YWU0Y1x1YzljMFx1Yzc3NFx1YjJlNC48XC9wPlxyXG5cclxuPHA+XHVjNzkwXHVjOGZjIFx1YzBhY1x1YzZhOVx1ZDU1OFx1YjI5NCBcdWFlMDBcdWM3OTBcdWI5N2MgXHViOGU4XHVkMmI4XHVjNjQwIFx1YWMwMFx1YWU0Y1x1YzZiNCBcdWFjZjNcdWM1ZDAgXHViMTkzXHVhY2UwLCBcdWM3OTggXHVjMGFjXHVjNmE5XHVkNTU4XHVjOWMwIFx1YzU0YVx1YjI5NCBcdWFlMDBcdWM3OTBcdWI5N2MgXHViYTNjIFx1YWNmM1x1YzVkMCBcdWIxOTNcdWM3M2NcdWJhNzQsIFx1YzU1NVx1Y2Q5NSBcdWQ2YThcdWM3MjhcdWM3NDQgXHViMjk4XHViOWI0IFx1YzIxOCBcdWM3ODhcdWIyZTQuIFx1Yzk4OSwgXHVkNTVjIFx1ZDMwY1x1Yzc3Y1x1Yzc0NCBcdWM1NTVcdWNkOTVcdWQ1NThcdWIyOTRcdWIzNzAgXHVjNzg4XHVjNWI0XHVjMTFjIFx1Y2Q1Y1x1YzE4YyBcdWFjMWNcdWMyMThcdWM3NTggTi1hcnkgXHVjMmVjXHViY2ZjXHVjNzQ0IFx1YzBhY1x1YzZhOVx1ZDU1YyBcdWQyYjhcdWI5YWNcdWI5N2MgXHVkNWM4XHVkNTA0XHViOWNjIFx1ZDJiOFx1YjlhY1x1Yjc3Y1x1YWNlMCBcdWQ1NWNcdWIyZTQuPFwvcD5cclxuXHJcbjxwPlx1Yzc3NCBcdWJiMzhcdWM4MWNcdWM1ZDBcdWMxMWMsIFx1YzBhY1x1YzZhOVx1ZDU2MCBcdWQ1YzhcdWQ1MDRcdWI5Y2MgXHVkMmI4XHViOWFjXHViMjk0IFx1YWMwMSBcdWIxNzhcdWI0ZGNcdWFjMDAgXHViMGI0XHViZDgwIFx1YjE3OFx1YjRkY1x1Yzc3NFx1YWM3MFx1YjA5OCwgXHVhZTAwXHVjNzkwXHViOTdjIFx1Yzc3OFx1Y2Y1NFx1YjUyOVx1ZDU1OFx1YjI5NCBcdWI5YWNcdWQ1MDQgXHViMTc4XHViNGRjXHVjNzc0XHViMmU0LiBcdWM1NDRcdWJiMzQgXHVhZTAwXHVjNzkwXHViM2M0IFx1Yzc3OFx1Y2Y1NFx1YjUyOVx1ZDU1OFx1YzljMCBcdWM1NGFcdWIyOTQgZGFuZ2xpbmcgbGVhdmVcdWIyOTQgXHVjODc0XHVjN2FjXHVkNTU4XHVjOWMwIFx1YzU0YVx1YjI5NFx1YjJlNC48XC9wPlxyXG5cclxuPHA+XHVjNTQ0XHViNzk4IFx1YWRmOFx1YjliY1x1Yzc0MCBOPTNcdWM3NzggXHVhY2JkXHVjNmIwXHVjNzU4IFx1ZDVjOFx1ZDUwNFx1YjljYyBcdWQyYjhcdWI5YWMgXHVjNjA4XHVjMmRjXHVjNzc0XHViMmU0LiAmIzM5O2EmIzM5O1x1YzY0MCAmIzM5O2UmIzM5O1x1YjI5NCBcdWMyZWNcdWJjZmMgMVx1YWMxY1x1Yjg1YyBcdWM3NzhcdWNmNTRcdWI1MjkgXHViNDE4XHViYTcwLCBcdWIzNWMgXHVjMGFjXHVjNmE5XHVkNTU4XHVjOWMwIFx1YWUwMFx1Yzc5MFx1Yzc3OCAmIzM5O3MmIzM5O1x1YzY0MCAmIzM5O3AmIzM5O1x1YjI5NCBcdWMyZWNcdWJjZmMgMlx1YWMxYywgXHViNGRjXHViYjNjXHVhYzhjIFx1YzBhY1x1YzZhOVx1ZDU1OFx1YjI5NCBcdWFlMDBcdWM3OTBcdWM3NzggJiMzOTt4JiMzOTssJiMzOTtxJiMzOTssJiMzOTt5JiMzOTtcdWIyOTQgXHVjMTM4IFx1YWMxY1x1Yjg1YyBcdWM3NzhcdWNmNTRcdWI1MjlcdWQ1NWNcdWIyZTQuPFwvcD5cclxuXHJcbjxwPjxpbWcgYWx0PVwiXCIgc3JjPVwiXC91cGxvYWRcL2ltYWdlc1wvaG10cmVlLnBuZ1wiIHN0eWxlPVwiaGVpZ2h0OjI4NnB4OyB3aWR0aDoyOTFweFwiIFwvPjxcL3A+XHJcblxyXG48cD5cdWI1MTRcdWNmNTRcdWI1MjlcdWM3NDQgXHVkNTc0XHVjNTdjIFx1YzZkMFx1Yjc5OCBcdWQzMGNcdWM3N2NcdWI4NWMgXHViY2Y1XHVjNmQwXHVkNTYwIFx1YzIxOCBcdWM3ODhcdWFlMzAgXHViNTRjXHViYjM4XHVjNWQwLCBcdWQ1NWMgXHViMzcwXHVjNzc0XHVkMTMwXHViOTdjIFx1Yzc3OFx1Y2Y1NFx1YjUyOVx1ZDU1OFx1YjI5NFx1YjM3MCBcdWMwYWNcdWM2YTlcdWQ1NWMgXHVkMmI4XHViOWFjXHViOTdjIFx1YWUzMFx1YzViNVx1ZDU1OFx1YjI5NCBcdWFjODNcdWM3NzQgXHVjOTExXHVjNjk0XHVkNTU4XHViMmU0LiBcdWQyYjhcdWI5YWNcdWI5N2MgXHVjODAwXHVjN2E1XHVkNTU4XHViMjk0IFx1YmMyOVx1YmM5NVx1YzVkMFx1YjI5NCBcdWM1ZWNcdWI3ZWNcdWFjMDBcdWM5YzBcdWFjMDAgXHVjNzg4XHViMmU0LiBcdWM3NzQgXHViYjM4XHVjODFjXHVjNWQwXHVjMTFjXHViMjk0IFx1YmFhOFx1YjRlMCBaXHVhYzFjXHVjNzU4IFx1YmIzOFx1Yzc5MFx1YWMwMCBcdWMwYWNcdWM4MDRcdWMyMWNcdWM3M2NcdWI4NWMgXHVkNTU4XHViMDk4XHVjNTI5IFx1YzM2OFx1Yzc4OFx1YjI5NCBcdWQzMGNcdWM3N2NcdWM3NDQgXHVjNzc4XHVjZjU0XHViNTI5XHVkNTVjIFx1YWNiMFx1YWNmY1x1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NThcdWIyOTQgXHViYzI5XHVjMmRkXHVjNzNjXHViODVjIFx1ZDJiOFx1YjlhY1x1Yjk3YyBcdWM4MDBcdWM3YTVcdWQ1NjAgXHVhYzgzXHVjNzc0XHViMmU0LjxcL3A+XHJcblxyXG48cD5OXHVhY2ZjIFx1YzcwNFx1YzVkMFx1YzExYyBcdWM4MDBcdWM3YTVcdWQ1NWMgXHVkMmI4XHViOWFjXHVhYzAwIFx1YzhmY1x1YzViNFx1Yzg0Y1x1Yzc0NCBcdWI1NGMsIFx1YWMwMVx1YWMwMVx1Yzc1OCBcdWFlMDBcdWM3OTBcdWFjMDAgXHVjNWI0XHViNWE0IFx1YzJlY1x1YmNmY1x1Yjg1YyBcdWM3NzhcdWNmNTRcdWI1MjkgXHViNDE4XHViMjk0XHVjOWMwIFx1YWQ2Y1x1ZDU1OFx1YjI5NCBcdWQ1MDRcdWI4NWNcdWFkZjhcdWI3YThcdWM3NDQgXHVjNzkxXHVjMTMxXHVkNTU4XHVjMmRjXHVjNjI0LjxcL3A+XHJcbiIsImlucHV0IjoiPHA+XHVjY2FiXHVjOWY4IFx1YzkwNFx1YzVkMCBcdWQxNGNcdWMyYTRcdWQyYjggXHVjZjAwXHVjNzc0XHVjMmE0XHVjNzU4IFx1YWMxY1x1YzIxOCBUXHVhYzAwIFx1YzhmY1x1YzViNFx1YzljNFx1YjJlNC4gXHVhYzAxIFx1ZDE0Y1x1YzJhNFx1ZDJiOCBcdWNmMDBcdWM3NzRcdWMyYTRcdWIyOTQgXHVjNTQ0XHViNzk4XHVjNjQwIFx1YWMxOVx1Yzc3NCBcdWMxMzggXHVjOTA0XHViODVjIFx1Yzc3NFx1YjhlOFx1YzViNFx1YzgzOCBcdWM3ODhcdWIyZTQuPFwvcD5cclxuXHJcbjx1bD5cclxuXHQ8bGk+XHVkMzBjXHVjNzdjXHVjNWQwIFx1YjRlNFx1YzViNFx1Yzc4OFx1YjI5NCBcdWMxMWNcdWI4NWMgXHViMmU0XHViOTc4IFx1YWUwMFx1Yzc5MFx1Yzc1OCBcdWFjMWNcdWMyMTggMiAmbGU7IFogJmxlOyAyMDxcL2xpPlxyXG5cdDxsaT5cdWQ1YzhcdWQ1MDRcdWI5Y2MgXHVkMmI4XHViOWFjXHVjNzU4IGFyaXR5XHViOTdjIFx1YjA5OFx1ZDBjMFx1YjBiNFx1YjI5NCAyICZsZTsgTiAmbGU7IDEwIChOXHVjOWM0IFx1ZDJiOFx1YjlhY1x1Yjg1YyBcdWMwZGRcdWFjMDFcdWQ1NThcdWJhNzQgXHViNDI5XHViMmM4XHViMmU0LiBOID0gMlx1Yzc3OCBcdWFjYmRcdWM2YjBcdWM1ZDQgYmluYXJ5LCAzXHVjNzc4IFx1YWNiZFx1YzZiMFx1YzVkNCB0ZXJuYXJ5KTxcL2xpPlxyXG5cdDxsaT5cdWJhYThcdWI0ZTAgXHVhZTAwXHVjNzkwXHVhYzAwIFx1YzBhY1x1YzgwNCBcdWMyMWNcdWM3M2NcdWI4NWMgXHVkNTVjIFx1YmM4OFx1YzUyOSBcdWIwOThcdWQwYzBcdWIwOWMgXHVkMzBjXHVjNzdjXHVjNzQ0IFx1Yzc3OFx1Y2Y1NFx1YjUyOSBcdWQ1NWMgXHVhY2IwXHVhY2ZjLiBcdWFlMzhcdWM3NzRcdWIyOTQgMjAwXHVjNzQ0IFx1YjExOFx1YzljMCBcdWM1NGFcdWM3M2NcdWJhNzAsIFx1ZDU2ZFx1YzBjMSBbMCwgKE4tMSldXHVjNWQwIFx1YjRlNFx1YzViNFx1Yzc4OFx1YjI5NCBcdWMyMmJcdWM3OTBcdWI4NWNcdWI5Y2MgXHVjNzc0XHViOGU4XHVjNWI0XHVjODM4IFx1Yzc4OFx1YjJlNC48XC9saT5cclxuPFwvdWw+XHJcblxyXG48cD5aPTUsIE49Mlx1Yzc3OCBcdWFjYmRcdWM2YjBcdWM1ZDAgMDEwMDExMTAxMTAwXHVjNzQwIFx1YzVlY1x1YjdlYyBcdWFjMDBcdWM5YzAgXHVjODE1XHViMmY1XHVjNzc0IFx1YjA5OFx1YzYyYyBcdWMyMTggXHVjNzg4XHViMmU0LiBcdWQ1NThcdWM5YzBcdWI5Y2MsIFx1Yzc3NCBcdWJiMzhcdWM4MWNcdWM1ZDBcdWMxMWNcdWIyOTQgXHViMmY1XHVjNzc0IFx1YzcyMFx1Yzc3Y1x1ZDU1YyBcdWFjYmRcdWM2YjBcdWI5Y2MgXHVjNzg1XHViODI1XHVjNzNjXHViODVjIFx1YzhmY1x1YzViNFx1YzljNFx1YjJlNC48XC9wPlxyXG4iLCJvdXRwdXQiOiI8cD5cdWFjMDFcdWFjMDFcdWM3NTggXHVkMTRjXHVjMmE0XHVkMmI4IFx1Y2YwMFx1Yzc3NFx1YzJhNFx1YzVkMCBcdWIzMDBcdWQ1NzRcdWMxMWMsIFpcdWM5MDRcdWM3NDQgXHVjZDljXHViODI1XHVkNTc0XHVjNTdjIFx1ZDU1Y1x1YjJlNC4gXHVhYzAxIFx1YzkwNFx1Yzc0MCBvcmlnaW5hbC0mZ3Q7ZW5jb2RpbmcgXHVkNjE1XHVjMmRkXHVjNzc0XHVhY2UwLCBvcmlnaW5hbFx1Yzc0MCBcdWFlMDBcdWM3OTAsIGVuY29kaW5nXHVjNzQwIFx1ZDVjOFx1ZDUwNFx1YjljYyBcdWQyYjhcdWI5YWNcdWM1ZDAgXHVjNzU4XHVkNTc0XHVjMTFjIFx1Yzc3OFx1Y2Y1NFx1YjUyOVx1YjQxYyBcdWFjYjBcdWFjZmNcdWM3NzRcdWIyZTQuJm5ic3A7PFwvcD5cclxuIiwiaGludCI6IiIsIm9yaWdpbmFsIjoiMCIsInByb2JsZW1fbGFuZ19jb2RlIjoiXHVkNTVjXHVhZDZkXHVjNWI0In0seyJwcm9ibGVtX2lkIjoiNzkwNCIsInByb2JsZW1fbGFuZyI6IjEiLCJ0aXRsZSI6Ikh1ZmZtYW4gVHJlZXMiLCJkZXNjcmlwdGlvbiI6IjxwPkEgcmVsYXRpdmVseSBzaW1wbGUgbWV0aG9kIGZvciBjb21wcmVzc2luZyBkYXRhIHdvcmtzIGJ5IGNyZWF0aW5nIGEgc28tY2FsbGVkIEh1ZmZtYW4gdHJlZSBmb3IgYSBcdWZiMDFsZSBhbmQgdXNpbmcgaXQgdG8gY29tcHJlc3MgYW5kIGRlY29tcHJlc3MgdGhlIGRhdGEgaXQgY29udGFpbnMuIEZvciBtb3N0IGFwcGxpY2F0aW9ucywgYmluYXJ5IEh1ZmZtYW4gdHJlZXMgYXJlIHVzZWQgKGkuZS4sIGVhY2ggbm9kZSBpcyBlaXRoZXIgYSBsZWFmIG9yIGhhcyBleGFjdGx5IHR3byBzdWItbm9kZXMpLiBPbmUgY2FuLCBob3dldmVyLCBjb25zdHJ1Y3QgSHVmZm1hbiB0cmVlcyB3aXRoIGFuIGFyYml0cmFyeSBudW1iZXIgb2Ygc3ViLXRyZWVzIChpLmUsIHRlcm5hcnkgb3IsIGluIGdlbmVyYWwsIE4tYXJ5IHRyZWVzKS48XC9wPlxyXG5cclxuPHA+QSBIdWZmbWFuIHRyZWUgZm9yIGEgXHVmYjAxbGUgY29udGFpbmluZyBaIGRpZmZlcmVudCBjaGFyYWN0ZXJzIGhhcyBaIGxlYXZlcy4gVGhlIHBhdGggZnJvbSB0aGUgcm9vdCB0byBhIGxlYWYgdGhhdCByZXByZXNlbnRzIGEgY2VydGFpbiBjaGFyYWN0ZXIgZGV0ZXJtaW5lcyBpdHMgZW5jb2Rpbmc7IGVhY2ggc3RlcCB0b3dhcmRzIHRoZSBsZWFmIGRldGVybWluZXMgYW4gZW5jb2RpbmcgY2hhcmFjdGVyICh3aGljaCBjYW4gYmUgMCwgMSwgLi4uLCAoTiAxKSkuIEJ5IHBsYWNpbmcgb2Z0ZW4tb2NjdXJyaW5nIGNoYXJhY3RlcnMgY2xvc2VyIHRvIHRoZSByb290LCBhbmQgbGVzcyBvZnRlbiBvY2N1cnJpbmcgY2hhcmFjdGVycyBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgcm9vdCwgdGhlIGRlc2lyYWJsZSBjb21wcmVzc2lvbiBpcyBhY2hpZXZlZC4gU3RyaWN0bHkgc3BlYWtpbmcsIHN1Y2ggYSB0cmVlIGlzIGEgSHVmZm1hbiB0cmVlIG9ubHkgaWYgdGhlIHJlc3VsdGluZyBlbmNvZGluZyB0YWtlcyB0aGUgbWluaW1hbCBudW1iZXIgb2ZOLWFyeSBzeW1ib2xzIHRvIGVuY29kZSB0aGUgY29tcGxldGUgXHVmYjAxbGUuPFwvcD5cclxuXHJcbjxwPkZvciB0aGlzIHByb2JsZW0sIHdlIG9ubHkgY29uc2lkZXIgdHJlZXMgd2hlcmUgZWFjaCBub2RlIGlzIGVpdGhlciBhbiBpbnRlcm5hbCBub2RlLCBvciBhIGxlYWYgZW5jb2RpbmcgYSBjaGFyYWN0ZXI7IHRoZXJlIGFyZSBubyBkYW5nbGluZyBsZWF2ZXN0aGF0IGRvIG5vdCBlbmNvZGUgZm9yIGEgY2hhcmFjdGVyLjxcL3A+XHJcblxyXG48cD5UaGUgXHVmYjAxZ3VyZSBiZWxvdyBzaG93cyBhIHNhbXBsZSB0ZXJuYXJ5IEh1ZmZtYW4gdHJlZTsgdGhlIGNoYXJhY3RlcnMgJnJzcXVvO2EmcnNxdW87IGFuZCAmcnNxdW87ZSZyc3F1bzsgYXJlIGVuY29kZWQgdXNpbmcgb25lIHRlcm5hcnkgc3ltYm9sOyB0aGUgbGVzcyBmcmVxdWVudGx5IG9jY3VycmluZyBjaGFyYWN0ZXJzICZyc3F1bztzJnJzcXVvOyBhbmQgJnJzcXVvO3AmcnNxdW87IGFyZSBlbmNvZGVkIHVzaW5nIHR3byB0ZXJuYXJ5IHN5bWJvbHM7IGFuZCB0aGUgdmVyeSByYXJlIHN5bWJvbHMgJnJzcXVvO3gmcnNxdW87LCAmcnNxdW87cSZyc3F1bzsgYW5kICZyc3F1bzt5JnJzcXVvOyBhcmUgZW5jb2RlZCB1c2luZyB0aHJlZSB0ZXJuYXJ5IHN5bWJvbHMgZWFjaC48XC9wPlxyXG5cclxuPHA+PGltZyBhbHQ9XCJcIiBzcmM9XCJcL3VwbG9hZFwvaW1hZ2VzXC9obXRyZWUucG5nXCIgc3R5bGU9XCJoZWlnaHQ6Mjg2cHg7IHdpZHRoOjI5MXB4XCIgXC8+PFwvcD5cclxuXHJcbjxwPk9mIGNvdXJzZSwgaWYgd2Ugd2FudCB0byBkZWNvbXByZXNzIGEgbGlzdCBvZiBOLWFyeSBzeW1ib2xzIGxhdGVyIG9uLCBpdCBpcyBpbXBvcnRhbnQgdG8ga25vdyB3aGljaCB0cmVlIHdhcyB1c2VkIHRvIGNvbXByZXNzIHRoZSBkYXRhLiBUaGlzIGNhbiBiZSBkb25lIGluIHNldmVyYWwgd2F5cy4gSW4gdGhpcyBwcm9ibGVtIHdlIHVzZSB0aGUgZm9sbG93aW5nIG1ldGhvZDogdGhlIHN0cmVhbSBvZiBkYXRhIHdpbGwgYmUgcHJlY2VkZWQgYnkgYSBoZWFkZXIgY29uc2lzdGluZyBvZiB0aGUgZW5jb2RlZCB2ZXJzaW9ucyBvZiB0aGUgWiBjaGFyYWN0ZXJzIG9jY3VycmluZyBpbiB0aGUgb3JpZ2luYWwgXHVmYjAxbGUsIGluIGxleGljb2dyYXBoaWNhbCBvcmRlci48XC9wPlxyXG5cclxuPHA+R2l2ZW4gdGhlIG51bWJlciBvZiBzb3VyY2Ugc3ltYm9scyBaLCBhIHZhbHVlIE4gZGVub3RpbmcgdGhlICZyc3F1bzthcml0eSZyc3F1bzsgb2YgdGhlIEh1ZmZtYW4gdHJlZSwgYW5kIGEgaGVhZGVyLCBnaXZlIHRoZSBtYXBwaW5nIGZyb20gc291cmNlIHN5bWJvbHMgdG8gZW5jb2RlZCBzeW1ib2xzLjxcL3A+XHJcbiIsImlucHV0IjoiPHA+VGhlIGlucHV0IHN0YXJ0cyB3aXRoIGEgc2luZ2xlIGludGVnZXIgVCBvbiBhIHNlcGFyYXRlIGxpbmUsIGRlbm90aW5nIHRoZSBudW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0Jm5ic3A7Zm9sbG93LiBOZXh0LCBmb3IgZWFjaCBvZiB0aGUgVCB0ZXN0IGNhc2VzLCB0aHJlZSBsaW5lcyBmb2xsb3c6PFwvcD5cclxuXHJcbjx1bD5cclxuXHQ8bGk+VGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY2hhcmFjdGVycyBpbiB0aGUgXHVmYjAxbGUgKDIgJmxlOyBaICZsZTsgMjApOzxcL2xpPlxyXG5cdDxsaT5UaGUgbnVtYmVyIE4sIGRlbm90aW5nIHRoZSAmcnNxdW87YXJpdHkmcnNxdW87IG9mIHRoZSBIdWZmbWFuIHRyZWUgKDIgJmxlOyBOICZsZTsgMTApOzxcL2xpPlxyXG5cdDxsaT5BIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGhlYWRlciBvZiB0aGUgcmVjZWl2ZWQgbWVzc2FnZTsgZWFjaCBjaGFyYWN0ZXIgd2lsbCBiZSBhIGRpZ2l0IGluIHRoZSByYW5nZSBbMCwgTi0xXS4gVGhpcyBzdHJpbmcgd2lsbCBjb250YWluIGxlc3MgdGhhbiAyMDAgY2hhcmFjdGVycy48XC9saT5cclxuPFwvdWw+XHJcblxyXG48cD5Ob3RlOiBBbHRob3VnaCByYXJlLCBpdCBpcyBwb3NzaWJsZSBmb3IgYSBoZWFkZXIgdG8gaGF2ZSBtdWx0aXBsZSBpbnRlcnByZXRhdGlvbnMgKGUuZy4sIHRoZSBoZWFkZXIgJnJzcXVvOzAxMDAxMTEwMTEwMCZyc3F1bzsgd2l0aCBaID0gNSBhbmQgTiA9IDIpLiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgYWxsIGNhc2VzIGluIHRoZSB0ZXN0IGlucHV0IGhhdmUgYSB1bmlxdWUgc29sdXRpb24uPFwvcD5cclxuIiwib3V0cHV0IjoiPHA+Rm9yIGVhY2ggb2YgdGhlIFQgdGVzdC1jYXNlcywgcHJpbnQgWiBsaW5lcyBnaXZpbmcgdGhlIGVuY29kZWQgdmVyc2lvbiBvZiBlYWNoIG9mIHRoZSBaIGNoYXJhY3RlcnMgaW4gdGhlIHRlc3RjYXNlIGluIGFzY2VuZGluZyBvcmRlci4gVXNlIHRoZSBmb3JtYXQgb3JpZ2luYWwtJmd0O2VuY29kaW5nLCB3aGVyZSBvcmlnaW5hbCBpcyBhIGRlY2ltYWwgdmFsdWUgaW4gdGhlIHJhbmdlIFswLCAoWiAtIDEpXSwgYW5kIGVuY29kaW5nIGlzIHRoZSBzdHJpbmcgb2YgZW5jb2RpbmcgZGlnaXRzIGZvciB0aGlzIHN5bWJvbCAoZWFjaCBkaWdpdCBpcyAmZ2U7IDAgYW5kICZsdDsgTikuPFwvcD5cclxuIiwiaGludCI6IiIsIm9yaWdpbmFsIjoiMSIsInByb2JsZW1fbGFuZ19jb2RlIjoiXHVjNjAxXHVjNWI0In1d