mod= 10 **9 +7
#import resource
#resource.setrlimit(resource.RLIMIT_STACK, [0x100000000, resource.RLIM_INFINITY])
import threading
threading .stack_size ( 2 **28 )
import sys
sys .setrecursionlimit ( 10 **6 )
#fact=[1]
#for i in range(1,10001):
# fact.append((fact[-1]*i)%mod)
#ifact=[0]*10001
#ifact[10000]=pow(fact[10000],mod-2,mod)
#for i in range(10000,0,-1):
# ifact[i-1]=(i*ifact[i])%mod
from sys import stdin, stdout
import bisect
from bisect import bisect_left as bl #c++ lowerbound bl(array,element)
from bisect import bisect_right as br #c++ upperbound
import itertools
import collections
import math
import heapq
from random import randint as rn
#from Queue import Queue as Q
def modinv( n, p) :
return pow ( n, p-2 , p)
def ncr( n, r, p) : #for using this uncomment the lines calculating fact and ifact
t= ( ( fact[ n] ) *( ( ifact[ r] *ifact[ n-r] ) %p) ) %p
return t
def ain( ) : #takes array as input
return list ( map ( int , sin( ) .split ( ) ) )
def sin( ) :
return input ( ) .strip ( )
def GCD( x, y) :
while ( y) :
x, y = y, x % y
return x
class node:
def __init__ ( self , s, l, p) :
self .child = { }
self .se = s
self .le = l
self .parent = p
self .val = 0
"""**************************************************************************"""
def main( ) :
def sufarr( s) :
n= len ( s)
o= [ 0 ] *n
o[ 0 ] = n-1
f= [ 0 ] *26
f[ 0 ] = 1
for i in range ( n-1 ) :
f[ ord ( s[ i] ) -65 ] += 1
for i in range ( 1 , 26 ) :
f[ i] += f[ i-1 ]
for i in range ( n-2 , -1 , -1 ) :
f[ ord ( s[ i] ) -65 ] -= 1
o[ f[ ord ( s[ i] ) -65 ] ] = i
c= [ 0 ] *n
for i in range ( 1 , n) :
if ( s[ o[ i] ] == s[ o[ i-1 ] ] ) :
c[ o[ i] ] = c[ o[ i-1 ] ]
else :
c[ o[ i] ] = c[ o[ i-1 ] ] +1
l= 1
while ( l< n) :
f= [ 0 ] *n
for i in range ( n) :
f[ c[ i] ] += 1
for i in range ( 1 , n) :
f[ i] += f[ i-1 ]
od= [ 0 ] *n
for i in range ( n-1 , -1 , -1 ) :
pt= ( o[ i] -l) %n
f[ c[ pt] ] -= 1
od[ f[ c[ pt] ] ] = pt
cd = [ 0 ] *n
for i in range ( 1 , n) :
x1= c[ od[ i] ]
y1= c[ ( od[ i] +l) %n]
x2= c[ od[ i-1 ] ]
y2= c[ ( od[ i-1 ] +l) %n]
if ( x1== x2 and y1== y2) :
cd [ od[ i] ] = cd [ od[ i-1 ] ]
else :
cd [ od[ i] ] = cd [ od[ i-1 ] ] +1
o= od[ ::]
c= cd [ ::]
l*= 2
return o
def LCP( o) :
n= len ( o)
poso= [ 0 ] *n
for i in range ( n) :
poso[ o[ i] ] = i
lc= 0
lcp= [ 0 ] *( n-1 )
s= o[ 0 ]
for i in range ( n) :
oi= poso[ s]
if ( oi == n-1 ) :
lc= 0
s= ( s+1 ) %n
continue
ns= o[ oi+1 ]
lc= lcpcal( s, ns, lc-1 )
lcp[ oi] = lc
s= ( s+1 ) %n
return lcp
def lcpcal( i, j, k) :
l= max ( 0 , k)
while ( i+l < len ( st) ) and ( j+l < len ( st) ) :
if ( st[ i+l] == st[ j+l] ) :
l+= 1
else :
break
return l
def suftree( ) :
a= node( -1 , 0 , -1 )
b= node( o[ 0 ] , 1 , a)
a.child [ st[ o[ 0 ] ] ] = b
t= a
a= b
r= 1
for i in range ( 1 , n) :
x= lcp[ i-1 ]
y= o[ i]
while ( r> x) :
r-= a.le
a= a.parent
if ( r== x) :
b= node( y+x, n-( y+x) , a)
a.child [ st[ y+x] ] = b
cloc[ o[ i] ] = b
a= b
else :
q= x-r
k= a.child [ st[ y+r] ]
w1= node( k.se , q, a)
w2= node( y+x, n-( x+y) , w1)
cloc[ o[ i] ] = w2
k.se = w1.se +q
k.le -= q
k.parent = w1
w1.child [ st[ k.se ] ] = k
w1.child [ st[ w2.se ] ] = w2
del a.child [ st[ y+r] ]
a.child [ st[ w1.se ] ] = w1
a= w2
r= n-y
return t
def dfs( x) :
k[ 0 ] += x.le
for i in x.child :
dfs( x.child [ i] )
q= int ( sin( ) )
b= [ ]
for i in range ( q) :
b.append ( sin( ) )
r= b[ ::-1 ]
r.append ( "$" )
st= "" .join ( r)
n= len ( st)
o= sufarr( st)
lcp= LCP( o)
cloc= [ 0 ] *len ( st)
t= suftree( )
k= [ -len ( st) ]
dfs( t)
k= k[ 0 ]
ans= [ k]
j= 0
for i in range ( q-1 ) :
x= len ( r[ i] )
f= j+x
while ( j< f) :
y= cloc[ j]
while ( len ( y.parent .child ) == 1 ) :
k-= y.le
y= y.parent
k-= y.le
k+= 1
a= st[ y.se ]
del y.parent .child [ a]
j+= 1
ans.append ( k)
ans= map ( str , ans[ ::-1 ] )
print "\n " .join ( ans)
######## Python 2 and 3 footer by Pajenegod and c1729
py2 = round ( 0.5 )
if py2:
from future_builtins import ascii, filter , hex , map , oct , zip
range = xrange
import os , sys
from io import IOBase, BytesIO
BUFSIZE = 8192
class FastIO( BytesIO) :
newlines = 0
def __init__ ( self , file ) :
self ._file = file
self ._fd = file .fileno ( )
self .writable = "x" in file .mode or "w" in file .mode
self .write = super ( FastIO, self ) .write if self .writable else None
def _fill( self ) :
s = os .read ( self ._fd, max ( os .fstat ( self ._fd) .st_size , BUFSIZE) )
self .seek ( ( self .tell ( ) , self .seek ( 0 , 2 ) , super ( FastIO, self ) .write ( s) ) [ 0 ] )
return s
def read( self ) :
while self ._fill( ) : pass
return super ( FastIO, self ) .read ( )
def readline ( self ) :
while self .newlines == 0 :
s = self ._fill( ) ; self .newlines = s.count ( b"\n " ) + ( not s)
self .newlines -= 1
return super ( FastIO, self ) .readline ( )
def flush( self ) :
if self .writable :
os .write ( self ._fd, self .getvalue ( ) )
self .truncate ( 0 ) , self .seek ( 0 )
class IOWrapper( IOBase) :
def __init__ ( self , file ) :
self .buffer = FastIO( file )
self .flush = self .buffer .flush
self .writable = self .buffer .writable
if py2:
self .write = self .buffer .write
self .read = self .buffer .read
self .readline = self .buffer .readline
else :
self .write = lambda s:self .buffer .write ( s.encode ( 'ascii' ) )
self .read = lambda :self .buffer .read ( ) .decode ( 'ascii' )
self .readline = lambda :self .buffer .readline ( ) .decode ( 'ascii' )
sys .stdin , sys .stdout = IOWrapper( sys .stdin ) , IOWrapper( sys .stdout )
input = lambda : sys .stdin .readline ( ) .rstrip ( '\r \n ' )
#if __name__ == '__main__':
# main()
threading .Thread ( target= main) .start ( )
bW9kPTEwKio5KzcKI2ltcG9ydCByZXNvdXJjZQojcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSywgWzB4MTAwMDAwMDAwLCByZXNvdXJjZS5STElNX0lORklOSVRZXSkKaW1wb3J0IHRocmVhZGluZwp0aHJlYWRpbmcuc3RhY2tfc2l6ZSgyKioyOCkKaW1wb3J0IHN5cwpzeXMuc2V0cmVjdXJzaW9ubGltaXQoMTAqKjYpCiNmYWN0PVsxXQojZm9yIGkgaW4gcmFuZ2UoMSwxMDAwMSk6CiMgICAgZmFjdC5hcHBlbmQoKGZhY3RbLTFdKmkpJW1vZCkKI2lmYWN0PVswXSoxMDAwMQojaWZhY3RbMTAwMDBdPXBvdyhmYWN0WzEwMDAwXSxtb2QtMixtb2QpCiNmb3IgaSBpbiByYW5nZSgxMDAwMCwwLC0xKToKIyAgICBpZmFjdFtpLTFdPShpKmlmYWN0W2ldKSVtb2QKZnJvbSBzeXMgaW1wb3J0IHN0ZGluLCBzdGRvdXQKaW1wb3J0IGJpc2VjdApmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0X2xlZnQgYXMgYmwgICAgICAgICAgICAgICNjKysgbG93ZXJib3VuZCBibChhcnJheSxlbGVtZW50KQpmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0X3JpZ2h0IGFzIGJyICAgICAgICAgICAgICNjKysgdXBwZXJib3VuZAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgbWF0aAppbXBvcnQgaGVhcHEKZnJvbSByYW5kb20gaW1wb3J0IHJhbmRpbnQgYXMgcm4KI2Zyb20gUXVldWUgaW1wb3J0IFF1ZXVlIGFzIFEKZGVmIG1vZGludihuLHApOgogICAgcmV0dXJuIHBvdyhuLHAtMixwKQpkZWYgbmNyKG4scixwKTogICAgICAgICAgICAgICAgICAgICAgICAjZm9yIHVzaW5nIHRoaXMgdW5jb21tZW50IHRoZSBsaW5lcyBjYWxjdWxhdGluZyBmYWN0IGFuZCBpZmFjdAogICAgdD0oKGZhY3Rbbl0pKigoaWZhY3Rbcl0qaWZhY3Rbbi1yXSklcCkpJXAKICAgIHJldHVybiB0CmRlZiBhaW4oKTogICAgICAgICAgICAgICAgICAgICAgICAgICAjdGFrZXMgYXJyYXkgYXMgaW5wdXQKICAgIHJldHVybiBsaXN0KG1hcChpbnQsc2luKCkuc3BsaXQoKSkpCmRlZiBzaW4oKToKICAgIHJldHVybiBpbnB1dCgpLnN0cmlwKCkKZGVmIEdDRCh4LHkpOgogICAgd2hpbGUoeSk6CiAgICAgICAgeCwgeSA9IHksIHggJSB5CiAgICByZXR1cm4geApjbGFzcyBub2RlOgogICAgZGVmIF9faW5pdF9fKHNlbGYscyxsLHApOgogICAgICAgIHNlbGYuY2hpbGQ9e30KICAgICAgICBzZWxmLnNlPXMKICAgICAgICBzZWxmLmxlPWwKICAgICAgICBzZWxmLnBhcmVudD1wCiAgICAgICAgc2VsZi52YWw9MAoiIiIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIiIgpkZWYgbWFpbigpOgogICAgZGVmIHN1ZmFycihzKToKICAgICAgICBuPWxlbihzKQogICAgICAgIG89WzBdKm4KICAgICAgICBvWzBdPW4tMQogICAgICAgIGY9WzBdKjI2CiAgICAgICAgZlswXT0xCiAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobi0xKToKICAgICAgICAgICAgZltvcmQoc1tpXSktNjVdKz0xCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwyNik6CiAgICAgICAgICAgIGZbaV0rPWZbaS0xXQogICAgICAgIGZvciBpIGluIHJhbmdlKG4tMiwtMSwtMSk6CiAgICAgICAgICAgIGZbb3JkKHNbaV0pLTY1XS09MQogICAgICAgICAgICBvW2Zbb3JkKHNbaV0pLTY1XV09aQogICAgICAgIGM9WzBdKm4KICAgICAgICBmb3IgaSBpbiByYW5nZSgxLG4pOgogICAgICAgICAgICBpZihzW29baV1dPT1zW29baS0xXV0pOgogICAgICAgICAgICAgICAgY1tvW2ldXT1jW29baS0xXV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGNbb1tpXV09Y1tvW2ktMV1dKzEKICAgICAgICBsPTEKICAgICAgICB3aGlsZShsPG4pOgogICAgICAgICAgICBmPVswXSpuCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICAgICAgICAgZltjW2ldXSs9MQogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLG4pOgogICAgICAgICAgICAgICAgZltpXSs9ZltpLTFdCiAgICAgICAgICAgIG9kPVswXSpuCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4tMSwtMSwtMSk6CiAgICAgICAgICAgICAgICBwdD0ob1tpXS1sKSVuCiAgICAgICAgICAgICAgICBmW2NbcHRdXS09MQogICAgICAgICAgICAgICAgb2RbZltjW3B0XV1dPXB0CiAgICAgICAgICAgIGNkPVswXSpuCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsbik6CiAgICAgICAgICAgICAgICB4MT1jW29kW2ldXQogICAgICAgICAgICAgICAgeTE9Y1sob2RbaV0rbCklbl0KICAgICAgICAgICAgICAgIHgyPWNbb2RbaS0xXV0KICAgICAgICAgICAgICAgIHkyPWNbKG9kW2ktMV0rbCklbl0KICAgICAgICAgICAgICAgIGlmKHgxPT14MiBhbmQgeTE9PXkyKToKICAgICAgICAgICAgICAgICAgICBjZFtvZFtpXV09Y2Rbb2RbaS0xXV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY2Rbb2RbaV1dPWNkW29kW2ktMV1dKzEKICAgICAgICAgICAgbz1vZFs6Ol0KICAgICAgICAgICAgYz1jZFs6Ol0KICAgICAgICAgICAgbCo9MgogICAgICAgIHJldHVybiBvCiAgICBkZWYgTENQKG8pOgogICAgICAgIG49bGVuKG8pCiAgICAgICAgcG9zbz1bMF0qbgogICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICAgICBwb3NvW29baV1dPWkKICAgICAgICBsYz0wCiAgICAgICAgbGNwPVswXSoobi0xKQogICAgICAgIHM9b1swXQogICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgogICAgICAgICAgICBvaT1wb3NvW3NdCiAgICAgICAgICAgIGlmKG9pID09IG4tMSk6CiAgICAgICAgICAgICAgICBsYz0wCiAgICAgICAgICAgICAgICBzPShzKzEpJW4KICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIG5zPW9bb2krMV0KICAgICAgICAgICAgbGM9bGNwY2FsKHMsbnMsbGMtMSkKICAgICAgICAgICAgbGNwW29pXT1sYwogICAgICAgICAgICBzPShzKzEpJW4KICAgICAgICByZXR1cm4gbGNwCiAgICBkZWYgbGNwY2FsKGksaixrKToKICAgICAgICBsPW1heCgwLGspCiAgICAgICAgd2hpbGUgKGkrbCA8IGxlbihzdCkpIGFuZCAoaitsIDwgbGVuKHN0KSkgOgogICAgICAgICAgICBpZihzdFtpK2xdPT1zdFtqK2xdKToKICAgICAgICAgICAgICAgIGwrPTEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIGwKICAgIGRlZiBzdWZ0cmVlKCk6CiAgICAgICAgYT1ub2RlKC0xLDAsLTEpCiAgICAgICAgYj1ub2RlKG9bMF0sMSxhKQogICAgICAgIGEuY2hpbGRbc3Rbb1swXV1dPWIKICAgICAgICB0PWEKICAgICAgICBhPWIKICAgICAgICByPTEKICAgICAgICBmb3IgaSBpbiByYW5nZSgxLG4pOgogICAgICAgICAgICB4PWxjcFtpLTFdCiAgICAgICAgICAgIHk9b1tpXQogICAgICAgICAgICB3aGlsZShyPngpOgogICAgICAgICAgICAgICAgci09YS5sZQogICAgICAgICAgICAgICAgYT1hLnBhcmVudAogICAgICAgICAgICBpZihyPT14KToKICAgICAgICAgICAgICAgIGI9bm9kZSh5K3gsbi0oeSt4KSxhKQogICAgICAgICAgICAgICAgYS5jaGlsZFtzdFt5K3hdXT1iCiAgICAgICAgICAgICAgICBjbG9jW29baV1dPWIKICAgICAgICAgICAgICAgIGE9YgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcT14LXIKICAgICAgICAgICAgICAgIGs9YS5jaGlsZFtzdFt5K3JdXQogICAgICAgICAgICAgICAgdzE9bm9kZShrLnNlLHEsYSkKICAgICAgICAgICAgICAgIHcyPW5vZGUoeSt4LG4tKHgreSksdzEpCiAgICAgICAgICAgICAgICBjbG9jW29baV1dPXcyCiAgICAgICAgICAgICAgICBrLnNlPXcxLnNlK3EKICAgICAgICAgICAgICAgIGsubGUtPXEKICAgICAgICAgICAgICAgIGsucGFyZW50PXcxCiAgICAgICAgICAgICAgICB3MS5jaGlsZFtzdFtrLnNlXV09awogICAgICAgICAgICAgICAgdzEuY2hpbGRbc3RbdzIuc2VdXT13MgogICAgICAgICAgICAgICAgZGVsIGEuY2hpbGRbc3RbeStyXV0KICAgICAgICAgICAgICAgIGEuY2hpbGRbc3RbdzEuc2VdXT13MQogICAgICAgICAgICAgICAgYT13MgogICAgICAgICAgICByPW4teQogICAgICAgIHJldHVybiB0CiAgICBkZWYgZGZzKHgpOgogICAgICAgIGtbMF0rPXgubGUKICAgICAgICBmb3IgaSBpbiB4LmNoaWxkOgogICAgICAgICAgICBkZnMoeC5jaGlsZFtpXSkKICAgIHE9aW50KHNpbigpKQogICAgYj1bXQogICAgZm9yIGkgaW4gcmFuZ2UocSk6CiAgICAgICAgYi5hcHBlbmQoc2luKCkpCiAgICByPWJbOjotMV0KICAgIHIuYXBwZW5kKCIkIikKICAgIHN0PSIiLmpvaW4ocikKICAgIG49bGVuKHN0KQogICAgbz1zdWZhcnIoc3QpCiAgICBsY3A9TENQKG8pCiAgICBjbG9jPVswXSpsZW4oc3QpCiAgICB0PXN1ZnRyZWUoKQogICAgaz1bLWxlbihzdCldCiAgICBkZnModCkKICAgIGs9a1swXQogICAgYW5zPVtrXQogICAgaj0wCiAgICBmb3IgaSBpbiByYW5nZShxLTEpOgogICAgICAgIHg9bGVuKHJbaV0pCiAgICAgICAgZj1qK3gKICAgICAgICB3aGlsZShqPGYpOgogICAgICAgICAgICB5PWNsb2Nbal0KICAgICAgICAgICAgd2hpbGUobGVuKHkucGFyZW50LmNoaWxkKT09MSk6CiAgICAgICAgICAgICAgICBrLT15LmxlCiAgICAgICAgICAgICAgICB5PXkucGFyZW50CiAgICAgICAgICAgIGstPXkubGUKICAgICAgICAgICAgays9MQogICAgICAgICAgICBhPXN0W3kuc2VdCiAgICAgICAgICAgIGRlbCB5LnBhcmVudC5jaGlsZFthXQogICAgICAgICAgICBqKz0xCiAgICAgICAgYW5zLmFwcGVuZChrKQogICAgYW5zPW1hcChzdHIsYW5zWzo6LTFdKQogICAgcHJpbnQiXG4iLmpvaW4oYW5zKQojIyMjIyMjIyBQeXRob24gMiBhbmQgMyBmb290ZXIgYnkgUGFqZW5lZ29kIGFuZCBjMTcyOQpweTIgPSByb3VuZCgwLjUpCmlmIHB5MjoKICAgIGZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBhc2NpaSwgZmlsdGVyLCBoZXgsIG1hcCwgb2N0LCB6aXAKICAgIHJhbmdlID0geHJhbmdlCiAKaW1wb3J0IG9zLCBzeXMKZnJvbSBpbyBpbXBvcnQgSU9CYXNlLCBCeXRlc0lPCiAKQlVGU0laRSA9IDgxOTIKY2xhc3MgRmFzdElPKEJ5dGVzSU8pOgogICAgbmV3bGluZXMgPSAwCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6CiAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKICAgICAgICBzZWxmLl9mZCA9IGZpbGUuZmlsZW5vKCkKICAgICAgICBzZWxmLndyaXRhYmxlID0gIngiIGluIGZpbGUubW9kZSBvciAidyIgaW4gZmlsZS5tb2RlCiAgICAgICAgc2VsZi53cml0ZSA9IHN1cGVyKEZhc3RJTywgc2VsZikud3JpdGUgaWYgc2VsZi53cml0YWJsZSBlbHNlIE5vbmUKIAogICAgZGVmIF9maWxsKHNlbGYpOgogICAgICAgIHMgPSBvcy5yZWFkKHNlbGYuX2ZkLCBtYXgob3MuZnN0YXQoc2VsZi5fZmQpLnN0X3NpemUsIEJVRlNJWkUpKQogICAgICAgIHNlbGYuc2Vlaygoc2VsZi50ZWxsKCksIHNlbGYuc2VlaygwLDIpLCBzdXBlcihGYXN0SU8sIHNlbGYpLndyaXRlKHMpKVswXSkKICAgICAgICByZXR1cm4gcwogICAgZGVmIHJlYWQoc2VsZik6CiAgICAgICAgd2hpbGUgc2VsZi5fZmlsbCgpOiBwYXNzCiAgICAgICAgcmV0dXJuIHN1cGVyKEZhc3RJTyxzZWxmKS5yZWFkKCkKIAogICAgZGVmIHJlYWRsaW5lKHNlbGYpOgogICAgICAgIHdoaWxlIHNlbGYubmV3bGluZXMgPT0gMDoKICAgICAgICAgICAgcyA9IHNlbGYuX2ZpbGwoKTsgc2VsZi5uZXdsaW5lcyA9IHMuY291bnQoYiJcbiIpICsgKG5vdCBzKQogICAgICAgIHNlbGYubmV3bGluZXMgLT0gMQogICAgICAgIHJldHVybiBzdXBlcihGYXN0SU8sIHNlbGYpLnJlYWRsaW5lKCkKIAogICAgZGVmIGZsdXNoKHNlbGYpOgogICAgICAgIGlmIHNlbGYud3JpdGFibGU6CiAgICAgICAgICAgIG9zLndyaXRlKHNlbGYuX2ZkLCBzZWxmLmdldHZhbHVlKCkpCiAgICAgICAgICAgIHNlbGYudHJ1bmNhdGUoMCksIHNlbGYuc2VlaygwKQogCmNsYXNzIElPV3JhcHBlcihJT0Jhc2UpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUpOgogICAgICAgIHNlbGYuYnVmZmVyID0gRmFzdElPKGZpbGUpCiAgICAgICAgc2VsZi5mbHVzaCA9IHNlbGYuYnVmZmVyLmZsdXNoCiAgICAgICAgc2VsZi53cml0YWJsZSA9IHNlbGYuYnVmZmVyLndyaXRhYmxlCiAgICAgICAgaWYgcHkyOgogICAgICAgICAgICBzZWxmLndyaXRlID0gc2VsZi5idWZmZXIud3JpdGUKICAgICAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5idWZmZXIucmVhZAogICAgICAgICAgICBzZWxmLnJlYWRsaW5lID0gc2VsZi5idWZmZXIucmVhZGxpbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndyaXRlID0gbGFtYmRhIHM6c2VsZi5idWZmZXIud3JpdGUocy5lbmNvZGUoJ2FzY2lpJykpCiAgICAgICAgICAgIHNlbGYucmVhZCA9IGxhbWJkYTpzZWxmLmJ1ZmZlci5yZWFkKCkuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgICAgIHNlbGYucmVhZGxpbmUgPSBsYW1iZGE6c2VsZi5idWZmZXIucmVhZGxpbmUoKS5kZWNvZGUoJ2FzY2lpJykKIApzeXMuc3RkaW4sIHN5cy5zdGRvdXQgPSBJT1dyYXBwZXIoc3lzLnN0ZGluKSwgSU9XcmFwcGVyKHN5cy5zdGRvdXQpCmlucHV0ID0gbGFtYmRhOiBzeXMuc3RkaW4ucmVhZGxpbmUoKS5yc3RyaXAoJ1xyXG4nKQogCiNpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgojICAgbWFpbigpCnRocmVhZGluZy5UaHJlYWQodGFyZ2V0PW1haW4pLnN0YXJ0KCkKIA==