# License of this script, not of the application it contains: # # Copyright Erik Veenstra # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License, # version 2, as published by the Free Software Foundation. # # This program is distributed in the hope that it will be # useful, but WITHOUT ANY WARRANTY; without even the implied # warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public # License along with this program; if not, write to the Free # Software Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307 USA. # Parts of this code are based on code from Thomas Hurst # . # Tar2RubyScript constants unless defined?(BLOCKSIZE) ShowContent = ARGV.include?("--tar2rubyscript-list") JustExtract = ARGV.include?("--tar2rubyscript-justextract") ToTar = ARGV.include?("--tar2rubyscript-totar") Preserve = ARGV.include?("--tar2rubyscript-preserve") end ARGV.concat [] ARGV.delete_if{|arg| arg =~ /^--tar2rubyscript-/} ARGV << "--tar2rubyscript-preserve" if Preserve # Tar constants unless defined?(BLOCKSIZE) BLOCKSIZE = 512 NAMELEN = 100 MODELEN = 8 UIDLEN = 8 GIDLEN = 8 CHKSUMLEN = 8 SIZELEN = 12 MAGICLEN = 8 MODTIMELEN = 12 UNAMELEN = 32 GNAMELEN = 32 DEVLEN = 8 TMAGIC = "ustar" GNU_TMAGIC = "ustar " SOLARIS_TMAGIC = "ustar\00000" MAGICS = [TMAGIC, GNU_TMAGIC, SOLARIS_TMAGIC] LF_OLDFILE = '\0' LF_FILE = '0' LF_LINK = '1' LF_SYMLINK = '2' LF_CHAR = '3' LF_BLOCK = '4' LF_DIR = '5' LF_FIFO = '6' LF_CONTIG = '7' GNUTYPE_DUMPDIR = 'D' GNUTYPE_LONGLINK = 'K' # Identifies the *next* file on the tape as having a long linkname. GNUTYPE_LONGNAME = 'L' # Identifies the *next* file on the tape as having a long name. GNUTYPE_MULTIVOL = 'M' # This is the continuation of a file that began on another volume. GNUTYPE_NAMES = 'N' # For storing filenames that do not fit into the main header. GNUTYPE_SPARSE = 'S' # This is for sparse files. GNUTYPE_VOLHDR = 'V' # This file is a tape/volume header. Ignore it on extraction. end class Dir def self.rm_rf(entry) begin File.chmod(0755, entry) rescue end if File.ftype(entry) == "directory" pdir = Dir.pwd Dir.chdir(entry) Dir.open(".") do |d| d.each do |e| Dir.rm_rf(e) if not [".", ".."].include?(e) end end Dir.chdir(pdir) begin Dir.delete(entry) rescue => e $stderr.puts e.message end else begin File.delete(entry) rescue => e $stderr.puts e.message end end end end class Reader def initialize(filehandle) @fp = filehandle end def extract each do |entry| entry.extract end end def list each do |entry| entry.list end end def each @fp.rewind while entry = next_entry yield(entry) end end def next_entry buf = @fp.read(BLOCKSIZE) if buf.length < BLOCKSIZE or buf == "\000" * BLOCKSIZE entry = nil else entry = Entry.new(buf, @fp) end entry end end class Entry attr_reader(:header, :data) def initialize(header, fp) @header = Header.new(header) readdata = lambda do |header| padding = (BLOCKSIZE - (header.size % BLOCKSIZE)) % BLOCKSIZE @data = fp.read(header.size) if header.size > 0 dummy = fp.read(padding) if padding > 0 end readdata.call(@header) if @header.longname? gnuname = @data[0..-2] header = fp.read(BLOCKSIZE) @header = Header.new(header) @header.name = gnuname readdata.call(@header) end end def extract if not @header.name.empty? if @header.symlink? begin File.symlink(@header.linkname, @header.name) rescue SystemCallError => e $stderr.puts "Couldn't create symlink #{@header.name}: " + e.message end elsif @header.link? begin File.link(@header.linkname, @header.name) rescue SystemCallError => e $stderr.puts "Couldn't create link #{@header.name}: " + e.message end elsif @header.dir? begin Dir.mkdir(@header.name, @header.mode) rescue SystemCallError => e $stderr.puts "Couldn't create dir #{@header.name}: " + e.message end elsif @header.file? begin File.open(@header.name, "wb") do |fp| fp.write(@data) fp.chmod(@header.mode) end rescue => e $stderr.puts "Couldn't create file #{@header.name}: " + e.message end else $stderr.puts "Couldn't handle entry #{@header.name} (flag=#{@header.linkflag.inspect})." end #File.chown(@header.uid, @header.gid, @header.name) #File.utime(Time.now, @header.mtime, @header.name) end end def list if not @header.name.empty? if @header.symlink? $stderr.puts "s %s -> %s" % [@header.name, @header.linkname] elsif @header.link? $stderr.puts "l %s -> %s" % [@header.name, @header.linkname] elsif @header.dir? $stderr.puts "d %s" % [@header.name] elsif @header.file? $stderr.puts "f %s (%s)" % [@header.name, @header.size] else $stderr.puts "Couldn't handle entry #{@header.name} (flag=#{@header.linkflag.inspect})." end end end end class Header attr_reader(:name, :uid, :gid, :size, :mtime, :uname, :gname, :mode, :linkflag, :linkname) attr_writer(:name) def initialize(header) fields = header.unpack('A100 A8 A8 A8 A12 A12 A8 A1 A100 A8 A32 A32 A8 A8') types = ['str', 'oct', 'oct', 'oct', 'oct', 'time', 'oct', 'str', 'str', 'str', 'str', 'str', 'oct', 'oct'] begin converted = [] while field = fields.shift type = types.shift case type when 'str' then converted.push(field) when 'oct' then converted.push(field.oct) when 'time' then converted.push(Time::at(field.oct)) end end @name, @mode, @uid, @gid, @size, @mtime, @chksum, @linkflag, @linkname, @magic, @uname, @gname, @devmajor, @devminor = converted @name.gsub!(/^\.\//, "") @linkname.gsub!(/^\.\//, "") @raw = header rescue ArgumentError => e raise "Couldn't determine a real value for a field (#{field})" end raise "Magic header value #{@magic.inspect} is invalid." if not MAGICS.include?(@magic) @linkflag = LF_FILE if @linkflag == LF_OLDFILE or @linkflag == LF_CONTIG @linkflag = LF_DIR if @linkflag == LF_FILE and @name[-1] == '/' @size = 0 if @size < 0 end def file? @linkflag == LF_FILE end def dir? @linkflag == LF_DIR end def symlink? @linkflag == LF_SYMLINK end def link? @linkflag == LF_LINK end def longname? @linkflag == GNUTYPE_LONGNAME end end class Content @@count = 0 unless defined?(@@count) def initialize @@count += 1 @archive = File.open(File.expand_path(__FILE__), "rb"){|f| f.read}.gsub(/\r/, "").split(/\n\n/)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift temp = ENV["TEMP"] temp = "/tmp" if temp.nil? temp = File.expand_path(temp) @tempfile = "#{temp}/tar2rubyscript.f.#{Process.pid}.#{@@count}" end def list begin File.open(@tempfile, "wb") {|f| f.write @archive} File.open(@tempfile, "rb") {|f| Reader.new(f).list} ensure File.delete(@tempfile) end self end def cleanup @archive = nil self end end class TempSpace @@count = 0 unless defined?(@@count) def initialize @@count += 1 @archive = File.open(File.expand_path(__FILE__), "rb"){|f| f.read}.gsub(/\r/, "").split(/\n\n/)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift @olddir = Dir.pwd temp = ENV["TEMP"] temp = "/tmp" if temp.nil? temp = File.expand_path(temp) @tempfile = "#{temp}/tar2rubyscript.f.#{Process.pid}.#{@@count}" @tempdir = "#{temp}/tar2rubyscript.d.#{Process.pid}.#{@@count}" @@tempspace = self @newdir = @tempdir @touchthread = Thread.new do loop do sleep 60*60 touch(@tempdir) touch(@tempfile) end end end def extract Dir.rm_rf(@tempdir) if File.exists?(@tempdir) Dir.mkdir(@tempdir) newlocation do # Create the temp environment. File.open(@tempfile, "wb") {|f| f.write @archive} File.open(@tempfile, "rb") {|f| Reader.new(f).extract} # Eventually look for a subdirectory. entries = Dir.entries(".") entries.delete(".") entries.delete("..") if entries.length == 1 entry = entries.shift.dup if File.directory?(entry) @newdir = "#{@tempdir}/#{entry}" end end end # Remember all File objects. @ioobjects = [] ObjectSpace::each_object(File) do |obj| @ioobjects << obj end at_exit do @touchthread.kill # Close all File objects, opened in init.rb . ObjectSpace::each_object(File) do |obj| obj.close if (not obj.closed? and not @ioobjects.include?(obj)) end # Remove the temp environment. Dir.chdir(@olddir) Dir.rm_rf(@tempfile) Dir.rm_rf(@tempdir) end self end def cleanup @archive = nil self end def touch(entry) entry = entry.gsub!(/[\/\\]*$/, "") unless entry.nil? return unless File.exists?(entry) if File.directory?(entry) pdir = Dir.pwd begin Dir.chdir(entry) begin Dir.open(".") do |d| d.each do |e| touch(e) unless [".", ".."].include?(e) end end ensure Dir.chdir(pdir) end rescue Errno::EACCES => error $stderr.puts error end else File.utime(Time.now, File.mtime(entry), entry) end end def oldlocation(file="") if block_given? pdir = Dir.pwd Dir.chdir(@olddir) res = yield Dir.chdir(pdir) else res = File.expand_path(file, @olddir) if not file.nil? end res end def newlocation(file="") if block_given? pdir = Dir.pwd Dir.chdir(@newdir) res = yield Dir.chdir(pdir) else res = File.expand_path(file, @newdir) if not file.nil? end res end def templocation(file="") if block_given? pdir = Dir.pwd Dir.chdir(@tempdir) res = yield Dir.chdir(pdir) else res = File.expand_path(file, @tempdir) if not file.nil? end res end def self.oldlocation(file="") if block_given? @@tempspace.oldlocation { yield } else @@tempspace.oldlocation(file) end end def self.newlocation(file="") if block_given? @@tempspace.newlocation { yield } else @@tempspace.newlocation(file) end end def self.templocation(file="") if block_given? @@tempspace.templocation { yield } else @@tempspace.templocation(file) end end end class Extract @@count = 0 unless defined?(@@count) def initialize @archive = File.open(File.expand_path(__FILE__), "rb"){|f| f.read}.gsub(/\r/, "").split(/\n\n/)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift temp = ENV["TEMP"] temp = "/tmp" if temp.nil? @tempfile = "#{temp}/tar2rubyscript.f.#{Process.pid}.#{@@count += 1}" end def extract begin File.open(@tempfile, "wb") {|f| f.write @archive} File.open(@tempfile, "rb") {|f| Reader.new(f).extract} ensure File.delete(@tempfile) end self end def cleanup @archive = nil self end end class MakeTar def initialize @archive = File.open(File.expand_path(__FILE__), "rb"){|f| f.read}.gsub(/\r/, "").split(/\n\n/)[-1].split("\n").collect{|s| s[2..-1]}.join("\n").unpack("m").shift @tarfile = File.expand_path(__FILE__).gsub(/\.rbw?$/, "") + ".tar" end def extract File.open(@tarfile, "wb") {|f| f.write @archive} self end def cleanup @archive = nil self end end def oldlocation(file="") if block_given? TempSpace.oldlocation { yield } else TempSpace.oldlocation(file) end end def newlocation(file="") if block_given? TempSpace.newlocation { yield } else TempSpace.newlocation(file) end end def templocation(file="") if block_given? TempSpace.templocation { yield } else TempSpace.templocation(file) end end if ShowContent Content.new.list.cleanup elsif JustExtract Extract.new.extract.cleanup elsif ToTar MakeTar.new.extract.cleanup else TempSpace.new.extract.cleanup $:.unshift(templocation) $:.unshift(newlocation) $:.push(oldlocation) verbose = $VERBOSE $VERBOSE = nil s = ENV["PATH"].dup if Dir.pwd[1..2] == ":/" # Hack ??? s << ";#{templocation.gsub(/\//, "\\")}" s << ";#{newlocation.gsub(/\//, "\\")}" s << ";#{oldlocation.gsub(/\//, "\\")}" else s << ":#{templocation}" s << ":#{newlocation}" s << ":#{oldlocation}" end ENV["PATH"] = s $VERBOSE = verbose TAR2RUBYSCRIPT = true unless defined?(TAR2RUBYSCRIPT) newlocation do if __FILE__ == $0 $0.replace(File.expand_path("./init.rb")) if File.file?("./init.rb") load File.expand_path("./init.rb") else $stderr.puts "%s doesn't contain an init.rb ." % __FILE__ end else if File.file?("./init.rb") load File.expand_path("./init.rb") end end end end # dG1wLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAACA0MDc3NyAAICAgICAwIAAgICAgIDAgACAgICAgICAgICAw # IDEwNjcyNTY2Mzc0ICAxMDA1MAAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHVzZXIA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3JvdXAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAB0bXAvZ29pLwAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIDQwNzc3IAAgICAgIDAgACAg # ICAgMCAAICAgICAgICAgIDAgMTA2NzI1NjYzNzQgIDEwNjI2ACA1AAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAHVzdGFyICAAdXNlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABn # cm91cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcC9nb2kvYXBw # bG9nLnJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx # MDA2NjYgACAgICAgMCAAICAgICAwIAAgICAgICAyMTEzNyAxMDY3MjU2NjM3 # MyAgMTI1NTUAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB1c2VyAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAGdyb3VwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAIyBBcHBsaWNhdGlvbiBlcnJvciBsb2dnaW5nLg0KDQojIENvcHly # aWdodCAoQykgMjAwNCwgSmF2aWVyIEdvaXp1ZXRhIDxqYXZpZXJAZ29penVl # dGEuaW5mbz4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7 # IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KIyBtb2RpZnkgaXQg # dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj # ZW5zZQ0KIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91 # bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMg0KIyBvZiB0aGUgTGljZW5zZSwg # b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCg0KDQpy # ZXF1aXJlICdnb2kvY2ZnMCcNCnJlcXVpcmUgJ2dvaS90b29scycNCnJlcXVp # cmUgJ2dvaS96aXB4Jw0KcmVxdWlyZSAndG1wZGlyJw0KcmVxdWlyZSAncGF0 # aG5hbWUnDQpyZXF1aXJlICd6aXAvemlwZmlsZXN5c3RlbScNCg0KI0FwcExv # ZyBvYmplY3RzIHByb3ZpZGUgbG9nZ2luZw0KDQojIHJlcXVpcmUgJ2dvaS9h # cHBsb2cnDQojIEFwcExvZy5ydW4oJ3Rlc3RfYXBwJykgZG8gfGFwcHwNCiMg # ICBhcHAuc2V0TXNnT3V0IHByb2N7fHR4dHwgLi4ufQ0KIyAgIGFwcC5sb2cg # IkFwcC4gVmVyc2lvbjogI3thcHAuaG9zdF9jZmdbJ1ZlcnNpb24nXX0iDQoj # ICAgLi4uDQojICAgYXBwLmxvZyAiLi4uIg0KIyAgIC4uLg0KIyBlbmQNCg0K # bW9kdWxlIEdvaQ0KICBjbGFzcyBBcHBMb2cgIA0KICAgIA0KICAgICMgQ3Jl # YXRlIGFuIEFwcExvZyBvYmplY3Q7IGl0IHdpbGwgY29udGFpbiBhbHNvIENm # ZzAgb2JqZWN0cy4NCiAgICAjICAgLSBpZCBpcyB0aGUgYXBwbGljYXRpb24g # aWRlbnRpZmllciAobmFtZSkNCiAgICAjICAgLSBnciBpcyBhbiBvcHRpb25h # bCBncm91cCBuYW1lDQogICAgIyAgIC0gcmVnIGlzIGEgZmxhZyB0byB1c2Ug # dGhlIFdpbmRvd3MgUmVnaXN0cnkgKGlmIGF2YWlsYWJsZSkNCiAgICBkZWYg # aW5pdGlhbGl6ZShpZCwgZ3I9bmlsLHJlZz10cnVlKQ0KDQogICAgQGFwcGlk # ID0gaWQNCiAgICBAZ3JvdXAgPSBncg0KICAgIEBob3N0X2NmZyA9IENmZzAu # bmV3KDpob3N0LGlkLGdyLHJlZykNCiAgICBAdXNlcl9jZmcgPSBDZmcwLm5l # dyg6dXNlcixpZCxncixyZWcpDQogICAgQGJhc2VfY2ZnID0gQ2ZnMC5uZXco # OmJhc2UsaWQsZ3IscmVnKQ0KDQogICAgQHRtcF9kaXIgPSBEaXIudG1wZGly # DQogICAgQGhvc3RfZGlyID0gQGhvc3RfY2ZnLmRpcg0KICAgIEB1c2VyX2Rp # ciA9IEB1c2VyX2NmZy5kaXINCiAgICBAYmFzZV9kaXIgPSBDZmcwLmJhc2Vf # ZGlyICAgICAgICAgDQoNCiAgICBAbXNnb3V0ID0gbmlsDQogICAgQHByZ291 # dCA9IG5pbA0KDQogICAgQGlzX29wZW4gPSBmYWxzZQ0KICAgIEBpc19wZXJz # aXN0ZW50ID0gZmFsc2UNCg0KICAgIHRvZGF5ID0gVGltZS5ub3cuc3RyZnRp # bWUoJyVZJW0lZCcpDQogICAgQGxvZ19mbiA9IHVuaXFfZm4oQHRtcF9kaXIs # ICIje2lkfV8je3RvZGF5fSIsIi5sb2ciKSAgICAgDQoNCg0KICAgIHdyX2Rp # ciA9IEBiYXNlX2Rpcg0KICAgIGlmICFGaWxlLndyaXRhYmxlPyh3cl9kaXIp # IHx8IGlzX2V4ZV90bXAod3JfZGlyKQ0KICAgICMgIHdyX2RpciA9IERpci5w # d2QNCiAgICAjICBpZiAhRmlsZS53cml0YWJsZT8od3JfZGlyKSB8fCBpc19l # eGVfdG1wKHdyX2RpcikNCiAgICAgICAgd3JfZGlyID0gQGhvc3RfZGlyDQog # ICAgICAgIGlmICFGaWxlLndyaXRhYmxlPyh3cl9kaXIpIHx8IGlzX2V4ZV90 # bXAod3JfZGlyKQ0KICAgICAgICAgIHdyX2RpciA9IEB1c2VyX2Rpcg0KICAg # ICAgICAgIGlmICFGaWxlLndyaXRhYmxlPyh3cl9kaXIpIHx8IGlzX2V4ZV90 # bXAod3JfZGlyKQ0KICAgICAgICAgICAgd3JfZGlyID0gQHRtcF9kaXINCiAg # ICAgICAgICBlbmQNCiAgICAgICAgZW5kDQogICAgIyAgZW5kDQogICAgZW5k # DQogICAgDQogICAgQHppcF9mbiA9IEZpbGUuam9pbih3cl9kaXIsICJFUlJP # UkVTLnppcCIpICMgQGhvc3RfZGlyID8NCg0KICAgIEBrZWVwX29wZW4gPSB0 # cnVlDQogICAgQGxvZ19maWxlID0gbmlsDQogICAgDQogICAgZW5kICANCiAg # ICANCiAgICBhdHRyX3JlYWRlciA6YXBwaWQsIDpncm91cCwgOmhvc3RfY2Zn # LCA6dXNlcl9jZmcsIDpiYXNlX2NmZyAgDQogICAgDQogICAgI09wZW4gdGhl # IGxvZyBmaWxlDQogICAgZGVmIG9wZW4NCiAgICAgIGNsb3NlIGlmIEBpc19v # cGVuDQogICAgICBpZiBAa2VlcF9vcGVuDQogICAgICAgIEBsb2dfZmlsZSA9 # IEZpbGUubmV3KEBsb2dfZm4sICJhIikNCiAgICAgIGVuZA0KICAgICAgQGlz # X29wZW4gPSB0cnVlDQogICAgICANCiAgICAgIG1zZyA9ICVRew0KICAgICAg # ICAgICAgICAgSW5pY2lvIGRlICN7Z3JvdXAgPyBncm91cCsnLycrYXBwaWQg # OiBhcHBpZH0NCiAgICAgICAgICAgICAgIFRtcERpcjogI3tAdG1wX2Rpcn0N # CiAgICAgICAgICAgICAgIFVzZXJEaXI6ICN7QHVzZXJfZGlyfQ0KICAgICAg # ICAgICAgICAgSG9zdERpcjogI3tAaG9zdF9kaXJ9DQogICAgICAgICAgICAg # ICBCYXNlRGlyOiAje0BiYXNlX2Rpcn0gICAgDQogICAgICAgICAgICAgICBT # eXN0ZW06ICN7U3lzOjpVbmFtZS5zeXNuYW1lfQ0KICAgICAgICAgICAgICAg # VmVyc2lvbjogI3tTeXM6OlVuYW1lLnJlbGVhc2V9ICAgICAgICAgIA0KICAg # ICAgICAgICAgICAgQnVpbGQ6ICN7U3lzOjpVbmFtZS52ZXJzaW9ufQ0KICAg # ICAgICAgICAgICAgTWFjaGluZTogI3tTeXM6OlVuYW1lLm1hY2hpbmV9DQog # ICAgICAgICAgICAgICBOb2RlOiAje1N5czo6VW5hbWUubm9kZW5hbWV9DQog # ICAgICAgICAgICAgICBSdWJ5IFZlcnNpb246ICN7UlVCWV9WRVJTSU9OfQ0K # ICAgICAgICAgICAgICAgUnVieSBQbGF0Zm9ybTogI3tSVUJZX1BMQVRGT1JN # fQ0KICAgICAgICAgICAgICAgUHJvZ3JhbSBOYW1lOiAjeyQwfQ0KICAgICAg # ICAgICAgICAgRGlyZWN0b3J5OiAje0Rpci5wd2R9DQogICAgICAgICAgICAg # ICB9ICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAg # IGxvZyhtc2cpDQogICAgICANCiAgICBlbmQNCiAgICANCiAgICAjQ2xvc2Ug # dGhlIGxvZyBmaWxlDQogICAgZGVmIGNsb3NlDQogICAgICBpZiBAaXNfb3Bl # bg0KICAgICAgICBpZiBAa2VlcF9vcGVuDQogICAgICAgICAgIEBsb2dfZmls # ZS5jbG9zZQ0KICAgICAgICBlbmQNCiAgICAgICAgaWYgIUBpc19wZXJzaXN0 # ZW50DQogICAgICAgICAgaWYgRmlsZS5leGlzdD8oQGxvZ19mbikNCiAgICAg # ICAgRmlsZS5kZWxldGUoQGxvZ19mbikNCiAgICAgIGVuZA0KICAgICAgICBl # bmQNCiAgICAgICAgQGlzX29wZW4gPSBmYWxzZQ0KICAgICAgZW5kDQogICAg # ZW5kDQogICAgDQogICAgI01ha2UgdGhlIGxvZyBmaWxlIHBlcnNpc3RlbnQg # KGRvIG5vdCBkZWxldGUgaXQgYXQgY2xvc2luZykNCiAgICBkZWYgcGVyc2lz # dA0KICAgICAgQGlzX3BlcnNpc3RlbnQgPSB0cnVlDQogICAgZW5kDQogICAg # DQogICAgI1NlbmQgaW5mb3JtYXRpb24gdG8gdGhlIGxvZyBmaWxlOiBlaXRo # ZXIgYW4gZXhjZXB0aW9uIG9iamVjdCBvciBhIHRleHQuDQogICAgZGVmIGxv # Zyh0eHQsIHRpbWVzdGFtcD10cnVlLCBzaG93PWZhbHNlKQ0KICAgICAgaWYg # QGlzX29wZW4gICAgDQogICAgICAgIHR4dCA9IGVycm9yTXNnKHR4dCkNCiAg # ICAgICAgc2hvd1Byb2dyZXNzTXNnKHR4dCkgaWYgc2hvdyAgDQogICAgICAg # IGlmIEBrZWVwX29wZW4gDQogICAgICAgICAgZG9fbG9nKEBsb2dfZmlsZSwg # dHh0LCB0aW1lc3RhbXApDQogICAgICAgIGVsc2UNCiAgICAgICAgICBGaWxl # Lm9wZW4oQGxvZ19mbiwgImEiKSBkbyB8ZmlsZXwgIA0KICAgICAgICBkb19s # b2coZmlsZSwgdHh0LCB0aW1lc3RhbXApDQogICAgICAgICAgZW5kICAgICAg # ICANCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICBlbmQgICAgDQogICAg # DQogICAgI1NlbmQgaW5mb3JtYXRpb24gdG8gdGhlIGxvZyBmaWxlOiBlaXRo # ZXIgYW4gZXhjZXB0aW9uIG9iamVjdCBvciBhIHRleHQuDQogICAgZGVmIGxv # Z19zaG93KHR4dCwgdGltZXN0YW1wPXRydWUpDQogICAgICBsb2cgdHh0LCB0 # aW1lc3RhbXAsIHRydWUNCiAgICBlbmQgICAgDQogICAgDQogICAgI1ByZXBh # cmUgYSBtZXNzYWdlIHRvIGJlIGxvZ2dlZCBvciBzaG93bi4NCiAgICBkZWYg # ZXJyb3JNc2codHh0LCB0aW1lc3RhbXA9dHJ1ZSkNCiAgICAgIGlmIHR4dC5r # aW5kX29mPyhFeGNlcHRpb24pICMgRXhjZXB0aW9uICBvciBTdGFuZGFyZEVy # cm9yID8gDQogICAgICAgIHR4dCA9ICJFcnJvcjogI3t0eHQubWVzc2FnZX1c # bltlcnJvciBjbGFzczogI3t0eHQuY2xhc3N9XVxuIiArIHR4dC5iYWNrdHJh # Y2Uuam9pbigiXG4iKQ0KICAgICAgZW5kDQogICAgICB0eHQgPSBHb2k6OnRy # aW1fbGluZXNfdHh0KEdvaTo6dW5faW5kZW50X3R4dCh0eHQpKQ0KICAgICAg # dHh0DQogICAgZW5kDQogICAgDQogICAgI1Nob3cgbWVzc2FnZSB0byB0aGUg # dXNlcg0KICAgIGRlZiBzaG93TXNnKCp0eHRzKQ0KICAgICAgdHh0cy5lYWNo # IGRvIHx0eHR8DQogICAgICAgIHR4dCA9IGVycm9yTXNnKHR4dCkNCiAgICAg # ICAgaWYgQG1zZ291dA0KICAgICAgICAgIEBtc2dvdXQuY2FsbCh0eHQpDQog # ICAgICAgIGVsc2UgICAgDQogICAgICAgICAgJHN0ZGVyci5wdXRzKHR4dCkN # CiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICBlbmQNCiAgICANCiAgICAj # U2hvdyBtZXNzYWdlIHRvIHRoZSB1c2VyDQogICAgZGVmIHNob3dQcm9ncmVz # c01zZygqdHh0cykNCiAgICAgIHR4dHMuZWFjaCBkbyB8dHh0fA0KICAgICAg # ICB0eHQgPSBlcnJvck1zZyh0eHQpDQogICAgICAgIGlmIEBwcmdvdXQNCiAg # ICAgICAgICBAcHJnb3V0LmNhbGwodHh0KQ0KICAgICAgICBlbHNlICAgIA0K # ICAgICAgICAgICRzdGRlcnIucHV0cyh0eHQpDQogICAgICAgIGVuZA0KICAg # ICAgZW5kDQogICAgZW5kDQogICAgDQogICAgI1NldCBhIHByb2NlZHVyZSBv # ciBtZXRob2QgdG8gYmUgdXNlZCB0byBzaG93IG1lc3NhZ2VzLg0KICAgIGRl # ZiBzZXRNc2dPdXQocHJjPW5pbCkNCiAgICAgICBAbXNnb3V0ID0gcHJjDQog # ICAgZW5kDQogICAgDQogICAgI1NldCBhIHByb2NlZHVyZSBvciBtZXRob2Qg # dG8gYmUgdXNlZCB0byBzaG93IHByb2dyZXNzIG1lc3NhZ2VzLg0KICAgIGRl # ZiBzZXRQcm9ncmVzc01zZ091dChwcmM9bmlsKQ0KICAgICAgIEBwcmdvdXQg # PSBwcmMNCiAgICBlbmQNCiAgICANCiAgICAjRW1haWwgYWNjb3VudCB0byBz # ZW5kIGVycm9yIHJlcG9ydHMgdG8uDQogICAgZGVmIGVtYWlsDQogICAgICBl # bSA9IGJhc2VfY2ZnWydFcnJFbWFpbCddDQogICAgICBlbSA9IGhvc3RfY2Zn # WydFcnJFbWFpbCddIHVubGVzcyBlbQ0KICAgICAgZW0gPSAnaW5mb3JtYXRp # Y2FAZWluc2wuY29tJyB1bmxlc3MgZW0NCiAgICAgIGVtDQogICAgZW5kDQog # ICAgDQogICAgI2xvZyBmaWxlIG5hbWUNCiAgICBkZWYgZmlsZW5hbWUNCiAg # ICAgIEBsb2dfZm4NCiAgICBlbmQNCiAgICAjemlwIGZpbGUgbmFtZSAod2hl # cmUgbG9nIGZpbGVzIGFyZSBwYWNrZWQpDQogICAgZGVmIHppcG5hbWUNCiAg # ICAgIEB6aXBfZm4NCiAgICBlbmQNCiAgICANCiAgICAjcGFjayBsb2cgZmls # ZSBpbnRvIHppcCBmaWxlIHByZXNlcnZlIHByZXZpb3VzIGxvZyBldmVuIGlm # IHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lDQogICAgZGVmIHppcA0KICAgICAg # cmV0dXJuIHVubGVzcyBAaXNfb3Blbg0KICAgICAgaWYgQGtlZXBfb3BlbiAg # ICAgIA0KICAgICAgICBAa2VlcF9vcGVuID0gZmFsc2UNCiAgICAgICAgQGxv # Z19maWxlLmNsb3NlDQogICAgICBlbmQNCiAgICAgIGNyZWF0ZSA9IEZpbGUu # ZXhpc3Q/KHppcG5hbWUpID8gbmlsIDogWmlwOjpaaXBGaWxlOjpDUkVBVEUN # CiAgICAgIHpwbm0gPSBGaWxlLmJhc2VuYW1lKGZpbGVuYW1lKQ0KICAgICAg # WmlwOjpaaXBGaWxlLm9wZW4oemlwbmFtZSwgY3JlYXRlKSBkbyB8emZ8ICAg # ICAgDQogICAgICAgIHVubGVzcyBjcmVhdGUNCiAgICAgICAgICBzdWZmaXgg # PSBuaWwNCiAgICAgICAgICBwcmVmaXgsKmV4dCA9IHpwbm0uc3BsaXQoJy4n # KQ0KICAgICAgICAgIHdoaWxlIHpmLmZpbGUuZXhpc3RzPyh6cG5tKQ0KICAg # ICAgICBpZiBzdWZmaXgNCiAgICAgICAgICBzdWZmaXguc3VjYyENCiAgICAg # ICAgZWxzZQ0KICAgICAgICAgIHN1ZmZpeCA9ICdfMDEnDQogICAgICAgIGVu # ZA0KICAgICAgICB6cG5tID0gW3ByZWZpeCArIHN1ZmZpeF0uY29uY2F0KGV4 # dCkuam9pbignLicpICAgIA0KICAgICAgZW5kDQogICAgICAgIGVuZCAgIA0K # ICAgICAgICB6Zi5hZGQoenBubSwgZmlsZW5hbWUpe3RydWV9DQogICAgICAg # ICNAaXNfcGVyc2lzdGVudCA9IGZhbHNlDQogICAgICBlbmQNCiAgICBlbmQN # CiAgICANCiAgICAjRXhlY3V0ZSB0aGUgYXBwbGljYXRpb24gY29kZSwgcHJv # dmlkaW5nIGFuIEFwcExvZyBvYmplY3QsDQogICAgI2FuZCBoYW5kbGluZyBl # cnJvcnMuDQogICAgI0EgYmxvY2sgbXVzdCBiZSBwYXNzZWQuDQogICAgZGVm # IEFwcExvZy5ydW4oaWQsb3B0aW9ucz17fSkNCiAgICAgIGdyID0gb3B0KG9w # dGlvbnNbOmdyb3VwXSxuaWwpDQogICAgICByZWcgPSBvcHQob3B0aW9uc1s6 # cmVnaXN0cnldLHRydWUpDQogICAgICBtc2dvdXQgPSBvcHQob3B0aW9uc1s6 # bXNnb3V0XSxuaWwpDQoNCiAgICAgIGxvZyA9IEFwcExvZy5uZXcoaWQsZ3Is # cmVnKQ0KICAgICAgbG9nLnNldE1zZ091dChtc2dvdXQpDQogICAgICBsb2cu # b3Blbg0KICAgICAgeWllbGQobG9nKQ0KDQogICAgICByZXNjdWUgU3RhbmRh # cmRFcnJvcj0+ZXJyDQogICAgICAgIGxvZy5sb2cgZXJyDQogICAgICAgIGlm # ICRERUJVRw0KICAgICAgICAgICNtZXNzYWdlIHRvIHRoZSB0ZXN0ZXIvZGV2 # ZWxvcGVyDQogICAgICAgICAgbG9nLnBlcnNpc3QNCiAgICAgICAgICBsb2cu # c2hvd01zZyhlcnIsICJMb2cgZmlsZTogI3tsb2cuZmlsZW5hbWV9IikNCiAg # ICAgICAgZWxzZQ0KICAgICAgICAgICNtZXNzYWdlIHRvIHRoZSB1bnN1c3Bl # Y3RpbmcgdXNlcg0KICAgICAgICAgIGxvZy56aXAgICANCiAgICAgICAgICB0 # eHQgPSAlUXsNCiAgICAgICAgICAgICAgICAgICBIYSBvY3VycmlkbyB1biBl # cnJvci4NCiAgICAgICAgICAgICAgICAgICBMYSBpbmZvcm1hY2nzbiBuZWNl # c2FyaWEgcGFyYSBhbmFsaXphciBzdXMgY2F1c2FzDQogICAgICAgICAgICAg # ICAgICAgc2UgZW5jdWVudHJhIGVuIGVsIGFyY2hpdm86DQogICAgICAgICAg # ICAgICAgICAgICAje2xvZy56aXBuYW1lfQ0KICAgICAgICAgICAgICAgICAg # IFBvciBmYXZvciwgZW527WUgZGljaG8gYXJjaGl2byBhICN7bG9nLmVtYWls # fS4NCiAgICAgICAgICAgICAgICAgICBB8WFkYSBjdWFscXVpciBjb21lbnRh # cmlvIHF1ZSBjb25zaWRlcmUg+nRpbCANCiAgICAgICAgICAgICAgICAgICBz # b2JyZSBsYXMgY2lyY3Vuc3RhbmNpYXMgZW4gbGFzIHF1ZSBoYSBvY3Vycmlk # byBlbCBlcnJvci4NCiAgICAgICAgICAgICAgICAgICBHcmFjaWFzLg0KICAg # ICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICBsb2cuc2hvd01zZyh0eHQp # ICAgIA0KICAgICAgICBlbmQNCg0KICAgICAgZW5zdXJlDQogICAgICAgIGxv # Zy5jbG9zZQ0KICAgIGVuZA0KICAgIA0KICAgICNSZWFkIGNvbmZpZ3VyYXRp # b24gdmFsdWUgZ2l2aW5nIGl0cyBrZXkNCiAgICBkZWYgY2ZnX3JlYWQoa2V5 # KQ0KICAgICAgdmFsdWUgPSB1c2VyX2NmZ1trZXldDQogICAgICB2YWx1ZSA9 # IGhvc3RfY2ZnW2tleV0gdW5sZXNzIHZhbHVlDQogICAgICB2YWx1ZSA9IGJh # c2VfY2ZnW2tleV0gdW5sZXNzIHZhbHVlDQogICAgICB2YWx1ZQ0KICAgIGVu # ZA0KICAgIA0KICAgIHByaXZhdGUNCiAgICANCiAgICAjVGhpcyB0cmllcyB0 # byBkZXRlY3QgYSBydWJ5c2NyaXB0MmV4ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5 # DQogICAgZGVmIGlzX2V4ZV90bXAoZm4pDQogICAgICBpcyA9IGZhbHNlDQog # ICAgICBpZiBQYXRobmFtZS5uZXcoZm4pLnJlbGF0aXZlX3BhdGhfZnJvbShQ # YXRobmFtZS5uZXcoQHRtcF9kaXIpKS50b19zWzAsMl0hPScuLicNCiAgICAg # ICAgYiA9IEZpbGUuYmFzZW5hbWUoZm4pDQogICAgICAgIGIgPSBGaWxlLmJh # c2VuYW1lKEZpbGUuZGlybmFtZShmbikpIGlmIGI9PSdhcHAnDQogICAgICAg # IGlmIGIubWF0Y2goL2VlZVwuXGQrLykNCiAgICAgICAgICBpcyA9IHRydWUN # CiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICAgIGlzDQogICAgZW5kDQog # ICAgDQogICAgZGVmIHVuaXFfZm4oZGlyLCBwcmVmaXgsZXh0KQ0KICAgICAg # Zm4gPSBGaWxlLmpvaW4oZGlyLCBwcmVmaXgpDQogICAgICBzdWZmaXggPSAn # Jw0KICAgICAgaWYgRmlsZS5leGlzdHM/KGZuK2V4dCkNCiAgICAgICAgc3Vm # Zml4ID0gJ18wMDEnDQogICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5zdWNjIHdo # aWxlIEZpbGUuZXhpc3RzPyhmbitzdWZmaXgrZXh0KQ0KICAgICAgZW5kDQog # ICAgICBmbiArPSBzdWZmaXggKyBleHQNCiAgICAgIGZuICAgIA0KICAgIGVu # ZA0KICAgIA0KICAgIGRlZiBkb19sb2coZmlsZSwgdHh0LHRpbWVzdGFtcD10 # cnVlKQ0KICAgICAgaWYgdGltZXN0YW1wDQogICAgICAgIGZpbGUucHV0cyBU # aW1lLm5vdy5zdHJmdGltZSgnJVktJW0tJWQgJUg6JU06JVMgLS0tLS0tLS0t # LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykNCiAg # ICAgIGVuZA0KICAgICAgZmlsZS5wdXRzIHR4dA0KICAgICAgZmlsZS5wdXRz # ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t # LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIg0KICAgICAgZmlsZS5mbHVz # aA0KICAgIGVuZA0KICAgIA0KICBlbmQNCmVuZA0KAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1w # L2dvaS9iaXRzZXQucmIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAADEwMDY2NiAAICAgICAwIAAgICAgIDAgACAgICAgICAyNTM3IDEw # NjcyNTY2MzczICAxMjU1MAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAHVzZXIAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3JvdXAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAANCg0KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSwg # SmF2aWVyIEdvaXp1ZXRhIDxqYXZpZXJAZ29penVldGEuaW5mbz4NCiMNCiMg # VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 # cmlidXRlIGl0IGFuZC9vcg0KIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z # IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhcyBwdWJs # aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy # IHZlcnNpb24gMg0KIyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0 # aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCg0KY2xhc3MgQml0c2V0DQogIGRl # ZiBpbml0aWFsaXplKG4sZmlsbF93aXRoPWZhbHNlKQ0KICAjYml0IHNldCBm # b3IgMCwxLC4uLm4tMQ0KICAgIEBuID0gbg0KICAgIGlmIGZpbGxfd2l0aD09 # dHJ1ZQ0KICAgICAgZmlsbA0KICAgIGVsc2UNCiAgICAgIGNsZWFyDQogICAg # ZW5kDQogIGVuZA0KICBkZWYgZ2V0X2JpdChpKSAjIHRydWUvZmFsc2UNCiAg # ICAoQHNldCAmIG1hc2soaSkpIT0wDQogIGVuZA0KICBkZWYgc2V0X2JpdChp # LHY9dHJ1ZSkgIyB0cnVlL2ZhbHNlDQogICAgaWYgdg0KICAgICAgQHNldCB8 # PSBtYXNrKGkpIA0KICAgIGVsc2UNCiAgICAgIEBzZXQgJj0gY19tYXNrKGkp # DQogICAgZW5kDQogICAgc2VsZg0KICBlbmQNCiAgZGVmIGNsZWFyKCkgIyBh # bGwgYml0cyB0byBmYWxzZQ0KICAgICBAc2V0ID0gMA0KICAgICBzZWxmDQog # IGVuZA0KICBkZWYgZmlsbCgpICMgYWxsIGJpdHMgdG8gdHJ1ZQ0KICAgIEBz # ZXQgPSBmdWxsDQogICAgc2VsZg0KICBlbmQNCiAgZGVmIGVhY2hfdHJ1ZSMg # aXRlcmF0b3Igb3ZlciB0cnVlIGJpdHMNCiAgICAoMC4uLkBuKS5lYWNoIGRv # IHxpfA0KICAgICAgeWllbGQoaSkgaWYgZ2V0X2JpdChpKSANCiAgICBlbmQN # CiAgZW5kDQogIGRlZiBlYWNoX2ZhbHNlKCZibGspDQogICAgKDAuLi5Abiku # ZWFjaCBkbyB8aXwNCiAgICAgIHlpZWxkKGkpIGlmICFnZXRfYml0KGkpIA0K # ICAgIGVuZA0KICBlbmQNCiAgZGVmIGVhY2gNCiAgICAoMC4uLkBuKS5lYWNo # IGRvIHxpfA0KICAgICAgeWllbGQoaSxnZXRfYml0KGkpKQ0KICAgIGVuZA0K # ICBlbmQNCg0KICBwcml2YXRlDQogIGRlZiBiYXNlDQogICAjIDIqKkBuDQog # ICAxIDw8IEBuDQogIGVuZA0KICBkZWYgZnVsbA0KICAgICMgMioqQG4tMSA9 # ICgxPDxAbiktMQ0KICAgIHYgPSAwDQogICAgQG4udGltZXMgeyB2IDw8PSAx # OyB2IHw9IDE7IH0gICAgICANCiAgICB2DQogIGVuZA0KICBkZWYgbWFzayhp # KQ0KICAgICMgMioqaQ0KICAgIDEgPDwgaQ0KICBlbmQNCiAgZGVmIGNfbWFz # ayhpKQ0KICAgIH5tYXNrKGkpICsgYmFzZQ0KICBlbmQNCmVuZA0KAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAB0bXAvZ29pL2NmZzAucmIAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTAwNjY2IAAgICAgIDAg # ACAgICAgMCAAICAgICAgMjUyMjQgMTA2NzI1NjYzNzMgIDEyMTEzACAwAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAHVzdGFyICAAdXNlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AABncm91cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgQ29uZmln # dXJhdGlvbiBMZXZlbCAwLg0KIyBTaW1wbGUgYXBwbGljYXRpb24gY29uZmln # dXJhdGlvbiBkYXRhLCB1c2VyIG9yIGhvc3Qgc3BlY2lmaWMuDQoNCiMgQ29w # eXJpZ2h0IChDKSAyMDA0LCBKYXZpZXIgR29penVldGEgPGphdmllckBnb2l6 # dWV0YS5pbmZvPg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy # ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIG1vZGlmeSBp # dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM # aWNlbnNlDQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG # b3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyDQojIG9mIHRoZSBMaWNlbnNl # LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KDQpy # ZXF1aXJlICdzeXMvdW5hbWUnO3JlcXVpcmUgJ2ZpbGV1dGlscyc7cmVxdWly # ZSAneWFtbCc7DQojQ2ZnMCBvYmplY3RzIGdpdmUgYWNjZXNzIHRvIHRoZSBj # b25maWd1cmF0aW9uIGRhdGEuDQojDQojVG8gaGFuZGxlIHVzZXItc3BlY2lm # aWMgY29uZmlndXJhdGlvbiBmb3IgYW4gYXBsaWNhdGlvbiBuYW1lZCAnYW4t # YXBwJywNCiN3ZSB3b3VsZCBjcmVhdGUgYW4gb2JqZWN0Og0KIyAgcmVxdWly # ZSAnZ29pL2NmZzAnDQojICBjZmcgPSBDZmcwLm5ldyg6dXNlciwgJ2FuLWFw # cCcpDQojQW5kIHdlIGNhbiB0aGVuIHN0b3JlIGNvbmZpZ3VyYXRpb24gdmFy # aWFibGVzIGxpa2UgdGhpcw0KIyAgY2ZnWyd1biB2YWxvciddPScvZGlyZWN0 # b3Jpby9iYXNlJw0KIyAgY2ZnWydvdHJvIHZhbG9yJ109MzQzMy4yDQojQW5k # IHJldHJpZXZlIHRoZW06IChuaWwgd2lsbCBiZSByZXR1cm5lZCBmb3Igbm9u # LWV4aXN0aW5nIHZhbHVlcykNCiMgIGRpcl9iYXNlID0gY2ZnWyd1biB2YWxv # ciddDQojICB4ID0gY2ZnWydvdHJvIHZhbG9yJ10NCiNUbyBjcmVhdGUgYSBu # b24tdXNlci1zcGVjaWZpYyBjb25maWd1cmF0aW9uIHdlIHdvdWxkIGRvOg0K # IyAgY2ZnID0gQ2ZnMC5uZXcoOmhvc3QsICdhbi1hcHAnKQ0KI0lmIHdlIHdh # bnQgdG8ga2VlcCBzZXZlcmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgdG9nZXRo # ZXIgaW4gYQ0KI2RpcmVjdG9yeSAoZS5nLiBmb3IgcmVsYXRlZCBhcHBsaWNh # dGlvbnMpIHdlIGNhbiB1c2UgYSBncm91cCBuYW1lOg0KIyAgY2ZnID0gQ2Zn # MC5uZXcoOmhvc3QsICdhbi1hcHAnLCAnYS1ncm91cCcpDQojSW4gV2luZG93 # cywgdGhlIFJlZ2lzdHJ5IHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0IGluc3Rl # YWQgb2YgY29uZmlndXJhdGlvbg0KI2ZpbGVzLCBidXQgdGhpcyBjYW4gYmUg # ZGlzYWJsZWQgbGlrZSB0aGlzOg0KIyAgY2ZnID0gQ2ZnMC5uZXcoOmhvc3Qs # ICdhbi1hcHAnLCAnYS1ncm91cCcsIGZhbHNlKQ0KI05vdGU6IGV2ZW4gaWYg # dGhlIFJlZ2lzdHJ5IGlzIHVzZWQsIHdlIGNhbiBvdmVycmlkZSBpdCB3aXRo # IGEgDQojbWFudWFsbHkgY3JlYXRlZCBmaWxlLg0KIyMNCiNDZmcwIGNhbiBi # ZSB1c2VkIHRvIHF1ZXJ5IGFwcGxpY2F0aW9ucyBvdGhlciB0aGFuIHRoZSBv # bmUgaXQgaXMgY2FsbGVkIGZyb20sDQojYnV0IG5vdCBmb3IgOmJhc2UgZGF0 # YSwgd2hpY2ggYWx3YXlzIHJlZmVycyB0byB0aGUgcnVubmluZyBhcHBsaWNh # dGlvbi4NCiNGb3IgZXhhbXBsZSwgd2hlIGNvdWxkIGRvIHRoaXMgdG8gY2Fs # bCBhbm90aGVyIGFwcGxpY2F0aW9uIGlmIGl0IGlzIGluc3RhbGxlZDoNCiMg # IENmZzAub3Blbig6aG9zdCwgJ290aGVyLWFwcCcsICdvdGhlci1ncm91cCcp # IGRvIHxjZmd8DQojICAgIGlmIGNmZ1snVmVyc2lvbiddDQojICAgICAgIyB0 # aGUgb3RoZXIgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkDQojICAgICAgaWYg # Y2ZnWydWZXJzaW9uJ10+PW5lZWRlZF92ZXJzaW9uDQojICAgICAgICBzeXN0 # ZW0gY2ZnWydDb21tYW5kJ10NCiMgICAgICBlbmQNCiMgICBlbmQNCiMgIGVu # ZA0KI0ZvciB0aGlzIHRvIHdvcmsgYW4gYXBwbGljYXRpb24gc2hvdWxkIGNv # bnRhaW4gY29kZSBsaWtlIHRoaXM6DQojICBDZmcwLm9wZW4oOmhvc3QsICd0 # aGlzLWFwcCcsICdncm91cCcpIGRvIHxjZmd8DQojICAgIGlmIGNmZ1snVmVy # c2lvbiddPFZFUlNJT04NCiMgICAgICBjZmdbJ1ZlcnNpb24nXSA9IFZFUlNJ # T04NCiMgICAgICBjZmdbJ0Jhc2VEaXInXSA9IENmZzAuYmFzZV9kaXINCiMg # ICAgICBjZmdbJ0NvbW1hbmQnXSA9IENmZzAuZXhlX2ZpbGUrJyAnK2FyZ3Vt # ZW50cw0KIyAgICBlbmQgIA0KIyAgZW5kDQojQnV0IHRoYXQgd29uJ3Qgd29y # ayBpZiB0aGUgYXBwbGljYXRpb24gaXMgY29udmVydGVkIHRvIGEgbmF0aXZl # IGV4ZWN1dGFibGUNCiN3aXRoIHJ1YnlzY3JpcHQyZXhlOyBpbiB0aGF0IGNh # c2UgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzIHNob3VsZCBzZXQgdGhlDQoj # Y29ycmVjdCBCYXNlRGlyIGFuZCBDb21tYW5kLg0KI0lmIHdlIHdhbnQgdG8g # dXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBhbm90aGVyIGFwcGxpY2F0b24g # d2UgY291bGQgZG8gdGhpczoNCiMgIHZlcnMgPSB7fQ0KIyAgQ2ZnMC5vcGVu # X2FsbCgnb3RoZXItYXBwLSonLCAnb3RoZXItZ3JvdXAnKXt8Y2ZnfCB2ZXJz # W2NmZ1snVmVyc2lvbiddXT1jZmd9DQojICB2ZXIsY2ZnID0gdmVycy5tYXgN # CiMgIGlmIHZlcj49bmVlZGVkX3ZlcnNpb24NCiMgICAgIHN5c3RlbSBjZmdb # J0NvbW1hbmQnXQ0KIyAgZW5kDQojT3Igd2UgY291bGQgaGF2ZSBkb25lIHRo # aXM6DQojIG90aGVyX2FwcF92ZXIgPSBDZmcwLm9wZW4oOmhvc3QsJ290aGVy # LWFwcC0qJywnb3RoZXItZ3JvdXAnKXt8Y2ZnfGNmZy52ZXJzaW9uc30ubWF4 # DQojIENmZzAub3Blbig6aG9zdCwgb3RoZXJfYXBwX3ZlciwgJ290aGVyLWdy # b3VwJykgLi4uDQojDQptb2R1bGUgR29pDQogIGNsYXNzIENmZzAgIA0KICAg # IA0KICAgIGluY2x1ZGUgU3lzDQogICAgDQogICAgIyBDcmVhdGUgQ29uZmln # dXJhdGlvbiBPYmplY3QgZm9yIGFuIGFwcGxpY2F0aW4NCiAgICAjICAgLSBt # b2RlIGlzIGVpdGhlciA6dXNlciwgOmhvc3Qgb3IgOmJhc2UNCiAgICAjICAg # LSBhcHBpZCBpcyBhbiBhcHBsaWNhdGlvbiBpZGVudGlmaWVyIChuYW1lKQ0K # ICAgICMgICAtIGdyb3VwIGlzIGFuIG9wdGlvbmFsIGdyb3VwIG5hbWUNCiAg # ICAjICAgLSB1c2VfcmVnIGlzIGEgZmxhZyB0byB1c2UgdGhlIFdpbmRvd3Mg # UmVnaXN0cnkgKGlmIGF2YWlsYWJsZSkNCiAgICBkZWYgaW5pdGlhbGl6ZSht # b2RlLCBhcHBpZCwgZ3JvdXA9bmlsLHVzZV9yZWc9dHJ1ZSkNCg0KICAgIEBt # b2RlID0gbW9kZSAjIDp1c2VyIDpob3N0IDpiYXNlDQogICAgQGFwcGlkID0g # YXBwaWQNCiAgICBAZ3JvdXAgPSBncm91cA0KICAgIEB1c2VfcmVnID0gdXNl # X3JlZyAmJiAvV2luZG93cyAuLi8ubWF0Y2goVW5hbWUuc3lzbmFtZSkNCiAg # ICANCiAgICBjYXNlIEBtb2RlDQogICAgICB3aGVuIDp1c2VyDQogICAgICAg # IGlmIC9XaW5kb3dzIC4uLy5tYXRjaChVbmFtZS5zeXNuYW1lKQ0KICAgICAg # ICAgIA0KICAgICAgICAgIGlmIFVuYW1lLnN5c25hbWU9PSJXaW5kb3dzIE5U # Ig0KICAgICAgICAgICAgaWYgVW5hbWUucmVsZWFzZVswXT49PzUNCiAgICAg # ICAgICAgICAgIyBXaW5kb3dzIDIwMDAsIFhQLCAyMDAzLCAuLi4uIChpdHMg # cmVwb3J0ZWQgbm90IHdyaXRhYmxlIGJ5IEZpbGUud3JpdGFibGU/IGJ1dCBp # dCBpcyB3cml0YWJsZSkNCiAgICAgICAgICAgICAgQGZpbGVfZGlyID0gRU5W # WydBUFBEQVRBJ10NCiAgICAgICAgICAgIGVsc2UgDQogICAgICAgICAgICAg # ICMgV2luZG93cyBOVA0KICAgICAgICAgICAgICBAZmlsZV9kaXIgPSBGaWxl # LmpvaW4oRU5WWydVU0VSUFJPRklMRSddLCJBcHBsaWNhdGlvbiBEYXRhIikg # IyBhc3N1bWUgbm8gbGFuZ3VhZ2UtZGVwZW5kZW50LCBlLmcuICJEYXRvcyBk # ZSBQcm9ncmFtYSINCiAgICAgICAgICAgICAgIyBFTlZbJ1VTRVJQUk9GSUxF # J10gPSBFTlZbJ0hPTUVEUklWRSddK0VOVlsnSE9NRVBBVEgnXQ0KICAgICAg # ICAgICAgZW5kDQogICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgQGZpbGVf # ZGlyID0gRmlsZS5qb2luKEZpbGUuam9pbihGaWxlLmpvaW4oRU5WWydXSU5E # SVInXSwnUHJvZmlsZXMnKSxFTlZbJ1VTRVJOQU1FJ10pLCJBcHBsaWNhdGlv # biBEYXRhIikNCiAgICAgICAgICBlbmQNCiAgICAgICAgICANCiAgICAgICAg # ZWxzZQ0KICAgICAgICAgIA0KICAgICAgICAgIEBmaWxlX2RpciA9IEVOVlsn # SE9NRSddDQogICAgICAgICAgDQogICAgICAgIGVuZCANCiAgICAgIHdoZW4g # Omhvc3QNCiAgICAgICAgaWYgL1dpbmRvd3MgLi4vLm1hdGNoKFVuYW1lLnN5 # c25hbWUpDQogICAgICAgICAgDQogICAgICAgICAgaWYgVW5hbWUuc3lzbmFt # ZT09IldpbmRvd3MgTlQiDQogICAgICAgICAgICBpZiBVbmFtZS5yZWxlYXNl # WzBdPj0/NQ0KICAgICAgICAgICAgICAjIFdpbmRvd3MgMjAwMCwgWFAsIDIw # MDMsIC4uLi4NCiAgICAgICAgICAgICAgQGZpbGVfZGlyID0gRmlsZS5qb2lu # KEVOVlsnQUxMVVNFUlNQUk9GSUxFJ10sRmlsZS5iYXNlbmFtZShFTlZbJ0FQ # UERBVEEnXSkpDQogICAgICAgICAgICAgICMgICB0aGlzIGlzIHByb2JhYmx5 # IG5vdCB3cml0YWJsZSBmb3IgY29tbW9uIHVzZXJzLCB0aG91Z2guLi4gICAg # DQogICAgICAgICAgICAgICMgICAgIC0td2FpdCwgbm8sIGl0IGlzIHJlcG9y # dGVkIG5vbi13cml0YWJsZSBidXQgaXQgaXMhDQogICAgICAgICAgICAgIGlm # ICFGaWxlLndyaXRhYmxlPyhAZmlsZV9kaXIpICYmICF1c2VfcmVnDQogICAg # ICAgICAgICAgICAgIyB0byBkbzogZmluZCBhIHN1aXRhYmxlLCB3cml0YWJs # ZSBsb2NhdGlvbi4uLg0KICAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAg # IGVsc2UgDQogICAgICAgICAgICAgICMgV2luZG93cyBOVA0KICAgICAgICAg # ICAgICBAZmlsZV9kaXIgPSBGaWxlLmpvaW4oRU5WWyJTeXN0ZW1Sb290Il0s # ICdQcm9maWxlcy9BbGwgVXNlcnMvQXBwbGljYXRvbiBEYXRhJykNCiAgICAg # ICAgICAgIGVuZA0KICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAjIHRo # aXMgaXMgY29tbW9ubHkgdXNlZCBieSBtYW55IGFwcGxpY2F0aW9ucywgYWx0 # aG91Z2ggbm90IHRoZSBNaWNyb3NvZnQgd2F5IG9mIGRvaW50IGl0DQogICAg # ICAgICAgICAgQGZpbGVfZGlyID0gRmlsZS5qb2luKEVOVlsnd2luZGlyJ10s # J0FwcGxpY2F0aW9uIERhdGEnKSAgIA0KICAgICAgICAgIGVuZA0KICAgICAg # ICAgIA0KICAgICAgICBlbHNlDQogICAgICAgICAgDQogICAgICAgICAgQGZp # bGVfZGlyID0gJy92YXIvbG9jYWwvZXRjJw0KICAgICAgICAgIA0KICAgICAg # ICBlbmQgDQogICAgICB3aGVuIDpiYXNlDQogICAgICAgIEBmaWxlX2RpciA9 # IENmZzAuYmFzZV9kaXINCiAgICAgIGVsc2UNCiAgICAgICAgIyBtb2RlIGlz # IGEgZGlyZWN0b3J5IG5hbWUNCiAgICAgICAgQGZpbGVfZGlyID0gbW9kZS50 # b19zdHINCiAgICBlbmQNCiAgICB1c2VfZG90ID0gIS9XaW5kb3dzIC4uLy5t # YXRjaChVbmFtZS5zeXNuYW1lKSAmJiBtb2RlPT06dXNlcg0KICAgIGlmIEBn # cm91cA0KICAgICAgZ3JvdXBfZGlyID0gKHVzZV9kb3QgPyAnLicgOiAnJykg # KyBAZ3JvdXANCiAgICAgIHVzZV9kb3QgPSBmYWxzZQ0KICAgICAgQGZpbGVf # ZGlyID0gRmlsZS5qb2luKEBmaWxlX2RpciwgZ3JvdXBfZGlyKQ0KICAgIGVu # ZA0KICAgIEBmaWxlX2RpciA9IEBmaWxlX2Rpci5nc3ViKFJlZ2V4cC5uZXco # UmVnZXhwLmVzY2FwZShGaWxlOjpBTFRfU0VQQVJBVE9SKSksIEZpbGU6OlNF # UEFSQVRPUikgdW5sZXNzIEZpbGU6OkFMVF9TRVBBUkFUT1IubmlsPw0KICAg # IEBmaWxlX25hbWUgPSAgYXBwaWQrJy5jZmcnICAgIA0KICAgIEBmaWxlX25h # bWUgPScuJytAZmlsZV9uYW1lIGlmIHVzZV9kb3QNCiAgICANCiAgICBpZiBA # dXNlX3JlZw0KICAgICAgaWYgWyJXaW5kb3dzIE5UIiwiV2luZG93cyA5eCIs # IldpbmRvd3MgQ0UiXS5pbmNsdWRlPyhVbmFtZS5zeXNuYW1lKQ0KICAgICAg # ICByZXF1aXJlICd3aW4zMi9yZWdpc3RyeScNCiAgICAgICAgIEByZWdfYmFz # ZSA9IEBtb2RlPT06dXNlciA/IFdpbjMyOjpSZWdpc3RyeTo6SEtFWV9DVVJS # RU5UX1VTRVIgOiBXaW4zMjo6UmVnaXN0cnk6OkhLRVlfTE9DQUxfTUFDSElO # RQ0KICAgICAgICAgQHJlZ19ub2RlPSAiU29mdHdhcmUiDQogICAgICAgICBA # cmVnX25vZGUgKz0gIlxcIitncm91cCBpZiBncm91cA0KICAgICAgICAgQHJl # Z19ub2RlICs9ICJcXCIrYXBwaWQNCiAgICAgIGVuZCAgICAgICAgICAgIA0K # ICAgIGVuZA0KICAgIA0KICAgIGVuZCAgDQogICAgDQogICAgYXR0cl9yZWFk # ZXIgOm1vZGUsIDphcHBpZCwgOmdyb3VwDQogICAgIyBpcyB0aGUgV2luZG93 # cyByZWdpc3RyeSB1c2VkIGluc3RlYWQgb2YgY29uZmlndXJhdGlvbiBmaWxl # cz8NCiAgICBkZWYgcmVnaXN0cnk/O0B1c2VfcmVnO2VuZCAgDQogICAgDQog # ICAgI1JlYWQgY29uZmlndXJhdGlvbiB2YWx1ZSBnaXZpbmcgaXRzIGtleQ0K # ICAgIGRlZiByZWFkKGtleSkNCiAgICAgIHZhbHVlID0gZmlsZV9yZWFkKGtl # eSkNCiAgICAgIHZhbHVlID0gcmVnX3JlYWQoa2V5KSBpZiBAdXNlX3JlZyAm # JiAhdmFsdWUNCiAgICAgIHZhbHVlDQogICAgZW5kDQogICAgDQogICAgI1dy # aXRlIGNvbmZpZ3VyYXRpb24gdmFsdWUgZ2l2aW5nIGl0cyBrZXkNCiAgICBk # ZWYgd3JpdGUoa2V5LCB2YWx1ZSkNCiAgICAgIGlmIEB1c2VfcmVnDQogICAg # ICAgIGlmIEZpbGUuZXhpc3Q/KEZpbGUuam9pbihAZmlsZV9kaXIsIEBmaWxl # X25hbWUpKQ0KICAgICAgICAgIGZpbGVfd3JpdGUoa2V5LHZhbHVlKSANCiAg # ICAgICAgZWxzZQ0KICAgICAgICAgIHJlZ193cml0ZShrZXksdmFsdWUpDQog # ICAgICAgIGVuZA0KICAgICAgZWxzZQ0KICAgICAgICBmaWxlX3dyaXRlKGtl # eSx2YWx1ZSkNCiAgICAgIGVuZA0KICAgICAgc2VsZg0KICAgIGVuZA0KICAg # IA0KICAgICNSZWFkIGNvbmZpZ3VyYXRpb24gdmFsdWUgZ2l2aW5nIGl0cyBr # ZXkNCiAgICBkZWYgW10oa2V5KTsgcmVhZChrZXkpOyBlbmQNCiAgICAjV3Jp # dGUgY29uZmlndXJhdGlvbiB2YWx1ZSBnaXZpbmcgaXRzIGtleQ0KICAgIGRl # ZiBbXT0oa2V5LHZhbHVlKTsgd3JpdGUoa2V5LHZhbHVlKTsgZW5kDQogICAg # DQogICAgZGVmIGRpcg0KICAgICAgQGZpbGVfZGlyDQogICAgZW5kDQogICAg # DQogICAgIyBmdWxsIG5hbWUgb2YgdGhlIGV4ZWN1dGluZyBzY3JpcHQNCiAg # ICBkZWYgQ2ZnMC5leGVfZmlsZQ0KICAgICAgRmlsZS5leHBhbmRfcGF0aCgk # MCxEaXIucHdkKQ0KICAgIGVuZA0KICAgIA0KICAgICMgZGlyZWN0b3J5IGZy # b20gd2hlcmUgdGhlIHNjcmlwdCBpcyBpbnN0YWxsZWQNCiAgICBkZWYgQ2Zn # MC5iYXNlX2Rpcg0KICAgICAgRmlsZS5kaXJuYW1lKENmZzAuZXhlX2ZpbGUp # DQogICAgZW5kDQogICAgDQogICAgIyBjcmVhdGUgYSBjb25maWd1cmF0aW9u # IGFuZCBhY2Nlc3MgaXQgZnJvbSBhIGJsb2NrDQogICAgZGVmIENmZzAub3Bl # bihtb2RlLCBhcHBpZCwgZ3JvdXA9bmlsLHVzZV9yZWc9dHJ1ZSkNCiAgICAg # IGNmZyA9IENmZzAubmV3IG1vZGUsIGFwcGlkLCBncm91cCwgdXNlX3JlZw0K # ICAgICAgeWllbGQgY2ZnDQogICAgZW5kDQogICAgDQogICAgIyBjcmVhdGUg # YWxsIGNvbmZpZ3VyYXRpb25zIG1hdGNoaW5nIGFuIGFwcGxpY2F0aW9uLWlk # IHBhdHRlcm4gKHZlcnNpb25zKQ0KICAgIGRlZiBDZmcwLm9wZW5fYWxsKGFw # cGlkLCBncm91cD1uaWwsdXNlX3JlZz10cnVlKQ0KICAgICAgY2ZnID0gQ2Zn # MC5uZXcgOmhvc3QsIGFwcGlkLCBncm91cCwgdXNlX3JlZw0KICAgICAgY2Zn # LnZlcnNpb25zLmVhY2ggZG8gfHZlcnwNCiAgICAgICAgdmVyX2NmZyA9IENm # ZzAubmV3KDpob3N0LCB2ZXIsIGdyb3VwLCB1c2VfcmVnKQ0KICAgICAgICB5 # aWVsZCB2ZXJfY2ZnDQogICAgICBlbmQNCiAgICBlbmQNCiAgICANCiAgICAj # IE9idGFpbnMgYWxsIHZlcnNpb25zIG9mIGFuIGFwcGxpY2F0aW9ucywgaS5l # LiANCiAgICAjIHRoZSBhcHBsaWNhdGlvbiBpZGVudGlmaWVycyBvZiBpbnN0 # YWxsZWQgYXBwbGljYXRpb25zICh3aXRoIHNvbWUgOmhvc3QgZGF0YSkNCiAg # ICAjIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4uIFRoZSBwYXR0ZXJu # IHVzZXMgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBvZiBnbG9iLg0KICAgIGRl # ZiB2ZXJzaW9ucyhnbG9iX3BhdHQ9dHJ1ZSkNCiAgICAgIHZlcnMgPSBbXQ0K # ICAgICAgIyBAYXBwaWQgaXMgdHJlYXRlZCBhcyBhIHBhdHRlcm4NCiAgICAg # IHBhdHQgPSBAYXBwaWQNCiAgICAgIHBhdHQgPSBSZWdleHAubmV3KEBhcHBp # ZCkgaWYgIWdsb2JfcGF0dA0KICAgICAgaWYgQHVzZV9yZWcNCiAgICAgICAg # IyByZW1vdmUgYXBwaWQgKGxhc3QgY29tcG9uZW50KSBmcm9tIEByZWdfbm9k # ZQ0KICAgICAgICBiYXNlX2tleSA9IEByZWdfbm9kZS5zcGxpdCgnXFwnKVsw # Li4uLTFdLmpvaW4oJ1xcJykNCiAgICAgICAgaWYgZ2xvYl9wYXR0DQogICAg # ICAgICAgDQogICAgICAgICAgcGF0dCA9IFJlZ2V4cC5lc2NhcGUocGF0dCkN # CiAgICAgICAgICBwYXR0LmdzdWIhKC9cXFwqLywgJy4qJykNCiAgICAgICAg # ICBwYXR0LmdzdWIhKC9cXFw/LywgJy4nKQ0KICAgICAgICAgIHBhdHQuZ3N1 # YiEoL1xcXHtbXlxcXH1dKlxcXH0vKXt8YWx0c3wgJygnK2FsdHNbMi4uLi0y # XS5zcGxpdCgnLCcpLmpvaW4oJyl8KCcpKycpJyB9DQogICAgICAgICAgcGF0 # dC5nc3ViISgvXFxcW1teXFxcXV0qXFxcXS8pe3xhbHRzfCAnWycrYWx0c1sy # Li4uLTJdKyddJyB9DQogICAgICAgICAgcGF0dCA9IFJlZ2V4cC5uZXcgcGF0 # dA0KICAgICAgICAgIA0KICAgICAgICBlbmQNCiAgICAgICAgDQogICAgICAg # IEByZWdfYmFzZS5vcGVuKGJhc2Vfa2V5KSBkbyB8cmVnfA0KICAgICAgICAg # IHJlZy5lYWNoX2tleSBkbyB8a2V5LCB3dGltZXwNCiAgICAgICAgICAgIGlm # IHBhdHQubWF0Y2goa2V5KQ0KICAgICAgICAgICAgICB2ZXJzIDw8IGtleQ0K # ICAgICAgICAgICAgZW5kDQogICAgICAgICAgZW5kDQogICAgICAgIGVuZCAg # ICANCiAgICAgICAgDQogICAgICBlbHNlDQogICAgICAgIGJhc2VfZGlyID0g # QGZpbGVfZGlyDQogICAgICAgIGlmIGdsb2JfcGF0dA0KICAgICAgICAgIA0K # ICAgICAgICAgIERpci5nbG9iKEZpbGUuam9pbihAZmlsZV9kaXIsQGZpbGVf # bmFtZSkpIGRvIHxmaWxlfA0KICAgICAgICAgICAgaWYgIUZpbGUuZGlyZWN0 # b3J5PyhmaWxlKSANCiAgICAgICAgICAgICAgdmVycyA8PCBGaWxlLmJhc2Vu # YW1lKGZpbGUsJy5jZmcnKQ0KICAgICAgICAgICAgZW5kDQogICAgICAgICAg # ZW5kDQogICAgICAgICAgDQogICAgICAgIGVsc2UNCiAgICAgICAgICANCiAg # ICAgICAgICBEaXIuZm9yZWFjaChiYXNlX2RpcikgZG8gfGZpbGV8DQogICAg # ICAgICAgICBpZiBwYXR0Lm1hdGNoKGZpbGUpDQogICAgICAgICAgICAgIGlm # ICFGaWxlLmRpcmVjdG9yeT8oRmlsZS5qb2luKGJhc2VfZGlyLGZpbGUpKQ0K # ICAgICAgICAgICAgICAgIHZlcnMgPDwgRmlsZS5iYXNlbmFtZShmaWxlLCcu # Y2ZnJykNCiAgICAgICAgICAgICAgZW5kDQogICAgICAgICAgICBlbmQNCiAg # ICAgICAgICBlbmQNCiAgICAgICAgICANCiAgICAgICAgZW5kDQogICAgICBl # bmQNCiAgICAgIHZlcnMNCiAgICBlbmQNCiAgICANCiAgICBwcml2YXRlDQog # ICAgDQogICAgZGVmIGZpbGVfcmVhZChrZXkpDQogICAgICBmbiA9IEZpbGUu # am9pbihAZmlsZV9kaXIsIEBmaWxlX25hbWUpDQogICAgICBmaWxlID0ge30N # CiAgICAgICNmaWxlID0gWUFNTDo6bG9hZChGaWxlLm9wZW4oZm4pKSANCiAg # ICAgIEZpbGUub3Blbihmbil7fGZ8IGZpbGUgPSBZQU1MOjpsb2FkKGYpfSBp # ZiBGaWxlLmV4aXN0cz8oZm4pDQogICAgICBmaWxlW2tleV0NCiAgICBlbmQg # ICAgDQogICAgDQogICAgZGVmIGZpbGVfd3JpdGUoa2V5LCB2YWx1ZSkNCiAg # ICAgIEZpbGVVdGlscy5ta2Rpcl9wIEBmaWxlX2RpciBpZiAhRmlsZS5leGlz # dD8oQGZpbGVfZGlyKQ0KICAgICAgZm4gPSBGaWxlLmpvaW4oQGZpbGVfZGly # LCBAZmlsZV9uYW1lKQ0KICAgICAgZmlsZSA9IHt9ICAgICANCiAgICAgICNm # aWxlID0gWUFNTDo6bG9hZChGaWxlLm9wZW4oZm4pKSANCiAgICAgIEZpbGUu # b3Blbihmbil7fGZ8IGZpbGUgPSBZQU1MOjpsb2FkKGYpfSBpZiBGaWxlLmV4 # aXN0cz8oZm4pDQogICAgICBmaWxlW2tleV0gPSB2YWx1ZQ0KICAgICAgRmls # ZS5vcGVuKGZuLCJ3Iil7fGZ8IGYgPDwgZmlsZS50b195YW1sfQ0KICAgIGVu # ZA0KICAgIA0KICAgIGRlZiByZWdfcmVhZChrZXkpDQogICAgICBiZWdpbg0K # ICAgICAgICBAcmVnX2Jhc2Uub3BlbihAcmVnX25vZGUpIGRvIHxyZWd8DQog # ICAgICAgICAga2V5X3ZhbHVlID0gcmVnLnJlYWQoa2V5KVsxXQ0KICAgICAg # ICAgIGlmIGtleV92YWx1ZVswLi4uM109PSctLS0nDQogICAgICAgICAgICB2 # YWx1ZSA9IFlBTUw6OmxvYWQoa2V5X3ZhbHVlKQ0KICAgICAgICAgIGVsc2UN # CiAgICAgICAgICAgICMgcmVhZCBub24gWUFNTCBzdHJpbmcgdG8gc2hhcmUg # dmFsdWVzIHdpdGggb3RoZXIgYXBwcy4uLg0KICAgICAgICAgICAgdmFsdWUg # PSBrZXlfdmFsdWUNCiAgICAgICAgICBlbmQgICAgICAgIA0KICAgICAgICBl # bmQNCiAgICAgIHJlc2N1ZQ0KICAgICAgICBuaWwNCiAgICAgIGVuZCAgICAg # ICAgIA0KICAgIGVuZA0KICAgIA0KICAgIGRlZiByZWdfd3JpdGUoa2V5LHZh # bHVlKQ0KICAgICAgICAjIGRvbid0IHVzZSB5YW1sIGZvciBzdHJpbmcsIGZv # ciBjb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgYXBwcy4uLiAgDQogICAgICAg # IHZhbHVlID0gdmFsdWUucmVzcG9uZF90bz8oOnRvX3N0cikgPyB2YWx1ZS50 # b19zdHIgOiB2YWx1ZS50b195YW1sDQogICAgICAgIEByZWdfYmFzZS5jcmVh # dGUoQHJlZ19ub2RlKSBkbyB8cmVnfA0KICAgICAgICAgIHJlZ1trZXldID0g # dmFsdWUNCiAgICAgICAgZW5kDQogICAgZW5kDQogICAgDQogIGVuZA0KZW5k # DQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAdG1wL2dvaS9kYml4LnJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAADEwMDY2NiAAICAgICAwIAAgICAgIDAgACAgICAg # ICAyNTU2IDEwNjcyNTY2MzczICAxMjIwNQAgMAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAg # AHVzZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ3JvdXAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIERCSSBleHRlbnNpb25zDQoNCiMg # Q29weXJpZ2h0IChDKSAyMDA0LCBKYXZpZXIgR29penVldGEgPGphdmllckBn # b2l6dWV0YS5pbmZvPg0KIw0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 # d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIG1vZGlm # eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp # YyBMaWNlbnNlDQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy # ZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyDQojIG9mIHRoZSBMaWNl # bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0K # DQpyZXF1aXJlICdkYmknDQoNCmJlZ2luDQogIHJlcXVpcmUgJ0RCRC9BRE8v # QURPJw0KICBtb2R1bGUgREJJDQogIG1vZHVsZSBEQkQNCiAgbW9kdWxlIEFE # Tw0KICAgIA0KICAgIGNsYXNzIERhdGFiYXNlIDwgREJJOjpCYXNlRGF0YWJh # c2UNCiAgICAgQ09OU1RfYWRTY2hlbWFUYWJsZXM9MjAgIyBBRE9EQi5TY2hl # bWFFbnVtDQogICAgIENPTlNUX2FkU2NoZW1hQ29sdW1ucz00ICMgQURPREIu # U2NoZW1hRW51bQ0KICAgICAgDQogICAgIGRlZiB0YWJsZXM7IF9fdGFibGVz # KCdUQUJMRScpOyBlbmQNCiAgICAgIGRlZiBfX3RhYmxlcygqdHlwZXMpDQog # ICAgICAgICAgdGJzID0gW10NCiAgICAgICAgICByZXMgPSBAaGFuZGxlLk9w # ZW5TY2hlbWEoQ09OU1RfYWRTY2hlbWFUYWJsZXMpDQogICAgICAgICAgd2hp # bGUgIXJlcy5FT0YgICAgICAgICAgDQogICAgICAgICAgICAgaWYgdHlwZXMu # c2l6ZT09MCB8fCB0eXBlcy5pbmNsdWRlPyhyZXMuRmllbGRzKCJUQUJMRV9U # WVBFIikudmFsdWUpDQogICAgICAgICAgICAgICB0YnMgPDwgcmVzLkZpZWxk # cygiVEFCTEVfTkFNRSIpLnZhbHVlDQogICAgICAgICAgICAgIGVuZA0KICAg # ICAgICAgICAgIHJlcy5Nb3ZlTmV4dA0KICAgICAgICAgIGVuZA0KICAgICAg # ICAgIHJlcy5DbG9zZQ0KICAgICAgICB0YnMNCiAgICAgIGVuZCAgDQogICAg # ZW5kICANCiAgICANCiAgICAgIGNsYXNzIFN0YXRlbWVudA0KICAgICAgICAj # dW5kZWYgZmluaXNoDQogICAgICAgIGRlZiBmaW5pc2gNCiAgICAgICAgICBp # ZiBAcmVzX2hhbmRsZSAmJiBAcmVzX2hhbmRsZS5GaWVsZHMuQ291bnQoKSAh # PSAwIHRoZW4NCiAgICAgICAgICAgIEByZXNfaGFuZGxlLkNsb3NlKCkNCiAg # ICAgICAgICBlbmQNCiAgICAgICAgICByZXNjdWUgUnVudGltZUVycm9yID0+ # IGVycg0KICAgICAgICAgICAgcmFpc2UgREJJOjpEYXRhYmFzZUVycm9yLm5l # dyhlcnIubWVzc2FnZSkNCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICAN # CiAgZW5kICMgQURPDQogIGVuZCAjIERCRA0KICBlbmQgIyBEQkkNCnJlc2N1 # ZSBMb2FkRXJyb3INCmVuZA0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXAvZ29pL2ZsdHRvbC5y # YgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTAwNjY2 # IAAgICAgIDAgACAgICAgMCAAICAgICAgMzMzMDYgMTA2NzI1NjYzNzMgIDEy # NjAwACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdXNlcgAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAABncm91cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # ACMgRmxvYXRpbmcgcG9pbnQgdG9sZXJhbmNlDQoNCiMgQ29weXJpZ2h0IChD # KSAyMDAzLTIwMDUsIEphdmllciBHb2l6dWV0YSA8amF2aWVyQGdvaXp1ZXRh # LmluZm8+DQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 # b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCiMgbW9kaWZ5IGl0IHVu # ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu # c2UNCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k # YXRpb247IGVpdGhlciB2ZXJzaW9uIDINCiMgb2YgdGhlIExpY2Vuc2UsIG9y # IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQoNCiMNCiMg # QXV0aG9yOjogICAgSmF2aWVyIEdvaXp1ZXRhIChtYWlsdG86amF2aWVyQGdv # aXp1ZXRhLmluZm8pDQojIENvcHlyaWdodDo6IENvcHlyaWdodCAoYykgMjAw # Mi0yMDA0IEphdmllciBHb2l6dWV0YQ0KIyBMaWNlbnNlOjogICBEaXN0cmli # dXRlcyB1bmRlciB0aGUgR1BMIGxpY2Vuc2UNCiMNCiNUaGlzIG1vZHVsZSBw # cm92aWRlcyBhIG51bWVyaWMgdG9sZXJhbmNlIGNsYXNzIGZvciBGbG9hdCBh # bmQgQmlnRGVjaW1hbC4NCg0KDQpyZXF1aXJlICdiaWdkZWNpbWFsJw0KcmVx # dWlyZSAnYmlnZGVjaW1hbC9tYXRoJyBpZiA6OlZFUlNJT04+PScxLjguMScN # CnJlcXVpcmUgJ2dvaS90b29scycNCg0KDQpjbGFzcyBGbG9hdCAgDQogIA0K # ICAjIGJpdHMgPSAyLU1hdGguZnJleHAoRmxvYXQ6OkVQU0lMT04pWzFdDQog # IHggPSAxLjANCiAgYml0cyA9IDANCiAgYmVnaW4gDQogICAgYml0cyArPSAx # DQogICAgeCAvPSAyDQogIGVuZCB3aGlsZSAxIT14KzENCiAgICAgICAgDQog # ICMgTnVtYmVyIG9mIGJpbmFyeSBkaWdpdHMgb2YgcHJlY2lzaW9uIGluIGEg # RmxvYXQNCiAgQklUUyA9IGJpdHMgIyA1MyBmb3IgSUVFRSBkb3VibGUgcHJl # Y2lzaW9uDQogICMgTnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIG9mIHByZWNp # c2lvbiBpbiBhIEZsb2F0DQogIERJR0lUUyA9ICgoQklUUy0xKSpNYXRoLmxv # ZygyKS9NYXRoLmxvZygxMCkpLmZsb29yICMgMTUgZm9yIElFRUUgREJMOyA2 # IGZvciBTTkcNCiAgIyBEZWNpbWFsIHByZWNpc2lvbiByZXF1aXJlZCB0byBz # dG9yZSBhIEZsb2F0IGFuZCBiZSBhYmxlIHRvIHJlY292ZXIgaXRzIHZhbHVl # ICANCiAgRElHSVRTMiA9IChCSVRTKk1hdGgubG9nKDIpL01hdGgubG9nKDEw # KSkuY2VpbCsxICMgMTcgZm9yIElFRUUgREJMOyA5IGZvciBTTkcNCmVuZA0K # DQpjbGFzcyBGbG9hdCAgDQogIE1BTlRfRElHID0gQklUUyB1bmxlc3MgY29u # c3RfZGVmaW5lZD8oOk1BTlRfRElHKQ0KICBESUcgPSBESUdJVFMgdW5sZXNz # IGNvbnN0X2RlZmluZWQ/KDpESUcpDQplbmQNCg0KY2xhc3MgRmxvYXQNCiAg # RVBTSUxPTiA9IE1hdGgubGRleHAoMC41LDItQklUUykgdW5sZXNzIGNvbnN0 # X2RlZmluZWQ/KDpFUFNJTE9OKQ0KZW5kDQoNCmRlZiBCaWdEZWMoeCxwcmVj # PW5pbCkNCiAgaWYgeC5yZXNwb25kX3RvPyg6dG9fc3RyKQ0KICAgIHggPSBC # aWdEZWNpbWFsKHgudG9fc3RyLCBwcmVjfHwwKQ0KICBlbHNlDQogICAgY2Fz # ZSB4DQogICAgICB3aGVuIEludGVnZXINCiAgICAgIHggPSBCaWdEZWNpbWFs # KHgudG9fcywgcHJlY3x8MCkNCiAgICB3aGVuIFJhdGlvbmFsDQogICAgICBp # ZiBwcmVjLm5pbD8NCiAgICAgICAgIyB0byBkbzogc29tZXRoaW5nIGJldHRl # ci4gKD8pDQogICAgICAgIHByZWMgPSBCaWdEZWNpbWFsLmRvdWJsZV9maWcq # MisxDQogICAgICBlbmQNCiAgICAgIHggPSBCaWdEZWNpbWFsLm5ldyh4Lm51 # bWVyYXRvci50b19zKS5kaXYoeC5kZW5vbWluYXRvcixwcmVjKQ0KICAgIHdo # ZW4gQmlnRGVjaW1hbA0KICAgIHdoZW4gRmxvYXQNCiAgICAgIHByZWMgfHw9 # IEZsb2F0OjpESUcrMQ0KICAgICAgeCA9IEJpZ0RlY2ltYWwoZm9ybWF0KCIl # LiN7cHJlY31nIix4KSkNCiAgICBlbmQNCiAgZW5kDQogIHgNCmVuZA0KDQpt # b2R1bGUgR29pDQogIA0KDQogICNUaGlzIGNsYXNzIHJlcHJlc2VudHMgZmxv # YXRpbmcgcG9pbnQgdG9sZXJhbmNlcyBmb3IgRmxvYXQgbnVtYmVycw0KICAj # YW5kIGFsbG93cyBjb21wYXJpc29uIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRv # bGVyYW5jZS4NCiAgDQogIGNsYXNzIFRvbGVyYW5jZQ0KICAgIGluY2x1ZGUg # U3RhdGVFcXVpdmFsZW50DQogICAgDQogICAgZGVmIG51bUNsYXNzDQogICAg # ICBGbG9hdA0KICAgIGVuZA0KICAgIA0KICAgICNUaGUgdG9sZXJhbmNlIG1v # ZGUgaXMgZWl0aGVyIDphYnMgKGFic29sdXRlKSA6cmVsIChyZWxhdGl2ZSkg # b3IgOnNpZw0KICAgIGRlZiBpbml0aWFsaXplKHQ9MC4wLCBtb2RlPTphYnMs # IGRlY21vZGU9ZmFsc2UpDQogICAgICBzZXQgdCwgbW9kZSwgZGVjbW9kZQ0K # ICAgIGVuZA0KICAgIA0KICAgIA0KICAgICNUaGlzIGluaXRpYWxpemVzIGEg # VG9sZXJhbmNlIHdpdGggYSBnaXZlbiBudW1iZXIgb2YgZGVjaW1hbHMNCiAg # ICBkZWYgZGVjaW1hbHMoZCwgbW9kZT06YWJzLCByb3VuZGVkPXRydWUpDQog # ICAgICANCiAgICAgIEBtb2RlID0gbW9kZQ0KICAgICAgQGRlY2ltYWxfbW9k # ZSA9IHRydWUNCiAgICAgIEBkID0gKGQ8PTAgfHwgZD5GbG9hdDo6RElHKSA/ # IEZsb2F0OjpESUcgOiBkDQogICAgICBAdCA9IDEwKiooLUBkKQ0KICAgICAg # QHQgKj0gMC41IGlmIHJvdW5kZWQNCiAgICAgIA0KICAgICAgc2VsZg0KICAg # IGVuZA0KICAgIA0KICAgICNUaGlzIGluaXRpYWxpemVzIGEgVG9sZXJhbmNl # IHdpdGggYSBudW1iZXIgb2Ygc2lnbmlmaWNhdGl2ZSBkZWNpbWFsIGRpZ2l0 # cw0KICAgIGRlZiBzaWdfZGVjaW1hbHMoZCwgcm91bmRlZD10cnVlKQ0KICAg # ICAgZGVjaW1hbHMgZCwgOnNpZywgcm91bmRlZA0KICAgIGVuZA0KICAgIA0K # ICAgIGRlZiBlcHNpbG9uKHRpbWVzX2Vwc2lsb249MSwgbW9kZT06c2lnKQ0K # ICAgICAgc2V0IEZsb2F0OjpFUFNJTE9OKnRpbWVzX2Vwc2lsb24sIG1vZGUN # CiAgICBlbmQNCiAgICANCiAgICBkZWYgYmlnX2Vwc2lsb24obj0xLCBtb2Rl # PTpzaWcpDQogICAgICB0ID0gTWF0aC5sZGV4cCgwLjUqbiwzLUZsb2F0OjpN # QU5UX0RJRykgIyBuKigyKkZsb2F0OjpFUFNJTE9OLygxLTAuNSpGbG9hdDo6 # RVBTSUxPTikqKjIpDQogICAgICBzZXQgdCwgbW9kZQ0KICAgIGVuZA0KICAg # IA0KICAgIGRlZiBmcmFjdGlvbihmKQ0KICAgICAgc2V0IGYsIDpyZWwNCiAg # ICBlbmQNCiAgICBkZWYgcGVyY2VudCh4KQ0KICAgICAgZnJhY3Rpb24geC8x # MDAuMA0KICAgIGVuZA0KICAgIGRlZiBwZXJtaWxsZSh4KQ0KICAgICAgZnJh # Y3Rpb24geC8xMDAwLjANCiAgICBlbmQNCiAgICANCg0KICAgICNTaG9ydGN1 # dCBub3RhdGlvbiAgDQogICAgZGVmIFtdKHgpDQogICAgICByZXR1cm4geC5u # aWw/ID8gQHQgOiBnZXRWYWx1ZSh4KQ0KICAgIGVuZA0KICAgICNSZXR1cm4g # dG9sZXJhbmNlIHJlbGF0aXZlIHRvIGEgbWFnbml0dWRlDQogICAgZGVmIGdl # dFZhbHVlKHgpICANCiAgICAgIHJlbCh4KQ0KICAgIGVuZA0KICAgICNFc3Nl # bnRpYWwgZXF1YWxpdHkgd2l0aGluIHRvbGVyYW5jZQ0KICAgIGRlZiBlcXVh # bHM/KHgseSkNCiAgICAgIA0KICAgICAgY2FzZSBAbW9kZQ0KICAgICAgICB3 # aGVuIDpzaWcNCiAgICAgICAgICANCiAgICAgICAgICBpZiBAZGVjaW1hbF9t # b2RlDQogICAgICAgICAgICBiZWdpbg0KICAgICAgICAgICAgICB4X2V4cCA9 # IE1hdGgubG9nMTAoeC5hYnMpDQogICAgICAgICAgICAgICN4X2V4cCA9IHhf # ZXhwLmZpbml0ZT8gPyB4X2V4cC5jZWlsIDogMA0KICAgICAgICAgICAgICB4 # X2V4cCA9IHhfZXhwLmZpbml0ZT8gPyB4X2V4cC5mbG9vcisxIDogMA0KICAg # ICAgICAgICAgcmVzY3VlDQogICAgICAgICAgICAgIHhfZXhwID0gMA0KICAg # ICAgICAgICAgZW5kDQogICAgICAgICAgICBiZWdpbiANCiAgICAgICAgICAg # ICAgeV9leHAgPSBNYXRoLmxvZzEwKHkuYWJzKQ0KICAgICAgICAgICAgICAj # eV9leHAgPSB5X2V4cC5maW5pdGU/ID8geV9leHAuY2VpbCA6IDANCiAgICAg # ICAgICAgICAgeV9leHAgPSB5X2V4cC5maW5pdGU/ID8geV9leHAuZmxvb3Ir # MSA6IDANCiAgICAgICAgICAgIHJlc2N1ZQ0KICAgICAgICAgICAgICB5X2V4 # cCA9IDANCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgKHkteCkuYWJz # IDw9IEB0KigxMCoqKFt4X2V4cCx5X2V4cF0ubWluLUBAZGVjX3JlZl9leHAp # KQ0KICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHoseF9leHAgPSBNYXRo # LmZyZXhwKHgpDQogICAgICAgICAgICB6LHlfZXhwID0gTWF0aC5mcmV4cCh5 # KQ0KICAgICAgICAgICAgKHkteCkuYWJzIDw9IE1hdGgubGRleHAoQHQsW3hf # ZXhwLHlfZXhwXS5taW4tQEByZWZfZXhwKSAjICh5LXgpLmFicyA8PSBAdCoo # MioqKFt4X2V4cCx5X2V4cF0ubWluLUBAcmVmX2V4cCkpDQogICAgICAgICAg # ZW5kDQogICAgICAgICAgDQogICAgICAgIHdoZW4gOnJlbA0KICAgICAgICAg # IA0KICAgICAgICAgICh5LXgpLmFicyA8PSBAdCooW3guYWJzLHkuYWJzXS5t # aW4pICNyZWZlcmVuY2UgdmFsdWUgaXMgMQ0KICAgICAgICAgIA0KICAgICAg # ICB3aGVuIDphYnMNCiAgICAgICAgICAoeC15KS5hYnM8QHQNCiAgICAgIGVu # ZA0KICAgICAgICAgICAgIA0KICAgIGVuZA0KICAgICNBcHByb3hpbWF0ZSBl # cXVhbGl0eSB3aXRoaW4gdG9sZXJhbmNlDQogICAgZGVmIGFwcnhFcXVhbHM/ # KHgseSkNCiAgICAgIA0KICAgICAgY2FzZSBAbW9kZQ0KICAgICAgICB3aGVu # IDpzaWcNCiAgICAgICAgICANCiAgICAgICAgICBpZiBAZGVjaW1hbF9tb2Rl # DQogICAgICAgICAgICBiZWdpbg0KICAgICAgICAgICAgICB4X2V4cCA9IE1h # dGgubG9nMTAoeC5hYnMpDQogICAgICAgICAgICAgICN4X2V4cCA9IHhfZXhw # LmZpbml0ZT8gPyB4X2V4cC5jZWlsIDogMA0KICAgICAgICAgICAgICB4X2V4 # cCA9IHhfZXhwLmZpbml0ZT8gPyB4X2V4cC5mbG9vcisxIDogMA0KICAgICAg # ICAgICAgcmVzY3VlDQogICAgICAgICAgICAgIHhfZXhwID0gMA0KICAgICAg # ICAgICAgZW5kDQogICAgICAgICAgICBiZWdpbiANCiAgICAgICAgICAgICAg # eV9leHAgPSBNYXRoLmxvZzEwKHkuYWJzKQ0KICAgICAgICAgICAgICAjeV9l # eHAgPSB5X2V4cC5maW5pdGU/ID8geV9leHAuY2VpbCA6IDANCiAgICAgICAg # ICAgICAgeV9leHAgPSB5X2V4cC5maW5pdGU/ID8geV9leHAuZmxvb3IrMSA6 # IDANCiAgICAgICAgICAgIHJlc2N1ZQ0KICAgICAgICAgICAgICB5X2V4cCA9 # IDANCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgKHkteCkuYWJzIDw9 # IEB0KigxMCoqKFt4X2V4cCx5X2V4cF0ubWF4LUBAZGVjX3JlZl9leHApKQ0K # ICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHoseF9leHAgPSBNYXRoLmZy # ZXhwKHgpDQogICAgICAgICAgICB6LHlfZXhwID0gTWF0aC5mcmV4cCh5KQ0K # ICAgICAgICAgICAgKHkteCkuYWJzIDw9IE1hdGgubGRleHAoQHQsW3hfZXhw # LHlfZXhwXS5tYXgtQEByZWZfZXhwKSAjICh5LXgpLmFicyA8PSBAdCooMioq # KFt4X2V4cCx5X2V4cF0ubWF4LUBAcmVmX2V4cCkpDQogICAgICAgICAgZW5k # DQogICAgICAgICAgDQogICAgICAgIHdoZW4gOnJlbA0KICAgICAgICAgIA0K # ICAgICAgICAgICh5LXgpLmFicyA8PSBAdCooW3guYWJzLHkuYWJzXS5tYXgp # ICNyZWZlcmVuY2UgdmFsdWUgaXMgMQ0KICAgICAgICAgIA0KICAgICAgICB3 # aGVuIDphYnMNCiAgICAgICAgICAoeC15KS5hYnM8PUB0ICAgIA0KICAgICAg # ZW5kDQogICAgICAgICAgICAgDQogICAgZW5kDQogICAgI0NvbXBhcmlzb24g # d2l0aGluIHRvbGVyYW5jZSAgDQogICAgZGVmIGdyZWF0ZXJUaGFuPyh4LHkp # DQogICAgICBsZXNzVGhhbj8oeSx4KQ0KICAgIGVuZA0KICAgICNDb21wYXJp # c29uIHdpdGhpbiB0b2xlcmFuY2UgIA0KICAgIGRlZiBsZXNzVGhhbj8oeCx5 # KQ0KICAgICANCiAgICAgY2FzZSBAbW9kZQ0KICAgICAgIHdoZW4gOnNpZw0K # ICAgICAgICAgDQogICAgICAgICBpZiBAZGVjaW1hbF9tb2RlDQogICAgICAg # ICAgIGJlZ2luDQogICAgICAgICAgICAgeF9leHAgPSBNYXRoLmxvZzEwKHgu # YWJzKQ0KICAgICAgICAgICAgICN4X2V4cCA9IHhfZXhwLmZpbml0ZT8gPyB4 # X2V4cC5jZWlsIDogMA0KICAgICAgICAgICAgIHhfZXhwID0geF9leHAuZmlu # aXRlPyA/IHhfZXhwLmZsb29yKzEgOiAwDQogICAgICAgICAgIHJlc2N1ZQ0K # ICAgICAgICAgICAgIHhfZXhwID0gMA0KICAgICAgICAgICBlbmQNCiAgICAg # ICAgICAgYmVnaW4gDQogICAgICAgICAgICAgeV9leHAgPSBNYXRoLmxvZzEw # KHkuYWJzKQ0KICAgICAgICAgICAgICN5X2V4cCA9IHlfZXhwLmZpbml0ZT8g # PyB5X2V4cC5jZWlsIDogMA0KICAgICAgICAgICAgIHlfZXhwID0geV9leHAu # ZmluaXRlPyA/IHlfZXhwLmZsb29yKzEgOiAwDQogICAgICAgICAgIHJlc2N1 # ZQ0KICAgICAgICAgICAgIHlfZXhwID0gMA0KICAgICAgICAgICBlbmQNCiAg # ICAgICAgICAgeS14ID4gQHQqKDEwKiooW3hfZXhwLHlfZXhwXS5tYXgtQEBk # ZWNfcmVmX2V4cCkpDQogICAgICAgICBlbHNlDQogICAgICAgICAgIHoseF9l # eHAgPSBNYXRoLmZyZXhwKHgpDQogICAgICAgICAgIHoseV9leHAgPSBNYXRo # LmZyZXhwKHkpDQogICAgICAgICAgIHkteCA+IE1hdGgubGRleHAoQHQsW3hf # ZXhwLHlfZXhwXS5tYXgtQEByZWZfZXhwKSAjIHkteCA+IEB0KigyKiooW3hf # ZXhwLHlfZXhwXS5tYXgtQEByZWZfZXhwKSkNCiAgICAgICAgIGVuZA0KICAg # ICAgICAgDQogICAgICAgd2hlbiA6cmVsDQogICAgICAgICANCiAgICAgICAg # IHkteCA+IEB0KihbeC5hYnMseS5hYnNdLm1heCkgI3JlZmVyZW5jZSB2YWx1 # ZSBpcyAxDQogICAgICAgICANCiAgICAgICB3aGVuIDphYnMNCiAgICAgICAg # IHgteTxAdA0KICAgICBlbmQNCiAgICAgICAgDQogICAgZW5kDQogICAgI0Nv # bXBhcmlzb24gd2l0aGluIHRvbGVyYW5jZSAgDQogICAgZGVmIHplcm8/KHgs # Y29tcGFyZWRfd2l0aD1uaWwpDQogICAgICBjb21wYXJlZF93aXRoLm5pbD8g # PyB4LmFiczxAdCA6IHguYWJzPHJlbChjb21wYXJlZF93aXRoKQ0KICAgIGVu # ZA0KDQogICAgDQogICAgZGVmIGFwcHJ4X2k/KHgpDQogICAgICBlcXVhbHM/ # KHgseC5yb3VuZCkNCiAgICBlbmQNCiAgICBkZWYgYXBwcnhfaSh4LHJlc3Vs # dD1JbnRlZ2VyKQ0KICAgICAgciA9IHgucm91bmQNCiAgICAgIHJldHVybiBl # cXVhbHM/KHgscikgPyByLnByZWMocmVzdWx0KSA6IHgNCiAgICBlbmQNCiAg # ICAgIA0KICAgIA0KICAgIGRlZiBnZXRNYWduaXR1ZGUNCiAgICAgIEB0DQog # ICAgZW5kDQogICAgZGVmIGdldERlY2ltYWxzICANCiAgICAgIEBkDQogICAg # ZW5kDQogICAgZGVmIGRlY2ltYWw/DQogICAgICBAZGVjaW1hbF9tb2RlDQog # ICAgZW5kDQogICAgZGVmIG1vZGUNCiAgICAgIEBtb2RlDQogICAgZW5kDQog # ICAgDQogICAgDQogICAgcHJpdmF0ZQ0KICAgIA0KICAgIGRlZiBzZXQodD0w # LjAsIG1vZGU9OmFicywgZGVjbW9kZT1mYWxzZSkNCiAgICAgIA0KICAgICAg # QHQgPSB0PT0wID8gRmxvYXQ6OkVQU0lMT04gOiB0LmFicw0KICAgICAgQHQg # PSAwLjUgaWYgQHQgPiAwLjUNCiAgICAgIEBtb2RlID0gbW9kZQ0KICAgICAg # QHQgPSBGbG9hdDo6RVBTSUxPTiBpZiBAbW9kZSE9OmFicyAmJiBAdDxGbG9h # dDo6RVBTSUxPTg0KICAgICAgQGRlY2ltYWxfbW9kZSA9IGRlY21vZGUNCiAg # ICAgIEBkID0gQHQ9PTAgPyAwIDogKC1NYXRoLmxvZzEwKDIqQHQpLmZsb29y # KS50b19pDQogICAgICANCiAgICAgIHNlbGYNCiAgICBlbmQNCiAgICANCiAg # ICBAQHJlZl9leHAgPSAxICMgTWF0aC5mcmV4cCgxKVsxXSA9PiB0b2wuIHJl # bGF0aXZlIHRvIFsxLDIpDQogICAgDQogICAgQEBkZWNfcmVmX2V4cCA9IDAg # IyB0b2wuIHJlbGF0aXZlIHRvIFswLjEsMSkNCiAgICANCiAgICBkZWYgcmVs # KHgpDQogICAgICByID0gQHQNCiAgICAgIGNhc2UgQG1vZGUNCiAgICAgICAg # d2hlbiA6c2lnDQogICAgICAgICAgaWYgQGRlY2ltYWxfbW9kZQ0KICAgICAg # ICAgICAgZCA9IHg9PTAgPyAwIDogKE1hdGgubG9nMTAoeC5hYnMpLmZsb29y # KzEpLnRvX2kNCiAgICAgICAgICAgIHIgPSBAdCooMTAqKihkLUBAZGVjX3Jl # Zl9leHApKQ0KICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIHgsZXhwID0g # TWF0aC5mcmV4cCh4KQ0KICAgICAgICAgICAgciA9IE1hdGgubGRleHAoQHQs # ZXhwLUBAcmVmX2V4cCkNCiAgICAgICAgICBlbmQNCiAgICAgICAgd2hlbiA6 # cmVsDQogICAgICAgICAgciA9IEB0KnguYWJzDQogICAgICBlbmQNCiAgICAg # IHINCiAgICBlbmQgIA0KICAgIA0KICBlbmQNCiAgDQogIGRlZiBUb2xlcmFu # Y2UuZGVjaW1hbHMoZD0wLCBtb2RlPTphYnMscm91bmRlZD10cnVlKQ0KICAg # IFRvbGVyYW5jZS5uZXcuZGVjaW1hbHMoZCxtb2RlLHJvdW5kZWQpDQogIGVu # ZA0KICBkZWYgVG9sZXJhbmNlLnNpZ19kZWNpbWFscyhkPTAsIG1vZGU9OmFi # cyxyb3VuZGVkPXRydWUpDQogICAgVG9sZXJhbmNlLm5ldy5zaWdfZGVjaW1h # bHMoZCxyb3VuZGVkKQ0KICBlbmQNCiAgZGVmIFRvbGVyYW5jZS5lcHNpbG9u # KG49MSwgbW9kZT06c2lnKQ0KICAgIFRvbGVyYW5jZS5uZXcuZXBzaWxvbihu # LCBtb2RlKQ0KICBlbmQNCiAgZGVmIFRvbGVyYW5jZS5iaWdfZXBzaWxvbihu # PTEsIG1vZGU9OnNpZykNCiAgICBUb2xlcmFuY2UubmV3LmJpZ19lcHNpbG9u # KG4sIG1vZGUpDQogIGVuZA0KICBkZWYgVG9sZXJhbmNlLmZyYWN0aW9uKGYp # DQogICAgVG9sZXJhbmNlLm5ldy5mcmFjdGlvbihmKQ0KICBlbmQNCiAgZGVm # IFRvbGVyYW5jZS5wZXJjZW50KHApDQogICAgVG9sZXJhbmNlLm5ldy5wZXJj # ZW50KHApDQogIGVuZA0KICBkZWYgVG9sZXJhbmNlLnBlcm1pbGxlKHApDQog # ICAgVG9sZXJhbmNlLm5ldy5wZXJtaWxsZShwKQ0KICBlbmQNCiAgDQoNCiAg # I1RoaXMgY2xhc3MgcmVwcmVzZW50cyBmbG9hdGluZyBwb2ludCB0b2xlcmFu # Y2VzIGZvciBCaWdEZWNpbWFsIG51bWJlcnMNCiAgI2FuZCBhbGxvd3MgY29t # cGFyaXNvbiB3aXRoaW4gdGhlIHNwZWNpZmllZCB0b2xlcmFuY2UuDQogIA0K # ICBjbGFzcyBCaWdUb2xlcmFuY2UNCiAgICBpbmNsdWRlIFN0YXRlRXF1aXZh # bGVudCAgDQogICAgbW9kdWxlIEJnTXRoDQogICAgICBleHRlbmQgQmlnTWF0 # aCBpZiA6OlJVQllfVkVSU0lPTj49JzEuOC4xJw0KICAgIGVuZA0KDQogICAg # ZGVmIG51bUNsYXNzDQogICAgICBCaWdEZWNpbWFsDQogICAgZW5kDQoNCiAg # ICAjVGhlIHRvbGVyYW5jZSBtb2RlIGlzIGVpdGhlciA6YWJzIChhYnNvbHV0 # ZSkgOnJlbCAocmVsYXRpdmUpIG9yIDpzaWcNCiAgICBkZWYgaW5pdGlhbGl6 # ZSh0PUJpZ0RlY2ltYWwoJzAnKSwgbW9kZT06YWJzLCBkZWNtb2RlPWZhbHNl # KQ0KICAgICAgc2V0IHQsIG1vZGUsIGRlY21vZGUNCiAgICBlbmQNCiAgICAN # CiAgICANCiAgICAjVGhpcyBpbml0aWFsaXplcyBhIEJpZ1RvbGVyYW5jZSB3 # aXRoIGEgZ2l2ZW4gbnVtYmVyIG9mIGRlY2ltYWxzDQogICAgZGVmIGRlY2lt # YWxzKGQsIG1vZGU9OmFicywgcm91bmRlZD10cnVlKQ0KICAgICAgDQogICAg # ICBAbW9kZSA9IG1vZGUNCiAgICAgIEBkZWNpbWFsX21vZGUgPSB0cnVlDQog # ICAgICBAZCA9IGQ9PTAgPyAxNiA6IGQNCiAgICAgIGlmIHJvdW5kZWQNCiAg # ICAgICAgQHQgPSBCaWdEZWNpbWFsKCIwLjVFI3stZH0iKSAjIEhBTEYqKEJp # Z0RlY2ltYWwoMTApKiooLWQpKQ0KICAgICAgZWxzZQ0KICAgICAgICBAdCA9 # IEJpZ0RlY2ltYWwoIjFFI3stZH0iKSAjIEJpZ0RlY2ltYWwoMTApKiooLWQp # DQogICAgICBlbmQNCiAgICAgIEByZWZfZXhwID0gQmlnRGVjaW1hbCgnMC4x # JykuZXhwb25lbnQgIyByZWZlcmVuY2UgZm9yIHNpZ25pZmljYXRpdmUgbW9k # ZTogWzAuMSwxKQ0KICAgICAgDQogICAgICBzZWxmDQogICAgZW5kDQogICAg # DQogICAgI1RoaXMgaW5pdGlhbGl6ZXMgYSBCaWdUb2xlcmFuY2Ugd2l0aCBh # IG51bWJlciBvZiBzaWduaWZpY2F0aXZlIGRlY2ltYWwgZGlnaXRzDQogICAg # ZGVmIHNpZ19kZWNpbWFscyhkLCByb3VuZGVkPXRydWUpDQogICAgICBkZWNp # bWFscyBkLCA6c2lnLCByb3VuZGVkDQogICAgZW5kDQogICAgDQogICAgZGVm # IGZyYWN0aW9uKGYpDQogICAgICBzZXQgZiwgOnJlbA0KICAgIGVuZA0KICAg # IGRlZiBwZXJjZW50KHgpDQogICAgICBmcmFjdGlvbiB4KkJpZ0RlY2ltYWwo # JzAuMDEnKQ0KICAgIGVuZA0KICAgIGRlZiBwZXJtaWxsZSh4KQ0KICAgICAg # ZnJhY3Rpb24geCpCaWdEZWNpbWFsKCcwLjAwMScpDQogICAgZW5kDQogICAg # DQoNCiAgICAjU2hvcnRjdXQgbm90YXRpb24NCiAgICBkZWYgW10oeCkNCiAg # ICAgIHJldHVybiB4Lm5pbD8gPyBAdCA6IGdldFZhbHVlKHgpDQogICAgZW5k # DQogICAgI1JldHVybiB0b2xlcmFuY2UgcmVsYXRpdmUgdG8gYSBtYWduaXR1 # ZGUNCiAgICBkZWYgZ2V0VmFsdWUoeCkgIA0KICAgICAgcmVsKHgpDQogICAg # ZW5kDQogICAgI0Vzc2VudGlhbCBlcXVhbGl0eSB3aXRoaW4gdG9sZXJhbmNl # DQogICAgZGVmIGVxdWFscz8oeCx5KQ0KICAgICAgDQogICAgICBjYXNlIEBt # b2RlDQogICAgICAgIHdoZW4gOnNpZw0KICAgICAgICAgIA0KICAgICAgICAg # IHhfZXhwID0geC5leHBvbmVudA0KICAgICAgICAgIHlfZXhwID0geS5leHBv # bmVudCAgDQogICAgICAgICAgKHkteCkuYWJzIDw9IEB0KkJpZ0RlY2ltYWwo # IjFFI3tbeF9leHAseV9leHBdLm1pbi1AcmVmX2V4cH0iKQ0KICAgICAgICAg # IA0KICAgICAgICB3aGVuIDpyZWwNCiAgICAgICAgICANCiAgICAgICAgICAo # eS14KS5hYnMgPD0gQHQqKFt4LmFicyx5LmFic10ubWluKSAjcmVmZXJlbmNl # IHZhbHVlIGlzIDENCiAgICAgICAgICANCiAgICAgICAgd2hlbiA6YWJzDQog # ICAgICAgICAgKHgteSkuYWJzPEB0DQogICAgICBlbmQNCiAgICAgICAgICAg # ICANCiAgICBlbmQNCiAgICAjQXBwcm94aW1hdGUgZXF1YWxpdHkgd2l0aGlu # IHRvbGVyYW5jZQ0KICAgIGRlZiBhcHJ4RXF1YWxzPyh4LHkpDQogICAgICAN # CiAgICAgIGNhc2UgQG1vZGUNCiAgICAgICAgd2hlbiA6c2lnDQogICAgICAg # ICAgDQogICAgICAgICAgeF9leHAgPSB4LmV4cG9uZW50DQogICAgICAgICAg # eV9leHAgPSB5LmV4cG9uZW50ICANCiAgICAgICAgICAoeS14KS5hYnMgPD0g # QHQqQmlnRGVjaW1hbCgiMUUje1t4X2V4cCx5X2V4cF0ubWF4LUByZWZfZXhw # fSIpDQogICAgICAgICAgDQogICAgICAgIHdoZW4gOnJlbA0KICAgICAgICAg # IA0KICAgICAgICAgICh5LXgpLmFicyA8PSBAdCooW3guYWJzLHkuYWJzXS5t # YXgpICNyZWZlcmVuY2UgdmFsdWUgaXMgMQ0KICAgICAgICAgIA0KICAgICAg # ICB3aGVuIDphYnMNCiAgICAgICAgICAoeC15KS5hYnM8PUB0DQogICAgICBl # bmQNCiAgICAgICAgICAgICANCiAgICBlbmQNCiAgICAjQ29tcGFyaXNvbiB3 # aXRoaW4gdG9sZXJhbmNlDQogICAgZGVmIGdyZWF0ZXJUaGFuPyh4LHkpDQog # ICAgICBsZXNzVGhhbj8oeSx4KQ0KICAgIGVuZA0KICAgICNDb21wYXJpc29u # IHdpdGhpbiB0b2xlcmFuY2UNCiAgICBkZWYgbGVzc1RoYW4/KHgseSkNCiAg # ICAgDQogICAgIGNhc2UgQG1vZGUNCiAgICAgICB3aGVuIDpzaWcNCiAgICAg # ICAgIA0KICAgICAgICAgeF9leHAgPSB4LmV4cG9uZW50DQogICAgICAgICB5 # X2V4cCA9IHkuZXhwb25lbnQgIA0KICAgICAgICAgeS14ID4gQHQqQmlnRGVj # aW1hbCgiMUUje1t4X2V4cCx5X2V4cF0ubWF4LUByZWZfZXhwfSIpDQogICAg # ICAgICANCiAgICAgICB3aGVuIDpyZWwNCiAgICAgICAgIA0KICAgICAgICAg # eS14ID4gQHQqKFt4LmFicyx5LmFic10ubWF4KSAjcmVmZXJlbmNlIHZhbHVl # IGlzIDENCiAgICAgICAgIA0KICAgICAgIHdoZW4gOmFicw0KICAgICAgICAg # eC15PEB0DQogICAgIGVuZA0KICAgICAgICANCiAgICBlbmQNCiAgICAjQ29t # cGFyaXNvbiB3aXRoaW4gdG9sZXJhbmNlDQogICAgZGVmIHplcm8/KHgsY29t # cGFyZWRfd2l0aD1uaWwpDQogICAgICBjb21wYXJlZF93aXRoLm5pbD8gPyB4 # LmFiczxAdCA6IHguYWJzPHJlbChjb21wYXJlZF93aXRoKQ0KICAgIGVuZA0K # DQogICAgDQogICAgZGVmIGFwcHJ4X2k/KHgpDQogICAgICBlcXVhbHM/KHgs # eC5yb3VuZCkNCiAgICBlbmQNCiAgICBkZWYgYXBwcnhfaSh4LHJlc3VsdD1J # bnRlZ2VyKQ0KICAgICAgciA9IHgucm91bmQNCiAgICAgIHJldHVybiBlcXVh # bHM/KHgscikgPyByLnByZWMocmVzdWx0KSA6IHgNCiAgICBlbmQNCiAgICAg # IA0KICAgIA0KICAgIGRlZiBnZXRNYWduaXR1ZGUNCiAgICAgIEB0DQogICAg # ZW5kDQogICAgZGVmIGdldERlY2ltYWxzICANCiAgICAgIEBkDQogICAgZW5k # DQogICAgZGVmIGRlY2ltYWw/DQogICAgICBAZGVjaW1hbF9tb2RlDQogICAg # ZW5kDQogICAgZGVmIG1vZGUNCiAgICAgIEBtb2RlDQogICAgZW5kDQogICAg # DQogICAgDQogICAgcHJpdmF0ZQ0KICAgIA0KICAgIEhBTEYgPSBCaWdEZWNp # bWFsKCcwLjUnKQ0KICAgIA0KICAgIGRlZiBzZXQodD1CaWdEZWNpbWFsKCcw # JyksIG1vZGU9OmFicywgZGVjbW9kZT1mYWxzZSkNCiAgICAgIA0KICAgICAg # QHQgPSB0DQogICAgICBAdCA9IEhBTEYgaWYgQHQgPiBIQUxGDQogICAgICBy # YWlzZSBUeXBlRXJyb3IsIkVsIHZhbG9yIGRlIHRvbGVyYW5jaWEgZGViZSBz # ZXIgZGUgdGlwbyBCaWdEZWNpbWFsIiBpZiBAdC5jbGFzcyE9QmlnRGVjaW1h # bA0KICAgICAgQG1vZGUgPSBtb2RlDQogICAgICBAZGVjaW1hbF9tb2RlID0g # ZGVjbW9kZQ0KICAgICAgQGQgPSBAdC56ZXJvPyA/IDAgOiAtKEB0KjIpLmV4 # cG9uZW50KzENCiAgICAgIEByZWZfZXhwID0gQmlnRGVjaW1hbCgnMScpLmV4 # cG9uZW50ICMgcmVmZXJlbmNlIGZvciBzaWduaWZpY2F0aXZlIG1vZGU6IFsx # LDEwKQ0KICAgICAgDQogICAgICBzZWxmDQogICAgZW5kDQogICAgDQogICAg # ZGVmIHJlbCh4KQ0KICAgICAgciA9IEB0DQogICAgICBjYXNlIEBtb2RlDQog # ICAgICAgIHdoZW4gOnNpZw0KICAgICAgICAgIGQgPSB4PT0wID8gMCA6IHgu # ZXhwb25lbnQNCiAgICAgICAgICByID0gQHQqQmlnRGVjaW1hbCgiMUUje2Qt # QHJlZl9leHB9IikNCiAgICAgICAgd2hlbiA6cmVsDQogICAgICAgICAgciA9 # IEB0KnguYWJzDQogICAgICBlbmQNCiAgICAgIHINCiAgICBlbmQgIA0KICAg # IA0KICBlbmQNCiAgDQogIGRlZiBCaWdUb2xlcmFuY2UuZGVjaW1hbHMoZD0w # LCBtb2RlPTphYnMpDQogICAgQmlnVG9sZXJhbmNlLm5ldy5kZWNpbWFscyhk # LG1vZGUpDQogIGVuZA0KICBkZWYgQmlnVG9sZXJhbmNlLnNpZ19kZWNpbWFs # cyhkPTAsIG1vZGU9OmFicykNCiAgICBCaWdUb2xlcmFuY2UubmV3LnNpZ19k # ZWNpbWFscyhkKQ0KICBlbmQNCiAgZGVmIEJpZ1RvbGVyYW5jZS5mcmFjdGlv # bihmKQ0KICAgIEJpZ1RvbGVyYW5jZS5uZXcuZnJhY3Rpb24oZikNCiAgZW5k # DQogIGRlZiBCaWdUb2xlcmFuY2UucGVyY2VudChwKQ0KICAgIEJpZ1RvbGVy # YW5jZS5uZXcucGVyY2VudChwKQ0KICBlbmQNCiAgZGVmIFRvbGVyYW5jZS5w # ZXJtaWxsZShwKQ0KICAgIEJpZ1RvbGVyYW5jZS5uZXcucGVybWlsbGUocCkN # CiAgZW5kDQogIA0KICBtb2R1bGVfZnVuY3Rpb24NCiAgDQogIGRlZiBUb2wo # eCkNCiAgICBjYXNlIHgNCiAgICAgIHdoZW4gVG9sZXJhbmNlDQogICAgICAg # IHgNCiAgICAgIHdoZW4gQmlnVG9sZXJhbmNlDQogICAgICAgIHgNCiAgICAg # IHdoZW4gQmlnRGVjaW1hbA0KICAgICAgICBCaWdUb2xlcmFuY2UubmV3KHgp # DQogICAgICB3aGVuIEZsb2F0DQogICAgICAgIFRvbGVyYW5jZS5uZXcoeCkN # CiAgICAgIHdoZW4gSW50ZWdlcg0KICAgICAgICBUb2xlcmFuY2Uuc2lnX2Rl # Y2ltYWxzKHgpDQogICAgICBlbHNlICMgZS5nLiBSYXRpb25hbA0KICAgICAg # ICB4IA0KICAgIGVuZA0KICBlbmQNCg0KICBkZWYgQmlnVG9sKHgpDQogICAg # Y2FzZSB4DQogICAgICB3aGVuIEJpZ1RvbGVyYW5jZQ0KICAgICAgICB4DQog # ICAgICB3aGVuIEludGVnZXINCiAgICAgICAgQmlnVG9sZXJhbmNlLnNpZ19k # ZWNpbWFscyh4KQ0KICAgICAgd2hlbiBSYXRpb25hbA0KICAgICAgICB4DQog # ICAgICBlbHNlDQogICAgICAgIEJpZ1RvbGVyYW5jZS5uZXcoQmlnRGVjKHgp # KQ0KICAgIGVuZA0KICBlbmQNCiAgDQplbmQNCgAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wL2dvaS9tb25leS5yYgAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEwMDY2NiAA # ICAgICAwIAAgICAgIDAgACAgICAgIDExNDM0IDEwNjcyNTY2MzczICAxMjQy # MQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAB1c3RhciAgAHVzZXIAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAZ3JvdXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj # IE1vbmV0YXJ5IERhdGEgVHlwZQ0KDQojIENvcHlyaWdodCAoQykgMjAwMy0y # MDA1LCBKYXZpZXIgR29penVldGEgPGphdmllckBnb2l6dWV0YS5pbmZvPg0K # Iw0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy # ZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQojIG1vZGlmeSBpdCB1bmRlciB0aGUg # dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFz # IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl # aXRoZXIgdmVyc2lvbiAyDQojIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91 # ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KDQoNCnJlcXVpcmUgJ2dv # aS9uZm10Jw0KcmVxdWlyZSAnZ29pL3Rvb2xzJw0KDQptb2R1bGUgR29pDQog # IA0KICBjbGFzcyBDdXJyZW5jeQ0KICAgIGluY2x1ZGUgU3RhdGVFcXVpdmFs # ZW50DQogICAgZGVmIGluaXRpYWxpemUobmFtZSxhYnIsYWJyX3BsLHN5bWJv # bCxjb2RlQSxjb2RlTixuZGVjLHJlZl9yYXRlLGRlZl9sYW5nPTplbikNCiAg # ICAgIEBuYW1lPW5hbWUNCiAgICAgIEBhYnIgPSBhYnINCiAgICAgIEBhYnJf # cGwgPSBhYnJfcGwNCiAgICAgIEBzeW1ib2wgPSBzeW1ib2wNCiAgICAgIEBj # b2RlQSA9IGNvZGVBDQogICAgICBAY29kZU4gPSBjb2RlTg0KICAgICAgQG5k # ZWMgPSBuZGVjDQogICAgICBAcmVmX3JhdGUgPSByZWZfcmF0ZQ0KICAgICAg # QGRlZl9sYW5nID0gZGVmX2xhbmcNCiAgICBlbmQNCiAgICBhdHRyX3JlYWRl # ciA6bmFtZSwgOmFiciwgOmFicl9wbCwgOnN5bWJvbCwgOmNvZGVBLCA6Y29k # ZU4sIDpuZGVjLCA6cmVmX3JhdGUsIDpkZWZfbGFuZw0KICAgIGF0dHJfd3Jp # dGVyIDpkZWZfbGFuZywgOm5kZWMsIDpyZWZfcmF0ZQ0KICAgIA0KICAgIGRl # ZiBjb252ZXJ0KHYsZGVzdF9jdXJyKQ0KICAgICAgdiAqPSBkZXN0X2N1cnIu # cmVmX3JhdGUNCiAgICAgIHYgLz0gQHJlZl9yYXRlDQogICAgZW5kICANCiAg # ICANCiAgZW5kDQogICAgICANCiAgY2xhc3MgQ3VycmVuY3kgIA0KICBAQGN1 # cnJzID0gew0KICAgICA6ZXVyPT5DdXJyZW5jeS5uZXcoJ0V1cm8nLCdldXJv # JywnZXVyb3MnLCJceDgwIiwnRVVSJywnOTc4JywyLDEpLDplc3A9PkN1cnJl # bmN5Lm5ldygnUGVzZXRhJywnUHRzLicsJ1B0cy4nLCcnLCdFU1AnLCc3MjQn # LDAsMTY2LjM4Niw6ZXMpLA0KICAgICA6cmVmPT5DdXJyZW5jeS5uZXcoJ0V1 # cm8nLCdldXJvJywnZXVyb3MnLCJceDgwIiwnRVVSJywnOTc4JywyLDEpLCAj # IHJlZmVyZW5jZTogZXVybw0KICAgICA6ZGVmPT5DdXJyZW5jeS5uZXcoJ0V1 # cm8nLCdldXJvJywnZXVyb3MnLCJceDgwIiwnRVVSJywnOTc4JywyLDEpICAj # IGRlZmF1bHQ6IGN1cnJlbmN5OiByZWZlcmVuY2UNCiAgfQ0KICBkZWYgc2Vs # Zi5kZWZpbmUodGFnLGN1cnJfZGVmKQ0KICAgIEBAY3VycnNbdGFnXT1jdXJy # X2RlZg0KICBlbmQNCiAgZGVmIHNlbGYuZ2V0KHRhZykNCiAgICBAQGN1cnJz # W3RhZ10NCiAgZW5kDQogIGVuZA0KICANCiAgY2xhc3MgQ3VycmVuY3kNCiAg # ICBAQGRlZl9mbXRzID0ge30NCiAgICBkZWYgZGVmYXVsdEZtdA0KICAgICAg # Zm10ID0gQEBkZWZfZm10c1tAY29kZUFdDQogICAgICBmbXQgPSBORm10Lmdl # dChAZGVmX2xhbmcpLmR1cC5wcmVjKEBuZGVjLDpmaXgsOmluZikgaWYgZm10 # PT1uaWwNCiAgICAgIGZtdA0KICAgIGVuZA0KICAgIGRlZiBkZWZpbmVfZGVm # YXVsdEZtdChmbXQpDQogICAgICBAQGRlZl9mbXRzW0Bjb2RlQV0gPSBmbXQN # CiAgICBlbmQNCiAgZW5kDQogICAgICANCiAgY2xhc3MgTW9uZXkNCiAgICBp # bmNsdWRlIFN0YXRlRXF1aXZhbGVudA0KICAgIEBAbnVtX3QgPSBGbG9hdA0K # ICAgIGRlZiBpbml0aWFsaXplKHY9MCxjdXJyPUN1cnJlbmN5LmdldCg6ZGVm # KSxmbXQ9bmlsLGF1dG9fcm91bmQ9dHJ1ZSkNCiAgICAgIHNldCEgdiwgY3Vy # ciwgZm10LCBhdXRvX3JvdW5kDQogICAgZW5kDQogICAgDQogICAgZGVmIE1v # bmV5LmZvcm1hdHRlZCh2LGZtdCxjdXJyPUN1cnJlbmN5LmdldCg6ZGVmKSxh # dXRvX3JvdW5kPXRydWUpDQogICAgICBNb25leS5uZXcgdiwgY3VyciwgZm10 # LCBhdXRvX3JvdW5kDQogICAgZW5kDQogICAgZGVmIE1vbmV5LnJvdW5kaW5n # KHYsY3Vycj1DdXJyZW5jeS5nZXQoOmRlZiksZm10PW5pbCkNCiAgICAgIE1v # bmV5Lm5ldyB2LCBjdXJyLCBmbXQsIHRydWUNCiAgICBlbmQNCiAgICBkZWYg # TW9uZXkubm9ucm91bmRpbmcodixjdXJyPUN1cnJlbmN5LmdldCg6ZGVmKSxm # bXQ9bmlsKQ0KICAgICAgTW9uZXkubmV3IHYsIGN1cnIsIGZtdCwgZmFsc2UN # CiAgICBlbmQNCiAgICAgIA0KICAgICAgDQogICAgDQogICAgZGVmIGFtb3Vu # dChjdXJyPW5pbCkNCiAgICAgIGlmIGN1cnIhPW5pbCAmJiBjdXJyIT1AY3Vy # cg0KICAgICAgICByZXR1cm4gQGN1cnIuY29udmVydChAdixjdXJyKQ0KICAg # ICAgZW5kDQogICAgICBAdg0KICAgIGVuZA0KICAgIGRlZiBjdXJyZW5jeQ0K # ICAgICAgQGN1cnINCiAgICBlbmQNCiAgICBkZWYgZm9ybWF0DQogICAgICBA # Zm10DQogICAgZW5kDQogICAgZGVmIGF1dG9fcm91bmQNCiAgICAgIEBhdXRv # cg0KICAgIGVuZA0KICAgIA0KICAgIA0KICAgIGRlZiBjb252ZXJ0KGN1cnIs # Zm10PW5pbCkgIA0KICAgICAgTW9uZXkubmV3KEBjdXJyLmNvbnZlcnQoQHYs # Y3VyciksY3VycixmbXQsQGF1dG9yKSAgIyBkdXAuY29udmVydCEoY3Vycixm # bXQpDQogICAgZW5kDQogICAgDQogICAgZGVmIHdyaXRlRm10KCkNCiAgICAg # ICMgdG8gZG86IHByaW50IGN1cnJlbmN5IG9wdGlvbmFseSBhbmQgaGFuZGxl # IG5lZ2F0aXZlIGFtb3VudCBmb3JtYXQNCiAgICAgIEB2LndyaXRlRm10KEBm # bXQpDQogICAgZW5kDQogICAgZGVmIHJlYWRGbXQhKHR4dCkNCiAgICAgIEB2 # ID0gQEBudW1fdC5yZWFkRm10KHR4dCwgQGZtdCkNCiAgICAgIA0KICAgICAg # aWYgQGF1dG9yDQogICAgICAgIEB2ID0gQHYucm91bmRGbXQoQGZtdCkNCiAg # ICAgIGVuZA0KICAgICAgDQogICAgZW5kDQogICAgZGVmIHRvX3M7IHdyaXRl # Rm10OyBlbmQNCiAgICBkZWYgcm91bmQNCiAgICAgIE1vbmV5Lm5ldyhAdi5y # b3VuZEZtdChAZm10KSxAY3VycixAZm10LEBhdXRvcikgIyBkdXAucm91bmQh # DQogICAgZW5kDQogICAgDQogICAgZGVmICooeCkNCiAgICAgIE1vbmV5Lm5l # dyhAdip4LEBjdXJyLEBmbXQsQGF1dG9yKQ0KICAgIGVuZA0KICAgIGRlZiAr # KG0pDQogICAgICBNb25leS5uZXcoQHYrbS5hbW91bnQoQGN1cnIpLEBjdXJy # LEBmbXQsQGF1dG9yKQ0KICAgIGVuZA0KICAgIGRlZiAtKG0pDQogICAgICBN # b25leS5uZXcoQHYtbS5hbW91bnQoQGN1cnIpLEBjdXJyLEBmbXQsQGF1dG9y # KQ0KICAgIGVuZA0KICAgIGRlZiAvKHhtKQ0KICAgICAgaWYgeG0uaXNfYT8o # TW9uZXkpDQogICAgICAgIEB2L3htLmFtb3VudChAY3VycikNCiAgICAgIGVs # c2UNCiAgICAgICAgTW9uZXkubmV3KEB2L3htLEBjdXJyLEBmbXQsQGF1dG9y # KQ0KICAgICAgZW5kDQogICAgZW5kDQogICAgZGVmIC1ADQogICAgICBNb25l # eS5uZXcoLUB2LEBjdXJyLEBmbXQsQGF1dG9yKQ0KICAgIGVuZCAgDQogICAg # ICANCiAgICANCiAgICBkZWYgPD0+KG0yKQ0KICAgICAgcmV0dXJuIG5pbCB1 # bmxlc3MgbTINCiAgICAgIHYxID0gQHYNCiAgICAgIHYyID0gbTIuYW1vdW50 # KGN1cnJlbmN5KQ0KICAgICMgIGlmIGF1dG9fcm91bmQgJiYgbTIuYXV0b19y # b3VuZCAmJiAoY3VycmVuY3kgIT0gbTIuY3VycmVuY3kpDQogICAgIyAgICB2 # MiA9IHYyLnJvdW5kRm10KEBmbXQpDQogICAgIyAgZW5kDQogICAgICB2MSA8 # PT4gdjINCiAgICBlbmQNCiAgICBpbmNsdWRlIENvbXBhcmFibGUNCiAgICAg # IA0KICAgIA0KICAgIGRlZiBjb252ZXJ0IShjdXJyLGZtdD1uaWwpDQogICAg # ICBzZXQhIEBjdXJyLmNvbnZlcnQoQHYsY3VyciksY3VycixmbXQsQGF1dG9y # DQogICAgICBzZWxmDQogICAgZW5kDQogICAgDQogICAgZGVmIHJvdW5kIQ0K # ICAgICAgc2V0ISBAdi5yb3VuZEZtdChAZm10KSxAY3VycixAZm10LEBhdXRv # cg0KICAgICAgc2VsZg0KICAgIGVuZA0KICAgIA0KICAgIHByb3RlY3RlZA0K # ICAgIA0KICAgIGRlZiBzZXQhKHYsY3VycixmbXQsYXV0b19yb3VuZCkgIA0K # ICAgICAgQGN1cnIgPSBjdXJyDQogICAgICBAZm10ID0gZm10DQogICAgICBA # Zm10ID0gY3Vyci5kZWZhdWx0Rm10IGlmIEBmbXQ9PW5pbA0KICAgICAgQGF1 # dG9yID0gYXV0b19yb3VuZA0KDQogICAgICBpZiB2LmlzX2E/IFN0cmluZw0K # ICAgICAgICBAdiA9IEBAbnVtX3QucmVhZEZtdCh2LCBAZm10KSAgICANCiAg # ICAgIGVsc2lmIHYuaXNfYT8gQEBudW1fdA0KICAgICAgICAjIHVzZWQgaW50 # ZXJuYWxseSAoYXJpdGhtZXRpYyBvcGVyYXRvcnMpDQogICAgICAgIEB2ID0g # dg0KICAgICAgZWxzZQ0KICAgICAgICAjIEB2ID0gdi5wcmVjKEBAbnVtX3Qp # ICMgdW5zYWZlOiBkb2VzIG5vdCB3b3JrIGZvciBhbGwgdHlwZXMNCiAgICAg # ICAgaWYgYXV0b19yb3VuZCAgICANCiAgICAgICAgICBAdiA9IEBAbnVtX3Qu # cmVhZEZtdCh2LndyaXRlRm10KEBmbXQpLEBmbXQpICMgcm91bmRzDQogICAg # ICAgIGVsc2UNCiAgICAgICAgICBAdiA9IE5GbXQuY29udmVydCh2LCBAQG51 # bV90KQ0KICAgICAgICBlbmQNCiAgICAgIGVuZA0KICAgICAgDQogICAgICBp # ZiBAYXV0b3INCiAgICAgICAgQHYgPSBAdi5yb3VuZEZtdChAZm10KQ0KICAg # ICAgZW5kDQogICAgICANCiAgICBlbmQNCiAgICAgIA0KICBlbmQNCiAgICAg # IA0KICBjbGFzcyBNb25leQ0KICAgIGRlZiBzZWxmLnNldE51bVR5cGUobnQp # DQogICAgICBAQG51bV90ID0gbnQNCiAgICBlbmQNCiAgICBkZWYgc2VsZi5n # ZXROdW1UeXBlKCkNCiAgICAgIEBAbnVtX3QNCiAgICBlbmQNCiAgZW5kDQog # IA0KICBtb2R1bGVfZnVuY3Rpb24NCiAgDQplbmQNCgAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcC9nb2kvbXVs # dGllbnVtLnJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAx # MDA2NjYgACAgICAgMCAAICAgICAwIAAgICAgICAgMzY0NCAxMDY3MjU2NjM3 # MyAgMTMyNzUAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB1c2VyAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAGdyb3VwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAADQojIENvcHlyaWdodCAoQykgMjAwMy0yMDA1LCBKYXZpZXIgR29p # enVldGEgPGphdmllckBnb2l6dWV0YS5pbmZvPg0KIw0KIyBUaGlzIHByb2dy # YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg # YW5kL29yDQojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO # VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFzIHB1Ymxpc2hlZCBieSB0 # aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy # DQojIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs # YXRlciB2ZXJzaW9uLg0KDQoNCj1iZWdpbg0KbXVsdGktbGV2ZWwgbG9vcCBt # aXhpbjogYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBtdWx0aWxvb3AgbXVz # dCBwcm92aWRlDQogaW5pdChsZXZlbCksIGNoZWNrKGxldmVsKSwgbmV4dChs # ZXZlbCksIHlpZWxkX3ByZShsZXZlbCkgYW5kIHlpZWxkX3BvcyhsZXZlbCkN # Cg0KdGhlbiwgcnVuTG9vcChsZXZlbHMpICh3aXRoIGxldmVscyBhIGNvbGxl # Y3Rpb25zIG9mIG9iamVjdHMgPDE+LDwyPiwuLi4sPG4+KQ0KaXMgZXF1aXZh # bGVudCB0bzoNCiANCmluaXQoPDE+KQ0Kd2hpbGUgY2hlY2soPDE+KQ0KICB5 # aWVsZF9wcmUoPDE+KQ0KICBpbml0KDwyPikNCiAgd2hpbGUgY2hlY2soPDI+ # KQ0KICAgIHlpZWxkX3ByZSg8Mj4pDQogICAgaW5pdCg8Mz4pDQogICAgd2hp # bGUgY2hlY2soPDM+KQ0KICAgICAgLi4uDQogICAgICAgICAgeWllbGRfcHJl # KDxuLTE+KQ0KICAgICAgICAgIGluaXQoPG4+KQ0KICAgICAgICAgIHdoaWxl # IGNoZWNrKDxuPikNCiAgICAgICAgICAgIHlpZWxkX3ByZSg8bj4pDQogICAg # ICAgICAgICB5aWVsZF9wb3MoPG4+KQ0KICAgICAgICAgICAgbmV4dCg8bj4p # DQogICAgICAgICAgZW5kDQogICAgICAgICAgeWllbGRfcG9zKDxuLTE+KQ0K # ICAgICAgLi4uDQogICAgICBuZXh0KDwzPikNCiAgICBlbmQNCiAgICB5aWVs # ZF9wb3MoPDI+KQ0KICAgIG5leHQoPDI+KQ0KICBlbmQNCiAgeWllbGRfcG9z # KDwxPikNCiAgbmV4dCg8MT4pDQplbmQgDQogDQo9ZW5kDQoNCm1vZHVsZSBN # dWx0aUVudW1lcmFibGUNCiAgZGVmIG11bHRpX2VhY2goJmJsaykNCiAgICB2 # ID0gW10NCiAgICBzZWxmLmVhY2gge3xpfCB2IDw8IGl9ICANCiAgICBAbXVs # dGlFbnVtZXJhYmxlX3R1cGxlID0gQXJyYXkubmV3KHYubGVuZ3RoKQ0KICAg # IGVhY2hfbGV2ZWwodiwtMSxuaWwsJmJsaykNCiAgZW5kDQogIHByb3RlY3Rl # ZA0KICBkZWYgZWFjaF9sZXZlbCh2LGwsdmwsJmJsaykNCiAgIG4gPSB2Lmxl # bmd0aA0KICAgQG11bHRpRW51bWVyYWJsZV90dXBsZVtsXSA9IHZsIGlmIGw+ # PTANCiAgIHlpZWxkIEBtdWx0aUVudW1lcmFibGVfdHVwbGUgaWYgbD09KG4t # MSkNCiAgIGlmIGw8KG4tMSApDQogICAgIHZbbCsxXS5lYWNoIHt8dml8IGVh # Y2hfbGV2ZWwodixsKzEsdmksJmJsaykgfQ0KICAgZW5kICAgDQogIGVuZA0K # ZW5kDQoNCm1vZHVsZSBNdWx0aUVudW1lcmFibGUNCiAgcHVibGljDQogIGRl # ZiBtdWx0aV9lYWNoX2luZGV4KCZibGspDQogICAgdiA9IFtdDQogICAgc2Vs # Zi5lYWNoX2luZGV4IHt8aXwgdiA8PCBpfSAgDQogICAgQG11bHRpRW51bWVy # YWJsZV90dXBsZSA9IEFycmF5Lm5ldyh2Lmxlbmd0aCkNCiAgICBlYWNoX2lu # ZGV4X2xldmVsKHYsLTEsbmlsLCZibGspDQogIGVuZA0KICBwcm90ZWN0ZWQN # CiAgZGVmIGVhY2hfaW5kZXhfbGV2ZWwodixsLHZsLCZibGspDQogICBuID0g # di5sZW5ndGgNCiAgIEBtdWx0aUVudW1lcmFibGVfdHVwbGVbbF0gPSB2bCBp # ZiBsPj0wDQogICB5aWVsZCBAbXVsdGlFbnVtZXJhYmxlX3R1cGxlIGlmIGw9 # PShuLTEpDQogICBpZiBsPChuLTEgKQ0KICAgICBzZWxmW3ZbbCsxXV0uZWFj # aF9pbmRleCB7fHZpfCBlYWNoX2luZGV4X2xldmVsKHYsbCsxLHZpLCZibGsp # IH0NCiAgIGVuZCAgIA0KICBlbmQNCmVuZA0KAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXAvZ29pL211bHRpbG9v # cC5yYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTAwNjY2 # IAAgICAgIDAgACAgICAgMCAAICAgICAgIDMxNzUgMTA2NzI1NjYzNzMgIDEz # MzAxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdXNlcgAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAABncm91cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AA0KIyBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSwgSmF2aWVyIEdvaXp1ZXRh # IDxqYXZpZXJAZ29penVldGEuaW5mbz4NCiMNCiMgVGhpcyBwcm9ncmFtIGlz # IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v # cg0KIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu # ZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy # ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMg0KIyBv # ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg # dmVyc2lvbi4NCg0KDQo9YmVnaW4NCm11bHRpLWxldmVsIGxvb3AgbWl4aW46 # IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgbXVsdGlsb29wIG11c3QgcHJv # dmlkZQ0KIGluaXQobGV2ZWwpLCBjaGVjayhsZXZlbCksIG5leHQobGV2ZWwp # LCB5aWVsZF9wcmUobGV2ZWwpIGFuZCB5aWVsZF9wb3MobGV2ZWwpDQoNCnRo # ZW4sIHJ1bkxvb3AobGV2ZWxzKSAod2l0aCBsZXZlbHMgYSBjb2xsZWN0aW9u # cyBvZiBvYmplY3RzIDwxPiw8Mj4sLi4uLDxuPikNCmlzIGVxdWl2YWxlbnQg # dG86DQogDQppbml0KDwxPikNCndoaWxlIGNoZWNrKDwxPikNCiAgeWllbGRf # cHJlKDwxPikNCiAgaW5pdCg8Mj4pDQogIHdoaWxlIGNoZWNrKDwyPikNCiAg # ICB5aWVsZF9wcmUoPDI+KQ0KICAgIGluaXQoPDM+KQ0KICAgIHdoaWxlIGNo # ZWNrKDwzPikNCiAgICAgIC4uLg0KICAgICAgICAgIHlpZWxkX3ByZSg8bi0x # PikNCiAgICAgICAgICBpbml0KDxuPikNCiAgICAgICAgICB3aGlsZSBjaGVj # ayg8bj4pDQogICAgICAgICAgICB5aWVsZF9wcmUoPG4+KQ0KICAgICAgICAg # ICAgeWllbGRfcG9zKDxuPikNCiAgICAgICAgICAgIG5leHQoPG4+KQ0KICAg # ICAgICAgIGVuZA0KICAgICAgICAgIHlpZWxkX3Bvcyg8bi0xPikNCiAgICAg # IC4uLg0KICAgICAgbmV4dCg8Mz4pDQogICAgZW5kDQogICAgeWllbGRfcG9z # KDwyPikNCiAgICBuZXh0KDwyPikNCiAgZW5kDQogIHlpZWxkX3Bvcyg8MT4p # DQogIG5leHQoPDE+KQ0KZW5kIA0KIA0KPWVuZA0KDQptb2R1bGUgTXVsdGlM # b29wDQogIGRlZiBydW5Mb29wKGxldmVscykNCiAgICAjIGxldmVscyBjYW4g # YmUgYW55dGhpbmcgd2l0aCB0b19hOyBpbiBwYXJ0aWN1bGFyIGFueSBlbnVt # ZXJhYmxlDQogICAgIyBzdWNoIGFzIGEgIHJhbmdlICgwLi4ubikNCiAgICAN # CiAgICBsZXZlbHMgPSBsZXZlbHMudG9fYQ0KICAgIG4gPSBsZXZlbHMubGVu # Z3RoDQogICAgbGV2ZWxfaSA9IC0xDQoNCiAgICBsb29wIGRvDQogICAgICBp # ZiBsZXZlbF9pPDAgfHwgKGxldmVsX2k8biAmJiBjaGVjayhsZXZlbHNbbGV2 # ZWxfaV0pKQ0KICAgICAgICB5aWVsZF9wcmUobGV2ZWxzW2xldmVsX2ldKSBp # ZiBsZXZlbF9pPj0wDQogICAgICAgIGxldmVsX2kgKz0gMQ0KICAgICAgICBp # bml0IGxldmVsc1tsZXZlbF9pXSBpZiBsZXZlbF9pPG4NCiAgICAgIGVsc2lm # IGxldmVsX2k+MA0KICAgICAgICBsZXZlbF9pIC09IDENCiAgICAgICAgeWll # bGRfcG9zIGxldmVsc1tsZXZlbF9pXQ0KICAgICAgICBzZWxmLm5leHQgbGV2 # ZWxzW2xldmVsX2ldDQogICAgICBlbHNlDQogICAgICAgIGJyZWFrDQogICAg # ICBlbmQNCiAgICBlbmQgICAgICAgIA0KICAgIA0KICBlbmQNCmVuZA0KAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdG1wL2dvaS9uZm10LnJiAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEwMDY2NiAAICAg # ICAwIAAgICAgIDAgACAgICAgMTI0NDUwIDEwNjcyNTY2MzczICAxMjI2MQAg # MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAB1c3RhciAgAHVzZXIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAZ3JvdXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIEZv # cm1hdHRpbmcgbnVtYmVycyBhcyB0ZXh0DQoNCiMgQ29weXJpZ2h0IChDKSAy # MDAzLTIwMDUsIEphdmllciBHb2l6dWV0YSA8amF2aWVyQGdvaXp1ZXRhLmlu # Zm8+DQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug # Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCiMgbW9kaWZ5IGl0IHVuZGVy # IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UN # CiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp # b247IGVpdGhlciB2ZXJzaW9uIDINCiMgb2YgdGhlIExpY2Vuc2UsIG9yIChh # dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQoNCg0KcmVxdWly # ZSAnZ29pL3Rvb2xzJw0KDQpyZXF1aXJlICdnb2kvcmVwZGVjJw0KDQpyZXF1 # aXJlICdnb2kvcnRubHpyJw0KDQpyZXF1aXJlICdyYXRpb25hbCcNCg0KcmVx # dWlyZSAnYmlnZGVjaW1hbCcNCg0KbW9kdWxlIEdvaQ0KICANCiAgIyBwb3Np # dGlvbmFsIG5vdGF0aW9uLCB1bmZvcm1hdHRlZCBudW1lcmljIGxpdGVyYWw6 # IHVzZWQgYXMgaW50ZXJtZWRpYXRlIGZvcm0NCiAgY2xhc3MgTmV1dHJhbE51 # bSANCiAgICBpbmNsdWRlIFN0YXRlRXF1aXZhbGVudA0KICAgIGRlZiBpbml0 # aWFsaXplKHM9JycsZD0nJyxwPW5pbCxyPW5pbCxkZ3M9RGlnaXRzRGVmLmJh # c2UoMTApLCBpbmV4YWN0PWZhbHNlLCByb3VuZD06aW5mKQ0KICAgICAgc2V0 # IHMsZCxwLHIsZGdzLGRncywgaW5leGFjdCwgcm91bmQNCiAgICBlbmQNCiAg # ICBhdHRyX3JlYWRlciA6c2lnbiwgOmRpZ2l0cywgOmRlY19wb3MsIDpyZXBf # cG9zLCA6c3BlY2lhbCwgOmluZXhhY3QsIDpyb3VuZGluZw0KICAgIGF0dHJf # d3JpdGVyIDpzaWduLCA6ZGlnaXRzLCA6ZGVjX3BvcywgOnJlcF9wb3MsIDpz # cGVjaWFsLCA6aW5leGFjdCwgOnJvdW5kaW5nDQogICAgDQogICAgIyBzZXQg # bnVtYmVyDQogICAgZGVmIHNldChzLGQscD1uaWwscj1uaWwsZGdzPURpZ2l0 # c0RlZi5iYXNlKDEwKSxpbmV4YWN0PWZhbHNlLHJvdW5kaW5nPTppbmYsbm9y # bWFsaXplPXRydWUpDQogICAgICBAc2lnbiA9IHMgIyBzaWduOiAnKycsJy0n # LCcnDQogICAgICBAZGlnaXRzID0gZCAjIGRpZ2l0cyBzdHJpbmcNCiAgICAg # IEBkZWNfcG9zID0gcD09bmlsID8gZC5sZW5ndGggOiBwICMgcG9zaXRpb24g # b2YgZGVjaW1hbCBwb2ludDogMD1iZWZvcmUgZmlyc3QgZGlnaXQuLi4NCiAg # ICAgIEByZXBfcG9zID0gcj09bmlsID8gZC5sZW5ndGggOiByICMgZmlyc3Qg # cmVwZWF0ZWQgZGlnaXQgKDA9Zmlyc3QgZGlnaXQuLi4pDQogICAgICBAZGdz # ID0gZGdzDQogICAgICBAYmFzZSA9IEBkZ3MucmFkaXgNCiAgICAgIEBpbmV4 # YWN0ID0gaW5leGFjdA0KICAgICAgQHNwZWNpYWwgPSBuaWwNCiAgICAgIEBy # b3VuZGluZyA9IHJvdW5kaW5nDQogICAgICB0cmltWmVyb3MgdW5sZXNzIGlu # ZXhhY3QgIA0KICAgICAgc2VsZg0KICAgIGVuZA0KICAgICMgc2V0IGluZmlu # aXRlICg6aW5mKSBhbmQgaW52YWxpZCAoOm5hbikgbnVtYmVycw0KICAgIGRl # ZiBzZXRfc3BlY2lhbChzLHNnbj0nJykgIyA6aW5mLCA6bmFuDQogICAgICBA # c3BlY2lhbCA9IHMNCiAgICAgIEBzaWduID0gc2duDQogICAgICBzZWxmDQog # ICAgZW5kDQogICAgDQogICAgZGVmIGJhc2UNCiAgICAgIEBiYXNlDQogICAg # ZW5kDQogICAgZGVmIGJhc2VfZGlnaXRzDQogICAgICBAZGdzDQogICAgZW5k # DQogICAgZGVmIGJhc2VfZGlnaXRzPShkZCkNCiAgICAgIEBkZ3MgPSBkZA0K # ICAgICAgQGJhc2UgPSBAZGdzLnJhZGl4DQogICAgZW5kDQogICAgZGVmIGJh # c2U9KGIpDQogICAgICBAZGdzID0gRGlnaXRzRGVmLmJhc2UoYikNCiAgICAg # IEBiYXNlPUBkZ3MucmFkaXgNCiAgICBlbmQNCiAgICANCiAgICAjIGNoZWNr # IGZvciBzcGVjaWFsIG51bWJlcnMgKHdoaWNoIGhhdmUgb25seSBzcGVjaWFs # IGFuZCBzaWduIGF0dHJpYnV0ZXMpDQogICAgZGVmIHNwZWNpYWw/DQogICAg # ICBzcGVjaWFsICE9IG5pbA0KICAgIGVuZA0KICAgIA0KICAgICMgY2hlY2sg # Zm9yIHNwZWNpYWwgbnVtYmVycyAod2hpY2ggaGF2ZSBvbmx5IHNwZWNpYWwg # YW5kIHNpZ24gYXR0cmlidXRlcykNCiAgICBkZWYgaW5leGFjdD8NCiAgICAg # IEBpbmV4YWN0DQogICAgZW5kDQogICAgDQogICAgZGVmIGR1cA0KICAgICAg # biA9IE5ldXRyYWxOdW0ubmV3DQogICAgICBpZiBzcGVjaWFsPw0KICAgICAg # ICBuLnNldF9zcGVjaWFsIEBzcGVjaWFsLmR1cCwgQHNpZ24uZHVwDQogICAg # ICBlbHNlDQogICAgICAgICNuLnNldCBAc2lnbi5kdXAsIEBkaWdpdHMuZHVw # LCBAZGVjX3Bvcy5kdXAsIEByZXBfcG9zLmR1cCwgQGRncy5kdXANCiAgICAg # ICAgIyBpbiBSdWJ5IDEuNi44IEZsb2F0LEJpZ051bSxGaXhudW0gZG9lc24n # dCByZXNwb25kIHRvIGR1cA0KICAgICAgICBuLnNldCBAc2lnbi5kdXAsIEBk # aWdpdHMuZHVwLCBAZGVjX3BvcywgQHJlcF9wb3MsIEBkZ3MuZHVwLCBAaW5l # eGFjdCwgQHJvdW5kaW5nDQogICAgICBlbmQNCiAgICAgIHJldHVybiBuIA0K # ICAgIGVuZA0KICAgIA0KICAgIGRlZiB6ZXJvPw0KICAgICAgeiA9IGZhbHNl # DQogICAgICBpZiAhc3BlY2lhbA0KICAgICAgICBpZiBkaWdpdHM9PScnDQog # ICAgICAgICAgeiA9IHRydWUNCiAgICAgICAgZWxzZQ0KICAgICAgICAgIHog # PSB0cnVlDQogICAgICAgICAgZm9yIGkgaW4gKDAuLi5AZGlnaXRzLmxlbmd0 # aCkNCiAgICAgICAgICAgIGlmIGRpZ192YWx1ZShpKSE9MA0KICAgICAgICAg # ICAgICB6ID0gZmFsc2UNCiAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAg # ICAgIGVuZA0KICAgICAgICAgIGVuZA0KICAgICAgICBlbmQNCiAgICAgIGVu # ZA0KICAgICAgeg0KICAgIGVuZA0KICAgIA0KICAgIGRlZiByb3VuZCEobiwg # bW9kZT06Zml4LCBkaXI9bmlsKQ0KICAgICAgZGlyIHx8PSByb3VuZGluZw0K # ICAgICAgdHJpbUxlYWRaZXJvcw0KICAgICAgaWYgbj09OmV4YWN0DQogICAg # ICAgIHJldHVybiB1bmxlc3MgQGluZXhhY3QNCiAgICAgICAgbiA9IEBkaWdp # dHMuc2l6ZQ0KICAgICAgZW5kDQogICAgICANCiAgICAgIG4gKz0gQGRlY19w # b3MgaWYgbW9kZT09OmZpeA0KICAgICAgbiA9IFtuLEBkaWdpdHMuc2l6ZV0u # bWluIGlmIEBpbmV4YWN0DQoNCiAgICAgIGFkaiA9IDANCiAgICAgIGR2ID0g # OnRpZQ0KICAgICAgaWYgQGluZXhhY3QgJiYgbj09QGRpZ2l0cy5zaXplDQog # ICAgICAgIGR2ID0gQGluZXhhY3Q9PTpyb3VuZHVwID8gOmhpIDogOmxvDQog # ICAgICBlbHNlDQogICAgICAgIHYgPSBkaWdfdmFsdWUobikNCiAgICAgICAg # djIgPSAyKnYNCiAgICAgICAgaWYgdjIgPCBAYmFzZSAjIHY8KChAYmFzZSsx # KS8yKQ0KICAgICAgICAgIGR2ID0gOmxvDQogICAgICAgIGVsc2lmIHYyID4g # QGJhc2UgIyB2PihAYmFzZS8yKQ0KICAgICAgICAgIGR2ID0gOmhpDQogICAg # ICAgIGVsc2UNCiAgICAgICAgIA0KICAgICAgICAgKG4rMS4uLkBkaWdpdHMu # bGVuZ3RoKS5lYWNoIGRvIHxpfA0KICAgICAgICAgICBpZiBkaWdfdmFsdWUo # aSk+MA0KICAgICAgICAgICAgIGR2ID0gOmhpDQogICAgICAgICAgICAgYnJl # YWsNCiAgICAgICAgICAgZW5kICAgICAgICANCiAgICAgICAgIGVuZA0KICAg # ICAgICAgIA0KICAgICAgICAgIGR2ID0gOmhpIGlmIGR2PT06dGllICYmIEBy # ZXBfcG9zPD1uICAgICAgICAgICAgICAgICAgDQogICAgICAgIGVuZA0KICAg # ICAgZW5kDQogICAgICANCiAgICAgIGlmIGR2PT06aGkNCiAgICAgICAgYWRq # ID0gKzENCiAgICAgIGVsc2lmIGR2PT06dGllDQogICAgICAgIGlmIGRpcj09 # OmluZiAjIHRvd2FyZHMgbmVhcmVzdCArLy1pbmZpbml0eQ0KICAgICAgICAg # IGFkaiA9ICsxDQogICAgICAgIGVsc2lmIGRpcj09OmV2ZW4gIyBiYW5rZXIn # cyBydWxlDQogICAgICAgICAgYWRqID0gKzEgaWYgKGRpZ192YWx1ZShuLTEp # JTIpIT0wDQogICAgICAgIGVsc2lmIGRpcj09Onplcm8gIyB0b3dhcmRzIHpl # cm8NCiAgICAgICAgICAjIGFkaj0wDQogICAgICAgIGVsc2UgIzpvZGQgDQog # ICAgICAgICAgYWRqID0gKzEgdW5sZXNzIChkaWdfdmFsdWUobi0xKSUyKSE9 # MA0KICAgICAgICBlbmQNCiAgICAgIGVuZCAgICANCiAgICAgIA0KICAgICAg # aWYgbj5AZGlnaXRzLmxlbmd0aA0KICAgICAgICAoQGRpZ2l0cy5sZW5ndGgu # Li5uKS5lYWNoIGRvIHxpfA0KICAgICAgICAgIEBkaWdpdHMgPDwgZGlnX2No # YXIoZGlnX3ZhbHVlKGkpKQ0KICAgICAgICAgIEByZXBfcG9zICs9IDENCiAg # ICAgICAgZW5kDQogICAgICBlbmQNCiAgICAgIA0KICAgICAgcHJlZml4ID0g # JycNCiAgICAgIGkgPSBuLTENCiAgICAgIHdoaWxlIGFkaiE9MA0KICAgICAg # ICB2ID0gZGlnX3ZhbHVlKGkpDQogICAgICAgIHYgKz0gYWRqDQogICAgICAg # IGFkaiA9IDANCiAgICAgICAgaWYgdjwwDQogICAgICAgICAgdiArPSBAYmFz # ZQ0KICAgICAgICAgIGFkaiA9IC0xDQogICAgICAgIGVsc2lmIHY+PUBiYXNl # DQogICAgICAgICAgdiAtPSBAYmFzZQ0KICAgICAgICAgIGFkaiA9ICsxDQog # ICAgICAgIGVuZA0KICAgICAgICBpZiBpPDANCiAgICAgICAgICBwcmVmaXgg # PSBkaWdfY2hhcih2KStwcmVmaXggDQogICAgICAgIGVsc2lmIGk8QGRpZ2l0 # cy5sZW5ndGgNCiAgICAgICAgICBAZGlnaXRzW2ldID0gZGlnX2NoYXIodikN # CiAgICAgICAgZW5kDQogICAgICAgIGkgKz0gLTENCiAgICAgIGVuZCANCiAg # ICAgIA0KICAgICAgaWYgbjwwDQogICAgICAgIEBkaWdpdHMgPSAiIiAgDQog # ICAgICBlbHNlDQogICAgICAgIEBkaWdpdHMgPSBAZGlnaXRzWzAuLi5uXSAg # DQogICAgICBlbmQNCiAgICAgIEByZXBfcG9zID0gQGRpZ2l0cy5sZW5ndGgN # Cg0KICAgICAgaWYgcHJlZml4IT0nJw0KICAgICAgICBAZGlnaXRzID0gcHJl # Zml4ICsgQGRpZ2l0cw0KICAgICAgICBAZGVjX3BvcyArPSBwcmVmaXgubGVu # Z3RoDQogICAgICAgIEByZXBfcG9zICs9IHByZWZpeC5sZW5ndGgNCiAgICAg # IGVuZA0KICAgICAgDQogICAgICANCiAgICBlbmQNCiAgICANCiAgICBkZWYg # cm91bmQobiwgbW9kZT06Zml4LCBkaXI9bmlsKQ0KICAgICAgZGlyIHx8PSBy # b3VuZGluZw0KICAgICAgbm4gPSBkdXANCiAgICAgIG5uLnJvdW5kIShuLG1v # ZGUsZGlyKQ0KICAgICAgcmV0dXJuIG5uDQogICAgZW5kDQogICAgDQogICAg # ZGVmIHRyaW1UcmFpbFplcm9zKCkgICAgDQogICAgICBpID0gQGRpZ2l0cy5s # ZW5ndGgNCiAgICAgIHdoaWxlIGk+MCAmJiBkaWdfdmFsdWUoaS0xKT09MA0K # ICAgICAgICBpIC09IDEgICAgDQogICAgICBlbmQNCiAgICAgIGlmIEByZXBf # cG9zPj1pDQogICAgICAgIEBkaWdpdHMgPSBAZGlnaXRzWzAuLi5pXQ0KICAg # ICAgICBAcmVwX3BvcyA9IGkNCiAgICAgIGVuZA0KICAgICAgDQogICAgICBp # ZiBAZGlnaXRzPT0nJw0KICAgICAgICBAZGlnaXRzID0gZGlnX2NoYXIoMCkg # IyAnMCcNCiAgICAgICAgQHJlcF9wb3MgPSAxDQogICAgICAgIEBkZWNfcG9z # ID0gMQ0KICAgICAgZW5kDQogICAgICANCiAgICBlbmQNCiAgICANCiAgICBk # ZWYgdHJpbUxlYWRaZXJvcygpDQogICAgICBpID0gMA0KICAgICAgd2hpbGUg # aTxAZGlnaXRzLmxlbmd0aCAmJiBkaWdfdmFsdWUoaSk9PTANCiAgICAgICAg # aSArPSAxDQogICAgICBlbmQNCiAgICAgIEBkaWdpdHMgPSBAZGlnaXRzW2ku # Li5AZGlnaXRzLmxlbmd0aF0NCiAgICAgIEBkZWNfcG9zIC09IGkNCiAgICAg # IEByZXBfcG9zIC09IGkNCiAgICAgIA0KICAgICAgaWYgQGRpZ2l0cz09JycN # CiAgICAgICAgQGRpZ2l0cyA9IGRpZ19jaGFyKDApICMgJzAnDQogICAgICAg # IEByZXBfcG9zID0gMQ0KICAgICAgICBAZGVjX3BvcyA9IDENCiAgICAgIGVu # ZA0KICAgICAgDQogICAgZW5kDQogICAgDQogICAgZGVmIHRyaW1aZXJvcygp # ICAgIA0KICAgICAgdHJpbUxlYWRaZXJvcw0KICAgICAgdHJpbVRyYWlsWmVy # b3MNCiAgICBlbmQNCiAgICANCiAgICBwcm90ZWN0ZWQNCiAgICANCiAgICBk # ZWYgZGlnX3ZhbHVlKGkpDQogICAgICB2ID0gMA0KICAgICAgaWYgaT49QHJl # cF9wb3MgDQogICAgICAgIGkgLT0gQGRpZ2l0cy5sZW5ndGgNCiAgICAgICAg # aSAlPSBAZGlnaXRzLmxlbmd0aCAtIEByZXBfcG9zIGlmIEByZXBfcG9zPEBk # aWdpdHMubGVuZ3RoDQogICAgICAgIGkgKz0gQHJlcF9wb3MNCiAgICAgIGVu # ZCAgICAgICAgDQogICAgICBpZiBpPj0wICYmIGk8QGRpZ2l0cy5sZW5ndGgN # CiAgICAgICAgdiA9IEBkZ3MuZGlnaXRfdmFsdWUoQGRpZ2l0c1tpXSkgI2Rp # Z2NvZGVfdmFsdWUoQGRpZ2l0c1tpXSkNCiAgICAgIGVuZA0KICAgICAgcmV0 # dXJuIHY+PTAgJiYgdjxAYmFzZSA/IHYgOiBuaWwNCiAgICBlbmQNCiAgICAj # ZGVmIGRpZ2NvZGVfdmFsdWUoYykNCiAgICAjICB2ID0gYy0/MA0KICAgICMg # IGlmIHY+OQ0KICAgICMgICAgdiA9IDEwICsgYy5jaHIuZG93bmNhc2VbMF0g # LSA/YQ0KICAgICMgIGVuZA0KICAgICMgIHYNCiAgICAjICBAZGdzLmRpZ2l0 # X3ZhbHVlKGMpDQogICAgI2VuZA0KICAgIA0KICAgIGRlZiBkaWdfY2hhcih2 # KQ0KICAgICAgYyA9ICcnDQogICAgICBpZiB2IT1uaWwgJiYgdj49MCAmJiB2 # PEBiYXNlDQogICAgICAgIGMgPSBAZGdzLmRpZ2l0X2NoYXIodikuY2hyDQog # ICAgICBlbmQNCiAgICAgIGMNCiAgICBlbmQNCiAgICANCiAgZW5kDQogIA0K # ICBjbGFzcyBOZXV0cmFsTnVtDQogICAgcHVibGljDQogICAgZGVmIHRvX1Jl # cERlYw0KICAgICAgbiA9IFJlcERlYy5uZXcoQGJhc2UpDQogICAgICBpZiBz # cGVjaWFsPw0KICAgICAgICANCiAgICAgICAgY2FzZSBzcGVjaWFsDQogICAg # ICAgICAgd2hlbiA6bmFuDQogICAgICAgICAgICBuLmlwID0gOmluZGV0ZXJt # aW5hdGUNCiAgICAgICAgICB3aGVuIDppbmYNCiAgICAgICAgICAgIGlmIHNp # Z249PSctJw0KICAgICAgICAgICAgICBuLmlwID0gOnBvc2luZmluaXR5DQog # ICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgIG4uaXAgIDpuZWdpbmZp # bml0eQ0KICAgICAgICAgICAgZW5kDQogICAgICAgICAgZWxzZQ0KICAgICAg # ICAgICAgbiA9IG5pbA0KICAgICAgICBlbmQNCiAgICAgICAgDQogICAgICBl # bHNlDQogICAgICAgIGlmIGRlY19wb3M8PTANCiAgICAgICAgICBuLmlwID0g # MA0KICAgICAgICAgIG4uZCA9ICB0ZXh0X3RvX2RpZ2l0cyhkaWdfY2hhcigw # KSooLWRlY19wb3MpICsgZGlnaXRzKQ0KICAgICAgICBlbHNpZiBkZWNfcG9z # ID49IGRpZ2l0cy5sZW5ndGgNCiAgICAgICAgICBuLmlwID0gZGlnaXRzLnRv # X2koQGJhc2UpICAgICAgICANCiAgICAgICAgICBpZiByZXBfcG9zPGRlY19w # b3MgICAgICAgICAgDQogICAgICAgICAgICBpPTANCiAgICAgICAgICAgIChk # ZWNfcG9zLWRpZ2l0cy5sZW5ndGgpLnRpbWVzIGRvDQogICAgICAgICAgICAg # IG4uaXAgKj0gQGJhc2UNCiAgICAgICAgICAgICAgbi5pcCArPSBAZGdzLmRp # Z2l0X3ZhbHVlKGRpZ2l0c1tyZXBfcG9zK2ldKSBpZiByZXBfcG9zK2k8ZGln # aXRzLmxlbmd0aA0KICAgICAgICAgICAgICBpICs9IDENCiAgICAgICAgICAg # ICAgaT0wIGlmIGk+PWRpZ2l0cy5sZW5ndGgtcmVwX3Bvcw0KICAgICAgICAg # ICAgZW5kDQogICAgICAgICAgICBuLmQgPSBbXQ0KICAgICAgICAgICAgd2hp # bGUgaTxkaWdpdHMubGVuZ3RoLXJlcF9wb3MNCiAgICAgICAgICAgICAgbi5k # IDw8IEBkZ3MuZGlnaXRfdmFsdWUoZGlnaXRzW3JlcF9wb3MraV0pDQogICAg # ICAgICAgICAgIGkgKz0gMQ0KICAgICAgICAgICAgZW5kDQogICAgICAgICAg # ICBuZXdfcmVwX3BvcyA9IG4uZC5zaXplICsgZGVjX3Bvcw0KICAgICAgICAg # ICAgbi5kICs9IHRleHRfdG9fZGlnaXRzKGRpZ2l0c1tyZXBfcG9zLi4tMV0p # DQogICAgICAgICAgICBzZWxmLnJlcF9wb3MgPSBuZXdfcmVwX3Bvcw0KICAg # ICAgICAgIGVsc2UNCiAgICAgICAgICAgIG4uaXAgKj0gQGJhc2UqKihkZWNf # cG9zLWRpZ2l0cy5sZW5ndGgpDQogICAgICAgICAgICBuLmQgPSBbXQ0KICAg # ICAgICAgIGVuZA0KICAgICAgICBlbHNlDQogICAgICAgICAgbi5pcCA9IGRp # Z2l0c1swLi4uZGVjX3Bvc10udG9faShAYmFzZSkNCiAgICAgICAgICBuLmQg # PSB0ZXh0X3RvX2RpZ2l0cyhkaWdpdHNbZGVjX3Bvcy4uLTFdKQ0KICAgICAg # ICAgIGlmIHJlcF9wb3M8ZGVjX3BvcyANCiAgICAgICAgICAgIG5ld19yZXBf # cG9zID0gbi5kLnNpemUgKyBkZWNfcG9zDQogICAgICAgICAgICBuLmQgKz0g # dGV4dF90b19kaWdpdHMoZGlnaXRzW3JlcF9wb3MuLi0xXSkNCiAgICAgICAg # ICAgIHNlbGYucmVwX3BvcyA9IG5ld19yZXBfcG9zDQogICAgICAgICAgICBw # dXRzICItLXJlcF9wb3M9I3tyZXBfcG9zfSINCiAgICAgICAgICBlbmQgICAg # ICAgIA0KICAgICAgICBlbmQNCiAgICAgICAgbi5zaWduID0gLTEgaWYgc2ln # bj09Jy0nDQogICAgICAgIG4ucmVwX2kgPSByZXBfcG9zIC0gZGVjX3BvcyAg # ICAgDQogICAgICBlbmQNCiAgICAgIG4ubm9ybWFsaXplISghaW5leGFjdCkg # IyBrZWVwIHRyYWlsaW5nIHplcm9zIGZvciBpbmV4YWN0IG51bWJlcnMNCiAg # ICAgIHJldHVybiBuDQogICAgZW5kDQogICAgcHJvdGVjdGVkDQogICAgZGVm # IHRleHRfdG9fZGlnaXRzKHR4dCkNCiAgICAgICN0eHQuc3BsaXQoJycpLmNv # bGxlY3R7fGN8IEBkZ3MuZGlnaXRfdmFsdWUoYyl9ICAgIA0KICAgICAgZHMg # PSBbXQ0KICAgICAgdHh0LmVhY2hfYnl0ZXt8YnwgZHMgPDwgQGRncy5kaWdp # dF92YWx1ZShiKX0NCiAgICAgIGRzDQogICAgZW5kDQogIGVuZA0KICANCiAg # Y2xhc3MgUmVwRGVjDQogICAgcHVibGljDQogICAgZGVmIHRvX05ldXRyYWxO # dW0oYmFzZV9kZ3M9bmlsKQ0KICAgICAgbnVtID0gTmV1dHJhbE51bS5uZXcN # CiAgICAgIGlmICFpcC5pc19hPyhJbnRlZ2VyKQ0KICAgICAgICANCiAgICAg # ICAgY2FzZSBpcA0KICAgICAgICAgIHdoZW4gOmluZGV0ZXJtaW5hdGUNCiAg # ICAgICAgICAgIG51bS5zZXRfc3BlY2lhbCA6bmFuDQogICAgICAgICAgd2hl # biA6cG9zaW5maW5pdHkNCiAgICAgICAgICAgIG51bS5zZXRfc3BlY2lhbCA6 # aW5mLCcrJw0KICAgICAgICAgIHdoZW4gOm5lZ2luZmluaXR5DQogICAgICAg # ICAgICBudW0uc2V0X3NwZWNpYWwgOmluZiwnLScNCiAgICAgICAgICBlbHNl # DQogICAgICAgICAgICBudW0gPSBuaWwNCiAgICAgICAgZW5kDQogICAgICAg # ICAgICANCiAgICAgIGVsc2UNCiAgICAgICAgYmFzZV9kZ3MgfHw9IERpZ2l0 # c0RlZi5iYXNlKEByYWRpeCkNCiAgICAgICAgIyBhc3NlcnQgYmFzZV9kZ3Mu # cmFkaXggPT0gQHJhZGl4DQogICAgICAgIHNpZ25jaCA9IHNpZ248MCA/ICct # JyA6ICcrJw0KICAgICAgICBkZWNpbWFscyA9IGlwLnRvX3MoQHJhZGl4KQ0K # ICAgICAgICBkZWNfcG9zID0gZGVjaW1hbHMubGVuZ3RoDQogICAgICAgIGQu # ZWFjaCB7fGRpZ3wgZGVjaW1hbHMgPDwgYmFzZV9kZ3MuZGlnaXRfY2hhcihk # aWcpIH0NCiAgICAgICAgcmVwX3BvcyA9IHJlcF9pPT1uaWwgPyBkZWNpbWFs # cy5sZW5ndGggOiBkZWNfcG9zICsgcmVwX2kNCiAgICAgICAgbnVtLnNldCBz # aWduY2gsIGRlY2ltYWxzLCBkZWNfcG9zLCByZXBfcG9zLCBiYXNlX2Rncw0K # ICAgICAgZW5kDQogICAgICByZXR1cm4gbnVtDQogICBlbmQNCiAgZW5kDQog # IA0KICBjbGFzcyBORm10DQogICAgaW5jbHVkZSBTdGF0ZUVxdWl2YWxlbnQN # CiAgICBkZWYgaW5pdGlhbGl6ZSgpDQogICAgICANCiAgICAgIEBkZWNfc2Vw # ID0gJy4nDQogICAgICBAZ3JwX3NlcCA9ICcsJw0KICAgICAgQGdycCA9IFtd # DQogICAgICANCiAgICAgIEBuZGVjID0gOmV4YWN0DQogICAgICBAbW9kZT06 # Z2VuDQogICAgICBAcm91bmQ9OmluZg0KICAgICAgQGFsbF9kaWdpdHMgPSBm # YWxzZQ0KICAgICAgQGFwcHJveCA9IDpvbmx5X3NpZw0KICAgICAgQG5vbl9z # aWcgPSAnJyAjIG1hcmtlciBmb3Igbm9uLXNpZ25pZmljYW50IGRpZ2l0cyBv # ZiBpbmV4YWN0IHZhbHVlcyBlLmcuICcjJywnMCcNCiAgICAgIEBzY2lfZm9y # bWF0ID0gMSAjIG51bWJlciBvZiBpbnRlZ3JhbCBkaWdpdHMgaW4gdGhlIG1h # bnRpc3NhOiAtMSBmb3IgYWxsDQogICAgICANCiAgICAgIEBzaG93X3BsdXMg # PSBmYWxzZQ0KICAgICAgDQogICAgICBAcmVwX2JlZ2luID0gJzwnDQogICAg # ICBAcmVwX2VuZCAgID0gJz4nDQogICAgICBAcmVwX2F1dG8gID0gJy4uLicN # CiAgICAgIEByZXBfbiAgPSAyDQogICAgICBAcmVwX2luICAgPSB0cnVlDQog # ICAgICANCiAgICAgIEB3aWR0aCA9IDANCiAgICAgIEBmaWxsX2NoYXIgPSAn # ICcNCiAgICAgIEBhZGp1c3Q9OnJpZ2h0DQogICAgICANCiAgICAgIEBiYXNl # X3JhZGl4ID0gMTANCiAgICAgIEBiYXNlX3VwcGVyY2FzZSA9IHRydWUNCiAg # ICAgIEBiYXNlX2RpZ2l0cyA9IERpZ2l0c0RlZi5iYXNlKEBiYXNlX3JhZGl4 # LCAhQGJhc2VfdXBwZXJjYXNlKQ0KICAgICAgQHNob3dfYmFzZSA9IGZhbHNl # DQogICAgICBAYmFzZV9pbmRpY2F0b3JzID0geyAyPT4nYicsIDg9PidvJywg # MTA9PicnLCAxNj0+J2gnLCAwPT4ncid9ICMgMDogZ2VuZXJpYyAodXNlZCB3 # aXRoIHJhZGl4KQ0KICAgICAgQGJhc2VfcHJlZml4ID0gZmFsc2UNCiAgICAg # IA0KICAgICAgQG5hbl90eHQgPSAnTkFOJw0KICAgICAgQGluZl90eHQgPSAn # SW5maW5pdHknDQogICAgICAgIA0KICAgIGVuZA0KICAgIA0KICAgIGRlZiBz # ZXAoZGVjX3NlcCxncnBfc2VwPW5pbCxncnA9W10pDQogICAgICBAZGVjX3Nl # cCA9IGRlY19zZXANCiAgICAgIGdycF9zZXAgfHw9IEBkZWNfc2VwPT0nLicg # PyAnLCcgOiAnLicNCiAgICAgIEBncnBfc2VwID0gZ3JwX3NlcA0KICAgICAg # QGdycCA9IGdycA0KICAgICAgcmV0dXJuIHNlbGYNCiAgICBlbmQNCiAgICAN # CiAgICBkZWYgZ3JvdXBpbmcoZ3JwPVszXSxncnBfc2VwPW5pbCkNCiAgICAg # IGdycF9zZXAgfHw9IEBkZWNfc2VwPT0nLicgPyAnLCcgOiAnLicNCiAgICAg # IEBncnAgPSBncnANCiAgICAgIEBncnBfc2VwID0gZ3JwX3NlcA0KICAgICAg # cmV0dXJuIHNlbGYNCiAgICBlbmQNCiAgICANCiAgICBkZWYgTkZtdC5zZXAo # ZGVjX3NlcCxncnBfc2VwPW5pbCxncnA9W10pDQogICAgICBORm10Lm5ldy5z # ZXAoZGVjX3NlcCxncnBfc2VwLGdycCkNCiAgICBlbmQNCiAgICBkZWYgTkZt # dC5ncm91cGluZyhncnA9WzNdLGdycF9zZXA9bmlsKQ0KICAgICAgTkZtdC5u # ZXcuZ3JvdXBpbmcoZ3JwLGdycF9zZXApDQogICAgZW5kDQogICAgDQogICAg # ZGVmIG1vZGUobW9kZSxuZGVjPTpleGFjdCxyb3VuZD06aW5mLGFsbF9kaWc9 # bmlsLGFwcHJ4PTpvbmx5X3NpZykNCiAgICAgIEBtb2RlID0gbW9kZQ0KICAg # ICAgQG5kZWMgPSBuZGVjDQogICAgICBAcm91bmQgPSByb3VuZA0KICAgICAg # aWYgYWxsX2RpZy5uaWw/DQogICAgICAgIEBhbGxfZGlnaXRzID0gbmRlYyE9 # OmV4YWN0ICYmIG1vZGUhPTpnZW4NCiAgICAgIGVsc2UNCiAgICAgICAgQGFs # bF9kaWdpdHMgPSBhbGxfZGlnDQogICAgICBlbmQNCiAgICAgIEBhcHByb3gg # PSBhcHByeA0KICAgICAgc2VsZg0KICAgIGVuZA0KICAgIA0KICAgIGRlZiBw # cmVjKG5kZWMsbW9kZT06Z2VuLHJvdW5kPTppbmYsYWxsX2RpZz1uaWwsYXBw # cng9Om9ubHlfc2lnKQ0KICAgICAgQG1vZGUgPSBtb2RlDQogICAgICBAbmRl # YyA9IG5kZWMNCiAgICAgIEByb3VuZCA9IHJvdW5kDQogICAgICBpZiBhbGxf # ZGlnLm5pbD8NCiAgICAgICAgQGFsbF9kaWdpdHMgPSBuZGVjIT06ZXhhY3Qg # JiYgbW9kZSE9Omdlbg0KICAgICAgZWxzZQ0KICAgICAgICBAYWxsX2RpZ2l0 # cyA9IGFsbF9kaWcNCiAgICAgIGVuZA0KICAgICAgQGFwcHJveCA9IDphcHBy # eA0KICAgICAgc2VsZg0KICAgIGVuZA0KICAgIA0KICAgIGRlZiBORm10Lm1v # ZGUobW9kZSxuZGVjPTpleGFjdCxyb3VuZD06aW5mLGFsbF9kaWc9bmlsLGFw # cHJ4PTpvbmx5X3NpZykNCiAgICAgIE5GbXQubmV3Lm1vZGUobW9kZSxuZGVj # LHJvdW5kLGFsbF9kaWcsYXBwcngpDQogICAgZW5kDQogICAgZGVmIE5GbXQu # cHJlYyhuZGVjLG1vZGU9Omdlbixyb3VuZD06aW5mLGFsbF9kaWc9bmlsLGFw # cHJ4PTpvbmx5X3NpZykNCiAgICAgIE5GbXQubmV3LnByZWMobmRlYyxtb2Rl # LHJvdW5kLGFsbF9kaWcsYXBwcngpDQogICAgZW5kDQogICAgDQogICAgZGVm # IHNob3dfYWxsX2RpZ2l0cyhhZD10cnVlKQ0KICAgICAgQGFsbF9kaWdpdHMg # PSBhZA0KICAgICAgQG5vbl9zaWcgPSAnJyB1bmxlc3MgQGFsbF9kaWdpdHMN # CiAgICAgIHNlbGYNCiAgICBlbmQNCiAgICBkZWYgYXBwcm94X21vZGUobW9k # ZSkNCiAgICAgIEBhcHByb3g9bW9kZQ0KICAgICAgc2VsZg0KICAgIGVuZA0K # ICAgIGRlZiBub25fc2lnbmlmaWNhdGl2ZV9kaWdpdHMoY2g9JyMnKQ0KICAg # ICAgQG5vbl9zaWcgPSBjaA0KICAgICAgQG5vbl9zaWcgfHw9ICcnDQogICAg # ICBAYWxsX2RpZ2l0cyA9IHRydWUgaWYgQG5vbl9zaWchPScnDQogICAgICBz # ZWxmDQogICAgZW5kDQogICAgZGVmIHNjaV9kaWdpdHMobj0tMSkNCiAgICAg # IEBzY2lfZm9ybWF0ID0gbg0KICAgICAgc2VsZg0KICAgIGVuZA0KICAgIA0K # ICAgIGRlZiBzaG93X3BsdXMoc3A9dHJ1ZSkNCiAgICAgIEBzaG93X3BsdXMg # PSBzcA0KICAgICAgc2VsZg0KICAgIGVuZA0KICAgIA0KICAgIGRlZiByZXAo # KnBhcmFtcykNCiAgICAgIA0KICAgICAgcGFyYW1zIDw8IHt9IGlmIHBhcmFt # cy5zaXplPT0wDQogICAgICBpZiBwYXJhbXNbMF0ua2luZF9vZj8oSGFzaCkN # CiAgICAgICAgcGFyYW1zID0gcGFyYW1zWzBdDQogICAgICAgIGJlZ2NoID0g # cGFyYW1zWyc6YmVnY2gnXQ0KICAgICAgICBlbmRjaCA9IHBhcmFtc1snOmVu # ZGNoJ10NCiAgICAgICAgYXV0b2NoID0gcGFyYW1zWyc6YXV0b2NoJ10NCiAg # ICAgICAgcmVwID0gcGFyYW1zWyc6cmVwJ10NCiAgICAgICAgcmVhZCA9IHBh # cmFtc1snOnJlYWQnXQ0KICAgICAgZWxzZQ0KICAgICAgICBiZWdjaCxlbmRj # aCxhdXRvY2gscmVwLHJlYWQgPSAqcGFyYW1zDQogICAgICBlbmQNCiAgICAg # IA0KICAgICAgDQogICAgICBiZWdjaCB8fD0gJzwnDQogICAgICBlbmRjaCB8 # fD0gJz4nDQogICAgICBhdXRvY2ggfHw9ICcuLi4nDQogICAgICByZXAgfHw9 # IDANCiAgICAgIHJlYWQgPSB0cnVlIGlmIHJlYWQubmlsPw0KICAgICAgDQog # ICAgICBAcmVwX2JlZ2luPWJlZ2NoDQogICAgICBAcmVwX2VuZCA9IGVuZGNo # DQogICAgICBAcmVwX2F1dG8gPSBhdXRvY2gNCiAgICAgIEByZXBfbiA9IHJl # cA0KICAgICAgQHJlcF9pbiA9IHJlYWQNCiAgICAgIHNlbGYNCiAgICBlbmQN # CiAgICANCiAgICBkZWYgTkZtdC5yZXAoKnBhcmFtcykNCiAgICAgIE5GbXQu # bmV3LnJlcCgqcGFyYW1zKQ0KICAgIGVuZA0KICAgIA0KICAgIGRlZiB3aWR0 # aCh3LGFkaj06cmlnaHQsY2g9JyAnKQ0KICAgICAgQHdpZHRoID0gdw0KICAg # ICAgQGZpbGxfY2hhciA9IGNoDQogICAgICBAYWRqdXN0PWFkag0KICAgICAg # c2VsZg0KICAgIGVuZA0KICAgIGRlZiBwYWQwcyh3KQ0KICAgICAgQHdpZHRo # ID0gdw0KICAgICAgQGZpbGxfY2hhciA9ICcwJw0KICAgICAgQGFkanVzdD06 # aW50ZXJuYWwNCiAgICAgIHNlbGYNCiAgICBlbmQNCiAgICBkZWYgTkZtdC53 # aWR0aCh3LGFkaj06cmlnaHQsY2g9JyAnKQ0KICAgICAgTkZtdC5uZXcud2lk # dGgodyxhZGosY2gpDQogICAgZW5kDQogICAgZGVmIE5GbXQucGFkMHModykN # CiAgICAgIE5GbXQubmV3LnBhZDBzKHcpDQogICAgZW5kDQogICAgDQogICAg # ZGVmIGJhc2UoYiwgdXBwZXJjYXNlPXRydWUpDQogICAgICBAYmFzZV9yYWRp # eCA9IGINCiAgICAgIEBiYXNlX3VwcGVyY2FzZSA9IHVwcGVyY2FzZQ0KICAg # ICAgQGJhc2VfZGlnaXRzID0gRGlnaXRzRGVmLmJhc2UoQGJhc2VfcmFkaXgs # ICFAYmFzZV91cHBlcmNhc2UpDQogICAgICBzZWxmDQogICAgZW5kDQogICAg # ZGVmIE5GbXQuYmFzZShiLCB1cHBlcmNhc2U9dHJ1ZSkNCiAgICAgIE5GbXQu # bmV3LmJhc2UoYiwgdXBwZXJjYXNlKQ0KICAgIGVuZA0KICAgIGRlZiBnZXRf # ZXhwX2NoYXIoYmFzZSkNCiAgICAgIGJhc2UgfHw9IEBiYXNlX3JhZGl4DQog # ICAgICBiYXNlPD0xMCA/ICdFJyA6ICdeJw0KICAgIGVuZA0KICAgIA0KICAg # IGRlZiBnZXRfYmFzZQ0KICAgICAgQGJhc2VfcmFkaXgNCiAgICBlbmQNCiAg # ICBkZWYgZ2V0X2Jhc2VfZGlnaXRzKGI9bmlsKQ0KICAgICAgKGIubmlsPyB8 # fCBiPT1AYmFzZV9yYWRpeCkgPyBAYmFzZV9kaWdpdHMgOiBEaWdpdHNEZWYu # YmFzZShiLCFAYmFzZV91cHBlcmNhc2UpDQogICAgZW5kDQogICAgZGVmIGdl # dF9iYXNlX3VwcGVyY2FzZT8NCiAgICAgIEBiYXNlX3VwcGVyY2FzZQ0KICAg # IGVuZA0KICAgIA0KICAgIGRlZiBnZXRfbW9kZQ0KICAgICAgQG1vZGUNCiAg # ICBlbmQNCiAgICBkZWYgZ2V0X25kaWcNCiAgICAgIEBuZGVjDQogICAgZW5k # DQogICAgZGVmIGdldF9hbGxfZGlnaXRzPw0KICAgICAgQGFsbF9kaWdpdHMN # CiAgICBlbmQNCiAgICBkZWYgZ2V0X2FwcHJveA0KICAgICAgQGFwcHJveA0K # ICAgIGVuZA0KICAgIA0KICAgIGRlZiBnZXRfcm91bmQNCiAgICAgIEByb3Vu # ZA0KICAgIGVuZA0KICAgIA0KICAgIGRlZiB3cml0ZUZvcm1hdHRlZChuZXV0 # cmFsKQ0KICAgICAgc3RyID0gJycgICAgIA0KICAgICAgaWYgbmV1dHJhbC5z # cGVjaWFsPw0KICAgICAgICBzdHIgPDwgbmV1dHJhbC5zaWduDQogICAgICAg # IGNhc2UgbmV1dHJhbC5zcGVjaWFsDQogICAgICAgICAgd2hlbiA6aW5mDQog # ICAgICAgICAgICBzdHIgPDwgQGluZl90eHQNCiAgICAgICAgICB3aGVuIDpu # YW4NCiAgICAgICAgICAgIHN0ciA8PCBAbmFuX3R4dA0KICAgICAgICBlbmQg # ICAgDQogICAgICBlbHNlDQogICAgICAgIHplcm8gPSBnZXRfYmFzZV9kaWdp # dHMobmV1dHJhbC5iYXNlKS5kaWdpdF9jaGFyKDApLmNociANCiAgICAgICAg # bmV1dHJhbCA9IG5ldXRyYWwuZHVwDQogICAgICAgIHJvdW5kISBuZXV0cmFs # DQogICAgICAgIGlmIG5ldXRyYWwuemVybz8NCiAgICAgICAgICBzdHIgPDwg # bmV1dHJhbC5zaWduIGlmIG5ldXRyYWwuc2lnbj09Jy0nICMgc2hvdyAtIGlm # IG51bWJlciB3YXMgPDAgYmVmb3JlIHJvdW5kaW5nDQogICAgICAgICAgc3Ry # IDw8IHplcm8NCiAgICAgICAgICBpZiBAbmRlYy5raW5kX29mPyhOdW1lcmlj # KSAmJiBAbmRlYz4wICYmIEBtb2RlPT06Zml4DQogICAgICAgICAgICBzdHIg # PDwgQGRlY19zZXAgPDwgemVybypAbmRlYw0KICAgICAgICAgIGVuZA0KICAg # ICAgICBlbHNlDQogICAgICAgICAgDQogICAgICAgICAgbmV1dHJhbC50cmlt # TGVhZFplcm9zDQogICAgICAgICAgYWN0dWFsX21vZGUgPSBAbW9kZQ0KICAg # ICAgICAgIHRyaW1fdHJhaWxfemVyb3MgPSAhQGFsbF9kaWdpdHMgIyBmYWxz # ZQ0KDQogICAgICAgICAgaW50ZWdyYWxfZGlnaXRzID0gQHNjaV9mb3JtYXQN # CiAgICAgICAgICBpZiBpbnRlZ3JhbF9kaWdpdHMgPT0gOmVuZw0KICAgICAg # ICAgICAgaW50ZWdyYWxfZGlnaXRzID0gMQ0KICAgICAgICAgICAgd2hpbGUg # KG5ldXRyYWwuZGVjX3BvcyAtIGludGVncmFsX2RpZ2l0cykubW9kdWxvKDMp # ICE9IDANCiAgICAgICAgICAgICAgaW50ZWdyYWxfZGlnaXRzICs9IDENCiAg # ICAgICAgICAgIGVuZA0KICAgICAgICAgIGVsc2lmIGludGVncmFsX2RpZ2l0 # cz09OmFsbCB8fCBpbnRlZ3JhbF9kaWdpdHMgPCAwDQogICAgICAgICAgICBp # ZiBuZXV0cmFsLmluZXhhY3Q/ICYmIEBub25fc2lnIT0nJyAmJiBAbmRlYy5r # aW5kX29mPyhOdW1lcmljKQ0KICAgICAgICAgICAgICBpbnRlZ3JhbF9kaWdp # dHMgPSBAbmRlYw0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICBp # bnRlZ3JhbF9kaWdpdHMgPSBuZXV0cmFsLmRpZ2l0cy5sZW5ndGgNCiAgICAg # ICAgICAgIGVuZA0KICAgICAgICAgIGVuZA0KICAgICAgICAgIGV4cCA9IG5l # dXRyYWwuZGVjX3BvcyAtIGludGVncmFsX2RpZ2l0cw0KICAgICAgICAgICAg # ICANCiAgICAgICAgICBjYXNlIGFjdHVhbF9tb2RlDQogICAgICAgICAgICB3 # aGVuIDpnZW4gIyBnZW5lcmFsIChhdXRvbWF0aWMpDQogICAgICAgICAgICAg # ICMgQG5kZWMgbWVhbnMgc2lnbmlmaWNhbnQgZGlnaXRzDQogICAgICAgICAg # ICAgIGFjdHVhbF9tb2RlID0gOnNpZw0KICAgICAgICAgICAgICBhY3R1YWxf # bW9kZSA9IDpzY2kgaWYgdXNlX3NjaWVudGlmaWM/KG5ldXRyYWwsIGV4cCkN # CiAgICAgICAgICAgICAgdHJpbV90cmFpbF96ZXJvcyA9ICFAYWxsX2RpZ2l0 # cyAjIHRydWUNCiAgICAgICAgICBlbmQNCiAgICAgICAgICANCiAgICAgICAg # ICBjYXNlIGFjdHVhbF9tb2RlICANCiAgICAgICAgICAgIHdoZW4gOmZpeCwg # OnNpZyAjLCA6Z2VuDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICBz # dHIgPDwgbmV1dHJhbC5zaWduIGlmIEBzaG93X3BsdXMgfHwgbmV1dHJhbC5z # aWduIT0nKycNCg0KICAgICAgICAgICAgICBpZiBAc2hvd19iYXNlICYmIEBi # YXNlX3ByZWZpeA0KICAgICAgICAgICAgICAgIGJfcHJlZml4ID0gQGJhc2Vf # aW5kaWNhdG9yc1tuZXV0cmFsLmJhc2VdDQogICAgICAgICAgICAgICAgc3Ry # IDw8IGJfcHJlZml4IGlmIGJfcHJlZml4DQogICAgICAgICAgICAgIGVuZA0K # ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgaWYgQG5kZWM9PTpleGFj # dA0KICAgICAgICAgICAgICAgIG5ldXRyYWwuc2lnbiA9ICcrJw0KICAgICAg # ICAgICAgICAgIHN0ciA8PCBuZXV0cmFsLnRvX1JlcERlYy5nZXRTKEByZXBf # biwgZ2V0UmVwRGVjT3B0KG5ldXRyYWwuYmFzZSkpDQogICAgICAgICAgICAg # IGVsc2UNCiAgICAgICAgICAgICAgICAjemVybyA9IGdldF9iYXNlX2RpZ2l0 # cy5kaWdpdF9jaGFyKDApLmNocg0KICAgICAgICAgICAgICAgIG5zX2RpZ2l0 # cyA9ICcnDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgbmQg # PSBuZXV0cmFsLmRpZ2l0cy5sZW5ndGgNCiAgICAgICAgICAgICAgICBpZiBh # Y3R1YWxfbW9kZT09OmZpeA0KICAgICAgICAgICAgICAgICAgbmQgLT0gbmV1 # dHJhbC5kZWNfcG9zDQogICAgICAgICAgICAgICAgZW5kDQogICAgICAgICAg # ICAgICAgaWYgbmV1dHJhbC5pbmV4YWN0PyAmJiBAbmRlYz5uZCAjIGFzc2Vy # dCBubyByZXAtZGVjLg0KICAgICAgICAgICAgICAgICAgbnNfZGlnaXRzID0g # QG5vbl9zaWcqKEBuZGVjLW5kKQ0KICAgICAgICAgICAgICAgIGVuZA0KICAg # ICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGRpZ2l0cyA9IG5ldXRy # YWwuZGlnaXRzICsgbnNfZGlnaXRzDQogICAgICAgICAgICAgICAgaWYgbmV1 # dHJhbC5kZWNfcG9zPD0wDQogICAgICAgICAgICAgICAgICBzdHIgPDwgemVy # bytAZGVjX3NlcCt6ZXJvKigtbmV1dHJhbC5kZWNfcG9zKSArIGRpZ2l0cw0K # ICAgICAgICAgICAgICAgIGVsc2lmIG5ldXRyYWwuZGVjX3BvcyA+PSBkaWdp # dHMubGVuZ3RoIA0KICAgICAgICAgICAgICAgICAgc3RyIDw8IGdyb3VwKGRp # Z2l0cyArIHplcm8qKG5ldXRyYWwuZGVjX3Bvcy1kaWdpdHMubGVuZ3RoKSkN # CiAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICBzdHIg # PDwgZ3JvdXAoZGlnaXRzWzAuLi5uZXV0cmFsLmRlY19wb3NdKSArIEBkZWNf # c2VwICsgZGlnaXRzW25ldXRyYWwuZGVjX3Bvcy4uLTFdDQogICAgICAgICAg # ICAgICAgZW5kDQogICAgICAgICAgICAgIGVuZA0KDQogICAgICAgICAgICAg # ICNzdHIgPSBzdHIuY2hvbXAoemVybykuY2hvbXAoQGRlY19zZXApIGlmIHRy # aW1fdHJhaWxfemVyb3MgJiYgc3RyLmluY2x1ZGU/KEBkZWNfc2VwKQ0KICAg # ICAgICAgICAgICBpZiB0cmltX3RyYWlsX3plcm9zICYmIHN0ci5pbmNsdWRl # PyhAZGVjX3NlcCkgJiYgIHN0clstQHJlcF9hdXRvLnNpemUuLi0xXSE9QHJl # cF9hdXRvDQogICAgICAgICAgICAgICAgc3RyLmNob3AhIHdoaWxlIHN0clst # MV09PXplcm9bMF0NCiAgICAgICAgICAgICAgICBzdHIuY2hvbXAhKEBkZWNf # c2VwKQ0KICAgICAgICAgICAgICAgICNwdXRzIHN0cg0KICAgICAgICAgICAg # ICBlbmQNCiAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgDQogICAg # ICAgICAgICB3aGVuIDpzY2kNCiAgICAgICAgICAgICAgDQogICAgICAgICAg # ICAgIHN0ciA8PCBuZXV0cmFsLnNpZ24gaWYgQHNob3dfcGx1cyB8fCBuZXV0 # cmFsLnNpZ24hPScrJw0KDQogICAgICAgICAgICAgIGlmIEBzaG93X2Jhc2Ug # JiYgQGJhc2VfcHJlZml4DQogICAgICAgICAgICAgICAgYl9wcmVmaXggPSBA # YmFzZV9pbmRpY2F0b3JzW25ldXRyYWwuYmFzZV0NCiAgICAgICAgICAgICAg # ICBzdHIgPDwgYl9wcmVmaXggaWYgYl9wcmVmaXgNCiAgICAgICAgICAgICAg # ZW5kDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAjemVybyA9IGdl # dF9iYXNlX2RpZ2l0cy5kaWdpdF9jaGFyKDApLmNocg0KICAgICAgICAgICAg # ICBpZiBAbmRlYz09OmV4YWN0DQogICAgICAgICAgICAgICAgbmV1dHJhbC5z # aWduID0gJysnDQogICAgICAgICAgICAgICAgbmV1dHJhbC5kZWNfcG9zLT1l # eHANCiAgICAgICAgICAgICAgICBzdHIgPDwgbmV1dHJhbC50b19SZXBEZWMu # Z2V0UyhAcmVwX24sIGdldFJlcERlY09wdChuZXV0cmFsLmJhc2UpKSAgDQog # ICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICBuc19kaWdpdHMg # PSAnJw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIG5kID0g # bmV1dHJhbC5kaWdpdHMubGVuZ3RoDQogICAgICAgICAgICAgICAgaWYgYWN0 # dWFsX21vZGU9PTpmaXgNCiAgICAgICAgICAgICAgICAgIG5kIC09IG5ldXRy # YWwuZGVjX3Bvcw0KICAgICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAg # ICAgIGlmIG5ldXRyYWwuaW5leGFjdD8gJiYgQG5kZWM+bmQgIyBhc3NlcnQg # bm8gcmVwLWRlYy4NCiAgICAgICAgICAgICAgICAgIG5zX2RpZ2l0cyA9IEBu # b25fc2lnKihAbmRlYy1uZCkNCiAgICAgICAgICAgICAgICBlbmQNCiAgICAg # ICAgICAgICAgICANCiAgICAgICAgICAgICAgICBkaWdpdHMgPSBuZXV0cmFs # LmRpZ2l0cyArIG5zX2RpZ2l0cw0KICAgICAgICAgICAgICAgIHN0ciA8PCAo # KGludGVncmFsX2RpZ2l0czwxKSA/IHplcm8gOiBkaWdpdHNbMC4uLmludGVn # cmFsX2RpZ2l0c10pDQogICAgICAgICAgICAgICAgc3RyIDw8IEBkZWNfc2Vw # DQogICAgICAgICAgICAgICAgc3RyIDw8IGRpZ2l0c1tpbnRlZ3JhbF9kaWdp # dHMuLi5AbmRlY10NCiAgICAgICAgICAgICAgICBwYWRfcmlnaHQgPShAbmRl # YysxLXN0ci5sZW5ndGgpIA0KICAgICAgICAgICAgICAgIHN0ciA8PCB6ZXJv # KnBhZF9yaWdodCBpZiBwYWRfcmlnaHQ+MCAmJiAhbmV1dHJhbC5pbmV4YWN0 # PyAjIG1heWJlIHdlIGRpZG4ndCBoYXZlIGVub3VnaHQgZGlnaXRzDQogICAg # ICAgICAgICAgIGVuZA0KDQogICAgICAgICAgICAgICNzdHIgPSBzdHIuY2hv # bXAoemVybykuY2hvbXAoQGRlY19zZXApIGlmIHRyaW1fdHJhaWxfemVyb3Mg # JiYgc3RyLmluY2x1ZGU/KEBkZWNfc2VwKQ0KICAgICAgICAgICAgICBpZiB0 # cmltX3RyYWlsX3plcm9zICYmIHN0ci5pbmNsdWRlPyhAZGVjX3NlcCkgJiYg # IHN0clstQHJlcF9hdXRvLnNpemUuLi0xXSE9QHJlcF9hdXRvDQogICAgICAg # ICAgICAgICAgc3RyLmNob3AhIHdoaWxlIHN0clstMV09PXplcm9bMF0NCiAg # ICAgICAgICAgICAgICBzdHIuY2hvbXAhKEBkZWNfc2VwKQ0KICAgICAgICAg # ICAgICAgICNwdXRzIHN0cg0KICAgICAgICAgICAgICBlbmQNCiAgICAgICAg # ICAgICAgDQogICAgICAgICAgICAgIHN0ciA8PCBnZXRfZXhwX2NoYXIobmV1 # dHJhbC5iYXNlKQ0KICAgICAgICAgICAgICBzdHIgPDwgZXhwLnRvX3MNCiAg # ICAgICAgICAgICAgICAgIA0KICAgICAgICAgIGVuZA0KICAgICAgICAgIA0K # ICAgICAgICBlbmQNCiAgICAgIGVuZA0KICAgICAgDQogICAgICBpZiBAc2hv # d19iYXNlICYmICFAYmFzZV9wcmVmaXgNCiAgICAgICAgYl9wcmVmaXggPSBA # YmFzZV9pbmRpY2F0b3JzW25ldXRyYWwuYmFzZV0NCiAgICAgICAgc3RyIDw8 # IGJfcHJlZml4IGlmIGJfcHJlZml4DQogICAgICBlbmQNCiAgICAgIA0KICAg # ICAgDQogICAgICBpZiBAd2lkdGg+MCAmJiBAZmlsbF9jaGFyIT0nJw0KICAg # ICAgICBsID0gQHdpZHRoIC0gc3RyLmxlbmd0aA0KICAgICAgICBpZiBsPjAN # CiAgICAgICAgICBjYXNlIEBhZGp1c3QNCiAgICAgICAgICAgIHdoZW4gOmlu # dGVybmFsDQogICAgICAgICAgICAgIHNpZ24gPSAnJw0KICAgICAgICAgICAg # ICBpZiBzdHJbMCwxXT09JysnIHx8IHN0clswLDFdPT0nLScgDQogICAgICAg # ICAgICAgICAgc2lnbiA9IHN0clswLDFdDQogICAgICAgICAgICAgICAgc3Ry # ID0gc3RyWzEuLi5zdHIubGVuZ3RoXQ0KICAgICAgICAgICAgICBlbmQNCiAg # ICAgICAgICAgICAgc3RyID0gc2lnbiArIEBmaWxsX2NoYXIqbCArIHN0cg0K # ICAgICAgICAgICAgd2hlbiA6Y2VudGVyDQogICAgICAgICAgICAgIHN0ciA9 # IEBmaWxsX2NoYXIqKGwvMikgKyBzdHIgKyBAZmlsbF9jaGFyKihsLWwvMikN # CiAgICAgICAgICAgIHdoZW4gOnJpZ2h0DQogICAgICAgICAgICAgIHN0ciA9 # IEBmaWxsX2NoYXIqbCArIHN0cg0KICAgICAgICAgICAgd2hlbiA6bGVmdA0K # ICAgICAgICAgICAgICBzdHIgPSBzdHIgKyBAZmlsbF9jaGFyKmwNCiAgICAg # ICAgICBlbmQNCiAgICAgICAgZW5kICAgIA0KICAgICAgZW5kDQogICAgICAN # CiAgICAgIHJldHVybiBzdHINCiAgICBlbmQNCiAgICANCiAgICBkZWYgcm91 # bmQhKG5ldXRyYWwpDQogICAgICBuZXV0cmFsLnJvdW5kISBAbmRlYywgQG1v # ZGUsIEByb3VuZA0KICAgIGVuZA0KICAgIA0KICAgIEBAc2NpX2ZtdCA9IG5p # bA0KICAgIA0KICAgIGRlZiByZWFkRm9ybWF0dGVkKHR4dCkNCiAgICAgIHR4 # dCA9IHR4dC5kdXANCiAgICAgIG51bSA9IG5pbA0KICAgICAgIA0KICAgICAg # YmFzZSA9IG5pbA0KICAgICAgDQogICAgICBiYXNlIHx8PSBnZXRfYmFzZQ0K # ICAgICANCiAgICAgIHplcm8gPSBnZXRfYmFzZV9kaWdpdHMoYmFzZSkuZGln # aXRfY2hhcigwKS5jaHIgDQogICAgICB0eHQudHIhKEBub25fc2lnLHplcm8p # ICMgd2UgZG9uJ3Qgc2ltcGx5IHJlbW92ZSBpdCBiZWNhdXNlIGl0IG1heSBi # ZSBiZWZvcmUgdGhlIHJhZGl4IHBvaW50IA0KICAgICAgDQogICAgICBleHAg # PSAwDQogICAgICB4X2NoYXIgPSBnZXRfZXhwX2NoYXIoYmFzZSkNCiAgICAg # IA0KICAgICAgZXhwX2kgPSB0eHQuaW5kZXgoeF9jaGFyKQ0KICAgICAgZXhw # X2kgPSB0eHQuaW5kZXgoeF9jaGFyLmRvd25jYXNlKSBpZiBleHBfaT09PW5p # bA0KICAgICAgaWYgZXhwX2khPW5pbA0KICAgICAgICBleHAgPSB0eHRbZXhw # X2krMS4uLnR4dC5sZW5ndGhdLnRvX2kNCiAgICAgICAgdHh0ID0gdHh0WzAu # Li5leHBfaV0gDQogICAgICBlbmQgICAgDQogICAgICANCg0KICAgICAgb3B0 # ID0gZ2V0UmVwRGVjT3B0KGJhc2UpDQogICAgICBpZiBAcmVwX2luDQogICAg # ICAgICNyYWlzZSBOdW1Gb3JtYXRFcnJvciwiSW52YWxpZCBudW1lcmljYWwg # YmFzZSIgaWYgYmFzZSE9MTANCiAgICAgICAgcmQgPSBSZXBEZWMubmV3ICMg # Z2V0X2Jhc2Ugbm90IG5lY2Vzc2FyeTogc2V0UyBzZXRzIGl0IGZyb20gb3B0 # aW9ucw0KICAgICAgICByZC5zZXRTIHR4dCwgb3B0DQogICAgICAgIG51bSA9 # IHJkLnRvX05ldXRyYWxOdW0ob3B0LmRpZ2l0cykNCiAgICAgIGVsc2UNCiAg # ICAgICAgIyB0byBkbzogdXNlIFJlcERlYy5wYXJzZTsgdGhlbiBidWlsZCBO # ZXV0cmFsTnVtIGRpcmVjdGx5DQogICAgICAgIG9wdC5zZXRfZGVsaW0gJycs # JycNCiAgICAgICAgb3B0LnNldF9zdWZmaXggJycNCiAgICAgICAgcmQgPSBS # ZXBEZWMubmV3ICMgZ2V0X2Jhc2Ugbm90IG5lY2Vzc2FyeTogc2V0UyBzZXRz # IGl0IGZyb20gb3B0aW9ucw0KICAgICAgICByZC5zZXRTIHR4dCwgb3B0DQog # ICAgICAgIG51bSA9IHJkLnRvX05ldXRyYWxOdW0ob3B0LmRpZ2l0cykNCiAg # ICAgIGVuZA0KICAgICAgbnVtLnJvdW5kaW5nID0gZ2V0X3JvdW5kDQogICAg # ICBudW0uZGVjX3BvcyArPSBleHANCiAgICAgIHJldHVybiBudW0NCiAgICBl # bmQNCiAgICANCiAgICBwcm90ZWN0ZWQNCiAgICANCiAgICBkZWYgdXNlX3Nj # aWVudGlmaWM/KG5ldXRyYWwsZXhwKQ0KICAgICAgbmQgPSBAbmRlYy5raW5k # X29mPyhOdW1lcmljKSA/IEBuZGVjIDogbmV1dHJhbC5kaWdpdHMubGVuZ3Ro # DQogICAgICBpZiBAQHNjaV9mbXQ9PTpocA0KICAgICAgICAjIHJldmlzYXIs # IG5vIGZ1bmNpb25hIGJpZW4gICAgDQogICAgICAgIG5ldXRyYWwuZGVjX3Bv # cz5uZCB8fCAoW25ldXRyYWwuZGlnaXRzLmxlbmd0aCxuZF0ubWluLW5ldXRy # YWwuZGVjX3Bvcyk+bmQNCiAgICAgIGVsc2UNCiAgICAgICAgZXhwPC00IHx8 # IGV4cD49bmQgDQogICAgICBlbmQNCiAgICBlbmQNCiAgICANCiAgICBkZWYg # Z2V0UmVwRGVjT3B0KGJhc2U9bmlsKQ0KICAgICAgcmRfb3B0ID0gUmVwRGVj # OjpPcHQubmV3DQogICAgICByZF9vcHQuYmVnaW5fcmVwID0gQHJlcF9iZWdp # bg0KICAgICAgcmRfb3B0LmVuZF9yZXAgPSBAcmVwX2VuZA0KICAgICAgcmRf # b3B0LmF1dG9fcmVwID0gQHJlcF9hdXRvDQogICAgICByZF9vcHQuZGVjX3Nl # cCA9IEBkZWNfc2VwDQogICAgICByZF9vcHQuZ3JwX3NlcCA9IEBncnBfc2Vw # DQogICAgICByZF9vcHQuZ3JwID0gQGdycA0KICAgICAgcmRfb3B0LmluZl90 # eHQgPSBAaW5mX3R4dA0KICAgICAgcmRfb3B0Lm5hbl90eHQgPSBAbmFuX3R4 # dCAgICANCiAgICAgIHJkX29wdC5zZXRfZGlnaXRzKGdldF9iYXNlX2RpZ2l0 # cyhiYXNlKSkNCiAgICAjICBpZiBiYXNlICYmIChiYXNlICE9IGdldF9iYXNl # X2RpZ2l0cy5yYWRpeCkNCiAgICAjICAgIHJkX29wdC5zZXRfZGlnaXRzKGdl # dF9iYXNlX2RpZ2l0cyhiYXNlKSkNCiAgICAjICBlbHNlDQogICAgIyAgICBy # ZF9vcHQuc2V0X2RpZ2l0cyBnZXRfYmFzZV9kaWdpdHMNCiAgICAjICBlbmQN # CiAgICAgIHJldHVybiByZF9vcHQNCiAgICBlbmQNCiAgICANCiAgICBkZWYg # Z3JvdXAoZGlnaXRzKQ0KICAgICAgUmVwRGVjLmdyb3VwX2RpZ2l0cyhkaWdp # dHMsIGdldFJlcERlY09wdCkNCiAgICBlbmQNCiAgICANCiAgZW5kDQogIA0K # ICBtb2R1bGUgRm9ybWF0dGFibGUNCiAgICANCiAgICBkZWYgd3JpdGVGbXQo # Zm10PU5GbXQuZGVmYXVsdCkNCiAgICAgIG5ldXRyYWwgPSB3cml0ZV9uZXV0 # cmFsKGZtdCkNCiAgICAgIGZtdC53cml0ZUZvcm1hdHRlZChuZXV0cmFsKQ0K # ICAgIGVuZA0KICAgIA0KICAgIG1vZHVsZSBDbGFzc01ldGhvZHMNCiAgICAg # IGRlZiByZWFkRm10KHR4dCxmbXQ9TkZtdC5kZWZhdWx0KQ0KICAgICAgICBu # ZXV0cmFsID0gZm10LnJlYWRGb3JtYXR0ZWQodHh0KQ0KICAgICAgICByZWFk # X25ldXRyYWwgbmV1dHJhbCAgICAgIA0KICAgICAgZW5kDQogICAgZW5kDQog # ICAgDQogICAgZGVmIHJvdW5kRm10KGZtdD1ORm10LmRlZmF1bHQpDQogICAg # ICBuZXV0cmFsID0gd3JpdGVfbmV1dHJhbChmbXQpDQogICAgICBmbXQucm91 # bmQhIG5ldXRyYWwNCiAgICAgIHNlbGYuY2xhc3MucmVhZF9uZXV0cmFsIG5l # dXRyYWwgICAgICANCiAgICBlbmQNCiAgICANCiAgICBkZWYgc2VsZi5hcHBl # bmRfZmVhdHVyZXMobW9kKQ0KICAgICAgc3VwZXINCiAgICAgIG1vZC5leHRl # bmQgQ2xhc3NNZXRob2RzDQogICAgZW5kDQogICAgICANCiAgZW5kDQogIA0K # ICBjbGFzcyBORm10DQogICAgICAgICAgDQogICAgQEBmbXRzID0gew0KICAg # ICAgIDplcz0+TkZtdC5zZXAoJywnLCcuJykuZnJlZXplLDplc190aD0+TkZt # dC5zZXAoJywnLCcuJyxbM10pLmZyZWV6ZSw6cnVieT0+TkZtdC5uZXcuZnJl # ZXplLDplbj0+TkZtdC5uZXcuZnJlZXplLDplbl90aD0+TkZtdC5zZXAoJy4n # LCcsJyxbM10pLmZyZWV6ZSw6c3FsPT5ORm10Lm5ldy5mcmVlemUsDQogICAg # ICAgOmRlZj0+TkZtdC5uZXcuZnJlZXplICNkZWZhdWx0IGZvcm1hdA0KICAg # IH0NCiAgICBkZWYgc2VsZi5kZWZhdWx0DQogICAgICBnZXQoOmRlZikNCiAg # ICBlbmQNCiAgICBkZWYgc2VsZi5kZWZhdWx0PShmbXQpDQogICAgICBkZWZp # bmUoOmRlZixmbXQpDQogICAgZW5kDQogICAgZGVmIHNlbGYuZGVmaW5lKHRh # ZyxmbXRfZGVmKQ0KICAgICAgQEBmbXRzW3RhZ109Zm10X2RlZi5mcmVlemUN # CiAgICBlbmQNCiAgICBkZWYgc2VsZi5nZXQodGFnKQ0KICAgICAgQEBmbXRz # W3RhZ10NCiAgICBlbmQNCiAgICAgIA0KICBlbmQNCiAgDQogIGNsYXNzIE51 # bUZvcm1hdEVycm9yIDxTdGFuZGFyZEVycm9yDQogIGVuZA0KICANCiAgY2xh # c3MgTkZtdA0KICAgICMgZm9ybWF0byBpbnRlcm1lZGlvIGRlIGNvbnZlcnNp # 8246DQogICAgQ09OVl9GTVQgPSBORm10LnByZWMoOmV4YWN0KS5yZXAoJzwn # LCc+JywnLi4uJywwKS5hcHByb3hfbW9kZSg6c2ltcGxpZnkpDQogICAgQ09O # Vl9GTVRfU1RSSUNUID0gTkZtdC5wcmVjKDpleGFjdCkucmVwKCc8JywnPics # Jy4uLicsMCkuYXBwcm94X21vZGUoOmV4YWN0KQ0KICAgIGRlZiBORm10LmNv # bnZlcnQoeCwgdHlwZSwgYXByeD10cnVlKQ0KICAgICAgZm10ID0gYXByeCA/ # IENPTlZfRk1UIDogQ09OVl9GTVRfU1RSSUNUDQogICAgICAjIHJldHVybiB4 # LnByZWModHlwZSkNCiAgICAgIGlmICEoeC5pc19hPyh0eXBlKSkNCiAgICAg # ICAgIyByZXR1cm4gdHlwZS5yZWFkRm10KHgud3JpdGVGbXQoZm10KSxmbXQp # DQogICAgICAgIA0KICAgICAgICB4ID0geC53cml0ZV9uZXV0cmFsKGZtdCkN # CiAgICAgICAgeCA9IHR5cGUucmVhZF9uZXV0cmFsKHgpDQogICAgICAgIA0K # ICAgICAgZW5kDQogICAgICB4DQogICAgZW5kDQogIGVuZA0KICANCiAgbW9k # dWxlX2Z1bmN0aW9uDQogICAgDQogIA0KICBtb2R1bGUgQ2xpbmdlcg0KICBt # b2R1bGVfZnVuY3Rpb24NCg0KICBkZWYgYWxnTShmLGUscm91bmRfbW9kZSxl # Yj0xMCxiZXRhPUZsb2F0OjpSQURJWCxuPUZsb2F0OjpNQU5UX0RJRyxtaW5f # ZT1GbG9hdDo6TUlOX0VYUC1GbG9hdDo6TUFOVF9ESUcsbWF4X2U9RmxvYXQ6 # Ok1BWF9FWFAtRmxvYXQ6Ok1BTlRfRElHKQ0KDQogICAgaWYgZTwwDQogICAg # IHUsdixrID0gZixlYioqKC1lKSwwDQogICAgZWxzZQ0KICAgICAgdSx2LGsg # PSBmKihlYioqZSksMSwwDQogICAgZW5kDQogICAgDQogICAgbG9vcCBkbw0K # ICAgICAgIHggPSB1LmRpdih2KQ0KICAgICAgICMgb3ZlcmZsb3cgaWYgaz49 # bWF4X2UgDQogICAgICAgaWYgKHg+PWJldGEqKihuLTEpICYmIHg8YmV0YSoq # bikgfHwgaz09bWluX2UgfHwgaz09bWF4X2UNCiAgICAgICAgICByZXR1cm4g # cmF0aW9fZmxvYXQodSx2LGsscm91bmRfbW9kZSxiZXRhLG4pDQogICAgICAg # ZWxzaWYgeDxiZXRhKioobi0xKQ0KICAgICAgICAgdSAqPSBiZXRhDQogICAg # ICAgICBrIC09IDENCiAgICAgICBlbHNpZiB4Pj1iZXRhKipuDQogICAgICAg # ICB2ICo9IGJldGENCiAgICAgICAgIGsgKz0gMSAgICAgICAgIA0KICAgICAg # IGVuZCAgICAgDQogICAgZW5kDQoNCiAgZW5kDQogIA0KICBkZWYgcmF0aW9f # ZmxvYXQodSx2LGsscm91bmRfbW9kZSxiZXRhPUZsb2F0OjpSQURJWCxuPUZs # b2F0OjpNQU5UX0RJRykNCiAgICBxID0gdS5kaXYgdg0KICAgIHIgPSB1LXEq # dg0KICAgIHZfciA9IHYtcg0KICAgIHogPSBNYXRoLmxkZXhwKHEsaykNCiAg # ICBpZiByPHZfcg0KICAgICAgeg0KICAgIGVsc2lmIHI+dl9yDQogICAgICBu # ZXh0ZmxvYXQgeg0KICAgIGVsc2lmIChyb3VuZF9tb2RlPT06ZXZlbiAmJiBx # LmV2ZW4/KSB8fCAocm91bmRfbW9kZT09OmluZl9uZWcpDQogICAgICB6DQog # ICAgZWxzZQ0KICAgICAgbmV4dGZsb2F0IHoNCiAgICBlbmQNCiAgZW5kDQog # IA0KICBkZWYgbmV4dGZsb2F0KHgpDQogICAgZixlID0gTWF0aC5mcmV4cCh4 # KSAgDQogICAgZSA9IEZsb2F0OjpNSU5fRVhQIGlmIGY9PTANCiAgICBlID0g # W0Zsb2F0OjpNSU5fRVhQLGVdLm1heA0KICAgIGR4ID0gTWF0aC5sZGV4cCgx # LGUtRmxvYXQ6Ok1BTlRfRElHKSAjTWF0aC5sZGV4cChNYXRoLmxkZXhwKDEu # MCwtRmxvYXQ6Ok1BTlRfRElHKSxlKSAgDQogICAgeCArIGR4DQogIGVuZA0K # DQogIGRlZiBwcmV2ZmxvYXQoeCkNCiAgICBmLGUgPSBNYXRoLmZyZXhwKHgp # ICANCiAgICBlID0gRmxvYXQ6Ok1JTl9FWFAgaWYgZj09MA0KICAgIGUgPSBb # RmxvYXQ6Ok1JTl9FWFAsZV0ubWF4DQogICAgZHggPSBNYXRoLmxkZXhwKDEs # ZS1GbG9hdDo6TUFOVF9ESUcpICNNYXRoLmxkZXhwKE1hdGgubGRleHAoMS4w # LC1GbG9hdDo6TUFOVF9ESUcpLGUpICANCiAgICBpZiBlPT1GbG9hdDo6TUlO # X0VYUCB8fCBmIT0wLjUgIzAuNT09TWF0aC5sZGV4cCgyKiooYml0cy0xKSwt # RmxvYXQ6Ok1BTlRfRElHKQ0KICAgICAgeCAtIGR4DQogICAgZWxzZQ0KICAg # ICAgeCAtIGR4LzIgIyB4IC0gTWF0aC5sZGV4cChNYXRoLmxkZXhwKDEuMCwt # RmxvYXQ6Ok1BTlRfRElHKSxlLTEpICANCiAgICBlbmQNCiAgZW5kDQogIA0K # ICBlbmQNCiAgDQogIG1vZHVsZSBCdXJnZXJEeWJ2aWcNCiAgbW9kdWxlX2Z1 # bmN0aW9uDQoNCiAgZGVmIGZsb2F0X3RvX2RpZ2l0cyh2LGYsZSxyb3VuZF9t # b2RlLG1pbl9lLHAsYixfQikNCiAgIA0KICAgY2FzZSByb3VuZF9tb2RlDQog # ICAgIHdoZW4gOmV2ZW4NCiAgICAgICByb3VuZGwgPSByb3VuZGggPSBmLmV2 # ZW4/DQogICAgIHdoZW4gOmluZl9wb3MsIDppbmYNCiAgICAgICByb3VuZGwg # PSB0cnVlDQogICAgICAgcm91bmRoID0gZmFsc2UNCiAgICAgd2hlbiA6aW5m # X25lZw0KICAgICAgIHJvdW5kbCA9IGZhbHNlDQogICAgICAgcm91bmRoID0g # dHJ1ZQ0KICAgICBlbHNlDQogICAgICAgIyBoZXJlIHdlIGRvbid0IGFzc3Vt # ZSBhbnkgcm91bmRpbmcgaW4gdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlcnMN # CiAgICAgICAjIHRoZSByZXN1bHQgaXMgdmFsaWQgZm9yIGFueSByb3VuZGlu # Zw0KICAgICAgIHJvdW5kbCA9IGZhbHNlDQogICAgICAgcm91bmRoID0gZmFs # c2UNCiAgIGVuZA0KICAgIA0KICAgICAgaWYgZSA+PSAwDQogICAgICAgIGlm # IGYgIT0gZXhwdHQoYixwLTEpDQogICAgICAgICAgYmUgPSBleHB0dChiLGUp # DQogICAgICAgICAgcixzLG1fcCxtX20sayA9IHNjYWxlKGYqYmUqMiwyLGJl # LGJlLDAsX0Iscm91bmRsICxyb3VuZGgsdikNCiAgICAgICAgZWxzZQ0KICAg # ICAgICAgIGJlID0gZXhwdHQoYixlKQ0KICAgICAgICAgIGJlMSA9IGJlKmIN # CiAgICAgICAgICByLHMsbV9wLG1fbSxrID0gc2NhbGUoZipiZTEqMixiKjIs # YmUxLGJlLDAsX0Iscm91bmRsICxyb3VuZGgsdikNCiAgICAgICAgZW5kDQog # ICAgICBlbHNlDQogICAgICAgIGlmIGU9PW1pbl9lIG9yIGYgIT0gZXhwdHQo # YixwLTEpDQogICAgICAgICAgcixzLG1fcCxtX20sayA9IHNjYWxlKGYqMixl # eHB0dChiLC1lKSoyLDEsMSwwLF9CLHJvdW5kbCAscm91bmRoLHYpDQogICAg # ICAgIGVsc2UNCiAgICAgICAgICByLHMsbV9wLG1fbSxrID0gc2NhbGUoZipi # KjIsZXhwdHQoYiwxLWUpKjIsYiwxLDAsX0Iscm91bmRsICxyb3VuZGgsdikN # CiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICAgIFtrXStnZW5lcmF0ZShy # LHMsbV9wLG1fbSxfQixyb3VuZGwgLHJvdW5kaCkNCiAgZW5kDQogIA0KICBk # ZWYgc2NhbGUocixzLG1fcCxtX20sayxfQixsb3dfb2sgLGhpZ2hfb2ssdikN # CiAgICByZXR1cm4gc2NhbGUyKHIscyxtX3AsbV9tLGssX0IsbG93X29rICxo # aWdoX29rKSBpZiB2PT0wDQogICAgZXN0ID0gKGxvZ0IoX0IsdiktMUUtMTAp # LmNlaWwudG9faQ0KICAgIGlmIGVzdD49MCANCiAgICAgIGZpeHVwKHIscypl # eHB0dChfQixlc3QpLG1fcCxtX20sZXN0LF9CLGxvd19vayxoaWdoX29rKQ0K # ICAgIGVsc2UNCiAgICAgIHNjID0gZXhwdHQoX0IsLWVzdCkNCiAgICAgIGZp # eHVwKHIqc2MscyxtX3Aqc2MsbV9tKnNjLGVzdCxfQixsb3dfb2ssaGlnaF9v # aykNCiAgICBlbmQNCiAgZW5kDQoNCiAgZGVmIGZpeHVwKHIscyxtX3AsbV9t # LGssX0IsbG93X29rLGhpZ2hfb2spDQogICAgaWYgKGhpZ2hfb2sgPyAocitt # X3AgPj0gcykgOiAocittX3AgPiBzKSkgIyB0b28gbG93Pw0KICAgICAgW3Is # cypfQixtX3AsbV9tLGsrMV0NCiAgICBlbHNlDQogICAgICBbcixzLG1fcCxt # X20sa10NCiAgICBlbmQNCiAgZW5kDQogIA0KICBkZWYgc2NhbGUyKHIscyxt # X3AsbV9tLGssX0IsbG93X29rICxoaWdoX29rKQ0KICAgIGxvb3AgZG8NCiAg # ICAgIGlmIChoaWdoX29rID8gKHIrbV9wID49IHMpIDogKHIrbV9wID4gcykp # ICMgayBpcyB0b28gbG93DQogICAgICAgIHMgKj0gX0INCiAgICAgICAgayAr # PSAxDQogICAgICBlbHNpZiAoaGlnaF9vayA/ICgocittX3ApKl9CPHMpIDog # KChyK21fcCkqX0I8PXMpKSAjIGsgaXMgdG9vIGhpZ2gNCiAgICAgICAgciAq # PSBfQg0KICAgICAgICBtX3AgKj0gX0INCiAgICAgICAgbV9tICo9IF9CDQog # ICAgICAgIGsgLT0gMQ0KICAgICAgZWxzZQ0KICAgICAgICBicmVhaw0KICAg # ICAgZW5kDQogICAgZW5kDQogICAgW3IscyxtX3AsbV9tLGtdDQogIGVuZA0K # ICANCiAgZGVmIGdlbmVyYXRlKHIscyxtX3AsbV9tLF9CLGxvd19vayAsaGln # aF9vaykNCiAgICBsaXN0ID0gW10NCiAgICBsb29wIGRvDQogICAgICBkLHIg # PSAocipfQikuZGl2bW9kKHMpDQogICAgICBtX3AgKj0gX0INCiAgICAgIG1f # bSAqPSBfQg0KICAgICAgdGMxID0gbG93X29rID8gKHI8PW1fbSkgOiAocjxt # X20pDQogICAgICB0YzIgPSBoaWdoX29rID8gKHIrbV9wID49IHMpIDogKHIr # bV9wID4gcykNCg0KICAgICAgIGlmIG5vdCB0YzENCiAgICAgICAgaWYgbm90 # IHRjMg0KICAgICAgICAgIGxpc3QgPDwgZA0KICAgICAgICBlbHNlDQogICAg # ICAgICAgbGlzdCA8PCBkKzENCiAgICAgICAgICBicmVhaw0KICAgICAgICBl # bmQNCiAgICAgIGVsc2UNCiAgICAgICAgaWYgbm90IHRjMg0KICAgICAgICAg # IGxpc3QgPDwgZA0KICAgICAgICAgIGJyZWFrDQogICAgICAgIGVsc2UNCiAg # ICAgICAgICBpZiByKjIgPCBzDQogICAgICAgICAgICBsaXN0IDw8IGQNCiAg # ICAgICAgICAgIGJyZWFrDQogICAgICAgICAgZWxzZQ0KICAgICAgICAgICAg # bGlzdCA8PCBkKzENCiAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgZW5k # DQogICAgICAgIGVuZA0KICAgICAgZW5kDQogICAgICANCiAgICBlbmQNCiAg # ICBsaXN0DQogIGVuZA0KICANCiAgJGV4cHR0X3RhYmxlID0gQXJyYXkubmV3 # KDMyNikNCiAgKDAuLi4zMjYpLmVhY2h7fGl8ICRleHB0dF90YWJsZVtpXT0x # MCoqaX0NCiAgZGVmIGV4cHR0KF9CLCBrKQ0KICAgIGlmIF9CPT0xMCAmJiBr # Pj0wICYmIGs8MzI2IA0KICAgICAgJGV4cHR0X3RhYmxlW2tdDQogICAgZWxz # ZQ0KICAgICAgX0IqKmsNCiAgICBlbmQNCiAgZW5kDQoNCiAgJGxvZ0JfdGFi # bGUgPSBBcnJheS5uZXcoMzcpDQogICgyLi4uMzcpLmVhY2h7fGJ8ICRsb2dC # X3RhYmxlW2JdPTEuMC9NYXRoLmxvZyhiKX0NCiAgZGVmIGxvZ0IoX0IsIHgp # DQogICAgaWYgX0I+PTIgJiYgX0I8MzcNCiAgICAgIE1hdGgubG9nKHgpKiRs # b2dCX3RhYmxlW19CXQ0KICAgIGVsc2UNCiAgICAgIE1hdGgubG9nKHgpL01h # dGgubG9nKF9CKQ0KICAgIGVuZA0KICBlbmQNCiAgDQogIGRlZiBmbG9hdF90 # b19kaWdpdHNfbWF4KHYsZixlLHJvdW5kX21vZGUsbWluX2UscCxiLF9CKQ0K # ICAgDQogICBjYXNlIHJvdW5kX21vZGUNCiAgICAgd2hlbiA6ZXZlbg0KICAg # ICAgIHJvdW5kbCA9IHJvdW5kaCA9IGYuZXZlbj8NCiAgICAgd2hlbiA6aW5m # X3BvcywgOmluZg0KICAgICAgIHJvdW5kbCA9IHRydWUNCiAgICAgICByb3Vu # ZGggPSBmYWxzZQ0KICAgICB3aGVuIDppbmZfbmVnDQogICAgICAgcm91bmRs # ID0gZmFsc2UNCiAgICAgICByb3VuZGggPSB0cnVlDQogICAgIGVsc2UNCiAg # ICAgICAjIGhlcmUgd2UgZG9uJ3QgYXNzdW1lIGFueSByb3VuZGluZyBpbiB0 # aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycw0KICAgICAgICMgdGhlIHJlc3Vs # dCBpcyB2YWxpZCBmb3IgYW55IHJvdW5kaW5nDQogICAgICAgcm91bmRsID0g # ZmFsc2UNCiAgICAgICByb3VuZGggPSBmYWxzZQ0KICAgZW5kDQogICAgDQog # ICAgICBpZiBlID49IDANCiAgICAgICAgaWYgZiAhPSBleHB0dChiLHAtMSkN # CiAgICAgICAgICBiZSA9IGV4cHR0KGIsZSkNCiAgICAgICAgICByLHMsbV9w # LG1fbSxrID0gc2NhbGUoZipiZSoyLDIsYmUsYmUsMCxfQixyb3VuZGwgLHJv # dW5kaCx2KQ0KICAgICAgICBlbHNlDQogICAgICAgICAgYmUgPSBleHB0dChi # LGUpDQogICAgICAgICAgYmUxID0gYmUqYg0KICAgICAgICAgIHIscyxtX3As # bV9tLGsgPSBzY2FsZShmKmJlMSoyLGIqMixiZTEsYmUsMCxfQixyb3VuZGwg # LHJvdW5kaCx2KQ0KICAgICAgICBlbmQNCiAgICAgIGVsc2UNCiAgICAgICAg # aWYgZT09bWluX2Ugb3IgZiAhPSBleHB0dChiLHAtMSkNCiAgICAgICAgICBy # LHMsbV9wLG1fbSxrID0gc2NhbGUoZioyLGV4cHR0KGIsLWUpKjIsMSwxLDAs # X0Iscm91bmRsICxyb3VuZGgsdikNCiAgICAgICAgZWxzZQ0KICAgICAgICAg # IHIscyxtX3AsbV9tLGsgPSBzY2FsZShmKmIqMixleHB0dChiLDEtZSkqMixi # LDEsMCxfQixyb3VuZGwgLHJvdW5kaCx2KQ0KICAgICAgICBlbmQNCiAgICAg # IGVuZA0KICAgICAgW2tdK2dlbmVyYXRlX21heChyLHMsbV9wLG1fbSxfQixy # b3VuZGwgLHJvdW5kaCkNCiAgZW5kDQogIA0KICBkZWYgZ2VuZXJhdGVfbWF4 # KHIscyxtX3AsbV9tLF9CLGxvd19vayAsaGlnaF9vaykNCiAgICBsaXN0ID0g # W2ZhbHNlXQ0KICAgIGxvb3AgZG8NCiAgICAgIGQsciA9IChyKl9CKS5kaXZt # b2QocykNCiAgICAgIG1fcCAqPSBfQg0KICAgICAgbV9tICo9IF9CDQogICAg # ICANCiAgICAgIGxpc3QgPDwgZA0KICAgICAgICAgIA0KICAgICAgdGMxID0g # bG93X29rID8gKHI8PW1fbSkgOiAocjxtX20pDQogICAgICB0YzIgPSBoaWdo # X29rID8gKHIrbV9wID49IHMpIDogKHIrbV9wID4gcykNCiAgICAgICAgICAN # CiAgICAgIGlmIHRjMSAmJiB0YzINCiAgICAgICAgbGlzdFswXSA9IHRydWUg # aWYgcioyID49IHMNCiAgICAgICAgYnJlYWsNCiAgICAgIGVuZCAgICANCiAg # ICBlbmQNCiAgICBsaXN0DQogIGVuZA0KICANCiAgZW5kDQogICAgDQplbmQN # Cg0KY2xhc3MgRmxvYXQNCiAgaW5jbHVkZSBHb2k6OkZvcm1hdHRhYmxlDQog # IGRlZiBzZWxmLnJlYWRfbmV1dHJhbChuZXV0cmFsKSAgIA0KICAgIHggPSBu # aWwNCiAgICANCiAgICBob25vcl9yb3VuZGluZyA9IHRydWUNCiAgICANCiAg # ICBpZiBuZXV0cmFsLnNwZWNpYWw/DQogICAgICBjYXNlIG5ldXRyYWwuc3Bl # Y2lhbA0KICAgICAgICB3aGVuIDpuYW4NCiAgICAgICAgICB4ID0gMC4wLzAu # MA0KICAgICAgICB3aGVuIDppbmYNCiAgICAgICAgICB4ID0gKG5ldXRyYWwu # c2lnbj09Jy0nID8gLTEuMCA6ICsxLjApLzAuMA0KICAgICAgZW5kDQogICAg # ZWxzaWYgbmV1dHJhbC5yZXBfcG9zPG5ldXRyYWwuZGlnaXRzLmxlbmd0aCAg # DQogICAgICANCiAgICAgIHgseSA9IG5ldXRyYWwudG9fUmVwRGVjLmdldFEN # CiAgICAgIHggPSBGbG9hdCh4KS95DQogICAgICANCiAgICBlbHNlDQogICAg # ICBuZCA9IG5ldXRyYWwuYmFzZT09MTAgPyBGbG9hdDo6RElHIDogKChGbG9h # dDo6TUFOVF9ESUctMSkqTWF0aC5sb2coMikvTWF0aC5sb2cobmV1dHJhbC5i # YXNlKSkuZmxvb3IgDQogICAgICBrID0gbmV1dHJhbC5kZWNfcG9zLW5ldXRy # YWwuZGlnaXRzLmxlbmd0aA0KICAgICAgaWYgIWhvbm9yX3JvdW5kaW5nICYm # IChuZXV0cmFsLmRpZ2l0cy5sZW5ndGg8PW5kICYmIGsuYWJzPD0xNSkNCiAg # ICAgICAgeCA9IG5ldXRyYWwuZGlnaXRzLnRvX2kobmV1dHJhbC5iYXNlKS50 # b19mDQogICAgICAgIGlmIGs8MA0KICAgICAgICAgIHggLz0gRmxvYXQobmV1 # dHJhbC5iYXNlKiotaykNCiAgICAgICAgZWxzZQ0KICAgICAgICAgIHggKj0g # RmxvYXQobmV1dHJhbC5iYXNlKiprKQ0KICAgICAgICBlbmQNCiAgICAgICAg # eCA9IC14IGlmIG5ldXRyYWwuc2lnbj09Jy0nDQogICAgICBlbHNpZiAhaG9u # b3Jfcm91bmRpbmcgJiYgKGs+MCAmJiAoaytuZXV0cmFsLmRpZ2l0cy5sZW5n # dGggPCAyKm5kKSkNCiAgICAgICAgaiA9IGstbmV1dHJhbC5kaWdpdHMubGVu # Z3RoDQogICAgICAgIHggPSBuZXV0cmFsLmRpZ2l0cy50b19pKG5ldXRyYWwu # YmFzZSkudG9fZiAqIEZsb2F0KG5ldXRyYWwuYmFzZSoqKGopKQ0KICAgICAg # ICB4ICo9IEZsb2F0KG5ldXRyYWwuYmFzZSoqKGstaikpDQogICAgICAgIHgg # PSAteCBpZiBuZXV0cmFsLnNpZ249PSctJw0KICAgICAgZWxzaWYgbmV1dHJh # bC5iYXNlLm1vZHVsbyhGbG9hdDo6UkFESVgpPT0wDQogICAgICAgDQogICAg # ICAgZiA9IG5ldXRyYWwuZGlnaXRzLnRvX2kobmV1dHJhbC5iYXNlKQ0KICAg # ICAgIGUgPSBuZXV0cmFsLmRlY19wb3MtbmV1dHJhbC5kaWdpdHMubGVuZ3Ro # DQoNCiAgICAgICByb3VuZGluZyA9IG5ldXRyYWwucm91bmRpbmcNCiAgICAg # ICBpZiBuZXV0cmFsLnNpZ249PSctJw0KICAgICAgICAgaWYgcm91bmRpbmcg # PT0gOmluZl9wb3MNCiAgICAgICAgICAgcm91bmRpbmcgPSA6aW5mX25lZw0K # ICAgICAgICAgZWxzaWYgcm91bmRpbmc9PSA6aW5mX25lZw0KICAgICAgICAg # ICByb3VuZGluZyA9IDppbmZfcG9zDQogICAgICAgICBlbmQgICANCiAgICAg # ICBlbmQNCiAgICAgICANCiAgICAgICB4ID0gQ2xpbmdlcjo6YWxnTShmLGUs # cm91bmRpbmcsbmV1dHJhbC5iYXNlLEZsb2F0OjpSQURJWCxGbG9hdDo6TUFO # VF9ESUcsRmxvYXQ6Ok1JTl9FWFAtRmxvYXQ6Ok1BTlRfRElHLEZsb2F0OjpN # QVhfRVhQLUZsb2F0OjpNQU5UX0RJRykNCiAgICAgICB4ID0gLXggaWYgbmV1 # dHJhbC5zaWduPT0nLScNCiAgICAgICANCiAgICAgIGVsc2UNCiAgICAgICAN # CiAgICAgICBmID0gbmV1dHJhbC5kaWdpdHMudG9faShuZXV0cmFsLmJhc2Up # DQogICAgICAgZSA9IG5ldXRyYWwuZGVjX3Bvcy1uZXV0cmFsLmRpZ2l0cy5s # ZW5ndGgNCg0KICAgICAgIHJvdW5kaW5nID0gbmV1dHJhbC5yb3VuZGluZw0K # ICAgICAgIGlmIG5ldXRyYWwuc2lnbj09Jy0nDQogICAgICAgICBpZiByb3Vu # ZGluZyA9PSA6aW5mX3Bvcw0KICAgICAgICAgICByb3VuZGluZyA9IDppbmZf # bmVnDQogICAgICAgICBlbHNpZiByb3VuZGluZz09IDppbmZfbmVnDQogICAg # ICAgICAgIHJvdW5kaW5nID0gOmluZl9wb3MNCiAgICAgICAgIGVuZCAgIA0K # ICAgICAgIGVuZA0KICAgICAgIA0KICAgICAgIHggPSBDbGluZ2VyOjphbGdN # KGYsZSxyb3VuZGluZyxuZXV0cmFsLmJhc2UsRmxvYXQ6OlJBRElYLEZsb2F0 # OjpNQU5UX0RJRyxGbG9hdDo6TUlOX0VYUC1GbG9hdDo6TUFOVF9ESUcsRmxv # YXQ6Ok1BWF9FWFAtRmxvYXQ6Ok1BTlRfRElHKQ0KICAgICAgIHggPSAteCBp # ZiBuZXV0cmFsLnNpZ249PSctJw0KICAgICAgIA0KICAgICAgZW5kDQogICAg # ZW5kDQogICAgIA0KICAgIHJldHVybiB4DQogIGVuZA0KICBkZWYgd3JpdGVf # bmV1dHJhbChmbXQpDQogICAgbmV1dHJhbCA9IEdvaTo6TmV1dHJhbE51bS5u # ZXcNCiAgICB4ID0gc2VsZg0KICAgIA0KICAgIGlmIHgubmFuPw0KICAgICAg # bmV1dHJhbC5zZXRfc3BlY2lhbCg6bmFuKQ0KICAgIGVsc2lmIHguaW5maW5p # dGU/DQogICAgICBuZXV0cmFsLnNldF9zcGVjaWFsKDppbmYsIHg8MCA/ICct # JyA6ICcrJykNCiAgICBlbHNlDQogICAgICBjb252ZXJ0ZWQgPSBmYWxzZQ0K # ICAgICAgaWYgZm10LmdldF9uZGlnPT06ZXhhY3QgJiYgZm10LmdldF9hcHBy # b3g9PTpzaW1wbGlmeQ0KICAgICAgICANCiAgICAgICAgaWYgeCE9MA0KICAg # ICAgICAgIHEgPSB4LnRvX3IoR29pOjpUb2xlcmFuY2UuZGVjaW1hbHMoRmxv # YXQ6OkRJRyw6c2lnKSkNCiAgICAgICAgICBpZiBxIT0wDQogICAgICAgICAg # ICBuZXV0cmFsID0gcS53cml0ZV9uZXV0cmFsKGZtdCkNCiAgICAgICAgICAg # IGNvbnZlcnRlZCA9IHRydWUgaWYgbmV1dHJhbC5kaWdpdHMubGVuZ3RoPD1G # bG9hdDo6RElHDQogICAgICAgICAgZW5kDQogICAgICAgIGVuZA0KICAgICAg # ICANCiAgICAgIGVsc2lmIGZtdC5nZXRfYXBwcm94PT06ZXhhY3QNCiAgICAg # ICAgbmV1dHJhbCA9IHgudG9feHIud3JpdGVfbmV1dHJhbChmbXQpDQogICAg # ICAgIGNvbnZlcnRlZCA9IHRydWUNCiAgICAgIGVuZA0KICAgICAgaWYgIWNv # bnZlcnRlZCAgDQogICAgICAgIGlmIGZtdC5nZXRfYmFzZT09MTAgJiYgZmFs # c2UNCiAgICAgICAgICB0eHQgPSBmb3JtYXQgIiUuKmUiLEZsb2F0OjpESUdJ # VFMyLTEseCAjIG5vdGUgdGhhdCBzcGVjLiBlIG91dHB1dCBwcmVjaXNpb24r # MSBzaWduaWZpY2FudCBkaWdpdHMNCiAgICAgICAgICANCiAgICAgICAgICBz # aWduID0gJysnICAgIA0KICAgICAgICAgIGlmIHR4dFswLDFdPT0nLScNCiAg # ICAgICAgICAgIHNpZ24gPSAnLScNCiAgICAgICAgICAgIHR4dCA9IHR4dFsx # Li4udHh0Lmxlbmd0aF0NCiAgICAgICAgICBlbmQNCiAgICAgICAgICBleHAg # PSAwDQogICAgICAgICAgeF9jaGFyID0gZm10LmdldF9leHBfY2hhcihmbXQu # Z2V0X2Jhc2UpDQoNCiAgICAgICAgICBleHBfaSA9IHR4dC5pbmRleCh4X2No # YXIpDQogICAgICAgICAgZXhwX2kgPSB0eHQuaW5kZXgoeF9jaGFyLmRvd25j # YXNlKSBpZiBleHBfaT09PW5pbA0KICAgICAgICAgIGlmIGV4cF9pIT1uaWwN # CiAgICAgICAgICAgIGV4cCA9IHR4dFtleHBfaSsxLi4udHh0Lmxlbmd0aF0u # dG9faQ0KICAgICAgICAgICAgdHh0ID0gdHh0WzAuLi5leHBfaV0gDQogICAg # ICAgICAgZW5kICAgIA0KICAgICAgICAgIA0KICAgICAgICAgIGRlY19wb3Mg # PSB0eHQuaW5kZXggJy4nDQogICAgICAgICAgaWYgZGVjX3Bvcz09bmlsDQog # ICAgICAgICAgICBkZWNfcG9zID0gdHh0Lmxlbmd0aCANCiAgICAgICAgICBl # bHNlDQogICAgICAgICAgICB0eHRbZGVjX3Bvc109JycNCiAgICAgICAgICBl # bmQNCiAgICAgICAgICBkZWNfcG9zICs9IGV4cA0KICAgICAgICAgIG5ldXRy # YWwuc2V0IHNpZ24sIHR4dCwgZGVjX3BvcywgbmlsLCBmbXQuZ2V0X2Jhc2Vf # ZGlnaXRzKDEwKSwgdHJ1ZSwgZm10LmdldF9yb3VuZA0KICAgICAgICAgIA0K # ICAgICAgICAgIGNvbnZlcnRlZCA9IHRydWUNCiAgICAgICAgZW5kDQogICAg # ICBlbmQNCiAgICAgIGlmICFjb252ZXJ0ZWQNCiAgICAgICAgDQogICAgICAg # IHNpZ24gPSB4PDAgPyAnLScgOiAnKycNCiAgICAgICAgeCA9IC14IGlmIHNp # Z249PSctJw0KICAgICAgICBmLGUgPSBNYXRoLmZyZXhwKHgpDQogICAgICAg # IGlmIGUgPCBGbG9hdDo6TUlOX0VYUA0KICAgICAgICAgICMgZGVub3JtYWxp # emVkIG51bWJlcg0KICAgICAgICAgIGYgPSBNYXRoLmxkZXhwKGYsZS1GbG9h # dDo6TUlOX0VYUCtGbG9hdDo6TUFOVF9ESUcpDQogICAgICAgICAgZSA9IEZs # b2F0OjpNSU5fRVhQLUZsb2F0OjpNQU5UX0RJRw0KICAgICAgICBlbHNlDQog # ICAgICAgICAgIyBub3JtYWxpemVkIG51bWJlcg0KICAgICAgICAgIGYgPSBN # YXRoLmxkZXhwKGYsRmxvYXQ6Ok1BTlRfRElHKQ0KICAgICAgICAgIGUgLT0g # RmxvYXQ6Ok1BTlRfRElHDQogICAgICAgIGVuZA0KICAgICAgICBmID0gZi50 # b19pDQogICAgICAgIGluZXhhY3QgPSB0cnVlDQoNCiAgICAgICAgcm91bmRp # bmcgPSBmbXQuZ2V0X3JvdW5kDQogICAgICAgIGlmIHNpZ249PSctJw0KICAg # ICAgICAgIGlmIHJvdW5kaW5nID09IDppbmZfcG9zDQogICAgICAgICAgICBy # b3VuZGluZyA9IDppbmZfbmVnDQogICAgICAgICAgZWxzaWYgcm91bmRpbmc9 # PSA6aW5mX25lZw0KICAgICAgICAgICAgcm91bmRpbmcgPSA6aW5mX3Bvcw0K # ICAgICAgICAgIGVuZCAgIA0KICAgICAgICBlbmQNCiAgICAgICAgDQogICAg # ICAgIGlmIGZtdC5nZXRfYWxsX2RpZ2l0cz8NCiAgICAgICAgICAjIHVzZSBh # cyBtYW55IGRpZ2l0cyBhcyBwb3NzaWJsZQ0KICAgICAgICAgIGRlY19wb3Ms # ciwqZGlnaXRzID0gQnVyZ2VyRHlidmlnOjpmbG9hdF90b19kaWdpdHNfbWF4 # KHgsZixlLHJvdW5kaW5nLEZsb2F0OjpNSU5fRVhQLUZsb2F0OjpNQU5UX0RJ # RyxGbG9hdDo6TUFOVF9ESUcsRmxvYXQ6OlJBRElYLGZtdC5nZXRfYmFzZSkN # CiAgICAgICAgICBpbmV4YWN0ID0gOnJvdW5kdXAgaWYgcg0KICAgICAgICBl # bHNlDQogICAgICAgICAgIyB1c2UgYXMgZmV3IGRpZ2l0cyBhcyBwb3NzaWJs # ZQ0KICAgICAgICAgIGRlY19wb3MsKmRpZ2l0cyA9IEJ1cmdlckR5YnZpZzo6 # ZmxvYXRfdG9fZGlnaXRzKHgsZixlLHJvdW5kaW5nLEZsb2F0OjpNSU5fRVhQ # LUZsb2F0OjpNQU5UX0RJRyxGbG9hdDo6TUFOVF9ESUcsRmxvYXQ6OlJBRElY # LGZtdC5nZXRfYmFzZSkNCiAgICAgICAgZW5kDQogICAgICAgIHR4dCA9ICcn # DQogICAgICAgIGRpZ2l0cy5lYWNoe3xkfCB0eHQgPDwgZm10LmdldF9iYXNl # X2RpZ2l0cy5kaWdpdF9jaGFyKGQpfQ0KICAgICAgICBuZXV0cmFsLnNldCBz # aWduLCB0eHQsIGRlY19wb3MsIG5pbCwgZm10LmdldF9iYXNlX2RpZ2l0cywg # aW5leGFjdCwgZm10LmdldF9yb3VuZA0KICAgICAgICANCiAgICAgIGVuZA0K # ICAgIGVuZA0KICAgICAgICAgDQogICAgcmV0dXJuIG5ldXRyYWwNCiAgZW5k # ICANCmVuZA0KDQpjbGFzcyBOdW1lcmljDQogIHVubGVzcyBtZXRob2RfZGVm # aW5lZD8oOmV2ZW4/KQ0KICAgIGRlZiBldmVuPw0KICAgICAgc2VsZi5tb2R1 # bG8oMik9PTANCiAgICBlbmQNCiAgZW5kDQogIHVubGVzcyBtZXRob2RfZGVm # aW5lZD8oOm9kZD8pDQogICAgZGVmIG9kZD8NCiAgICAgIHNlbGYubW9kdWxv # KDIpIT0wDQogICAgZW5kDQogIGVuZA0KZW5kDQoNCmNsYXNzIEludGVnZXIN # CiAgaW5jbHVkZSBHb2k6OkZvcm1hdHRhYmxlDQogIGRlZiBzZWxmLnJlYWRf # bmV1dHJhbChuZXV0cmFsKSAgIA0KICAgIHggPSBuaWwNCiAgICANCiAgICBp # ZiBuZXV0cmFsLnNwZWNpYWw/DQogICAgICByYWlzZSBHb2k6Ok51bUZvcm1h # dEVycm9yLCJJbnZhbGlkIGludGVnZXIgbnVtZXJhbCINCiAgICBlbHNpZiBu # ZXV0cmFsLnJlcF9wb3M8bmV1dHJhbC5kaWdpdHMubGVuZ3RoICANCiAgICAg # IHJldHVybiBSYXRpb25hbC5yZWFkX25ldXRyYWwobmV1dHJhbCkudG9faQ0K # ICAgIGVsc2UNCiAgICAgIGRpZ2l0cyA9IG5ldXRyYWwuZGlnaXRzDQogICAg # ICANCiAgICAgIGlmIG5ldXRyYWwuZGVjX3BvcyA8PSAwDQogICAgICAgIGRp # Z2l0cyA9ICcwJw0KICAgICAgZWxzaWYgbmV1dHJhbC5kZWNfcG9zIDw9IGRp # Z2l0cy5sZW5ndGgNCiAgICAgICAgZGlnaXRzID0gZGlnaXRzWzAuLi5uZXV0 # cmFsLmRlY19wb3NdDQogICAgICBlbHNlDQogICAgICAgIGRpZ2l0cyA9IGRp # Z2l0cyArICcwJyoobmV1dHJhbC5kZWNfcG9zLWRpZ2l0cy5sZW5ndGgpICAN # CiAgICAgIGVuZA0KICAgICAgDQogICAgICB4ID0gZGlnaXRzLnRvX2kobmV1 # dHJhbC5iYXNlKQ0KICAgICMgdGhpcyB3YXMgZm9ybWVseSBuZWVkZWQgYmVj # YXVzZSB3ZSBkaWRuJ3QgYWR1c3QgdGhlIGRpZ2l0cw0KICAgICMgIGlmIG5l # dXRyYWwuZGVjX3BvcyAhPSBuZXV0cmFsLmRpZ2l0cy5sZW5ndGgNCiAgICAj # ICAgICMgd2l0aCByYXRpb25hbCBpbmNsdWRlZCwgbmVnYXRpdmUgcG93ZXJz # IG9mIHRlbiBhcmUgcmF0aW9uYWwgbnVtYmVycw0KICAgICMgICAgeCA9ICh4 # KigobmV1dHJhbC5iYXNlKSoqKG5ldXRyYWwuZGVjX3Bvcy1uZXV0cmFsLmRp # Z2l0cy5sZW5ndGgpKSkudG9faSAgIA0KICAgICMgIGVuZA0KICAgICAgeCA9 # IC14IGlmIG5ldXRyYWwuc2lnbj09Jy0nDQogICAgZW5kDQogICAgIA0KICAg # IHJldHVybiB4DQogIGVuZA0KICBkZWYgd3JpdGVfbmV1dHJhbChmbXQpDQog # ICAgbmV1dHJhbCA9IEdvaTo6TmV1dHJhbE51bS5uZXcNCiAgICB4ID0gc2Vs # Zg0KICAgIA0KICAgIHNpZ24gPSB4PDAgPyAnLScgOiAnKycNCiAgICB0eHQg # PSB4LmFicy50b19zKGZtdC5nZXRfYmFzZSkNCiAgICBkZWNfcG9zID0gcmVw # X3BvcyA9IHR4dC5sZW5ndGggIA0KICAgIG5ldXRyYWwuc2V0IHNpZ24sIHR4 # dCwgZGVjX3BvcywgbmlsLCBmbXQuZ2V0X2Jhc2VfZGlnaXRzLCBmYWxzZSAs # Zm10LmdldF9yb3VuZA0KICAgICAgICAgDQogICAgcmV0dXJuIG5ldXRyYWwN # CiAgZW5kDQplbmQNCg0KY2xhc3MgUmF0aW9uYWwNCiAgaW5jbHVkZSBHb2k6 # OkZvcm1hdHRhYmxlDQogIGRlZiBzZWxmLnJlYWRfbmV1dHJhbChuZXV0cmFs # KSAgIA0KICAgIHggPSBuaWwNCiAgICANCiAgICBpZiBuZXV0cmFsLnNwZWNp # YWw/DQogICAgICBjYXNlIG5ldXRyYWwuc3BlY2lhbA0KICAgICAgICB3aGVu # IDpuYW4NCiAgICAgICAgICB4ID0gUmF0aW9uYWwoMCwwKQ0KICAgICAgICB3 # aGVuIDppbmYNCiAgICAgICAgICB4ID0gUmF0aW9uYWwoKG5ldXRyYWwuc2ln # bj09Jy0nID8gLTEgOiArMSksMCkNCiAgICAgIGVuZA0KICAgIGVsc2UNCiAg # ICAgIHggPSBSYXRpb25hbCAqbmV1dHJhbC50b19SZXBEZWMuZ2V0UQ0KICAg # IGVuZA0KICAgICANCiAgICByZXR1cm4geA0KICBlbmQNCiAgZGVmIHdyaXRl # X25ldXRyYWwoZm10KQ0KICAgIG5ldXRyYWwgPSBHb2k6Ok5ldXRyYWxOdW0u # bmV3DQogICAgeCA9IHNlbGYNCiAgICANCiAgICBpZiB4LmRlbm9taW5hdG9y # PT0wDQogICAgICBpZiB4Lm51bWVyYXRvcj4wICAgIA0KICAgICAgICBuZXV0 # cmFsLnNldF9zcGVjaWFsKDppbmYpDQogICAgICBlbHNpZiB4Lm51bWVyYXRv # cjwwDQogICAgICAgIG5ldXRyYWwuc2V0X3NwZWNpYWwoOmluZiwnLScpDQog # ICAgICBlbHNlDQogICAgICAgIG5ldXRyYWwuc2V0X3NwZWNpYWwoOm5hbikN # CiAgICAgIGVuZA0KICAgIGVsc2UNCiAgICAgIGlmIGZtdC5nZXRfYmFzZT09 # MTANCiAgICAgICAgcmQgPSBHb2k6OlJlcERlYy5uZXcuc2V0USh4Lm51bWVy # YXRvcix4LmRlbm9taW5hdG9yKQ0KICAgICAgZWxzZQ0KICAgICAgICBvcHQg # PSBHb2k6OlJlcERlYzo6REVGX09QVC5kdXAuc2V0X2RpZ2l0cyhmbXQuZ2V0 # X2Jhc2VfZGlnaXRzKQ0KICAgICAgICByZCA9IEdvaTo6UmVwRGVjLm5ldy5z # ZXRRKHgubnVtZXJhdG9yLHguZGVub21pbmF0b3IsIG9wdCkNCiAgICAgIGVu # ZA0KICAgICAgbmV1dHJhbCA9IHJkLnRvX05ldXRyYWxOdW0oZm10LmdldF9i # YXNlX2RpZ2l0cykNCiAgICAgIG5ldXRyYWwucm91bmRpbmcgPSBmbXQuZ2V0 # X3JvdW5kDQogICAgZW5kDQogICAgICAgICANCiAgICByZXR1cm4gbmV1dHJh # bA0KICBlbmQNCmVuZA0KDQppZiBkZWZpbmVkPyBCaWdEZWNpbWFsDQpjbGFz # cyBCaWdEZWNpbWFsDQogIGluY2x1ZGUgR29pOjpGb3JtYXR0YWJsZQ0KICBk # ZWYgc2VsZi5yZWFkX25ldXRyYWwobmV1dHJhbCkgICANCiAgICB4ID0gbmls # DQogICAgDQogICAgaWYgbmV1dHJhbC5zcGVjaWFsPw0KICAgICAgY2FzZSBu # ZXV0cmFsLnNwZWNpYWwNCiAgICAgICAgd2hlbiA6bmFuDQogICAgICAgICAg # eCA9IEJpZ0RlY2ltYWwoJ05hTicpICMgQmlnRGVjaW1hbCgiMCIpLzANCiAg # ICAgICAgd2hlbiA6aW5mDQogICAgICAgICAgeCA9IEJpZ0RlY2ltYWwobmV1 # dHJhbC5zaWduPT0nLScgPyAnLTEuMCcgOiAnKzEuMCcpLzANCiAgICAgIGVu # ZA0KICAgIGVsc2lmIG5ldXRyYWwucmVwX3BvczxuZXV0cmFsLmRpZ2l0cy5s # ZW5ndGggIA0KICAgICAgDQogICAgICB4LHkgPSBuZXV0cmFsLnRvX1JlcERl # Yy5nZXRRDQogICAgICB4ID0gQmlnRGVjaW1hbCh4LnRvX3MpL3kNCiAgICAg # IA0KICAgIGVsc2UNCiAgICAgIGlmIG5ldXRyYWwuYmFzZT09MTANCiAgICAg # ICAgI3ggPSBCaWdEZWNpbWFsKG5ldXRyYWwuZGlnaXRzKQ0KICAgICAgICAj # eCAqPSBCaWdEZWNpbWFsKCIxRSN7KG5ldXRyYWwuZGVjX3Bvcy1uZXV0cmFs # LmRpZ2l0cy5sZW5ndGgpfSIpDQogICAgICAgICN4ID0gLXggaWYgbmV1dHJh # bC5zaWduPT0nLScNCiAgICAgICAgc3RyID0gbmV1dHJhbC5zaWduDQogICAg # ICAgIHN0ciArPSBuZXV0cmFsLmRpZ2l0cw0KICAgICAgICBzdHIgKz0gIkUj # eyhuZXV0cmFsLmRlY19wb3MtbmV1dHJhbC5kaWdpdHMubGVuZ3RoKX0iDQog # ICAgICAgIHggPSBCaWdEZWNpbWFsKHN0cikNCiAgICAgIGVsc2UNCiAgICAg # ICAgeCA9IEJpZ0RlY2ltYWwobmV1dHJhbC5kaWdpdHMudG9faShuZXV0cmFs # LmJhc2UpLnRvX3MpICAgIA0KICAgICAgICB4ICo9IEJpZ0RlY2ltYWwobmV1 # dHJhbC5iYXNlLnRvX3MpKioobmV1dHJhbC5kZWNfcG9zLW5ldXRyYWwuZGln # aXRzLmxlbmd0aCkNCiAgICAgICAgeCA9IC14IGlmIG5ldXRyYWwuc2lnbj09 # Jy0nDQogICAgICBlbmQNCiAgICBlbmQNCiAgICAgDQogICAgcmV0dXJuIHgN # CiAgZW5kDQogIGRlZiB3cml0ZV9uZXV0cmFsKGZtdCkNCiAgICBuZXV0cmFs # ID0gR29pOjpOZXV0cmFsTnVtLm5ldw0KICAgIHggPSBzZWxmDQogICAgDQog # ICAgaWYgeC5uYW4/DQogICAgICBuZXV0cmFsLnNldF9zcGVjaWFsKDpuYW4p # DQogICAgZWxzaWYgeC5pbmZpbml0ZT8NCiAgICAgIG5ldXRyYWwuc2V0X3Nw # ZWNpYWwoOmluZiwgeDwwID8gJy0nIDogJysnKQ0KICAgIGVsc2UgIA0KICAg # ICAgY29udmVydGVkID0gZmFsc2UNCiAgICAgIGlmIGZtdC5nZXRfbmRpZz09 # OmV4YWN0ICYmIGZtdC5nZXRfYXBwcm94PT06c2ltcGxpZnkNCiAgICAgICAg # DQogICAgICAgIHByYyA9IFt4LnByZWNzWzBdLDIwXS5tYXgNCiAgICAgICAg # bmV1dHJhbCA9IHgudG9fcihHb2k6OkJpZ1RvbGVyYW5jZS5kZWNpbWFscyhw # cmMsOnNpZykpLndyaXRlX25ldXRyYWwoZm10KQ0KICAgICAgICBjb252ZXJ0 # ZWQgPSB0cnVlIGlmIG5ldXRyYWwuZGlnaXRzLmxlbmd0aDxwcmMNCiAgICAg # ICAgDQogICAgICBlbHNpZiBmbXQuZ2V0X2FwcHJveD09OmV4YWN0ICYmIGZt # dC5nZXRfYmFzZSE9MTANCiAgICAgICAgbmV1dHJhbCA9IHgudG9feHIud3Jp # dGVfbmV1dHJhbChmbXQpDQogICAgICAgIGNvbnZlcnRlZCA9IHRydWUNCiAg # ICAgIGVuZA0KICAgICAgaWYgIWNvbnZlcnRlZCANCiAgICAgICAgaWYgZm10 # LmdldF9iYXNlPT0xMCANCiAgICAgICAgICB0eHQgPSB4LnRvX3MNCiAgICAg # ICAgICANCiAgICAgICAgICBzaWduID0gJysnICAgIA0KICAgICAgICAgIGlm # IHR4dFswLDFdPT0nLScNCiAgICAgICAgICAgIHNpZ24gPSAnLScNCiAgICAg # ICAgICAgIHR4dCA9IHR4dFsxLi4udHh0Lmxlbmd0aF0NCiAgICAgICAgICBl # bmQNCiAgICAgICAgICBleHAgPSAwDQogICAgICAgICAgeF9jaGFyID0gZm10 # LmdldF9leHBfY2hhcihmbXQuZ2V0X2Jhc2UpDQoNCiAgICAgICAgICBleHBf # aSA9IHR4dC5pbmRleCh4X2NoYXIpDQogICAgICAgICAgZXhwX2kgPSB0eHQu # aW5kZXgoeF9jaGFyLmRvd25jYXNlKSBpZiBleHBfaT09PW5pbA0KICAgICAg # ICAgIGlmIGV4cF9pIT1uaWwNCiAgICAgICAgICAgIGV4cCA9IHR4dFtleHBf # aSsxLi4udHh0Lmxlbmd0aF0udG9faQ0KICAgICAgICAgICAgdHh0ID0gdHh0 # WzAuLi5leHBfaV0gDQogICAgICAgICAgZW5kICAgIA0KICAgICAgICAgIA0K # ICAgICAgICAgIGRlY19wb3MgPSB0eHQuaW5kZXggJy4nDQogICAgICAgICAg # aWYgZGVjX3Bvcz09bmlsDQogICAgICAgICAgICBkZWNfcG9zID0gdHh0Lmxl # bmd0aCANCiAgICAgICAgICBlbHNlDQogICAgICAgICAgICB0eHRbZGVjX3Bv # c109JycNCiAgICAgICAgICBlbmQNCiAgICAgICAgICBkZWNfcG9zICs9IGV4 # cA0KICAgICAgICAgIG5ldXRyYWwuc2V0IHNpZ24sIHR4dCwgZGVjX3Bvcywg # bmlsLCBmbXQuZ2V0X2Jhc2VfZGlnaXRzKDEwKSwgdHJ1ZSwgZm10LmdldF9y # b3VuZA0KICAgICAgICAgIA0KICAgICAgICBlbmQNCiAgICAgIGVuZCAgDQog # ICAgICBpZiAhY29udmVydGVkDQogICAgICAgIA0KICAgICAgICBtaW5fcHJl # YyA9IDI0DQogICAgICAgIG1pbl9leHAgID0gLTEwMDANCiAgICAgICAgcyxm # LGIsZSA9IHguc3BsaXQNCiAgICAgICAgZSAtPSBmLnNpemUNCiAgICAgICAg # c2lnbiA9IHM8MCA/ICctJyA6ICcrJw0KICAgICAgICB4ID0gLXggaWYgc2ln # bj09Jy0nDQogICAgICAgIGZfaSA9IGYudG9faQ0KICAgICAgICBwcmMgPSBb # eC5wcmVjc1swXSxtaW5fcHJlY10ubWF4DQogICAgICAgIGZfaSAqPSAxMCoq # KHByYy1mLnNpemUpDQogICAgICAgIGUgLT0gKHByYy1mLnNpemUpDQoNCiAg # ICAgICAgaW5leGFjdCA9IHRydWUNCg0KICAgICAgICByb3VuZGluZyA9IGZt # dC5nZXRfcm91bmQNCiAgICAgICAgaWYgc2lnbj09Jy0nDQogICAgICAgICAg # aWYgcm91bmRpbmcgPT0gOmluZl9wb3MNCiAgICAgICAgICAgIHJvdW5kaW5n # ID0gOmluZl9uZWcNCiAgICAgICAgICBlbHNpZiByb3VuZGluZz09IDppbmZf # bmVnDQogICAgICAgICAgICByb3VuZGluZyA9IDppbmZfcG9zDQogICAgICAg # ICAgZW5kICAgDQogICAgICAgIGVuZA0KICAgICAgICANCiAgICAgICAgaWYg # Zm10LmdldF9hbGxfZGlnaXRzPw0KICAgICAgICAgICMgdXNlIGFzIG1hbnkg # ZGlnaXRzIGFzIHBvc3NpYmxlDQogICAgICAgICAgZGVjX3BvcyxyLCpkaWdp # dHMgPSBCdXJnZXJEeWJ2aWc6OmZsb2F0X3RvX2RpZ2l0c19tYXgoeCxmX2ks # ZSxyb3VuZGluZyxbZSxtaW5fZXhwXS5taW4scHJjLGIsZm10LmdldF9iYXNl # KQ0KICAgICAgICAgIGluZXhhY3QgPSA6cm91bmR1cCBpZiByDQogICAgICAg # IGVsc2UNCiAgICAgICAgICAjIHVzZSBhcyBmZXcgZGlnaXRzIGFzIHBvc3Np # YmxlDQogICAgICAgICAgZGVjX3BvcywqZGlnaXRzID0gQnVyZ2VyRHlidmln # OjpmbG9hdF90b19kaWdpdHMoeCxmX2ksZSxyb3VuZGluZyxbZSxtaW5fZXhw # XS5taW4scHJjLGIsZm10LmdldF9iYXNlKQ0KICAgICAgICBlbmQNCiAgICAg # ICAgdHh0ID0gJycNCiAgICAgICAgZGlnaXRzLmVhY2h7fGR8IHR4dCA8PCBm # bXQuZ2V0X2Jhc2VfZGlnaXRzLmRpZ2l0X2NoYXIoZCl9DQogICAgICAgIG5l # dXRyYWwuc2V0IHNpZ24sIHR4dCwgZGVjX3BvcywgbmlsLCBmbXQuZ2V0X2Jh # c2VfZGlnaXRzLCBpbmV4YWN0LCBmbXQuZ2V0X3JvdW5kDQogICAgICAgIA0K # ICAgICAgZW5kDQogICAgZW5kDQogICAgICAgICANCiAgICByZXR1cm4gbmV1 # dHJhbA0KICBlbmQNCmVuZA0KZW5kDQoNCmRlZiBCaWdEZWMoeCxwcmVjPW5p # bCkNCiAgaWYgeC5yZXNwb25kX3RvPyg6dG9fc3RyKQ0KICAgIHggPSBCaWdE # ZWNpbWFsKHgudG9fc3RyLCBwcmVjfHwwKQ0KICBlbHNlDQogICAgY2FzZSB4 # DQogICAgICB3aGVuIEludGVnZXINCiAgICAgIHggPSBCaWdEZWNpbWFsKHgu # dG9fcykNCiAgICB3aGVuIFJhdGlvbmFsDQogICAgICBpZiBwcmVjDQogICAg # ICAgIHggPSBCaWdEZWNpbWFsLm5ldyh4Lm51bWVyYXRvci50b19zKS5kaXYo # eC5kZW5vbWluYXRvcixwcmVjKQ0KICAgICAgZWxzZQ0KICAgICAgICAjIHRv # IGRvOiBzb21ldGhpbmcgYmV0dGVyLiAoPykNCiAgICAgICAgcHJlYyA9IEJp # Z0RlY2ltYWwuZG91YmxlX2ZpZyoyKzENCiAgICAgICAgeCA9IEJpZ0RlY2lt # YWwubmV3KHgubnVtZXJhdG9yLnRvX3MpLmRpdih4LmRlbm9taW5hdG9yLHBy # ZWMpDQogICAgICBlbmQNCiAgICB3aGVuIEJpZ0RlY2ltYWwNCiAgICB3aGVu # IEZsb2F0DQogICAgICBpZiBwcmVjLm5pbD8NCiAgICAgICAgeCA9IEdvaTo6 # TkZtdC5jb252ZXJ0KHgsQmlnRGVjaW1hbCx0cnVlKSAgICAgICAgICANCiAg # ICAgIGVsc2lmIHByZWM9PTpleGFjdA0KICAgICAgICB4ID0gR29pOjpORm10 # LmNvbnZlcnQoeCxCaWdEZWNpbWFsLGZhbHNlKSANCiAgICAgIGVsc2UNCiAg # ICAgICAgeCA9IEJpZ0RlY2ltYWwoeC53cml0ZUZtdChHb2k6Ok5GbXQucHJl # YyhwcmVjLDpzaWcpKSkNCiAgICAgIGVuZA0KICAgIGVuZA0KICBlbmQNCiAg # eA0KZW5kDQoNCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AHRtcC9nb2kvbnVtLnJiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAxMDA2NjYgACAgICAgMCAAICAgICAwIAAgICAgICAgIDI2 # MiAxMDY3MjU2NjM3MyAgMTIwMjYAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAB1c2Vy # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdyb3VwAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAADQpyZXF1aXJlICdyYXRpb25hbCcNCnJlcXVp # cmUgJ2JpZ2RlY2ltYWwnDQpyZXF1aXJlICdiaWdkZWNpbWFsL21hdGgnDQpy # ZXF1aXJlICdnb2kvZmx0dG9sJw0KcmVxdWlyZSAnZ29pL3J0bmx6cicNCnJl # cXVpcmUgJ2dvaS9yZXBkZWMnDQpyZXF1aXJlICdnb2kvbmZtdCcNCnJlcXVp # cmUgJ2dvaS9tb25leScNCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXAvZ29pL29i # ZnMucmIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # MTAwNjY2IAAgICAgIDAgACAgICAgMCAAICAgICAgIDQ3MTYgMTA2NzI1NjYz # NzMgIDEyMjEwACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdXNlcgAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAABncm91cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAACMgQ29tbW9uIFV0aWxpdGllcw0KDQojIENvcHlyaWdodCAoQykg # MjAwNCwgSmF2aWVyIEdvaXp1ZXRhIDxqYXZpZXJAZ29penVldGEuaW5mbz4N # CiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g # cmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KIyBtb2RpZnkgaXQgdW5kZXIgdGhl # IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBh # cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg # ZWl0aGVyIHZlcnNpb24gMg0KIyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv # dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCg0KDQpyZXF1aXJlICdy # YW5kb20xODInIGlmIFZFUlNJT04+JzEuOC4yJw0KDQptb2R1bGUgR29pDQoN # Cm1vZHVsZSBSTkcNCiAgbW9kdWxlX2Z1bmN0aW9uDQogIGRlZiBzcmFuZChz # PTApDQogICAgVkVSU0lPTj09JzEuOC4yJyA/IHNyYW5kKHMpIDogc3JhbmQx # ODIocykNCiAgZW5kDQogIGRlZiByYW5kKG14PTApDQogICAgVkVSU0lPTj09 # JzEuOC4yJyA/IHJhbmQobXgpIDogcmFuZDE4MihteCkNCiAgZW5kDQplbmQN # Cg0KDQptb2R1bGUgT2Jmcw0KICBPQkZTID0gIj1BQkNERUZHSElKS0xNTk9Q # UVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4 # OSsvPyINCiAgTl9PQkZTID0gT0JGUy5zaXplDQogIG1vZHVsZV9mdW5jdGlv # bg0KICBkZWYgY3lwaGVyKGNsZWFydGV4dCwga2V5PTM4NDMpDQogICAgaWYg # Y2xlYXJ0ZXh0LnJlc3BvbmRfdG8/KDp0b19zdHIpDQogICAgICBjbGVhcnRl # eHQgPSBjbGVhcnRleHQudG9fc3RyICAgICAgDQogICAgICBSTkcuc3JhbmQo # a2V5KSAgDQogICAgICBzID0gW2NsZWFydGV4dF0ucGFjaygibSIpLnVucGFj # aygiYyoiKS5tYXAgZG8gfGN8DQogICAgICAgYyA9ID8/IGlmIGMgPT0gP1xu # DQogICAgICAgaSA9IE9CRlMuaW5kZXgoYyk7DQogICAgICAgYyA9IE9CRlNb # KGkgKyBSTkcucmFuZChOX09CRlMpKSAlIE5fT0JGU10gaWYgaQ0KICAgICAg # IGMNCiAgICAgIGVuZA0KICAgICAgcy5wYWNrKCJDKiIpLmNob21wDQogICAg # ZWxzZQ0KICAgICAgY2xlYXJ0ZXh0DQogICAgZW5kDQogIGVuZA0KICBkZWYg # Y2xlYXIoY3lwaGVydGV4dCwga2V5PTM4NDMpDQogICAgaWYgY3lwaGVydGV4 # dC5yZXNwb25kX3RvPyg6dG9fc3RyKQ0KICAgICAgY3lwaGVydGV4dCA9IGN5 # cGhlcnRleHQudG9fc3RyICAgICAgICAgICAgDQogICAgICBSTkcuc3JhbmQo # a2V5KSAgICAgIA0KICAgICAgcyA9IGN5cGhlcnRleHQudW5wYWNrKCJjKiIp # Lm1hcCBkbyB8Y3wNCiAgICAgICBpID0gT0JGUy5pbmRleChjKTsNCiAgICAg # ICBjID0gT0JGU1soaSAtIFJORy5yYW5kKE5fT0JGUykpICUgTl9PQkZTXSBp # ZiBpDQogICAgICAgYyA9ID9cbiBpZiBjID09ID8/DQogICAgICAgYw0KICAg # ICAgZW5kDQogICAgICBzLnBhY2soIkMqIikudW5wYWNrKCJtIilbMF0NCiAg # ICBlbHNlDQogICAgICBjeXBoZXJ0ZXh0DQogICAgZW5kDQogIGVuZA0KZW5k # DQoNCm1vZHVsZSBPYmZzMg0KICBPQkZTID0gIj1BQkNERUZHSElKS0xNTk9Q # UVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4 # OSsvPyINCiAgTl9PQkZTID0gT0JGUy5zaXplDQogIG1vZHVsZV9mdW5jdGlv # bg0KICBkZWYgY3lwaGVyKGNsZWFydGV4dCwga2V5PTM4NDMpDQogICAgaWYg # Y2xlYXJ0ZXh0LnJlc3BvbmRfdG8/KDp0b19zdHIpDQogICAgICBjbGVhcnRl # eHQgPSBjbGVhcnRleHQudG9fc3RyICAgICAgDQogICAgICBSTkcuc3JhbmQo # a2V5KSAgDQogICAgICBzID0gW1tjbGVhcnRleHRdLnBhY2soInUiKV0ucGFj # aygibSIpLnVucGFjaygiYyoiKS5tYXAgZG8gfGN8DQogICAgICAgYyA9ID8/ # IGlmIGMgPT0gP1xuDQogICAgICAgaSA9IE9CRlMuaW5kZXgoYyk7DQogICAg # ICAgYyA9IE9CRlNbKGkgKyBSTkcucmFuZChOX09CRlMpKSAlIE5fT0JGU10g # aWYgaQ0KICAgICAgIGMNCiAgICAgIGVuZA0KICAgICAgcy5wYWNrKCJDKiIp # LmNob21wDQogICAgZWxzZQ0KICAgICAgY2xlYXJ0ZXh0DQogICAgZW5kDQog # IGVuZA0KICBkZWYgY2xlYXIoY3lwaGVydGV4dCwga2V5PTM4NDMpDQogICAg # aWYgY3lwaGVydGV4dC5yZXNwb25kX3RvPyg6dG9fc3RyKQ0KICAgICAgY3lw # aGVydGV4dCA9IGN5cGhlcnRleHQudG9fc3RyICAgICAgICAgICAgDQogICAg # ICBSTkcuc3JhbmQoa2V5KSAgICAgIA0KICAgICAgcyA9IGN5cGhlcnRleHQu # dW5wYWNrKCJjKiIpLm1hcCBkbyB8Y3wNCiAgICAgICBpID0gT0JGUy5pbmRl # eChjKTsNCiAgICAgICBjID0gT0JGU1soaSAtIFJORy5yYW5kKE5fT0JGUykp # ICUgTl9PQkZTXSBpZiBpDQogICAgICAgYyA9ID9cbiBpZiBjID09ID8/DQog # ICAgICAgYw0KICAgICAgZW5kDQogICAgICBzLnBhY2soIkMqIikudW5wYWNr # KCJtIilbMF0udW5wYWNrKCJ1IilbMF0NCiAgICBlbHNlDQogICAgICBjeXBo # ZXJ0ZXh0DQogICAgZW5kDQogIGVuZA0KZW5kDQoNCmVuZCAjIEdvaQ0KAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAB0bXAvZ29pL3JlcGRlYy5yYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAMTAwNjY2IAAgICAgIDAgACAgICAgMCAAICAgICAgMjc1 # MzMgMTA2NzI1NjYzNzMgIDEyNTQzACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdXNl # cgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABncm91cAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAACMgcmVwZGVjLnJiIC0tIFJlcGVhdGluZyBE # ZWNpbWFscw0KDQojIENvcHlyaWdodCAoQykgMjAwMy0yMDA1LCBKYXZpZXIg # R29penVldGEgPGphdmllckBnb2l6dWV0YS5pbmZvPg0KIw0KIyBUaGlzIHBy # b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg # aXQgYW5kL29yDQojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl # IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFzIHB1Ymxpc2hlZCBi # eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv # biAyDQojIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu # eSBsYXRlciB2ZXJzaW9uLg0KDQpyZXF1aXJlICdnb2kvdG9vbHMnDQptb2R1 # bGUgR29pDQogIA0KICBjbGFzcyBSZXBEZWNFcnJvciA8U3RhbmRhcmRFcnJv # cg0KICBlbmQNCiAgDQogIGNsYXNzIERpZ2l0c0RlZg0KICAgIGluY2x1ZGUg # U3RhdGVFcXVpdmFsZW50DQogICAgZGVmIGluaXRpYWxpemUoZHM9JzAxMjM0 # NTY3ODknLCBjcz10cnVlKQ0KICAgICAgQGRpZ2l0cyA9IGRzDQogICAgICBA # Y2FzZXNlbnMgPSBjcw0KICAgICAgQGRuY2FzZSA9IChkcy5kb3duY2FzZT09 # ZHMpDQogICAgICBAcmFkaXggPSBAZGlnaXRzLnNpemUNCiAgICBlbmQNCiAg # ICBkZWYgaXNfZGlnaXQ/KGNoX2NvZGUpDQogICAgICBjaF9jb2RlID0gc2V0 # X2Nhc2UoY2hfY29kZSkgdW5sZXNzIEBjYXNlc2Vucw0KICAgICAgQGRpZ2l0 # cy5pbmNsdWRlPyhjaF9jb2RlKQ0KICAgIGVuZA0KICAgIGRlZiBkaWdpdF92 # YWx1ZShjaF9jb2RlKQ0KICAgICAgY2hfY29kZSA9IHNldF9jYXNlKGNoX2Nv # ZGUpIHVubGVzcyBAY2FzZXNlbnMNCiAgICAgIEBkaWdpdHMuaW5kZXgoY2hf # Y29kZSkNCiAgICBlbmQNCiAgICBkZWYgZGlnaXRfY2hhcih2KQ0KICAgICAg # QGRpZ2l0c1t2XQ0KICAgIGVuZA0KICAgIGRlZiBkaWdpdF9jaGFyX3NhZmUo # dikNCiAgICAgIHY+PTAgJiYgdjxAcmFkaXggPyBAZGlnaXRzW3ZdIDogbmls # DQogICAgZW5kDQogICAgZGVmIHJhZGl4DQogICAgICBAcmFkaXgNCiAgICBl # bmQNCiAgICBkZWYgRGlnaXRzRGVmLmJhc2UoYixkbmNhc2U9ZmFsc2UsY2Fz # ZXNlbnM9ZmFsc2UpDQogICAgICBkZ3MgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdI # SUpLTE1OT1BRUlNUVVZXWFlaIlswLGJdDQogICAgICBkZ3MuZG93bmNhc2Uh # IGlmIGRuY2FzZQ0KICAgICAgRGlnaXRzRGVmLm5ldyhkZ3MsY2FzZXNlbnMp # DQogICAgZW5kDQogICAgcHJpdmF0ZQ0KICAgIGRlZiBzZXRfY2FzZShjaF9j # b2RlKQ0KICAgICAgY2hfY29kZSA9IGNoX2NvZGUuY2hyIGlmIGNoX2NvZGUu # a2luZF9vZj8oTnVtZXJpYykNCiAgICAgIEBkbmNhc2UgPyBjaF9jb2RlLmRv # d25jYXNlWzBdIDogY2hfY29kZS51cGNhc2VbMF0NCiAgICBlbmQNCiAgZW5k # ICANCiAgICANCiAgDQogIGNsYXNzIFJlcERlYw0KICAgIGluY2x1ZGUgU3Rh # dGVFcXVpdmFsZW50DQogICAgDQogICAgY2xhc3MgT3B0DQogICAgICBpbmNs # dWRlIFN0YXRlRXF1aXZhbGVudA0KICAgICAgZGVmIGluaXRpYWxpemUoKSAj # ZGVmYXVsdCBvcHRpb25zDQogICAgICAgIA0KICAgICAgICBAYmVnaW5fcmVw # ID0gJzwnDQogICAgICAgIEBlbmRfcmVwID0gJz4nDQogICAgICAgIA0KICAg # ICAgICBAYXV0b19yZXAgPSAnLi4uJw0KICAgICAgICANCiAgICAgICAgQGRl # Y19zZXAgPSAnLicNCiAgICAgICAgQGdycF9zZXAgPSAnLCcNCiAgICAgICAg # QGdycCA9IFtdICMgWzNdIGZvciB0aG91c2FuZHMgc2VwYXJhdG9ycw0KICAg # ICAgICANCiAgICAgICAgQGluZl90eHQgPSAnSW5maW5pdHknDQogICAgICAg # IEBuYW5fdHh0ID0gJ05hTicNCiAgICAgICAgDQogICAgICAgIEBkaWdpdHMg # PSBEaWdpdHNEZWYubmV3DQogICAgICAgIEBkaWdpdHNfZGVmaW5lZCA9IGZh # bHNlDQogICAgICAgIA0KICAgICAgICBAbWF4X2QgPSAyMDQ4DQogICAgICAg # IA0KICAgICAgZW5kICANCiAgICAgIGF0dHJfYWNjZXNzb3IgOmJlZ2luX3Jl # cCwgOmVuZF9yZXAsIDphdXRvX3JlcCwgOmRlY19zZXAsIDpncnBfc2VwLCA6 # Z3JwLCA6bWF4X2QNCiAgICAgIGF0dHJfYWNjZXNzb3IgOm5hbl90eHQsIDpp # bmZfdHh0DQogICAgICANCiAgICAgIGRlZiBzZXRfZGVsaW0oYmVnaW5fZCxl # bmRfZD0nJykNCiAgICAgICAgQGJlZ2luX3JlcCA9IGJlZ2luX2QNCiAgICAg # ICAgQGVuZF9yZXAgPSBlbmRfZA0KICAgICAgICByZXR1cm4gc2VsZg0KICAg # ICAgZW5kDQogICAgICBkZWYgc2V0X3N1ZmZpeChhKQ0KICAgICAgICBAYXV0 # b19yZXAgPSBhDQogICAgICAgIHJldHVybiBzZWxmDQogICAgICBlbmQNCiAg # ICAgIGRlZiBzZXRfc2VwKGQpDQogICAgICAgIEBkZWNfc2VwID0gYQ0KICAg # ICAgICByZXR1cm4gc2VsZg0KICAgICAgZW5kDQogICAgICBkZWYgc2V0X2dy # b3VwaW5nKHNlcCxnPVtdKQ0KICAgICAgICBAZ3JwX3NlcCA9IGENCiAgICAg # ICAgQGdycCA9IGcNCiAgICAgICAgcmV0dXJuIHNlbGYNCiAgICAgIGVuZA0K # ICAgICAgZGVmIHNldF9zcGVjaWFsKG5hbl90eHQsIGluZl90eHQpDQogICAg # ICAgIEBuYW5fdHh0ID0gbmFuX3R4dA0KICAgICAgICBAaW5mX3R4dCA9IGlu # Zl90eHQNCiAgICAgICAgcmV0dXJuIHNlbGYNCiAgICAgIGVuZA0KICAgICAg # DQogICAgICBkZWYgc2V0X2RpZ2l0cyhkcywgZG5jYXNlPWZhbHNlLCBjYXNl # c2Vucz1mYWxzZSkNCiAgICAgICAgaWYgZHMgIA0KICAgICAgICAgIEBkaWdp # dHNfZGVmaW5lZCA9IHRydWUNCiAgICAgICAgICBpZiBkcy5raW5kX29mPyhE # aWdpdHNEZWYpDQogICAgICAgICAgICBAZGlnaXRzID0gZHMNCiAgICAgICAg # ICBlbHNpZiBkcy5raW5kX29mPyhOdW1lcmljKQ0KICAgICAgICAgICAgQGRp # Z2l0cyA9IERpZ2l0c0RlZi5iYXNlKGRzLCBkbmNhc2UsIGNhc2VzZW5zKQ0K # ICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgIEBkaWdpdHMgPSBEaWdpdHNE # ZWYubmV3KGRzLGNhc2VzZW5zKQ0KICAgICAgICAgIGVuZA0KICAgICAgICBl # bHNlDQogICAgICAgICAgQGRpZ2l0cyA9IERpZ2l0c0RlZi5uZXcNCiAgICAg # ICAgICBAZGlnaXRzX2RlZmluZWQgPSBmYWxzZQ0KICAgICAgICBlbmQNCiAg # ICAgICAgc2VsZg0KICAgICAgZW5kDQogICAgICANCiAgICAgIGF0dHJfYWNj # ZXNzb3IgOmRpZ2l0cw0KICAgICAgZGVmIGRpZ2l0c19kZWZpbmVkPw0KICAg # ICAgICBAZGlnaXRzX2RlZmluZWQNCiAgICAgIGVuZA0KICAgICAgDQogICAg # ZW5kDQogICAgDQogICAgREVGX09QVD1PcHQubmV3DQogICAgDQogICAgDQog # ICAgZGVmIGluaXRpYWxpemUoYj0xMCkNCiAgICAgIHNldFooYikNCiAgICBl # bmQNCiAgICANCiAgICBkZWYgc2V0WihiPTEwKQ0KICAgICAgIEBpcCAgICA9 # IDA7DQogICAgICAgQGQgICAgID0gW107DQogICAgICAgQHJlcF9pID0gbmls # Ow0KICAgICAgIEBzaWduICA9IDA7DQogICAgICAgQHJhZGl4ID0gYjsNCiAg # ICAgICBzZWxmDQogICAgZW5kDQogICAgDQogICAgZGVmIHNldFMoc3RyLCBv # cHQ9REVGX09QVCkgDQogICAgICBzZXRaKG9wdC5kaWdpdHNfZGVmaW5lZD8g # PyBvcHQuZGlnaXRzLnJhZGl4IDogQHJhZGl4KTsNCiAgICAgIHNnbixpX3N0 # cixmX3N0cixyaSxkZXRlY3RfcmVwID0gUmVwRGVjLnBhcnNlKHN0cixvcHQp # DQogICAgICBpZiBpX3N0ci5raW5kX29mPyhTeW1ib2wpDQogICAgICAgIEBp # cCA9IGlfc3RyDQogICAgICBlbHNlDQogICAgICAgIEBpcCA9IGlfc3RyLnRv # X2koQHJhZGl4KTsgIyB0aGlzIGFzc3VtZXMgY29udmVudGlvbmFsIGRpZ2l0 # cw0KICAgICAgZW5kDQogICAgICBAc2lnbiA9IHNnbg0KICAgICAgQHJlcF9p # ID0gcmkgaWYgcmkNCiAgICAgIGZfc3RyLmVhY2hfYnl0ZXt8YnwgQGQucHVz # aCBvcHQuZGlnaXRzLmRpZ2l0X3ZhbHVlKGIpfSB1bmxlc3MgZl9zdHIubmls # Pw0KICAgICAgDQogICAgICBpZiBkZXRlY3RfcmVwIHRoZW4NCiAgICAgICAg # DQogICAgICAgIGZvciBsIGluIDEuLihAZC5sZW5ndGgvMikNCiAgICAgICAg # ICBsID0gQGQubGVuZ3RoLzIgKyAxIC0gbDsNCiAgICAgICAgICBpZiBAZFst # bC4uLTFdPT1AZFstMipsLi4uLWxdDQogICAgICAgICAgICANCiAgICAgICAg # ICAgIGZvciBtIGluIDEuLmwNCiAgICAgICAgICAgICAgaWYgbC5tb2R1bG8o # bSk9PTAgdGhlbg0KICAgICAgICAgICAgICAgIHJlZHVjZV9sID0gdHJ1ZTsN # CiAgICAgICAgICAgICAgICBmb3IgaSBpbiAyLi5sL20NCiAgICAgICAgICAg # ICAgICAgIGlmIEBkWy1tLi4tMV0hPUBkWy1pKm0uLi4taSptK21dIHRoZW4N # CiAgICAgICAgICAgICAgICAgICAgIHJlZHVjZV9sID0gZmFsc2U7DQogICAg # ICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICBl # bmQNCiAgICAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAgICAgICBpZiBy # ZWR1Y2VfbCB0aGVuDQogICAgICAgICAgICAgICAgICAgbCA9IG0NCiAgICAg # ICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIGVuZCANCiAg # ICAgICAgICAgICAgZW5kDQogICAgICAgICAgICBlbmQNCiAgICAgICAgICAg # ICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAgICBAcmVwX2kg # PSBAZC5sZW5ndGggLSAyKmw7DQogICAgICAgICAgICBsLnRpbWVzIHsgQGQu # cG9wIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgICAg # ICB3aGlsZSBAZC5sZW5ndGggPj0gMipsICYmIEBkWy1sLi4tMV09PUBkWy0y # KmwuLi4tbF0gDQogICAgICAgICAgICAgIA0KICAgICAgICAgICAgICBAcmVw # X2kgPSBAZC5sZW5ndGggLSAyKmw7DQogICAgICAgICAgICAgIGwudGltZXMg # eyBAZC5wb3AgfQ0KICAgICAgICAgICAgICANCiAgICAgICAgICAgIGVuZA0K # ICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgYnJlYWsNCiAgICAgICAg # ICBlbmQNCiAgICAgICAgZW5kIA0KICAgICAgICANCiAgICAgIGVuZA0KDQog # ICAgICANCiAgICAgIGlmIEByZXBfaSE9bmlsIHRoZW4NCiAgICAgICAgaWYg # QGQubGVuZ3RoPT1AcmVwX2krMSAmJiBAZFtAcmVwX2ldPT0wIHRoZW4NCiAg # ICAgICAgICBAcmVwX2kgPSBuaWw7DQogICAgICAgICAgQGQucG9wOw0KICAg # ICAgICBlbmQgIA0KICAgICAgZW5kDQogICAgICBAZC5wb3Agd2hpbGUgQGRb # QGQubGVuZ3RoLTFdPT0wDQogICAgICAgIA0KICAgICAgc2VsZg0KICAgIGVu # ZA0KICAgIA0KICAgIGRlZiBSZXBEZWMucGFyc2Uoc3RyLCBvcHQ9REVGX09Q # VCkNCiAgICAgIHNnbixpX3N0cixmX3N0cixyaSxkZXRlY3RfcmVwID0gbmls # LG5pbCxuaWwsbmlsLG5pbA0KDQogICAgICBpID0gMDsNCiAgICAgIGwgPSBz # dHIubGVuZ3RoOw0KDQogICAgICBkZXRlY3RfcmVwID0gZmFsc2U7DQoNCiAg # ICAgIA0KICAgICAgaSArPSAxIHdoaWxlIGk8c3RyLmxlbmd0aCAmJiBzdHJb # aSwxXSA9fi9ccy8NCiAgICAgIA0KICAgICAgDQogICAgICBuZWcgPSBmYWxz # ZTsNCg0KICAgICAgbmVnID0gdHJ1ZSBpZiBzdHJbaSwxXT09Jy0nDQogICAg # ICBpICs9IDEgaWYgc3RyW2ksMV09PSctJyB8fCBzdHJbaSwxXT09JysnDQog # ICAgICANCg0KICAgICAgaSArPSAxIHdoaWxlIGk8c3RyLmxlbmd0aCAmJiBz # dHJbaSwxXSA9fi9ccy8NCiAgICAgIA0KDQogICAgICBzdHIudXBjYXNlIQ0K # ICAgICAgaWYgc3RyW2ksb3B0Lm5hbl90eHQuc2l6ZV09PW9wdC5uYW5fdHh0 # LnVwY2FzZQ0KICAgICAgICBpX3N0ciA9IDppbmRldGVybWluYXRlOw0KICAg # ICAgZWxzaWYgc3RyW2ksb3B0LmluZl90eHQuc2l6ZV09PW9wdC5pbmZfdHh0 # LnVwY2FzZQ0KICAgICAgICBpX3N0ciA9IG5lZyA/IDpuZWdpbmZpbml0eSA6 # IDpwb3NpbmZpbml0eTsNCiAgICAgIGVuZA0KICAgICAgDQogICAgICB1bmxl # c3MgaV9zdHINCiAgICAgICAgaV9zdHIgPSAiMCI7DQogICAgICAgIHdoaWxl # IGk8bCAmJiBzdHJbaSwxXSE9b3B0LmRlY19zZXANCiAgICAgICAgICBicmVh # ayBpZiBzdHJbaSxvcHQuYXV0b19yZXAubGVuZ3RoXT09b3B0LmF1dG9fcmVw # ICYmIG9wdC5hdXRvX3JlcCE9JycNCiAgICAgICAgICBpX3N0ciArPSBzdHJb # aSwxXSBpZiBzdHJbaSwxXSE9b3B0LmdycF9zZXANCiAgICAgICAgICBpICs9 # IDE7DQogICAgICAgIGVuZA0KICAgICAgICBzZ24gPSBuZWcgPyAtMSA6ICsx # DQogICAgICAgIGkgKz0gMTsgIyBza2lwIHRoZSBkZWNpbWFsIHNlcGFyYXRv # cg0KICAgICAgZW5kDQogICAgICANCiAgICAgIHVubGVzcyBpX3N0ci5raW5k # X29mPyhTeW1ib2wpDQogICAgICAgIGogPSAwOyAgDQogICAgICAgIGZfc3Ry # ID0gJycNCiAgICAgICAgd2hpbGUgaTxsDQogICAgICAgICAgY2ggPSBzdHJb # aSwxXTsNCiAgICAgICAgICBpZiBjaD09b3B0LmJlZ2luX3JlcCB0aGVuDQog # ICAgICAgICAgICByaSA9IGo7DQogICAgICAgICAgZWxzaWYgY2g9PW9wdC5l # bmRfcmVwIHRoZW4NCiAgICAgICAgICAgIGkgPSBsOw0KICAgICAgICAgIGVs # c2lmIGNoPT1vcHQuYXV0b19yZXBbMCwxXSB0aGVuDQogICAgICAgICAgICBk # ZXRlY3RfcmVwID0gdHJ1ZTsNCiAgICAgICAgICAgIGkgPSBsOw0KICAgICAg # ICAgIGVsc2UNCiAgICAgICAgICAgIGZfc3RyIDw8IGNoDQogICAgICAgICAg # ICBqICs9IDE7DQogICAgICAgICAgZW5kDQogICAgICAgICAgaSArPSAxOw0K # ICAgICAgICBlbmQNCiAgICAgIGVuZA0KICAgICAgcmV0dXJuIFtzZ24saV9z # dHIsZl9zdHIscmksZGV0ZWN0X3JlcF0NCiAgICBlbmQNCiAgICANCiAgICBk # ZWYgZ2V0UyhucmVwPTAsIG9wdD1ERUZfT1BUKQ0KICAgICAgcmFpc2UgUmVw # RGVjRXJyb3IsIkJhc2UgbWlzbWF0Y2g6ICN7b3B0LmRpZ2l0cy5yYWRpeH0g # d2hlbiAje0ByYWRpeH0gd2FzIGV4cGVjdGVkLiIgaWYgb3B0LmRpZ2l0c19k # ZWZpbmVkPyAmJiBAcmFkaXghPW9wdC5kaWdpdHMucmFkaXgNCiAgICAgICAN # CiAgICAgICBpZiAhaXAuaXNfYT8oSW50ZWdlcikgdGhlbg0KICAgICAgICAg # c3RyPW9wdC5uYW5fdHh0IGlmIGlwPT06aW5kZXRlcm1pbmF0ZTsNCiAgICAg # ICAgIHN0cj1vcHQuaW5mX3R4dCBpZiBpcD09OnBvc2luZmluaXR5DQogICAg # ICAgICBzdHI9Jy0nK29wdC5pbmZfdHh0IGlmIGlwPT06bmVnaW5maW5pdHkN # CiAgICAgICAgIHJldHVybiBzdHI7DQogICAgICAgZW5kDQogICAgICAgDQog # ICAgICAgcyA9ICIiOw0KICAgICAgIHMgKz0gJy0nIGlmIEBzaWduPDANCiAg # ICAgICBzICs9IFJlcERlYy5ncm91cF9kaWdpdHMoQGlwLnRvX3MoQHJhZGl4 # KSxvcHQpOw0KICAgICAgIHMgKz0gb3B0LmRlY19zZXAgaWYgQGQubGVuZ3Ro # PjA7DQogICAgICAgZm9yIGkgaW4gMC4uLkBkLmxlbmd0aA0KICAgICAgICAg # YnJlYWsgaWYgbnJlcD4wICYmIEByZXBfaT09aTsNCiAgICAgICAgIHMgKz0g # b3B0LmJlZ2luX3JlcCBpZiBpPT1AcmVwX2k7DQogICAgICAgICBzIDw8IG9w # dC5kaWdpdHMuZGlnaXRfY2hhcihAZFtpXSkNCiAgICAgICBlbmQ7DQogICAg # ICAgaWYgbnJlcD4wIHRoZW4NCiAgICAgICAgIGlmIEByZXBfaSE9bmlsIHRo # ZW4NCiAgICAgICAgICAgIG5yZXAgKz0gMTsNCiAgICAgICAgICAgIG5yZXAu # dGltZXMgZG8NCiAgICAgICAgICAgICAgZm9yIGkgaW4gQHJlcF9pLi4uQGQu # bGVuZ3RoDQogICAgICAgICAgICAgICBzIDw8IG9wdC5kaWdpdHMuZGlnaXRf # Y2hhcihAZFtpXSkNCiAgICAgICAgICAgICAgZW5kDQogICAgICAgICAgICBl # bmQNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgY2hlY2sgPSBSZXBEZWMu # bmV3Ow0KICAgICAgICAgICAgY2hlY2suc2V0UyBzK29wdC5hdXRvX3JlcCwg # b3B0Ow0KICAgICAgICAgICAgI3ByaW50ICIgcz0iLHMsIlxuIg0KICAgICAg # ICAgICAgI3ByaW50ICIgc2VsZj0iLHNlbGYudG9fcywiXG4iDQogICAgICAg # ICAgICAgd2hpbGUgY2hlY2shPXNlbGYNCiAgICAgICAgICAgICAgZm9yIGkg # aW4gQHJlcF9pLi4uQGQubGVuZ3RoDQogICAgICAgICAgICAgICBzIDw8IG9w # dC5kaWdpdHMuZGlnaXRfY2hhcihAZFtpXSkNCiAgICAgICAgICAgICAgZW5k # DQogICAgICAgICAgICAgIGNoZWNrLnNldFMgcytvcHQuYXV0b19yZXAsIG9w # dDsNCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgDQogICAgICAgICAg # ICBzICs9IG9wdC5hdXRvX3JlcDsNCiAgICAgICAgIGVuZA0KICAgICAgIGVs # c2UNCiAgICAgICAgIHMgKz0gb3B0LmVuZF9yZXAgaWYgQHJlcF9pIT1uaWw7 # ICAgICAgICAgDQogICAgICAgZW5kDQogICAgICAgcmV0dXJuIHM7DQogICAg # ZW5kDQogICAgDQogICAgZGVmIHRvX3MoKQ0KICAgICAgZ2V0Uw0KICAgIGVu # ZA0KICAgIA0KICAgIGRlZiBub3JtYWxpemUhKHJlbW92ZV90cmFpbGluZ196 # ZXJvcz10cnVlKQ0KICAgICAgaWYgaXAuaXNfYT8oSW50ZWdlcikNCiAgICAg # ICAgaWYgQHJlcF9pIT1uaWwgJiYgQHJlcF9pPT1AZC5sZW5ndGgtMSAmJiBA # ZFtAcmVwX2ldPT0oQHJhZGl4LTEpIHRoZW4NCiAgICAgICAgICBAZC5wb3A7 # DQogICAgICAgICAgQHJlcF9pID0gbmlsOw0KICAgICAgICAgIA0KICAgICAg # ICAgIGkgPSBAZC5sZW5ndGgtMTsNCiAgICAgICAgICBjYXJyeSA9IDE7DQog # ICAgICAgICAgd2hpbGUgY2Fycnk+MCAmJiBpPj0wDQogICAgICAgICAgICBA # ZFtpXSArPSBjYXJyeTsNCiAgICAgICAgICAgIGNhcnJ5ID0gMDsNCiAgICAg # ICAgICAgIGlmIEBkW2ldPihAcmFkaXgpIHRoZW4NCiAgICAgICAgICAgICAg # Y2FycnkgPSAxOw0KICAgICAgICAgICAgICBAZFtpXT0wOw0KICAgICAgICAg # ICAgICBAZC5wb3AgaWYgaT09QGQubGVuZ3RoOw0KICAgICAgICAgICAgZW5k # DQogICAgICAgICAgICBpIC09IDE7DQogICAgICAgICAgZW5kIA0KICAgICAg # ICAgIEBpcCArPSBjYXJyeTsNCiAgICAgICAgICANCiAgICAgICAgZW5kDQog # ICAgICAgIA0KICAgICAgICBpZiBAcmVwX2khPW5pbCAmJiBAcmVwX2k+PUBk # Lmxlbmd0aA0KICAgICAgICAgIEByZXBfaSA9IG5pbA0KICAgICAgICBlbmQN # CiAgICAgICAgDQogICAgICAgIGlmIEByZXBfaSE9bmlsICYmIEByZXBfaT49 # MA0KICAgICAgICAgIHVubGVzcyBAZFtAcmVwX2kuLi0xXS5maW5kIHt8eHwg # eCE9MH0NCiAgICAgICAgICAgIEBkID0gQGRbMC4uLkByZXBfaV0NCiAgICAg # ICAgICAgIEByZXBfaSA9IG5pbA0KICAgICAgICAgIGVuZA0KICAgICAgICBl # bmQNCiAgICAgICAgaWYgQHJlcF9pPT1uaWwgJiYgcmVtb3ZlX3RyYWlsaW5n # X3plcm9zDQogICAgICAgICAgd2hpbGUgQGRbQGQubGVuZ3RoLTFdPT0wDQog # ICAgICAgICAgICBAZC5wb3ANCiAgICAgICAgICBlbmQNCiAgICAgICAgZW5k # DQogICAgICAgIA0KICAgICAgZW5kDQogICAgZW5kDQogICAgDQogICAgZGVm # IGNvcHkoKQ0KICAgICAgYyA9IGNsb25lDQogICAgICBjLmQgPSBkLmNsb25l # DQogICAgICByZXR1cm4gYzsNCiAgICBlbmQNCiAgICANCiAgICBkZWYgPT0o # YykNCiAgICAgIGEgPSBjb3B5Ow0KICAgICAgYiA9IGMuY29weTsNCiAgICAg # IGEubm9ybWFsaXplIQ0KICAgICAgYi5ub3JtYWxpemUhDQogICAgICByZXR1 # cm4gYS5pcD09Yi5pcCAmJiBhLmQ9PWIuZCAmJiBhLnJlcF9pPT1iLnJlcF9p # DQogICAgZW5kDQogICAgDQogICAgI2RlZiAhPShjKQ0KICAgICMgIHJldHVy # biAhKHNlbGY9PWMpOw0KICAgICNlbmQNCiAgICANCiAgICBkZWYgc2V0USh4 # LHksIG9wdD1ERUZfT1BUKQ0KICAgICAgQHJhZGl4ID0gb3B0LmRpZ2l0cy5y # YWRpeCBpZiBvcHQuZGlnaXRzX2RlZmluZWQ/DQogICAgICB4eV9zaWduID0g # eD09MCA/IDAgOiB4PDAgPyAtMSA6ICsxOw0KICAgICAgeHlfc2lnbiA9IC14 # eV9zaWduIGlmIHk8MDsNCiAgICAgIEBzaWduID0geHlfc2lnbg0KICAgICAg # eCA9IHguYWJzOw0KICAgICAgeSA9IHkuYWJzOw0KDQogICAgICBAZCA9IFtd # Ow0KICAgICAgQHJlcF9pID0gbmlsOw0KICAgICAgDQogICAgICBpZiB5PT0w # IHRoZW4NCiAgICAgICAgaWYgeD09MCB0aGVuDQogICAgICAgICAgQGlwID0g # OmluZGV0ZXJtaW5hdGUNCiAgICAgICAgZWxzZQ0KICAgICAgICAgIEBpcCA9 # IHh5X3NpZ249PS0xID8gOm5lZ2luZmluaXR5IDogOnBvc2luZmluaXR5DQog # ICAgICAgIGVuZA0KICAgICAgICByZXR1cm4gc2VsZg0KICAgICAgZW5kDQog # ICAgICANCiAgICAgIGsgPSBbXTsNCiAgICAgIEBpcCA9IHguZGl2KHkpICN4 # L3k7DQogICAgICB4IC09IEBpcCp5Ow0KICAgICAgaSA9IDA7DQogICAgICBl # bmRlZCA9IGZhbHNlOw0KDQogICAgICB3aGlsZSB4PjAgJiYgQHJlcF9pPT1u # aWwgJiYgKG9wdC5tYXhfZDw9MCB8fCBpPG9wdC5tYXhfZCkNCiAgICAgICAg # Zm9yIGogaW4gMC4uLmsubGVuZ3RoDQogICAgICAgICAgaWYga1tqXT09eCB0 # aGVuDQogICAgICAgICAgICBAcmVwX2kgPSBqOw0KICAgICAgICAgICAgYnJl # YWs7DQogICAgICAgICAgZW5kICAgICAgDQogICAgICAgIGVuZA0KICAgICAg # ICBpZiBAcmVwX2kgPT0gbmlsIHRoZW4NCiAgICAgICAgICBrLnB1c2ggeDsN # CiAgICAgICAgICB4ICo9IEByYWRpeA0KICAgICAgICAgIEBkLnB1c2ggeC5k # aXYoeSkgIyB4L3k7DQogICAgICAgICAgeC09IEBkW2ldKnk7DQogICAgICAg # ICAgaSArPSAxOyAgDQogICAgICAgIGVuZA0KICAgICAgZW5kDQogICAgICBz # ZWxmICANCiAgICBlbmQNCiAgICANCiAgICBkZWYgZ2V0UShvcHQ9REVGX09Q # VCkNCiAgICAgIHJhaXNlIFJlcERlY0Vycm9yLCJCYXNlIG1pc21hdGNoOiAj # e29wdC5kaWdpdHMucmFkaXh9IHdoZW4gI3tAcmFkaXh9IHdhcyBleHBlY3Rl # ZC4iIGlmIG9wdC5kaWdpdHNfZGVmaW5lZD8gJiYgQHJhZGl4IT1vcHQuZGln # aXRzLnJhZGl4DQogICAgICANCiAgICAgIGlmICFpcC5pc19hPyhJbnRlZ2Vy # KSB0aGVuDQogICAgICAgIHkgPSAwOw0KICAgICAgICB4PTAgaWYgaXA9PTpp # bmRldGVybWluYXRlOw0KICAgICAgICB4PTEgaWYgaXA9PTpwb3NpbmZpbml0 # eQ0KICAgICAgICB4PS0xIGlmIGlwPT06bmVnaW5maW5pdHkNCiAgICAgICAg # cmV0dXJuIHgseTsNCiAgICAgIGVuZCBpZg0KDQogICAgICANCiAgICAgIG4g # PSBAZC5sZW5ndGggDQogICAgICBhID0gQGlwDQogICAgICBiID0gYQ0KICAg # ICAgZm9yIGkgaW4gMC4uLm4NCiAgICAgICAgYSo9QHJhZGl4DQogICAgICAg # IGErPUBkW2ldOw0KICAgICAgICBpZiBAcmVwX2khPW5pbCAmJiBpPEByZXBf # aQ0KICAgICAgICAgIGIgKj0gQHJhZGl4DQogICAgICAgICAgYiArPSBAZFtp # XTsNCiAgICAgICAgZW5kDQogICAgICBlbmQNCg0KICAgICAgeCA9IGENCiAg # ICAgIHggLT0gYiBpZiBAcmVwX2khPW5pbA0KDQogICAgICB5ID0gQHJhZGl4 # KipuDQogICAgICB5IC09IEByYWRpeCoqQHJlcF9pIGlmIEByZXBfaSE9bmls # DQoNCiAgICAgIGQgPSBHQ0QoeCx5KQ0KICAgICAgeCAvPSBkDQogICAgICB5 # IC89IGQNCiAgICAgDQogICAgICB4ID0gLXggaWYgQHNpZ248MA0KICAgICAN # CiAgICAgIHJldHVybiB4LHk7ICAgIA0KICAgIGVuZA0KICAgIA0KICAgICNw # cm90ZWN0ZWQNCiAgICANCiAgICBhdHRyX3JlYWRlciA6ZCwgOmlwLCA6cmVw # X2ksIDpzaWduOw0KICAgIGF0dHJfd3JpdGVyIDpkLCA6aXAsIDpyZXBfaSwg # OnNpZ247DQogICAgICANCiAgZW5kDQogICAgDQogIA0KICBkZWYgUmVwRGVj # Lmdyb3VwX2RpZ2l0cyhkaWdpdHMsIG9wdCkNCiAgICBpZiBvcHQuZ3JwX3Nl # cCE9bmlsICYmIG9wdC5ncnBfc2VwIT0nJyAmJiBvcHQuZ3JwLmxlbmd0aD4w # DQogICAgICBncm91cGVkID0gJycgICAgICANCiAgICAgIGkgPSAwDQogICAg # ICB3aGlsZSBkaWdpdHMubGVuZ3RoPjAgIA0KICAgICAgICBsID0gb3B0Lmdy # cFtpXQ0KICAgICAgICBsID0gZGlnaXRzLmxlbmd0aCBpZiBsPmRpZ2l0cy5s # ZW5ndGgNCiAgICAgICAgZ3JvdXBlZCA9IG9wdC5ncnBfc2VwICsgZ3JvdXBl # ZCBpZiBncm91cGVkLmxlbmd0aD4wDQogICAgICAgIGdyb3VwZWQgPSBkaWdp # dHNbLWwsbF0gKyBncm91cGVkDQogICAgICAgIGRpZ2l0cyA9IGRpZ2l0c1sw # LGRpZ2l0cy5sZW5ndGgtbF0NCiAgICAgICAgaSArPSAxIGlmIGk8b3B0Lmdy # cC5sZW5ndGgtMQ0KICAgICAgZW5kDQogICAgICBncm91cGVkDQogICAgZWxz # ZQ0KICAgICBkaWdpdHMNCiAgICBlbmQgICAgDQogIGVuZA0KICANCiAgbW9k # dWxlX2Z1bmN0aW9uDQogIA0KICBkZWYgR0NEKGEsYikNCiAgICB3aGlsZSBi # IT0wIGRvDQogICAgICBhLGIgPSBiLCBhLm1vZHVsbyhiKQ0KICAgIGVuZA0K # ICAgIHJldHVybiBhLmFiczsgIA0KICBlbmQNCiAgDQplbmQNCgAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHRtcC9nb2kvcnRubHpyLnJiAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMDA2NjYgACAgICAg # MCAAICAgICAwIAAgICAgICAyNTEwNiAxMDY3MjU2NjM3MyAgMTI2MjYAIDAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAdXN0YXIgIAB1c2VyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAGdyb3VwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyBSYXRp # b25hbGl6YXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4NCg0KIyBD # b3B5cmlnaHQgKEMpIDIwMDMtMjAwNSwgSmF2aWVyIEdvaXp1ZXRhIDxqYXZp # ZXJAZ29penVldGEuaW5mbz4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUg # c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KIyBt # b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ # dWJsaWMgTGljZW5zZQ0KIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m # dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMg0KIyBvZiB0aGUg # TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv # bi4NCg0KIw0KIyBBdXRob3I6OiAgICBKYXZpZXIgR29penVldGEgKG1haWx0 # bzpqYXZpZXJAZ29penVldGEuaW5mbykNCiMgQ29weXJpZ2h0OjogQ29weXJp # Z2h0IChjKSAyMDAyLTIwMDQgSmF2aWVyIEdvaXp1ZXRhICYgSm9lIEhvcm4N # CiMgTGljZW5zZTo6ICAgRGlzdHJpYnV0ZXMgdW5kZXIgdGhlIEdQTCBsaWNl # bnNlDQojDQojVGhpcyBtb2R1bGUgcHJvdmlkZXMgY29udmVyc2lvbiBmcm9t # IGZsb2F0aW5nIHBvaW50IG51bWJlcnMNCiN0byByYXRpb25hbCBudW1iZXJz # Lg0KI0FsZ29yaXRobXMgYnkgSm9lIEhvcm4gYXJlIHVzZWQuDQoNCg0KcmVx # dWlyZSAnZ29pL3Rvb2xzJw0KDQpyZXF1aXJlICdnb2kvZmx0dG9sJw0KDQpy # ZXF1aXJlICdyYXRpb25hbCcNCg0KcmVxdWlyZSAnYmlnZGVjaW1hbCcNCg0K # DQpjbGFzcyBGbG9hdA0KICBkZWYgdG9feHINCiAgICByZXR1cm4gUmF0aW9u # YWwoc2VsZi50b19pLDEpIGlmIHNlbGYubW9kdWxvKDEpPT0wDQogICAgZixl # ID0gTWF0aC5mcmV4cChzZWxmKQ0KICAgIA0KICAgIGlmIGUgPCBGbG9hdDo6 # TUlOX0VYUA0KICAgICAgIGJpdHMgPSBlK0Zsb2F0OjpNQU5UX0RJRy1GbG9h # dDo6TUlOX0VYUA0KICAgIGVsc2UNCiAgICAgICBiaXRzID0gW0Zsb2F0OjpN # QU5UX0RJRyxlXS5tYXggIA0KICAgICAgICNyZXR1cm4gUmF0aW9uYWwoc2Vs # Zi50b19pLDEpIGlmIGJpdHM8ZQ0KICAgIGVuZCAgICAgIA0KICAgICAgcCA9 # IE1hdGgubGRleHAoZixiaXRzKQ0KICAgICAgZSA9IGJpdHMgLSBlDQogICAg # ICBpZiBlPEZsb2F0OjpNQVhfRVhQDQogICAgICAgIHEgPSBNYXRoLmxkZXhw # KDEsZSkNCiAgICAgIGVsc2UNCiAgICAgICAgcSA9IEZsb2F0OjpSQURJWCoq # ZQ0KICAgICAgZW5kDQogICAgcmV0dXJuIFJhdGlvbmFsKHAudG9faSxxLnRv # X2kpDQogIGVuZA0KZW5kDQoNCmNsYXNzIEJpZ0RlY2ltYWwNCiAgZGVmIHRv # X3hyDQogICAgcyxmLGIsZSA9IHNwbGl0DQogICAgcCA9IGYudG9faQ0KICAg # IHAgPSAtcCBpZiBzPDANCiAgICBlID0gZi5zaXplLWUNCiAgICBpZiBlPDAN # CiAgICAgIHAgKj0gYioqKC1lKQ0KICAgICAgZSA9IDANCiAgICBlbmQNCiAg # ICBxID0gYioqKGUpDQogICAgcmV0dXJuIFJhdGlvbmFsKHAscSkNCiAgZW5k # DQplbmQNCg0KY2xhc3MgSW50ZWdlcg0KICBkZWYgdG9feHINCiAgICByZXR1 # cm4gUmF0aW9uYWwoc2VsZiwxKQ0KICBlbmQNCmVuZA0KDQpjbGFzcyBSYXRp # b25hbA0KICBkZWYgdG9feHINCiAgICByZXR1cm4gc2VsZg0KICBlbmQNCiAg # ZGVmIG51bV9kZW4NCiAgICByZXR1cm4gW251bWVyYXRvcixkZW5vbWluYXRv # cl0NCiAgZW5kDQplbmQNCg0KDQpjbGFzcyBGbG9hdA0KICAjQ29udmVyc2lv # biB0byBSYXRpb25hbC4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50IG11c3QgYmUg # b25lIG9mOg0KICAjIC0gYSBUb2xlcmFuY2UgdGhhdCBlc3RhYmxpc2ggdGhl # IGFkbWlzaWJsZSB0b2xlcmFuY2U7DQogICMgICBpbiB0aGF0IGNhc2UsIHRo # ZSBzbWFsbGVzdCBkZW5vbWluYXRvciByYXRpb25hbCB3aXRoaW4gdGhlDQog # ICMgICB0b2xlcmFuY2Ugd2lsbCBiZSBmb3VuZCAod2hpY2ggbWF5IHRha2Ug # YSBsb25nIHRpbWUgZm9yDQogICMgICBzbWFsbCB0b2xlcmFuY2VzLikNCiAg # IyAtIGFuIGludGVnZXIgdGhhdCBlc3RhYmxpc2ggYSBtYXhpbXVtIHZhbHVl # IGZvciB0aGUgZGVub21pbmF0b3IuDQogICMgICBpbiB3aGljaCBjYXNlLCB0 # aGUgYmVzdCBhcHByb3hpbWF0aW9uIHdpdGggdGhhdCBtYXhpbXVtIA0KICAj # ICAgZGVub21pbmF0b3Igd2lsbCBiZSByZXR1cm5lZC4NCiAgDQogIGRlZiB0 # b19yKHRvbCA9IEdvaTo6VG9sZXJhbmNlLmJpZ19lcHNpbG9uKQ0KICAgIGNh # c2UgdG9sDQogICAgICB3aGVuIEludGVnZXINCiAgICAgICAgUmF0aW9uYWwo # KkdvaTo6UnRubHpyLm1heF9kZW5vbWluYXRvcihzZWxmLHRvbCxGbG9hdCkp # DQogICAgICBlbHNlDQogICAgICAgIFJhdGlvbmFsKCpHb2k6OlJ0bmx6ci5u # ZXcoR29pOjpUb2wodG9sKSkuYmVzdChzZWxmKSkgICAgICANCiAgICBlbmQN # CiAgZW5kDQplbmQNCg0KY2xhc3MgQmlnRGVjaW1hbA0KICAjQ29udmVyc2lv # biB0byBSYXRpb25hbC4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50IG11c3QgYmUg # b25lIG9mOg0KICAjIC0gYSBCaWdUb2xlcmFuY2UgdGhhdCBlc3RhYmxpc2gg # dGhlIGFkbWlzaWJsZSB0b2xlcmFuY2U7DQogICMgICBpbiB0aGF0IGNhc2Us # IHRoZSBzbWFsbGVzdCBkZW5vbWluYXRvciByYXRpb25hbCB3aXRoaW4gdGhl # DQogICMgICB0b2xlcmFuY2Ugd2lsbCBiZSBmb3VuZCAod2hpY2ggbWF5IHRh # a2UgYSBsb25nIHRpbWUgZm9yDQogICMgICBzbWFsbCB0b2xlcmFuY2VzLikN # CiAgIyAtIGFuIGludGVnZXIgdGhhdCBlc3RhYmxpc2ggYSBtYXhpbXVtIHZh # bHVlIGZvciB0aGUgZGVub21pbmF0b3IuDQogICMgICBpbiB3aGljaCBjYXNl # LCB0aGUgYmVzdCBhcHByb3hpbWF0aW9uIHdpdGggdGhhdCBtYXhpbXVtIA0K # ICAjICAgZGVub21pbmF0b3Igd2lsbCBiZSByZXR1cm5lZC4NCiAgDQogIGRl # ZiB0b19yKHRvbCA9IG5pbCkNCiAgICB0b2wgfHw9IEdvaTo6QmlnVG9sZXJh # bmNlLmRlY2ltYWxzKFtwcmVjc1swXSxGbG9hdDo6RElHXS5tYXgsOnNpZykN # CiAgICBjYXNlIHRvbA0KICAgICAgd2hlbiBJbnRlZ2VyDQogICAgICAgIFJh # dGlvbmFsKCpHb2k6OlJ0bmx6ci5tYXhfZGVub21pbmF0b3Ioc2VsZix0b2ws # QmlnRGVjaW1hbCkpDQogICAgICBlbHNlDQogICAgICAgIFJhdGlvbmFsKCpH # b2k6OlJ0bmx6ci5uZXcoR29pOjpCaWdUb2wodG9sKSkuYmVzdChzZWxmKSkN # CiAgICBlbmQNCiAgZW5kDQplbmQNCg0KbW9kdWxlIEdvaQ0KICANCiAgDQoN # CiAgI1RoaXMgY2xhc3MgcHJvdmlkZXMgY29udmVyc2lvbiBvZiBmcmFjdGlv # bnMgKGFzIGZsb2F0aW5nIHBvaW50IG51bWJlcnMpDQogICN0byByYXRpb25h # bCBudW1iZXJzLg0KICANCiAgY2xhc3MgUnRubHpyDQogICAgaW5jbHVkZSBT # dGF0ZUVxdWl2YWxlbnQNCiAgICAjQ3JlYXRlIFJhdGlvbmFsaXphdG9yIHdp # dGggZ2l2ZW4gdG9sZXJhbmNlLg0KICAgIGRlZiBpbml0aWFsaXplKHRvbD1U # b2xlcmFuY2UubmV3KQ0KICAgICAgQHRvbCA9IHRvbA0KICAgIGVuZA0KICAg # ICNTaW1wbGUgcmF0aW9uYWxpemF0aW9uIG1ldGhvZA0KICAgICNVc2VzIGFs # Z29yaXRobSBieSBKb2UgSG9ybiAoUERRMikNCiAgICBkZWYgc2ltcGxlKHgp # DQogICAgICANCg0KICAgICAgbnVtX3RvbCA9IEB0b2wua2luZF9vZj8oTnVt # ZXJpYykNCiAgICAgIGlmICFudW1fdG9sICYmIEB0b2wuemVybz8oeCkNCiAg # ICAgICAgIyBudW0sZGVuID0geC50b194ci5udW1fZGVuDQogICAgICAgIG51 # bSxkZW4gPSAwLDENCiAgICAgIGVsc2UNCiAgICAgICAgbmVnYW5zPWZhbHNl # DQogICAgICAgIGlmIHg8MA0KICAgICAgICAgIG5lZ2FucyA9IHRydWUNCiAg # ICAgICAgICB4ID0gLXgNCiAgICAgICAgZW5kDQogICAgICAgIGR4ID0gbnVt # X3RvbCA/IEB0b2wgOiBAdG9sLmdldFZhbHVlKHgpDQogICAgICAgIA0KICAg # ICAgICANCiAgICAgICAgeix0ID0geCxkeCAjIHJlbmFtaW5nDQoNCiAgICAg # ICAgYSxiID0gdC50b194ci5udW1fZGVuDQogICAgICAgIG4wLGQwID0gKG4s # ZCA9IHoudG9feHIubnVtX2RlbikNCiAgICAgICAgY24seCxwbixjZCx5LHBk # LGxvLGhpLG1pZCxxLHIgPSAxLDEsMCwwLDAsMSwwLDEsMSwwLDANCiAgICAg # ICAgYmVnaW4NCiAgICAgICAgICBxLHIgPSBuLmRpdm1vZChkKQ0KICAgICAg # ICAgIHggPSBxKmNuK3BuDQogICAgICAgICAgeSA9IHEqY2QrcGQNCiAgICAg # ICAgICBwbiA9IGNuDQogICAgICAgICAgY24gPSB4DQogICAgICAgICAgcGQg # PSBjZA0KICAgICAgICAgIGNkID0geQ0KICAgICAgICAgIG4sZCA9IGQscg0K # ICAgICAgICBlbmQgdW50aWwgYioobjAqeS1kMCp4KS5hYnMgPD0gYSpkMCp5 # DQogICAgICAgICANCiAgICAgICAgbnVtLGRlbiA9IHgseSAjIHJlbmFtaW5n # DQogICAgICAgICANCiAgICAgICAgDQogICAgICAgIG51bSA9IC1udW0gaWYg # bmVnYW5zDQogICAgICBlbmQNCiAgICAgIHJldHVybiBudW0sZGVuDQogICAg # ICANCiAgICAgICAgICAgICANCiAgICBlbmQNCiAgICAjQmVzdCByYXRpb25h # bGl6YXRpb24gbWV0aG9kIA0KICAgICMoc21hbGxlc3QgZGVub21pbmF0b3Ig # ZnJhY3Rpb24gd2l0aGluIHRvbGVyYW5jZS4pDQogICAgZGVmIGJlc3QoeCkN # CiAgICAgIA0KDQogICAgICBudW1fdG9sID0gQHRvbC5raW5kX29mPyhOdW1l # cmljKQ0KICAgICAgaWYgIW51bV90b2wgJiYgQHRvbC56ZXJvPyh4KQ0KICAg # ICAgICAjIG51bSxkZW4gPSB4LnRvX3hyLm51bV9kZW4NCiAgICAgICAgbnVt # LGRlbiA9IDAsMQ0KICAgICAgZWxzZQ0KICAgICAgICBuZWdhbnM9ZmFsc2UN # CiAgICAgICAgaWYgeDwwDQogICAgICAgICAgbmVnYW5zID0gdHJ1ZQ0KICAg # ICAgICAgIHggPSAteA0KICAgICAgICBlbmQNCiAgICAgICAgZHggPSBudW1f # dG9sID8gQHRvbCA6IEB0b2wuZ2V0VmFsdWUoeCkNCiAgICAgICAgDQogICAg # ICAgIA0KICAgICAgICAgIHggPSB4LnRvX3hyDQogICAgICAgICAgZHggPSBk # eC50b194cg0KICAgICAgICAgIHhwLHhxID0gKHgtZHgpLm51bV9kZW4NCiAg # ICAgICAgICB5cCx5cSA9ICh4K2R4KS5udW1fZGVuDQogICAgICAgICAgDQog # ICAgICAgICAgICBhID0gW10NCiAgICAgICAgICAgIGZpbixvZGQgPSBmYWxz # ZSxmYWxzZQ0KICAgICAgICAgICAgd2hpbGUgIWZpbiAmJiB4cCE9MCAmJiB5 # cCE9MA0KICAgICAgICAgICAgICBvZGQgPSAhb2RkDQogICAgICAgICAgICAg # IHhwLHhxID0geHEseHANCiAgICAgICAgICAgICAgYXggPSB4cC5kaXYoeHEp # DQogICAgICAgICAgICAgIHhwIC09IGF4KnhxDQoNCiAgICAgICAgICAgICAg # eXAseXEgPSB5cSx5cA0KICAgICAgICAgICAgICBheSA9IHlwLmRpdih5cSkN # CiAgICAgICAgICAgICAgeXAgLT0gYXkqeXENCg0KICAgICAgICAgICAgICBp # ZiBheCE9YXkNCiAgICAgICAgICAgICAgICBmaW4gPSB0cnVlDQogICAgICAg # ICAgICAgICAgYXgseHAseHEgPSBheSx5cCx5cSBpZiBvZGQNCiAgICAgICAg # ICAgICAgZW5kDQogICAgICAgICAgICAgIGEgPDwgYXggIyAudG9faQ0KICAg # ICAgICAgICAgZW5kDQogICAgICAgICAgICBhWy0xXSArPSAxIGlmIHhwIT0w # ICYmIGEuc2l6ZT4wDQogICAgICAgICAgICBwLHEgPSAxLDANCiAgICAgICAg # ICAgICgxLi5hLnNpemUpLmVhY2h7fGl8IHAscT1xK3AqYVstaV0scH0NCiAg # ICAgICAgICAgIG51bSxkZW4gPSBxLHANCiAgICAgICAgIA0KICAgICAgICAN # CiAgICAgICAgbnVtID0gLW51bSBpZiBuZWdhbnMNCiAgICAgIGVuZA0KICAg # ICAgcmV0dXJuIG51bSxkZW4NCiAgICAgIA0KICAgICAgICAgICAgIA0KICAg # IGVuZA0KICAgIGRlZiBiZXN0Mih4KQ0KICAgICAgDQoNCiAgICAgIG51bV90 # b2wgPSBAdG9sLmtpbmRfb2Y/KE51bWVyaWMpDQogICAgICBpZiAhbnVtX3Rv # bCAmJiBAdG9sLnplcm8/KHgpDQogICAgICAgICMgbnVtLGRlbiA9IHgudG9f # eHIubnVtX2Rlbg0KICAgICAgICBudW0sZGVuID0gMCwxDQogICAgICBlbHNl # DQogICAgICAgIG5lZ2Fucz1mYWxzZQ0KICAgICAgICBpZiB4PDANCiAgICAg # ICAgICBuZWdhbnMgPSB0cnVlDQogICAgICAgICAgeCA9IC14DQogICAgICAg # IGVuZA0KICAgICAgICBkeCA9IG51bV90b2wgPyBAdG9sIDogQHRvbC5nZXRW # YWx1ZSh4KQ0KICAgICAgICANCiAgICAgICAgDQogICAgICAgIHosdCA9IHgs # ZHggIyByZW5hbWluZw0KDQogICAgICAgIGEsYiA9IHQudG9feHIubnVtX2Rl # bg0KICAgICAgICBuMCxkMCA9IChuLGQgPSB6LnRvX3hyLm51bV9kZW4pDQog # ICAgICAgIGNuLHgscG4sY2QseSxwZCxsbyxoaSxtaWQscSxyID0gMSwxLDAs # MCwwLDEsMCwxLDEsMCwwDQogICAgICAgIGJlZ2luDQogICAgICAgICAgcSxy # ID0gbi5kaXZtb2QoZCkNCiAgICAgICAgICB4ID0gcSpjbitwbg0KICAgICAg # ICAgIHkgPSBxKmNkK3BkDQogICAgICAgICAgcG4gPSBjbg0KICAgICAgICAg # IGNuID0geA0KICAgICAgICAgIHBkID0gY2QNCiAgICAgICAgICBjZCA9IHkN # CiAgICAgICAgICBuLGQgPSBkLHINCiAgICAgICAgZW5kIHVudGlsIGIqKG4w # KnktZDAqeCkuYWJzIDw9IGEqZDAqeQ0KICAgICAgICANCiAgICAgICAgaWYg # cT4xDQogICAgICAgICAgaGkgPSBxDQogICAgICAgICAgYmVnaW4NCiAgICAg # ICAgICAgIG1pZCA9IChsbytoaSkuZGl2KDIpDQogICAgICAgICAgICB4ID0g # Y24tcG4qbWlkDQogICAgICAgICAgICB5ID0gY2QtcGQqbWlkDQogICAgICAg # ICAgICBpZiBiKihuMCp5LWQwKngpLmFicyA8PSBhKmQwKnkNCiAgICAgICAg # ICAgICAgbG8gPSBtaWQNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAg # ICAgaGkgPSBtaWQNCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgIGVuZCB1 # bnRpbCBoaS1sbyA8PSAxIA0KICAgICAgICAgIHggPSBjbiAtIHBuKmxvDQog # ICAgICAgICAgeSA9IGNkIC0gcGQqbG8gICAgDQogICAgICAgIGVuZCANCiAg # ICAgICAgIA0KICAgICAgICBudW0sZGVuID0geCx5ICMgcmVuYW1pbmcNCiAg # ICAgICAgIA0KICAgICAgICANCiAgICAgICAgbnVtID0gLW51bSBpZiBuZWdh # bnMNCiAgICAgIGVuZA0KICAgICAgcmV0dXJuIG51bSxkZW4NCiAgICAgIA0K # ICAgICAgICAgICAgIA0KICAgIGVuZA0KICAgIGRlZiBiZXN0Myh4KQ0KICAg # ICAgDQoNCiAgICAgIG51bV90b2wgPSBAdG9sLmtpbmRfb2Y/KE51bWVyaWMp # DQogICAgICBpZiAhbnVtX3RvbCAmJiBAdG9sLnplcm8/KHgpDQogICAgICAg # ICMgbnVtLGRlbiA9IHgudG9feHIubnVtX2Rlbg0KICAgICAgICBudW0sZGVu # ID0gMCwxDQogICAgICBlbHNlDQogICAgICAgIG5lZ2Fucz1mYWxzZQ0KICAg # ICAgICBpZiB4PDANCiAgICAgICAgICBuZWdhbnMgPSB0cnVlDQogICAgICAg # ICAgeCA9IC14DQogICAgICAgIGVuZA0KICAgICAgICBkeCA9IG51bV90b2wg # PyBAdG9sIDogQHRvbC5nZXRWYWx1ZSh4KQ0KICAgICAgICANCiAgICAgICAg # DQogICAgICAgIHosdCA9IHgsZHggIyByZW5hbWluZw0KDQogICAgICAgIGEs # YiA9IHQudG9feHIubnVtX2Rlbg0KICAgICAgICBuMCxkMCA9IChuLGQgPSB6 # LnRvX3hyLm51bV9kZW4pDQogICAgICAgIGNuLHgscG4sY2QseSxwZCxsbyxo # aSxtaWQscSxyID0gMSwxLDAsMCwwLDEsMCwxLDEsMCwwDQogICAgICAgIGJl # Z2luDQogICAgICAgICAgcSxyID0gbi5kaXZtb2QoZCkNCiAgICAgICAgICB4 # ID0gcSpjbitwbg0KICAgICAgICAgIHkgPSBxKmNkK3BkDQogICAgICAgICAg # cG4gPSBjbg0KICAgICAgICAgIGNuID0geA0KICAgICAgICAgIHBkID0gY2QN # CiAgICAgICAgICBjZCA9IHkNCiAgICAgICAgICBuLGQgPSBkLHINCiAgICAg # ICAgZW5kIHVudGlsIGIqKG4wKnktZDAqeCkuYWJzIDw9IGEqZDAqeQ0KICAg # ICAgICANCiAgICAgICAgaWYgcT4xDQogICAgICAgICAgaGkgPSBxDQogICAg # ICAgICAgYmVnaW4NCiAgICAgICAgICAgIG1pZCA9IChsbytoaSkuZGl2KDIp # DQogICAgICAgICAgICB4ID0gY24tcG4qbWlkDQogICAgICAgICAgICB5ID0g # Y2QtcGQqbWlkDQogICAgICAgICAgICBpZiBiKihuMCp5LWQwKngpLmFicyA8 # PSBhKmQwKnkNCiAgICAgICAgICAgICAgbG8gPSBtaWQNCiAgICAgICAgICAg # IGVsc2UNCiAgICAgICAgICAgICAgaGkgPSBtaWQNCiAgICAgICAgICAgIGVu # ZA0KICAgICAgICAgIGVuZCB1bnRpbCBoaS1sbyA8PSAxIA0KICAgICAgICAg # IHggPSBjbiAtIHBuKmxvDQogICAgICAgICAgeSA9IGNkIC0gcGQqbG8gICAg # DQogICAgICAgIGVuZCANCiAgICAgICAgIA0KICAgICAgICBudW0sZGVuID0g # eCx5ICMgcmVuYW1pbmcNCiAgICAgICAgIA0KICAgICAgICANCiAgICAgICAg # bnVtID0gLW51bSBpZiBuZWdhbnMNCiAgICAgIGVuZA0KICAgICAgcmV0dXJu # IG51bSxkZW4NCiAgICAgIA0KICAgICAgICAgICAgIA0KICAgIGVuZA0KICAg # IGRlZiBiZXN0NCh4KQ0KICAgICAgDQoNCiAgICAgIG51bV90b2wgPSBAdG9s # LmtpbmRfb2Y/KE51bWVyaWMpDQogICAgICBpZiAhbnVtX3RvbCAmJiBAdG9s # Lnplcm8/KHgpDQogICAgICAgICMgbnVtLGRlbiA9IHgudG9feHIubnVtX2Rl # bg0KICAgICAgICBudW0sZGVuID0gMCwxDQogICAgICBlbHNlDQogICAgICAg # IG5lZ2Fucz1mYWxzZQ0KICAgICAgICBpZiB4PDANCiAgICAgICAgICBuZWdh # bnMgPSB0cnVlDQogICAgICAgICAgeCA9IC14DQogICAgICAgIGVuZA0KICAg # ICAgICBkeCA9IG51bV90b2wgPyBAdG9sIDogQHRvbC5nZXRWYWx1ZSh4KQ0K # ICAgICAgICANCiAgICAgICAgDQogICAgICAgICAgeCA9IHgudG9feHINCiAg # ICAgICAgICBkeCA9IGR4LnRvX3hyDQogICAgICAgICAgeHEseHAgPSAoeC1k # eCkubnVtX2Rlbg0KICAgICAgICAgIHlxLHlwID0gKHgrZHgpLm51bV9kZW4N # CiAgICAgICAgICANCiAgICAgICAgICAgIGEgPSBbXQ0KICAgICAgICAgICAg # ZmluLG9kZCA9IGZhbHNlLHRydWUNCiAgICAgICAgICAgIHdoaWxlICFmaW4g # JiYgeHAhPTAgJiYgeXAhPTANCiAgICAgICAgICAgICAgb2RkID0gIW9kZA0K # ICAgICAgICAgICAgICB4cCx4cSA9IHhxLHhwDQogICAgICAgICAgICAgIGF4 # ID0geHAuZGl2KHhxKQ0KICAgICAgICAgICAgICB4cCAtPSBheCp4cQ0KDQog # ICAgICAgICAgICAgIHlwLHlxID0geXEseXANCiAgICAgICAgICAgICAgYXkg # PSB5cC5kaXYoeXEpDQogICAgICAgICAgICAgIHlwIC09IGF5KnlxDQoNCiAg # ICAgICAgICAgICAgaWYgYXghPWF5DQogICAgICAgICAgICAgICAgZmluID0g # dHJ1ZQ0KICAgICAgICAgICAgICAgIGF4LHhwLHhxID0gYXkseXAseXEgaWYg # b2RkDQogICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICBhIDw8IGF4 # ICMgLnRvX2kNCiAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgYVstMV0g # Kz0gMSBpZiB4cCE9MCAmJiBhLnNpemU+MA0KICAgICAgICAgICAgcCxxID0g # MSwwDQogICAgICAgICAgICAoMS4uYS5zaXplKS5lYWNoe3xpfCBwLHE9cStw # KmFbLWldLHB9DQogICAgICAgICAgICBudW0sZGVuID0gcCxxDQogICAgICAg # ICANCiAgICAgICAgDQogICAgICAgIG51bSA9IC1udW0gaWYgbmVnYW5zDQog # ICAgICBlbmQNCiAgICAgIHJldHVybiBudW0sZGVuDQogICAgICANCiAgICAg # ICAgICAgICANCiAgICBlbmQNCiAgZW5kDQogIA0KICAjQmVzdCBmcmFjdGlv # biBnaXZlbiBtYXhpbXVtIGRlbm9taW5hdG9yDQogICNBbGdvcml0aG0gQ29w # eXJpZ2h0IChjKSAxOTkxIGJ5IEpvc2VwaCBLLiBIb3JuDQogIGRlZiBSdG5s # enIubWF4X2Rlbm9taW5hdG9yKGYsIG1heF9kZW49MTAwMDAwMDAwMCwgbnVt # Q2xhc3M9bmlsKQ0KICAgIHJldHVybiBuaWwgaWYgbWF4X2RlbjwxDQogICAg # bnVtQ2xhc3MgfHw9IGYuY2xhc3MNCiAgICByZXR1cm4gbXRoLmlwKGYpLDEg # aWYgbXRoLmZwKGYpPT0wDQoNCiAgICBvbmUgPSAxLnByZWMobnVtQ2xhc3Mp # DQogICAgDQogICAgICBzaWduID0gZjwwDQogICAgICBmID0gLWYgaWYgc2ln # bg0KDQogICAgICBhLGIsYyA9IDAsMSxmDQogICAgICB3aGlsZSBiPG1heF9k # ZW4gYW5kIGMhPTANCiAgICAgICAgY2MgPSBvbmUvYw0KICAgICAgICBhLGIs # YyA9IGIsIG10aC5pcChjYykqYithLCBtdGguZnAoY2MpDQogICAgICBlbmQN # Cg0KICAgIA0KICAgICAgaWYgYj5tYXhfZGVuDQogICAgICAgIGIgLT0gYSpt # dGguY2VpbCgoYi1tYXhfZGVuKS9GbG9hdChhKSkNCiAgICAgIGVuZA0KICAg # ICAgDQoNCiAgICAgIGYxLGYyID0gW2EsYl0uY29sbGVjdHt8eHwgbXRoLmFi # cyhtdGgucm5kKHgqZikveC5wcmVjKG51bUNsYXNzKS1mKX0NCg0KICAgICAg # YSA9IGYxPmYyID8gYiA6IGENCg0KICAgICAgbnVtLGRlbiA9IG10aC5ybmQo # YSpmKS50b19pLGENCiAgICAgIGRlbiA9IDEgaWYgbXRoLmFicyhkZW4pPDEN # CiAgICAgIA0KICAgICAgbnVtID0gLW51bSBpZiBzaWduDQoNCiAgICByZXR1 # cm4gbnVtLGRlbg0KICBlbmQNCiAgDQogIGNsYXNzIFJ0bmx6cg0KICAgICNB # dXhpbGlhcnkgZmxvYXRpbmctcG9pbnQgZnVuY3Rpb25zDQogICAgbW9kdWxl # IE10aA0KICAgICAgZGVmIHNlbGYuZnAoeCkNCiAgICAgICAgIyB5ID14Lm1v # ZHVsbygxKTsgcmV0dXJuIHg8MCA/IC15IDogeTsNCiAgICAgICAgeC1pcCh4 # KQ0KICAgICAgZW5kDQoNCiAgICAgIGRlZiBzZWxmLmlwKHgpDQogICAgICAg # ICMgeC50b19pLnRvX2YNCiAgICAgICAgKHg8MCA/IHguY2VpbCA6IHguZmxv # b3IpLnRvX2kNCiAgICAgIGVuZA0KDQogICAgICBkZWYgc2VsZi5ybmQoeCkN # CiAgICAgICAgI3gucm91bmQudG9faQ0KICAgICAgICB4LnJvdW5kDQogICAg # ICBlbmQNCg0KICAgICAgZGVmIHNlbGYuYWJzKHgpDQogICAgICAgIHguYWJz # DQogICAgICBlbmQNCg0KICAgICAgZGVmIHNlbGYuY2VpbCh4KQ0KICAgICAg # ICB4LmNlaWwudG9faQ0KICAgICAgZW5kICAgIA0KICAgIGVuZA0KICAgIGRl # ZiBzZWxmLm10aDsgTXRoOyBlbmQNCiAgZW5kDQogIA0KICBtb2R1bGVfZnVu # Y3Rpb24NCiAgDQplbmQNCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAB0bXAvZ29pL3Rvb2xzLnJiAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAMTAwNjY2IAAgICAgIDAgACAgICAgMCAAICAg # ICAgMTYxNzIgMTA2NzI1NjYzNzMgIDEyNDM2ACAwAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFy # ICAAdXNlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABncm91cAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgQ29tbW9uIFV0aWxpdGllcw0K # DQojIENvcHlyaWdodCAoQykgMjAwMy0yMDA1LCBKYXZpZXIgR29penVldGEg # PGphdmllckBnb2l6dWV0YS5pbmZvPg0KIw0KIyBUaGlzIHByb2dyYW0gaXMg # ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y # DQojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l # cmFsIFB1YmxpYyBMaWNlbnNlDQojIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl # ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyDQojIG9m # IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 # ZXJzaW9uLg0KDQoNCnJlcXVpcmUgJ3J1YnlnZW1zJw0KcmVxdWlyZSAnZmls # ZXV0aWxzJw0KDQpyZXF1aXJlICdmaWxldXRpbHMnDQoNCg0KYmVnaW4NCiAg # cmVxdWlyZSAnd2luMzIvZmlsZScNCiAgR09JX1dJTjMyX0ZJTEUgPSB0cnVl # DQogIA0KICAgICMgcmVkZWZpbmUgRmlsZS5kaXJuYW1lDQogICAgIGRlZiBG # aWxlLmRpcm5hbWUoZmlsZSkNCiAgICAgICAgZnBhdGggPSBmYWxzZQ0KICAg # ICAgICBmaWxlID0gZmlsZS5kdXANCiAgICAgICAgDQogICAgICAgIGlmIGZp # bGUuaW5jbHVkZT8oJy8nKQ0KICAgICAgICAgICBmaWxlLnRyISgnLycsICJc # XCIpDQogICAgICAgICAgIGZwYXRoID0gdHJ1ZQ0KICAgICAgICBlbmQNCiAg # ICAgICAgDQogICAgICAgIGlmIFBhdGhJc1Jvb3QoZmlsZSkNCiAgICAgICAg # ICAgZmlsZS50ciEoIlxcIiwgJy8nKSBpZiBmcGF0aA0KICAgICAgICAgICBy # ZXR1cm4gZmlsZQ0KICAgICAgICBlbmQNCiAgICAgICAgDQogICAgICAgIFBh # dGhSZW1vdmVGaWxlU3BlYyhmaWxlKQ0KICAgICAgICBmaWxlID0gZmlsZS5z # cGxpdCgwLmNocikuZmlyc3QgfHwgIiINCiAgICAgICAgUGF0aFJlbW92ZUJh # Y2tzbGFzaChmaWxlKQ0KICAgICAgICANCiAgICAgICAgZmlsZS50ciEoIlxc # IiwgJy8nKSBpZiBmcGF0aA0KICAgICAgICBmaWxlID0gIi4iIGlmIGZpbGUu # ZW1wdHk/DQogICAgICAgIGZpbGUNCiAgICAgZW5kICANCiAgDQogIGNsYXNz # IEZpbGVVdGlsczo6RW50cnlfDQogICAgICBkZWYgbHN0YXQhDQogICAgICAg # IGxzdGF0KCkNCiAgICAgIHJlc2N1ZSBTeXN0ZW1DYWxsRXJyb3IsQXJndW1l # bnRFcnJvcg0KICAgICAgICBuaWwNCiAgICAgIGVuZCAgDQogIGVuZA0KICAN # CnJlc2N1ZSBMb2FkRXJyb3INCiAgR09JX1dJTjMyX0ZJTEUgPSBmYWxzZQ0K # ZW5kDQogDQogDQoNCm1vZHVsZSBFbnVtZXJhYmxlDQogIGRlZiBhY2N1bXVs # YXRlKHYwPW5pbCkNCiAgICBlYWNoIGRvIHx2fA0KICAgICAgaWYgdjA9PW5p # bA0KICAgICAgICB2MD12DQogICAgICBlbHNlDQogICAgICAgIHYwID0geWll # bGQodjAsdikNCiAgICAgIGVuZA0KICAgIGVuZA0KICAgIHYwDQogIGVuZA0K # ZW5kDQoNCmNsYXNzIEhhc2gNCiAgZGVmIGFwcGx5ISgmYmxrKQ0KICAgIGNh # c2UgYmxrLmFyaXR5DQogICAgICB3aGVuIDENCiAgICAgICAgZWFjaF9wYWly # e3xrLHZ8IHNlbGZba109eWllbGQodil9DQogICAgICB3aGVuIDINCiAgICAg # ICAgZWFjaF9wYWlye3xrLHZ8IHNlbGZba109eWllbGQoayx2KX0NCiAgICAg # IGVsc2UNCiAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoJ0ludmFs # aWQgYXJpdHkgb2YgYmxvY2snKQ0KICAgIGVuZA0KICAgIHNlbGYNCiAgZW5k # DQogIGRlZiBhcHBseSgmYmxrKQ0KICAgIGggPSB7fQ0KICAgIGNhc2UgYmxr # LmFyaXR5DQogICAgICB3aGVuIDENCiAgICAgICAgZWFjaF9wYWlye3xrLHZ8 # IGhba109eWllbGQodil9DQogICAgICB3aGVuIDINCiAgICAgICAgZWFjaF9w # YWlye3xrLHZ8IGhba109eWllbGQoayx2KX0NCiAgICAgIGVsc2UNCiAgICAg # ICAgcmFpc2UgQXJndW1lbnRFcnJvci5uZXcoJ0ludmFsaWQgYXJpdHkgb2Yg # YmxvY2snKQ0KICAgIGVuZA0KICAgIGgNCiAgZW5kDQplbmQNCg0KY2xhc3Mg # U3RyaW5nDQogICMgc3Vic3RpdHV0aW9uIG1ldGhvZHMgYWNjZXB0aW5nIGEg # YmxvY2sgYW5kIHBhc3NpbmcgTWF0Y2hEYXRhDQogIGRlZiBnc3ViX21kKHBh # dHRlcm4pDQogICAgZ3N1YihwYXR0ZXJuKXt8c3RyfCB5aWVsZCgkfil9DQog # IGVuZA0KICBkZWYgZ3N1Yl9tZCEocGF0dGVybikNCiAgICBnc3ViIShwYXR0 # ZXJuKXt8c3RyfCB5aWVsZCgkfil9DQogIGVuZA0KZW5kDQptb2R1bGUgRW51 # bWVyYWJsZQ0KICBkZWYgZ3JlcF9tZChwYXR0ZXJuKQ0KICAgIGdyZXAocGF0 # dGVybil7fHN0cnwgeWllbGQoJH4pfQ0KICBlbmQNCmVuZA0KDQoNCm1vZHVs # ZSBHb2kNCiAgDQogIG1vZHVsZSBTdGF0ZUVxdWl2YWxlbnQNCiAgICBkZWYg # PT0ob2JqKTsgdGVzdF9lcXVhbChvYmopOyBlbmQNCiAgICBkZWYgZXFsPyhv # YmopOyB0ZXN0X2VxdWFsKG9iaik7IGVuZA0KICAgIGRlZiA9PT0ob2JqKTsg # dGVzdF9lcXVhbChvYmopOyBlbmQNCiAgICBkZWYgaGFzaA0KICAgICAgaCA9 # IDANCiAgICAgIHNlbGYuaW5zdGFuY2VfdmFyaWFibGVzLmVhY2ggZG8gfHZh # cnwNCiAgICAgICAgdiA9IHNlbGYuaW5zdGFuY2VfZXZhbCB2YXINCiAgICAg # ICAgaCBePSB2Lmhhc2ggdW5sZXNzIHYubmlsPw0KICAgICAgZW5kDQogICAg # ICBoDQogICAgZW5kDQoNCiAgICBwcml2YXRlDQogICAgZGVmIHRlc3RfZXF1 # YWwob2JqKQ0KICAgICAgcmV0dXJuIGZhbHNlIHVubGVzcyBzZWxmLmNsYXNz # ID09IG9iai5jbGFzcw0KICAgICAgKHNlbGYuaW5zdGFuY2VfdmFyaWFibGVz # ICsgb2JqLmluc3RhbmNlX3ZhcmlhYmxlcykudW5pcS5lYWNoIGRvIHx2YXJ8 # DQogICAgICAgIHYxID0gc2VsZi5pbnN0YW5jZV9ldmFsIHZhcg0KICAgICAg # ICB2MiA9IG9iai5pbnN0YW5jZV9ldmFsIHZhcg0KICAgICAgICByZXR1cm4g # ZmFsc2UgdW5sZXNzIHYxID09IHYyDQogICAgICBlbmQNCiAgICAgIHRydWUN # CiAgICBlbmQNCiAgZW5kDQogIA0KICBtb2R1bGVfZnVuY3Rpb24NCiAgDQog # ICMgSGFuZGxlIG9wdGlvbmFsIHZhbHVlIChlLmcuIGV4dHJhY3QgcGFyYW1l # dGVycyBmcm9tIGEgaGFzaCkNCiAgZGVmIG9wdCh2LCBkZWZhdWx0X3YpDQog # ICAgdi5uaWw/ID8gZGVmYXVsdF92IDogdg0KICBlbmQNCiAgDQogIGRlZiBt # dWx0aV9tYXAoKmFycmF5cywmYmxrKQ0KDQogICAgIyBjaGVjayBudW1iZXIg # b2YgYXJyYXlzIHZzIGJsb2NrIGFyaXR5IChvciBibG9jayBhcml0eSBpcyAy # KQ0KICAgICMgY2hlY2sgYXJyYXkgc2l6ZXMuLi4NCiAgICANCiAgICBuID0g # YXJyYXlzLnNpemUNCiAgICByZXR1cm4gbmlsIGlmIG49PTANCg0KICAgIHJl # c3VsdCA9IFtdDQogICAgDQogICAgDQogICAgIyB0byBtYWtlIHRoaXMgdmFs # aWQgZm9yIGFueSBFbnVtZXJhYmxlIHR5cGUuLi4NCiAgICBhcnJheXMubWFw # ISB7IHxhcnJ8IGFyci50b19hIH0NCiAgICANCiAgICBuID0gYXJyYXlzWzBd # LnNpemUgICAgDQogICAgKDAuLi5uKS5lYWNoIGRvIHxpfCAgICANCiAgICAg # IGFyZ3MgPSBbXQ0KICAgICAgYXJyYXlzLmVhY2ggZG8gfGF8DQogICAgICAg # IGFyZ3MgPDwgYVtpXQ0KICAgICAgZW5kDQogICAgICBpZiBibGsuYXJpdHk9 # PWFycmF5cy5zaXplDQogICAgICAgIHJlc3VsdCA8PCB5aWVsZCgqYXJncykg # DQogICAgICBlbHNlIA0KICAgICAgICAjIGFzc2VydCBibGsuYXJpdHk9PTIN # CiAgICAgICAgcmVzdWx0IDw8IGFyZ3MuYWNjdW11bGF0ZSgmYmxrKQ0KICAg # ICAgZW5kDQogICAgZW5kDQogICAgcmVzdWx0DQogIGVuZA0KICANCiAgZGVm # IHVuX2luZGVudF90eHQoc3RyKQ0KICAgIHMgPSBzdHIuZHVwDQogICAgcy5n # c3ViISgvXHQvLCcgJyo4KQ0KICAgIG14ID0gcy5zY2FuKC9eICovKS5mbGF0 # dGVuLm1hcHt8c3N8ICBzcy5zaXplfS5jb21wYWN0Lm1pbg0KICAgIGlmIG14 # ICYmIG14PjAgdGhlbg0KICAgICAgcmUgPSBSZWdleHAubmV3KCdeIHsxLCcr # bXgudG9fcysnfScpDQogICAgICBzID0gcy5nc3ViKHJlLCIiKQ0KICAgIGVu # ZA0KICAgIHJldHVybiBzDQogIGVuZA0KICANCiAgZGVmIHRyaW1fbGluZXNf # dHh0KHN0cikNCiAgICAgcDAgPSAwDQogICAgIHBuID0gc3RyLnNpemUNCiAg # ICAgd2hpbGUgKHAwPHBuKSBhbmQgL1tcblxyXS8ubWF0Y2goc3RyW3AwLDFd # KQ0KICAgICAgIHAwICs9IDENCiAgICAgZW5kDQogICAgIHdoaWxlIChwbj5w # MCkgYW5kIC9bXG5ccl0vLm1hdGNoKHN0cltwbi0xLDFdKQ0KICAgICAgIHBu # IC09IDENCiAgICAgZW5kDQogICAgIHN0ciA9IHN0cltwMC4uLnBuXQ0KICAg # ICBzdHINCiAgZW5kDQogIA0KICBkZWYgZmxhdHRlbl90eHQoc3RyKSAjIGZs # YXR0ZW4sIGZsdXNoIGxlZnQNCiAgICBzID0gIlxuIitzdHINCiAgICBzID0g # cy5nc3ViKC9bXG5ccl0gKy8sIlxuIikNCiAgICBzID0gc1sxLi4ucy5sZW5n # dGhdDQogICAgcmV0dXJuIHMNCiAgZW5kDQogIA0KICBkZWYgcmVsYXRpdmVf # cGF0aChwYXRoLCBiYXNlPW5pbCkNCiAgICAgY2FzZWZvbGQgPSBGaWxlOjpB # TFRfU0VQQVJBVE9SPT0nXFwnDQogICAgIGJhc2UgPSBvcHQoYmFzZSwgJy4n # KQ0KICAgICBiYXNlID0gRmlsZS5leHBhbmRfcGF0aChiYXNlKQ0KICAgICBi # YXNlLmRvd25jYXNlISBpZiBjYXNlZm9sZA0KICAgICBiYXNlICs9IEZpbGU6 # OlNFUEFSQVRPUiB1bmxlc3MgYmFzZVstMSwxXT09RmlsZTo6U0VQQVJBVE9S # DQogICAgIHhwYXRoID0gRmlsZS5leHBhbmRfcGF0aChwYXRoKQ0KICAgICBp # ZiB4cGF0aC5zaXplID49IGJhc2Uuc2l6ZQ0KICAgICAgIHByZSA9IHhwYXRo # WzAuLi5iYXNlLnNpemVdDQogICAgICAgcHJlLmRvd25jYXNlISBpZiBjYXNl # Zm9sZA0KICAgICAgIGlmIHByZSA9PSBiYXNlDQogICAgICAgICBwYXRoID0g # eHBhdGhbYmFzZS5zaXplLi4tMV0gIyBza2lwIHNlcGFyYXRvcg0KICAgICAg # ICAgIyBwYXRoID0gJy4nIGlmIHBhdGg9PScnDQogICAgICAgZW5kDQogICAg # IGVuZCAgDQogICAgcGF0aA0KICBlbmQNCiAgDQoNCiAgZGVmIGNvcHlfZmls # ZXMoZnJvbV9kaXIsIHRvX2RpciwgaGlkZGVuPWZhbHNlLCAmYmxrKQ0KICAg # IGZyb21fZGlyID0gRmlsZS5leHBhbmRfcGF0aChmcm9tX2RpcikuZ3N1YihG # aWxlOjpBTFRfU0VQQVJBVE9SLEZpbGU6OlNFUEFSQVRPUikgaWYgRmlsZTo6 # QUxUX1NFUEFSQVRPUg0KICAgIHRvX2RpciA9IEZpbGUuZXhwYW5kX3BhdGgo # dG9fZGlyKS5nc3ViKEZpbGU6OkFMVF9TRVBBUkFUT1IsRmlsZTo6U0VQQVJB # VE9SKSBpZiBGaWxlOjpBTFRfU0VQQVJBVE9SDQogICAgZmlsZXMgPSBEaXIu # Z2xvYihGaWxlLmpvaW4oZnJvbV9kaXIsJyoqLyonKSxoaWRkZW4gPyBGaWxl # OjpGTk1fRE9UTUFUQ0ggOiAwKSAgDQogICAgRGlyW2Zyb21fZGlyKyIvKiov # KiJdLmVhY2ggZG8gfCBmcm9tX2ZpbGVuYW1lIHwNCiAgICAgIG5leHQgaWYg # aGlkZGVuICYmIFsnLi4nLCcuJ10uaW5jbHVkZT8oZnJvbV9maWxlbmFtZSkN # CiAgICAgIGlzX3dpbl9oaWRkZW4gPSBHT0lfV0lOMzJfRklMRSAmJiBGaWxl # LmhpZGRlbj8oZnJvbV9maWxlbmFtZSkNCiAgICAgIGlzX2hpZGRlbiA9IGlz # X3dpbl9oaWRkZW4gfHwgRmlsZS5iYXNlbmFtZShmcm9tX2ZpbGVuYW1lKVsw # XT09Py4NCiAgICAgIG5leHQgaWYgIWhpZGRlbiAmJiBpc19oaWRkZW4NCiAg # ICAgIHRvX2ZpbGVuYW1lID0gZnJvbV9maWxlbmFtZS5zdWIoZnJvbV9kaXIr # Ii8iLCB0b19kaXIrIi8iKTsNCiAgICAgIGlmIGJsb2NrX2dpdmVuPyAjICFi # bGsubmlsPw0KICAgICAgICBpZiBibGsuYXJpdHk9PTINCiAgICAgICAgICB0 # b19maWxlbmFtZSA9IHlpZWxkKGZyb21fZmlsZW5hbWUsIHRvX2ZpbGVuYW1l # KQ0KICAgICAgICBlbHNlDQogICAgICAgICAgdG9fZmlsZW5hbWUgPSB5aWVs # ZCh0b19maWxlbmFtZSkNCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICAg # IG5leHQgaWYgdG9fZmlsZW5hbWUubmlsPw0KICAgICAgaWYgRmlsZS5kaXJl # Y3Rvcnk/KGZyb21fZmlsZW5hbWUpDQogICAgICAgIEZpbGVVdGlscy5ta2Rp # cl9wIHRvX2ZpbGVuYW1lDQogICAgICBlbHNlDQogICAgICAgIG5ld19kaXIg # PSBGaWxlLmRpcm5hbWUodG9fZmlsZW5hbWUpOw0KICAgICAgICBGaWxlVXRp # bHMubWtkaXJfcCBuZXdfZGlyDQogICAgICAgIGlmICFGaWxlLmV4aXN0cz8o # dG9fZmlsZW5hbWUpIG9yICFGaWxlVXRpbHMuY21wKGZyb21fZmlsZW5hbWUs # IHRvX2ZpbGVuYW1lKQ0KICAgICAgICAgIGlmIGlzX3dpbl9oaWRkZW4NCiAg # ICAgICAgICAgIGlmIEZpbGUuZXhpc3RzPyh0b19maWxlbmFtZSkNCiAgICAg # ICAgICAgICAgIyBvdmVyd3JpdHRlbiBoaWRkZW4gZmlsZSBjYXVzZXMgZXJy # b3INCiAgICAgICAgICAgICAgRmlsZS5vcGVuKHRvX2ZpbGVuYW1lKXt8Znwg # Zi5oaWRkZW49ZmFsc2V9DQogICAgICAgICAgICBlbmQNCiAgICAgICAgICBl # bmQNCiAgICAgICAgICBGaWxlVXRpbHMuY3AgZnJvbV9maWxlbmFtZSwgdG9f # ZmlsZW5hbWUsIDpwcmVzZXJ2ZT0+dHJ1ZQ0KICAgICAgICAgIGlmIGlzX3dp # bl9oaWRkZW4NCiAgICAgICAgICAgIEZpbGUub3Blbih0b19maWxlbmFtZSl7 # fGZ8IGYuaGlkZGVuPXRydWV9DQogICAgICAgICAgZW5kDQogICAgICAgIGVu # ZA0KICAgICAgZW5kICAgICAgICANCiAgICBlbmQgICAgDQogIGVuZA0KICAN # CiAgDQogIGRlZiB3aGljaF9maWxlKHByZywgcGF0aD1FTlZbJ1BBVEgnXSkN # CiAgICB3aW4gPSBGaWxlOjpBTFRfU0VQQVJBVE9SPT0nXFwnDQoNCiAgICBw # YXRoID0gcGF0aC5zcGxpdChGaWxlOjpQQVRIX1NFUEFSQVRPUikNCiAgICBw # YXRoLnVuc2hpZnQgJy4nIGlmIHdpbg0KDQogICAgaWYgd2luDQogICAgICBl # eHRzID0gRU5WWydQQVRIRVhUJ10NCiAgICAgIGV4dHMgfHw9ICIuQ09NOy5F # WEU7LkJBVCINCiAgICAgIGV4dHMgPSBleHRzLmRvd25jYXNlDQogICAgICBl # eHRzID0gZXh0cy5zcGxpdCgnOycpDQogICAgICBpZiBleHRzLmluY2x1ZGU/ # IEZpbGUuZXh0bmFtZShwcmcpLmRvd25jYXNlDQogICAgICAgIGV4dHMgPSBb # JyddDQogICAgICBlbmQgICAgICAgDQogICAgZWxzZQ0KICAgICAgZXh0cyA9 # IFsnJ10NCiAgICBlbmQgICANCiAgICANCiAgICBmb3VuZCA9IG5pbA0KICAg # IHBhdGguZWFjaCBkbyB8ZGlyfA0KICAgICAgZXh0cy5lYWNoIGRvIHxleHR8 # ICAgICAgICAgICAgICANCiAgICAgICAgZm4gPSBGaWxlLmV4cGFuZF9wYXRo # KEZpbGUuam9pbihkaXIsIHByZyArIGV4dCkpDQogICAgICAgIGlmIEZpbGUu # ZXhpc3RzPyhmbikgJiYgRmlsZS5leGVjdXRhYmxlPyhmbikgJiYgIUZpbGUu # ZGlyZWN0b3J5PyhmbikNCiAgICAgICAgICBmb3VuZCA9IGZuDQogICAgICAg # ICAgYnJlYWsNCiAgICAgICAgZW5kDQogICAgICBlbmQNCiAgICBlbmQNCiAg # ICBmb3VuZA0KICBlbmQNCiAgDQplbmQNCgAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAHRtcC9nb2kvd2l0aFdvcmQucmIAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAxMDA2NjYgACAgICAgMCAAICAgICAwIAAg # ICAgICAgMzcxMiAxMDY3MjU2NjM3MyAgMTMwNjEAIDAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0 # YXIgIAB1c2VyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdyb3VwAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIyBjb250cm9sIFdvcmQNCg0K # IyBDb3B5cmlnaHQgKEMpIDIwMDQsIEphdmllciBHb2l6dWV0YSA8amF2aWVy # QGdvaXp1ZXRhLmluZm8+DQojDQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNv # ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCiMgbW9k # aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi # bGljIExpY2Vuc2UNCiMgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3 # YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDINCiMgb2YgdGhlIExp # Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u # DQoNCnJlcXVpcmUgJ3dpbjMyb2xlJzsNCg0KDQptb2R1bGUgV29yZA0KICBA # QGluaXRlZCA9IGZhbHNlDQogIG1vZHVsZV9mdW5jdGlvbg0KICANCiAgZGVm # IGFic0ZpbGVOYW1lKHJlbF9mbikNCiAgICBkaXJfYmFzZSA9IEZpbGUuZXhw # YW5kX3BhdGgoJDAsRGlyLnB3ZCkNCiAgICBkaXJfYmFzZSA9IEZpbGUuZGly # bmFtZSBkaXJfYmFzZQ0KICAgIGlmIEZpbGU6OkFMVF9TRVBBUkFUT1INCiAg # ICAgIHJlbF9mbi5nc3ViIShSZWdleHAubmV3KFJlZ2V4cC5lc2NhcGUoRmls # ZTo6QUxUX1NFUEFSQVRPUikpLCBGaWxlOjpTRVBBUkFUT1IpDQogICAgZW5k # ICAgIA0KICAgIGFic19mbiA9IEZpbGUuZXhwYW5kX3BhdGgocmVsX2ZuLCBk # aXJfYmFzZSkNCiAgICBpZiBGaWxlOjpBTFRfU0VQQVJBVE9SDQogICAgICBh # YnNfZm4uZ3N1YiEoUmVnZXhwLm5ldyhSZWdleHAuZXNjYXBlKEZpbGU6OlNF # UEFSQVRPUikpLCBGaWxlOjpBTFRfU0VQQVJBVE9SKQ0KICAgIGVuZCAgDQog # ICAgYWJzX2ZuDQogIGVuZA0KICANCiAgZGVmIHdpdGhBcHBsaWNhdGlvbg0K # ICAgICAgYmVnaW4NCiAgICAgICAgICB3ID0gb3BlbkFwcGxpY2F0aW9uDQog # ICAgICAgICAgeWllbGQgdw0KICAgICAgICByZXNjdWUgU3RhbmRhcmRFcnJv # ciA9PiBlcnINCiAgICAgICAgICBwdXRzICJFUlJPUjpcbiAgKCN7ZXJyLmNs # YXNzfSlcbiAtLSAje2Vycn0iICAgIA0KICAgICAgICAgIHByaW50IGVyci5i # YWNrdHJhY2Uuam9pbigiXG4iKSANCiAgICAgICAgZW5zdXJlDQogICAgICAg # ICAgdy5xdWl0IGlmIHcNCiAgICAgIGVuZA0KICBlbmQNCiAgDQogIGRlZiBv # cGVuQXBwbGljYXRpb24NCiAgICB3ID0gV0lOMzJPTEUubmV3KCdXb3JkLkFw # cGxpY2F0aW9uJykNCiAgICANCiAgICB1bmxlc3MgQEBpbml0ZWQNCiAgICAg # IFdJTjMyT0xFLmNvbnN0X2xvYWQgdywgV29yZA0KICAgICAgQEBpbml0ZWQg # PSB0cnVlDQogICAgZW5kDQogICAgDQogICAgdw0KICBlbmQNCiAgDQogICAg # ZGVmIHdpdGhEb2N1bWVudChmaWxlbmFtZT1uaWwsIG5ldz1mYWxzZSwgdGVt # cGxhdGU9bmlsKQ0KICAgICAgd2l0aEFwcGxpY2F0aW9uIGRvIHx3fA0KICAg # ICAgICBkID0gb3BlbkRvY3VtZW50KHcsIGZpbGVuYW1lLCBuZXcsIHRlbXBs # YXRlKQ0KICAgICAgICB5aWVsZCB3LCB3Yg0KICAgICAgICB3Yi5zYXZlIGlm # IG5ldw0KICAgICAgICB3Yi5jbG9zZQ0KICAgICAgZW5kDQogICAgZW5kDQog # IA0KICAgIGRlZiBvcGVuRG9jdW1lbnQodywgZmlsZW5hbWU9bmlsLCBuZXc9 # dHJ1ZSwgdGVtcGxhdGU9bmlsKQ0KICAgICAgZCA9IG5pbA0KICAgICAgDQog # ICAgICBpZiB3DQogICAgICAgIGlmIG5ldyB8fCAhZmlsZW5hbWUNCiAgICAg # ICAgICBpZiB0ZW1wbGF0ZQ0KICAgICAgICAgICAgZCA9IHcuZG9jdW1lbnRz # LmFkZCAndGVtcGxhdGUnPT50ZW1wbGF0ZQ0KICAgICAgICAgIGVsc2UNCiAg # ICAgICAgICAgIGQgPSB3LmRvY3VtZW50cy5hZGQNCiAgICAgICAgICAgIHdi # LnNhdmVBcyBmaWxlbmFtZSBpZiBmaWxlbmFtZQ0KICAgICAgICAgIGVuZA0K # ICAgICAgICBlbHNlDQogICAgICAgICAgZCA9IHcuZG9jdW1lbnRzLmFkZCBm # aWxlbmFtZQ0KICAgICAgICBlbmQNCiAgICAgIGVuZA0KICAgICAgZA0KICAg # IGVuZCAgDQogIA0KDQogIA0KDQogIA0KDQogIA0KDQogIA0KZW5kDQoAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAB0bXAvZ29pL3dpdGhYTC5yYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAMTAwNjY2IAAgICAgIDAgACAgICAgMCAAICAgICAg # IDc0NjYgMTA2NzI1NjYzNzMgIDEyNTAzACAwAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAA # dXNlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABncm91cAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgY29udHJvbCBFeGNlbA0KDQojIENv # cHlyaWdodCAoQykgMjAwNCwgSmF2aWVyIEdvaXp1ZXRhIDxqYXZpZXJAZ29p # enVldGEuaW5mbz4NCiMNCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh # cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KIyBtb2RpZnkg # aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg # TGljZW5zZQ0KIyBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg # Rm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMg0KIyBvZiB0aGUgTGljZW5z # ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCg0K # cmVxdWlyZSAnd2luMzJvbGUnOw0KDQoNCm1vZHVsZSBYTA0KICBAQGluaXRl # ZCA9IGZhbHNlDQogIG1vZHVsZV9mdW5jdGlvbg0KICANCiAgZGVmIGFic0Zp # bGVOYW1lKHJlbF9mbikNCiAgICBkaXJfYmFzZSA9IEZpbGUuZXhwYW5kX3Bh # dGgoJDAsRGlyLnB3ZCkNCiAgICBkaXJfYmFzZSA9IEZpbGUuZGlybmFtZSBk # aXJfYmFzZQ0KICAgIGlmIEZpbGU6OkFMVF9TRVBBUkFUT1INCiAgICAgIHJl # bF9mbi5nc3ViIShSZWdleHAubmV3KFJlZ2V4cC5lc2NhcGUoRmlsZTo6QUxU # X1NFUEFSQVRPUikpLCBGaWxlOjpTRVBBUkFUT1IpDQogICAgZW5kICAgIA0K # ICAgIGFic19mbiA9IEZpbGUuZXhwYW5kX3BhdGgocmVsX2ZuLCBkaXJfYmFz # ZSkNCiAgICBpZiBGaWxlOjpBTFRfU0VQQVJBVE9SDQogICAgICBhYnNfZm4u # Z3N1YiEoUmVnZXhwLm5ldyhSZWdleHAuZXNjYXBlKEZpbGU6OlNFUEFSQVRP # UikpLCBGaWxlOjpBTFRfU0VQQVJBVE9SKQ0KICAgIGVuZCAgDQogICAgYWJz # X2ZuDQogIGVuZA0KICANCiAgZGVmIHdpdGhBcHBsaWNhdGlvbg0KICAgIGJl # Z2luDQogICAgICAgIHhsID0gb3BlbkFwcGxpY2F0aW9uDQogICAgICAgIHlp # ZWxkIHhsDQogICAgICByZXNjdWUgU3RhbmRhcmRFcnJvciA9PiBlcnINCiAg # ICAgICAgcHV0cyAiRVJST1I6XG4gICgje2Vyci5jbGFzc30pXG4gLS0gI3tl # cnJ9IiAgICANCiAgICAgICAgcHJpbnQgZXJyLmJhY2t0cmFjZS5qb2luKCJc # biIpIA0KICAgICAgZW5zdXJlDQogICAgICAgIHhsLnF1aXQgaWYgeGwNCiAg # ICBlbmQNCiAgZW5kDQogIA0KICBkZWYgb3BlbkFwcGxpY2F0aW9uDQogICAg # eGwgPSBXSU4zMk9MRS5uZXcoJ0V4Y2VsLkFwcGxpY2F0aW9uJykNCiAgICAN # CiAgICB1bmxlc3MgQEBpbml0ZWQNCiAgICAgIFdJTjMyT0xFLmNvbnN0X2xv # YWQgeGwsIFhMDQogICAgICBAQGluaXRlZCA9IHRydWUNCiAgICBlbmQNCiAg # ICANCiAgICB4bA0KICBlbmQNCiAgDQogIGRlZiB3aXRoV29ya0Jvb2soZmls # ZW5hbWUsIG5ldz1mYWxzZSwgbnVtc2hlZXRzPTEpDQogICAgd2l0aEFwcGxp # Y2F0aW9uIGRvIHx4bHwNCiAgICAgIHdiID0gb3BlbldvcmtCb29rKHhsLCBm # aWxlbmFtZSwgbmV3LCBudW1zaGVldHMpDQogICAgICB5aWVsZCB4bCwgd2IN # CiAgICAgIHdiLnNhdmUgaWYgbmV3DQogICAgICB3Yi5jbG9zZQ0KICAgIGVu # ZA0KICBlbmQNCiAgDQogIGRlZiBvcGVuV29ya0Jvb2soeGwsIGZpbGVuYW1l # LCBuZXc9OmV4aXN0aW5nLCBudW1zaGVldHM9MSkNCiAgICB3YiA9IG5pbA0K # ICAgIA0KICAgICNjb21wYXRpYmlsaXR5IHdpdGggb2xkIHZlcnNpb24NCiAg # ICBpZiBuZXc9PWZhbHNlDQogICAgICBuZXcgPSA6ZXhpc3RpbmcNCiAgICBl # bHNpZiBuZXc9PXRydWUNCiAgICAgIG5ldyA9IDpuZXcNCiAgICBlbmQNCiAg # ICANCiAgICBpZiB4bA0KICAgICAgY2FzZSBuZXcNCiAgICAgICAgd2hlbiA6 # bmV3LCA6dW5uYW1lZA0KICAgICAgICAgIG9yaWdfbnVtc2ggPSB4bC5zaGVl # dHNJbk5ld1dvcmtib29rDQogICAgICAgICAgeGwuc2hlZXRzSW5OZXdXb3Jr # Ym9vayA9IG51bXNoZWV0cyBpZiBudW1zaGVldHMhPW9yaWdfbnVtc2gNCiAg # ICAgICAgICB3YiA9IHhsLndvcmtib29rcy5hZGQNCiAgICAgICAgICBpZiBu # ZXchPTp1bm5hbWVkDQogICAgICAgICAgICBmaWxlbmFtZSA9IHhsLmdldFNh # dmVBc0ZpbGVuYW1lIHVubGVzcyBmaWxlbmFtZQ0KICAgICAgICAgICAgd2Iu # c2F2ZUFzIGZpbGVuYW1lDQogICAgICAgICAgZW5kDQogICAgICAgICAgeGwu # c2hlZXRzSW5OZXdXb3JrYm9vayA9IG9yaWdfbnVtc2gNCiAgICAgICAgd2hl # biA6ZXhpc3RpbmcNCiAgICAgICAgICB3YiA9IHhsLndvcmtib29rcy5hZGQg # ZmlsZW5hbWUNCiAgICAgIGVuZA0KICAgIGVuZA0KICAgIHdiDQogIGVuZA0K # ICANCiAgQEBjb2xfZGlnaXRzID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZX # WFlaIg0KICBAQGNvbF9iYXNlID0gQEBjb2xfZGlnaXRzLnNpemUNCiAgZGVm # IGNvbF9yZWYoaSwgbW9kZT06cmVsKSAjIGk9MCwuLi4uDQogICAgcmYgPSAn # Jw0KDQogICAgIyByZiA9ICdBJztpLnRpbWVze3JmLnN1Y2MhfTtyZg0KICAg # IGJlZ2luDQogICAgICByZiA9IEBAY29sX2RpZ2l0c1soaSAlIEBAY29sX2Jh # c2UpICwgMV0gKyByZg0KICAgICAgaSAvPSBAQGNvbF9iYXNlDQogICAgICBj # bnQgPSBpPjANCiAgICAgIGkgLT0gMSBpZiBjbnQNCiAgICBlbmQgd2hpbGUg # Y250DQoNCiAgICByZiA9ICckJytyZiBpZiBtb2RlPT06YWJzDQogICAgcmYN # CiAgZW5kDQogIGRlZiByb3dfcmVmKGksIG1vZGU9OnJlbCkgIyBpPTAsLi4u # Lg0KICAgIHJmID0gKGkrMSkudG9fcw0KICAgIHJmID0gJyQnK3JmIGlmIG1v # ZGU9PTphYnMNCiAgICByZg0KICBlbmQNCiAgZGVmIHJlZihjbCxydyxtb2Rl # X2NsPTpyZWwsbW9kZV9ydz06cmVsKQ0KICAgIGNvbF9yZWYoY2wsbW9kZV9j # bCkrcm93X3JlZihydyxtb2RlX3J3KQ0KICBlbmQNCiAgZGVmIHJyZWYocmYx # LHJmMikNCiAgICAiI3tyZjF9OiN7cmYyfSINCiAgZW5kDQogIGRlZiBjb2xf # aW5kZXgocmYpDQogICAgcmYgPSByZlsxLi4tMV0gaWYgcmZbMCwxXT09JyQn # DQogICAgaSA9IDANCiAgICB3aGlsZSByZiAmJiByZi5zaXplPjANCiAgICAg # IGkgKj0gQEBjb2xfYmFzZQ0KICAgICAgaSArPSBAQGNvbF9kaWdpdHMuaW5k # ZXgocmZbMCwxXSkrMQ0KICAgICAgcmYgPSByZlsxLi4tMV0NCiAgICBlbmQN # CiAgICBpLTENCiAgZW5kDQogIGRlZiByb3dfaW5kZXgocmYpDQogICAgcmYg # PSByZlsxLi4tMV0gaWYgcmZbMCwxXT09JyQnDQogICAgaSA9IDANCiAgICBp # ZiByZg0KICAgICAgaSA9IHJmLnRvX2ktMQ0KICAgIGVuZA0KICAgIGkNCiAg # ZW5kDQogIGRlZiBwYXJzZV9yZWYocmYpDQogICAgc2hlZXQgPSBuaWwNCiAg # ICByb3cxID0gY29sMSA9IG5pbA0KICAgIHJvdzFfbW9kZSA9IGNvbDFfbW9k # ZSA9IG5pbA0KICAgIHJvdzIgPSBjb2wyID0gbmlsDQogICAgcm93Ml9tb2Rl # ID0gY29sMl9tb2RlID0gbmlsDQogICAgbWQgPSAvXEEoPzooLispISk/KFwk # PykoW0EtWl0rKShcJD8pKFxkKykoPzo6KFwkPykoW0EtWl0rKShcJD8pKFxk # KykpP1xaLy5tYXRjaChyZikNCiAgICBpZiBtZA0KICAgICAgc2hlZXQgPSBt # ZFsxXQ0KICAgICAgY29sMV9tb2RlID0gbWRbMl09PSckJyA/IDphYnMgOiA6 # cmVsDQogICAgICBjb2wxID0gY29sX2luZGV4KG1kWzNdKQ0KICAgICAgcm93 # MV9tb2RlID0gbWRbNF09PSckJyA/IDphYnMgOiA6cmVsDQogICAgICByb3cx # ID0gcm93X2luZGV4KG1kWzVdKQ0KICAgICAgaWYgbWRbN10NCiAgICAgICAg # Y29sMl9tb2RlID0gbWRbNl09PSckJyA/IDphYnMgOiA6cmVsDQogICAgICAg # IGNvbDIgPSBjb2xfaW5kZXgobWRbN10pDQogICAgICAgIHJvdzJfbW9kZSA9 # IG1kWzhdPT0nJCcgPyA6YWJzIDogOnJlbA0KICAgICAgICByb3cyID0gcm93 # X2luZGV4KG1kWzldKQ0KICAgICAgZW5kDQogICAgZW5kDQogICAgW3NoZWV0 # LCBjb2wxLCByb3cxLCBjb2wxX21vZGUsIHJvdzFfbW9kZSwgY29sMiwgcm93 # MiwgY29sMl9tb2RlLCByb3cyX21vZGVdICAgIA0KICBlbmQNCiAgDQplbmQN # CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXAvZ29pL3ppcHgucmIAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTAwNjY2IAAgICAg # IDAgACAgICAgMCAAICAgICAgIDc1NDMgMTA2NzI1NjYzNzMgIDEyMjUyACAw # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAHVzdGFyICAAdXNlcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAABncm91cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMgcnVi # eXppcCBleHRlbnNpb25zDQoNCiMgQ29weXJpZ2h0IChDKSAyMDA0NSwgSmF2 # aWVyIEdvaXp1ZXRhIDxqYXZpZXJAZ29penVldGEuaW5mbz4NCiMNCiMgVGhp # cyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli # dXRlIGl0IGFuZC9vcg0KIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m # IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KIyBhcyBwdWJsaXNo # ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl # cnNpb24gMg0KIyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u # KSBhbnkgbGF0ZXIgdmVyc2lvbi4NCg0KcmVxdWlyZSAncnVieWdlbXMnDQpy # ZXF1aXJlICd6aXAvemlwJw0KcmVxdWlyZSAnemlwL3ppcGZpbGVzeXN0ZW0n # DQpyZXF1aXJlICdmaWxldXRpbHMnDQpyZXF1aXJlICdnb2kvdG9vbHMnDQoN # CmlmIDo6VkVSU0lPTj09IjEuOC4yIiB8fCA6OlZFUlNJT049PSIxLjguNCIg # fHwgOjpWRVJTSU9OPT0iMS44LjUiIHx8IDo6VkVSU0lPTj09IjEuOC42Ig0K # bW9kdWxlIFppcA0KICBjbGFzcyBaaXBPdXRwdXRTdHJlYW0NCiAgICBkZWYg # cHV0X25leHRfZW50cnkoZW50cnksIGxldmVsID0gWmxpYjo6REVGQVVMVF9D # T01QUkVTU0lPTikNCiAgICAgIHJhaXNlIFppcEVycm9yLCAiemlwIHN0cmVh # bSBpcyBjbG9zZWQiIGlmIEBjbG9zZWQNCiAgICAgIG5ld0VudHJ5ID0gZW50 # cnkua2luZF9vZj8oWmlwRW50cnkpID8gZW50cnkgOiAgKGVudHJ5LnJlc3Bv # bmRfdG8/KDpfX2dldG9ial9fKSA/IGVudHJ5Ll9fZ2V0b2JqX18gOiBaaXBF # bnRyeS5uZXcoQGZpbGVOYW1lLCBlbnRyeS50b19zKSkgICAgICANCiAgICAg # IGluaXRfbmV4dF9lbnRyeShuZXdFbnRyeSkNCiAgICAgIEBjdXJyZW50RW50 # cnk9bmV3RW50cnkNCiAgICBlbmQNCiAgZW5kDQogIGNsYXNzIFppcEVudHJ5 # DQogICAgZGVmIHRpbWUNCiAgICAgIGlmIEBleHRyYVsiVW5pdmVyc2FsVGlt # ZSJdICAmJiBAZXh0cmFbIlVuaXZlcnNhbFRpbWUiXS5tdGltZQ0KICAgICAg # ICBAZXh0cmFbIlVuaXZlcnNhbFRpbWUiXS5tdGltZQ0KICAgICAgZWxzZQ0K # ICAgICAgICBAdGltZQ0KICAgICAgZW5kDQogICAgZW5kDQogICAgZGVmIG10 # aW1lDQogICAgICBzZWxmLnRpbWUNCiAgICBlbmQNCiAgZW5kDQplbmQNCmVu # ZA0KDQppZiA6OlZFUlNJT049PSIxLjguMiIgfHwgOjpWRVJTSU9OPT0iMS44 # LjQiIHx8IDo6VkVSU0lPTj09IjEuOC41IiB8fCA6OlZFUlNJT049PSIxLjgu # NiINCm1vZHVsZSBaaXANCiAgY2xhc3MgWmlwRXh0cmFGaWVsZA0KICAgIGNs # YXNzIFVuaXZlcnNhbFRpbWUNCiAgICAgIGRlZiBwYWNrX2Zvcl9sb2NhbA0K # ICAgICAgICBzID0gW0BmbGFnIHx8IDBdLnBhY2soIkMiKQ0KICAgICAgICBA # ZmxhZyAmIDEgIT0gMCBhbmQgcyA8PCBbQG10aW1lLnRvX2ldLnBhY2soIlYi # KQ0KICAgICAgICBAZmxhZyAmIDIgIT0gMCBhbmQgcyA8PCBbQGF0aW1lLnRv # X2ldLnBhY2soIlYiKQ0KICAgICAgICBAZmxhZyAmIDQgIT0gMCBhbmQgcyA8 # PCBbQGN0aW1lLnRvX2ldLnBhY2soIlYiKQ0KICAgICAgICBzDQogICAgICBl # bmQNCg0KICAgICAgZGVmIHBhY2tfZm9yX2NfZGlyDQogICAgICAgIHMgPSBb # QGZsYWcgfHwgMF0ucGFjaygiQyIpDQogICAgICAgIEBmbGFnICYgMSA9PSAx # IGFuZCBzIDw8IFtAbXRpbWUudG9faV0ucGFjaygiViIpDQogICAgICAgIHMN # CiAgICAgIGVuZA0KICAgIGVuZCAgDQogIGVuZA0KZW5kDQplbmQNCg0KbW9k # dWxlIEdvaQ0KICBtb2R1bGVfZnVuY3Rpb24NCiAgDQogICNaaXAgYSBkaXJl # Y3RvcnkgKHBhdGgpIGludG8gYSB6aXAgZmlsZSAoemlwZmlsZSkNCiAgI3dp # dGggb3B0aW9uczoNCiAgIyAtIDpub3ppcHMgZXhjbHVkZSAuemlwIGZpbGVz # IChkZWZhdWx0IGlzIGZhbHNlKQ0KICAjIC0gOmJhc2UgaW5jbHVkZSB0aGUg # YmFzZSBkaXJlY3RvcnkgbmFtZSBpbiB0aGUgemlwIGVudHJpZXMgKGRlZmF1 # bHQgaXMgZmFsc2UpDQogICMgLSBpZiBhIGJsb2NrIGlzIHBhc3NlZCBpdCBp # cyB1c2VkIGZpbHRlciB3aGljaCBmaWxlcyB0byB6aXANCiAgZGVmIHppcF9k # aXIocGF0aCwgemlwZmlsZSwgb3B0aW9ucz17fSkgIA0KICAgIGV4Y2x1ZGVf # emlwcz1vcHQob3B0aW9uc1s6bm96aXBzXSxmYWxzZSkNCiAgICBpbmNsdWRl # X2Jhc2U9b3B0KG9wdGlvbnNbOmJhc2VdLGZhbHNlKQ0KICAgIG5vX3RpbWVz # ID1vcHQob3B0aW9uc1s6bm9fdGltZXNdLGZhbHNlKQ0KICAgIA0KICAgIGJh # c2UgPSBGaWxlLmV4cGFuZF9wYXRoKHBhdGgpDQogICAgI3B1dHMgYmFzZQ0K # ICAgIGJhc2UgPSBGaWxlLmRpcm5hbWUoYmFzZSkgaWYgaW5jbHVkZV9iYXNl # DQogICAgI3B1dHMgYmFzZQ0KICAgIA0KICAgIEZpbGUuZGVsZXRlIHppcGZp # bGUgaWYgRmlsZS5leGlzdD8oemlwZmlsZSkNCiAgICBwYXR0ID0gRmlsZS5q # b2luIHBhdGgsICcqKi8qJw0KICAgIFppcDo6WmlwRmlsZS5vcGVuKHppcGZp # bGUsIFppcDo6WmlwRmlsZTo6Q1JFQVRFKSBkbyB8enB8DQogICAgICAgRGly # W3BhdHRdLmVhY2ggZG8gfGZufCANCiAgICAgICAgIG5leHQgaWYgZXhjbHVk # ZV96aXBzIGFuZCBmblstNC4uLTFdLmRvd25jYXNlPT0nLnppcCcNCiAgICAg # ICAgIG5leHQgaWYgRmlsZS5leHBhbmRfcGF0aCh6aXBmaWxlKS5kb3duY2Fz # ZSA9PSBGaWxlLmV4cGFuZF9wYXRoKGZuLHBhdGgpLmRvd25jYXNlDQogICAg # ICAgICBuZXh0IGlmIGJsb2NrX2dpdmVuPyAmJiAheWllbGQoRmlsZS5leHBh # bmRfcGF0aChmbixwYXRoKSkNCiAgICAgICAgIGVudHJ5ID0gcmVsYXRpdmVf # cGF0aChmbiwgYmFzZSkgICAgICAgDQogICAgICAgICBpZiBGaWxlLmRpcmVj # dG9yeT8oZm4pDQogICAgICAgICAgIHpwLm1rZGlyIGVudHJ5DQogICAgICAg # ICAgIHpwLmZpbGUudXRpbWUoRmlsZS5tdGltZShmbiksIGVudHJ5KSB1bmxl # c3Mgbm9fdGltZXMNCiAgICAgICAgIGVsc2UNCiAgICAgICAgICAgenAuYWRk # IGVudHJ5LCBmbg0KICAgICAgICAgICB6cC5maWxlLnV0aW1lKEZpbGUubXRp # bWUoZm4pLCBlbnRyeSkgdW5sZXNzIG5vX3RpbWVzDQogICAgICAgICBlbmQN # CiAgICAgICBlbmQNCiAgICBlbmQNCiAgZW5kDQogIA0KICBkZWYgdW56aXBf # ZGlyKHppcGZpbGUsIHBhdGgsIG9wdGlvbnM9e30sICZvbmV4aXN0cykNCiAg # ICBub190aW1lcyA9b3B0KG9wdGlvbnNbOm5vX3RpbWVzXSxmYWxzZSkNCiAg # ICBGaWxlVXRpbHMubWtkaXJfcCBwYXRoDQogICAgWmlwOjpaaXBGaWxlLm9w # ZW4oemlwZmlsZSkgZG8gfHpwfCANCiAgICAgIHpwLmVhY2ggZG8gfGVudHJ5 # fA0KICAgICAgICBpZiBlbnRyeS5kaXJlY3Rvcnk/DQogICAgICAgICAgICBl # eHRfZm4gPSBGaWxlLmV4cGFuZF9wYXRoKGVudHJ5Lm5hbWUsIHBhdGgpDQog # ICAgICAgICAgICBGaWxlVXRpbHMubWtkaXJfcCBleHRfZm4NCiAgICAgICAg # ICAgIGJlZ2luDQogICAgICAgICAgICAgIEZpbGUudXRpbWUoZW50cnkubXRp # bWUsIGVudHJ5Lm10aW1lLCBleHRfZm4pIHVubGVzcyBub190aW1lcw0KICAg # ICAgICAgICAgcmVzY3VlIEVycm5vOjpFQUNDRVMNCiAgICAgICAgICAgICAg # IyAtLXV0aW1lIHByb2R1Y2VzIGEgcGVybWlzc2lvbiBlcnJvciBvbiBXaW5k # b3dzIDk4DQogICAgICAgICAgICBlbmQNCiAgICAgICAgZW5kDQogICAgICBl # bmQNCiAgICAgIHpwLmVhY2ggZG8gfGVudHJ5fA0KICAgICAgICBpZiBlbnRy # eS5maWxlPw0KICAgICAgICAgICBleHRfZm4gPSBGaWxlLmV4cGFuZF9wYXRo # KGVudHJ5Lm5hbWUsIHBhdGgpDQogICAgICAgICAgIHpwLmV4dHJhY3QgZW50 # cnkubmFtZSwgZXh0X2ZuLCAmb25leGlzdHMNCiAgICAgICAgICAgRmlsZS51 # dGltZShlbnRyeS5tdGltZSwgZW50cnkubXRpbWUsIGV4dF9mbikgdW5sZXNz # IG5vX3RpbWVzDQogICAgICAgIGVuZA0KICAgICAgZW5kDQogICAgZW5kICAN # CiAgZW5kDQogICAgDQplbmQNCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0bXAv # aW5pdC5yYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAMTAwNjY2IAAgICAgIDAgACAgICAgMCAAICAgICAgIDU3NzQgMTA2 # NzI1NjYzNzMgIDExNDUxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAdXNlcgAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABncm91cAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAA0KDQojIENvcHlyaWdodCAoQykgMjAwMy0yMDA1LCBK # YXZpZXIgR29penVldGEgPGphdmllckBnb2l6dWV0YS5pbmZvPg0KIw0KIyBU # aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry # aWJ1dGUgaXQgYW5kL29yDQojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg # b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlDQojIGFzIHB1Ymxp # c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg # dmVyc2lvbiAyDQojIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp # b24pIGFueSBsYXRlciB2ZXJzaW9uLg0KDQpyZXF1aXJlICdydWJ5Z2VtcycN # CnJlcXVpcmUgJ3JiY29uZmlnJw0KcmVxdWlyZSAnZmlsZXV0aWxzJw0KDQpi # ZWdpbg0KICByZXF1aXJlICd3aW4zMi9maWxlJw0KICBHT0lfV0lOMzJfRklM # RSA9IHRydWUNCiAgDQogICAgIyByZWRlZmluZSBGaWxlLmRpcm5hbWUNCiAg # ICAgZGVmIEZpbGUuZGlybmFtZShmaWxlKQ0KICAgICAgICBmcGF0aCA9IGZh # bHNlDQogICAgICAgIGZpbGUgPSBmaWxlLmR1cA0KICAgICAgICANCiAgICAg # ICAgaWYgZmlsZS5pbmNsdWRlPygnLycpDQogICAgICAgICAgIGZpbGUudHIh # KCcvJywgIlxcIikNCiAgICAgICAgICAgZnBhdGggPSB0cnVlDQogICAgICAg # IGVuZA0KICAgICAgICANCiAgICAgICAgaWYgUGF0aElzUm9vdChmaWxlKQ0K # ICAgICAgICAgICBmaWxlLnRyISgiXFwiLCAnLycpIGlmIGZwYXRoDQogICAg # ICAgICAgIHJldHVybiBmaWxlDQogICAgICAgIGVuZA0KICAgICAgICANCiAg # ICAgICAgUGF0aFJlbW92ZUZpbGVTcGVjKGZpbGUpDQogICAgICAgIGZpbGUg # PSBmaWxlLnNwbGl0KDAuY2hyKS5maXJzdCB8fCAiIg0KICAgICAgICBQYXRo # UmVtb3ZlQmFja3NsYXNoKGZpbGUpDQogICAgICAgIA0KICAgICAgICBmaWxl # LnRyISgiXFwiLCAnLycpIGlmIGZwYXRoDQogICAgICAgIGZpbGUgPSAiLiIg # aWYgZmlsZS5lbXB0eT8NCiAgICAgICAgZmlsZQ0KICAgICBlbmQgIA0KICAN # CiAgY2xhc3MgRmlsZVV0aWxzOjpFbnRyeV8NCiAgICAgIGRlZiBsc3RhdCEN # CiAgICAgICAgbHN0YXQoKQ0KICAgICAgcmVzY3VlIFN5c3RlbUNhbGxFcnJv # cixBcmd1bWVudEVycm9yDQogICAgICAgIG5pbA0KICAgICAgZW5kICANCiAg # ZW5kDQogIA0KcmVzY3VlIExvYWRFcnJvcg0KICBHT0lfV0lOMzJfRklMRSA9 # IGZhbHNlDQplbmQNCiANCg0KaW5jbHVkZSBDb25maWcNCg0Kc2l0ZWxpYmRp # ciA9IENPTkZJR1sic2l0ZWxpYmRpciJdDQoNCmZyb21fZGlyID0gRmlsZS5q # b2luKCdnb2knKQ0KdG9fZGlyID0gRmlsZS5qb2luKHNpdGVsaWJkaXIsJ2dv # aScpDQoNCg0KZGVmIGNvcHlfZmlsZXMoZnJvbV9kaXIsIHRvX2RpciwgaGlk # ZGVuPWZhbHNlLCAmYmxrKQ0KICBmcm9tX2RpciA9IEZpbGUuZXhwYW5kX3Bh # dGgoZnJvbV9kaXIpLmdzdWIoRmlsZTo6QUxUX1NFUEFSQVRPUixGaWxlOjpT # RVBBUkFUT1IpIGlmIEZpbGU6OkFMVF9TRVBBUkFUT1INCiAgdG9fZGlyID0g # RmlsZS5leHBhbmRfcGF0aCh0b19kaXIpLmdzdWIoRmlsZTo6QUxUX1NFUEFS # QVRPUixGaWxlOjpTRVBBUkFUT1IpIGlmIEZpbGU6OkFMVF9TRVBBUkFUT1IN # CiAgZmlsZXMgPSBEaXIuZ2xvYihGaWxlLmpvaW4oZnJvbV9kaXIsJyoqLyon # KSxoaWRkZW4gPyBGaWxlOjpGTk1fRE9UTUFUQ0ggOiAwKSAgDQogIERpcltm # cm9tX2RpcisiLyoqLyoiXS5lYWNoIGRvIHwgZnJvbV9maWxlbmFtZSB8DQog # ICAgbmV4dCBpZiBoaWRkZW4gJiYgWycuLicsJy4nXS5pbmNsdWRlPyhmcm9t # X2ZpbGVuYW1lKQ0KICAgIGlzX3dpbl9oaWRkZW4gPSBHT0lfV0lOMzJfRklM # RSAmJiBGaWxlLmhpZGRlbj8oZnJvbV9maWxlbmFtZSkNCiAgICBpc19oaWRk # ZW4gPSBpc193aW5faGlkZGVuIHx8IEZpbGUuYmFzZW5hbWUoZnJvbV9maWxl # bmFtZSlbMF09PT8uDQogICAgbmV4dCBpZiAhaGlkZGVuICYmIGlzX2hpZGRl # bg0KICAgIHRvX2ZpbGVuYW1lID0gZnJvbV9maWxlbmFtZS5zdWIoZnJvbV9k # aXIrIi8iLCB0b19kaXIrIi8iKTsNCiAgICBpZiBibG9ja19naXZlbj8gIyAh # YmxrLm5pbD8NCiAgICAgIGlmIGJsay5hcml0eT09Mg0KICAgICAgICB0b19m # aWxlbmFtZSA9IHlpZWxkKGZyb21fZmlsZW5hbWUsIHRvX2ZpbGVuYW1lKQ0K # ICAgICAgZWxzZQ0KICAgICAgICB0b19maWxlbmFtZSA9IHlpZWxkKHRvX2Zp # bGVuYW1lKQ0KICAgICAgZW5kDQogICAgZW5kDQogICAgbmV4dCBpZiB0b19m # aWxlbmFtZS5uaWw/DQogICAgaWYgRmlsZS5kaXJlY3Rvcnk/KGZyb21fZmls # ZW5hbWUpDQogICAgICBGaWxlVXRpbHMubWtkaXJfcCB0b19maWxlbmFtZQ0K # ICAgIGVsc2UNCiAgICAgIG5ld19kaXIgPSBGaWxlLmRpcm5hbWUodG9fZmls # ZW5hbWUpOw0KICAgICAgRmlsZVV0aWxzLm1rZGlyX3AgbmV3X2Rpcg0KICAg # ICAgaWYgIUZpbGUuZXhpc3RzPyh0b19maWxlbmFtZSkgb3IgIUZpbGVVdGls # cy5jbXAoZnJvbV9maWxlbmFtZSwgdG9fZmlsZW5hbWUpDQogICAgICAgIGlm # IGlzX3dpbl9oaWRkZW4NCiAgICAgICAgICBpZiBGaWxlLmV4aXN0cz8odG9f # ZmlsZW5hbWUpDQogICAgICAgICAgICAjIG92ZXJ3cml0dGVuIGhpZGRlbiBm # aWxlIGNhdXNlcyBlcnJvcg0KICAgICAgICAgICAgRmlsZS5vcGVuKHRvX2Zp # bGVuYW1lKXt8ZnwgZi5oaWRkZW49ZmFsc2V9DQogICAgICAgICAgZW5kDQog # ICAgICAgIGVuZA0KICAgICAgICBGaWxlVXRpbHMuY3AgZnJvbV9maWxlbmFt # ZSwgdG9fZmlsZW5hbWUsIDpwcmVzZXJ2ZT0+dHJ1ZQ0KICAgICAgICBpZiBp # c193aW5faGlkZGVuDQogICAgICAgICAgRmlsZS5vcGVuKHRvX2ZpbGVuYW1l # KXt8ZnwgZi5oaWRkZW49dHJ1ZX0NCiAgICAgICAgZW5kDQogICAgICBlbmQN # CiAgICBlbmQgICAgICAgIA0KICBlbmQgICAgDQplbmQNCg0KDQpiZWdpbg0K # ICAgY29weV9maWxlcyBmcm9tX2RpciwgdG9fZGlyDQpyZXNjdWUNCiAgIHB1 # dHMgIkVycm9yIGluc3RhbGxpbmcgZ29pdG9vbHM6IFsiICsgJCEgKyAiXSIN # CiAgIGV4aXQNCmVuZA0KDQpwdXRzICJnb2l0b29scyBoYXMgYmVlbiBzdWNj # ZXNzZnVsbHkgaW5zdGFsbGVkIg0KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA # AAAAAAAAAAAAAAAAAAAA