From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B830EC10F0E for ; Tue, 9 Apr 2019 09:16:27 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6C6DD20833 for ; Tue, 9 Apr 2019 09:16:27 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="l1DFL5kM" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6C6DD20833 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hDmrO-00046s-5l; Tue, 09 Apr 2019 09:16:06 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hDmrM-00046n-H2 for xen-devel@lists.xenproject.org; Tue, 09 Apr 2019 09:16:04 +0000 X-Inumbo-ID: 16bb7a9c-5aa8-11e9-92d7-bc764e045a96 Received: from mail-lf1-x141.google.com (unknown [2a00:1450:4864:20::141]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 16bb7a9c-5aa8-11e9-92d7-bc764e045a96; Tue, 09 Apr 2019 09:16:00 +0000 (UTC) Received: by mail-lf1-x141.google.com with SMTP id u17so2443885lfi.3 for ; Tue, 09 Apr 2019 02:16:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1e9Q3xDDvkLaUlEZgrPTaHD6OSGT6lk8rbjO6VgMirU=; b=l1DFL5kMMCNTUFZUF6NesNGifCHaIJ43QnJoZVoRP6IbgrqZwEuarwriuWi+yc4M1A sMoSPnvUKQKWvimu3Czb6LKkPgV526OewtwoXNXMpKp2YDAtGU97BJHbF0PlAJt6I5Xj oufVG79v6KEeruCBkHPBCrnxP0W6c+XPZme5QTPRJH5IOmCEM9OseUBD3rxq3ZVtMiIK fDpIBoutP9yXIW+pZEx4eBAQCGGHuvUft6ITFT10XmuzqBlCBnWtAlmFTNOzhernN71N +ZtNKe8LhkcdxhU3t0Zw8ZFSM1b/szGwzT9jBIHsYFuqWoeKhMBHF5JcjMyEDzhL6COw Twiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1e9Q3xDDvkLaUlEZgrPTaHD6OSGT6lk8rbjO6VgMirU=; b=mMGzwrH9sYxIR+xN38QWBRxW0taoIwtj5gPR16ZlPKMChOGDb3NyF+E3ZvYceK121X JIZ6ZvfxWZOYOJEWEOMJKBZw65uAsUXMJr9/vUuWeXsbNlOupVC2Bg0vVdsJOFmloQrZ njLdFQG7byYEFPUmI1XYgSUjy5rzfSfEPCA1DWA3THoN1kJrXdIdOXXdb3OvIX7sczyb wZDCseO2kq/k1TkFaQdCCV94E6keWB4UwNBnMLtOG29vuYArk75HlC7+U7yv8iKwOLdZ 2kCv8o0biuh1m0Zs3AFi9dtk2f+gfBMo2MtpCMjcUMadiMYE8cwvg+Y9giBGKdGgunwB 7icw== X-Gm-Message-State: APjAAAU9XNO7izRe0KH7/0/RVG9eecjLcdmh3MUJa9HOzdP0YnWILD9j QHLoiPGu5s2prgo0T43+GO3LLAWZ X-Google-Smtp-Source: APXvYqysbILON46IqasenPXEYZQoRxlIcxukNVKHyuVl7YJHJgAkM4NC9yF7jxTVmEesjTJxrG3SBA== X-Received: by 2002:ac2:44a9:: with SMTP id c9mr322006lfm.68.1554801357940; Tue, 09 Apr 2019 02:15:57 -0700 (PDT) Received: from a2k-HP-ProDesk-600-G2-SFF.kyiv.epam.com (ll-74.141.223.85.sovam.net.ua. [85.223.141.74]) by smtp.gmail.com with ESMTPSA id j10sm1592411lfc.56.2019.04.09.02.15.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 09 Apr 2019 02:15:56 -0700 (PDT) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, konrad.wilk@oracle.com, jgross@suse.com, hverkuil@xs4all.nl, boris.ostrovsky@oracle.com Date: Tue, 9 Apr 2019 12:15:46 +0300 Message-Id: <20190409091546.9606-1-andr2000@gmail.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Subject: [Xen-devel] [PATCH] xen/cameraif: add ABI for para-virtual camera X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: andr2000@gmail.com, Oleksandr Andrushchenko Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" RnJvbTogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVw YW0uY29tPgoKVGhpcyBpcyB0aGUgQUJJIGZvciB0aGUgdHdvIGhhbHZlcyBvZiBhIHBhcmEtdmly dHVhbGl6ZWQKY2FtZXJhIGRyaXZlciB3aGljaCBleHRlbmRzIFhlbidzIHJlYWNoIG11bHRpbWVk aWEgY2FwYWJpbGl0aWVzIGV2ZW4KZnVydGhlciBlbmFibGluZyBpdCBmb3IgdmlkZW8gY29uZmVy ZW5jaW5nLCBJbi1WZWhpY2xlIEluZm90YWlubWVudCwKaGlnaCBkZWZpbml0aW9uIG1hcHMgZXRj LgoKVGhlIGluaXRpYWwgZ29hbCBpcyB0byBzdXBwb3J0IG1vc3QgbmVlZGVkIGZ1bmN0aW9uYWxp dHkgd2l0aCB0aGUKZmluYWwgaWRlYSB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIGV4dGVuZCB0aGUg cHJvdG9jb2wgaWYgbmVlZCBiZToKCjEuIFByb3ZpZGUgbWVhbnMgZm9yIGJhc2UgdmlydHVhbCBk ZXZpY2UgY29uZmlndXJhdGlvbjoKIC0gcGl4ZWwgZm9ybWF0cwogLSByZXNvbHV0aW9ucwogLSBm cmFtZSByYXRlcwoyLiBTdXBwb3J0IGJhc2ljIGNhbWVyYSBjb250cm9sczoKIC0gY29udHJhc3QK IC0gYnJpZ2h0bmVzcwogLSBodWUKIC0gc2F0dXJhdGlvbgozLiBTdXBwb3J0IHN0cmVhbWluZyBj b250cm9sCgpTaWduZWQtb2ZmLWJ5OiBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbyA8b2xla3NhbmRy X2FuZHJ1c2hjaGVua29AZXBhbS5jb20+CkNjOiBKdWVyZ2VuIEdyb3NzIDxqZ3Jvc3NAc3VzZS5j b20+CkNjOiBLb25yYWQgUnplc3p1dGVrIFdpbGsgPGtvbnJhZC53aWxrQG9yYWNsZS5jb20+CkNj OiBIYW5zIFZlcmt1aWwgPGh2ZXJrdWlsQHhzNGFsbC5ubD4KLS0tCiBpbmNsdWRlL3hlbi9pbnRl cmZhY2UvaW8vY2FtZXJhaWYuaCB8IDEzNjUgKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAx IGZpbGUgY2hhbmdlZCwgMTM2NSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5j bHVkZS94ZW4vaW50ZXJmYWNlL2lvL2NhbWVyYWlmLmgKCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hl bi9pbnRlcmZhY2UvaW8vY2FtZXJhaWYuaCBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby9jYW1l cmFpZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uODYxOGFiMTg5 NDg5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL2NhbWVyYWlm LmgKQEAgLTAsMCArMSwxMzY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYW1lcmFp Zi5oCisgKgorICogVW5pZmllZCBjYW1lcmEgZGV2aWNlIEkvTyBpbnRlcmZhY2UgZm9yIFhlbiBn dWVzdCBPU2VzLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2Yg Y2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdh cmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0 bworICogZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5n IHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwg bWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogc2VsbCBj b3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUg U29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo aXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMg b3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZU V0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBF WFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBX QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICog QVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFN QUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05U UkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJ TkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgtMjAxOSBFUEFN IFN5c3RlbXMgSW5jLgorICoKKyAqIEF1dGhvcjogT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gPG9s ZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgorICovCisKKyNpZm5kZWYgX19YRU5fUFVC TElDX0lPX0NBTUVSQUlGX0hfXworI2RlZmluZSBfX1hFTl9QVUJMSUNfSU9fQ0FNRVJBSUZfSF9f CisKKyNpbmNsdWRlICJyaW5nLmgiCisjaW5jbHVkZSAiLi4vZ3JhbnRfdGFibGUuaCIKKworLyoK KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJv dG9jb2wgdmVyc2lvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisjZGVmaW5lIFhFTkNB TUVSQV9QUk9UT0NPTF9WRVJTSU9OCSIxIgorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor ICogICAgICAgICAgICAgICAgICBGZWF0dXJlIGFuZCBQYXJhbWV0ZXIgTmVnb3RpYXRpb24KKyAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGcm9udC0+YmFjayBub3RpZmljYXRpb25zOiB3 aGVuIGVucXVldWluZyBhIG5ldyByZXF1ZXN0LCBzZW5kaW5nIGEKKyAqIG5vdGlmaWNhdGlvbiBj YW4gYmUgbWFkZSBjb25kaXRpb25hbCBvbiB4ZW5jYW1lcmFfcmVxIChpLmUuLCB0aGUgZ2VuZXJp YworICogaG9sZC1vZmYgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IHRoZSByaW5nIG1hY3JvcykuIEJh Y2tlbmRzIG11c3Qgc2V0CisgKiB4ZW5jYW1lcmFfcmVxIGFwcHJvcHJpYXRlbHkgKGUuZy4sIHVz aW5nIFJJTkdfRklOQUxfQ0hFQ0tfRk9SX1JFUVVFU1RTKCkpLgorICoKKyAqIEJhY2stPmZyb250 IG5vdGlmaWNhdGlvbnM6IHdoZW4gZW5xdWV1aW5nIGEgbmV3IHJlc3BvbnNlLCBzZW5kaW5nIGEK KyAqIG5vdGlmaWNhdGlvbiBjYW4gYmUgbWFkZSBjb25kaXRpb25hbCBvbiB4ZW5jYW1lcmFfcmVz cCAoaS5lLiwgdGhlIGdlbmVyaWMKKyAqIGhvbGQtb2ZmIG1lY2hhbmlzbSBwcm92aWRlZCBieSB0 aGUgcmluZyBtYWNyb3MpLiBGcm9udGVuZHMgbXVzdCBzZXQKKyAqIHhlbmNhbWVyYV9yZXNwIGFw cHJvcHJpYXRlbHkgKGUuZy4sIHVzaW5nIFJJTkdfRklOQUxfQ0hFQ0tfRk9SX1JFU1BPTlNFUygp KS4KKyAqCisgKiBUaGUgdHdvIGhhbHZlcyBvZiBhIHBhcmEtdmlydHVhbCBjYW1lcmEgZHJpdmVy IHV0aWxpemUgbm9kZXMgd2l0aGluCisgKiBYZW5TdG9yZSB0byBjb21tdW5pY2F0ZSBjYXBhYmls aXRpZXMgYW5kIHRvIG5lZ290aWF0ZSBvcGVyYXRpbmcgcGFyYW1ldGVycy4KKyAqIFRoaXMgc2Vj dGlvbiBlbnVtZXJhdGVzIHRoZXNlIG5vZGVzIHdoaWNoIHJlc2lkZSBpbiB0aGUgcmVzcGVjdGl2 ZSBmcm9udCBhbmQKKyAqIGJhY2tlbmQgcG9ydGlvbnMgb2YgWGVuU3RvcmUsIGZvbGxvd2luZyB0 aGUgWGVuQnVzIGNvbnZlbnRpb24uCisgKgorICogQWxsIGRhdGEgaW4gWGVuU3RvcmUgaXMgc3Rv cmVkIGFzIHN0cmluZ3MuIE5vZGVzIHNwZWNpZnlpbmcgbnVtZXJpYworICogdmFsdWVzIGFyZSBl bmNvZGVkIGluIGRlY2ltYWwuIEludGVnZXIgdmFsdWUgcmFuZ2VzIGxpc3RlZCBiZWxvdyBhcmUK KyAqIGV4cHJlc3NlZCBhcyBmaXhlZCBzaXplZCBpbnRlZ2VyIHR5cGVzIGNhcGFibGUgb2Ygc3Rv cmluZyB0aGUgY29udmVyc2lvbgorICogb2YgYSBwcm9wZXJseSBmb3JtYXR0ZWQgbm9kZSBzdHJp bmcsIHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbi4KKyAqCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgY29uZmlndXJhdGlvbgorICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBiYWNrZW5k IGFuZCBmcm9udGVuZCBjb25maWd1cmF0aW9uOgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tIEJhY2tlbmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqCisgKiAvbG9jYWwvZG9tYWluLzAvYmFja2VuZC92Y2FtZXJhLzEvMC9mcm9udGVuZC1pZCA9 ICIxIgorICogL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQvdmNhbWVyYS8xLzAvZnJvbnRlbmQgPSAi L2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAiCisgKiAvbG9jYWwvZG9tYWluLzAvYmFj a2VuZC92Y2FtZXJhLzEvMC9zdGF0ZSA9ICI0IgorICogL2xvY2FsL2RvbWFpbi8wL2JhY2tlbmQv dmNhbWVyYS8xLzAvdmVyc2lvbnMgPSAiMSwyIgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tIEZyb250ZW5kIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAqCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9iYWNrZW5kLWlkID0gIjAi CisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9iYWNrZW5kID0gIi9sb2NhbC9k b21haW4vMC9iYWNrZW5kL3ZjYW1lcmEvMSIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNh bWVyYS8wL3N0YXRlID0gIjQiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC92 ZXJzaW9uID0gIjEiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMC9iZS1hbGxv YyA9ICIxIgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBEZXZpY2UgMCBjb25m aWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAvbG9jYWwvZG9tYWlu LzEvZGV2aWNlL3ZjYW1lcmEvMC9tYXgtYnVmZmVycyA9ICIzIgorICogL2xvY2FsL2RvbWFpbi8x L2RldmljZS92Y2FtZXJhLzAvY29udHJvbHMgPSAiY29udHJhc3QsaHVlIgorICogL2xvY2FsL2Rv bWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9ZVVlWLzY0MHg0ODAvZnJhbWUtcmF0ZXMg PSAiMzAvMSwxNS8xIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0 cy9ZVVlWLzE5MjB4MTA4MC9mcmFtZS1yYXRlcyA9ICIxNS8yIgorICogL2xvY2FsL2RvbWFpbi8x L2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9CR1JBLzY0MHg0ODAvZnJhbWUtcmF0ZXMgPSAiMTUv MSwxNS8yIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzAvZm9ybWF0cy9CR1JB LzEyMDB4NzIwL2ZyYW1lLXJhdGVzID0gIjE1LzIiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNl L3ZjYW1lcmEvMC91bmlxdWUtaWQgPSAiMCIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNh bWVyYS8wL3JlcS1yaW5nLXJlZiA9ICIyODMyIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92 Y2FtZXJhLzAvcmVxLWV2ZW50LWNoYW5uZWwgPSAiMTUiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2 aWNlL3ZjYW1lcmEvMC9ldnQtcmluZy1yZWYgPSAiMzg3IgorICogL2xvY2FsL2RvbWFpbi8xL2Rl dmljZS92Y2FtZXJhLzAvZXZ0LWV2ZW50LWNoYW5uZWwgPSAiMTYiCisgKgorICotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tIERldmljZSAxIGNvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorICoKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVyYS8xL21heC1i dWZmZXJzID0gIjgiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEvMS9jb250cm9s cyA9ICJicmlnaHRuZXNzLHNhdHVyYXRpb24saHVlIgorICogL2xvY2FsL2RvbWFpbi8xL2Rldmlj ZS92Y2FtZXJhLzEvZm9ybWF0cy9ZVVlWLzY0MHg0ODAvZnJhbWUtcmF0ZXMgPSAiMzAvMSwxNS8y IgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2FtZXJhLzEvZm9ybWF0cy9ZVVlWLzE5MjB4 MTA4MC9mcmFtZS1yYXRlcyA9ICIxNS8yIgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92Y2Ft ZXJhLzEvdW5pcXVlLWlkID0gIjEiCisgKiAvbG9jYWwvZG9tYWluLzEvZGV2aWNlL3ZjYW1lcmEv MS9yZXEtcmluZy1yZWYgPSAiMjgzMyIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2UvdmNhbWVy YS8xL3JlcS1ldmVudC1jaGFubmVsID0gIjE3IgorICogL2xvY2FsL2RvbWFpbi8xL2RldmljZS92 Y2FtZXJhLzEvZXZ0LXJpbmctcmVmID0gIjM4OCIKKyAqIC9sb2NhbC9kb21haW4vMS9kZXZpY2Uv dmNhbWVyYS8xL2V2dC1ldmVudC1jaGFubmVsID0gIjE4IgorICoKKyAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tlbmQgWGVuQnVzIE5vZGVz CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSBQcm90b2NvbCB2ZXJzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoK KyAqIHZlcnNpb25zCisgKiAgICAgIFZhbHVlczogICAgICAgICA8c3RyaW5nPgorICoKKyAqICAg ICAgTGlzdCBvZiBYRU5DQU1FUkFfTElTVF9TRVBBUkFUT1Igc2VwYXJhdGVkIHByb3RvY29sIHZl cnNpb25zIHN1cHBvcnRlZAorICogICAgICBieSB0aGUgYmFja2VuZC4gRm9yIGV4YW1wbGUgIjEs MiwzIi4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICBGcm9udGVuZCBYZW5CdXMgTm9kZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAq CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFkZHJlc3NpbmcgLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogZG9tLWlkCisgKiAgICAgIFZhbHVlczog ICAgICAgICA8dWludDE2X3Q+CisgKgorICogICAgICBEb21haW4gaWRlbnRpZmllci4KKyAqCisg KiBkZXYtaWQKKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDx1aW50MTZfdD4KKyAqCisgKiAgICAg IERldmljZSBpZGVudGlmaWVyLgorICoKKyAqICAgICAgL2xvY2FsL2RvbWFpbi88ZG9tLWlkPi9k ZXZpY2UvdmNhbWVyYS88ZGV2LWlkPi8uLi4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tIFByb3RvY29sIHZlcnNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg KgorICogdmVyc2lvbgorICogICAgICBWYWx1ZXM6ICAgICAgICAgPHN0cmluZz4KKyAqCisgKiAg ICAgIFByb3RvY29sIHZlcnNpb24sIGNob3NlbiBhbW9uZyB0aGUgb25lcyBzdXBwb3J0ZWQgYnkg dGhlIGJhY2tlbmQuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJhY2tlbmQgYnVm ZmVyIGFsbG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIGJlLWFsbG9j CisgKiAgICAgIFZhbHVlczogICAgICAgICAiMCIsICIxIgorICoKKyAqICAgICAgSWYgdmFsdWUg aXMgc2V0IHRvICIxIiwgdGhlbiBiYWNrZW5kIHdpbGwgYmUgdGhlIGJ1ZmZlcgorICogICAgICBw cm92aWRlci9hbGxvY2F0b3IgZm9yIHRoaXMgZG9tYWluIGR1cmluZyBYRU5DQU1FUkFfT1BfQlVG X0NSRUFURQorICogICAgICBvcGVyYXRpb24uCisgKiAgICAgIElmIHZhbHVlIGlzIG5vdCAiMSIg b3Igb21pdHRlZCBmcm9udGVuZCBtdXN0IGFsbG9jYXRlIGJ1ZmZlcnMgaXRzZWxmLgorICoKKyAq LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYW1lcmEgc2V0dGluZ3MgLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiB1bmlxdWUtaWQKKyAqICAgICAgVmFsdWVzOiAg ICAgICAgIDxzdHJpbmc+CisgKgorICogICAgICBBZnRlciBkZXZpY2UgaW5zdGFuY2UgaW5pdGlh bGl6YXRpb24gZWFjaCBjYW1lcmEgaXMgYXNzaWduZWQgYQorICogICAgICB1bmlxdWUgSUQsIHNv IGl0IGNhbiBiZSBpZGVudGlmaWVkIGJ5IHRoZSBiYWNrZW5kIGJ5IHRoaXMgSUQuCisgKiAgICAg IFRoaXMgY2FuIGJlIFVVSUQgb3Igc3VjaC4KKyAqCisgKiBtYXgtYnVmZmVycworICogICAgICBW YWx1ZXM6ICAgICAgICAgPHVpbnQ4X3Q+CisgKgorICogICAgICBNYXhpbXVtIG51bWJlciBvZiBj YW1lcmEgYnVmZmVycyB0aGlzIGZyb250ZW5kIG1heSB1c2UuCisgKgorICogY29udHJvbHMKKyAq ICAgICAgVmFsdWVzOiAgICAgICAgIDxsaXN0IG9mIHN0cmluZz4KKyAqCisgKiAgICAgIExpc3Qg b2Ygc3VwcG9ydGVkIGNhbWVyYSBjb250cm9scyBzZXBhcmF0ZWQgYnkgWEVOQ0FNRVJBX0xJU1Rf U0VQQVJBVE9SLgorICogICAgICBDYW1lcmEgY29udHJvbHMgYXJlIGV4cHJlc3NlZCBhcyBhIGxp c3Qgb2Ygc3RyaW5nIHZhbHVlcyB3L28gYW55CisgKiAgICAgIG9yZGVyaW5nIHJlcXVpcmVtZW50 LgorICoKKyAqIGZvcm1hdHMKKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxmb3JtYXQsIGNoYXJb N10+CisgKgorICogICAgICBGb3JtYXRzIGFyZSBvcmdhbml6ZWQgYXMgYSBzZXQgb2YgZGlyZWN0 b3JpZXMgb25lIHBlciBlYWNoCisgKiAgICAgIHN1cHBvcnRlZCBwaXhlbCBmb3JtYXQuIFRoZSBu YW1lIG9mIHRoZSBkaXJlY3RvcnkgaXMgdGhlCisgKiAgICAgIGNvcnJlc3BvbmRpbmcgRk9VUkND IHN0cmluZyBsYWJlbC4gVGhlIG5leHQgbGV2ZWwgb2YKKyAqICAgICAgdGhlIGRpcmVjdG9yeSB1 bmRlciA8Zm9ybWF0cz4gcmVwcmVzZW50cyBzdXBwb3J0ZWQgcmVzb2x1dGlvbnMuCisgKiAgICAg IElmIHRoZSBmb3JtYXQgcmVwcmVzZW50cyBhIGJpZy1lbmRpYW4gdmFyaWFudCBvZiBhIGxpdHRs ZQorICogICAgICBlbmRpYW4gZm9ybWF0LCB0aGVuIHRoZSAiLUJFIiBzdWZmaXggbXVzdCBiZSBh ZGRlZC4gRS5nLiAnQVIxNScgdnMKKyAqICAgICAgJ0FSMTUtQkUnLgorICogICAgICBJZiBGT1VS Q0Mgc3RyaW5nIGxhYmVsIGhhcyBzcGFjZXMgdGhlbiB0aG9zZSBhcmUgb25seSBhbGxvd2VkIHRv CisgKiAgICAgIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGxhYmVsIGFuZCBtdXN0IGJlIHRyaW1tZWQs IGZvciBleGFtcGxlCisgKiAgICAgICdZMTYnIGFuZCAnWTE2LUJFJyB3aWxsIGJlIHRyaW1tZWQu CisgKgorICogcmVzb2x1dGlvbgorICogICAgICBWYWx1ZXM6ICAgICAgICAgPHdpZHRoLCB1aW50 MzJfdD54PGhlaWdodCwgdWludDMyX3Q+CisgKgorICogICAgICBSZXNvbHV0aW9ucyBhcmUgb3Jn YW5pemVkIGFzIGEgc2V0IG9mIGRpcmVjdG9yaWVzIG9uZSBwZXIgZWFjaAorICogICAgICBzdXBw b3J0ZWQgcmVzb2x1dGlvbiB1bmRlciBjb3JyZXNwb25kaW5nIDxmb3JtYXRzPiBkaXJlY3Rvcnku CisgKiAgICAgIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgaXMgdGhlIHN1cHBvcnRlZCB3aWR0 aCBhbmQgaGVpZ2h0CisgKiAgICAgIG9mIHRoZSBjYW1lcmEgcmVzb2x1dGlvbiBpbiBwaXhlbHMu CisgKgorICogZnJhbWUtcmF0ZXMKKyAqICAgICAgVmFsdWVzOiAgICAgICAgIDxudW1lcmF0b3Is IHVpbnQzMl90Pi88ZGVub21pbmF0b3IsIHVpbnQzMl90PgorICoKKyAqICAgICAgTGlzdCBvZiBY RU5DQU1FUkFfRlJBTUVfUkFURV9TRVBBUkFUT1Igc2VwYXJhdGVkIHN1cHBvcnRlZCBmcmFtZSBy YXRlcworICogICAgICBvZiB0aGUgY2FtZXJhIGV4cHJlc3NlZCBhcyBudW1lcmF0b3IgYW5kIGRl bm9taW5hdG9yIG9mIHRoZQorICogICAgICBjb3JyZXNwb25kaW5nIGZyYW1lIHJhdGUuCisgKgor ICotLS0tLS0tLS0tLS0tLS0tLS0tIENhbWVyYSBSZXF1ZXN0IFRyYW5zcG9ydCBQYXJhbWV0ZXJz IC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIFRoaXMgY29tbXVuaWNhdGlvbiBwYXRoIGlz IHVzZWQgdG8gZGVsaXZlciByZXF1ZXN0cyBmcm9tIGZyb250ZW5kIHRvIGJhY2tlbmQKKyAqIGFu ZCBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2VzIGZyb20gYmFja2VuZCB0byBmcm9udGVu ZCwKKyAqIHNldCB1cCBwZXIgdmlydHVhbCBjYW1lcmEgZGV2aWNlLgorICoKKyAqIHJlcS1ldmVu dC1jaGFubmVsCisgKiAgICAgIFZhbHVlczogICAgICAgICA8dWludDMyX3Q+CisgKgorICogICAg ICBUaGUgaWRlbnRpZmllciBvZiB0aGUgWGVuIGNhbWVyYSdzIGNvbnRyb2wgZXZlbnQgY2hhbm5l bAorICogICAgICB1c2VkIHRvIHNpZ25hbCBhY3Rpdml0eSBpbiB0aGUgcmluZyBidWZmZXIuCisg KgorICogcmVxLXJpbmctcmVmCisgKiAgICAgIFZhbHVlczogICAgICAgICA8dWludDMyX3Q+Cisg KgorICogICAgICBUaGUgWGVuIGdyYW50IHJlZmVyZW5jZSBncmFudGluZyBwZXJtaXNzaW9uIGZv ciB0aGUgYmFja2VuZCB0byBtYXAKKyAqICAgICAgYSBzb2xlIHBhZ2Ugb2YgY2FtZXJhJ3MgY29u dHJvbCByaW5nIGJ1ZmZlci4KKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tIENhbWVyYSBFdmVu dCBUcmFuc3BvcnQgUGFyYW1ldGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogVGhp cyBjb21tdW5pY2F0aW9uIHBhdGggaXMgdXNlZCB0byBkZWxpdmVyIGFzeW5jaHJvbm91cyBldmVu dHMgZnJvbSBiYWNrZW5kCisgKiB0byBmcm9udGVuZCwgc2V0IHVwIHBlciB2aXJ0dWFsIGNhbWVy YSBkZXZpY2UuCisgKgorICogZXZ0LWV2ZW50LWNoYW5uZWwKKyAqICAgICAgVmFsdWVzOiAgICAg ICAgIDx1aW50MzJfdD4KKyAqCisgKiAgICAgIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBYZW4gY2Ft ZXJhJ3MgZXZlbnQgY2hhbm5lbAorICogICAgICB1c2VkIHRvIHNpZ25hbCBhY3Rpdml0eSBpbiB0 aGUgcmluZyBidWZmZXIuCisgKgorICogZXZ0LXJpbmctcmVmCisgKiAgICAgIFZhbHVlczogICAg ICAgICA8dWludDMyX3Q+CisgKgorICogICAgICBUaGUgWGVuIGdyYW50IHJlZmVyZW5jZSBncmFu dGluZyBwZXJtaXNzaW9uIGZvciB0aGUgYmFja2VuZCB0byBtYXAKKyAqICAgICAgYSBzb2xlIHBh Z2Ugb2YgY2FtZXJhJ3MgZXZlbnQgcmluZyBidWZmZXIuCisgKi8KKworLyoKKyAqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRFIERJQUdS QU1TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVG9vbCBzdGFjayBjcmVhdGVzIGZy b250IGFuZCBiYWNrIHN0YXRlIG5vZGVzIHdpdGggaW5pdGlhbCBzdGF0ZQorICogWGVuYnVzU3Rh dGVJbml0aWFsaXNpbmcuCisgKiBUb29sIHN0YWNrIGNyZWF0ZXMgYW5kIHNldHMgdXAgZnJvbnRl bmQgY2FtZXJhIGNvbmZpZ3VyYXRpb24KKyAqIG5vZGVzIHBlciBkb21haW4uCisgKgorICotLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOb3JtYWwgZmxvdyAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEZyb250ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBCYWNrCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gICAgPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogWGVuYnVzU3RhdGVJbml0aWFsaXNp bmcgICAgICAgICAgICAgIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5nCisgKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIG8gUXVlcnkgYmFja2VuZCBkZXZpY2UgaWRlbnRpZmlj YXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLgor ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvIE9wZW4gYW5kIHZhbGlk YXRlIGJhY2tlbmQgZGV2aWNlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgVgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1c1N0 YXRlSW5pdFdhaXQKKyAqCisgKiBvIFF1ZXJ5IGZyb250ZW5kIGNvbmZpZ3VyYXRpb24KKyAqIG8g QWxsb2NhdGUgYW5kIGluaXRpYWxpemUKKyAqICAgZXZlbnQgY2hhbm5lbHMgcGVyIGNvbmZpZ3Vy ZWQKKyAqICAgY2FtZXJhLgorICogbyBQdWJsaXNoIHRyYW5zcG9ydCBwYXJhbWV0ZXJzCisgKiAg IHRoYXQgd2lsbCBiZSBpbiBlZmZlY3QgZHVyaW5nCisgKiAgIHRoaXMgY29ubmVjdGlvbi4KKyAq ICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgIFYKKyAq IFhlbmJ1c1N0YXRlSW5pdGlhbGlzZWQKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIG8gUXVlcnkgZnJvbnRlbmQgdHJhbnNwb3J0IHBhcmFtZXRlcnMuCisgKiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gQ29ubmVjdCB0byB0aGUgZXZl bnQgY2hhbm5lbHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBW CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVuYnVzU3RhdGVDb25u ZWN0ZWQKKyAqCisgKiAgbyBDcmVhdGUgYW5kIGluaXRpYWxpemUgT1MKKyAqICAgIHZpcnR1YWwg Y2FtZXJhIGFzIHBlcgorICogICAgY29uZmlndXJhdGlvbi4KKyAqICAgICAgICAgICAgICB8Cisg KiAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAgIFYKKyAqIFhlbmJ1c1N0YXRlQ29ubmVj dGVkCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1c1N0 YXRlVW5rbm93bgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhlbmJ1 c1N0YXRlQ2xvc2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWGVu YnVzU3RhdGVDbG9zaW5nCisgKiBvIFJlbW92ZSB2aXJ0dWFsIGNhbWVyYSBkZXZpY2UKKyAqIG8g UmVtb3ZlIGV2ZW50IGNoYW5uZWxzCisgKiAgICAgICAgICAgICAgfAorICogICAgICAgICAgICAg IHwKKyAqICAgICAgICAgICAgICBWCisgKiBYZW5idXNTdGF0ZUNsb3NlZAorICoKKyAqLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWNvdmVyeSBmbG93IC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJbiBjYXNlIG9mIGZyb250ZW5kIHVucmVjb3ZlcmFibGUg ZXJyb3JzIGJhY2tlbmQgaGFuZGxlcyB0aGF0IGFzCisgKiBpZiBmcm9udGVuZCBnb2VzIGludG8g dGhlIFhlbmJ1c1N0YXRlQ2xvc2VkIHN0YXRlLgorICoKKyAqIEluIGNhc2Ugb2YgYmFja2VuZCB1 bnJlY292ZXJhYmxlIGVycm9ycyBmcm9udGVuZCB0cmllcyByZW1vdmluZworICogdGhlIHZpcnR1 YWxpemVkIGRldmljZS4gSWYgdGhpcyBpcyBwb3NzaWJsZSBhdCB0aGUgbW9tZW50IG9mIGVycm9y LAorICogdGhlbiBmcm9udGVuZCBnb2VzIGludG8gdGhlIFhlbmJ1c1N0YXRlSW5pdGlhbGlzaW5n IHN0YXRlIGFuZCBpcyByZWFkeSBmb3IKKyAqIG5ldyBjb25uZWN0aW9uIHdpdGggYmFja2VuZC4g SWYgdGhlIHZpcnR1YWxpemVkIGRldmljZSBpcyBzdGlsbCBpbiB1c2UgYW5kCisgKiBjYW5ub3Qg YmUgcmVtb3ZlZCwgdGhlbiBmcm9udGVuZCBnb2VzIGludG8gdGhlIFhlbmJ1c1N0YXRlUmVjb25m aWd1cmluZyBzdGF0ZQorICogdW50aWwgZWl0aGVyIHRoZSB2aXJ0dWFsaXplZCBkZXZpY2UgaXMg cmVtb3ZlZCBvciBiYWNrZW5kIGluaXRpYXRlcyBhIG5ldworICogY29ubmVjdGlvbi4gT24gdGhl IHZpcnR1YWxpemVkIGRldmljZSByZW1vdmFsIGZyb250ZW5kIGdvZXMgaW50byB0aGUKKyAqIFhl bmJ1c1N0YXRlSW5pdGlhbGlzaW5nIHN0YXRlLgorICoKKyAqIE5vdGUgb24gWGVuYnVzU3RhdGVS ZWNvbmZpZ3VyaW5nIHN0YXRlIG9mIHRoZSBmcm9udGVuZDogaWYgYmFja2VuZCBoYXMKKyAqIHVu cmVjb3ZlcmFibGUgZXJyb3JzIHRoZW4gZnJvbnRlbmQgY2Fubm90IHNlbmQgcmVxdWVzdHMgdG8g dGhlIGJhY2tlbmQKKyAqIGFuZCB0aHVzIGNhbm5vdCBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgb2Yg dGhlIHZpcnR1YWxpemVkIGRldmljZSBhbnltb3JlLgorICogQWZ0ZXIgYmFja2VuZCBpcyBiYWNr IHRvIG5vcm1hbCB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlIG1heSBzdGlsbCBob2xkIHNvbWUKKyAq IHN0YXRlOiBjb25maWd1cmF0aW9uIGluIHVzZSwgYWxsb2NhdGVkIGJ1ZmZlcnMsIGNsaWVudCBh cHBsaWNhdGlvbiBzdGF0ZSBldGMuCisgKiBJbiBtb3N0IGNhc2VzLCB0aGlzIHdpbGwgcmVxdWly ZSBmcm9udGVuZCB0byBpbXBsZW1lbnQgY29tcGxleCByZWNvdmVyeQorICogcmVjb25uZWN0IGxv Z2ljLiBJbnN0ZWFkLCBieSBnb2luZyBpbnRvIFhlbmJ1c1N0YXRlUmVjb25maWd1cmluZyBzdGF0 ZSwKKyAqIGZyb250ZW5kIHdpbGwgbWFrZSBzdXJlIG5vIG5ldyBjbGllbnRzIG9mIHRoZSB2aXJ0 dWFsaXplZCBkZXZpY2UgYXJlCisgKiBhY2NlcHRlZCwgYWxsb3cgZXhpc3RpbmcgY2xpZW50KHMp IHRvIGV4aXQgZ3JhY2VmdWxseSBieSBzaWduYWxpbmcgZXJyb3IKKyAqIHN0YXRlIGV0Yy4KKyAq IE9uY2UgYWxsIHRoZSBjbGllbnRzIGFyZSBnb25lIGZyb250ZW5kIGNhbiByZWluaXRpYWxpemUg dGhlIHZpcnR1YWxpemVkCisgKiBkZXZpY2UgYW5kIGdldCBpbnRvIFhlbmJ1c1N0YXRlSW5pdGlh bGlzaW5nIHN0YXRlIGFnYWluIHNpZ25hbGluZyB0aGUKKyAqIGJhY2tlbmQgdGhhdCBhIG5ldyBj b25uZWN0aW9uIGNhbiBiZSBtYWRlLgorICoKKyAqIFRoZXJlIGFyZSBtdWx0aXBsZSBjb25kaXRp b25zIHBvc3NpYmxlIHVuZGVyIHdoaWNoIGZyb250ZW5kIHdpbGwgZ28gZnJvbQorICogWGVuYnVz U3RhdGVSZWNvbmZpZ3VyaW5nIGludG8gWGVuYnVzU3RhdGVJbml0aWFsaXNpbmcsIHNvbWUgb2Yg dGhlbSBhcmUgT1MKKyAqIHNwZWNpZmljLiBGb3IgZXhhbXBsZToKKyAqIDEuIFRoZSB1bmRlcmx5 aW5nIE9TIGZyYW1ld29yayBtYXkgcHJvdmlkZSBjYWxsYmFja3MgdG8gc2lnbmFsIHRoYXQgdGhl IGxhc3QKKyAqICAgIGNsaWVudCBvZiB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlIGhhcyBnb25lIGFu ZCB0aGUgZGV2aWNlIGNhbiBiZSByZW1vdmVkCisgKiAyLiBGcm9udGVuZCBjYW4gc2NoZWR1bGUg YSBkZWZlcnJlZCB3b3JrICh0aW1lci90YXNrbGV0L3dvcmtxdWV1ZSkKKyAqICAgIHRvIHBlcmlv ZGljYWxseSBjaGVjayBpZiB0aGlzIGlzIHRoZSByaWdodCB0aW1lIHRvIHJlLXRyeSByZW1vdmFs IG9mCisgKiAgICB0aGUgdmlydHVhbGl6ZWQgZGV2aWNlLgorICogMy4gQnkgYW55IG90aGVyIG1l YW5zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBSRVFVRVNUIENPREVTCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNkZWZp bmUgWEVOQ0FNRVJBX09QX0NPTkZJR19TRVQJCTB4MDAKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NP TkZJR19HRVQJCTB4MDEKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NPTkZJR19WQUxJREFURQkweDAy CisjZGVmaW5lIFhFTkNBTUVSQV9PUF9GUkFNRV9SQVRFX1NFVAkweDAzCisjZGVmaW5lIFhFTkNB TUVSQV9PUF9CVUZfR0VUX0xBWU9VVAkweDA0CisjZGVmaW5lIFhFTkNBTUVSQV9PUF9CVUZfUkVR VUVTVAkweDA1CisjZGVmaW5lIFhFTkNBTUVSQV9PUF9CVUZfQ1JFQVRFCQkweDA2CisjZGVmaW5l IFhFTkNBTUVSQV9PUF9CVUZfREVTVFJPWQkweDA3CisjZGVmaW5lIFhFTkNBTUVSQV9PUF9CVUZf UVVFVUUJCTB4MDgKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0JVRl9ERVFVRVVFCTB4MDkKKyNkZWZp bmUgWEVOQ0FNRVJBX09QX0NUUkxfRU5VTQkJMHgwYQorI2RlZmluZSBYRU5DQU1FUkFfT1BfQ1RS TF9TRVQJCTB4MGIKKyNkZWZpbmUgWEVOQ0FNRVJBX09QX0NUUkxfR0VUCQkweDBjCisjZGVmaW5l IFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RBUlQJMHgwZAorI2RlZmluZSBYRU5DQU1FUkFfT1BfU1RS RUFNX1NUT1AJMHgwZQorCisjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0JSSUdIVE5FU1MJMAorI2Rl ZmluZSBYRU5DQU1FUkFfQ1RSTF9DT05UUkFTVAkJMQorI2RlZmluZSBYRU5DQU1FUkFfQ1RSTF9T QVRVUkFUSU9OCTIKKyNkZWZpbmUgWEVOQ0FNRVJBX0NUUkxfSFVFCQkzCisKKy8qIE51bWJlciBv ZiBzdXBwb3J0ZWQgY29udHJvbHMuICovCisjZGVmaW5lIFhFTkNBTUVSQV9NQVhfQ1RSTAkJNAor CisvKiBDb250cm9sIGlzIHJlYWQtb25seS4gKi8KKyNkZWZpbmUgWEVOQ0FNRVJBX0NUUkxfRkxH X1JPCQkoMSA8PCAwKQorLyogQ29udHJvbCBpcyB3cml0ZS1vbmx5LiAqLworI2RlZmluZSBYRU5D QU1FUkFfQ1RSTF9GTEdfV08JCSgxIDw8IDEpCisvKiBDb250cm9sJ3MgdmFsdWUgaXMgdm9sYXRp bGUuICovCisjZGVmaW5lIFhFTkNBTUVSQV9DVFJMX0ZMR19WT0xBVElMRQkoMSA8PCAyKQorCisv KiBTdXBwb3J0ZWQgY29sb3Igc3BhY2VzLiAqLworI2RlZmluZSBYRU5DQU1FUkFfQ09MT1JTUEFD RV9ERUZBVUxUCTAKKyNkZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BBQ0VfU01QVEUxNzBNCTEKKyNk ZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BBQ0VfUkVDNzA5CTIKKyNkZWZpbmUgWEVOQ0FNRVJBX0NP TE9SU1BBQ0VfU1JHQgkzCisjZGVmaW5lIFhFTkNBTUVSQV9DT0xPUlNQQUNFX09QUkdCCTQKKyNk ZWZpbmUgWEVOQ0FNRVJBX0NPTE9SU1BBQ0VfQlQyMDIwCTUKKyNkZWZpbmUgWEVOQ0FNRVJBX0NP TE9SU1BBQ0VfRENJX1AzCTYKKworLyogQ29sb3Igc3BhY2UgdHJhbnNmZXIgZnVuY3Rpb24uICov CisjZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfREVGQVVMVAkwCisjZGVmaW5lIFhFTkNBTUVS QV9YRkVSX0ZVTkNfNzA5CQkxCisjZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfU1JHQgkyCisj ZGVmaW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfT1BSR0IJMworI2RlZmluZSBYRU5DQU1FUkFfWEZF Ul9GVU5DX05PTkUJNAorI2RlZmluZSBYRU5DQU1FUkFfWEZFUl9GVU5DX0RDSV9QMwk1CisjZGVm aW5lIFhFTkNBTUVSQV9YRkVSX0ZVTkNfU01QVEUyMDg0CTYKKworLyogQ29sb3Igc3BhY2UgWeKA mUNiQ3IgZW5jb2RpbmcuICovCisjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfSUdOT1JFCQkw CisjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfNjAxCQkJMQorI2RlZmluZSBYRU5DQU1FUkFf WUNCQ1JfRU5DXzcwOQkJCTIKKyNkZWZpbmUgWEVOQ0FNRVJBX1lDQkNSX0VOQ19YVjYwMQkJMwor I2RlZmluZSBYRU5DQU1FUkFfWUNCQ1JfRU5DX1hWNzA5CQk0CisjZGVmaW5lIFhFTkNBTUVSQV9Z Q0JDUl9FTkNfQlQyMDIwCQk1CisjZGVmaW5lIFhFTkNBTUVSQV9ZQ0JDUl9FTkNfQlQyMDIwX0NP TlNUX0xVTQk2CisKKy8qIFF1YW50aXphdGlvbiByYW5nZS4gKi8KKyNkZWZpbmUgWEVOQ0FNRVJB X1FVQU5USVpBVElPTl9ERUZBVUxUCQkwCisjZGVmaW5lIFhFTkNBTUVSQV9RVUFOVElaQVRJT05f RlVMTF9SQU5HRQkxCisjZGVmaW5lIFhFTkNBTUVSQV9RVUFOVElaQVRJT05fTElNX1JBTkdFCTIK KworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgRVZFTlQgQ09ERVMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2RlZmlu ZSBYRU5DQU1FUkFfRVZUX0ZSQU1FX0FWQUlMCTB4MDAKKyNkZWZpbmUgWEVOQ0FNRVJBX0VWVF9D VFJMX0NIQU5HRQkweDAxCisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAg ICAgICAgIFhFTlNUT1JFIEZJRUxEIEFORCBQQVRIIE5BTUUgU1RSSU5HUywgSEVMUEVSUworICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgorICovCisjZGVmaW5lIFhFTkNBTUVSQV9EUklWRVJfTkFNRQkJ InZjYW1lcmEiCisKKyNkZWZpbmUgWEVOQ0FNRVJBX0xJU1RfU0VQQVJBVE9SCSIsIgorI2RlZmlu ZSBYRU5DQU1FUkFfUkVTT0xVVElPTl9TRVBBUkFUT1IJIngiCisjZGVmaW5lIFhFTkNBTUVSQV9G UkFDVElPTl9TRVBBUkFUT1IJIi8iCisKKyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX0JFX1ZFUlNJ T05TCSJ2ZXJzaW9ucyIKKyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX0ZFX1ZFUlNJT04JInZlcnNp b24iCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9SRVFfUklOR19SRUYJInJlcS1yaW5nLXJlZiIK KyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX1JFUV9DSEFOTkVMCSJyZXEtZXZlbnQtY2hhbm5lbCIK KyNkZWZpbmUgWEVOQ0FNRVJBX0ZJRUxEX0VWVF9SSU5HX1JFRgkiZXZ0LXJpbmctcmVmIgorI2Rl ZmluZSBYRU5DQU1FUkFfRklFTERfRVZUX0NIQU5ORUwJImV2dC1ldmVudC1jaGFubmVsIgorI2Rl ZmluZSBYRU5DQU1FUkFfRklFTERfTUFYX0JVRkZFUlMJIm1heC1idWZmZXJzIgorI2RlZmluZSBY RU5DQU1FUkFfRklFTERfQ09OVFJPTFMJImNvbnRyb2xzIgorI2RlZmluZSBYRU5DQU1FUkFfRklF TERfRk9STUFUUwkJImZvcm1hdHMiCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9GUkFNRV9SQVRF UwkiZnJhbWUtcmF0ZXMiCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9CRV9BTExPQwkiYmUtYWxs b2MiCisjZGVmaW5lIFhFTkNBTUVSQV9GSUVMRF9VTklRVUVfSUQJInVuaXF1ZS1pZCIKKworI2Rl ZmluZSBYRU5DQU1FUkFfQ1RSTF9CUklHSFRORVNTX1NUUgkiYnJpZ2h0bmVzcyIKKyNkZWZpbmUg WEVOQ0FNRVJBX0NUUkxfQ09OVFJBU1RfU1RSCSJjb250cmFzdCIKKyNkZWZpbmUgWEVOQ0FNRVJB X0NUUkxfU0FUVVJBVElPTl9TVFIJInNhdHVyYXRpb24iCisjZGVmaW5lIFhFTkNBTUVSQV9DVFJM X0hVRV9TVFIJCSJodWUiCisKKyNkZWZpbmUgWEVOQ0FNRVJBX0ZPVVJDQ19CSUdFTkRJQU5fU1RS CSItQkUiCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlciBwbGFuZXMgc3VwcG9ydGVkLiAq LworI2RlZmluZSBYRU5DQU1FUkFfTUFYX1BMQU5FCQk0CisKKy8qCisgKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVFVTIFJFVFVSTiBDT0RFUwor ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFN0YXR1cyByZXR1cm4gY29kZSBpcyB6ZXJv IG9uIHN1Y2Nlc3MgYW5kIC1YRU5fRVhYIG9uIGZhaWx1cmUuCisgKgorICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9ucworICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgorICoKKyAqIC0gdXNhZ2Ugb2YgZ3JhbnQgcmVmZXJlbmNlIDAg YXMgaW52YWxpZCBncmFudCByZWZlcmVuY2U6CisgKiAgIGdyYW50IHJlZmVyZW5jZSAwIGlzIHZh bGlkLCBidXQgbmV2ZXIgZXhwb3NlZCB0byBhIFBWIGRyaXZlciwKKyAqICAgYmVjYXVzZSBvZiB0 aGUgZmFjdCBpdCBpcyBhbHJlYWR5IGluIHVzZS9yZXNlcnZlZCBieSB0aGUgUFYgY29uc29sZS4K KyAqIC0gYWxsIHJlZmVyZW5jZXMgaW4gdGhpcyBkb2N1bWVudCB0byBwYWdlIHNpemVzIG11c3Qg YmUgdHJlYXRlZAorICogICBhcyBwYWdlcyBvZiBzaXplIFhFTl9QQUdFX1NJWkUgdW5sZXNzIG90 aGVyd2lzZSBub3RlZC4KKyAqIC0gYWxsIEZPVVJDQyBtYXBwaW5ncyB1c2VkIGZvciBjb25maWd1 cmF0aW9uIGFuZCBtZXNzYWdpbmcgYXJlCisgKiAgIExpbnV4IFY0TDIgb25lczogaHR0cHM6Ly9n aXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMvbGludXguZ2l0 L3RyZWUvaW5jbHVkZS91YXBpL2xpbnV4L3ZpZGVvZGV2Mi5oCisgKiAgIHdpdGggdGhlIGZvbGxv d2luZyBleGNlcHRpb25zOgorICogICAgIC0gY2hhcmFjdGVycyBhcmUgYWxsb3dlZCBpbiBbMHgy MDsgMHg3Zl0gcmFuZ2UKKyAqICAgICAtIHdoZW4gdXNlZCBmb3IgWGVuU3RvcmUgY29uZmlndXJh dGlvbiBlbnRyaWVzIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgIGFyZSBub3QgYWxsb3dlZDoKKyAq ICAgICAgIC0gJy8nLCAnXCcsICcgJyAoc3BhY2UpLCAnPCcsICc+JywgJzonLCAnIicsICd8Jywg Jz8nLCAnKicKKyAqICAgICAgIC0gaWYgdHJhaWxpbmcgc3BhY2VzIGFyZSBwYXJ0IG9mIHRoZSBG T1VSQ0MgY29kZSB0aGVuIHRob3NlIG11c3QgYmUKKyAqICAgICAgICAgdHJpbW1lZAorICoKKyAq CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICBEZXNjcmlwdGlvbiBvZiB0aGUgcHJv dG9jb2wgYmV0d2VlbiBmcm9udGVuZCBhbmQgYmFja2VuZCBkcml2ZXIKKyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioKKyAqCisgKiBUaGUgdHdvIGhhbHZlcyBvZiBhIFBhcmEtdmlydHVhbCBjYW1lcmEg ZHJpdmVyIGNvbW11bmljYXRlIHdpdGgKKyAqIGVhY2ggb3RoZXIgdXNpbmcgc2hhcmVkIHBhZ2Vz IGFuZCBldmVudCBjaGFubmVscy4KKyAqIFNoYXJlZCBwYWdlIGNvbnRhaW5zIGEgcmluZyB3aXRo IHJlcXVlc3QvcmVzcG9uc2UgcGFja2V0cy4KKyAqCisgKiBBbGwgcmVzZXJ2ZWQgZmllbGRzIGlu IHRoZSBzdHJ1Y3R1cmVzIGJlbG93IG11c3QgYmUgMC4KKyAqCisgKiBGb3IgYWxsIHJlcXVlc3Qv cmVzcG9uc2UvZXZlbnQgcGFja2V0czoKKyAqICAgLSBmcmFtZSByYXRlIHBhcmFtZXRlciBpcyBy ZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgNCBvY3RldCBsb25nCisgKiAgICAgbnVtZXJhdG9yIGFu ZCBkZW5vbWluYXRvcjoKKyAqICAgICAgIC0gZnJhbWVfcmF0ZV9udW1lciAtIHVpbnQzMl90LCBu dW1lcmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUKKyAqICAgICAgIC0gZnJhbWVfcmF0ZV9kZW5vbSAt IHVpbnQzMl90LCBkZW5vbWluYXRvciBvZiB0aGUgZnJhbWUgcmF0ZQorICogICAgIFRoZSBjb3Jy ZXNwb25kaW5nIGZyYW1lIHJhdGUgKEh6KSBpcyBjYWxjdWxhdGVkIGFzOgorICogICAgICAgZnJh bWVfcmF0ZSA9IGZyYW1lX3JhdGVfbnVtZXIgLyBmcmFtZV9yYXRlX2Rlbm9tCisgKiAgIC0gYnVm ZmVyIGluZGV4IGlzIGEgemVybyBiYXNlZCBpbmRleCBvZiB0aGUgYnVmZmVyLiBNdXN0IGJlIGxl c3MgdGhhbgorICogICAgIHRoZSB2YWx1ZSBvZiBYRU5DQU1FUkFfT1BfQ09ORklHX1NFVC5udW1f YnVmcyByZXNwb25zZToKKyAqICAgICAgIC0gaW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0aGUg YnVmZmVyLgorICoKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVx dWVzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogQWxsIHJlcXVl c3QgcGFja2V0cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAoNjQgb2N0ZXRzKS4KKyAqIEFsbCByZXF1 ZXN0IHBhY2tldHMgaGF2ZSBjb21tb24gaGVhZGVyOgorICogICAgICAgICAwICAgICAgICAgICAg ICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCAgICBv cGVyYXRpb24gICB8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiAgIGlkIC0gdWludDE2X3QsIHByaXZhdGUg Z3Vlc3QgdmFsdWUsIGVjaG9lZCBpbiByZXNwb25zZS4KKyAqICAgb3BlcmF0aW9uIC0gdWludDhf dCwgb3BlcmF0aW9uIGNvZGUsIFhFTkNBTUVSQV9PUF9YWFguCisgKgorICoKKyAqIFJlcXVlc3Qg dG8gc2V0L3ZhbGlkYXRlIHRoZSBjb25maWd1cmF0aW9uIC0gcmVxdWVzdCB0byBzZXQgdGhlCisg KiBjb25maWd1cmF0aW9uL21vZGUgb2YgdGhlIGNhbWVyYSAoWEVOQ0FNRVJBX09QX0NPTkZJR19T RVQpIG9yIHRvCisgKiBjaGVjayBpZiB0aGUgY29uZmlndXJhdGlvbiBpcyB2YWxpZCBhbmQgY2Fu IGJlIHVzZWQKKyAqIChYRU5DQU1FUkFfT1BfQ09ORklHX1ZBTElEQVRFKToKKyAqICAgICAgICAg MCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAg ICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAg ICAgICAgIHwgX09QX0NPTkZJR19YWFggfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwaXhlbCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8 IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg d2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI0 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIHBpeGVsX2Zvcm1hdCAtIHVp bnQzMl90LCBwaXhlbCBmb3JtYXQgdG8gYmUgdXNlZCwgRk9VUkNDIGNvZGUuCisgKiB3aWR0aCAt IHVpbnQzMl90LCB3aWR0aCBpbiBwaXhlbHMuCisgKiBoZWlnaHQgLSB1aW50MzJfdCwgaGVpZ2h0 IGluIHBpeGVscy4KKyAqCisgKiBTZWUgcmVzcG9uc2UgZm9ybWF0IGZvciB0aGlzIHJlcXVlc3Qu CisgKgorICogTm90ZXM6CisgKiAgLSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gWEVOQ0FN RVJBX09QX0NPTkZJR19WQUxJREFURSBhbmQKKyAqICAgIFhFTkNBTUVSQV9PUF9DT05GSUdfU0VU IGlzIHRoYXQgdGhlIGZvcm1lciBkb2Vzbid0IGFjdHVhbGx5IGNoYW5nZQorICogICAgY2FtZXJh IGNvbmZpZ3VyYXRpb24sIGJ1dCBxdWVyaWVzIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIHZhbGlk LgorICogICAgVGhpcyBjYW4gYmUgdXNlZCB3aGlsZSBzdHJlYW0gaXMgYWN0aXZlIGFuZC9vciBi dWZmZXJzIGFsbG9jYXRlZC4KKyAqICAtIGZyb250ZW5kIG11c3QgY2hlY2sgdGhlIGNvcnJlc3Bv bmRpbmcgcmVzcG9uc2UgaW4gb3JkZXIgdG8gc2VlCisgKiAgICBpZiB0aGUgdmFsdWVzIHJlcG9y dGVkIGJhY2sgYnkgdGhlIGJhY2tlbmQgZG8gbWF0Y2ggdGhlIGRlc2lyZWQgb25lcworICogICAg YW5kIGNhbiBiZSBhY2NlcHRlZC4KKyAqICAtIGZyb250ZW5kIG1heSBzZW5kIG11bHRpcGxlIFhF TkNBTUVSQV9PUF9DT05GSUdfU0VUIHJlcXVlc3RzIGJlZm9yZQorICogICAgc2VuZGluZyBYRU5D QU1FUkFfT1BfU1RSRUFNX1NUQVJUIHJlcXVlc3QgdG8gdXBkYXRlIG9yIHR1bmUgdGhlCisgKiAg ICBmaW5hbCBzdHJlYW0gY29uZmlndXJhdGlvbi4KKyAqICAtIGNvbmZpZ3VyYXRpb24gY2Fubm90 IGJlIGNoYW5nZWQgZHVyaW5nIGFjdGl2ZSBzdHJlYW1pbmcsIGUuZy4KKyAqICAgIGFmdGVyIFhF TkNBTUVSQV9PUF9TVFJFQU1fU1RBUlQgYW5kIGJlZm9yZSBYRU5DQU1FUkFfT1BfU1RSRUFNX1NU T1AKKyAqICAgIHJlcXVlc3RzLgorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2NvbmZpZ19yZXEgewor CXVpbnQzMl90IHBpeGVsX2Zvcm1hdDsKKwl1aW50MzJfdCB3aWR0aDsKKwl1aW50MzJfdCBoZWln aHQ7Cit9OworCisvKgorICogUmVxdWVzdCBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNh bWVyYToKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAg ICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0NPTkZJR19HRVQgfCAgIHJlc2VydmVkICAg ICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKgorICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1 ZXN0LgorICoKKyAqCisgKiBSZXF1ZXN0IHRvIHNldCB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgc3Ry ZWFtOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAg ICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgaWQgICAgICAgICAgICAgICAgfCBfRlJBTUVfUkFURV9TRVR8ICAgcmVzZXJ2ZWQgICAg IHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9yYXRlX251bWVyICAgICAgICAg ICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgZnJhbWVfcmF0ZV9kZW5vbSAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqCisgKiBmcmFtZV9yYXRlX251bWVyIC0gdWludDMyX3QsIG51bWVyYXRv ciBvZiB0aGUgZnJhbWUgcmF0ZS4KKyAqIGZyYW1lX3JhdGVfZGVub20gLSB1aW50MzJfdCwgZGVu b21pbmF0b3Igb2YgdGhlIGZyYW1lIHJhdGUuCisgKgorICogTm90ZXM6CisgKiAgLSB0byBxdWVy eSB0aGUgY3VycmVudCAoYWN0dWFsKSBmcmFtZSByYXRlIHVzZSBYRU5DQU1FUkFfT1BfQ09ORklH X0dFVAorICogICAgcmVxdWVzdC4KKyAqICAtIHRoaXMgcmVxdWVzdCBjYW4gYmUgdXNlZCB3aXRo IGNhbWVyYSBidWZmZXJzIGFsbG9jYXRlZCwgYnV0IHN0cmVhbQorICogICAgc3RvcHBlZCwgZS5n LiBmcm9udGVuZCBpcyBhbGxvd2VkIHRvIHN0b3AgdGhlIHN0cmVhbSB3aXRoCisgKiAgICBYRU5D QU1FUkFfT1BfU1RSRUFNX1NUT1AsIGhvbGQgdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkIChlLmcuIGtl ZXAgdGhlCisgKiAgICBjb25maWd1cmF0aW9uIHNldCB3aXRoIFhFTkNBTUVSQV9PUF9DT05GSUdf U0VUKSwgY2hhbmdlIHRoZQorICogICAgZnJhbWUgcmF0ZSBvZiB0aGUgc3RyZWFtIGFuZCAocmUp c3RhcnQgdGhlIHN0cmVhbSBhZ2FpbiB3aXRoCisgKiAgICBYRU5DQU1FUkFfT1BfU1RSRUFNX1NU QVJULgorICogIC0gZnJhbWUgcmF0ZSBjYW5ub3QgYmUgY2hhbmdlZCBkdXJpbmcgYWN0aXZlIHN0 cmVhbWluZywgZS5nLgorICogICAgYWZ0ZXIgWEVOQ0FNRVJBX09QX1NUUkVBTV9TVEFSVCBhbmQg YmVmb3JlIFhFTkNBTUVSQV9PUF9TVFJFQU1fU1RPUAorICogICAgY29tbWFuZHMuCisgKi8KK3N0 cnVjdCB4ZW5jYW1lcmFfZnJhbWVfcmF0ZV9yZXEgeworCXVpbnQzMl90IGZyYW1lX3JhdGVfbnVt ZXI7CisJdWludDMyX3QgZnJhbWVfcmF0ZV9kZW5vbTsKK307CisKKy8qCisgKiBSZXF1ZXN0IGNh bWVyYSBidWZmZXIncyBsYXlvdXQ6CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAg ICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9CVUZfR0VUX0xBWU9V VHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIFNlZSByZXNwb25zZSBmb3Jt YXQgZm9yIHRoaXMgcmVxdWVzdC4KKyAqCisgKgorICogUmVxdWVzdCBudW1iZXIgb2YgYnVmZmVy cyB0byBiZSB1c2VkOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAg ICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCBfT1BfQlVGX1JFUVVFU1R8ICAgcmVz ZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgIG51bV9idWZzICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNl cnZlZCAgICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDE2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIG51bV9idWZz IC0gdWludDhfdCwgZGVzaXJlZCBudW1iZXIgb2YgYnVmZmVycyB0byBiZSB1c2VkLgorICoKKyAq IElmIG51bV9idWZzIGlzIG5vdCB6ZXJvIHRoZW4gdGhlIGJhY2tlbmQgdmFsaWRhdGVzIHRoZSBy ZXF1ZXN0ZWQgbnVtYmVyIG9mCisgKiBidWZmZXJzIGFuZCByZXNwb25kcyB3aXRoIHRoZSBudW1i ZXIgb2YgYnVmZmVycyBhbGxvd2VkIGZvciB0aGlzIGZyb250ZW5kLgorICogRnJvbnRlbmQgaXMg cmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlIGluIG9y ZGVyIHRvCisgKiBzZWUgaWYgdGhlIHZhbHVlcyByZXBvcnRlZCBiYWNrIGJ5IHRoZSBiYWNrZW5k IGRvIG1hdGNoIHRoZSBkZXNpcmVkIG9uZXMKKyAqIGFuZCBjYW4gYmUgYWNjZXB0ZWQuCisgKiBG cm9udGVuZCBpcyBhbGxvd2VkIHRvIHNlbmQgbXVsdGlwbGUgWEVOQ0FNRVJBX09QX0JVRl9SRVFV RVNUIHJlcXVlc3RzCisgKiBiZWZvcmUgc2VuZGluZyBYRU5DQU1FUkFfT1BfU1RSRUFNX1NUQVJU IHJlcXVlc3QgdG8gdXBkYXRlIG9yIHR1bmUgdGhlCisgKiBmaW5hbCBjb25maWd1cmF0aW9uLgor ICogRnJvbnRlbmQgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBjYW1lcmEgY29uZmlndXJh dGlvbiBhZnRlciB0aGlzIGNhbGwKKyAqIHdpdGggYSBub24temVybyB2YWx1ZSBvZiBudW1fYnVm cy4gSWYgY2FtZXJhIHJlY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZAorICogdGhlbiB0aGlzIHJl cXVlc3QgbXVzdCBiZSBzZW50IHdpdGggbnVtX2J1ZnMgc2V0IHRvIHplcm8gYW5kIGFueSBjcmVh dGVkCisgKiBidWZmZXJzIG11c3QgYmUgZGVzdHJveWVkIGZpcnN0LgorICogRnJvbnRlbmQgaXMg bm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgYnVmZmVycyBhZnRlciB0aGUKKyAq IHN0cmVhbWluZyBoYXMgc3RhcnRlZC4KKyAqCisgKiBJZiBudW1fYnVmcyBpcyAwIGFuZCBzdHJl YW1pbmcgaGFzIG5vdCBzdGFydGVkIHlldCwgdGhlbiB0aGUgYmFja2VuZCB3aWxsCisgKiBmcmVl IGFsbCBwcmV2aW91c2x5IGFsbG9jYXRlZCBidWZmZXJzIChpZiBhbnkpLgorICogVHJ5aW5nIHRv IGNhbGwgdGhpcyBpZiBzdHJlYW1pbmcgaXMgaW4gcHJvZ3Jlc3Mgd2lsbCByZXN1bHQgaW4gYW4g ZXJyb3IuCisgKgorICogSWYgY2FtZXJhIHJlY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZCB0aGVu IHRoZSBzdHJlYW1pbmcgbXVzdCBiZSBzdG9wcGVkCisgKiBhbmQgdGhpcyByZXF1ZXN0IG11c3Qg YmUgc2VudCB3aXRoIG51bV9idWZzIHNldCB0byB6ZXJvIGFuZCBhbnkKKyAqIGNyZWF0ZWQgYnVm ZmVycyBtdXN0IGJlIGRlc3Ryb3llZC4KKyAqCisgKiBQbGVhc2Ugbm90ZSwgdGhhdCB0aGUgbnVt YmVyIG9mIGJ1ZmZlcnMgaW4gdGhpcyByZXF1ZXN0IG11c3Qgbm90IGV4Y2VlZAorICogdGhlIHZh bHVlIGNvbmZpZ3VyZWQgaW4gWGVuU3RvcmUubWF4LWJ1ZmZlcnMuCisgKgorICogU2VlIHJlc3Bv bnNlIGZvcm1hdCBmb3IgdGhpcyByZXF1ZXN0LgorICovCitzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9y ZXF1ZXN0IHsKKwl1aW50OF90IG51bV9idWZzOworfTsKKworLyoKKyAqIFJlcXVlc3QgY2FtZXJh IGJ1ZmZlciBjcmVhdGlvbjoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAg ICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0JVRl9DUkVBVEUgfCAg IHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKworICogfCAgICAgIGluZGV4ICAgICB8ICAgICAgICAgICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9vZmZzZXRbMF0gICAgICAgICAgICAgICAg ICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgcGxhbmVfb2Zmc2V0WzFdICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX29mZnNldFsy XSAgICAgICAgICAgICAgICAgICAgICAgICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9vZmZzZXRbM10gICAgICAgICAgICAgICAgICAg ICAgICAgfCAyOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgZ3JlZl9kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzIKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB8IDM2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICoKKyAqIEFuIGF0dGVtcHQgdG8gY3JlYXRlIG11bHRpcGxlIGJ1ZmZlcnMgd2l0aCB0aGUg c2FtZSBpbmRleCBpcyBhbiBlcnJvci4KKyAqIGluZGV4IGNhbiBiZSByZS11c2VkIGFmdGVyIGRl c3Ryb3lpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2FtZXJhIGJ1ZmZlci4KKyAqCisgKiBpbmRleCAt IHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBidWZmZXIgdG8gYmUgY3JlYXRlZCBpbiB0aGUgcmFuZ2UK KyAqICAgZnJvbSAwIHRvIHRoZSBudW1fYnVmcyBmaWVsZCByZXR1cm5lZCBpbiByZXNwb25zZSBm b3IKKyAqICAgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNUIHJlcXVlc3QKKyAqIHBsYW5lX29mZnNl dCAtIGFycmF5IG9mIHVpbnQzMl90LCBvZmZzZXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGxhbmUK KyAqICAgaW4gb2N0ZXRzIGZyb20gdGhlIGJ1ZmZlciBzdGFydC4gTnVtYmVyIG9mIG9mZnNldHMg cmV0dXJuZWQgaXMKKyAqICAgZXF1YWwgdG8gdGhlIHZhbHVlIHJldHVybmVkIGluIFhFTkNBTUVS QV9PUF9CVUZfR0VUX0xBWU9VVC5udW1fcGxhbmVzLgorICogZ3JlZl9kaXJlY3RvcnkgLSBncmFu dF9yZWZfdCwgYSByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IHNoYXJlZCBwYWdlCisgKiAgIGRlc2Ny aWJpbmcgc2hhcmVkIGJ1ZmZlciByZWZlcmVuY2VzLiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlz IGVxdWFsIHRvCisgKiAgIFhFTkNBTUVSQV9PUF9CVUZfR0VUX0xBWU9VVC5zaXplIHJlc3BvbnNl LiBBdCBsZWFzdCBvbmUgcGFnZSBleGlzdHMuIElmCisgKiAgIHNoYXJlZCBidWZmZXIgc2l6ZSBl eGNlZWRzIHdoYXQgY2FuIGJlIGFkZHJlc3NlZCBieSB0aGlzIHNpbmdsZSBwYWdlLAorICogICB0 aGVuIHJlZmVyZW5jZSB0byB0aGUgbmV4dCBzaGFyZWQgcGFnZSBtdXN0IGJlIHN1cHBsaWVkIChz ZWUKKyAqICAgZ3JlZl9kaXJfbmV4dF9wYWdlIGJlbG93KS4KKyAqCisgKiBJZiBYRU5DQU1FUkFf RklFTERfQkVfQUxMT0MgY29uZmlndXJhdGlvbiBlbnRyeSBpcyBzZXQsIHRoZW4gYmFja2VuZCB3 aWxsCisgKiBhbGxvY2F0ZSB0aGUgYnVmZmVyIHdpdGggdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQg aW4gdGhpcyByZXF1ZXN0IGFuZCBwYWdlCisgKiBkaXJlY3RvcnkgaXMgaGFuZGxlZCBhcyBmb2xs b3dzOgorICogICBGcm9udGVuZCBvbiByZXF1ZXN0OgorICogICAgIC0gYWxsb2NhdGVzIHBhZ2Vz IGZvciB0aGUgZGlyZWN0b3J5IChncmVmX2RpcmVjdG9yeSwKKyAqICAgICAgIGdyZWZfZGlyX25l eHRfcGFnZShzKQorICogICAgIC0gZ3JhbnRzIHBlcm1pc3Npb25zIGZvciB0aGUgcGFnZXMgb2Yg dGhlIGRpcmVjdG9yeSB0byB0aGUgYmFja2VuZAorICogICAgIC0gc2V0cyBncmVmX2Rpcl9uZXh0 X3BhZ2UgZmllbGRzCisgKiAgIEJhY2tlbmQgb24gcmVzcG9uc2U6CisgKiAgICAgLSBncmFudHMg cGVybWlzc2lvbnMgZm9yIHRoZSBwYWdlcyBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCB0bworICog ICAgICAgdGhlIGZyb250ZW5kCisgKiAgICAgLSBmaWxscyBpbiBwYWdlIGRpcmVjdG9yeSB3aXRo IGdyYW50IHJlZmVyZW5jZXMKKyAqICAgICAgIChncmVmW10gaW4gc3RydWN0IHhlbmNhbWVyYV9w YWdlX2RpcmVjdG9yeSkKKyAqLworc3RydWN0IHhlbmNhbWVyYV9idWZfY3JlYXRlX3JlcSB7CisJ dWludDhfdCBpbmRleDsKKwl1aW50OF90IHJlc2VydmVkWzNdOworCXVpbnQzMl90IHBsYW5lX29m ZnNldFtYRU5DQU1FUkFfTUFYX1BMQU5FXTsKKwlncmFudF9yZWZfdCBncmVmX2RpcmVjdG9yeTsK K307CisKKy8qCisgKiBTaGFyZWQgcGFnZSBmb3IgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUgYnVm ZmVyIGRlc2NyaXB0b3IgKGdyZWZfZGlyZWN0b3J5IGluCisgKiB0aGUgcmVxdWVzdCkgZW1wbG95 cyBhIGxpc3Qgb2YgcGFnZXMsIGRlc2NyaWJpbmcgYWxsIHBhZ2VzIG9mIHRoZSBzaGFyZWQKKyAq IGRhdGEgYnVmZmVyOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAg ICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZl9kaXJfbmV4dF9wYWdlICAgICAgICAgICAgICAg ICAgICAgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZ3JlZlswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGdyZWZbaV0gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IGkqNCs4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVmW04gLSAxXSAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgTio0KzgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIGdyZWZf ZGlyX25leHRfcGFnZSAtIGdyYW50X3JlZl90LCByZWZlcmVuY2UgdG8gdGhlIG5leHQgcGFnZSBk ZXNjcmliaW5nCisgKiAgIHBhZ2UgZGlyZWN0b3J5LiBNdXN0IGJlIDAgaWYgdGhlcmUgYXJlIG5v IG1vcmUgcGFnZXMgaW4gdGhlIGxpc3QuCisgKiBncmVmW2ldIC0gZ3JhbnRfcmVmX3QsIHJlZmVy ZW5jZSB0byBhIHNoYXJlZCBwYWdlIG9mIHRoZSBidWZmZXIKKyAqICAgYWxsb2NhdGVkIGF0IFhF TkNBTUVSQV9PUF9CVUZfQ1JFQVRFLgorICoKKyAqIE51bWJlciBvZiBncmFudF9yZWZfdCBlbnRy aWVzIGluIHRoZSB3aG9sZSBwYWdlIGRpcmVjdG9yeSBpcyBub3QKKyAqIHBhc3NlZCwgYnV0IGlu c3RlYWQgY2FuIGJlIGNhbGN1bGF0ZWQgYXM6CisgKiAgIG51bV9ncmVmc190b3RhbCA9IChYRU5D QU1FUkFfT1BfQlVGX1JFUVVFU1Quc2l6ZSArIFhFTl9QQUdFX1NJWkUgLSAxKSAvCisgKiAgICAg ICBYRU5fUEFHRV9TSVpFCisgKi8KK3N0cnVjdCB4ZW5jYW1lcmFfcGFnZV9kaXJlY3Rvcnkgewor CWdyYW50X3JlZl90IGdyZWZfZGlyX25leHRfcGFnZTsKKwlncmFudF9yZWZfdCBncmVmWzFdOyAv KiBWYXJpYWJsZSBsZW5ndGggKi8KK307CisKKy8qCisgKiBSZXF1ZXN0IGJ1ZmZlciBkZXN0cnVj dGlvbiAtIGRlc3Ryb3kgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjYW1lcmEgYnVmZmVyOgorICog ICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAg ICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQg ICAgICAgICAgICAgICAgfCBfT1BfQlVGX0RFU1RST1l8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAg ICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAg ICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2CisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXggb2Yg dGhlIGJ1ZmZlciB0byBiZSBkZXN0cm95ZWQuCisgKgorICoKKyAqIFJlcXVlc3QgcXVldWVpbmcg b2YgdGhlIGJ1ZmZlciBmb3IgYmFja2VuZCB1c2U6CisgKiAgICAgICAgIDAgICAgICAgICAgICAg ICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9PUF9C VUZfUVVFVUUgIHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICBpbmRleCAgICAgfCAgICAgICAg ICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgfCAxMgorICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMTYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl c2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKgorICogTm90ZXM6CisgKiAgLSBmcm9udGVuZHMgbXVzdCBub3QgYWNjZXNzIHRoZSBidWZm ZXIgY29udGVudCBhZnRlciB0aGlzIHJlcXVlc3QgdW50aWwKKyAqICAgIHJlc3BvbnNlIHRvIFhF TkNBTUVSQV9PUF9CVUZfREVRVUVVRSBoYXMgYmVlbiByZWNlaXZlZC4KKyAqICAtIGJ1ZmZlcnMg bXVzdCBiZSBxdWV1ZWQgdG8gdGhlIGJhY2tlbmQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlbSB3aXRo CisgKiAgICBYRU5DQU1FUkFfT1BfQlVGX0RFU1RST1kuCisgKgorICogaW5kZXggLSB1aW50OF90 LCBpbmRleCBvZiB0aGUgYnVmZmVyIHRvIGJlIHF1ZXVlZC4KKyAqCisgKgorICogUmVxdWVzdCBk ZXF1ZXVlaW5nIG9mIHRoZSBidWZmZXIgZm9yIGZyb250ZW5kIHVzZToKKyAqICAgICAgICAgMCAg ICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAg b2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAg ICAgIHxfT1BfQlVGX0RFUVVFVUUgfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgIGluZGV4ICAg ICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEy CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2Vy dmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqCisgKiBOb3RlczoKKyAqICAtIGZyb250ZW5kIGlzIGFsbG93ZWQgdG8g YWNjZXNzIHRoZSBidWZmZXIgY29udGVudCBhZnRlciB0aGUgY29ycmVzcG9uZGluZworICogICAg cmVzcG9uc2UgdG8gdGhpcyByZXF1ZXN0LgorICoKKyAqIGluZGV4IC0gdWludDhfdCwgaW5kZXgg b2YgdGhlIGJ1ZmZlciB0byBiZSBxdWV1ZWQuCisgKgorICoKKyAqIFJlcXVlc3QgY2FtZXJhIGNv bnRyb2wgZGV0YWlsczoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAg ICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwgX09QX0NUUkxfRU5VTSAgfCAgIHJl c2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgIGluZGV4ICAgICB8ICAg ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICoKKyAqIFNlZSByZXNwb25zZSBmb3JtYXQgZm9yIHRoaXMgcmVxdWVzdC4KKyAqCisg KiBpbmRleCAtIHVpbnQ4X3QsIGluZGV4IG9mIHRoZSBjb250cm9sIHRvIGJlIHF1ZXJpZWQuCisg Ki8KK3N0cnVjdCB4ZW5jYW1lcmFfaW5kZXggeworCXVpbnQ4X3QgaW5kZXg7Cit9OworCisvKgor ICogUmVxdWVzdCBjYW1lcmEgY29udHJvbCBjaGFuZ2U6CisgKiAgICAgICAgIDAgICAgICAgICAg ICAgICAgMSAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0Cisg KiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8ICBf T1BfU0VUX0NUUkwgIHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwg ICAgICAgdHlwZSAgICAgfCAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgfCA4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMgorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgdmFsdWUgbG93IDMyLWJpdCAgICAgICAgICAgICAgICAgICAg ICAgICB8IDIwCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg IHZhbHVlIGhpZ2ggMzItYml0ICAgICAgICAgICAgICAgICAgICAgICAgfCAyNAorICogKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwgMjgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl c2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKgorICogdHlwZSAtIHVpbnQ4X3QsIHR5cGUgb2YgdGhlIGNvbnRyb2wsIG9uZSBvZiB0aGUg WEVOQ0FNRVJBX0NUUkxfWFhYLgorICogdmFsdWUgLSBpbnQ2NF90LCBuZXcgdmFsdWUgb2YgdGhl IGNvbnRyb2wuCisgKi8KK3N0cnVjdCB4ZW5jYW1lcmFfY3RybF92YWx1ZSB7CisJdWludDhfdCB0 eXBlOworCXVpbnQ4X3QgcmVzZXJ2ZWRbN107CisJaW50NjRfdCB2YWx1ZTsKK307CisKKy8qCisg KiBSZXF1ZXN0IGNhbWVyYSBjb250cm9sIHN0YXRlOgorICogICAgICAgICAwICAgICAgICAgICAg ICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAzICAgICAgICBvY3RldAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgfCAgX09Q X0dFVF9DVFJMICB8ICAgcmVzZXJ2ZWQgICAgIHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAg ICAgIHR5cGUgICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAg ICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fCA2NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogU2VlIHJlc3BvbnNlIGZvcm1hdCBmb3IgdGhp cyByZXF1ZXN0LgorICoKKyAqIHR5cGUgLSB1aW50OF90LCB0eXBlIG9mIHRoZSBjb250cm9sLCBv bmUgb2YgdGhlIFhFTkNBTUVSQV9DVFJMX1hYWC4KKyAqLworc3RydWN0IHhlbmNhbWVyYV9nZXRf Y3RybF9yZXEgeworCXVpbnQ4X3QgdHlwZTsKK307CisKKy8qCisgKiBSZXF1ZXN0IGNhbWVyYSBj YXB0dXJlIHN0cmVhbSBzdGFydDoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAg ICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t KworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHxfT1BfU1RSRUFNX1NUQVJU fCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICoKKyAqIFJlcXVlc3QgY2FtZXJh IGNhcHR1cmUgc3RyZWFtIHN0b3A6CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAg ICAgICAgICAgICAgMiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8X09QX1NUUkVBTV9TVE9Q IHwgICByZXNlcnZlZCAgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqCisgKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzcG9uc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgKgorICogQWxsIHJlc3BvbnNlIHBhY2tldHMgaGF2ZSB0aGUgc2FtZSBsZW5ndGgg KDY0IG9jdGV0cykuCisgKgorICogQWxsIHJlc3BvbnNlIHBhY2tldHMgaGF2ZSBjb21tb24gaGVh ZGVyOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAg ICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgaWQgICAgICAgICAgICAgICAgfCAgICBvcGVyYXRpb24gICB8ICAgIHJlc2VydmVkICAg IHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKgorICogaWQgLSB1aW50MTZfdCwgY29waWVkIGZyb20gdGhlIHJlcXVlc3QuCisgKiBvcGVy YXRpb24gLSB1aW50OF90LCBYRU5DQU1FUkFfT1BfKiAtIGNvcGllZCBmcm9tIHJlcXVlc3QuCisg KiBzdGF0dXMgLSBpbnQzMl90LCByZXNwb25zZSBzdGF0dXMsIHplcm8gb24gc3VjY2VzcyBhbmQg LVhFTl9FWFggb24gZmFpbHVyZS4KKyAqCisgKgorICogQ29uZmlndXJhdGlvbiByZXNwb25zZSAt IHJlc3BvbnNlIGZvciBYRU5DQU1FUkFfT1BfQ09ORklHX1NFVCwKKyAqIFhFTkNBTUVSQV9PUF9D T05GSUdfR0VUIGFuZCBYRU5DQU1FUkFfT1BfQ09ORklHX1ZBTElEQVRFIHJlcXVlc3RzOgorICog ICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAg ICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgaWQg ICAgICAgICAgICAgICAgfCBfT1BfQ09ORklHX1hYWCB8ICAgIHJlc2VydmVkICAgIHwgNAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsIGZvcm1hdCAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2CisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnNwYWNlICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgMjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgeGZlcl9mdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDI4CisgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHljYmNyX2VuYyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAzMgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgMzYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxf YXNwX3JhdGlvX251bWVyICAgICAgICAgICAgICAgICAgICAgICB8IDQwCisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsX2FzcF9yYXRpb19kZW5vbSAgICAg ICAgICAgICAgICAgICAgICAgfCA0NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAg ICAgICAgICAgICAgICBmcmFtZV9yYXRlX251bWVyICAgICAgICAgICAgICAgICAgICAgICAgIHwg NDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVf cmF0ZV9kZW5vbSAgICAgICAgICAgICAgICAgICAgICAgICB8IDUyCisgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK KyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCA1NgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisg KiBNZWFuaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGlzIHJlc3BvbnNlIGlz IHRoZSBzYW1lIGFzIGZvcgorICogWEVOQ0FNRVJBX09QX0NPTkZJR19TRVQgYW5kIFhFTkNBTUVS QV9PUF9GUkFNRV9SQVRFX1NFVCByZXF1ZXN0cy4KKyAqCisgKiBjb2xvcnNwYWNlIC0gdWludDMy X3QsIHRoaXMgc3VwcGxlbWVudHMgcGl4ZWxfZm9ybWF0IHBhcmFtZXRlciwKKyAqICAgb25lIG9m IHRoZSBYRU5DQU1FUkFfQ09MT1JTUEFDRV9YWFguCisgKiB4ZmVyX2Z1bmMgLSB1aW50MzJfdCwg dGhpcyBzdXBwbGVtZW50cyBjb2xvcnNwYWNlIHBhcmFtZXRlciwKKyAqICAgb25lIG9mIHRoZSBY RU5DQU1FUkFfWEZFUl9GVU5DX1hYWC4KKyAqIHljYmNyX2VuYyAtIHVpbnQzMl90LCB0aGlzIHN1 cHBsZW1lbnRzIGNvbG9yc3BhY2UgcGFyYW1ldGVyLAorICogICBvbmUgb2YgdGhlIFhFTkNBTUVS QV9ZQ0JDUl9FTkNfWFhYLiBQbGVhc2Ugbm90ZSwgdGhhdCB5Y2Jjcl9lbmMgaXMgb25seQorICog ICB2YWxpZCBmb3IgWUNiQ3IgcGl4ZWxmb3JtYXRzIGFuZCBzaG91bGQgYmUgaWdub3JlZCBvdGhl cndpc2UuCisgKiBxdWFudGl6YXRpb24gLSB1aW50MzJfdCwgdGhpcyBzdXBwbGVtZW50cyBjb2xv cnNwYWNlIHBhcmFtZXRlciwKKyAqICAgb25lIG9mIHRoZSBYRU5DQU1FUkFfUVVBTlRJWkFUSU9O X1hYWC4KKyAqIGRpc3BsX2FzcF9yYXRpb19udW1lciAtIHVpbnQzMl90LCBudW1lcmF0b3Igb2Yg dGhlIGRpc3BsYXkgYXNwZWN0IHJhdGlvLgorICogZGlzcGxfYXNwX3JhdGlvX2Rlbm9tIC0gdWlu dDMyX3QsIGRlbm9taW5hdG9yIG9mIHRoZSBkaXNwbGF5IGFzcGVjdCByYXRpby4KKyAqLworc3Ry dWN0IHhlbmNhbWVyYV9jb25maWdfcmVzcCB7CisJdWludDMyX3QgcGl4ZWxfZm9ybWF0OworCXVp bnQzMl90IHdpZHRoOworCXVpbnQzMl90IGhlaWdodDsKKwl1aW50MzJfdCBjb2xvcnNwYWNlOwor CXVpbnQzMl90IHhmZXJfZnVuYzsKKwl1aW50MzJfdCB5Y2Jjcl9lbmM7CisJdWludDMyX3QgcXVh bnRpemF0aW9uOworCXVpbnQzMl90IGRpc3BsX2FzcF9yYXRpb19udW1lcjsKKwl1aW50MzJfdCBk aXNwbF9hc3BfcmF0aW9fZGVub207CisJdWludDMyX3QgZnJhbWVfcmF0ZV9udW1lcjsKKwl1aW50 MzJfdCBmcmFtZV9yYXRlX2Rlbm9tOworfTsKKworLyoKKyAqIFJlcXVlc3QgYnVmZmVyIHJlc3Bv bnNlIC0gcmVzcG9uc2UgZm9yIFhFTkNBTUVSQV9PUF9CVUZfR0VUX0xBWU9VVAorICogcmVxdWVz dDoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAg ICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAg ICAgIGlkICAgICAgICAgICAgICAgIHxfQlVGX0dFVF9MQVlPVVQgfCAgICByZXNlcnZlZCAgICB8 IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgIG51bV9wbGFuZXMgICB8ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAg ICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgor ICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc2l6 ZVswXSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3NpemVbMV0gICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICBwbGFuZV9zaXplWzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyOAorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc2l6ZVsz XSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMzIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc3RyaWRlWzBdICAgICAgICAgICAgICAgICAg ICAgICAgICB8IDM2CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgIHBsYW5lX3N0cmlkZVsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0MAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zdHJpZGVbMl0g ICAgICAgICAgICAgICAgICAgICAgICAgIHwgNDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAg ICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc3RyaWRlWzNdICAgICAgICAgICAgICAgICAgICAg ICAgICB8IDQ4CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvfAorICogKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgNjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIG51bV9wbGFu ZXMgLSB1aW50OF90LCBudW1iZXIgb2YgcGxhbmVzIG9mIHRoZSBidWZmZXIuCisgKiBzaXplIC0g dWludDMyX3QsIG92ZXJhbGwgc2l6ZSBvZiB0aGUgYnVmZmVyIGluY2x1ZGluZyBzaXplcyBvZiB0 aGUKKyAqICAgaW5kaXZpZHVhbCBwbGFuZXMgYW5kIHBhZGRpbmcgaWYgYXBwbGljYWJsZS4KKyAq IHBsYW5lX3NpemUgLSBhcnJheSBvZiB1aW50MzJfdCwgc2l6ZSBpbiBvY3RldHMgb2YgdGhlIGNv cnJlc3BvbmRpbmcgcGxhbmUKKyAqICAgaW5jbHVkaW5nIHBhZGRpbmcuCisgKiBwbGFuZV9zdHJp ZGUgLSBhcnJheSBvZiB1aW50MzJfdCwgc2l6ZSBpbiBvY3RldHMgb2NjdXBpZWQgYnkgdGhlCisg KiAgIGNvcnJlc3BvbmRpbmcgc2luZ2xlIGltYWdlIGxpbmUgaW5jbHVkaW5nIHBhZGRpbmcgaWYg YXBwbGljYWJsZS4KKyAqCisgKiBOb3RlISBUaGUgc2l6ZXMgYW5kIHN0cmlkZXMgaW4gdGhpcyBy ZXNwb25zZSBhcHBseSB0byBhbGwgYnVmZmVycyBjcmVhdGVkCisgKiB3aXRoIFhFTkNBTUVSQV9P UF9CVUZfQ1JFQVRFIGNvbW1hbmQsIGJ1dCBpbmRpdmlkdWFsIGJ1ZmZlcnMgbWF5IGhhdmUKKyAq IGRpZmZlcmVudCBwbGFuZSBvZmZzZXRzLCBzZWUgWEVOQ0FNRVJBX09QX0JVRl9SRVFVRVNULnBs YW5lX29mZnNldC4KKyAqLworc3RydWN0IHhlbmNhbWVyYV9idWZfZ2V0X2xheW91dF9yZXNwIHsK Kwl1aW50OF90IG51bV9wbGFuZXM7CisJdWludDhfdCByZXNlcnZlZFszXTsKKwl1aW50MzJfdCBz aXplOworCXVpbnQzMl90IHBsYW5lX3NpemVbWEVOQ0FNRVJBX01BWF9QTEFORV07CisJdWludDMy X3QgcGxhbmVfc3RyaWRlW1hFTkNBTUVSQV9NQVhfUExBTkVdOworfTsKKworLyoKKyAqIFJlcXVl c3QgYnVmZmVyIHJlc3BvbnNlIC0gcmVzcG9uc2UgZm9yIFhFTkNBTUVSQV9PUF9CVUZfUkVRVUVT VAorICogcmVxdWVzdDoKKyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAg ICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHxfT1BfQlVGX1JFUVVFU1QgfCAgICBy ZXNlcnZlZCAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKworICogfCAgIG51bV9idWZmZXJzICB8ICAgICAgICAgICAgICAgICAgICAgcmVz ZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiBudW1fYnVm ZmVycyAtIHVpbnQ4X3QsIG51bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQuCisgKgorICoKKyAq IENvbnRyb2wgZW51bWVyYXRlIHJlc3BvbnNlIC0gcmVzcG9uc2UgZm9yIFhFTkNBTUVSQV9PUF9D VFJMX0VOVU06CisgKiAgICAgICAgIDAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAg MiAgICAgICAgICAgICAgIDMgICAgICAgIG9jdGV0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAg ICAgICAgICAgICBpZCAgICAgICAgICAgICAgICB8IF9PUF9DVFJMX0VOVU0gIHwgICAgcmVzZXJ2 ZWQgICAgfCA0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3RhdHVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4CisgKiArLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSsKKyAqIHwgICAgIGluZGV4ICAgICAgfCAgICAgIHR5cGUgICAgICB8ICAgICAgICAgICAg cmVzZXJ2ZWQgICAgICAgICAgICAgfCAxMgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHwgMTYKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgbWlu IGxvdyAzMi1iaXRzICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIwCisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiBoaWdoIDMyLWJpdHMgICAgICAg ICAgICAgICAgICAgICAgICAgfCAyNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAg ICAgICAgICAgICAgICBtYXggbG93IDMyLWJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgIHwg MjgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4IGhp Z2ggMzItYml0cyAgICAgICAgICAgICAgICAgICAgICAgICB8IDMyCisgKiArLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsK KyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCBsb3cgMzItYml0cyAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAzNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAg ICAgICAgICAgIHN0ZXAgaGlnaCAzMi1iaXRzICAgICAgICAgICAgICAgICAgICAgICAgIHwgNDAK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAgIGRlZl92YWwgbG93 IDMyLWJpdHMgICAgICAgICAgICAgICAgICAgICAgICB8IDQ0CisgKiArLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAq IHwgICAgICAgICAgICAgICAgICAgICAgICBkZWZfdmFsIGhpZ2ggMzItYml0cyAgICAgICAgICAg ICAgICAgICAgICAgfCA0OAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNTIKKyAq ICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogaW5kZXggLSB1aW50OF90LCBpbmRl eCBvZiB0aGUgY2FtZXJhIGNvbnRyb2wgaW4gcmVzcG9uc2UuCisgKiB0eXBlIC0gdWludDhfdCwg dHlwZSBvZiB0aGUgY29udHJvbCwgb25lIG9mIHRoZSBYRU5DQU1FUkFfQ1RSTF9YWFguCisgKiBm bGFncyAtIHVpbnQzMl90LCBmbGFncyBvZiB0aGUgY29udHJvbCwgb25lIG9mIHRoZSBYRU5DQU1F UkFfQ1RSTF9GTEdfWFhYLgorICogbWluIC0gaW50NjRfdCwgbWluaW11bSB2YWx1ZSBvZiB0aGUg Y29udHJvbC4KKyAqIG1heCAtIGludDY0X3QsIG1heGltdW0gdmFsdWUgb2YgdGhlIGNvbnRyb2wu CisgKiBzdGVwIC0gaW50NjRfdCwgbWluaW11bSBzaXplIGluIHdoaWNoIGNvbnRyb2wgdmFsdWUg Y2FuIGJlIGNoYW5nZWQuCisgKiBkZWZfdmFsIC0gaW50NjRfdCwgZGVmYXVsdCB2YWx1ZSBvZiB0 aGUgY29udHJvbC4KKyAqLworc3RydWN0IHhlbmNhbWVyYV9jdHJsX2VudW1fcmVzcCB7CisJdWlu dDhfdCBpbmRleDsKKwl1aW50OF90IHR5cGU7CisJdWludDhfdCByZXNlcnZlZFsyXTsKKwl1aW50 MzJfdCBmbGFnczsKKwlpbnQ2NF90IG1pbjsKKwlpbnQ2NF90IG1heDsKKwlpbnQ2NF90IHN0ZXA7 CisJaW50NjRfdCBkZWZfdmFsOworfTsKKworLyoKKyAqIEdldCBjb250cm9sIHJlc3BvbnNlIC0g cmVzcG9uc2UgZm9yIFhFTkNBTUVSQV9PUF9DVFJMX0dFVDoKKyAqICAgICAgICAgMCAgICAgICAg ICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0ZXQK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgIHwg X09QX0NUUkxfR0VUICAgfCAgICByZXNlcnZlZCAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICB0eXBlICAgICB8ICAg ICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDEyCisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgICAgICAgICAg ICAgdmFsdWUgbG93IDMyLWJpdCAgICAgICAgICAgICAgICAgICAgICAgICB8IDI0CisgKiArLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGhpZ2ggMzItYml0 ICAgICAgICAgICAgICAgICAgICAgICAgfCAyOAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHwgMzIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiArLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogdHlwZSAtIHVp bnQ4X3QsIHR5cGUgb2YgdGhlIGNvbnRyb2wsIG9uZSBvZiB0aGUgWEVOQ0FNRVJBX0NUUkxfWFhY LgorICogdmFsdWUgLSBpbnQ2NF90LCBuZXcgdmFsdWUgb2YgdGhlIGNvbnRyb2wuCisgKi8KKwor LyoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZlbnRzIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBFdmVudHMgYXJlIHNlbnQgdmlhIGEg c2hhcmVkIHBhZ2UgYWxsb2NhdGVkIGJ5IHRoZSBmcm9udCBhbmQgcHJvcGFnYXRlZCBieQorICog ICBldnQtZXZlbnQtY2hhbm5lbC9ldnQtcmluZy1yZWYgWGVuU3RvcmUgZW50cmllcy4KKyAqCisg KiBBbGwgZXZlbnQgcGFja2V0cyBoYXZlIHRoZSBzYW1lIGxlbmd0aCAoNjQgb2N0ZXRzKS4KKyAq IEFsbCBldmVudCBwYWNrZXRzIGhhdmUgY29tbW9uIGhlYWRlcjoKKyAqICAgICAgICAgMCAgICAg ICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgMyAgICAgICAgb2N0 ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAgIGlkICAgICAgICAgICAgICAg IHwgICAgICB0eXBlICAgICAgfCAgIHJlc2VydmVkICAgICB8IDQKKyAqICstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKwor ICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIGlkIC0gdWludDE2X3Qs IGV2ZW50IGlkLCBtYXkgYmUgdXNlZCBieSBmcm9udC4KKyAqIHR5cGUgLSB1aW50OF90LCB0eXBl IG9mIHRoZSBldmVudC4KKyAqCisgKgorICogRnJhbWUgY2FwdHVyZWQgZXZlbnQgLSBldmVudCBm cm9tIGJhY2sgdG8gZnJvbnQgd2hlbiBhIG5ldyBjYXB0dXJlZAorICogZnJhbWUgaXMgYXZhaWxh YmxlOgorICogICAgICAgICAwICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgIDIgICAg ICAgICAgICAgICAzICAgICAgICBvY3RldAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAg ICAgICAgaWQgICAgICAgICAgICAgICAgfF9FVlRfRlJBTUVfQVZBSUx8ICAgcmVzZXJ2ZWQgICAg IHwgNAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBy ZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOAorICogKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r CisgKiB8ICAgICAgaW5kZXggICAgIHwgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAg ICAgICAgICAgICAgICAgIHwgMTIKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHVzZWRfc3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE2 CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXFf bnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMAorICogKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisg KiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgMjQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfC9cL1wvXC9cL1wvXC9cL1wv XC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC98CisgKiAr LS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2NAorICogKy0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgKgorICog aW5kZXggLSB1aW50OF90LCBpbmRleCBvZiB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgbmV3IGNh cHR1cmVkIGZyYW1lLAorICogICBzZWUgWEVOQ0FNRVJBX09QX0JVRl9DUkVBVEUgZGVzY3JpcHRp b24gb24gdGhlIHJhbmdlCisgKiB1c2VkX3N6IC0gdWludDMyX3QsIG51bWJlciBvZiBvY3RldHMg dGhpcyBmcmFtZSBoYXMuIFRoaXMgY2FuIGJlIGxlc3MKKyAqIHRoYW4gdGhlIFhFTkNBTUVSQV9P UF9CVUZfUkVRVUVTVC5zaXplIChyZXNwb25zZSkgZm9yIGNvbXByZXNzZWQgZm9ybWF0cy4KKyAq IHNlcV9udW0gLSB1aW50MzJfdCwgc2VxdWVudGlhbCBudW1iZXIgb2YgdGhlIGZyYW1lLiBNdXN0 IGJlCisgKiAgIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZy4gSWYgc2tpcHMgYXJlIGRldGVjdGVk IGluIHNlcV9udW0gdGhlbiB0aGF0CisgKiAgIG1lYW5zIHRoYXQgdGhlIGZyYW1lcyBpbi1iZXR3 ZWVuIHdlcmUgZHJvcHBlZC4gTm90ZSBob3dldmVyIHRoYXQgbm90CisgKiAgIGFsbCB2aWRlbyBj YXB0dXJlIGhhcmR3YXJlIGlzIGNhcGFibGUgb2YgZGV0ZWN0aW5nIGRyb3BwZWQgZnJhbWVzLgor ICogICBJbiB0aGF0IGNhc2UgdGhlcmUgd2lsbCBiZSBubyBza2lwcyBpbiB0aGUgc2VxdWVuY2Ug Y291bnRlci4KKyAqLworc3RydWN0IHhlbmNhbWVyYV9mcmFtZV9hdmFpbF9ldnQgeworCXVpbnQ4 X3QgaW5kZXg7CisJdWludDhfdCByZXNlcnZlZFszXTsKKwl1aW50MzJfdCB1c2VkX3N6OworCXVp bnQzMl90IHNlcV9udW07Cit9OworCisvKgorICogQ29udHJvbCBjaGFuZ2UgZXZlbnQtIGV2ZW50 IGZyb20gYmFjayB0byBmcm9udCB3aGVuIGNhbWVyYSBjb250cm9sCisgKiBoYXMgY2hhbmdlZDoK KyAqICAgICAgICAgMCAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAyICAgICAgICAg ICAgICAgMyAgICAgICAgb2N0ZXQKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAgICAgICAg IGlkICAgICAgICAgICAgICAgIHxfRVZUX0NUUkxfQ0hBTkdFfCAgIHJlc2VydmVkICAgICB8IDQK KyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICB0eXBlICAgICB8ICAgICAgICAgICAgICAgICAg ICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICB8IDgKKyAqICstLS0tLS0tLS0tLS0tLS0t Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICog fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8IDEyCisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNgorICog Ky0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBsb3cgMzIt Yml0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjAKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAg ICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaGlnaCAzMi1iaXQgICAgICAgICAgICAgICAg ICAgICAgICB8IDI0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyOAorICogKy0t LS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rCisgKiB8L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9c L1wvXC9cL1wvXC9cL1wvXC9cL1wvXC9cL3wKKyAqICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0t LS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKworICogfCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8IDY0CisgKiArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0t LS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiB0eXBlIC0gdWludDhfdCwgdHlwZSBvZiB0 aGUgY29udHJvbCwgb25lIG9mIHRoZSBYRU5DQU1FUkFfQ1RSTF9YWFguCisgKiB2YWx1ZSAtIGlu dDY0X3QsIG5ldyB2YWx1ZSBvZiB0aGUgY29udHJvbC4KKyAqCisgKiBOb3RlczoKKyAqICAtIHRo aXMgZXZlbnQgaXMgbm90IHNlbnQgZm9yIHdyaXRlLW9ubHkgY29udHJvbHMKKyAqICAtIHRoaXMg ZXZlbnQgaXMgbm90IHNlbnQgdG8gdGhlIG9yaWdpbmF0b3Igb2YgdGhlIGNvbnRyb2wgY2hhbmdl CisgKiAgLSB0aGlzIGV2ZW50IGlzIG5vdCBzZW50IHdoZW4gZnJvbnRlbmQgZmlyc3QgY29ubmVj dHMsIGUuZy4gaW5pdGlhbAorICogICAgY29udHJvbCBzdGF0ZSBtdXN0IGJlIGV4cGxpY2l0bHkg cXVlcmllZAorICovCisKK3N0cnVjdCB4ZW5jYW1lcmFfcmVxIHsKKwl1aW50MTZfdCBpZDsKKwl1 aW50OF90IG9wZXJhdGlvbjsKKwl1aW50OF90IHJlc2VydmVkWzVdOworCXVuaW9uIHsKKwkJc3Ry dWN0IHhlbmNhbWVyYV9jb25maWdfcmVxIGNvbmZpZzsKKwkJc3RydWN0IHhlbmNhbWVyYV9mcmFt ZV9yYXRlX3JlcSBmcmFtZV9yYXRlOworCQlzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9yZXF1ZXN0IGJ1 Zl9yZXF1ZXN0OworCQlzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9jcmVhdGVfcmVxIGJ1Zl9jcmVhdGU7 CisJCXN0cnVjdCB4ZW5jYW1lcmFfaW5kZXggaW5kZXg7CisJCXN0cnVjdCB4ZW5jYW1lcmFfY3Ry bF92YWx1ZSBjdHJsX3ZhbHVlOworCQlzdHJ1Y3QgeGVuY2FtZXJhX2dldF9jdHJsX3JlcSBnZXRf Y3RybDsKKwl1aW50OF90IHJlc2VydmVkWzU2XTsKKwl9IHJlcTsKK307CisKK3N0cnVjdCB4ZW5j YW1lcmFfcmVzcCB7CisJdWludDE2X3QgaWQ7CisJdWludDhfdCBvcGVyYXRpb247CisJdWludDhf dCByZXNlcnZlZDsKKwlpbnQzMl90IHN0YXR1czsKKwl1bmlvbiB7CisJCXN0cnVjdCB4ZW5jYW1l cmFfY29uZmlnX3Jlc3AgY29uZmlnOworCQlzdHJ1Y3QgeGVuY2FtZXJhX2J1Zl9nZXRfbGF5b3V0 X3Jlc3AgYnVmX2xheW91dDsKKwkJc3RydWN0IHhlbmNhbWVyYV9idWZfcmVxdWVzdCBidWZfcmVx dWVzdDsKKwkJc3RydWN0IHhlbmNhbWVyYV9jdHJsX2VudW1fcmVzcCBjdHJsX2VudW07CisJCXN0 cnVjdCB4ZW5jYW1lcmFfY3RybF92YWx1ZSBjdHJsX3ZhbHVlOworCQl1aW50OF90IHJlc2VydmVk MVs1Nl07CisJfSByZXNwOworfTsKKworc3RydWN0IHhlbmNhbWVyYV9ldnQgeworCXVpbnQxNl90 IGlkOworCXVpbnQ4X3QgdHlwZTsKKwl1aW50OF90IHJlc2VydmVkWzVdOworCXVuaW9uIHsKKwkJ c3RydWN0IHhlbmNhbWVyYV9mcmFtZV9hdmFpbF9ldnQgZnJhbWVfYXZhaWw7CisJCXN0cnVjdCB4 ZW5jYW1lcmFfY3RybF92YWx1ZSBjdHJsX3ZhbHVlOworCQl1aW50OF90IHJlc2VydmVkWzU2XTsK Kwl9IGV2dDsKK307CisKK0RFRklORV9SSU5HX1RZUEVTKHhlbl9jYW1lcmFpZiwgc3RydWN0IHhl bmNhbWVyYV9yZXEsIHN0cnVjdCB4ZW5jYW1lcmFfcmVzcCk7CisKKy8qCisgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgIEJhY2sgdG8gZnJvbnQgZXZlbnRz IGRlbGl2ZXJ5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJbiBvcmRlciB0byBkZWxpdmVy IGFzeW5jaHJvbm91cyBldmVudHMgZnJvbSBiYWNrIHRvIGZyb250IGEgc2hhcmVkIHBhZ2UgaXMK KyAqIGFsbG9jYXRlZCBieSBmcm9udCBhbmQgaXRzIGdyYW50ZWQgcmVmZXJlbmNlIHByb3BhZ2F0 ZWQgdG8gYmFjayB2aWEKKyAqIFhlblN0b3JlIGVudHJpZXMgKGV2dC1yaW5nLXJlZi9ldnQtZXZl bnQtY2hhbm5lbCkuCisgKiBUaGlzIHBhZ2UgaGFzIGEgY29tbW9uIGhlYWRlciB1c2VkIGJ5IGJv dGggZnJvbnQgYW5kIGJhY2sgdG8gc3luY2hyb25pemUKKyAqIGFjY2VzcyBhbmQgY29udHJvbCBl dmVudCdzIHJpbmcgYnVmZmVyLCB3aGlsZSBiYWNrIGJlaW5nIGEgcHJvZHVjZXIgb2YgdGhlCisg KiBldmVudHMgYW5kIGZyb250IGJlaW5nIGEgY29uc3VtZXIuIFRoZSByZXN0IG9mIHRoZSBwYWdl IGFmdGVyIHRoZSBoZWFkZXIKKyAqIGlzIHVzZWQgZm9yIGV2ZW50IHBhY2tldHMuCisgKgorICog VXBvbiByZWNlcHRpb24gb2YgYW4gZXZlbnQocykgZnJvbnQgbWF5IGNvbmZpcm0gaXRzIHJlY2Vw dGlvbgorICogZm9yIGVpdGhlciBlYWNoIGV2ZW50LCBncm91cCBvZiBldmVudHMgb3Igbm9uZS4K KyAqLworCitzdHJ1Y3QgeGVuY2FtZXJhX2V2ZW50X3BhZ2UgeworCXVpbnQzMl90IGluX2NvbnM7 CisJdWludDMyX3QgaW5fcHJvZDsKKwl1aW50OF90IHJlc2VydmVkWzU2XTsKK307CisKKyNkZWZp bmUgWEVOQ0FNRVJBX0VWRU5UX1BBR0VfU0laRSBYRU5fUEFHRV9TSVpFCisjZGVmaW5lIFhFTkNB TUVSQV9JTl9SSU5HX09GRlMgKHNpemVvZihzdHJ1Y3QgeGVuY2FtZXJhX2V2ZW50X3BhZ2UpKQor I2RlZmluZSBYRU5DQU1FUkFfSU5fUklOR19TSVpFIChYRU5DQU1FUkFfRVZFTlRfUEFHRV9TSVpF IC0gWEVOQ0FNRVJBX0lOX1JJTkdfT0ZGUykKKyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkdfTEVO IChYRU5DQU1FUkFfSU5fUklOR19TSVpFIC8gc2l6ZW9mKHN0cnVjdCB4ZW5jYW1lcmFfZXZ0KSkK KyNkZWZpbmUgWEVOQ0FNRVJBX0lOX1JJTkcocGFnZSkgXAorCSgoc3RydWN0IHhlbmNhbWVyYV9l dnQgKikoKGNoYXIgKikocGFnZSkgKyBYRU5DQU1FUkFfSU5fUklOR19PRkZTKSkKKyNkZWZpbmUg WEVOQ0FNRVJBX0lOX1JJTkdfUkVGKHBhZ2UsIGlkeCkgXAorCShYRU5DQU1FUkFfSU5fUklORygo cGFnZSkpWyhpZHgpICUgWEVOQ0FNRVJBX0lOX1JJTkdfTEVOXSkKKworI2VuZGlmIC8qIF9fWEVO X1BVQkxJQ19JT19DQU1FUkFJRl9IX18gKi8KKwotLSAKMi4yMS4wCgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApY ZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9y Zy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 355D7C10F0E for ; Tue, 9 Apr 2019 09:16:13 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C4C7021473 for ; Tue, 9 Apr 2019 09:16:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="l1DFL5kM" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726568AbfDIJQE (ORCPT ); Tue, 9 Apr 2019 05:16:04 -0400 Received: from mail-lf1-f65.google.com ([209.85.167.65]:46188 "EHLO mail-lf1-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726554AbfDIJQE (ORCPT ); Tue, 9 Apr 2019 05:16:04 -0400 Received: by mail-lf1-f65.google.com with SMTP id r25so3144865lfn.13; Tue, 09 Apr 2019 02:15:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1e9Q3xDDvkLaUlEZgrPTaHD6OSGT6lk8rbjO6VgMirU=; b=l1DFL5kMMCNTUFZUF6NesNGifCHaIJ43QnJoZVoRP6IbgrqZwEuarwriuWi+yc4M1A sMoSPnvUKQKWvimu3Czb6LKkPgV526OewtwoXNXMpKp2YDAtGU97BJHbF0PlAJt6I5Xj oufVG79v6KEeruCBkHPBCrnxP0W6c+XPZme5QTPRJH5IOmCEM9OseUBD3rxq3ZVtMiIK fDpIBoutP9yXIW+pZEx4eBAQCGGHuvUft6ITFT10XmuzqBlCBnWtAlmFTNOzhernN71N +ZtNKe8LhkcdxhU3t0Zw8ZFSM1b/szGwzT9jBIHsYFuqWoeKhMBHF5JcjMyEDzhL6COw Twiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=1e9Q3xDDvkLaUlEZgrPTaHD6OSGT6lk8rbjO6VgMirU=; b=qyKSA6I+B/ZVt+TbkJoWglt9R3GMELDIT7CtvIK5xnPCWBVRGtF+n+vQO4Pxeq9puT MQrNRiPb5Qs4fftn3ESWxzLp2NcMQaSclV0Pg/nUO8s7jSXYVGSKiTc3RLyj9KPZeGO8 +qvLKBIg+3cIqX0nfEvGoP6UihFaprYhyi7mZlLZLLZM64zw8WNw/G/30c2SrpVp7jbB vyH+QZv7AG92Ip7vsRlU4OBgUB/0jaZxxdOqPtuMa+lapXrtji25BCF9oZSxVITy4ZSa uAcwHHCGMay8Iidt+w8Tp/XoFeG5VFkGacW0XvEnxOPb08e7z9cis3RZNhHV9D4phXeE F7aQ== X-Gm-Message-State: APjAAAVp7UZ1r6Zo5IxiXJE59DlCVrL3KnR7kPs2oADkP0ttLVUCDnK8 COtOl3mbpR/3VwbLpombsR8= X-Google-Smtp-Source: APXvYqysbILON46IqasenPXEYZQoRxlIcxukNVKHyuVl7YJHJgAkM4NC9yF7jxTVmEesjTJxrG3SBA== X-Received: by 2002:ac2:44a9:: with SMTP id c9mr322006lfm.68.1554801357940; Tue, 09 Apr 2019 02:15:57 -0700 (PDT) Received: from a2k-HP-ProDesk-600-G2-SFF.kyiv.epam.com (ll-74.141.223.85.sovam.net.ua. [85.223.141.74]) by smtp.gmail.com with ESMTPSA id j10sm1592411lfc.56.2019.04.09.02.15.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 09 Apr 2019 02:15:56 -0700 (PDT) From: Oleksandr Andrushchenko To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, konrad.wilk@oracle.com, jgross@suse.com, hverkuil@xs4all.nl, boris.ostrovsky@oracle.com Cc: andr2000@gmail.com, Oleksandr Andrushchenko Subject: [Xen-devel][PATCH] xen/cameraif: add ABI for para-virtual camera Date: Tue, 9 Apr 2019 12:15:46 +0300 Message-Id: <20190409091546.9606-1-andr2000@gmail.com> X-Mailer: git-send-email 2.21.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org From: Oleksandr Andrushchenko This is the ABI for the two halves of a para-virtualized camera driver which extends Xen's reach multimedia capabilities even further enabling it for video conferencing, In-Vehicle Infotainment, high definition maps etc. The initial goal is to support most needed functionality with the final idea to make it possible to extend the protocol if need be: 1. Provide means for base virtual device configuration: - pixel formats - resolutions - frame rates 2. Support basic camera controls: - contrast - brightness - hue - saturation 3. Support streaming control Signed-off-by: Oleksandr Andrushchenko Cc: Juergen Gross Cc: Konrad Rzeszutek Wilk Cc: Hans Verkuil --- include/xen/interface/io/cameraif.h | 1365 +++++++++++++++++++++++++++ 1 file changed, 1365 insertions(+) create mode 100644 include/xen/interface/io/cameraif.h diff --git a/include/xen/interface/io/cameraif.h b/include/xen/interface/io/cameraif.h new file mode 100644 index 000000000000..8618ab189489 --- /dev/null +++ b/include/xen/interface/io/cameraif.h @@ -0,0 +1,1365 @@ +/****************************************************************************** + * cameraif.h + * + * Unified camera device I/O interface for Xen guest OSes. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Copyright (C) 2018-2019 EPAM Systems Inc. + * + * Author: Oleksandr Andrushchenko + */ + +#ifndef __XEN_PUBLIC_IO_CAMERAIF_H__ +#define __XEN_PUBLIC_IO_CAMERAIF_H__ + +#include "ring.h" +#include "../grant_table.h" + +/* + ****************************************************************************** + * Protocol version + ****************************************************************************** + */ +#define XENCAMERA_PROTOCOL_VERSION "1" + +/* + ****************************************************************************** + * Feature and Parameter Negotiation + ****************************************************************************** + * + * Front->back notifications: when enqueuing a new request, sending a + * notification can be made conditional on xencamera_req (i.e., the generic + * hold-off mechanism provided by the ring macros). Backends must set + * xencamera_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). + * + * Back->front notifications: when enqueuing a new response, sending a + * notification can be made conditional on xencamera_resp (i.e., the generic + * hold-off mechanism provided by the ring macros). Frontends must set + * xencamera_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). + * + * The two halves of a para-virtual camera driver utilize nodes within + * XenStore to communicate capabilities and to negotiate operating parameters. + * This section enumerates these nodes which reside in the respective front and + * backend portions of XenStore, following the XenBus convention. + * + * All data in XenStore is stored as strings. Nodes specifying numeric + * values are encoded in decimal. Integer value ranges listed below are + * expressed as fixed sized integer types capable of storing the conversion + * of a properly formatted node string, without loss of information. + * + ****************************************************************************** + * Example configuration + ****************************************************************************** + * + * This is an example of backend and frontend configuration: + * + *--------------------------------- Backend ----------------------------------- + * + * /local/domain/0/backend/vcamera/1/0/frontend-id = "1" + * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0" + * /local/domain/0/backend/vcamera/1/0/state = "4" + * /local/domain/0/backend/vcamera/1/0/versions = "1,2" + * + *--------------------------------- Frontend ---------------------------------- + * + * /local/domain/1/device/vcamera/0/backend-id = "0" + * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1" + * /local/domain/1/device/vcamera/0/state = "4" + * /local/domain/1/device/vcamera/0/version = "1" + * /local/domain/1/device/vcamera/0/be-alloc = "1" + * + *---------------------------- Device 0 configuration ------------------------- + * + * /local/domain/1/device/vcamera/0/max-buffers = "3" + * /local/domain/1/device/vcamera/0/controls = "contrast,hue" + * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = "30/1,15/1" + * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080/frame-rates = "15/2" + * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = "15/1,15/2" + * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720/frame-rates = "15/2" + * /local/domain/1/device/vcamera/0/unique-id = "0" + * /local/domain/1/device/vcamera/0/req-ring-ref = "2832" + * /local/domain/1/device/vcamera/0/req-event-channel = "15" + * /local/domain/1/device/vcamera/0/evt-ring-ref = "387" + * /local/domain/1/device/vcamera/0/evt-event-channel = "16" + * + *---------------------------- Device 1 configuration ------------------------- + * + * /local/domain/1/device/vcamera/1/max-buffers = "8" + * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue" + * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = "30/1,15/2" + * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080/frame-rates = "15/2" + * /local/domain/1/device/vcamera/1/unique-id = "1" + * /local/domain/1/device/vcamera/1/req-ring-ref = "2833" + * /local/domain/1/device/vcamera/1/req-event-channel = "17" + * /local/domain/1/device/vcamera/1/evt-ring-ref = "388" + * /local/domain/1/device/vcamera/1/evt-event-channel = "18" + * + ****************************************************************************** + * Backend XenBus Nodes + ****************************************************************************** + * + *----------------------------- Protocol version ------------------------------ + * + * versions + * Values: + * + * List of XENCAMERA_LIST_SEPARATOR separated protocol versions supported + * by the backend. For example "1,2,3". + * + ****************************************************************************** + * Frontend XenBus Nodes + ****************************************************************************** + * + *-------------------------------- Addressing --------------------------------- + * + * dom-id + * Values: + * + * Domain identifier. + * + * dev-id + * Values: + * + * Device identifier. + * + * /local/domain//device/vcamera//... + * + *----------------------------- Protocol version ------------------------------ + * + * version + * Values: + * + * Protocol version, chosen among the ones supported by the backend. + * + *------------------------- Backend buffer allocation ------------------------- + * + * be-alloc + * Values: "0", "1" + * + * If value is set to "1", then backend will be the buffer + * provider/allocator for this domain during XENCAMERA_OP_BUF_CREATE + * operation. + * If value is not "1" or omitted frontend must allocate buffers itself. + * + *------------------------------- Camera settings ----------------------------- + * + * unique-id + * Values: + * + * After device instance initialization each camera is assigned a + * unique ID, so it can be identified by the backend by this ID. + * This can be UUID or such. + * + * max-buffers + * Values: + * + * Maximum number of camera buffers this frontend may use. + * + * controls + * Values: + * + * List of supported camera controls separated by XENCAMERA_LIST_SEPARATOR. + * Camera controls are expressed as a list of string values w/o any + * ordering requirement. + * + * formats + * Values: + * + * Formats are organized as a set of directories one per each + * supported pixel format. The name of the directory is the + * corresponding FOURCC string label. The next level of + * the directory under represents supported resolutions. + * If the format represents a big-endian variant of a little + * endian format, then the "-BE" suffix must be added. E.g. 'AR15' vs + * 'AR15-BE'. + * If FOURCC string label has spaces then those are only allowed to + * be at the end of the label and must be trimmed, for example + * 'Y16' and 'Y16-BE' will be trimmed. + * + * resolution + * Values: x + * + * Resolutions are organized as a set of directories one per each + * supported resolution under corresponding directory. + * The name of the directory is the supported width and height + * of the camera resolution in pixels. + * + * frame-rates + * Values: / + * + * List of XENCAMERA_FRAME_RATE_SEPARATOR separated supported frame rates + * of the camera expressed as numerator and denominator of the + * corresponding frame rate. + * + *------------------- Camera Request Transport Parameters --------------------- + * + * This communication path is used to deliver requests from frontend to backend + * and get the corresponding responses from backend to frontend, + * set up per virtual camera device. + * + * req-event-channel + * Values: + * + * The identifier of the Xen camera's control event channel + * used to signal activity in the ring buffer. + * + * req-ring-ref + * Values: + * + * The Xen grant reference granting permission for the backend to map + * a sole page of camera's control ring buffer. + * + *-------------------- Camera Event Transport Parameters ---------------------- + * + * This communication path is used to deliver asynchronous events from backend + * to frontend, set up per virtual camera device. + * + * evt-event-channel + * Values: + * + * The identifier of the Xen camera's event channel + * used to signal activity in the ring buffer. + * + * evt-ring-ref + * Values: + * + * The Xen grant reference granting permission for the backend to map + * a sole page of camera's event ring buffer. + */ + +/* + ****************************************************************************** + * STATE DIAGRAMS + ****************************************************************************** + * + * Tool stack creates front and back state nodes with initial state + * XenbusStateInitialising. + * Tool stack creates and sets up frontend camera configuration + * nodes per domain. + * + *-------------------------------- Normal flow -------------------------------- + * + * Front Back + * ================================= ===================================== + * XenbusStateInitialising XenbusStateInitialising + * o Query backend device identification + * data. + * o Open and validate backend device. + * | + * | + * V + * XenbusStateInitWait + * + * o Query frontend configuration + * o Allocate and initialize + * event channels per configured + * camera. + * o Publish transport parameters + * that will be in effect during + * this connection. + * | + * | + * V + * XenbusStateInitialised + * + * o Query frontend transport parameters. + * o Connect to the event channels. + * | + * | + * V + * XenbusStateConnected + * + * o Create and initialize OS + * virtual camera as per + * configuration. + * | + * | + * V + * XenbusStateConnected + * + * XenbusStateUnknown + * XenbusStateClosed + * XenbusStateClosing + * o Remove virtual camera device + * o Remove event channels + * | + * | + * V + * XenbusStateClosed + * + *------------------------------- Recovery flow ------------------------------- + * + * In case of frontend unrecoverable errors backend handles that as + * if frontend goes into the XenbusStateClosed state. + * + * In case of backend unrecoverable errors frontend tries removing + * the virtualized device. If this is possible at the moment of error, + * then frontend goes into the XenbusStateInitialising state and is ready for + * new connection with backend. If the virtualized device is still in use and + * cannot be removed, then frontend goes into the XenbusStateReconfiguring state + * until either the virtualized device is removed or backend initiates a new + * connection. On the virtualized device removal frontend goes into the + * XenbusStateInitialising state. + * + * Note on XenbusStateReconfiguring state of the frontend: if backend has + * unrecoverable errors then frontend cannot send requests to the backend + * and thus cannot provide functionality of the virtualized device anymore. + * After backend is back to normal the virtualized device may still hold some + * state: configuration in use, allocated buffers, client application state etc. + * In most cases, this will require frontend to implement complex recovery + * reconnect logic. Instead, by going into XenbusStateReconfiguring state, + * frontend will make sure no new clients of the virtualized device are + * accepted, allow existing client(s) to exit gracefully by signaling error + * state etc. + * Once all the clients are gone frontend can reinitialize the virtualized + * device and get into XenbusStateInitialising state again signaling the + * backend that a new connection can be made. + * + * There are multiple conditions possible under which frontend will go from + * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS + * specific. For example: + * 1. The underlying OS framework may provide callbacks to signal that the last + * client of the virtualized device has gone and the device can be removed + * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) + * to periodically check if this is the right time to re-try removal of + * the virtualized device. + * 3. By any other means. + * + ****************************************************************************** + * REQUEST CODES + ****************************************************************************** + */ +#define XENCAMERA_OP_CONFIG_SET 0x00 +#define XENCAMERA_OP_CONFIG_GET 0x01 +#define XENCAMERA_OP_CONFIG_VALIDATE 0x02 +#define XENCAMERA_OP_FRAME_RATE_SET 0x03 +#define XENCAMERA_OP_BUF_GET_LAYOUT 0x04 +#define XENCAMERA_OP_BUF_REQUEST 0x05 +#define XENCAMERA_OP_BUF_CREATE 0x06 +#define XENCAMERA_OP_BUF_DESTROY 0x07 +#define XENCAMERA_OP_BUF_QUEUE 0x08 +#define XENCAMERA_OP_BUF_DEQUEUE 0x09 +#define XENCAMERA_OP_CTRL_ENUM 0x0a +#define XENCAMERA_OP_CTRL_SET 0x0b +#define XENCAMERA_OP_CTRL_GET 0x0c +#define XENCAMERA_OP_STREAM_START 0x0d +#define XENCAMERA_OP_STREAM_STOP 0x0e + +#define XENCAMERA_CTRL_BRIGHTNESS 0 +#define XENCAMERA_CTRL_CONTRAST 1 +#define XENCAMERA_CTRL_SATURATION 2 +#define XENCAMERA_CTRL_HUE 3 + +/* Number of supported controls. */ +#define XENCAMERA_MAX_CTRL 4 + +/* Control is read-only. */ +#define XENCAMERA_CTRL_FLG_RO (1 << 0) +/* Control is write-only. */ +#define XENCAMERA_CTRL_FLG_WO (1 << 1) +/* Control's value is volatile. */ +#define XENCAMERA_CTRL_FLG_VOLATILE (1 << 2) + +/* Supported color spaces. */ +#define XENCAMERA_COLORSPACE_DEFAULT 0 +#define XENCAMERA_COLORSPACE_SMPTE170M 1 +#define XENCAMERA_COLORSPACE_REC709 2 +#define XENCAMERA_COLORSPACE_SRGB 3 +#define XENCAMERA_COLORSPACE_OPRGB 4 +#define XENCAMERA_COLORSPACE_BT2020 5 +#define XENCAMERA_COLORSPACE_DCI_P3 6 + +/* Color space transfer function. */ +#define XENCAMERA_XFER_FUNC_DEFAULT 0 +#define XENCAMERA_XFER_FUNC_709 1 +#define XENCAMERA_XFER_FUNC_SRGB 2 +#define XENCAMERA_XFER_FUNC_OPRGB 3 +#define XENCAMERA_XFER_FUNC_NONE 4 +#define XENCAMERA_XFER_FUNC_DCI_P3 5 +#define XENCAMERA_XFER_FUNC_SMPTE2084 6 + +/* Color space Y’CbCr encoding. */ +#define XENCAMERA_YCBCR_ENC_IGNORE 0 +#define XENCAMERA_YCBCR_ENC_601 1 +#define XENCAMERA_YCBCR_ENC_709 2 +#define XENCAMERA_YCBCR_ENC_XV601 3 +#define XENCAMERA_YCBCR_ENC_XV709 4 +#define XENCAMERA_YCBCR_ENC_BT2020 5 +#define XENCAMERA_YCBCR_ENC_BT2020_CONST_LUM 6 + +/* Quantization range. */ +#define XENCAMERA_QUANTIZATION_DEFAULT 0 +#define XENCAMERA_QUANTIZATION_FULL_RANGE 1 +#define XENCAMERA_QUANTIZATION_LIM_RANGE 2 + +/* + ****************************************************************************** + * EVENT CODES + ****************************************************************************** + */ +#define XENCAMERA_EVT_FRAME_AVAIL 0x00 +#define XENCAMERA_EVT_CTRL_CHANGE 0x01 + +/* + ****************************************************************************** + * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS + ****************************************************************************** + */ +#define XENCAMERA_DRIVER_NAME "vcamera" + +#define XENCAMERA_LIST_SEPARATOR "," +#define XENCAMERA_RESOLUTION_SEPARATOR "x" +#define XENCAMERA_FRACTION_SEPARATOR "/" + +#define XENCAMERA_FIELD_BE_VERSIONS "versions" +#define XENCAMERA_FIELD_FE_VERSION "version" +#define XENCAMERA_FIELD_REQ_RING_REF "req-ring-ref" +#define XENCAMERA_FIELD_REQ_CHANNEL "req-event-channel" +#define XENCAMERA_FIELD_EVT_RING_REF "evt-ring-ref" +#define XENCAMERA_FIELD_EVT_CHANNEL "evt-event-channel" +#define XENCAMERA_FIELD_MAX_BUFFERS "max-buffers" +#define XENCAMERA_FIELD_CONTROLS "controls" +#define XENCAMERA_FIELD_FORMATS "formats" +#define XENCAMERA_FIELD_FRAME_RATES "frame-rates" +#define XENCAMERA_FIELD_BE_ALLOC "be-alloc" +#define XENCAMERA_FIELD_UNIQUE_ID "unique-id" + +#define XENCAMERA_CTRL_BRIGHTNESS_STR "brightness" +#define XENCAMERA_CTRL_CONTRAST_STR "contrast" +#define XENCAMERA_CTRL_SATURATION_STR "saturation" +#define XENCAMERA_CTRL_HUE_STR "hue" + +#define XENCAMERA_FOURCC_BIGENDIAN_STR "-BE" + +/* Maximum number of buffer planes supported. */ +#define XENCAMERA_MAX_PLANE 4 + +/* + ****************************************************************************** + * STATUS RETURN CODES + ****************************************************************************** + * + * Status return code is zero on success and -XEN_EXX on failure. + * + ****************************************************************************** + * Assumptions + ****************************************************************************** + * + * - usage of grant reference 0 as invalid grant reference: + * grant reference 0 is valid, but never exposed to a PV driver, + * because of the fact it is already in use/reserved by the PV console. + * - all references in this document to page sizes must be treated + * as pages of size XEN_PAGE_SIZE unless otherwise noted. + * - all FOURCC mappings used for configuration and messaging are + * Linux V4L2 ones: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h + * with the following exceptions: + * - characters are allowed in [0x20; 0x7f] range + * - when used for XenStore configuration entries the following + * are not allowed: + * - '/', '\', ' ' (space), '<', '>', ':', '"', '|', '?', '*' + * - if trailing spaces are part of the FOURCC code then those must be + * trimmed + * + * + ****************************************************************************** + * Description of the protocol between frontend and backend driver + ****************************************************************************** + * + * The two halves of a Para-virtual camera driver communicate with + * each other using shared pages and event channels. + * Shared page contains a ring with request/response packets. + * + * All reserved fields in the structures below must be 0. + * + * For all request/response/event packets: + * - frame rate parameter is represented as a pair of 4 octet long + * numerator and denominator: + * - frame_rate_numer - uint32_t, numerator of the frame rate + * - frame_rate_denom - uint32_t, denominator of the frame rate + * The corresponding frame rate (Hz) is calculated as: + * frame_rate = frame_rate_numer / frame_rate_denom + * - buffer index is a zero based index of the buffer. Must be less than + * the value of XENCAMERA_OP_CONFIG_SET.num_bufs response: + * - index - uint8_t, index of the buffer. + * + * + *---------------------------------- Requests --------------------------------- + * + * All request packets have the same length (64 octets). + * All request packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | operation | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * id - uint16_t, private guest value, echoed in response. + * operation - uint8_t, operation code, XENCAMERA_OP_XXX. + * + * + * Request to set/validate the configuration - request to set the + * configuration/mode of the camera (XENCAMERA_OP_CONFIG_SET) or to + * check if the configuration is valid and can be used + * (XENCAMERA_OP_CONFIG_VALIDATE): + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_XXX | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | pixel format | 12 + * +----------------+----------------+----------------+----------------+ + * | width | 16 + * +----------------+----------------+----------------+----------------+ + * | height | 20 + * +----------------+----------------+----------------+----------------+ + * | reserved | 24 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * pixel_format - uint32_t, pixel format to be used, FOURCC code. + * width - uint32_t, width in pixels. + * height - uint32_t, height in pixels. + * + * See response format for this request. + * + * Notes: + * - the only difference between XENCAMERA_OP_CONFIG_VALIDATE and + * XENCAMERA_OP_CONFIG_SET is that the former doesn't actually change + * camera configuration, but queries if the configuration is valid. + * This can be used while stream is active and/or buffers allocated. + * - frontend must check the corresponding response in order to see + * if the values reported back by the backend do match the desired ones + * and can be accepted. + * - frontend may send multiple XENCAMERA_OP_CONFIG_SET requests before + * sending XENCAMERA_OP_STREAM_START request to update or tune the + * final stream configuration. + * - configuration cannot be changed during active streaming, e.g. + * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP + * requests. + */ +struct xencamera_config_req { + uint32_t pixel_format; + uint32_t width; + uint32_t height; +}; + +/* + * Request current configuration of the camera: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_GET | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * + * Request to set the frame rate of the stream: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _FRAME_RATE_SET| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_numer | 12 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_denom | 16 + * +----------------+----------------+----------------+----------------+ + * | reserved | 20 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * frame_rate_numer - uint32_t, numerator of the frame rate. + * frame_rate_denom - uint32_t, denominator of the frame rate. + * + * Notes: + * - to query the current (actual) frame rate use XENCAMERA_OP_CONFIG_GET + * request. + * - this request can be used with camera buffers allocated, but stream + * stopped, e.g. frontend is allowed to stop the stream with + * XENCAMERA_OP_STREAM_STOP, hold the buffers allocated (e.g. keep the + * configuration set with XENCAMERA_OP_CONFIG_SET), change the + * frame rate of the stream and (re)start the stream again with + * XENCAMERA_OP_STREAM_START. + * - frame rate cannot be changed during active streaming, e.g. + * after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP + * commands. + */ +struct xencamera_frame_rate_req { + uint32_t frame_rate_numer; + uint32_t frame_rate_denom; +}; + +/* + * Request camera buffer's layout: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _BUF_GET_LAYOUT| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * + * Request number of buffers to be used: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_REQUEST| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | num_bufs | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_bufs - uint8_t, desired number of buffers to be used. + * + * If num_bufs is not zero then the backend validates the requested number of + * buffers and responds with the number of buffers allowed for this frontend. + * Frontend is responsible for checking the corresponding response in order to + * see if the values reported back by the backend do match the desired ones + * and can be accepted. + * Frontend is allowed to send multiple XENCAMERA_OP_BUF_REQUEST requests + * before sending XENCAMERA_OP_STREAM_START request to update or tune the + * final configuration. + * Frontend is not allowed to change the camera configuration after this call + * with a non-zero value of num_bufs. If camera reconfiguration is required + * then this request must be sent with num_bufs set to zero and any created + * buffers must be destroyed first. + * Frontend is not allowed to change the number of buffers after the + * streaming has started. + * + * If num_bufs is 0 and streaming has not started yet, then the backend will + * free all previously allocated buffers (if any). + * Trying to call this if streaming is in progress will result in an error. + * + * If camera reconfiguration is required then the streaming must be stopped + * and this request must be sent with num_bufs set to zero and any + * created buffers must be destroyed. + * + * Please note, that the number of buffers in this request must not exceed + * the value configured in XenStore.max-buffers. + * + * See response format for this request. + */ +struct xencamera_buf_request { + uint8_t num_bufs; +}; + +/* + * Request camera buffer creation: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_CREATE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[0] | 16 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[1] | 20 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[2] | 24 + * +----------------+----------------+----------------+----------------+ + * | plane_offset[3] | 28 + * +----------------+----------------+----------------+----------------+ + * | gref_directory | 32 + * +----------------+----------------+----------------+----------------+ + * | reserved | 36 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * An attempt to create multiple buffers with the same index is an error. + * index can be re-used after destroying the corresponding camera buffer. + * + * index - uint8_t, index of the buffer to be created in the range + * from 0 to the num_bufs field returned in response for + * XENCAMERA_OP_BUF_REQUEST request + * plane_offset - array of uint32_t, offset of the corresponding plane + * in octets from the buffer start. Number of offsets returned is + * equal to the value returned in XENCAMERA_OP_BUF_GET_LAYOUT.num_planes. + * gref_directory - grant_ref_t, a reference to the first shared page + * describing shared buffer references. The size of the buffer is equal to + * XENCAMERA_OP_BUF_GET_LAYOUT.size response. At least one page exists. If + * shared buffer size exceeds what can be addressed by this single page, + * then reference to the next shared page must be supplied (see + * gref_dir_next_page below). + * + * If XENCAMERA_FIELD_BE_ALLOC configuration entry is set, then backend will + * allocate the buffer with the parameters provided in this request and page + * directory is handled as follows: + * Frontend on request: + * - allocates pages for the directory (gref_directory, + * gref_dir_next_page(s) + * - grants permissions for the pages of the directory to the backend + * - sets gref_dir_next_page fields + * Backend on response: + * - grants permissions for the pages of the buffer allocated to + * the frontend + * - fills in page directory with grant references + * (gref[] in struct xencamera_page_directory) + */ +struct xencamera_buf_create_req { + uint8_t index; + uint8_t reserved[3]; + uint32_t plane_offset[XENCAMERA_MAX_PLANE]; + grant_ref_t gref_directory; +}; + +/* + * Shared page for XENCAMERA_OP_BUF_CREATE buffer descriptor (gref_directory in + * the request) employs a list of pages, describing all pages of the shared + * data buffer: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | gref_dir_next_page | 4 + * +----------------+----------------+----------------+----------------+ + * | gref[0] | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | gref[i] | i*4+8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | gref[N - 1] | N*4+8 + * +----------------+----------------+----------------+----------------+ + * + * gref_dir_next_page - grant_ref_t, reference to the next page describing + * page directory. Must be 0 if there are no more pages in the list. + * gref[i] - grant_ref_t, reference to a shared page of the buffer + * allocated at XENCAMERA_OP_BUF_CREATE. + * + * Number of grant_ref_t entries in the whole page directory is not + * passed, but instead can be calculated as: + * num_grefs_total = (XENCAMERA_OP_BUF_REQUEST.size + XEN_PAGE_SIZE - 1) / + * XEN_PAGE_SIZE + */ +struct xencamera_page_directory { + grant_ref_t gref_dir_next_page; + grant_ref_t gref[1]; /* Variable length */ +}; + +/* + * Request buffer destruction - destroy a previously allocated camera buffer: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_DESTROY| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the buffer to be destroyed. + * + * + * Request queueing of the buffer for backend use: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_BUF_QUEUE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Notes: + * - frontends must not access the buffer content after this request until + * response to XENCAMERA_OP_BUF_DEQUEUE has been received. + * - buffers must be queued to the backend before destroying them with + * XENCAMERA_OP_BUF_DESTROY. + * + * index - uint8_t, index of the buffer to be queued. + * + * + * Request dequeueing of the buffer for frontend use: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_BUF_DEQUEUE | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Notes: + * - frontend is allowed to access the buffer content after the corresponding + * response to this request. + * + * index - uint8_t, index of the buffer to be queued. + * + * + * Request camera control details: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_ENUM | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * index - uint8_t, index of the control to be queried. + */ +struct xencamera_index { + uint8_t index; +}; + +/* + * Request camera control change: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_SET_CTRL | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 20 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | reserved | 28 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + */ +struct xencamera_ctrl_value { + uint8_t type; + uint8_t reserved[7]; + int64_t value; +}; + +/* + * Request camera control state: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_GET_CTRL | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * See response format for this request. + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + */ +struct xencamera_get_ctrl_req { + uint8_t type; +}; + +/* + * Request camera capture stream start: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_STREAM_START| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * + * Request camera capture stream stop: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_STREAM_STOP | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * + *---------------------------------- Responses -------------------------------- + * + * All response packets have the same length (64 octets). + * + * All response packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | operation | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * + * id - uint16_t, copied from the request. + * operation - uint8_t, XENCAMERA_OP_* - copied from request. + * status - int32_t, response status, zero on success and -XEN_EXX on failure. + * + * + * Configuration response - response for XENCAMERA_OP_CONFIG_SET, + * XENCAMERA_OP_CONFIG_GET and XENCAMERA_OP_CONFIG_VALIDATE requests: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CONFIG_XXX | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | pixel format | 12 + * +----------------+----------------+----------------+----------------+ + * | width | 16 + * +----------------+----------------+----------------+----------------+ + * | height | 20 + * +----------------+----------------+----------------+----------------+ + * | colorspace | 24 + * +----------------+----------------+----------------+----------------+ + * | xfer_func | 28 + * +----------------+----------------+----------------+----------------+ + * | ycbcr_enc | 32 + * +----------------+----------------+----------------+----------------+ + * | quantization | 36 + * +----------------+----------------+----------------+----------------+ + * | displ_asp_ratio_numer | 40 + * +----------------+----------------+----------------+----------------+ + * | displ_asp_ratio_denom | 44 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_numer | 48 + * +----------------+----------------+----------------+----------------+ + * | frame_rate_denom | 52 + * +----------------+----------------+----------------+----------------+ + * | reserved | 56 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * Meaning of the corresponding values in this response is the same as for + * XENCAMERA_OP_CONFIG_SET and XENCAMERA_OP_FRAME_RATE_SET requests. + * + * colorspace - uint32_t, this supplements pixel_format parameter, + * one of the XENCAMERA_COLORSPACE_XXX. + * xfer_func - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_XFER_FUNC_XXX. + * ycbcr_enc - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_YCBCR_ENC_XXX. Please note, that ycbcr_enc is only + * valid for YCbCr pixelformats and should be ignored otherwise. + * quantization - uint32_t, this supplements colorspace parameter, + * one of the XENCAMERA_QUANTIZATION_XXX. + * displ_asp_ratio_numer - uint32_t, numerator of the display aspect ratio. + * displ_asp_ratio_denom - uint32_t, denominator of the display aspect ratio. + */ +struct xencamera_config_resp { + uint32_t pixel_format; + uint32_t width; + uint32_t height; + uint32_t colorspace; + uint32_t xfer_func; + uint32_t ycbcr_enc; + uint32_t quantization; + uint32_t displ_asp_ratio_numer; + uint32_t displ_asp_ratio_denom; + uint32_t frame_rate_numer; + uint32_t frame_rate_denom; +}; + +/* + * Request buffer response - response for XENCAMERA_OP_BUF_GET_LAYOUT + * request: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_BUF_GET_LAYOUT | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | num_planes | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | size | 16 + * +----------------+----------------+----------------+----------------+ + * | plane_size[0] | 20 + * +----------------+----------------+----------------+----------------+ + * | plane_size[1] | 24 + * +----------------+----------------+----------------+----------------+ + * | plane_size[2] | 28 + * +----------------+----------------+----------------+----------------+ + * | plane_size[3] | 32 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[0] | 36 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[1] | 40 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[2] | 44 + * +----------------+----------------+----------------+----------------+ + * | plane_stride[3] | 48 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_planes - uint8_t, number of planes of the buffer. + * size - uint32_t, overall size of the buffer including sizes of the + * individual planes and padding if applicable. + * plane_size - array of uint32_t, size in octets of the corresponding plane + * including padding. + * plane_stride - array of uint32_t, size in octets occupied by the + * corresponding single image line including padding if applicable. + * + * Note! The sizes and strides in this response apply to all buffers created + * with XENCAMERA_OP_BUF_CREATE command, but individual buffers may have + * different plane offsets, see XENCAMERA_OP_BUF_REQUEST.plane_offset. + */ +struct xencamera_buf_get_layout_resp { + uint8_t num_planes; + uint8_t reserved[3]; + uint32_t size; + uint32_t plane_size[XENCAMERA_MAX_PLANE]; + uint32_t plane_stride[XENCAMERA_MAX_PLANE]; +}; + +/* + * Request buffer response - response for XENCAMERA_OP_BUF_REQUEST + * request: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_OP_BUF_REQUEST | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | num_buffers | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * num_buffers - uint8_t, number of buffers to be used. + * + * + * Control enumerate response - response for XENCAMERA_OP_CTRL_ENUM: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_ENUM | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | index | type | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | flags | 16 + * +----------------+----------------+----------------+----------------+ + * | min low 32-bits | 20 + * +----------------+----------------+----------------+----------------+ + * | min high 32-bits | 24 + * +----------------+----------------+----------------+----------------+ + * | max low 32-bits | 28 + * +----------------+----------------+----------------+----------------+ + * | max high 32-bits | 32 + * +----------------+----------------+----------------+----------------+ + * | step low 32-bits | 36 + * +----------------+----------------+----------------+----------------+ + * | step high 32-bits | 40 + * +----------------+----------------+----------------+----------------+ + * | def_val low 32-bits | 44 + * +----------------+----------------+----------------+----------------+ + * | def_val high 32-bits | 48 + * +----------------+----------------+----------------+----------------+ + * | reserved | 52 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the camera control in response. + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * flags - uint32_t, flags of the control, one of the XENCAMERA_CTRL_FLG_XXX. + * min - int64_t, minimum value of the control. + * max - int64_t, maximum value of the control. + * step - int64_t, minimum size in which control value can be changed. + * def_val - int64_t, default value of the control. + */ +struct xencamera_ctrl_enum_resp { + uint8_t index; + uint8_t type; + uint8_t reserved[2]; + uint32_t flags; + int64_t min; + int64_t max; + int64_t step; + int64_t def_val; +}; + +/* + * Get control response - response for XENCAMERA_OP_CTRL_GET: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | _OP_CTRL_GET | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | status | 8 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | reserved | 20 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 28 + * +----------------+----------------+----------------+----------------+ + * | reserved | 32 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + */ + +/* + *----------------------------------- Events ---------------------------------- + * + * Events are sent via a shared page allocated by the front and propagated by + * evt-event-channel/evt-ring-ref XenStore entries. + * + * All event packets have the same length (64 octets). + * All event packets have common header: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id | type | reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * + * id - uint16_t, event id, may be used by front. + * type - uint8_t, type of the event. + * + * + * Frame captured event - event from back to front when a new captured + * frame is available: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_EVT_FRAME_AVAIL| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | index | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | used_sz | 16 + * +----------------+----------------+----------------+----------------+ + * | seq_num | 20 + * +----------------+----------------+----------------+----------------+ + * | reserved | 24 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * index - uint8_t, index of the buffer that contains new captured frame, + * see XENCAMERA_OP_BUF_CREATE description on the range + * used_sz - uint32_t, number of octets this frame has. This can be less + * than the XENCAMERA_OP_BUF_REQUEST.size (response) for compressed formats. + * seq_num - uint32_t, sequential number of the frame. Must be + * monotonically increasing. If skips are detected in seq_num then that + * means that the frames in-between were dropped. Note however that not + * all video capture hardware is capable of detecting dropped frames. + * In that case there will be no skips in the sequence counter. + */ +struct xencamera_frame_avail_evt { + uint8_t index; + uint8_t reserved[3]; + uint32_t used_sz; + uint32_t seq_num; +}; + +/* + * Control change event- event from back to front when camera control + * has changed: + * 0 1 2 3 octet + * +----------------+----------------+----------------+----------------+ + * | id |_EVT_CTRL_CHANGE| reserved | 4 + * +----------------+----------------+----------------+----------------+ + * | type | reserved | 8 + * +----------------+----------------+----------------+----------------+ + * | reserved | 12 + * +----------------+----------------+----------------+----------------+ + * | reserved | 16 + * +----------------+----------------+----------------+----------------+ + * | value low 32-bit | 20 + * +----------------+----------------+----------------+----------------+ + * | value high 32-bit | 24 + * +----------------+----------------+----------------+----------------+ + * | reserved | 28 + * +----------------+----------------+----------------+----------------+ + * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| + * +----------------+----------------+----------------+----------------+ + * | reserved | 64 + * +----------------+----------------+----------------+----------------+ + * + * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX. + * value - int64_t, new value of the control. + * + * Notes: + * - this event is not sent for write-only controls + * - this event is not sent to the originator of the control change + * - this event is not sent when frontend first connects, e.g. initial + * control state must be explicitly queried + */ + +struct xencamera_req { + uint16_t id; + uint8_t operation; + uint8_t reserved[5]; + union { + struct xencamera_config_req config; + struct xencamera_frame_rate_req frame_rate; + struct xencamera_buf_request buf_request; + struct xencamera_buf_create_req buf_create; + struct xencamera_index index; + struct xencamera_ctrl_value ctrl_value; + struct xencamera_get_ctrl_req get_ctrl; + uint8_t reserved[56]; + } req; +}; + +struct xencamera_resp { + uint16_t id; + uint8_t operation; + uint8_t reserved; + int32_t status; + union { + struct xencamera_config_resp config; + struct xencamera_buf_get_layout_resp buf_layout; + struct xencamera_buf_request buf_request; + struct xencamera_ctrl_enum_resp ctrl_enum; + struct xencamera_ctrl_value ctrl_value; + uint8_t reserved1[56]; + } resp; +}; + +struct xencamera_evt { + uint16_t id; + uint8_t type; + uint8_t reserved[5]; + union { + struct xencamera_frame_avail_evt frame_avail; + struct xencamera_ctrl_value ctrl_value; + uint8_t reserved[56]; + } evt; +}; + +DEFINE_RING_TYPES(xen_cameraif, struct xencamera_req, struct xencamera_resp); + +/* + ****************************************************************************** + * Back to front events delivery + ****************************************************************************** + * In order to deliver asynchronous events from back to front a shared page is + * allocated by front and its granted reference propagated to back via + * XenStore entries (evt-ring-ref/evt-event-channel). + * This page has a common header used by both front and back to synchronize + * access and control event's ring buffer, while back being a producer of the + * events and front being a consumer. The rest of the page after the header + * is used for event packets. + * + * Upon reception of an event(s) front may confirm its reception + * for either each event, group of events or none. + */ + +struct xencamera_event_page { + uint32_t in_cons; + uint32_t in_prod; + uint8_t reserved[56]; +}; + +#define XENCAMERA_EVENT_PAGE_SIZE XEN_PAGE_SIZE +#define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page)) +#define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS) +#define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt)) +#define XENCAMERA_IN_RING(page) \ + ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS)) +#define XENCAMERA_IN_RING_REF(page, idx) \ + (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN]) + +#endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */ + -- 2.21.0