From vitor.lima at eldorado.org.br Fri Aug 16 16:01:29 2013 Content-Type: multipart/mixed; boundary="===============8141888557886730228==" MIME-Version: 1.0 From: Vitor de Lima To: devel at ovirt.org Subject: [Engine-devel] Issues with IBM POWER support in oVirt engine Date: Fri, 16 Aug 2013 20:02:15 +0000 Message-ID: --===============8141888557886730228== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable --_000_B2CAFC4D5E2D574A883EF61ACD5ADE330180A712SERV070corpeldo_ Content-Type: text/plain; charset=3D"us-ascii" Content-Transfer-Encoding: quoted-printable Hi everyone, I wrote some code to run a VM on a IBM POWER host, but I stumbled in some i= =3D ssues that will need a little bit of refactoring in the current code and I = =3D would like some feedback. The first issue is that KVM on POWER requires a special SCSI interface (cal= =3D led SPAPR), which is not available in x86-64. Currently I'm solving this pr= =3D oblem by using (in the VmInfoBuilder class): if (vm.getArchitecture().equals(ArchitectureType.ppc64)) { Map struct =3D3D new HashMap(); struct.put(VdsProperties.Type, VmDeviceType.CONTROLLER.getName(= =3D )); struct.put(VdsProperties.Device, VdsProperties.Scsi); // Create a controller in the index 1, the VirtIO_SCSI interface= =3D is in index 0 struct.put(VdsProperties.Index, "1"); Map spaprAddress =3D3D new HashMap(); spaprAddress.put("type", "spapr-vio"); struct.put(VdsProperties.Address, spaprAddress); devices.add(struct); } But this is a poor solution, because this class would be polluted by archit= =3D ectural differences. Another thing to notice is that since in IBM POWER the= =3D re are two SCSI controllers, all the SCSI devices must have their SCSI addr= =3D ess explicitly defined (it was not needed before, since there was just one = =3D controller before). It was proposed that a "strategy" class could solve the= =3D problem, but I would like to have some feedback on which package it should= =3D be, since it will also be used in the bll package to validate other stuff. The second issue is that the CD-ROM interface is SCSI on POWER guests (and = =3D must be attached to the SPAPR interface) and IDE on the x86_64, this inform= =3D ation could be retrieved from the osinfo (by creating a property there) or = =3D It could be hard-coded in the strategy class. Which would be the best way to handle this difference? The third and final issue is that when the VNC protocol is used in a VM, by= =3D default a Cirrus Logic VGA device is created. This device is not supported= =3D on POWER guests, but the standard VGA device is. I made a workaround, but = =3D the issue is where to put this association between the device type and the = =3D display protocol. Should it also be a property in the osinfo? Or it should be handled in the = =3D strategy class? --_000_B2CAFC4D5E2D574A883EF61ACD5ADE330180A712SERV070corpeldo_ Content-Type: text/html; charset=3D"us-ascii" Content-Transfer-Encoding: quoted-printable

Hi everyone,<=3D /p>

 

I wrote some code to run a = VM o=3D n a IBM POWER host, but I stumbled in some issues that will need a little b= =3D it of refactoring in the current code and I would like some feedback.<= =3D /o:p>

 

The first issue is that KVM= on =3D POWER requires a special SCSI interface (called SPAPR), which is not availa= =3D ble in x86-64. Currently I’m solving this problem by using (in the Vm= =3D InfoBuilder class):

 

if (vm.getArchitecture().eq= uals=3D (ArchitectureType.ppc64)) {

    &nb= sp;&=3D nbsp;     Map<String, Object> struct =3D3D n= ew=3D HashMap<String, Object>();

    &nb= sp;&=3D nbsp;      struct.put(VdsProperties.Type, VmDevice= =3D Type.CONTROLLER.getName());

    &nb= sp;&=3D nbsp;      struct.put(VdsProperties.Device, VdsPro= =3D perties.Scsi);

 

    &nb= sp;&=3D nbsp;     // Create a controller in the index 1, the Vi= =3D rtIO_SCSI interface is in index 0

    &nb= sp;&=3D nbsp;      struct.put(VdsProperties.Index, "1= =3D ");

 

    &nb= sp;&=3D nbsp;      Map<String, String> spaprAddress = =3D =3D3D new HashMap<String, String>();

 

    &nb= sp;&=3D nbsp;      spaprAddress.put("type", &quo= =3D t;spapr-vio");

 

    &nb= sp;&=3D nbsp;      struct.put(VdsProperties.Address, spapr= =3D Address);

    &nb= sp;&=3D nbsp;       devices.add(struct);

}

 

But this is a poor solution= , be=3D cause this class would be polluted by architectural differences. Another th= =3D ing to notice is that since in IBM POWER there are two SCSI controllers, al= =3D l the SCSI devices must have their SCSI address explicitly defined (it was not needed before, since there was just= =3D one controller before). It was proposed that a “strategy” clas= =3D s could solve the problem, but I would like to have some feedback on which = =3D package it should be, since it will also be used in the bll package to validate other stuff.

 

The second issue is that th= e CD=3D -ROM interface is SCSI on POWER guests (and must be attached to the SPAPR i= =3D nterface) and IDE on the x86_64, this information could be retrieved from t= =3D he osinfo (by creating a property there) or It could be hard-coded in the strategy class.

Which would be the best way= to =3D handle this difference?

 

The third and final issue i= s th=3D at when the VNC protocol is used in a VM, by default a Cirrus Logic VGA dev= =3D ice is created. This device is not supported on POWER guests, but the stand= =3D ard VGA device is. I made a workaround, but the issue is where to put this association between the device type and= =3D the display protocol.

Should it also be a propert= y in=3D the osinfo? Or it should be handled in the strategy class?

 

--_000_B2CAFC4D5E2D574A883EF61ACD5ADE330180A712SERV070corpeldo_-- --===============8141888557886730228== Content-Type: multipart/alternative MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.bin" LS1fMDAwX0IyQ0FGQzRENUUyRDU3NEE4ODNFRjYxQUNENUFERTMzMDE4MEE3MTJTRVJWMDcwY29y cGVsZG9fCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCkNvbnRl bnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUKCkhpIGV2ZXJ5b25lLAoKSSB3 cm90ZSBzb21lIGNvZGUgdG8gcnVuIGEgVk0gb24gYSBJQk0gUE9XRVIgaG9zdCwgYnV0IEkgc3R1 bWJsZWQgaW4gc29tZSBpPQpzc3VlcyB0aGF0IHdpbGwgbmVlZCBhIGxpdHRsZSBiaXQgb2YgcmVm YWN0b3JpbmcgaW4gdGhlIGN1cnJlbnQgY29kZSBhbmQgSSA9CndvdWxkIGxpa2Ugc29tZSBmZWVk YmFjay4KClRoZSBmaXJzdCBpc3N1ZSBpcyB0aGF0IEtWTSBvbiBQT1dFUiByZXF1aXJlcyBhIHNw ZWNpYWwgU0NTSSBpbnRlcmZhY2UgKGNhbD0KbGVkIFNQQVBSKSwgd2hpY2ggaXMgbm90IGF2YWls YWJsZSBpbiB4ODYtNjQuIEN1cnJlbnRseSBJJ20gc29sdmluZyB0aGlzIHByPQpvYmxlbSBieSB1 c2luZyAoaW4gdGhlIFZtSW5mb0J1aWxkZXIgY2xhc3MpOgoKaWYgKHZtLmdldEFyY2hpdGVjdHVy ZSgpLmVxdWFscyhBcmNoaXRlY3R1cmVUeXBlLnBwYzY0KSkgewogICAgICAgICAgIE1hcDxTdHJp bmcsIE9iamVjdD4gc3RydWN0ID0zRCBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKICAg ICAgICAgICAgc3RydWN0LnB1dChWZHNQcm9wZXJ0aWVzLlR5cGUsIFZtRGV2aWNlVHlwZS5DT05U Uk9MTEVSLmdldE5hbWUoPQopKTsKICAgICAgICAgICAgc3RydWN0LnB1dChWZHNQcm9wZXJ0aWVz LkRldmljZSwgVmRzUHJvcGVydGllcy5TY3NpKTsKCiAgICAgICAgICAgLy8gQ3JlYXRlIGEgY29u dHJvbGxlciBpbiB0aGUgaW5kZXggMSwgdGhlIFZpcnRJT19TQ1NJIGludGVyZmFjZT0KIGlzIGlu IGluZGV4IDAKICAgICAgICAgICAgc3RydWN0LnB1dChWZHNQcm9wZXJ0aWVzLkluZGV4LCAiMSIp OwoKICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzcGFwckFkZHJlc3MgPTNEIG5ldyBI YXNoTWFwPFN0cmluZywgU3RyaW5nPQo+KCk7CgogICAgICAgICAgICBzcGFwckFkZHJlc3MucHV0 KCJ0eXBlIiwgInNwYXByLXZpbyIpOwoKICAgICAgICAgICAgc3RydWN0LnB1dChWZHNQcm9wZXJ0 aWVzLkFkZHJlc3MsIHNwYXByQWRkcmVzcyk7CiAgICAgICAgICAgICBkZXZpY2VzLmFkZChzdHJ1 Y3QpOwp9CgpCdXQgdGhpcyBpcyBhIHBvb3Igc29sdXRpb24sIGJlY2F1c2UgdGhpcyBjbGFzcyB3 b3VsZCBiZSBwb2xsdXRlZCBieSBhcmNoaXQ9CmVjdHVyYWwgZGlmZmVyZW5jZXMuIEFub3RoZXIg dGhpbmcgdG8gbm90aWNlIGlzIHRoYXQgc2luY2UgaW4gSUJNIFBPV0VSIHRoZT0KcmUgYXJlIHR3 byBTQ1NJIGNvbnRyb2xsZXJzLCBhbGwgdGhlIFNDU0kgZGV2aWNlcyBtdXN0IGhhdmUgdGhlaXIg U0NTSSBhZGRyPQplc3MgZXhwbGljaXRseSBkZWZpbmVkIChpdCB3YXMgbm90IG5lZWRlZCBiZWZv cmUsIHNpbmNlIHRoZXJlIHdhcyBqdXN0IG9uZSA9CmNvbnRyb2xsZXIgYmVmb3JlKS4gSXQgd2Fz IHByb3Bvc2VkIHRoYXQgYSAic3RyYXRlZ3kiIGNsYXNzIGNvdWxkIHNvbHZlIHRoZT0KIHByb2Js ZW0sIGJ1dCBJIHdvdWxkIGxpa2UgdG8gaGF2ZSBzb21lIGZlZWRiYWNrIG9uIHdoaWNoIHBhY2th Z2UgaXQgc2hvdWxkPQogYmUsIHNpbmNlIGl0IHdpbGwgYWxzbyBiZSB1c2VkIGluIHRoZSBibGwg cGFja2FnZSB0byB2YWxpZGF0ZSBvdGhlciBzdHVmZi4KClRoZSBzZWNvbmQgaXNzdWUgaXMgdGhh dCB0aGUgQ0QtUk9NIGludGVyZmFjZSBpcyBTQ1NJIG9uIFBPV0VSIGd1ZXN0cyAoYW5kID0KbXVz dCBiZSBhdHRhY2hlZCB0byB0aGUgU1BBUFIgaW50ZXJmYWNlKSBhbmQgSURFIG9uIHRoZSB4ODZf NjQsIHRoaXMgaW5mb3JtPQphdGlvbiBjb3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgb3NpbmZv IChieSBjcmVhdGluZyBhIHByb3BlcnR5IHRoZXJlKSBvciA9Ckl0IGNvdWxkIGJlIGhhcmQtY29k ZWQgaW4gdGhlIHN0cmF0ZWd5IGNsYXNzLgpXaGljaCB3b3VsZCBiZSB0aGUgYmVzdCB3YXkgdG8g aGFuZGxlIHRoaXMgZGlmZmVyZW5jZT8KClRoZSB0aGlyZCBhbmQgZmluYWwgaXNzdWUgaXMgdGhh dCB3aGVuIHRoZSBWTkMgcHJvdG9jb2wgaXMgdXNlZCBpbiBhIFZNLCBieT0KIGRlZmF1bHQgYSBD aXJydXMgTG9naWMgVkdBIGRldmljZSBpcyBjcmVhdGVkLiBUaGlzIGRldmljZSBpcyBub3Qgc3Vw cG9ydGVkPQogb24gUE9XRVIgZ3Vlc3RzLCBidXQgdGhlIHN0YW5kYXJkIFZHQSBkZXZpY2UgaXMu IEkgbWFkZSBhIHdvcmthcm91bmQsIGJ1dCA9CnRoZSBpc3N1ZSBpcyB3aGVyZSB0byBwdXQgdGhp cyBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoZSBkZXZpY2UgdHlwZSBhbmQgdGhlID0KZGlzcGxheSBw cm90b2NvbC4KU2hvdWxkIGl0IGFsc28gYmUgYSBwcm9wZXJ0eSBpbiB0aGUgb3NpbmZvPyBPciBp dCBzaG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgPQpzdHJhdGVneSBjbGFzcz8KCgotLV8wMDBfQjJD QUZDNEQ1RTJENTc0QTg4M0VGNjFBQ0Q1QURFMzMwMTgwQTcxMlNFUlYwNzBjb3JwZWxkb18KQ29u dGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9InVzLWFzY2lpIgpDb250ZW50LVRyYW5zZmVy LUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlCgo8aHRtbCB4bWxuczp2PTNEInVybjpzY2hlbWFz LW1pY3Jvc29mdC1jb206dm1sIiB4bWxuczpvPTNEInVybjpzY2hlbWFzLW1pY3I9Cm9zb2Z0LWNv bTpvZmZpY2U6b2ZmaWNlIiB4bWxuczp3PTNEInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2Zm aWNlOndvcmQiID0KeG1sbnM6bT0zRCJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmlj ZS8yMDA0LzEyL29tbWwiIHhtbG5zPTNEImh0dHA6PQovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0 MCI+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PTNEIkNvbnRlbnQtVHlwZSIgY29udGVudD0zRCJ0 ZXh0L2h0bWw7IGNoYXJzZXQ9M0R1cy1hc2NpaSI9Cj4KPG1ldGEgbmFtZT0zRCJHZW5lcmF0b3Ii IGNvbnRlbnQ9M0QiTWljcm9zb2Z0IFdvcmQgMTQgKGZpbHRlcmVkIG1lZGl1bSkiPgo8c3R5bGU+ PCEtLQovKiBGb250IERlZmluaXRpb25zICovCkBmb250LWZhY2UKCXtmb250LWZhbWlseTpTaW1T dW47CglwYW5vc2UtMToyIDEgNiAwIDMgMSAxIDEgMSAxO30KQGZvbnQtZmFjZQoJe2ZvbnQtZmFt aWx5OlNpbVN1bjsKCXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEgMSAxIDE7fQpAZm9udC1mYWNlCgl7 Zm9udC1mYW1pbHk6Q2FsaWJyaTsKCXBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30KQGZv bnQtZmFjZQoJe2ZvbnQtZmFtaWx5OiJcQFNpbVN1biI7CglwYW5vc2UtMToyIDEgNiAwIDMgMSAx IDEgMSAxO30KLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1h bCwgZGl2Lk1zb05vcm1hbAoJe21hcmdpbjowY207CgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Cglm b250LXNpemU6MTEuMHB0OwoJZm9udC1mYW1pbHk6IkNhbGlicmkiLCJzYW5zLXNlcmlmIjt9CmE6 bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xvcjpi bHVlOwoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29IeXBl cmxpbmtGb2xsb3dlZAoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOnB1cnBsZTsKCXRl eHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQpzcGFuLkVtYWlsU3R5bGUxNwoJe21zby1zdHlsZS10 eXBlOnBlcnNvbmFsLWNvbXBvc2U7Cglmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYi OwoJY29sb3I6d2luZG93dGV4dDt9Ci5Nc29DaHBEZWZhdWx0Cgl7bXNvLXN0eWxlLXR5cGU6ZXhw b3J0LW9ubHk7Cglmb250LWZhbWlseToiQ2FsaWJyaSIsInNhbnMtc2VyaWYiO30KQHBhZ2UgV29y ZFNlY3Rpb24xCgl7c2l6ZTo2MTIuMHB0IDc5Mi4wcHQ7CgltYXJnaW46NzAuODVwdCAzLjBjbSA3 MC44NXB0IDMuMGNtO30KZGl2LldvcmRTZWN0aW9uMQoJe3BhZ2U6V29yZFNlY3Rpb24xO30KLS0+ PC9zdHlsZT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KPG86c2hhcGVkZWZhdWx0cyB2OmV4dD0z RCJlZGl0IiBzcGlkbWF4PTNEIjEwMjYiIC8+CjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3Rl IG1zbyA5XT48eG1sPgo8bzpzaGFwZWxheW91dCB2OmV4dD0zRCJlZGl0Ij4KPG86aWRtYXAgdjpl eHQ9M0QiZWRpdCIgZGF0YT0zRCIxIiAvPgo8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZd LS0+CjwvaGVhZD4KPGJvZHkgbGFuZz0zRCJQVC1CUiIgbGluaz0zRCJibHVlIiB2bGluaz0zRCJw dXJwbGUiPgo8ZGl2IGNsYXNzPTNEIldvcmRTZWN0aW9uMSI+CjxwIGNsYXNzPTNEIk1zb05vcm1h bCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+SGkgZXZlcnlvbmUsPG86cD48L286cD48L3NwYW4+PD0K L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0zRCJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9M0Qi RU4tVVMiPkkgd3JvdGUgc29tZSBjb2RlIHRvIHJ1biBhIFZNIG89Cm4gYSBJQk0gUE9XRVIgaG9z dCwgYnV0IEkgc3R1bWJsZWQgaW4gc29tZSBpc3N1ZXMgdGhhdCB3aWxsIG5lZWQgYSBsaXR0bGUg Yj0KaXQgb2YgcmVmYWN0b3JpbmcgaW4gdGhlIGN1cnJlbnQgY29kZSBhbmQgSSB3b3VsZCBsaWtl IHNvbWUgZmVlZGJhY2suPG86cD48PQovbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPTNEIk1zb05v cm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8 cCBjbGFzcz0zRCJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9M0QiRU4tVVMiPlRoZSBmaXJzdCBpc3N1 ZSBpcyB0aGF0IEtWTSBvbiA9ClBPV0VSIHJlcXVpcmVzIGEgc3BlY2lhbCBTQ1NJIGludGVyZmFj ZSAoY2FsbGVkIFNQQVBSKSwgd2hpY2ggaXMgbm90IGF2YWlsYT0KYmxlIGluIHg4Ni02NC4gQ3Vy cmVudGx5IEkmIzgyMTc7bSBzb2x2aW5nIHRoaXMgcHJvYmxlbSBieSB1c2luZyAoaW4gdGhlIFZt PQpJbmZvQnVpbGRlciBjbGFzcyk6PG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0zRCJN c29Ob3JtYWwiPjxzcGFuIGxhbmc9M0QiRU4tVVMiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwv cD4KPHAgY2xhc3M9M0QiTXNvTm9ybWFsIj48c3BhbiBsYW5nPTNEIkVOLVVTIj5pZiAodm0uZ2V0 QXJjaGl0ZWN0dXJlKCkuZXF1YWxzPQooQXJjaGl0ZWN0dXJlVHlwZS5wcGM2NCkpIHs8bzpwPjwv bzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1V UyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jj0KbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDtNYXAmbHQ7U3RyaW5nLCBPYmplY3QmZ3Q7IHN0cnVjdCA9M0QgbmV3PQog SGFzaE1hcCZsdDtTdHJpbmcsIE9iamVjdCZndDsoKTs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+Cjxw IGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jj0KbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc3Ry dWN0LnB1dChWZHNQcm9wZXJ0aWVzLlR5cGUsIFZtRGV2aWNlPQpUeXBlLkNPTlRST0xMRVIuZ2V0 TmFtZSgpKTs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1hbCI+PHNw YW4gbGFuZz0zRCJFTi1VUyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jj0KbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc3RydWN0LnB1dChWZHNQcm9wZXJ0aWVzLkRl dmljZSwgVmRzUHJvPQpwZXJ0aWVzLlNjc2kpOzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xh c3M9M0QiTXNvTm9ybWFsIj48c3BhbiBsYW5nPTNEIkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jj0KbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsgLy8gQ3JlYXRlIGEgY29udHJvbGxlciBpbiB0aGUgaW5kZXggMSwgdGhlIFZpPQpydElPX1ND U0kgaW50ZXJmYWNlIGlzIGluIGluZGV4IDA8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNz PTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jj0KbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc3RydWN0LnB1 dChWZHNQcm9wZXJ0aWVzLkluZGV4LCAmcXVvdDsxPQomcXVvdDspOzxvOnA+PC9vOnA+PC9zcGFu PjwvcD4KPHAgY2xhc3M9M0QiTXNvTm9ybWFsIj48c3BhbiBsYW5nPTNEIkVOLVVTIj48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0z RCJFTi1VUyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jj0KbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsgTWFwJmx0O1N0cmluZywgU3RyaW5nJmd0OyBzcGFwckFkZHJl c3MgPQo9M0QgbmV3IEhhc2hNYXAmbHQ7U3RyaW5nLCBTdHJpbmcmZ3Q7KCk7PG86cD48L286cD48 L3NwYW4+PC9wPgo8cCBjbGFzcz0zRCJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9M0QiRU4tVVMiPjxv OnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9M0QiTXNvTm9ybWFsIj48c3BhbiBs YW5nPTNEIkVOLVVTIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmPQpuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyBzcGFwckFkZHJlc3MucHV0KCZxdW90O3R5cGUmcXVv dDssICZxdW89CnQ7c3BhcHItdmlvJnF1b3Q7KTs8bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNs YXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+PG86cD4mbmJzcDs8L286cD48 L3NwYW4+PC9wPgo8cCBjbGFzcz0zRCJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9M0QiRU4tVVMiPiZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyY9Cm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7IHN0cnVjdC5wdXQoVmRzUHJvcGVydGllcy5BZGRyZXNzLCBzcGFwcj0KQWRkcmVz cyk7PG86cD48L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0zRCJNc29Ob3JtYWwiPjxzcGFuIGxh bmc9M0QiRU4tVVMiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyY9Cm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IGRldmljZXMuYWRkKHN0cnVjdCk7PG86cD48 L286cD48Lz0Kc3Bhbj48L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJF Ti1VUyI+fTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4KPHAgY2xhc3M9M0QiTXNvTm9ybWFsIj48c3Bh biBsYW5nPTNEIkVOLVVTIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPTNE Ik1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+QnV0IHRoaXMgaXMgYSBwb29yIHNvbHV0 aW9uLCBiZT0KY2F1c2UgdGhpcyBjbGFzcyB3b3VsZCBiZSBwb2xsdXRlZCBieSBhcmNoaXRlY3R1 cmFsIGRpZmZlcmVuY2VzLiBBbm90aGVyIHRoPQppbmcgdG8gbm90aWNlIGlzIHRoYXQgc2luY2Ug aW4gSUJNIFBPV0VSIHRoZXJlIGFyZSB0d28gU0NTSSBjb250cm9sbGVycywgYWw9CmwgdGhlIFND U0kgZGV2aWNlcyBtdXN0IGhhdmUgdGhlaXIgU0NTSQogYWRkcmVzcyBleHBsaWNpdGx5IGRlZmlu ZWQgKGl0IHdhcyBub3QgbmVlZGVkIGJlZm9yZSwgc2luY2UgdGhlcmUgd2FzIGp1c3Q9CiBvbmUg Y29udHJvbGxlciBiZWZvcmUpLiBJdCB3YXMgcHJvcG9zZWQgdGhhdCBhICYjODIyMDtzdHJhdGVn eSYjODIyMTsgY2xhcz0KcyBjb3VsZCBzb2x2ZSB0aGUgcHJvYmxlbSwgYnV0IEkgd291bGQgbGlr ZSB0byBoYXZlIHNvbWUgZmVlZGJhY2sgb24gd2hpY2ggPQpwYWNrYWdlIGl0IHNob3VsZCBiZSwg c2luY2UgaXQgd2lsbCBhbHNvIGJlCiB1c2VkIGluIHRoZSBibGwgcGFja2FnZSB0byB2YWxpZGF0 ZSBvdGhlciBzdHVmZi48bzpwPjwvbzpwPjwvc3Bhbj48L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1h bCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBj bGFzcz0zRCJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9M0QiRU4tVVMiPlRoZSBzZWNvbmQgaXNzdWUg aXMgdGhhdCB0aGUgQ0Q9Ci1ST00gaW50ZXJmYWNlIGlzIFNDU0kgb24gUE9XRVIgZ3Vlc3RzIChh bmQgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgU1BBUFIgaT0KbnRlcmZhY2UpIGFuZCBJREUgb24g dGhlIHg4Nl82NCwgdGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBiZSByZXRyaWV2ZWQgZnJvbSB0PQpo ZSBvc2luZm8gKGJ5IGNyZWF0aW5nIGEgcHJvcGVydHkgdGhlcmUpCiBvciBJdCBjb3VsZCBiZSBo YXJkLWNvZGVkIGluIHRoZSBzdHJhdGVneSBjbGFzcy48bzpwPjwvbzpwPjwvc3Bhbj48L3A+Cjxw IGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+V2hpY2ggd291bGQgYmUg dGhlIGJlc3Qgd2F5IHRvID0KaGFuZGxlIHRoaXMgZGlmZmVyZW5jZT88bzpwPjwvbzpwPjwvc3Bh bj48L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+PG86cD4m bmJzcDs8L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0zRCJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9 M0QiRU4tVVMiPlRoZSB0aGlyZCBhbmQgZmluYWwgaXNzdWUgaXMgdGg9CmF0IHdoZW4gdGhlIFZO QyBwcm90b2NvbCBpcyB1c2VkIGluIGEgVk0sIGJ5IGRlZmF1bHQgYSBDaXJydXMgTG9naWMgVkdB IGRldj0KaWNlIGlzIGNyZWF0ZWQuIFRoaXMgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgb24gUE9X RVIgZ3Vlc3RzLCBidXQgdGhlIHN0YW5kPQphcmQgVkdBIGRldmljZSBpcy4gSSBtYWRlIGEgd29y a2Fyb3VuZCwKIGJ1dCB0aGUgaXNzdWUgaXMgd2hlcmUgdG8gcHV0IHRoaXMgYXNzb2NpYXRpb24g YmV0d2VlbiB0aGUgZGV2aWNlIHR5cGUgYW5kPQogdGhlIGRpc3BsYXkgcHJvdG9jb2wuPG86cD48 L286cD48L3NwYW4+PC9wPgo8cCBjbGFzcz0zRCJNc29Ob3JtYWwiPjxzcGFuIGxhbmc9M0QiRU4t VVMiPlNob3VsZCBpdCBhbHNvIGJlIGEgcHJvcGVydHkgaW49CiB0aGUgb3NpbmZvPyBPciBpdCBz aG91bGQgYmUgaGFuZGxlZCBpbiB0aGUgc3RyYXRlZ3kgY2xhc3M/PG86cD48L286cD48L3NwYT0K bj48L3A+CjxwIGNsYXNzPTNEIk1zb05vcm1hbCI+PHNwYW4gbGFuZz0zRCJFTi1VUyI+PG86cD4m bmJzcDs8L286cD48L3NwYW4+PC9wPgo8L2Rpdj4KPC9ib2R5Pgo8L2h0bWw+CgotLV8wMDBfQjJD QUZDNEQ1RTJENTc0QTg4M0VGNjFBQ0Q1QURFMzMwMTgwQTcxMlNFUlYwNzBjb3JwZWxkb18tLQo= --===============8141888557886730228==--