All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20111203162757.GA24302@ericsson.com>

diff --git a/a/1.txt b/N1/1.txt
index 5e1279a..ffe91b0 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,454 +1,329 @@
-On Sat, Dec 03, 2011 at 10:31:30AM -0500, Eddi De Pieri wrote:
-> This patch add support to multiplexed smbus for proliant microserver
-> N36L and may be applicable to other configuration based on sb8xx
-> southbus.
-> 
-
-Did you read Documentation/SubmittingPatches ?
-
-The patch doesn't follow the canonical patch format, I can see that lines are split,
-the patch isn't based on the linux root directory but on some other directory which
-I guess you expect the reader to figure out, the patch description includes lots
-of information which is irrelevant for the changelog, and it is based on 2.6.32
-instead of the current release and thus pretty much guaranteed not to apply
-to the current kernel version. All that w/o even looking into the code.
-
-The patch implements an I2C multiplexer but doesn't use the I2C multiplexer
-infrastructure. I am not one of the I2C maintainers, but that alone would cause me
-to reject this patch (on top of all the other reasons above).
-
-Guenter
-
-> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -l
-> i2c-0   smbus           SMBus piix4 adapter (SDA0)              SMBus adapter
-> i2c-1   smbus           SMBus piix4 adapter (SDA2)              SMBus adapter
-> i2c-2   smbus           SMBus piix4 adapter (SDA3)              SMBus adapter
-> i2c-3   smbus           SMBus piix4 adapter (SDA4)              SMBus adapter
-> root@proliant:/usr/src/lm-sensors/eddi#
-> 
-> yes SDA1 is reserved... so i can't multiplex it
-> 
-> root@proliant:/usr/src/lm-sensors/eddi# sensors
-> k10temp-pci-00c3
-> Adapter: PCI adapter
-> temp1:       +24.5°C  (high = +70.0°C, crit = +100.0°C)
-> 
-> w83795adg-i2c-1-2f
-> Adapter: SMBus piix4 adapter (SDA2)
-> in0:         +1.02 V  (min =  +0.00 V, max =  +2.05 V)
-> in1:         +1.52 V  (min =  +0.00 V, max =  +2.05 V)
-> in2:         +1.10 V  (min =  +0.00 V, max =  +2.05 V)
-> in3:         +0.89 V  (min =  +0.00 V, max =  +2.05 V)
-> in12:        +3.35 V  (min =  +0.00 V, max =  +6.14 V)
-> in13:        +3.28 V  (min =  +0.00 V, max =  +6.14 V)
-> fan1:        703 RPM  (min =  329 RPM)
-> temp1:       +23.0°C  (high = +109.0°C, hyst = +109.0°C)
->                       (crit = +109.0°C, hyst = +109.0°C)  sensor = thermal diode
-> temp2:       +33.2°C  (high = +105.0°C, hyst = +105.0°C)
->                       (crit = +105.0°C, hyst = +105.0°C)  sensor = thermal diode
-> temp5:       +14.0°C  (high = +39.0°C, hyst = +39.0°C)
->                       (crit = +44.0°C, hyst = +44.0°C)  sensor = thermistor
-> beep_enable:disabled
-> 
-> jc42-i2c-0-18
-> Adapter: SMBus piix4 adapter (SDA0)
-> temp1:       +20.5°C  (low  =  +0.0°C, high =  +0.0°C)  ALARM
->                       (crit =  +0.0°C, hyst =  +0.0°C)  ALARM
-> 
-> 
-> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 0
->      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
-> 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
-> 10: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
-> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 70: -- -- -- -- -- -- -- --
-> 
-> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 1
->      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
-> 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
-> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU
-> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 60: -- 61 -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 70: -- -- -- -- -- -- -- --
-> 
-> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 2
->      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
-> 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
-> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 40: -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- --
-> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 70: -- -- -- -- -- -- -- --
-> 
-> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 3
->      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
-> 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
-> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-> 70: -- -- -- -- -- -- -- --
-> 
-> pay attention that the msleep seems to be really needed...
-> 
-> Signed-off-by: Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org>
-> 
-> Regards,
-> 
-> Eddi
-> 
-> follows patch....
-> 
-> diff -u -N -r 2.6.32.orig/i2c-piix4.c 2.6.32/i2c-piix4.c
-> --- 2.6.32.orig/i2c-piix4.c     2011-11-16 17:07:03.000000000 +0100
-> +++ 2.6.32/i2c-piix4.c  2011-11-16 15:21:17.000000000 +0100
-> @@ -97,7 +97,8 @@
->  static unsigned short piix4_smba;
->  static int srvrworks_csb5_delay;
->  static struct pci_driver piix4_driver;
-> -static struct i2c_adapter piix4_adapter;
-> +struct i2c_adapter piix4_adapter;
-> +EXPORT_SYMBOL_GPL(piix4_adapter);
-> 
->  static struct dmi_system_id __devinitdata piix4_dmi_blacklist[] = {
->         {
-> @@ -246,10 +247,22 @@
->                         "0x%x already in use!\n", smba_idx);
->                 return -EBUSY;
->         }
-> -       outb_p(smb_en, smba_idx);
-> -       smba_en_lo = inb_p(smba_idx + 1);
-> -       outb_p(smb_en + 1, smba_idx);
-> -       smba_en_hi = inb_p(smba_idx + 1);
-> +       outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c
-> +       smba_en_lo = inb_p(smba_idx + 1);       //leggo il dato L del registro 0x2c
-> +       outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1
-> +       smba_en_hi = inb_p(smba_idx + 1);       //leggo il dato H del registro 0x2c
-> +
-> +       outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c
-> +       outb_p(smba_en_lo & 0xF9 , smba_idx + 1); //seleziono la porta 0 00 0
-> +       outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1
-> +       outb_p(smba_en_hi, smba_idx + 1);
-> +
-> +       outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c
-> +       smba_en_lo = inb_p(smba_idx + 1);       //leggo il dato L del registro 0x2c
-> +       outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1
-> +       smba_en_hi = inb_p(smba_idx + 1);       //leggo il dato H del registro 0x2c
-> +
-> +
->         release_region(smba_idx, 2);
-> 
->         if ((smba_en_lo & 1) == 0) {
-> @@ -258,6 +271,8 @@
->                 return -ENODEV;
->         }
-> 
-> +       dev_info(&PIIX4_dev->dev,"Selected Default Smbus Port 0x%x",
-> (smba_en_lo & 0x6) >> 1);
-> +
->         piix4_smba = ((smba_en_hi << 8) | smba_en_lo) & 0xffe0;
->         if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name))
->                 return -ENODEV;
-> @@ -466,7 +481,7 @@
->         .functionality  = piix4_func,
->  };
-> 
-> -static struct i2c_adapter piix4_adapter = {
-> +struct i2c_adapter piix4_adapter = {
->         .owner          = THIS_MODULE,
->         .class          = I2C_CLASS_HWMON | I2C_CLASS_SPD,
->         .algo           = &smbus_algorithm,
-> diff -u -N -r 2.6.32.orig/i2c-piix4-n36l.c 2.6.32/i2c-piix4-n36l.c
-> --- 2.6.32.orig/i2c-piix4-n36l.c        1970-01-01 01:00:00.000000000 +0100
-> +++ 2.6.32/i2c-piix4-n36l.c     2011-11-16 16:02:01.000000000 +0100
-> @@ -0,0 +1,247 @@
-> +/*
-> + * i2c-piix4-n36l.c - i2c-piix4 extras for the HP proliant
-> microserver n36l motherboard
-> + *
-> + * Copyright (C) 2004, 2008 Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>
-> + * Copyright (C) 2011  Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org>
-> + *
-> + * This program is free software; you can redistribute it and/or modify
-> + * it under the terms of the GNU General Public License as published by
-> + * the Free Software Foundation; either version 2 of the License, or
-> + * (at your option) any later version.
-> + *
-> + * This program is distributed in the hope that it will be useful,
-> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
-> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-> + * GNU General Public License for more details.
-> + *
-> + * You should have received a copy of the GNU General Public License
-> + * along with this program; if not, write to the Free Software
-> + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-> + */
-> +
-> +/*
-> + * We select the channels by sending commands to the sb800 southbus
-> + * the selection bit
-> + * http://support.amd.com/us/Embedded_TechDocs/45482.pdf
-> + *  Smbus0En - RW – 16 bits - [PM_Reg: 2Ch]
-> + *  Field Name Bits Default Description
-> + *  SmBus0En 0 0b Set to 1 to enable SMBUS0 function and decoding.
-> + *  SmBus0Sel 2:1 00b SmBus port selection when PM_Reg 2Fh bit 0 is set to 0
-> + *  00: Port 0
-> + *  01: Port 2
-> + *  10: Port 3
-> + *  11: Port 4
-> + */
-> +
-> +#include <linux/module.h>
-> +#include <linux/kernel.h>
-> +#include <linux/slab.h>
-> +#include <linux/init.h>
-> +#include <linux/i2c.h>
-> +#include <linux/mutex.h>
-> +#include <asm/io.h>
-> +
-> +extern struct i2c_adapter piix4_adapter;
-> +
-> +static struct i2c_adapter *n36l_adapter;
-> +static struct i2c_algorithm *n36l_algo;
-> +
-> +/* Wrapper access functions for multiplexed SMBus */
-> +static DEFINE_MUTEX(piix4_lock);
-> +
-> +/* We remember the last used channels combination so as to only switch
-> +   channels when it is really needed. This greatly reduces the SMBus
-> +   overhead, but also assumes that nobody will be writing to the PCA9556
-> +   in our back. */
-> +static u8 last_channels;
-> +
-> +static inline s32 piix4_access_channel(struct i2c_adapter * adap, u16 addr,
-> +                                       unsigned short flags, char read_write,
-> +                                       u8 command, int size,
-> +                                       union i2c_smbus_data * data,
-> +                                       u8 channels)
-> +{
-> +       int error;
-> +       unsigned short smba_idx = 0xcd6;
-> +       u8 smba_en_lo, smba_en_hi, smb_en = 0x2c;
-> +
-> +       mutex_lock(&piix4_lock);
-> +
-> +       if (last_channels != channels) {
-> +               union i2c_smbus_data mplxdata;
-> +               mplxdata.byte = channels;
-> +
-> +               /* Determine the address of the SMBus areas */
-> +               if (!request_region(smba_idx, 2, "smba_idx")) {
-> +                       dev_err(&piix4_adapter.dev, "SMBus base address index region "
-> +                               "0x%x already in use!\n", smba_idx);
-> +                       return -EBUSY;
-> +               }
-> +
-> +               outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c
-> +               smba_en_lo = inb_p(smba_idx + 1);       //leggo il dato L del registro 0x2c
-> +               outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1
-> +               smba_en_hi = inb_p(smba_idx + 1);       //leggo il dato H del registro 0x2c
-> +
-> +               msleep(50);
-> +               outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c
-> +               outb_p((smba_en_lo & 0xF9 )+ ( channels << 1) , smba_idx + 1);
-> //seleziono la porta 0 00 0
-> +               outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1
-> +               outb_p(smba_en_hi, smba_idx + 1);
-> +
-> +               msleep(50);
-> +
-> +               release_region(smba_idx, 2);
-> +
-> +               dev_info(&piix4_adapter.dev,"Selected Smbus Port 0x%x", (smba_en_lo
-> & 0x6) >> 1);
-> +
-> +               last_channels = channels;
-> +
-> +       }
-> +
-> +       error = piix4_adapter.algo->smbus_xfer(adap, addr, flags, read_write,
-> +                                             command, size, data);
-> +
-> +
-> +       mutex_unlock(&piix4_lock);
-> +       return error;
-> +}
-> +
-> +static s32 piix4_access_virt0(struct i2c_adapter * adap, u16 addr,
-> +                              unsigned short flags, char read_write,
-> +                              u8 command, int size,
-> +                              union i2c_smbus_data * data)
-> +{
-> +       return piix4_access_channel(adap, addr, flags, read_write, command,
-> +                                    size, data, 0);
-> +}
-> +
-> +static s32 piix4_access_virt1(struct i2c_adapter * adap, u16 addr,
-> +                              unsigned short flags, char read_write,
-> +                              u8 command, int size,
-> +                              union i2c_smbus_data * data)
-> +{
-> +       return piix4_access_channel(adap, addr, flags, read_write, command,
-> +                                    size, data, 1);
-> +}
-> +
-> +static s32 piix4_access_virt2(struct i2c_adapter * adap, u16 addr,
-> +                              unsigned short flags, char read_write,
-> +                              u8 command, int size,
-> +                              union i2c_smbus_data * data)
-> +{
-> +       return piix4_access_channel(adap, addr, flags, read_write, command,
-> +                                    size, data, 2);
-> +}
-> +
-> +static s32 piix4_access_virt3(struct i2c_adapter * adap, u16 addr,
-> +                              unsigned short flags, char read_write,
-> +                              u8 command, int size,
-> +                              union i2c_smbus_data * data)
-> +{
-> +       return piix4_access_channel(adap, addr, flags, read_write, command,
-> +                                    size, data, 3);
-> +}
-> +
-> +static int __init piix4_n36l_init(void)
-> +{
-> +       int i, error;
-> +
-> +       if (!piix4_adapter.dev.parent)
-> +               return -ENODEV;
-> +
-> +       printk(KERN_INFO "Configure the AMD SB800 Multiplexer\n");
-> +
-> +       /* Unregister physical bus */
-> +       error = i2c_del_adapter(&piix4_adapter);
-> +       if (error) {
-> +               dev_err(&piix4_adapter.dev, "Physical bus removal failed\n");
-> +               goto ERROR0;
-> +       }
-> +
-> +       printk(KERN_INFO "Enabling SMBus multiplexing for Hp Proliant
-> Microserver N36l\n");
-> +       /* Define the 4 virtual adapters and algorithms structures */
-> +       if (!(n36l_adapter = kzalloc(5 * sizeof(struct i2c_adapter),
-> +                                     GFP_KERNEL))) {
-> +               error = -ENOMEM;
-> +               goto ERROR1;
-> +       }
-> +       if (!(n36l_algo = kzalloc(5 * sizeof(struct i2c_algorithm),
-> +                                  GFP_KERNEL))) {
-> +               error = -ENOMEM;
-> +               goto ERROR2;
-> +       }
-> +
-> +       /* Fill in the new structures */
-> +       n36l_algo[0] = *(piix4_adapter.algo);
-> +       n36l_algo[0].smbus_xfer = piix4_access_virt0;
-> +       n36l_adapter[0] = piix4_adapter;
-> +       snprintf(n36l_adapter[0].name, sizeof(n36l_adapter[0].name),
-> +                "SMBus piix4 adapter (SDA0)");
-> +       n36l_adapter[0].algo = n36l_algo;
-> +       n36l_adapter[0].dev.parent = piix4_adapter.dev.parent;
-> +       for (i = 1; i < 4; i++) {
-> +               n36l_algo[i] = *(piix4_adapter.algo);
-> +               n36l_adapter[i] = piix4_adapter;
-> +               snprintf(n36l_adapter[i].name, sizeof(n36l_adapter[i].name),
-> +                        "SMBus piix4 adapter (SDA%d)", i + 1);
-> +               n36l_adapter[i].algo = n36l_algo+i;
-> +               n36l_adapter[i].dev.parent = piix4_adapter.dev.parent;
-> +       }
-> +       n36l_algo[1].smbus_xfer = piix4_access_virt1;
-> +       n36l_algo[2].smbus_xfer = piix4_access_virt2;
-> +       n36l_algo[3].smbus_xfer = piix4_access_virt3;
-> +
-> +       /* Register virtual adapters */
-> +       for (i = 0; i < 4; i++) {
-> +               error = i2c_add_adapter(n36l_adapter+i);
-> +               if (error) {
-> +                       printk(KERN_ERR "i2c-piix4-n36l: "
-> +                              "Virtual adapter %d registration "
-> +                              "failed, module not inserted\n", i);
-> +                       for (i--; i >= 0; i--)
-> +                               i2c_del_adapter(n36l_adapter+i);
-> +                       goto ERROR3;
-> +               }
-> +       }
-> +
-> +       return 0;
-> +
-> +ERROR3:
-> +       kfree(n36l_algo);
-> +       n36l_algo = NULL;
-> +ERROR2:
-> +       kfree(n36l_adapter);
-> +       n36l_adapter = NULL;
-> +ERROR1:
-> +       /* Restore physical bus */
-> +       i2c_add_adapter(&piix4_adapter);
-> +ERROR0:
-> +       return error;
-> +}
-> +
-> +static void __exit piix4_n36l_exit(void)
-> +{
-> +       if (n36l_adapter) {
-> +               int i;
-> +
-> +               for (i = 0; i < 5; i++)
-> +                       i2c_del_adapter(n36l_adapter+i);
-> +               kfree(n36l_adapter);
-> +               n36l_adapter = NULL;
-> +       }
-> +       kfree(n36l_algo);
-> +       n36l_algo = NULL;
-> +
-> +       /* Restore physical bus */
-> +       if (i2c_add_adapter(&piix4_adapter))
-> +               printk(KERN_ERR "i2c-piix4-n36l: "
-> +                      "Physical bus restoration failed\n");
-> +}
-> +
-> +MODULE_AUTHOR("Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org");
-> +MODULE_DESCRIPTION("n36l SMBus multiplexing");
-> +MODULE_LICENSE("GPL");
-> +
-> +module_init(piix4_n36l_init);
-> +module_exit(piix4_n36l_exit);
-> 
-> 
-> On Sun, Nov 27, 2011 at 11:55 PM, Ben Dooks <ben-i2c-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org> wrote:
-> >
-> > On Fri, Nov 25, 2011 at 11:07:21PM +0100, Eddi De Pieri wrote:
-> >> This patch add support to multiplexed smbus for proliant microserver
-> >> N36L and may be applicable to other configuration based on sb8xx
-> >> southbus.
-> >>
-> >> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -l
-> >> i2c-0   smbus           SMBus piix4 adapter (SDA0)              SMBus adapter
-> >> i2c-1   smbus           SMBus piix4 adapter (SDA2)              SMBus adapter
-> >> i2c-2   smbus           SMBus piix4 adapter (SDA3)              SMBus adapter
-> >> i2c-3   smbus           SMBus piix4 adapter (SDA4)              SMBus adapter
-> >> root@proliant:/usr/src/lm-sensors/eddi#
-> >
-> > patch should go inline so it can be reviewed, thanks.
-> >
-> > --
-> > Ben Dooks, ben-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org, http://www.fluff.org/ben/
-> >
-> > Large Hadron Colada: A large Pina Colada that makes the universe disappear.
-> >
-> 
-> _______________________________________________
-> lm-sensors mailing list
-> lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org
-> http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
+T24gU2F0LCBEZWMgMDMsIDIwMTEgYXQgMTA6MzE6MzBBTSAtMDUwMCwgRWRkaSBEZSBQaWVyaSB3
+cm90ZToKPiBUaGlzIHBhdGNoIGFkZCBzdXBwb3J0IHRvIG11bHRpcGxleGVkIHNtYnVzIGZvciBw
+cm9saWFudCBtaWNyb3NlcnZlcgo+IE4zNkwgYW5kIG1heSBiZSBhcHBsaWNhYmxlIHRvIG90aGVy
+IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gc2I4eHgKPiBzb3V0aGJ1cy4KPiAKCkRpZCB5b3UgcmVh
+ZCBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzID8KClRoZSBwYXRjaCBkb2Vzbid0IGZv
+bGxvdyB0aGUgY2Fub25pY2FsIHBhdGNoIGZvcm1hdCwgSSBjYW4gc2VlIHRoYXQgbGluZXMgYXJl
+IHNwbGl0LAp0aGUgcGF0Y2ggaXNuJ3QgYmFzZWQgb24gdGhlIGxpbnV4IHJvb3QgZGlyZWN0b3J5
+IGJ1dCBvbiBzb21lIG90aGVyIGRpcmVjdG9yeSB3aGljaApJIGd1ZXNzIHlvdSBleHBlY3QgdGhl
+IHJlYWRlciB0byBmaWd1cmUgb3V0LCB0aGUgcGF0Y2ggZGVzY3JpcHRpb24gaW5jbHVkZXMgbG90
+cwpvZiBpbmZvcm1hdGlvbiB3aGljaCBpcyBpcnJlbGV2YW50IGZvciB0aGUgY2hhbmdlbG9nLCBh
+bmQgaXQgaXMgYmFzZWQgb24gMi42LjMyCmluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcmVsZWFzZSBh
+bmQgdGh1cyBwcmV0dHkgbXVjaCBndWFyYW50ZWVkIG5vdCB0byBhcHBseQp0byB0aGUgY3VycmVu
+dCBrZXJuZWwgdmVyc2lvbi4gQWxsIHRoYXQgdy9vIGV2ZW4gbG9va2luZyBpbnRvIHRoZSBjb2Rl
+LgoKVGhlIHBhdGNoIGltcGxlbWVudHMgYW4gSTJDIG11bHRpcGxleGVyIGJ1dCBkb2Vzbid0IHVz
+ZSB0aGUgSTJDIG11bHRpcGxleGVyCmluZnJhc3RydWN0dXJlLiBJIGFtIG5vdCBvbmUgb2YgdGhl
+IEkyQyBtYWludGFpbmVycywgYnV0IHRoYXQgYWxvbmUgd291bGQgY2F1c2UgbWUKdG8gcmVqZWN0
+IHRoaXMgcGF0Y2ggKG9uIHRvcCBvZiBhbGwgdGhlIG90aGVyIHJlYXNvbnMgYWJvdmUpLgoKR3Vl
+bnRlcgoKPiByb290QHByb2xpYW50Oi91c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMgaTJjZGV0ZWN0
+IC1sCj4gaTJjLTAgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBMCkg
+ICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiBpMmMtMSAgIHNtYnVzICAgICAgICAgICBTTUJ1
+cyBwaWl4NCBhZGFwdGVyIChTREEyKSAgICAgICAgICAgICAgU01CdXMgYWRhcHRlcgo+IGkyYy0y
+ICAgc21idXMgICAgICAgICAgIFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTMpICAgICAgICAgICAg
+ICBTTUJ1cyBhZGFwdGVyCj4gaTJjLTMgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRh
+cHRlciAoU0RBNCkgICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiByb290QHByb2xpYW50Oi91
+c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMKPiAKPiB5ZXMgU0RBMSBpcyByZXNlcnZlZC4uLiBzbyBp
+IGNhbid0IG11bHRpcGxleCBpdAo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29y
+cy9lZGRpIyBzZW5zb3JzCj4gazEwdGVtcC1wY2ktMDBjMwo+IEFkYXB0ZXI6IFBDSSBhZGFwdGVy
+Cj4gdGVtcDE6ICAgICAgICsyNC41wrBDICAoaGlnaCA9ICs3MC4wwrBDLCBjcml0ID0gKzEwMC4w
+wrBDKQo+IAo+IHc4Mzc5NWFkZy1pMmMtMS0yZgo+IEFkYXB0ZXI6IFNNQnVzIHBpaXg0IGFkYXB0
+ZXIgKFNEQTIpCj4gaW4wOiAgICAgICAgICsxLjAyIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g
+ICsyLjA1IFYpCj4gaW4xOiAgICAgICAgICsxLjUyIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g
+ICsyLjA1IFYpCj4gaW4yOiAgICAgICAgICsxLjEwIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g
+ICsyLjA1IFYpCj4gaW4zOiAgICAgICAgICswLjg5IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g
+ICsyLjA1IFYpCj4gaW4xMjogICAgICAgICszLjM1IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g
+ICs2LjE0IFYpCj4gaW4xMzogICAgICAgICszLjI4IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g
+ICs2LjE0IFYpCj4gZmFuMTogICAgICAgIDcwMyBSUE0gIChtaW4gPSAgMzI5IFJQTSkKPiB0ZW1w
+MTogICAgICAgKzIzLjDCsEMgIChoaWdoID0gKzEwOS4wwrBDLCBoeXN0ID0gKzEwOS4wwrBDKQo+
+ICAgICAgICAgICAgICAgICAgICAgICAoY3JpdCA9ICsxMDkuMMKwQywgaHlzdCA9ICsxMDkuMMKw
+QykgIHNlbnNvciA9IHRoZXJtYWwgZGlvZGUKPiB0ZW1wMjogICAgICAgKzMzLjLCsEMgIChoaWdo
+ID0gKzEwNS4wwrBDLCBoeXN0ID0gKzEwNS4wwrBDKQo+ICAgICAgICAgICAgICAgICAgICAgICAo
+Y3JpdCA9ICsxMDUuMMKwQywgaHlzdCA9ICsxMDUuMMKwQykgIHNlbnNvciA9IHRoZXJtYWwgZGlv
+ZGUKPiB0ZW1wNTogICAgICAgKzE0LjDCsEMgIChoaWdoID0gKzM5LjDCsEMsIGh5c3QgPSArMzku
+MMKwQykKPiAgICAgICAgICAgICAgICAgICAgICAgKGNyaXQgPSArNDQuMMKwQywgaHlzdCA9ICs0
+NC4wwrBDKSAgc2Vuc29yID0gdGhlcm1pc3Rvcgo+IGJlZXBfZW5hYmxlOmRpc2FibGVkCj4gCj4g
+amM0Mi1pMmMtMC0xOAo+IEFkYXB0ZXI6IFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTApCj4gdGVt
+cDE6ICAgICAgICsyMC41wrBDICAobG93ICA9ICArMC4wwrBDLCBoaWdoID0gICswLjDCsEMpICBB
+TEFSTQo+ICAgICAgICAgICAgICAgICAgICAgICAoY3JpdCA9ICArMC4wwrBDLCBoeXN0ID0gICsw
+LjDCsEMpICBBTEFSTQo+IAo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29ycy9l
+ZGRpIyBpMmNkZXRlY3QgLXkgMAo+ICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAg
+YSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSBVVSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LQo+IDUwOiA1MCAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+
+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDcw
+OiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0t
+c2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMQo+ICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAg
+NyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSBVVQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLQo+IDYwOiAtLSA2MSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vz
+ci9zcmMvbG0tc2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMgo+ICAgICAgMCAgMSAgMiAgMyAg
+NCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSA0YyAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLQo+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJv
+bGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMwo+ICAgICAgMCAg
+MSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAg
+ICAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt
+LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+
+IHBheSBhdHRlbnRpb24gdGhhdCB0aGUgbXNsZWVwIHNlZW1zIHRvIGJlIHJlYWxseSBuZWVkZWQu
+Li4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBFZGRpIERlIFBpZXJpIDxlZGRpQGRlcGllcmkubmV0Pgo+
+IAo+IFJlZ2FyZHMsCj4gCj4gRWRkaQo+IAo+IGZvbGxvd3MgcGF0Y2guLi4uCj4gCj4gZGlmZiAt
+dSAtTiAtciAyLjYuMzIub3JpZy9pMmMtcGlpeDQuYyAyLjYuMzIvaTJjLXBpaXg0LmMKPiAtLS0g
+Mi42LjMyLm9yaWcvaTJjLXBpaXg0LmMgICAgIDIwMTEtMTEtMTYgMTc6MDc6MDMuMDAwMDAwMDAw
+ICswMTAwCj4gKysrIDIuNi4zMi9pMmMtcGlpeDQuYyAgMjAxMS0xMS0xNiAxNToyMToxNy4wMDAw
+MDAwMDAgKzAxMDAKPiBAQCAtOTcsNyArOTcsOCBAQAo+ICBzdGF0aWMgdW5zaWduZWQgc2hvcnQg
+cGlpeDRfc21iYTsKPiAgc3RhdGljIGludCBzcnZyd29ya3NfY3NiNV9kZWxheTsKPiAgc3RhdGlj
+IHN0cnVjdCBwY2lfZHJpdmVyIHBpaXg0X2RyaXZlcjsKPiAtc3RhdGljIHN0cnVjdCBpMmNfYWRh
+cHRlciBwaWl4NF9hZGFwdGVyOwo+ICtzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlcjsK
+PiArRVhQT1JUX1NZTUJPTF9HUEwocGlpeDRfYWRhcHRlcik7Cj4gCj4gIHN0YXRpYyBzdHJ1Y3Qg
+ZG1pX3N5c3RlbV9pZCBfX2RldmluaXRkYXRhIHBpaXg0X2RtaV9ibGFja2xpc3RbXSA9IHsKPiAg
+ICAgICAgIHsKPiBAQCAtMjQ2LDEwICsyNDcsMjIgQEAKPiAgICAgICAgICAgICAgICAgICAgICAg
+ICAiMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsIHNtYmFfaWR4KTsKPiAgICAgICAgICAgICAgICAg
+cmV0dXJuIC1FQlVTWTsKPiAgICAgICAgIH0KPiAtICAgICAgIG91dGJfcChzbWJfZW4sIHNtYmFf
+aWR4KTsKPiAtICAgICAgIHNtYmFfZW5fbG8gPSBpbmJfcChzbWJhX2lkeCArIDEpOwo+IC0gICAg
+ICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsKPiAtICAgICAgIHNtYmFfZW5faGkgPSBp
+bmJfcChzbWJhX2lkeCArIDEpOwo+ICsgICAgICAgb3V0Yl9wKHNtYl9lbiwgc21iYV9pZHgpOyAg
+ICAgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMKPiArICAgICAgIHNtYmFf
+ZW5fbG8gPSBpbmJfcChzbWJhX2lkeCArIDEpOyAgICAgICAvL2xlZ2dvIGlsIGRhdG8gTCBkZWwg
+cmVnaXN0cm8gMHgyYwo+ICsgICAgICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsgICAg
+ICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMgKyAxCj4gKyAgICAgICBzbWJhX2Vu
+X2hpID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdnbyBpbCBkYXRvIEggZGVsIHJl
+Z2lzdHJvIDB4MmMKPiArCj4gKyAgICAgICBvdXRiX3Aoc21iX2VuLCBzbWJhX2lkeCk7ICAgICAg
+ICAgICAgICAgLy9zZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYwo+ICsgICAgICAgb3V0Yl9wKHNt
+YmFfZW5fbG8gJiAweEY5ICwgc21iYV9pZHggKyAxKTsgLy9zZWxlemlvbm8gbGEgcG9ydGEgMCAw
+MCAwCj4gKyAgICAgICBvdXRiX3Aoc21iX2VuICsgMSwgc21iYV9pZHgpOyAgICAgICAgICAgLy9z
+ZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYyArIDEKPiArICAgICAgIG91dGJfcChzbWJhX2VuX2hp
+LCBzbWJhX2lkeCArIDEpOwo+ICsKPiArICAgICAgIG91dGJfcChzbWJfZW4sIHNtYmFfaWR4KTsg
+ICAgICAgICAgICAgICAvL3NlbGV6aW9ubyBpbCByZWdpc3RybyAweDJjCj4gKyAgICAgICBzbWJh
+X2VuX2xvID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdnbyBpbCBkYXRvIEwgZGVs
+IHJlZ2lzdHJvIDB4MmMKPiArICAgICAgIG91dGJfcChzbWJfZW4gKyAxLCBzbWJhX2lkeCk7ICAg
+ICAgICAgICAvL3NlbGV6aW9ubyBpbCByZWdpc3RybyAweDJjICsgMQo+ICsgICAgICAgc21iYV9l
+bl9oaSA9IGluYl9wKHNtYmFfaWR4ICsgMSk7ICAgICAgIC8vbGVnZ28gaWwgZGF0byBIIGRlbCBy
+ZWdpc3RybyAweDJjCj4gKwo+ICsKPiAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAy
+KTsKPiAKPiAgICAgICAgIGlmICgoc21iYV9lbl9sbyAmIDEpID09IDApIHsKPiBAQCAtMjU4LDYg
+KzI3MSw4IEBACj4gICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwo+ICAgICAgICAgfQo+
+IAo+ICsgICAgICAgZGV2X2luZm8oJlBJSVg0X2Rldi0+ZGV2LCJTZWxlY3RlZCBEZWZhdWx0IFNt
+YnVzIFBvcnQgMHgleCIsCj4gKHNtYmFfZW5fbG8gJiAweDYpID4+IDEpOwo+ICsKPiAgICAgICAg
+IHBpaXg0X3NtYmEgPSAoKHNtYmFfZW5faGkgPDwgOCkgfCBzbWJhX2VuX2xvKSAmIDB4ZmZlMDsK
+PiAgICAgICAgIGlmIChhY3BpX2NoZWNrX3JlZ2lvbihwaWl4NF9zbWJhLCBTTUJJT1NJWkUsIHBp
+aXg0X2RyaXZlci5uYW1lKSkKPiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4gQEAg
+LTQ2Niw3ICs0ODEsNyBAQAo+ICAgICAgICAgLmZ1bmN0aW9uYWxpdHkgID0gcGlpeDRfZnVuYywK
+PiAgfTsKPiAKPiAtc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwaWl4NF9hZGFwdGVyID0gewo+
+ICtzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlciA9IHsKPiAgICAgICAgIC5vd25lciAg
+ICAgICAgICA9IFRISVNfTU9EVUxFLAo+ICAgICAgICAgLmNsYXNzICAgICAgICAgID0gSTJDX0NM
+QVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRCwKPiAgICAgICAgIC5hbGdvICAgICAgICAgICA9ICZz
+bWJ1c19hbGdvcml0aG0sCj4gZGlmZiAtdSAtTiAtciAyLjYuMzIub3JpZy9pMmMtcGlpeDQtbjM2
+bC5jIDIuNi4zMi9pMmMtcGlpeDQtbjM2bC5jCj4gLS0tIDIuNi4zMi5vcmlnL2kyYy1waWl4NC1u
+MzZsLmMgICAgICAgIDE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCj4gKysrIDIu
+Ni4zMi9pMmMtcGlpeDQtbjM2bC5jICAgICAyMDExLTExLTE2IDE2OjAyOjAxLjAwMDAwMDAwMCAr
+MDEwMAo+IEBAIC0wLDAgKzEsMjQ3IEBACj4gKy8qCj4gKyAqIGkyYy1waWl4NC1uMzZsLmMgLSBp
+MmMtcGlpeDQgZXh0cmFzIGZvciB0aGUgSFAgcHJvbGlhbnQKPiBtaWNyb3NlcnZlciBuMzZsIG1v
+dGhlcmJvYXJkCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwOCBKZWFuIERlbHZh
+cmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KPiArICogQ29weXJpZ2h0IChDKSAyMDExICBFZGRpIERl
+IFBpZXJpIDxlZGRpQGRlcGllcmkubmV0Pgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJl
+ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBp
+dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1
+Ymxpc2hlZCBieQo+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy
+c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgo+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
+ciB2ZXJzaW9uLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
+IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
+TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRB
+QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsg
+KiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsg
+KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs
+aWMgTGljZW5zZQo+ICsgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0
+byB0aGUgRnJlZSBTb2Z0d2FyZQo+ICsgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUs
+IENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KPiArICovCj4gKwo+ICsvKgo+ICsgKiBXZSBzZWxl
+Y3QgdGhlIGNoYW5uZWxzIGJ5IHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlIHNiODAwIHNvdXRoYnVz
+Cj4gKyAqIHRoZSBzZWxlY3Rpb24gYml0Cj4gKyAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMv
+RW1iZWRkZWRfVGVjaERvY3MvNDU0ODIucGRmCj4gKyAqICBTbWJ1czBFbiAtIFJXIMOi4oKs4oCc
+IDE2IGJpdHMgLSBbUE1fUmVnOiAyQ2hdCj4gKyAqICBGaWVsZCBOYW1lIEJpdHMgRGVmYXVsdCBE
+ZXNjcmlwdGlvbgo+ICsgKiAgU21CdXMwRW4gMCAwYiBTZXQgdG8gMSB0byBlbmFibGUgU01CVVMw
+IGZ1bmN0aW9uIGFuZCBkZWNvZGluZy4KPiArICogIFNtQnVzMFNlbCAyOjEgMDBiIFNtQnVzIHBv
+cnQgc2VsZWN0aW9uIHdoZW4gUE1fUmVnIDJGaCBiaXQgMCBpcyBzZXQgdG8gMAo+ICsgKiAgMDA6
+IFBvcnQgMAo+ICsgKiAgMDE6IFBvcnQgMgo+ICsgKiAgMTA6IFBvcnQgMwo+ICsgKiAgMTE6IFBv
+cnQgNAo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUg
+PGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ICsjaW5jbHVkZSA8
+bGludXgvaW5pdC5oPgo+ICsjaW5jbHVkZSA8bGludXgvaTJjLmg+Cj4gKyNpbmNsdWRlIDxsaW51
+eC9tdXRleC5oPgo+ICsjaW5jbHVkZSA8YXNtL2lvLmg+Cj4gKwo+ICtleHRlcm4gc3RydWN0IGky
+Y19hZGFwdGVyIHBpaXg0X2FkYXB0ZXI7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVy
+ICpuMzZsX2FkYXB0ZXI7Cj4gK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSAqbjM2bF9hbGdv
+Owo+ICsKPiArLyogV3JhcHBlciBhY2Nlc3MgZnVuY3Rpb25zIGZvciBtdWx0aXBsZXhlZCBTTUJ1
+cyAqLwo+ICtzdGF0aWMgREVGSU5FX01VVEVYKHBpaXg0X2xvY2spOwo+ICsKPiArLyogV2UgcmVt
+ZW1iZXIgdGhlIGxhc3QgdXNlZCBjaGFubmVscyBjb21iaW5hdGlvbiBzbyBhcyB0byBvbmx5IHN3
+aXRjaAo+ICsgICBjaGFubmVscyB3aGVuIGl0IGlzIHJlYWxseSBuZWVkZWQuIFRoaXMgZ3JlYXRs
+eSByZWR1Y2VzIHRoZSBTTUJ1cwo+ICsgICBvdmVyaGVhZCwgYnV0IGFsc28gYXNzdW1lcyB0aGF0
+IG5vYm9keSB3aWxsIGJlIHdyaXRpbmcgdG8gdGhlIFBDQTk1NTYKPiArICAgaW4gb3VyIGJhY2su
+ICovCj4gK3N0YXRpYyB1OCBsYXN0X2NoYW5uZWxzOwo+ICsKPiArc3RhdGljIGlubGluZSBzMzIg
+cGlpeDRfYWNjZXNzX2NoYW5uZWwoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIs
+Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0
+IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEsCj4gKyAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNoYW5uZWxzKQo+ICt7Cj4gKyAgICAg
+ICBpbnQgZXJyb3I7Cj4gKyAgICAgICB1bnNpZ25lZCBzaG9ydCBzbWJhX2lkeCA9IDB4Y2Q2Owo+
+ICsgICAgICAgdTggc21iYV9lbl9sbywgc21iYV9lbl9oaSwgc21iX2VuID0gMHgyYzsKPiArCj4g
+KyAgICAgICBtdXRleF9sb2NrKCZwaWl4NF9sb2NrKTsKPiArCj4gKyAgICAgICBpZiAobGFzdF9j
+aGFubmVscyAhPSBjaGFubmVscykgewo+ICsgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNf
+ZGF0YSBtcGx4ZGF0YTsKPiArICAgICAgICAgICAgICAgbXBseGRhdGEuYnl0ZSA9IGNoYW5uZWxz
+Owo+ICsKPiArICAgICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBT
+TUJ1cyBhcmVhcyAqLwo+ICsgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKHNtYmFf
+aWR4LCAyLCAic21iYV9pZHgiKSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIo
+JnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgYmFzZSBhZGRyZXNzIGluZGV4IHJlZ2lvbiAiCj4g
+KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMHgleCBhbHJlYWR5IGluIHVzZSFcbiIs
+IHNtYmFfaWR4KTsKPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwo+ICsg
+ICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICBvdXRiX3Aoc21iX2VuLCBzbWJh
+X2lkeCk7ICAgICAgICAgICAgICAgLy9zZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYwo+ICsgICAg
+ICAgICAgICAgICBzbWJhX2VuX2xvID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdn
+byBpbCBkYXRvIEwgZGVsIHJlZ2lzdHJvIDB4MmMKPiArICAgICAgICAgICAgICAgb3V0Yl9wKHNt
+Yl9lbiArIDEsIHNtYmFfaWR4KTsgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4
+MmMgKyAxCj4gKyAgICAgICAgICAgICAgIHNtYmFfZW5faGkgPSBpbmJfcChzbWJhX2lkeCArIDEp
+OyAgICAgICAvL2xlZ2dvIGlsIGRhdG8gSCBkZWwgcmVnaXN0cm8gMHgyYwo+ICsKPiArICAgICAg
+ICAgICAgICAgbXNsZWVwKDUwKTsKPiArICAgICAgICAgICAgICAgb3V0Yl9wKHNtYl9lbiwgc21i
+YV9pZHgpOyAgICAgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMKPiArICAg
+ICAgICAgICAgICAgb3V0Yl9wKChzbWJhX2VuX2xvICYgMHhGOSApKyAoIGNoYW5uZWxzIDw8IDEp
+ICwgc21iYV9pZHggKyAxKTsKPiAvL3NlbGV6aW9ubyBsYSBwb3J0YSAwIDAwIDAKPiArICAgICAg
+ICAgICAgICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsgICAgICAgICAgIC8vc2VsZXpp
+b25vIGlsIHJlZ2lzdHJvIDB4MmMgKyAxCj4gKyAgICAgICAgICAgICAgIG91dGJfcChzbWJhX2Vu
+X2hpLCBzbWJhX2lkeCArIDEpOwo+ICsKPiArICAgICAgICAgICAgICAgbXNsZWVwKDUwKTsKPiAr
+Cj4gKyAgICAgICAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAyKTsKPiArCj4gKyAg
+ICAgICAgICAgICAgIGRldl9pbmZvKCZwaWl4NF9hZGFwdGVyLmRldiwiU2VsZWN0ZWQgU21idXMg
+UG9ydCAweCV4IiwgKHNtYmFfZW5fbG8KPiAmIDB4NikgPj4gMSk7Cj4gKwo+ICsgICAgICAgICAg
+ICAgICBsYXN0X2NoYW5uZWxzID0gY2hhbm5lbHM7Cj4gKwo+ICsgICAgICAgfQo+ICsKPiArICAg
+ICAgIGVycm9yID0gcGlpeDRfYWRhcHRlci5hbGdvLT5zbWJ1c194ZmVyKGFkYXAsIGFkZHIsIGZs
+YWdzLCByZWFkX3dyaXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICBjb21tYW5kLCBzaXplLCBkYXRhKTsKPiArCj4gKwo+ICsgICAgICAgbXV0ZXhfdW5s
+b2NrKCZwaWl4NF9sb2NrKTsKPiArICAgICAgIHJldHVybiBlcnJvcjsKPiArfQo+ICsKPiArc3Rh
+dGljIHMzMiBwaWl4NF9hY2Nlc3NfdmlydDAoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2
+IGFkZHIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZs
+YWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4
+IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlv
+biBpMmNfc21idXNfZGF0YSAqIGRhdGEpCj4gK3sKPiArICAgICAgIHJldHVybiBwaWl4NF9hY2Nl
+c3NfY2hhbm5lbChhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93cml0ZSwgY29tbWFuZCwKPiArICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZGF0YSwgMCk7Cj4gK30KPiAr
+Cj4gK3N0YXRpYyBzMzIgcGlpeDRfYWNjZXNzX3ZpcnQxKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFk
+YXAsIHUxNiBhZGRyLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBz
+aG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQo+ICt7Cj4gKyAgICAgICByZXR1cm4gcGlp
+eDRfYWNjZXNzX2NoYW5uZWwoYWRhcCwgYWRkciwgZmxhZ3MsIHJlYWRfd3JpdGUsIGNvbW1hbmQs
+Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGRhdGEsIDEpOwo+
+ICt9Cj4gKwo+ICtzdGF0aWMgczMyIHBpaXg0X2FjY2Vzc192aXJ0MihzdHJ1Y3QgaTJjX2FkYXB0
+ZXIgKiBhZGFwLCB1MTYgYWRkciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z
+aWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKPiArICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsCj4gKyAgICAgICAgICAgICAgICAgICAg
+ICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKPiArewo+ICsgICAgICAgcmV0
+dXJuIHBpaXg0X2FjY2Vzc19jaGFubmVsKGFkYXAsIGFkZHIsIGZsYWdzLCByZWFkX3dyaXRlLCBj
+b21tYW5kLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBkYXRh
+LCAyKTsKPiArfQo+ICsKPiArc3RhdGljIHMzMiBwaWl4NF9hY2Nlc3NfdmlydDMoc3RydWN0IGky
+Y19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAg
+ICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCj4gK3sKPiArICAg
+ICAgIHJldHVybiBwaWl4NF9hY2Nlc3NfY2hhbm5lbChhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93
+cml0ZSwgY29tbWFuZCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6
+ZSwgZGF0YSwgMyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19pbml0IHBpaXg0X24zNmxfaW5p
+dCh2b2lkKQo+ICt7Cj4gKyAgICAgICBpbnQgaSwgZXJyb3I7Cj4gKwo+ICsgICAgICAgaWYgKCFw
+aWl4NF9hZGFwdGVyLmRldi5wYXJlbnQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVW
+Owo+ICsKPiArICAgICAgIHByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyZSB0aGUgQU1EIFNCODAw
+IE11bHRpcGxleGVyXG4iKTsKPiArCj4gKyAgICAgICAvKiBVbnJlZ2lzdGVyIHBoeXNpY2FsIGJ1
+cyAqLwo+ICsgICAgICAgZXJyb3IgPSBpMmNfZGVsX2FkYXB0ZXIoJnBpaXg0X2FkYXB0ZXIpOwo+
+ICsgICAgICAgaWYgKGVycm9yKSB7Cj4gKyAgICAgICAgICAgICAgIGRldl9lcnIoJnBpaXg0X2Fk
+YXB0ZXIuZGV2LCAiUGh5c2ljYWwgYnVzIHJlbW92YWwgZmFpbGVkXG4iKTsKPiArICAgICAgICAg
+ICAgICAgZ290byBFUlJPUjA7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcHJpbnRrKEtFUk5f
+SU5GTyAiRW5hYmxpbmcgU01CdXMgbXVsdGlwbGV4aW5nIGZvciBIcCBQcm9saWFudAo+IE1pY3Jv
+c2VydmVyIE4zNmxcbiIpOwo+ICsgICAgICAgLyogRGVmaW5lIHRoZSA0IHZpcnR1YWwgYWRhcHRl
+cnMgYW5kIGFsZ29yaXRobXMgc3RydWN0dXJlcyAqLwo+ICsgICAgICAgaWYgKCEobjM2bF9hZGFw
+dGVyID0ga3phbGxvYyg1ICogc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlciksCj4gKyAgICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKSkpIHsKPiArICAgICAgICAg
+ICAgICAgZXJyb3IgPSAtRU5PTUVNOwo+ICsgICAgICAgICAgICAgICBnb3RvIEVSUk9SMTsKPiAr
+ICAgICAgIH0KPiArICAgICAgIGlmICghKG4zNmxfYWxnbyA9IGt6YWxsb2MoNSAqIHNpemVvZihz
+dHJ1Y3QgaTJjX2FsZ29yaXRobSksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
+ICBHRlBfS0VSTkVMKSkpIHsKPiArICAgICAgICAgICAgICAgZXJyb3IgPSAtRU5PTUVNOwo+ICsg
+ICAgICAgICAgICAgICBnb3RvIEVSUk9SMjsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICAvKiBG
+aWxsIGluIHRoZSBuZXcgc3RydWN0dXJlcyAqLwo+ICsgICAgICAgbjM2bF9hbGdvWzBdID0gKihw
+aWl4NF9hZGFwdGVyLmFsZ28pOwo+ICsgICAgICAgbjM2bF9hbGdvWzBdLnNtYnVzX3hmZXIgPSBw
+aWl4NF9hY2Nlc3NfdmlydDA7Cj4gKyAgICAgICBuMzZsX2FkYXB0ZXJbMF0gPSBwaWl4NF9hZGFw
+dGVyOwo+ICsgICAgICAgc25wcmludGYobjM2bF9hZGFwdGVyWzBdLm5hbWUsIHNpemVvZihuMzZs
+X2FkYXB0ZXJbMF0ubmFtZSksCj4gKyAgICAgICAgICAgICAgICAiU01CdXMgcGlpeDQgYWRhcHRl
+ciAoU0RBMCkiKTsKPiArICAgICAgIG4zNmxfYWRhcHRlclswXS5hbGdvID0gbjM2bF9hbGdvOwo+
+ICsgICAgICAgbjM2bF9hZGFwdGVyWzBdLmRldi5wYXJlbnQgPSBwaWl4NF9hZGFwdGVyLmRldi5w
+YXJlbnQ7Cj4gKyAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7Cj4gKyAgICAgICAgICAg
+ICAgIG4zNmxfYWxnb1tpXSA9ICoocGlpeDRfYWRhcHRlci5hbGdvKTsKPiArICAgICAgICAgICAg
+ICAgbjM2bF9hZGFwdGVyW2ldID0gcGlpeDRfYWRhcHRlcjsKPiArICAgICAgICAgICAgICAgc25w
+cmludGYobjM2bF9hZGFwdGVyW2ldLm5hbWUsIHNpemVvZihuMzZsX2FkYXB0ZXJbaV0ubmFtZSks
+Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJTTUJ1cyBwaWl4NCBhZGFwdGVyIChTREElZCki
+LCBpICsgMSk7Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlcltpXS5hbGdvID0gbjM2bF9h
+bGdvK2k7Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlcltpXS5kZXYucGFyZW50ID0gcGlp
+eDRfYWRhcHRlci5kZXYucGFyZW50Owo+ICsgICAgICAgfQo+ICsgICAgICAgbjM2bF9hbGdvWzFd
+LnNtYnVzX3hmZXIgPSBwaWl4NF9hY2Nlc3NfdmlydDE7Cj4gKyAgICAgICBuMzZsX2FsZ29bMl0u
+c21idXNfeGZlciA9IHBpaXg0X2FjY2Vzc192aXJ0MjsKPiArICAgICAgIG4zNmxfYWxnb1szXS5z
+bWJ1c194ZmVyID0gcGlpeDRfYWNjZXNzX3ZpcnQzOwo+ICsKPiArICAgICAgIC8qIFJlZ2lzdGVy
+IHZpcnR1YWwgYWRhcHRlcnMgKi8KPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsK
+PiArICAgICAgICAgICAgICAgZXJyb3IgPSBpMmNfYWRkX2FkYXB0ZXIobjM2bF9hZGFwdGVyK2kp
+Owo+ICsgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKPiArICAgICAgICAgICAgICAgICAgICAg
+ICBwcmludGsoS0VSTl9FUlIgImkyYy1waWl4NC1uMzZsOiAiCj4gKyAgICAgICAgICAgICAgICAg
+ICAgICAgICAgICAgICJWaXJ0dWFsIGFkYXB0ZXIgJWQgcmVnaXN0cmF0aW9uICIKPiArICAgICAg
+ICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZFxuIiwg
+aSk7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKQo+ICsg
+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTJjX2RlbF9hZGFwdGVyKG4zNmxfYWRhcHRl
+citpKTsKPiArICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SMzsKPiArICAgICAgICAg
+ICAgICAgfQo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJldHVybiAwOwo+ICsKPiArRVJST1Iz
+Ogo+ICsgICAgICAga2ZyZWUobjM2bF9hbGdvKTsKPiArICAgICAgIG4zNmxfYWxnbyA9IE5VTEw7
+Cj4gK0VSUk9SMjoKPiArICAgICAgIGtmcmVlKG4zNmxfYWRhcHRlcik7Cj4gKyAgICAgICBuMzZs
+X2FkYXB0ZXIgPSBOVUxMOwo+ICtFUlJPUjE6Cj4gKyAgICAgICAvKiBSZXN0b3JlIHBoeXNpY2Fs
+IGJ1cyAqLwo+ICsgICAgICAgaTJjX2FkZF9hZGFwdGVyKCZwaWl4NF9hZGFwdGVyKTsKPiArRVJS
+T1IwOgo+ICsgICAgICAgcmV0dXJuIGVycm9yOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2V4
+aXQgcGlpeDRfbjM2bF9leGl0KHZvaWQpCj4gK3sKPiArICAgICAgIGlmIChuMzZsX2FkYXB0ZXIp
+IHsKPiArICAgICAgICAgICAgICAgaW50IGk7Cj4gKwo+ICsgICAgICAgICAgICAgICBmb3IgKGkg
+PSAwOyBpIDwgNTsgaSsrKQo+ICsgICAgICAgICAgICAgICAgICAgICAgIGkyY19kZWxfYWRhcHRl
+cihuMzZsX2FkYXB0ZXIraSk7Cj4gKyAgICAgICAgICAgICAgIGtmcmVlKG4zNmxfYWRhcHRlcik7
+Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlciA9IE5VTEw7Cj4gKyAgICAgICB9Cj4gKyAg
+ICAgICBrZnJlZShuMzZsX2FsZ28pOwo+ICsgICAgICAgbjM2bF9hbGdvID0gTlVMTDsKPiArCj4g
+KyAgICAgICAvKiBSZXN0b3JlIHBoeXNpY2FsIGJ1cyAqLwo+ICsgICAgICAgaWYgKGkyY19hZGRf
+YWRhcHRlcigmcGlpeDRfYWRhcHRlcikpCj4gKyAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VS
+UiAiaTJjLXBpaXg0LW4zNmw6ICIKPiArICAgICAgICAgICAgICAgICAgICAgICJQaHlzaWNhbCBi
+dXMgcmVzdG9yYXRpb24gZmFpbGVkXG4iKTsKPiArfQo+ICsKPiArTU9EVUxFX0FVVEhPUigiRWRk
+aSBEZSBQaWVyaSA8ZWRkaUBkZXBpZXJpLm5ldCIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIm4z
+NmwgU01CdXMgbXVsdGlwbGV4aW5nIik7Cj4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiArCj4g
+K21vZHVsZV9pbml0KHBpaXg0X24zNmxfaW5pdCk7Cj4gK21vZHVsZV9leGl0KHBpaXg0X24zNmxf
+ZXhpdCk7Cj4gCj4gCj4gT24gU3VuLCBOb3YgMjcsIDIwMTEgYXQgMTE6NTUgUE0sIEJlbiBEb29r
+cyA8YmVuLWkyY0BmbHVmZi5vcmc+IHdyb3RlOgo+ID4KPiA+IE9uIEZyaSwgTm92IDI1LCAyMDEx
+IGF0IDExOjA3OjIxUE0gKzAxMDAsIEVkZGkgRGUgUGllcmkgd3JvdGU6Cj4gPj4gVGhpcyBwYXRj
+aCBhZGQgc3VwcG9ydCB0byBtdWx0aXBsZXhlZCBzbWJ1cyBmb3IgcHJvbGlhbnQgbWljcm9zZXJ2
+ZXIKPiA+PiBOMzZMIGFuZCBtYXkgYmUgYXBwbGljYWJsZSB0byBvdGhlciBjb25maWd1cmF0aW9u
+IGJhc2VkIG9uIHNiOHh4Cj4gPj4gc291dGhidXMuCj4gPj4KPiA+PiByb290QHByb2xpYW50Oi91
+c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMgaTJjZGV0ZWN0IC1sCj4gPj4gaTJjLTAgICBzbWJ1cyAg
+ICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBMCkgICAgICAgICAgICAgIFNNQnVzIGFk
+YXB0ZXIKPiA+PiBpMmMtMSAgIHNtYnVzICAgICAgICAgICBTTUJ1cyBwaWl4NCBhZGFwdGVyIChT
+REEyKSAgICAgICAgICAgICAgU01CdXMgYWRhcHRlcgo+ID4+IGkyYy0yICAgc21idXMgICAgICAg
+ICAgIFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTMpICAgICAgICAgICAgICBTTUJ1cyBhZGFwdGVy
+Cj4gPj4gaTJjLTMgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBNCkg
+ICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiA+PiByb290QHByb2xpYW50Oi91c3Ivc3JjL2xt
+LXNlbnNvcnMvZWRkaSMKPiA+Cj4gPiBwYXRjaCBzaG91bGQgZ28gaW5saW5lIHNvIGl0IGNhbiBi
+ZSByZXZpZXdlZCwgdGhhbmtzLgo+ID4KPiA+IC0tCj4gPiBCZW4gRG9va3MsIGJlbkBmbHVmZi5v
+cmcsIGh0dHA6Ly93d3cuZmx1ZmYub3JnL2Jlbi8KPiA+Cj4gPiBMYXJnZSBIYWRyb24gQ29sYWRh
+OiBBIGxhcmdlIFBpbmEgQ29sYWRhIHRoYXQgbWFrZXMgdGhlIHVuaXZlcnNlIGRpc2FwcGVhci4K
+PiA+Cj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K
+PiBsbS1zZW5zb3JzIG1haWxpbmcgbGlzdAo+IGxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKPiBo
+dHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3JzCgpf
+X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3Jz
+IG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1z
+ZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM
diff --git a/a/content_digest b/N1/content_digest
index 61545c2..2ba3173 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,468 +1,343 @@
  "ref\0CAKdnbx7xeygkOK=BR+3vUrWT3GEt=PZrxgrEMvEB5nkOfAF0bg@mail.gmail.com\0"
  "ref\020111127225514.GO19115@trinity.fluff.org\0"
  "ref\0CAKdnbx4u6+_WJjjMJ3jnDLSU8eJ0yXX0Mg-dcr=3F4FaOd2R=g@mail.gmail.com\0"
- "From\0Guenter Roeck <guenter.roeck-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>\0"
- "Subject\0Re: [lm-sensors] [PATCH] i2c multiplexer driver for Proliant microserver N36L\0"
- "Date\0Sat, 3 Dec 2011 08:27:57 -0800\0"
+ "From\0Guenter Roeck <guenter.roeck@ericsson.com>\0"
+ "Subject\0Re: [lm-sensors] [PATCH] i2c multiplexer driver for Proliant\0"
+ "Date\0Sat, 03 Dec 2011 16:27:57 +0000\0"
  "To\0Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org>\0"
  "Cc\0Ben Dooks <ben-i2c-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org>"
   linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org <linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
  " lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org <lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org>\0"
  "\00:1\0"
  "b\0"
- "On Sat, Dec 03, 2011 at 10:31:30AM -0500, Eddi De Pieri wrote:\n"
- "> This patch add support to multiplexed smbus for proliant microserver\n"
- "> N36L and may be applicable to other configuration based on sb8xx\n"
- "> southbus.\n"
- "> \n"
- "\n"
- "Did you read Documentation/SubmittingPatches ?\n"
- "\n"
- "The patch doesn't follow the canonical patch format, I can see that lines are split,\n"
- "the patch isn't based on the linux root directory but on some other directory which\n"
- "I guess you expect the reader to figure out, the patch description includes lots\n"
- "of information which is irrelevant for the changelog, and it is based on 2.6.32\n"
- "instead of the current release and thus pretty much guaranteed not to apply\n"
- "to the current kernel version. All that w/o even looking into the code.\n"
- "\n"
- "The patch implements an I2C multiplexer but doesn't use the I2C multiplexer\n"
- "infrastructure. I am not one of the I2C maintainers, but that alone would cause me\n"
- "to reject this patch (on top of all the other reasons above).\n"
- "\n"
- "Guenter\n"
- "\n"
- "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -l\n"
- "> i2c-0   smbus           SMBus piix4 adapter (SDA0)              SMBus adapter\n"
- "> i2c-1   smbus           SMBus piix4 adapter (SDA2)              SMBus adapter\n"
- "> i2c-2   smbus           SMBus piix4 adapter (SDA3)              SMBus adapter\n"
- "> i2c-3   smbus           SMBus piix4 adapter (SDA4)              SMBus adapter\n"
- "> root@proliant:/usr/src/lm-sensors/eddi#\n"
- "> \n"
- "> yes SDA1 is reserved... so i can't multiplex it\n"
- "> \n"
- "> root@proliant:/usr/src/lm-sensors/eddi# sensors\n"
- "> k10temp-pci-00c3\n"
- "> Adapter: PCI adapter\n"
- "> temp1:       +24.5\302\260C  (high = +70.0\302\260C, crit = +100.0\302\260C)\n"
- "> \n"
- "> w83795adg-i2c-1-2f\n"
- "> Adapter: SMBus piix4 adapter (SDA2)\n"
- "> in0:         +1.02 V  (min =  +0.00 V, max =  +2.05 V)\n"
- "> in1:         +1.52 V  (min =  +0.00 V, max =  +2.05 V)\n"
- "> in2:         +1.10 V  (min =  +0.00 V, max =  +2.05 V)\n"
- "> in3:         +0.89 V  (min =  +0.00 V, max =  +2.05 V)\n"
- "> in12:        +3.35 V  (min =  +0.00 V, max =  +6.14 V)\n"
- "> in13:        +3.28 V  (min =  +0.00 V, max =  +6.14 V)\n"
- "> fan1:        703 RPM  (min =  329 RPM)\n"
- "> temp1:       +23.0\302\260C  (high = +109.0\302\260C, hyst = +109.0\302\260C)\n"
- ">                       (crit = +109.0\302\260C, hyst = +109.0\302\260C)  sensor = thermal diode\n"
- "> temp2:       +33.2\302\260C  (high = +105.0\302\260C, hyst = +105.0\302\260C)\n"
- ">                       (crit = +105.0\302\260C, hyst = +105.0\302\260C)  sensor = thermal diode\n"
- "> temp5:       +14.0\302\260C  (high = +39.0\302\260C, hyst = +39.0\302\260C)\n"
- ">                       (crit = +44.0\302\260C, hyst = +44.0\302\260C)  sensor = thermistor\n"
- "> beep_enable:disabled\n"
- "> \n"
- "> jc42-i2c-0-18\n"
- "> Adapter: SMBus piix4 adapter (SDA0)\n"
- "> temp1:       +20.5\302\260C  (low  =  +0.0\302\260C, high =  +0.0\302\260C)  ALARM\n"
- ">                       (crit =  +0.0\302\260C, hyst =  +0.0\302\260C)  ALARM\n"
- "> \n"
- "> \n"
- "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 0\n"
- ">      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n"
- "> 00:          -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 10: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --\n"
- "> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 70: -- -- -- -- -- -- -- --\n"
- "> \n"
- "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 1\n"
- ">      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n"
- "> 00:          -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- UU\n"
- "> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 60: -- 61 -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 70: -- -- -- -- -- -- -- --\n"
- "> \n"
- "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 2\n"
- ">      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n"
- "> 00:          -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 40: -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- --\n"
- "> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 70: -- -- -- -- -- -- -- --\n"
- "> \n"
- "> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -y 3\n"
- ">      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n"
- "> 00:          -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n"
- "> 70: -- -- -- -- -- -- -- --\n"
- "> \n"
- "> pay attention that the msleep seems to be really needed...\n"
- "> \n"
- "> Signed-off-by: Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org>\n"
- "> \n"
- "> Regards,\n"
- "> \n"
- "> Eddi\n"
- "> \n"
- "> follows patch....\n"
- "> \n"
- "> diff -u -N -r 2.6.32.orig/i2c-piix4.c 2.6.32/i2c-piix4.c\n"
- "> --- 2.6.32.orig/i2c-piix4.c     2011-11-16 17:07:03.000000000 +0100\n"
- "> +++ 2.6.32/i2c-piix4.c  2011-11-16 15:21:17.000000000 +0100\n"
- "> @@ -97,7 +97,8 @@\n"
- ">  static unsigned short piix4_smba;\n"
- ">  static int srvrworks_csb5_delay;\n"
- ">  static struct pci_driver piix4_driver;\n"
- "> -static struct i2c_adapter piix4_adapter;\n"
- "> +struct i2c_adapter piix4_adapter;\n"
- "> +EXPORT_SYMBOL_GPL(piix4_adapter);\n"
- "> \n"
- ">  static struct dmi_system_id __devinitdata piix4_dmi_blacklist[] = {\n"
- ">         {\n"
- "> @@ -246,10 +247,22 @@\n"
- ">                         \"0x%x already in use!\\n\", smba_idx);\n"
- ">                 return -EBUSY;\n"
- ">         }\n"
- "> -       outb_p(smb_en, smba_idx);\n"
- "> -       smba_en_lo = inb_p(smba_idx + 1);\n"
- "> -       outb_p(smb_en + 1, smba_idx);\n"
- "> -       smba_en_hi = inb_p(smba_idx + 1);\n"
- "> +       outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c\n"
- "> +       smba_en_lo = inb_p(smba_idx + 1);       //leggo il dato L del registro 0x2c\n"
- "> +       outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1\n"
- "> +       smba_en_hi = inb_p(smba_idx + 1);       //leggo il dato H del registro 0x2c\n"
- "> +\n"
- "> +       outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c\n"
- "> +       outb_p(smba_en_lo & 0xF9 , smba_idx + 1); //seleziono la porta 0 00 0\n"
- "> +       outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1\n"
- "> +       outb_p(smba_en_hi, smba_idx + 1);\n"
- "> +\n"
- "> +       outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c\n"
- "> +       smba_en_lo = inb_p(smba_idx + 1);       //leggo il dato L del registro 0x2c\n"
- "> +       outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1\n"
- "> +       smba_en_hi = inb_p(smba_idx + 1);       //leggo il dato H del registro 0x2c\n"
- "> +\n"
- "> +\n"
- ">         release_region(smba_idx, 2);\n"
- "> \n"
- ">         if ((smba_en_lo & 1) == 0) {\n"
- "> @@ -258,6 +271,8 @@\n"
- ">                 return -ENODEV;\n"
- ">         }\n"
- "> \n"
- "> +       dev_info(&PIIX4_dev->dev,\"Selected Default Smbus Port 0x%x\",\n"
- "> (smba_en_lo & 0x6) >> 1);\n"
- "> +\n"
- ">         piix4_smba = ((smba_en_hi << 8) | smba_en_lo) & 0xffe0;\n"
- ">         if (acpi_check_region(piix4_smba, SMBIOSIZE, piix4_driver.name))\n"
- ">                 return -ENODEV;\n"
- "> @@ -466,7 +481,7 @@\n"
- ">         .functionality  = piix4_func,\n"
- ">  };\n"
- "> \n"
- "> -static struct i2c_adapter piix4_adapter = {\n"
- "> +struct i2c_adapter piix4_adapter = {\n"
- ">         .owner          = THIS_MODULE,\n"
- ">         .class          = I2C_CLASS_HWMON | I2C_CLASS_SPD,\n"
- ">         .algo           = &smbus_algorithm,\n"
- "> diff -u -N -r 2.6.32.orig/i2c-piix4-n36l.c 2.6.32/i2c-piix4-n36l.c\n"
- "> --- 2.6.32.orig/i2c-piix4-n36l.c        1970-01-01 01:00:00.000000000 +0100\n"
- "> +++ 2.6.32/i2c-piix4-n36l.c     2011-11-16 16:02:01.000000000 +0100\n"
- "> @@ -0,0 +1,247 @@\n"
- "> +/*\n"
- "> + * i2c-piix4-n36l.c - i2c-piix4 extras for the HP proliant\n"
- "> microserver n36l motherboard\n"
- "> + *\n"
- "> + * Copyright (C) 2004, 2008 Jean Delvare <khali-PUYAD+kWke1g9hUCZPvPmw@public.gmane.org>\n"
- "> + * Copyright (C) 2011  Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org>\n"
- "> + *\n"
- "> + * This program is free software; you can redistribute it and/or modify\n"
- "> + * it under the terms of the GNU General Public License as published by\n"
- "> + * the Free Software Foundation; either version 2 of the License, or\n"
- "> + * (at your option) any later version.\n"
- "> + *\n"
- "> + * This program is distributed in the hope that it will be useful,\n"
- "> + * but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
- "> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
- "> + * GNU General Public License for more details.\n"
- "> + *\n"
- "> + * You should have received a copy of the GNU General Public License\n"
- "> + * along with this program; if not, write to the Free Software\n"
- "> + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n"
- "> + */\n"
- "> +\n"
- "> +/*\n"
- "> + * We select the channels by sending commands to the sb800 southbus\n"
- "> + * the selection bit\n"
- "> + * http://support.amd.com/us/Embedded_TechDocs/45482.pdf\n"
- "> + *  Smbus0En - RW \303\242\342\202\254\342\200\234 16 bits - [PM_Reg: 2Ch]\n"
- "> + *  Field Name Bits Default Description\n"
- "> + *  SmBus0En 0 0b Set to 1 to enable SMBUS0 function and decoding.\n"
- "> + *  SmBus0Sel 2:1 00b SmBus port selection when PM_Reg 2Fh bit 0 is set to 0\n"
- "> + *  00: Port 0\n"
- "> + *  01: Port 2\n"
- "> + *  10: Port 3\n"
- "> + *  11: Port 4\n"
- "> + */\n"
- "> +\n"
- "> +#include <linux/module.h>\n"
- "> +#include <linux/kernel.h>\n"
- "> +#include <linux/slab.h>\n"
- "> +#include <linux/init.h>\n"
- "> +#include <linux/i2c.h>\n"
- "> +#include <linux/mutex.h>\n"
- "> +#include <asm/io.h>\n"
- "> +\n"
- "> +extern struct i2c_adapter piix4_adapter;\n"
- "> +\n"
- "> +static struct i2c_adapter *n36l_adapter;\n"
- "> +static struct i2c_algorithm *n36l_algo;\n"
- "> +\n"
- "> +/* Wrapper access functions for multiplexed SMBus */\n"
- "> +static DEFINE_MUTEX(piix4_lock);\n"
- "> +\n"
- "> +/* We remember the last used channels combination so as to only switch\n"
- "> +   channels when it is really needed. This greatly reduces the SMBus\n"
- "> +   overhead, but also assumes that nobody will be writing to the PCA9556\n"
- "> +   in our back. */\n"
- "> +static u8 last_channels;\n"
- "> +\n"
- "> +static inline s32 piix4_access_channel(struct i2c_adapter * adap, u16 addr,\n"
- "> +                                       unsigned short flags, char read_write,\n"
- "> +                                       u8 command, int size,\n"
- "> +                                       union i2c_smbus_data * data,\n"
- "> +                                       u8 channels)\n"
- "> +{\n"
- "> +       int error;\n"
- "> +       unsigned short smba_idx = 0xcd6;\n"
- "> +       u8 smba_en_lo, smba_en_hi, smb_en = 0x2c;\n"
- "> +\n"
- "> +       mutex_lock(&piix4_lock);\n"
- "> +\n"
- "> +       if (last_channels != channels) {\n"
- "> +               union i2c_smbus_data mplxdata;\n"
- "> +               mplxdata.byte = channels;\n"
- "> +\n"
- "> +               /* Determine the address of the SMBus areas */\n"
- "> +               if (!request_region(smba_idx, 2, \"smba_idx\")) {\n"
- "> +                       dev_err(&piix4_adapter.dev, \"SMBus base address index region \"\n"
- "> +                               \"0x%x already in use!\\n\", smba_idx);\n"
- "> +                       return -EBUSY;\n"
- "> +               }\n"
- "> +\n"
- "> +               outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c\n"
- "> +               smba_en_lo = inb_p(smba_idx + 1);       //leggo il dato L del registro 0x2c\n"
- "> +               outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1\n"
- "> +               smba_en_hi = inb_p(smba_idx + 1);       //leggo il dato H del registro 0x2c\n"
- "> +\n"
- "> +               msleep(50);\n"
- "> +               outb_p(smb_en, smba_idx);               //seleziono il registro 0x2c\n"
- "> +               outb_p((smba_en_lo & 0xF9 )+ ( channels << 1) , smba_idx + 1);\n"
- "> //seleziono la porta 0 00 0\n"
- "> +               outb_p(smb_en + 1, smba_idx);           //seleziono il registro 0x2c + 1\n"
- "> +               outb_p(smba_en_hi, smba_idx + 1);\n"
- "> +\n"
- "> +               msleep(50);\n"
- "> +\n"
- "> +               release_region(smba_idx, 2);\n"
- "> +\n"
- "> +               dev_info(&piix4_adapter.dev,\"Selected Smbus Port 0x%x\", (smba_en_lo\n"
- "> & 0x6) >> 1);\n"
- "> +\n"
- "> +               last_channels = channels;\n"
- "> +\n"
- "> +       }\n"
- "> +\n"
- "> +       error = piix4_adapter.algo->smbus_xfer(adap, addr, flags, read_write,\n"
- "> +                                             command, size, data);\n"
- "> +\n"
- "> +\n"
- "> +       mutex_unlock(&piix4_lock);\n"
- "> +       return error;\n"
- "> +}\n"
- "> +\n"
- "> +static s32 piix4_access_virt0(struct i2c_adapter * adap, u16 addr,\n"
- "> +                              unsigned short flags, char read_write,\n"
- "> +                              u8 command, int size,\n"
- "> +                              union i2c_smbus_data * data)\n"
- "> +{\n"
- "> +       return piix4_access_channel(adap, addr, flags, read_write, command,\n"
- "> +                                    size, data, 0);\n"
- "> +}\n"
- "> +\n"
- "> +static s32 piix4_access_virt1(struct i2c_adapter * adap, u16 addr,\n"
- "> +                              unsigned short flags, char read_write,\n"
- "> +                              u8 command, int size,\n"
- "> +                              union i2c_smbus_data * data)\n"
- "> +{\n"
- "> +       return piix4_access_channel(adap, addr, flags, read_write, command,\n"
- "> +                                    size, data, 1);\n"
- "> +}\n"
- "> +\n"
- "> +static s32 piix4_access_virt2(struct i2c_adapter * adap, u16 addr,\n"
- "> +                              unsigned short flags, char read_write,\n"
- "> +                              u8 command, int size,\n"
- "> +                              union i2c_smbus_data * data)\n"
- "> +{\n"
- "> +       return piix4_access_channel(adap, addr, flags, read_write, command,\n"
- "> +                                    size, data, 2);\n"
- "> +}\n"
- "> +\n"
- "> +static s32 piix4_access_virt3(struct i2c_adapter * adap, u16 addr,\n"
- "> +                              unsigned short flags, char read_write,\n"
- "> +                              u8 command, int size,\n"
- "> +                              union i2c_smbus_data * data)\n"
- "> +{\n"
- "> +       return piix4_access_channel(adap, addr, flags, read_write, command,\n"
- "> +                                    size, data, 3);\n"
- "> +}\n"
- "> +\n"
- "> +static int __init piix4_n36l_init(void)\n"
- "> +{\n"
- "> +       int i, error;\n"
- "> +\n"
- "> +       if (!piix4_adapter.dev.parent)\n"
- "> +               return -ENODEV;\n"
- "> +\n"
- "> +       printk(KERN_INFO \"Configure the AMD SB800 Multiplexer\\n\");\n"
- "> +\n"
- "> +       /* Unregister physical bus */\n"
- "> +       error = i2c_del_adapter(&piix4_adapter);\n"
- "> +       if (error) {\n"
- "> +               dev_err(&piix4_adapter.dev, \"Physical bus removal failed\\n\");\n"
- "> +               goto ERROR0;\n"
- "> +       }\n"
- "> +\n"
- "> +       printk(KERN_INFO \"Enabling SMBus multiplexing for Hp Proliant\n"
- "> Microserver N36l\\n\");\n"
- "> +       /* Define the 4 virtual adapters and algorithms structures */\n"
- "> +       if (!(n36l_adapter = kzalloc(5 * sizeof(struct i2c_adapter),\n"
- "> +                                     GFP_KERNEL))) {\n"
- "> +               error = -ENOMEM;\n"
- "> +               goto ERROR1;\n"
- "> +       }\n"
- "> +       if (!(n36l_algo = kzalloc(5 * sizeof(struct i2c_algorithm),\n"
- "> +                                  GFP_KERNEL))) {\n"
- "> +               error = -ENOMEM;\n"
- "> +               goto ERROR2;\n"
- "> +       }\n"
- "> +\n"
- "> +       /* Fill in the new structures */\n"
- "> +       n36l_algo[0] = *(piix4_adapter.algo);\n"
- "> +       n36l_algo[0].smbus_xfer = piix4_access_virt0;\n"
- "> +       n36l_adapter[0] = piix4_adapter;\n"
- "> +       snprintf(n36l_adapter[0].name, sizeof(n36l_adapter[0].name),\n"
- "> +                \"SMBus piix4 adapter (SDA0)\");\n"
- "> +       n36l_adapter[0].algo = n36l_algo;\n"
- "> +       n36l_adapter[0].dev.parent = piix4_adapter.dev.parent;\n"
- "> +       for (i = 1; i < 4; i++) {\n"
- "> +               n36l_algo[i] = *(piix4_adapter.algo);\n"
- "> +               n36l_adapter[i] = piix4_adapter;\n"
- "> +               snprintf(n36l_adapter[i].name, sizeof(n36l_adapter[i].name),\n"
- "> +                        \"SMBus piix4 adapter (SDA%d)\", i + 1);\n"
- "> +               n36l_adapter[i].algo = n36l_algo+i;\n"
- "> +               n36l_adapter[i].dev.parent = piix4_adapter.dev.parent;\n"
- "> +       }\n"
- "> +       n36l_algo[1].smbus_xfer = piix4_access_virt1;\n"
- "> +       n36l_algo[2].smbus_xfer = piix4_access_virt2;\n"
- "> +       n36l_algo[3].smbus_xfer = piix4_access_virt3;\n"
- "> +\n"
- "> +       /* Register virtual adapters */\n"
- "> +       for (i = 0; i < 4; i++) {\n"
- "> +               error = i2c_add_adapter(n36l_adapter+i);\n"
- "> +               if (error) {\n"
- "> +                       printk(KERN_ERR \"i2c-piix4-n36l: \"\n"
- "> +                              \"Virtual adapter %d registration \"\n"
- "> +                              \"failed, module not inserted\\n\", i);\n"
- "> +                       for (i--; i >= 0; i--)\n"
- "> +                               i2c_del_adapter(n36l_adapter+i);\n"
- "> +                       goto ERROR3;\n"
- "> +               }\n"
- "> +       }\n"
- "> +\n"
- "> +       return 0;\n"
- "> +\n"
- "> +ERROR3:\n"
- "> +       kfree(n36l_algo);\n"
- "> +       n36l_algo = NULL;\n"
- "> +ERROR2:\n"
- "> +       kfree(n36l_adapter);\n"
- "> +       n36l_adapter = NULL;\n"
- "> +ERROR1:\n"
- "> +       /* Restore physical bus */\n"
- "> +       i2c_add_adapter(&piix4_adapter);\n"
- "> +ERROR0:\n"
- "> +       return error;\n"
- "> +}\n"
- "> +\n"
- "> +static void __exit piix4_n36l_exit(void)\n"
- "> +{\n"
- "> +       if (n36l_adapter) {\n"
- "> +               int i;\n"
- "> +\n"
- "> +               for (i = 0; i < 5; i++)\n"
- "> +                       i2c_del_adapter(n36l_adapter+i);\n"
- "> +               kfree(n36l_adapter);\n"
- "> +               n36l_adapter = NULL;\n"
- "> +       }\n"
- "> +       kfree(n36l_algo);\n"
- "> +       n36l_algo = NULL;\n"
- "> +\n"
- "> +       /* Restore physical bus */\n"
- "> +       if (i2c_add_adapter(&piix4_adapter))\n"
- "> +               printk(KERN_ERR \"i2c-piix4-n36l: \"\n"
- "> +                      \"Physical bus restoration failed\\n\");\n"
- "> +}\n"
- "> +\n"
- "> +MODULE_AUTHOR(\"Eddi De Pieri <eddi-soWH+0lSOSbR7s880joybQ@public.gmane.org\");\n"
- "> +MODULE_DESCRIPTION(\"n36l SMBus multiplexing\");\n"
- "> +MODULE_LICENSE(\"GPL\");\n"
- "> +\n"
- "> +module_init(piix4_n36l_init);\n"
- "> +module_exit(piix4_n36l_exit);\n"
- "> \n"
- "> \n"
- "> On Sun, Nov 27, 2011 at 11:55 PM, Ben Dooks <ben-i2c-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org> wrote:\n"
- "> >\n"
- "> > On Fri, Nov 25, 2011 at 11:07:21PM +0100, Eddi De Pieri wrote:\n"
- "> >> This patch add support to multiplexed smbus for proliant microserver\n"
- "> >> N36L and may be applicable to other configuration based on sb8xx\n"
- "> >> southbus.\n"
- "> >>\n"
- "> >> root@proliant:/usr/src/lm-sensors/eddi# i2cdetect -l\n"
- "> >> i2c-0   smbus           SMBus piix4 adapter (SDA0)              SMBus adapter\n"
- "> >> i2c-1   smbus           SMBus piix4 adapter (SDA2)              SMBus adapter\n"
- "> >> i2c-2   smbus           SMBus piix4 adapter (SDA3)              SMBus adapter\n"
- "> >> i2c-3   smbus           SMBus piix4 adapter (SDA4)              SMBus adapter\n"
- "> >> root@proliant:/usr/src/lm-sensors/eddi#\n"
- "> >\n"
- "> > patch should go inline so it can be reviewed, thanks.\n"
- "> >\n"
- "> > --\n"
- "> > Ben Dooks, ben-elnMNo+KYs3YtjvyW6yDsg@public.gmane.org, http://www.fluff.org/ben/\n"
- "> >\n"
- "> > Large Hadron Colada: A large Pina Colada that makes the universe disappear.\n"
- "> >\n"
- "> \n"
- "> _______________________________________________\n"
- "> lm-sensors mailing list\n"
- "> lm-sensors-GZX6beZjE8VD60Wz+7aTrA@public.gmane.org\n"
- > http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
+ "T24gU2F0LCBEZWMgMDMsIDIwMTEgYXQgMTA6MzE6MzBBTSAtMDUwMCwgRWRkaSBEZSBQaWVyaSB3\n"
+ "cm90ZToKPiBUaGlzIHBhdGNoIGFkZCBzdXBwb3J0IHRvIG11bHRpcGxleGVkIHNtYnVzIGZvciBw\n"
+ "cm9saWFudCBtaWNyb3NlcnZlcgo+IE4zNkwgYW5kIG1heSBiZSBhcHBsaWNhYmxlIHRvIG90aGVy\n"
+ "IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gc2I4eHgKPiBzb3V0aGJ1cy4KPiAKCkRpZCB5b3UgcmVh\n"
+ "ZCBEb2N1bWVudGF0aW9uL1N1Ym1pdHRpbmdQYXRjaGVzID8KClRoZSBwYXRjaCBkb2Vzbid0IGZv\n"
+ "bGxvdyB0aGUgY2Fub25pY2FsIHBhdGNoIGZvcm1hdCwgSSBjYW4gc2VlIHRoYXQgbGluZXMgYXJl\n"
+ "IHNwbGl0LAp0aGUgcGF0Y2ggaXNuJ3QgYmFzZWQgb24gdGhlIGxpbnV4IHJvb3QgZGlyZWN0b3J5\n"
+ "IGJ1dCBvbiBzb21lIG90aGVyIGRpcmVjdG9yeSB3aGljaApJIGd1ZXNzIHlvdSBleHBlY3QgdGhl\n"
+ "IHJlYWRlciB0byBmaWd1cmUgb3V0LCB0aGUgcGF0Y2ggZGVzY3JpcHRpb24gaW5jbHVkZXMgbG90\n"
+ "cwpvZiBpbmZvcm1hdGlvbiB3aGljaCBpcyBpcnJlbGV2YW50IGZvciB0aGUgY2hhbmdlbG9nLCBh\n"
+ "bmQgaXQgaXMgYmFzZWQgb24gMi42LjMyCmluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcmVsZWFzZSBh\n"
+ "bmQgdGh1cyBwcmV0dHkgbXVjaCBndWFyYW50ZWVkIG5vdCB0byBhcHBseQp0byB0aGUgY3VycmVu\n"
+ "dCBrZXJuZWwgdmVyc2lvbi4gQWxsIHRoYXQgdy9vIGV2ZW4gbG9va2luZyBpbnRvIHRoZSBjb2Rl\n"
+ "LgoKVGhlIHBhdGNoIGltcGxlbWVudHMgYW4gSTJDIG11bHRpcGxleGVyIGJ1dCBkb2Vzbid0IHVz\n"
+ "ZSB0aGUgSTJDIG11bHRpcGxleGVyCmluZnJhc3RydWN0dXJlLiBJIGFtIG5vdCBvbmUgb2YgdGhl\n"
+ "IEkyQyBtYWludGFpbmVycywgYnV0IHRoYXQgYWxvbmUgd291bGQgY2F1c2UgbWUKdG8gcmVqZWN0\n"
+ "IHRoaXMgcGF0Y2ggKG9uIHRvcCBvZiBhbGwgdGhlIG90aGVyIHJlYXNvbnMgYWJvdmUpLgoKR3Vl\n"
+ "bnRlcgoKPiByb290QHByb2xpYW50Oi91c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMgaTJjZGV0ZWN0\n"
+ "IC1sCj4gaTJjLTAgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBMCkg\n"
+ "ICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiBpMmMtMSAgIHNtYnVzICAgICAgICAgICBTTUJ1\n"
+ "cyBwaWl4NCBhZGFwdGVyIChTREEyKSAgICAgICAgICAgICAgU01CdXMgYWRhcHRlcgo+IGkyYy0y\n"
+ "ICAgc21idXMgICAgICAgICAgIFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTMpICAgICAgICAgICAg\n"
+ "ICBTTUJ1cyBhZGFwdGVyCj4gaTJjLTMgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRh\n"
+ "cHRlciAoU0RBNCkgICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiByb290QHByb2xpYW50Oi91\n"
+ "c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMKPiAKPiB5ZXMgU0RBMSBpcyByZXNlcnZlZC4uLiBzbyBp\n"
+ "IGNhbid0IG11bHRpcGxleCBpdAo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29y\n"
+ "cy9lZGRpIyBzZW5zb3JzCj4gazEwdGVtcC1wY2ktMDBjMwo+IEFkYXB0ZXI6IFBDSSBhZGFwdGVy\n"
+ "Cj4gdGVtcDE6ICAgICAgICsyNC41wrBDICAoaGlnaCA9ICs3MC4wwrBDLCBjcml0ID0gKzEwMC4w\n"
+ "wrBDKQo+IAo+IHc4Mzc5NWFkZy1pMmMtMS0yZgo+IEFkYXB0ZXI6IFNNQnVzIHBpaXg0IGFkYXB0\n"
+ "ZXIgKFNEQTIpCj4gaW4wOiAgICAgICAgICsxLjAyIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n"
+ "ICsyLjA1IFYpCj4gaW4xOiAgICAgICAgICsxLjUyIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n"
+ "ICsyLjA1IFYpCj4gaW4yOiAgICAgICAgICsxLjEwIFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n"
+ "ICsyLjA1IFYpCj4gaW4zOiAgICAgICAgICswLjg5IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n"
+ "ICsyLjA1IFYpCj4gaW4xMjogICAgICAgICszLjM1IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n"
+ "ICs2LjE0IFYpCj4gaW4xMzogICAgICAgICszLjI4IFYgIChtaW4gPSAgKzAuMDAgViwgbWF4ID0g\n"
+ "ICs2LjE0IFYpCj4gZmFuMTogICAgICAgIDcwMyBSUE0gIChtaW4gPSAgMzI5IFJQTSkKPiB0ZW1w\n"
+ "MTogICAgICAgKzIzLjDCsEMgIChoaWdoID0gKzEwOS4wwrBDLCBoeXN0ID0gKzEwOS4wwrBDKQo+\n"
+ "ICAgICAgICAgICAgICAgICAgICAgICAoY3JpdCA9ICsxMDkuMMKwQywgaHlzdCA9ICsxMDkuMMKw\n"
+ "QykgIHNlbnNvciA9IHRoZXJtYWwgZGlvZGUKPiB0ZW1wMjogICAgICAgKzMzLjLCsEMgIChoaWdo\n"
+ "ID0gKzEwNS4wwrBDLCBoeXN0ID0gKzEwNS4wwrBDKQo+ICAgICAgICAgICAgICAgICAgICAgICAo\n"
+ "Y3JpdCA9ICsxMDUuMMKwQywgaHlzdCA9ICsxMDUuMMKwQykgIHNlbnNvciA9IHRoZXJtYWwgZGlv\n"
+ "ZGUKPiB0ZW1wNTogICAgICAgKzE0LjDCsEMgIChoaWdoID0gKzM5LjDCsEMsIGh5c3QgPSArMzku\n"
+ "MMKwQykKPiAgICAgICAgICAgICAgICAgICAgICAgKGNyaXQgPSArNDQuMMKwQywgaHlzdCA9ICs0\n"
+ "NC4wwrBDKSAgc2Vuc29yID0gdGhlcm1pc3Rvcgo+IGJlZXBfZW5hYmxlOmRpc2FibGVkCj4gCj4g\n"
+ "amM0Mi1pMmMtMC0xOAo+IEFkYXB0ZXI6IFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTApCj4gdGVt\n"
+ "cDE6ICAgICAgICsyMC41wrBDICAobG93ICA9ICArMC4wwrBDLCBoaWdoID0gICswLjDCsEMpICBB\n"
+ "TEFSTQo+ICAgICAgICAgICAgICAgICAgICAgICAoY3JpdCA9ICArMC4wwrBDLCBoeXN0ID0gICsw\n"
+ "LjDCsEMpICBBTEFSTQo+IAo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29ycy9l\n"
+ "ZGRpIyBpMmNkZXRlY3QgLXkgMAo+ICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAg\n"
+ "YSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSBVVSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LQo+IDUwOiA1MCAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+\n"
+ "IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDcw\n"
+ "OiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vzci9zcmMvbG0t\n"
+ "c2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMQo+ICAgICAgMCAgMSAgMiAgMyAgNCAgNSAgNiAg\n"
+ "NyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSBVVQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLQo+IDYwOiAtLSA2MSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJvbGlhbnQ6L3Vz\n"
+ "ci9zcmMvbG0tc2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMgo+ICAgICAgMCAgMSAgMiAgMyAg\n"
+ "NCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAgICAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSA0YyAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLQo+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+IHJvb3RAcHJv\n"
+ "bGlhbnQ6L3Vzci9zcmMvbG0tc2Vuc29ycy9lZGRpIyBpMmNkZXRlY3QgLXkgMwo+ICAgICAgMCAg\n"
+ "MSAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgYSAgYiAgYyAgZCAgZSAgZgo+IDAwOiAgICAgICAg\n"
+ "ICAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDEwOiAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDIwOiAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDMwOiAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDQwOiAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDUwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDYwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLSAt\n"
+ "LSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IDcwOiAtLSAtLSAtLSAtLSAtLSAtLSAtLSAtLQo+IAo+\n"
+ "IHBheSBhdHRlbnRpb24gdGhhdCB0aGUgbXNsZWVwIHNlZW1zIHRvIGJlIHJlYWxseSBuZWVkZWQu\n"
+ "Li4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBFZGRpIERlIFBpZXJpIDxlZGRpQGRlcGllcmkubmV0Pgo+\n"
+ "IAo+IFJlZ2FyZHMsCj4gCj4gRWRkaQo+IAo+IGZvbGxvd3MgcGF0Y2guLi4uCj4gCj4gZGlmZiAt\n"
+ "dSAtTiAtciAyLjYuMzIub3JpZy9pMmMtcGlpeDQuYyAyLjYuMzIvaTJjLXBpaXg0LmMKPiAtLS0g\n"
+ "Mi42LjMyLm9yaWcvaTJjLXBpaXg0LmMgICAgIDIwMTEtMTEtMTYgMTc6MDc6MDMuMDAwMDAwMDAw\n"
+ "ICswMTAwCj4gKysrIDIuNi4zMi9pMmMtcGlpeDQuYyAgMjAxMS0xMS0xNiAxNToyMToxNy4wMDAw\n"
+ "MDAwMDAgKzAxMDAKPiBAQCAtOTcsNyArOTcsOCBAQAo+ICBzdGF0aWMgdW5zaWduZWQgc2hvcnQg\n"
+ "cGlpeDRfc21iYTsKPiAgc3RhdGljIGludCBzcnZyd29ya3NfY3NiNV9kZWxheTsKPiAgc3RhdGlj\n"
+ "IHN0cnVjdCBwY2lfZHJpdmVyIHBpaXg0X2RyaXZlcjsKPiAtc3RhdGljIHN0cnVjdCBpMmNfYWRh\n"
+ "cHRlciBwaWl4NF9hZGFwdGVyOwo+ICtzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlcjsK\n"
+ "PiArRVhQT1JUX1NZTUJPTF9HUEwocGlpeDRfYWRhcHRlcik7Cj4gCj4gIHN0YXRpYyBzdHJ1Y3Qg\n"
+ "ZG1pX3N5c3RlbV9pZCBfX2RldmluaXRkYXRhIHBpaXg0X2RtaV9ibGFja2xpc3RbXSA9IHsKPiAg\n"
+ "ICAgICAgIHsKPiBAQCAtMjQ2LDEwICsyNDcsMjIgQEAKPiAgICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICAiMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsIHNtYmFfaWR4KTsKPiAgICAgICAgICAgICAgICAg\n"
+ "cmV0dXJuIC1FQlVTWTsKPiAgICAgICAgIH0KPiAtICAgICAgIG91dGJfcChzbWJfZW4sIHNtYmFf\n"
+ "aWR4KTsKPiAtICAgICAgIHNtYmFfZW5fbG8gPSBpbmJfcChzbWJhX2lkeCArIDEpOwo+IC0gICAg\n"
+ "ICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsKPiAtICAgICAgIHNtYmFfZW5faGkgPSBp\n"
+ "bmJfcChzbWJhX2lkeCArIDEpOwo+ICsgICAgICAgb3V0Yl9wKHNtYl9lbiwgc21iYV9pZHgpOyAg\n"
+ "ICAgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMKPiArICAgICAgIHNtYmFf\n"
+ "ZW5fbG8gPSBpbmJfcChzbWJhX2lkeCArIDEpOyAgICAgICAvL2xlZ2dvIGlsIGRhdG8gTCBkZWwg\n"
+ "cmVnaXN0cm8gMHgyYwo+ICsgICAgICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsgICAg\n"
+ "ICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMgKyAxCj4gKyAgICAgICBzbWJhX2Vu\n"
+ "X2hpID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdnbyBpbCBkYXRvIEggZGVsIHJl\n"
+ "Z2lzdHJvIDB4MmMKPiArCj4gKyAgICAgICBvdXRiX3Aoc21iX2VuLCBzbWJhX2lkeCk7ICAgICAg\n"
+ "ICAgICAgICAgLy9zZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYwo+ICsgICAgICAgb3V0Yl9wKHNt\n"
+ "YmFfZW5fbG8gJiAweEY5ICwgc21iYV9pZHggKyAxKTsgLy9zZWxlemlvbm8gbGEgcG9ydGEgMCAw\n"
+ "MCAwCj4gKyAgICAgICBvdXRiX3Aoc21iX2VuICsgMSwgc21iYV9pZHgpOyAgICAgICAgICAgLy9z\n"
+ "ZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYyArIDEKPiArICAgICAgIG91dGJfcChzbWJhX2VuX2hp\n"
+ "LCBzbWJhX2lkeCArIDEpOwo+ICsKPiArICAgICAgIG91dGJfcChzbWJfZW4sIHNtYmFfaWR4KTsg\n"
+ "ICAgICAgICAgICAgICAvL3NlbGV6aW9ubyBpbCByZWdpc3RybyAweDJjCj4gKyAgICAgICBzbWJh\n"
+ "X2VuX2xvID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdnbyBpbCBkYXRvIEwgZGVs\n"
+ "IHJlZ2lzdHJvIDB4MmMKPiArICAgICAgIG91dGJfcChzbWJfZW4gKyAxLCBzbWJhX2lkeCk7ICAg\n"
+ "ICAgICAgICAvL3NlbGV6aW9ubyBpbCByZWdpc3RybyAweDJjICsgMQo+ICsgICAgICAgc21iYV9l\n"
+ "bl9oaSA9IGluYl9wKHNtYmFfaWR4ICsgMSk7ICAgICAgIC8vbGVnZ28gaWwgZGF0byBIIGRlbCBy\n"
+ "ZWdpc3RybyAweDJjCj4gKwo+ICsKPiAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAy\n"
+ "KTsKPiAKPiAgICAgICAgIGlmICgoc21iYV9lbl9sbyAmIDEpID09IDApIHsKPiBAQCAtMjU4LDYg\n"
+ "KzI3MSw4IEBACj4gICAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVWOwo+ICAgICAgICAgfQo+\n"
+ "IAo+ICsgICAgICAgZGV2X2luZm8oJlBJSVg0X2Rldi0+ZGV2LCJTZWxlY3RlZCBEZWZhdWx0IFNt\n"
+ "YnVzIFBvcnQgMHgleCIsCj4gKHNtYmFfZW5fbG8gJiAweDYpID4+IDEpOwo+ICsKPiAgICAgICAg\n"
+ "IHBpaXg0X3NtYmEgPSAoKHNtYmFfZW5faGkgPDwgOCkgfCBzbWJhX2VuX2xvKSAmIDB4ZmZlMDsK\n"
+ "PiAgICAgICAgIGlmIChhY3BpX2NoZWNrX3JlZ2lvbihwaWl4NF9zbWJhLCBTTUJJT1NJWkUsIHBp\n"
+ "aXg0X2RyaXZlci5uYW1lKSkKPiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9ERVY7Cj4gQEAg\n"
+ "LTQ2Niw3ICs0ODEsNyBAQAo+ICAgICAgICAgLmZ1bmN0aW9uYWxpdHkgID0gcGlpeDRfZnVuYywK\n"
+ "PiAgfTsKPiAKPiAtc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBwaWl4NF9hZGFwdGVyID0gewo+\n"
+ "ICtzdHJ1Y3QgaTJjX2FkYXB0ZXIgcGlpeDRfYWRhcHRlciA9IHsKPiAgICAgICAgIC5vd25lciAg\n"
+ "ICAgICAgICA9IFRISVNfTU9EVUxFLAo+ICAgICAgICAgLmNsYXNzICAgICAgICAgID0gSTJDX0NM\n"
+ "QVNTX0hXTU9OIHwgSTJDX0NMQVNTX1NQRCwKPiAgICAgICAgIC5hbGdvICAgICAgICAgICA9ICZz\n"
+ "bWJ1c19hbGdvcml0aG0sCj4gZGlmZiAtdSAtTiAtciAyLjYuMzIub3JpZy9pMmMtcGlpeDQtbjM2\n"
+ "bC5jIDIuNi4zMi9pMmMtcGlpeDQtbjM2bC5jCj4gLS0tIDIuNi4zMi5vcmlnL2kyYy1waWl4NC1u\n"
+ "MzZsLmMgICAgICAgIDE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCj4gKysrIDIu\n"
+ "Ni4zMi9pMmMtcGlpeDQtbjM2bC5jICAgICAyMDExLTExLTE2IDE2OjAyOjAxLjAwMDAwMDAwMCAr\n"
+ "MDEwMAo+IEBAIC0wLDAgKzEsMjQ3IEBACj4gKy8qCj4gKyAqIGkyYy1waWl4NC1uMzZsLmMgLSBp\n"
+ "MmMtcGlpeDQgZXh0cmFzIGZvciB0aGUgSFAgcHJvbGlhbnQKPiBtaWNyb3NlcnZlciBuMzZsIG1v\n"
+ "dGhlcmJvYXJkCj4gKyAqCj4gKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwOCBKZWFuIERlbHZh\n"
+ "cmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4KPiArICogQ29weXJpZ2h0IChDKSAyMDExICBFZGRpIERl\n"
+ "IFBpZXJpIDxlZGRpQGRlcGllcmkubmV0Pgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJl\n"
+ "ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBp\n"
+ "dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1\n"
+ "Ymxpc2hlZCBieQo+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVy\n"
+ "c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgo+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl\n"
+ "ciB2ZXJzaW9uLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl\n"
+ "IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB\n"
+ "TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRB\n"
+ "QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsg\n"
+ "KiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKgo+ICsg\n"
+ "KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs\n"
+ "aWMgTGljZW5zZQo+ICsgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0\n"
+ "byB0aGUgRnJlZSBTb2Z0d2FyZQo+ICsgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUs\n"
+ "IENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KPiArICovCj4gKwo+ICsvKgo+ICsgKiBXZSBzZWxl\n"
+ "Y3QgdGhlIGNoYW5uZWxzIGJ5IHNlbmRpbmcgY29tbWFuZHMgdG8gdGhlIHNiODAwIHNvdXRoYnVz\n"
+ "Cj4gKyAqIHRoZSBzZWxlY3Rpb24gYml0Cj4gKyAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMv\n"
+ "RW1iZWRkZWRfVGVjaERvY3MvNDU0ODIucGRmCj4gKyAqICBTbWJ1czBFbiAtIFJXIMOi4oKs4oCc\n"
+ "IDE2IGJpdHMgLSBbUE1fUmVnOiAyQ2hdCj4gKyAqICBGaWVsZCBOYW1lIEJpdHMgRGVmYXVsdCBE\n"
+ "ZXNjcmlwdGlvbgo+ICsgKiAgU21CdXMwRW4gMCAwYiBTZXQgdG8gMSB0byBlbmFibGUgU01CVVMw\n"
+ "IGZ1bmN0aW9uIGFuZCBkZWNvZGluZy4KPiArICogIFNtQnVzMFNlbCAyOjEgMDBiIFNtQnVzIHBv\n"
+ "cnQgc2VsZWN0aW9uIHdoZW4gUE1fUmVnIDJGaCBiaXQgMCBpcyBzZXQgdG8gMAo+ICsgKiAgMDA6\n"
+ "IFBvcnQgMAo+ICsgKiAgMDE6IFBvcnQgMgo+ICsgKiAgMTA6IFBvcnQgMwo+ICsgKiAgMTE6IFBv\n"
+ "cnQgNAo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUg\n"
+ "PGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ICsjaW5jbHVkZSA8\n"
+ "bGludXgvaW5pdC5oPgo+ICsjaW5jbHVkZSA8bGludXgvaTJjLmg+Cj4gKyNpbmNsdWRlIDxsaW51\n"
+ "eC9tdXRleC5oPgo+ICsjaW5jbHVkZSA8YXNtL2lvLmg+Cj4gKwo+ICtleHRlcm4gc3RydWN0IGky\n"
+ "Y19hZGFwdGVyIHBpaXg0X2FkYXB0ZXI7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVy\n"
+ "ICpuMzZsX2FkYXB0ZXI7Cj4gK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSAqbjM2bF9hbGdv\n"
+ "Owo+ICsKPiArLyogV3JhcHBlciBhY2Nlc3MgZnVuY3Rpb25zIGZvciBtdWx0aXBsZXhlZCBTTUJ1\n"
+ "cyAqLwo+ICtzdGF0aWMgREVGSU5FX01VVEVYKHBpaXg0X2xvY2spOwo+ICsKPiArLyogV2UgcmVt\n"
+ "ZW1iZXIgdGhlIGxhc3QgdXNlZCBjaGFubmVscyBjb21iaW5hdGlvbiBzbyBhcyB0byBvbmx5IHN3\n"
+ "aXRjaAo+ICsgICBjaGFubmVscyB3aGVuIGl0IGlzIHJlYWxseSBuZWVkZWQuIFRoaXMgZ3JlYXRs\n"
+ "eSByZWR1Y2VzIHRoZSBTTUJ1cwo+ICsgICBvdmVyaGVhZCwgYnV0IGFsc28gYXNzdW1lcyB0aGF0\n"
+ "IG5vYm9keSB3aWxsIGJlIHdyaXRpbmcgdG8gdGhlIFBDQTk1NTYKPiArICAgaW4gb3VyIGJhY2su\n"
+ "ICovCj4gK3N0YXRpYyB1OCBsYXN0X2NoYW5uZWxzOwo+ICsKPiArc3RhdGljIGlubGluZSBzMzIg\n"
+ "cGlpeDRfYWNjZXNzX2NoYW5uZWwoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIs\n"
+ "Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0\n"
+ "IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEsCj4gKyAgICAgICAg\n"
+ "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNoYW5uZWxzKQo+ICt7Cj4gKyAgICAg\n"
+ "ICBpbnQgZXJyb3I7Cj4gKyAgICAgICB1bnNpZ25lZCBzaG9ydCBzbWJhX2lkeCA9IDB4Y2Q2Owo+\n"
+ "ICsgICAgICAgdTggc21iYV9lbl9sbywgc21iYV9lbl9oaSwgc21iX2VuID0gMHgyYzsKPiArCj4g\n"
+ "KyAgICAgICBtdXRleF9sb2NrKCZwaWl4NF9sb2NrKTsKPiArCj4gKyAgICAgICBpZiAobGFzdF9j\n"
+ "aGFubmVscyAhPSBjaGFubmVscykgewo+ICsgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNf\n"
+ "ZGF0YSBtcGx4ZGF0YTsKPiArICAgICAgICAgICAgICAgbXBseGRhdGEuYnl0ZSA9IGNoYW5uZWxz\n"
+ "Owo+ICsKPiArICAgICAgICAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBT\n"
+ "TUJ1cyBhcmVhcyAqLwo+ICsgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RfcmVnaW9uKHNtYmFf\n"
+ "aWR4LCAyLCAic21iYV9pZHgiKSkgewo+ICsgICAgICAgICAgICAgICAgICAgICAgIGRldl9lcnIo\n"
+ "JnBpaXg0X2FkYXB0ZXIuZGV2LCAiU01CdXMgYmFzZSBhZGRyZXNzIGluZGV4IHJlZ2lvbiAiCj4g\n"
+ "KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMHgleCBhbHJlYWR5IGluIHVzZSFcbiIs\n"
+ "IHNtYmFfaWR4KTsKPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwo+ICsg\n"
+ "ICAgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgICAgICBvdXRiX3Aoc21iX2VuLCBzbWJh\n"
+ "X2lkeCk7ICAgICAgICAgICAgICAgLy9zZWxlemlvbm8gaWwgcmVnaXN0cm8gMHgyYwo+ICsgICAg\n"
+ "ICAgICAgICAgICBzbWJhX2VuX2xvID0gaW5iX3Aoc21iYV9pZHggKyAxKTsgICAgICAgLy9sZWdn\n"
+ "byBpbCBkYXRvIEwgZGVsIHJlZ2lzdHJvIDB4MmMKPiArICAgICAgICAgICAgICAgb3V0Yl9wKHNt\n"
+ "Yl9lbiArIDEsIHNtYmFfaWR4KTsgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4\n"
+ "MmMgKyAxCj4gKyAgICAgICAgICAgICAgIHNtYmFfZW5faGkgPSBpbmJfcChzbWJhX2lkeCArIDEp\n"
+ "OyAgICAgICAvL2xlZ2dvIGlsIGRhdG8gSCBkZWwgcmVnaXN0cm8gMHgyYwo+ICsKPiArICAgICAg\n"
+ "ICAgICAgICAgbXNsZWVwKDUwKTsKPiArICAgICAgICAgICAgICAgb3V0Yl9wKHNtYl9lbiwgc21i\n"
+ "YV9pZHgpOyAgICAgICAgICAgICAgIC8vc2VsZXppb25vIGlsIHJlZ2lzdHJvIDB4MmMKPiArICAg\n"
+ "ICAgICAgICAgICAgb3V0Yl9wKChzbWJhX2VuX2xvICYgMHhGOSApKyAoIGNoYW5uZWxzIDw8IDEp\n"
+ "ICwgc21iYV9pZHggKyAxKTsKPiAvL3NlbGV6aW9ubyBsYSBwb3J0YSAwIDAwIDAKPiArICAgICAg\n"
+ "ICAgICAgICAgb3V0Yl9wKHNtYl9lbiArIDEsIHNtYmFfaWR4KTsgICAgICAgICAgIC8vc2VsZXpp\n"
+ "b25vIGlsIHJlZ2lzdHJvIDB4MmMgKyAxCj4gKyAgICAgICAgICAgICAgIG91dGJfcChzbWJhX2Vu\n"
+ "X2hpLCBzbWJhX2lkeCArIDEpOwo+ICsKPiArICAgICAgICAgICAgICAgbXNsZWVwKDUwKTsKPiAr\n"
+ "Cj4gKyAgICAgICAgICAgICAgIHJlbGVhc2VfcmVnaW9uKHNtYmFfaWR4LCAyKTsKPiArCj4gKyAg\n"
+ "ICAgICAgICAgICAgIGRldl9pbmZvKCZwaWl4NF9hZGFwdGVyLmRldiwiU2VsZWN0ZWQgU21idXMg\n"
+ "UG9ydCAweCV4IiwgKHNtYmFfZW5fbG8KPiAmIDB4NikgPj4gMSk7Cj4gKwo+ICsgICAgICAgICAg\n"
+ "ICAgICBsYXN0X2NoYW5uZWxzID0gY2hhbm5lbHM7Cj4gKwo+ICsgICAgICAgfQo+ICsKPiArICAg\n"
+ "ICAgIGVycm9yID0gcGlpeDRfYWRhcHRlci5hbGdvLT5zbWJ1c194ZmVyKGFkYXAsIGFkZHIsIGZs\n"
+ "YWdzLCByZWFkX3dyaXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICAgICAgICBjb21tYW5kLCBzaXplLCBkYXRhKTsKPiArCj4gKwo+ICsgICAgICAgbXV0ZXhfdW5s\n"
+ "b2NrKCZwaWl4NF9sb2NrKTsKPiArICAgICAgIHJldHVybiBlcnJvcjsKPiArfQo+ICsKPiArc3Rh\n"
+ "dGljIHMzMiBwaWl4NF9hY2Nlc3NfdmlydDAoc3RydWN0IGkyY19hZGFwdGVyICogYWRhcCwgdTE2\n"
+ "IGFkZHIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGZs\n"
+ "YWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4\n"
+ "IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlv\n"
+ "biBpMmNfc21idXNfZGF0YSAqIGRhdGEpCj4gK3sKPiArICAgICAgIHJldHVybiBwaWl4NF9hY2Nl\n"
+ "c3NfY2hhbm5lbChhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93cml0ZSwgY29tbWFuZCwKPiArICAg\n"
+ "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZGF0YSwgMCk7Cj4gK30KPiAr\n"
+ "Cj4gK3N0YXRpYyBzMzIgcGlpeDRfYWNjZXNzX3ZpcnQxKHN0cnVjdCBpMmNfYWRhcHRlciAqIGFk\n"
+ "YXAsIHUxNiBhZGRyLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBz\n"
+ "aG9ydCBmbGFncywgY2hhciByZWFkX3dyaXRlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICAgICB1OCBjb21tYW5kLCBpbnQgc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICAgdW5pb24gaTJjX3NtYnVzX2RhdGEgKiBkYXRhKQo+ICt7Cj4gKyAgICAgICByZXR1cm4gcGlp\n"
+ "eDRfYWNjZXNzX2NoYW5uZWwoYWRhcCwgYWRkciwgZmxhZ3MsIHJlYWRfd3JpdGUsIGNvbW1hbmQs\n"
+ "Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGRhdGEsIDEpOwo+\n"
+ "ICt9Cj4gKwo+ICtzdGF0aWMgczMyIHBpaXg0X2FjY2Vzc192aXJ0MihzdHJ1Y3QgaTJjX2FkYXB0\n"
+ "ZXIgKiBhZGFwLCB1MTYgYWRkciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5z\n"
+ "aWduZWQgc2hvcnQgZmxhZ3MsIGNoYXIgcmVhZF93cml0ZSwKPiArICAgICAgICAgICAgICAgICAg\n"
+ "ICAgICAgICAgICAgdTggY29tbWFuZCwgaW50IHNpemUsCj4gKyAgICAgICAgICAgICAgICAgICAg\n"
+ "ICAgICAgICAgIHVuaW9uIGkyY19zbWJ1c19kYXRhICogZGF0YSkKPiArewo+ICsgICAgICAgcmV0\n"
+ "dXJuIHBpaXg0X2FjY2Vzc19jaGFubmVsKGFkYXAsIGFkZHIsIGZsYWdzLCByZWFkX3dyaXRlLCBj\n"
+ "b21tYW5kLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBkYXRh\n"
+ "LCAyKTsKPiArfQo+ICsKPiArc3RhdGljIHMzMiBwaWl4NF9hY2Nlc3NfdmlydDMoc3RydWN0IGky\n"
+ "Y19hZGFwdGVyICogYWRhcCwgdTE2IGFkZHIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICAgIHVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJlYWRfd3JpdGUsCj4gKyAgICAgICAgICAg\n"
+ "ICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIGludCBzaXplLAo+ICsgICAgICAgICAgICAg\n"
+ "ICAgICAgICAgICAgICAgICB1bmlvbiBpMmNfc21idXNfZGF0YSAqIGRhdGEpCj4gK3sKPiArICAg\n"
+ "ICAgIHJldHVybiBwaWl4NF9hY2Nlc3NfY2hhbm5lbChhZGFwLCBhZGRyLCBmbGFncywgcmVhZF93\n"
+ "cml0ZSwgY29tbWFuZCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6\n"
+ "ZSwgZGF0YSwgMyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgX19pbml0IHBpaXg0X24zNmxfaW5p\n"
+ "dCh2b2lkKQo+ICt7Cj4gKyAgICAgICBpbnQgaSwgZXJyb3I7Cj4gKwo+ICsgICAgICAgaWYgKCFw\n"
+ "aWl4NF9hZGFwdGVyLmRldi5wYXJlbnQpCj4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PREVW\n"
+ "Owo+ICsKPiArICAgICAgIHByaW50ayhLRVJOX0lORk8gIkNvbmZpZ3VyZSB0aGUgQU1EIFNCODAw\n"
+ "IE11bHRpcGxleGVyXG4iKTsKPiArCj4gKyAgICAgICAvKiBVbnJlZ2lzdGVyIHBoeXNpY2FsIGJ1\n"
+ "cyAqLwo+ICsgICAgICAgZXJyb3IgPSBpMmNfZGVsX2FkYXB0ZXIoJnBpaXg0X2FkYXB0ZXIpOwo+\n"
+ "ICsgICAgICAgaWYgKGVycm9yKSB7Cj4gKyAgICAgICAgICAgICAgIGRldl9lcnIoJnBpaXg0X2Fk\n"
+ "YXB0ZXIuZGV2LCAiUGh5c2ljYWwgYnVzIHJlbW92YWwgZmFpbGVkXG4iKTsKPiArICAgICAgICAg\n"
+ "ICAgICAgZ290byBFUlJPUjA7Cj4gKyAgICAgICB9Cj4gKwo+ICsgICAgICAgcHJpbnRrKEtFUk5f\n"
+ "SU5GTyAiRW5hYmxpbmcgU01CdXMgbXVsdGlwbGV4aW5nIGZvciBIcCBQcm9saWFudAo+IE1pY3Jv\n"
+ "c2VydmVyIE4zNmxcbiIpOwo+ICsgICAgICAgLyogRGVmaW5lIHRoZSA0IHZpcnR1YWwgYWRhcHRl\n"
+ "cnMgYW5kIGFsZ29yaXRobXMgc3RydWN0dXJlcyAqLwo+ICsgICAgICAgaWYgKCEobjM2bF9hZGFw\n"
+ "dGVyID0ga3phbGxvYyg1ICogc2l6ZW9mKHN0cnVjdCBpMmNfYWRhcHRlciksCj4gKyAgICAgICAg\n"
+ "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRlBfS0VSTkVMKSkpIHsKPiArICAgICAgICAg\n"
+ "ICAgICAgZXJyb3IgPSAtRU5PTUVNOwo+ICsgICAgICAgICAgICAgICBnb3RvIEVSUk9SMTsKPiAr\n"
+ "ICAgICAgIH0KPiArICAgICAgIGlmICghKG4zNmxfYWxnbyA9IGt6YWxsb2MoNSAqIHNpemVvZihz\n"
+ "dHJ1Y3QgaTJjX2FsZ29yaXRobSksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICBHRlBfS0VSTkVMKSkpIHsKPiArICAgICAgICAgICAgICAgZXJyb3IgPSAtRU5PTUVNOwo+ICsg\n"
+ "ICAgICAgICAgICAgICBnb3RvIEVSUk9SMjsKPiArICAgICAgIH0KPiArCj4gKyAgICAgICAvKiBG\n"
+ "aWxsIGluIHRoZSBuZXcgc3RydWN0dXJlcyAqLwo+ICsgICAgICAgbjM2bF9hbGdvWzBdID0gKihw\n"
+ "aWl4NF9hZGFwdGVyLmFsZ28pOwo+ICsgICAgICAgbjM2bF9hbGdvWzBdLnNtYnVzX3hmZXIgPSBw\n"
+ "aWl4NF9hY2Nlc3NfdmlydDA7Cj4gKyAgICAgICBuMzZsX2FkYXB0ZXJbMF0gPSBwaWl4NF9hZGFw\n"
+ "dGVyOwo+ICsgICAgICAgc25wcmludGYobjM2bF9hZGFwdGVyWzBdLm5hbWUsIHNpemVvZihuMzZs\n"
+ "X2FkYXB0ZXJbMF0ubmFtZSksCj4gKyAgICAgICAgICAgICAgICAiU01CdXMgcGlpeDQgYWRhcHRl\n"
+ "ciAoU0RBMCkiKTsKPiArICAgICAgIG4zNmxfYWRhcHRlclswXS5hbGdvID0gbjM2bF9hbGdvOwo+\n"
+ "ICsgICAgICAgbjM2bF9hZGFwdGVyWzBdLmRldi5wYXJlbnQgPSBwaWl4NF9hZGFwdGVyLmRldi5w\n"
+ "YXJlbnQ7Cj4gKyAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7Cj4gKyAgICAgICAgICAg\n"
+ "ICAgIG4zNmxfYWxnb1tpXSA9ICoocGlpeDRfYWRhcHRlci5hbGdvKTsKPiArICAgICAgICAgICAg\n"
+ "ICAgbjM2bF9hZGFwdGVyW2ldID0gcGlpeDRfYWRhcHRlcjsKPiArICAgICAgICAgICAgICAgc25w\n"
+ "cmludGYobjM2bF9hZGFwdGVyW2ldLm5hbWUsIHNpemVvZihuMzZsX2FkYXB0ZXJbaV0ubmFtZSks\n"
+ "Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJTTUJ1cyBwaWl4NCBhZGFwdGVyIChTREElZCki\n"
+ "LCBpICsgMSk7Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlcltpXS5hbGdvID0gbjM2bF9h\n"
+ "bGdvK2k7Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlcltpXS5kZXYucGFyZW50ID0gcGlp\n"
+ "eDRfYWRhcHRlci5kZXYucGFyZW50Owo+ICsgICAgICAgfQo+ICsgICAgICAgbjM2bF9hbGdvWzFd\n"
+ "LnNtYnVzX3hmZXIgPSBwaWl4NF9hY2Nlc3NfdmlydDE7Cj4gKyAgICAgICBuMzZsX2FsZ29bMl0u\n"
+ "c21idXNfeGZlciA9IHBpaXg0X2FjY2Vzc192aXJ0MjsKPiArICAgICAgIG4zNmxfYWxnb1szXS5z\n"
+ "bWJ1c194ZmVyID0gcGlpeDRfYWNjZXNzX3ZpcnQzOwo+ICsKPiArICAgICAgIC8qIFJlZ2lzdGVy\n"
+ "IHZpcnR1YWwgYWRhcHRlcnMgKi8KPiArICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsK\n"
+ "PiArICAgICAgICAgICAgICAgZXJyb3IgPSBpMmNfYWRkX2FkYXB0ZXIobjM2bF9hZGFwdGVyK2kp\n"
+ "Owo+ICsgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKPiArICAgICAgICAgICAgICAgICAgICAg\n"
+ "ICBwcmludGsoS0VSTl9FUlIgImkyYy1waWl4NC1uMzZsOiAiCj4gKyAgICAgICAgICAgICAgICAg\n"
+ "ICAgICAgICAgICAgICJWaXJ0dWFsIGFkYXB0ZXIgJWQgcmVnaXN0cmF0aW9uICIKPiArICAgICAg\n"
+ "ICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZFxuIiwg\n"
+ "aSk7Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpLS07IGkgPj0gMDsgaS0tKQo+ICsg\n"
+ "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTJjX2RlbF9hZGFwdGVyKG4zNmxfYWRhcHRl\n"
+ "citpKTsKPiArICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVSUk9SMzsKPiArICAgICAgICAg\n"
+ "ICAgICAgfQo+ICsgICAgICAgfQo+ICsKPiArICAgICAgIHJldHVybiAwOwo+ICsKPiArRVJST1Iz\n"
+ "Ogo+ICsgICAgICAga2ZyZWUobjM2bF9hbGdvKTsKPiArICAgICAgIG4zNmxfYWxnbyA9IE5VTEw7\n"
+ "Cj4gK0VSUk9SMjoKPiArICAgICAgIGtmcmVlKG4zNmxfYWRhcHRlcik7Cj4gKyAgICAgICBuMzZs\n"
+ "X2FkYXB0ZXIgPSBOVUxMOwo+ICtFUlJPUjE6Cj4gKyAgICAgICAvKiBSZXN0b3JlIHBoeXNpY2Fs\n"
+ "IGJ1cyAqLwo+ICsgICAgICAgaTJjX2FkZF9hZGFwdGVyKCZwaWl4NF9hZGFwdGVyKTsKPiArRVJS\n"
+ "T1IwOgo+ICsgICAgICAgcmV0dXJuIGVycm9yOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBfX2V4\n"
+ "aXQgcGlpeDRfbjM2bF9leGl0KHZvaWQpCj4gK3sKPiArICAgICAgIGlmIChuMzZsX2FkYXB0ZXIp\n"
+ "IHsKPiArICAgICAgICAgICAgICAgaW50IGk7Cj4gKwo+ICsgICAgICAgICAgICAgICBmb3IgKGkg\n"
+ "PSAwOyBpIDwgNTsgaSsrKQo+ICsgICAgICAgICAgICAgICAgICAgICAgIGkyY19kZWxfYWRhcHRl\n"
+ "cihuMzZsX2FkYXB0ZXIraSk7Cj4gKyAgICAgICAgICAgICAgIGtmcmVlKG4zNmxfYWRhcHRlcik7\n"
+ "Cj4gKyAgICAgICAgICAgICAgIG4zNmxfYWRhcHRlciA9IE5VTEw7Cj4gKyAgICAgICB9Cj4gKyAg\n"
+ "ICAgICBrZnJlZShuMzZsX2FsZ28pOwo+ICsgICAgICAgbjM2bF9hbGdvID0gTlVMTDsKPiArCj4g\n"
+ "KyAgICAgICAvKiBSZXN0b3JlIHBoeXNpY2FsIGJ1cyAqLwo+ICsgICAgICAgaWYgKGkyY19hZGRf\n"
+ "YWRhcHRlcigmcGlpeDRfYWRhcHRlcikpCj4gKyAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VS\n"
+ "UiAiaTJjLXBpaXg0LW4zNmw6ICIKPiArICAgICAgICAgICAgICAgICAgICAgICJQaHlzaWNhbCBi\n"
+ "dXMgcmVzdG9yYXRpb24gZmFpbGVkXG4iKTsKPiArfQo+ICsKPiArTU9EVUxFX0FVVEhPUigiRWRk\n"
+ "aSBEZSBQaWVyaSA8ZWRkaUBkZXBpZXJpLm5ldCIpOwo+ICtNT0RVTEVfREVTQ1JJUFRJT04oIm4z\n"
+ "NmwgU01CdXMgbXVsdGlwbGV4aW5nIik7Cj4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiArCj4g\n"
+ "K21vZHVsZV9pbml0KHBpaXg0X24zNmxfaW5pdCk7Cj4gK21vZHVsZV9leGl0KHBpaXg0X24zNmxf\n"
+ "ZXhpdCk7Cj4gCj4gCj4gT24gU3VuLCBOb3YgMjcsIDIwMTEgYXQgMTE6NTUgUE0sIEJlbiBEb29r\n"
+ "cyA8YmVuLWkyY0BmbHVmZi5vcmc+IHdyb3RlOgo+ID4KPiA+IE9uIEZyaSwgTm92IDI1LCAyMDEx\n"
+ "IGF0IDExOjA3OjIxUE0gKzAxMDAsIEVkZGkgRGUgUGllcmkgd3JvdGU6Cj4gPj4gVGhpcyBwYXRj\n"
+ "aCBhZGQgc3VwcG9ydCB0byBtdWx0aXBsZXhlZCBzbWJ1cyBmb3IgcHJvbGlhbnQgbWljcm9zZXJ2\n"
+ "ZXIKPiA+PiBOMzZMIGFuZCBtYXkgYmUgYXBwbGljYWJsZSB0byBvdGhlciBjb25maWd1cmF0aW9u\n"
+ "IGJhc2VkIG9uIHNiOHh4Cj4gPj4gc291dGhidXMuCj4gPj4KPiA+PiByb290QHByb2xpYW50Oi91\n"
+ "c3Ivc3JjL2xtLXNlbnNvcnMvZWRkaSMgaTJjZGV0ZWN0IC1sCj4gPj4gaTJjLTAgICBzbWJ1cyAg\n"
+ "ICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBMCkgICAgICAgICAgICAgIFNNQnVzIGFk\n"
+ "YXB0ZXIKPiA+PiBpMmMtMSAgIHNtYnVzICAgICAgICAgICBTTUJ1cyBwaWl4NCBhZGFwdGVyIChT\n"
+ "REEyKSAgICAgICAgICAgICAgU01CdXMgYWRhcHRlcgo+ID4+IGkyYy0yICAgc21idXMgICAgICAg\n"
+ "ICAgIFNNQnVzIHBpaXg0IGFkYXB0ZXIgKFNEQTMpICAgICAgICAgICAgICBTTUJ1cyBhZGFwdGVy\n"
+ "Cj4gPj4gaTJjLTMgICBzbWJ1cyAgICAgICAgICAgU01CdXMgcGlpeDQgYWRhcHRlciAoU0RBNCkg\n"
+ "ICAgICAgICAgICAgIFNNQnVzIGFkYXB0ZXIKPiA+PiByb290QHByb2xpYW50Oi91c3Ivc3JjL2xt\n"
+ "LXNlbnNvcnMvZWRkaSMKPiA+Cj4gPiBwYXRjaCBzaG91bGQgZ28gaW5saW5lIHNvIGl0IGNhbiBi\n"
+ "ZSByZXZpZXdlZCwgdGhhbmtzLgo+ID4KPiA+IC0tCj4gPiBCZW4gRG9va3MsIGJlbkBmbHVmZi5v\n"
+ "cmcsIGh0dHA6Ly93d3cuZmx1ZmYub3JnL2Jlbi8KPiA+Cj4gPiBMYXJnZSBIYWRyb24gQ29sYWRh\n"
+ "OiBBIGxhcmdlIFBpbmEgQ29sYWRhIHRoYXQgbWFrZXMgdGhlIHVuaXZlcnNlIGRpc2FwcGVhci4K\n"
+ "PiA+Cj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K\n"
+ "PiBsbS1zZW5zb3JzIG1haWxpbmcgbGlzdAo+IGxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKPiBo\n"
+ "dHRwOi8vbGlzdHMubG0tc2Vuc29ycy5vcmcvbWFpbG1hbi9saXN0aW5mby9sbS1zZW5zb3JzCgpf\n"
+ "X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsbS1zZW5zb3Jz\n"
+ "IG1haWxpbmcgbGlzdApsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCmh0dHA6Ly9saXN0cy5sbS1z\n"
+ ZW5zb3JzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xtLXNlbnNvcnM
 
-11c413220ba6cfe389f1cf7d4abb5872a8b5ea47676d7100d4e22573d5c9bced
+2562e0e24e7ae6bc59a73b3eb42266dbca899f977a90594193c30697af3629ad

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.