Thread: [cx-oracle-users] unicode characters and cx_Oracle.
Brought to you by:
atuining
From: Garrick W. <gar...@gm...> - 2005-08-22 03:40:14
|
I have the following problem. I have a utf-8 encoded string, that is to be= =20 inserted into an Oracle DB using cx_Oracle. Now cx_Oracle appears to be configured to do a character translation of som= e=20 description on this string. Is there anyway I could insert the unicode=20 equivalent string? (i.e. udata =3D unicode(data, "utf-8")) instead of a=20 regular character string into the database? If not is there a way to=20 configure the encoding type that cx_Oracle expects... Garrick --=20 Garrick Welsh The human race is a race of cowards; and I am not only marching in that procession but carrying a banner. -- Mark Twain |
From: Marcos P. <ma...@bu...> - 2005-08-22 08:25:39
|
This is an incomplete chunk of one of my programs: codPythonOracle=3D{ 'WE8ISO8859P1':'iso-8859-1', 'WE8ISO8859P15':'iso-8859-15', 'WE8MSWIN1252':'cp1252', } class LectorEsquema(fis.LectorEsquemaFisico): def lookupDesc(self,sql): if isinstance(sql, unicode): sql=3Dsql.encode(self.codificacion) return fis.LectorEsquemaFisico.lookupDesc(self,sql) def login(self): self.con=3Ddbapi.connect(self.usuario, self.clave, self.dsn, ) sqlCodOracle=3D'''select value=20 from v$nls_parameters=20 where parameter =3D 'NLS_CHARACTERSET' ''' codOracle=3Dself.lookup(sqlCodOracle)[0][0] self.codificacion=3DcodPythonOracle[codOracle] I don't have the time to prepare an example, but you can extract the information, I hope. * The first time you login, you get the default db encoding. * Then you translate what you get into Python (fill in what you get if it is not in the dict). * Whenever you receive an unicode string, translate into the needed encoding (both the sql and the parameters) before sending it to Oracle. * Whenever you receive a string, decode it using the same encoding, to work internally in Unicode. I hope it helps. This should be done by the cx libs, I guess. El lun, 22-08-2005 a las 13:40 +1000, Garrick Welsh escribi=C3=B3: > I have the following problem. I have a utf-8 encoded string, that is > to be inserted into an Oracle DB using cx_Oracle. >=20 > Now cx_Oracle appears to be configured to do a character translation > of some description on this string. Is there anyway I could insert the > unicode equivalent string? (i.e. udata =3D unicode(data, "utf-8")) > instead of a regular character string into the database? If not is > there a way to configure the encoding type that cx_Oracle expects... >=20 > Garrick >=20 > --=20 > Garrick Welsh >=20 > The human race is a race of cowards; and I am not only marching in > that > procession but carrying a banner. > -- Mark Twain --=20 Marcos S=C3=A1nchez Provencio <ma...@bu...> |
From: Garrick W. <gar...@gm...> - 2005-08-24 00:07:30
|
VGhhbmsgeW91LgoKSSBhY3R1YWxseSBoYXZlIGJlZW4gZG9pbmcgdGhlIHNhbWUgc29ydCBvZiBl bmNvZGluZyBhcyB5b3UndmUgc3BlY2lmaWVkLgoKVGhlIE5MU19DSEFSQUNURVJTRVQgb2YgdGhl IGRhdGFiYXNlIGlzIHV0Zi04IGFuZCBJJ3ZlIGJlZW4gdXRmLTggZW5jb2RpbmcgCmFueSBvZiBt eSB1bmljb2RlIHN0cmluZ3MgYmVmb3JlIEkgYXR0ZW1wdCB0byBpbnNlcnQgdGhlbSBpbnRvIHRo ZSBkYXRhYmFzZS4gClVuZm9ydHVuYXRlbHkgd2hlbiBJIGF0dGVtcHQgdG8gYWNjZXNzIHRoZSBp bnNlcnRlZCBpbmZvcm1hdGlvbiBpdCdzIGRvbmUgCnZpYSAuTkVULiBUaGUgY2hhcmFjdGVycyBp bnNlcnRlZCBhcmUgZGVmaW5hdGVseSBub3QgdGhvc2UgdGhhdCB3ZXJlIAppbnNlcnRlZCBhbmQg dGhlIE9yYWNsZSBUYWJsZSBFZGl0b3IgZGlzcGxheXMgdGhlIGNoYXJhY3RlcnMgaWRlbnRpY2Fs bHkgdG8gCi5ORVQuCgpDaGVlcnMsCkdhcnJpY2sKCihNb3JlIGltcGxlbWVudGF0aW9uIGRldGFp bHMpCnJ1c3NpYW4gLS3Rh9GC0L4g0YLQsNC60L7QtSDQvtGB0LXQvdGMLS0gcnVzc2lhbiAoaXMg dGhlIGlucHV0KQpydXNzaWFuIC0tw5HigKHDkeKAmsOQwr4gw5HigJrDkMKww5DCusOQwr7DkMK1 IMOQwr7DkcKBw5DCtcOQwr3DkcWSLS0gcnVzc2lhbiAoaXMgd2hhdCBpcyBzdG9yZWQgaW4gdGhl IApkYXRhYmFzZSkKCkJhc2ljYWxseSB0aGUgdGVzdCB0ZXh0IHJ1c3NpYW4gLS3Rh9GC0L4g0YLQ sNC60L7QtSDQvtGB0LXQvdGMLS0gcnVzc2lhbiBpcyBzdG9yZWQgaW4gYSAKdXRmLTggZW5jb2Rl ZCBmaWxlLgoKZiA9IGNvZGVjcy5vcGVuKCdtdWx0aS50eHQnLCdyJywndXRmLTgnKQphID0gZi5y ZWFkbGluZSgpIAoKYSA9IGEuZW5jb2RlKCJ1dGYtOCIpCgpUaGlzIGlzIHBhc3NlZCBhcyBhbiBh cmd1bWVudCB0byBhIHN0b3JlZCBwcm9jZWR1cmUuLi4KClRoZSB0ZXh0IGlzIHRoZW4gc2ltcGx5 IGluc2VydGVkIGludG8gYSBkYXRhYmFzZSB0YWJsZS4gVGhlIHRleHQgYmV0d2VlbiB0aGUgCnNv dXJjZSBhbmQgdGhlIGVuZCByZXN1bHQgaXMgZGlmZmVyZW50LgoKCk9uIDgvMjIvMDUsIE1hcmNv cyBTw6FuY2hleiBQcm92ZW5jaW8gPG1hcmNvc0BidXJrZS5hdGguY3g+IHdyb3RlOgo+IAo+IFRo aXMgaXMgYW4gaW5jb21wbGV0ZSBjaHVuayBvZiBvbmUgb2YgbXkgcHJvZ3JhbXM6Cj4gY29kUHl0 aG9uT3JhY2xlPXsKPiAnV0U4SVNPODg1OVAxJzonaXNvLTg4NTktMScsCj4gJ1dFOElTTzg4NTlQ MTUnOidpc28tODg1OS0xNScsCj4gJ1dFOE1TV0lOMTI1Mic6J2NwMTI1MicsCj4gfQo+IAo+IGNs YXNzIExlY3RvckVzcXVlbWEoZmlzLkxlY3RvckVzcXVlbWFGaXNpY28gKToKPiBkZWYgbG9va3Vw RGVzYyhzZWxmLHNxbCk6Cj4gaWYgaXNpbnN0YW5jZShzcWwsIHVuaWNvZGUpOgo+IHNxbD1zcWwu ZW5jb2RlKHNlbGYuY29kaWZpY2FjaW9uKQo+IHJldHVybiBmaXMuTGVjdG9yRXNxdWVtYUZpc2lj by5sb29rdXBEZXNjKHNlbGYsc3FsKQo+IGRlZiBsb2dpbihzZWxmKToKPiBzZWxmLmNvbj1kYmFw aS5jb25uZWN0KHNlbGYudXN1YXJpbywgc2VsZi5jbGF2ZSwgc2VsZi5kc24sICkKPiBzcWxDb2RP cmFjbGU9Jycnc2VsZWN0IHZhbHVlCj4gZnJvbSB2JG5sc19wYXJhbWV0ZXJzCj4gd2hlcmUgcGFy YW1ldGVyID0gJ05MU19DSEFSQUNURVJTRVQnICcnJwo+IGNvZE9yYWNsZT1zZWxmLmxvb2t1cCAo c3FsQ29kT3JhY2xlKVswXVswXQo+IHNlbGYuY29kaWZpY2FjaW9uPWNvZFB5dGhvbk9yYWNsZVtj b2RPcmFjbGVdCj4gCj4gSSBkb24ndCBoYXZlIHRoZSB0aW1lIHRvIHByZXBhcmUgYW4gZXhhbXBs ZSwgYnV0IHlvdSBjYW4gZXh0cmFjdCB0aGUKPiBpbmZvcm1hdGlvbiwgSSBob3BlLgo+IAo+ICog VGhlIGZpcnN0IHRpbWUgeW91IGxvZ2luLCB5b3UgZ2V0IHRoZSBkZWZhdWx0IGRiIGVuY29kaW5n LiAKPiAqIFRoZW4geW91IHRyYW5zbGF0ZSB3aGF0IHlvdSBnZXQgaW50byBQeXRob24gKGZpbGwg aW4gd2hhdCB5b3UgZ2V0IGlmCj4gaXQgaXMgbm90IGluIHRoZSBkaWN0KS4KPiAqIFdoZW5ldmVy IHlvdSByZWNlaXZlIGFuIHVuaWNvZGUgc3RyaW5nLCB0cmFuc2xhdGUgaW50byB0aGUgbmVlZGVk Cj4gZW5jb2RpbmcgKGJvdGggdGhlIHNxbCBhbmQgdGhlIHBhcmFtZXRlcnMpIGJlZm9yZSBzZW5k aW5nIGl0IHRvIE9yYWNsZS4gCj4gKiBXaGVuZXZlciB5b3UgcmVjZWl2ZSBhIHN0cmluZywgZGVj b2RlIGl0IHVzaW5nIHRoZSBzYW1lIGVuY29kaW5nLCB0bwo+IHdvcmsgaW50ZXJuYWxseSBpbiBV bmljb2RlLgo+IAo+IEkgaG9wZSBpdCBoZWxwcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBieSB0aGUg Y3ggbGlicywgSSBndWVzcy4KPiAKPiBFbCBsdW4sIDIyLTA4LTIwMDUgYSBsYXMgMTM6NDAgKzEw MDAsIEdhcnJpY2sgV2Vsc2ggZXNjcmliacOzOiAKPiA+IEkgaGF2ZSB0aGUgZm9sbG93aW5nIHBy b2JsZW0uIEkgaGF2ZSBhIHV0Zi04IGVuY29kZWQgc3RyaW5nLCB0aGF0IGlzCj4gPiB0byBiZSBp bnNlcnRlZCBpbnRvIGFuIE9yYWNsZSBEQiB1c2luZyBjeF9PcmFjbGUuCj4gPgo+ID4gTm93IGN4 X09yYWNsZSBhcHBlYXJzIHRvIGJlIGNvbmZpZ3VyZWQgdG8gZG8gYSBjaGFyYWN0ZXIgdHJhbnNs YXRpb24KPiA+IG9mIHNvbWUgZGVzY3JpcHRpb24gb24gdGhpcyBzdHJpbmcuIElzIHRoZXJlIGFu eXdheSBJIGNvdWxkIGluc2VydCB0aGUKPiA+IHVuaWNvZGUgZXF1aXZhbGVudCBzdHJpbmc/IChp LmUuIHVkYXRhID0gdW5pY29kZShkYXRhLCAidXRmLTgiKSkKPiA+IGluc3RlYWQgb2YgYSByZWd1 bGFyIGNoYXJhY3RlciBzdHJpbmcgaW50byB0aGUgZGF0YWJhc2U/IElmIG5vdCBpcyAKPiA+IHRo ZXJlIGEgd2F5IHRvIGNvbmZpZ3VyZSB0aGUgZW5jb2RpbmcgdHlwZSB0aGF0IGN4X09yYWNsZSBl eHBlY3RzLi4uCj4gPgo+ID4gR2Fycmljawo+ID4KPiA+IC0tCj4gPiBHYXJyaWNrIFdlbHNoCj4g Pgo+ID4gVGhlIGh1bWFuIHJhY2UgaXMgYSByYWNlIG9mIGNvd2FyZHM7IGFuZCBJIGFtIG5vdCBv bmx5IG1hcmNoaW5nIGluIAo+ID4gdGhhdAo+ID4gcHJvY2Vzc2lvbiBidXQgY2FycnlpbmcgYSBi YW5uZXIuCj4gPiAtLSBNYXJrIFR3YWluCj4gLS0KPiBNYXJjb3MgU8OhbmNoZXogUHJvdmVuY2lv IDxtYXJjb3NAYnVya2UuYXRoLmN4Pgo+IAo+IAo+IAo+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCj4gU0YuTmV0IGVtYWlsIGlzIFNwb25z b3JlZCBieSB0aGUgQmV0dGVyIFNvZnR3YXJlIENvbmZlcmVuY2UgJiBFWFBPCj4gU2VwdGVtYmVy IDE5LTIyLCAyMDA1ICogU2FuIEZyYW5jaXNjbywgQ0EgKiBEZXZlbG9wbWVudCBMaWZlY3ljbGUg Cj4gUHJhY3RpY2VzCj4gQWdpbGUgJiBQbGFuLURyaXZlbiBEZXZlbG9wbWVudCAqIE1hbmFnaW5n IFByb2plY3RzICYgVGVhbXMgKiBUZXN0aW5nICYgUUEgCj4gCj4gU2VjdXJpdHkgKiBQcm9jZXNz IEltcHJvdmVtZW50ICYgTWVhc3VyZW1lbnQgKiBodHRwOi8vd3d3LnNxZS5jb20vYnNjZTVzZgo+ IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gY3gtb3Jh Y2xlLXVzZXJzIG1haWxpbmcgbGlzdAo+IGN4LW9yYWNsZS11c2Vyc0BsaXN0cy5zb3VyY2Vmb3Jn ZS5uZXQKPiBodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9jeC1v cmFjbGUtdXNlcnMKPiAKCgoKLS0gCkdhcnJpY2sgV2Vsc2gKClRoZSBodW1hbiByYWNlIGlzIGEg cmFjZSBvZiBjb3dhcmRzOyBhbmQgSSBhbSBub3Qgb25seSBtYXJjaGluZyBpbiB0aGF0CnByb2Nl c3Npb24gYnV0IGNhcnJ5aW5nIGEgYmFubmVyLgotLSBNYXJrIFR3YWluCg== |
From: Marcos P. <ma...@bu...> - 2005-08-24 08:36:38
|
I am sorry if I say obvious things, but sometimes they help (others?) :-) Your string is being encoded as unicode and then decoded as iso-8859-1 (or something similar). Are you sure you are not mixing unicode and encoded strings in your code? When you reach this statement: # a _must_ be unicode a =3D a.encode("utf-8") # now a is an encoded string I guess you must use some convention in your code to separate both types os strings. Try what you read from the database, to see if the same string you read works when fed to the procedure. Well, I hope I gave you some pointer.=20 El mi=C3=A9, 24-08-2005 a las 10:07 +1000, Garrick Welsh escribi=C3=B3: > Thank you. >=20 > I actually have been doing the same sort of encoding as you've > specified. >=20 > The NLS_CHARACTERSET of the database is utf-8 and I've been utf-8 > encoding any of my unicode strings before I attempt to insert them > into the database. Unfortunately when I attempt to access the inserted > information it's done via .NET. The characters inserted are definately > not those that were inserted and the Oracle Table Editor displays the > characters identically to .NET. >=20 > Cheers, > Garrick >=20 > (More implementation details) > russian --=D1=87=D1=82=D0=BE =D1=82=D0=B0=D0=BA=D0=BE=D0=B5 =D0=BE=D1=81= =D0=B5=D0=BD=D1=8C-- russian (is the input) > russian --=C3=91=E2=80=A1=C3=91=E2=80=9A=C3=90=C2=BE =C3=91=E2=80=9A=C3= =90=C2=B0=C3=90=C2=BA=C3=90=C2=BE=C3=90=C2=B5 =C3=90=C2=BE=C3=91=C2=81=C3= =90=C2=B5=C3=90=C2=BD=C3=91=C5=92-- russian (is what is stored > in the database) >=20 > Basically the test text russian --=D1=87=D1=82=D0=BE =D1=82=D0=B0=D0=BA= =D0=BE=D0=B5 =D0=BE=D1=81=D0=B5=D0=BD=D1=8C-- russian is stored > in a utf-8 encoded file. >=20 > f =3D codecs.open('multi.txt','r','utf-8') > a =3D f.readline() =20 > =20 > a =3D a.encode("utf-8") >=20 > This is passed as an argument to a stored procedure... >=20 > The text is then simply inserted into a database table. The text > between the source and the end result is different. >=20 >=20 > On 8/22/05, Marcos S=C3=A1nchez Provencio <ma...@bu...> wrote: > This is an incomplete chunk of one of my programs: > codPythonOracle=3D{ > 'WE8ISO8859P1':'iso-8859-1', > 'WE8ISO8859P15':'iso-8859-15', > 'WE8MSWIN1252':'cp1252', > } > =20 > class LectorEsquema(fis.LectorEsquemaFisico ): > def lookupDesc(self,sql): > if isinstance(sql, unicode): > sql=3Dsql.encode(self.codificacion) > return fis.LectorEsquemaFisico.lookupDesc(self,sql) > def login(self): > self.con=3Ddbapi.connect(self.usuario, self.clave, > self.dsn, ) > sqlCodOracle=3D'''select value > from v$nls_parameters > where parameter =3D 'NLS_CHARACTERSET' ''' > codOracle=3Dself.lookup (sqlCodOracle)[0][0] > self.codificacion=3DcodPythonOracle[codOracle] > =20 > I don't have the time to prepare an example, but you can > extract the > information, I hope. > =20 > * The first time you login, you get the default db encoding.=20 > * Then you translate what you get into Python (fill in what > you get if > it is not in the dict). > * Whenever you receive an unicode string, translate into the > needed > encoding (both the sql and the parameters) before sending it > to Oracle.=20 > * Whenever you receive a string, decode it using the same > encoding, to > work internally in Unicode. > =20 > I hope it helps. This should be done by the cx libs, I guess. > =20 > El lun, 22-08-2005 a las 13:40 +1000, Garrick Welsh escribi=C3=B3= :=20 > > I have the following problem. I have a utf-8 encoded string, > that is > > to be inserted into an Oracle DB using cx_Oracle. > > > > Now cx_Oracle appears to be configured to do a character > translation=20 > > of some description on this string. Is there anyway I could > insert the > > unicode equivalent string? (i.e. udata =3D unicode(data, > "utf-8")) > > instead of a regular character string into the database? If > not is=20 > > there a way to configure the encoding type that cx_Oracle > expects... > > > > Garrick > > > > -- > > Garrick Welsh > > > > The human race is a race of cowards; and I am not only > marching in=20 > > that > > procession but carrying a banner. > > -- Mark Twain > -- > Marcos S=C3=A1nchez Provencio <ma...@bu...> > =20 > =20 > =20 > -------------------------------------------------------=20 > SF.Net email is Sponsored by the Better Software Conference & > EXPO > September 19-22, 2005 * San Francisco, CA * Development > Lifecycle Practices > Agile & Plan-Driven Development * Managing Projects & Teams * > Testing & QA=20 > Security * Process Improvement & Measurement * > http://www.sqe.com/bsce5sf > _______________________________________________ > cx-oracle-users mailing list > cx-...@li... > https://lists.sourceforge.net/lists/listinfo/cx-oracle-users >=20 >=20 >=20 > --=20 > Garrick Welsh >=20 > The human race is a race of cowards; and I am not only marching in > that > procession but carrying a banner. > -- Mark Twain --=20 Marcos S=C3=A1nchez Provencio <ma...@bu...> |
From: Garrick W. <gar...@gm...> - 2005-08-26 00:05:47
|
SSdtIGFmcmFpZCB0aGF0IGFsbCBvZiB0aGUgc3RyaW5ncyB0aGF0IEknbSB1c2luZyBhcmUgdXRm LTggZW5jb2RlZC4gSSAKZmluYWxseSBjYW1lIHRvIHRoZSBwb2ludCB5ZXN0ZXJkYXksIHNpbmNl IEkgZG9uJ3QgbmVlZCB0byBkbyBhbnkgU1FMIG9uIHRoZSAKZGF0YSBJJ20gaW5zZXJ0aW5nLCB0 aGF0IHRoZXkgY291bGQgc3Vydml2ZSBhcyBCTE9CcyBvciByYXcgb3Igb2JqZWN0cyAKaW5zdGVh ZC4KCkFmdGVyIGhhdmluZyB0ZXN0ZWQgdGhpcywgdXRmLTggc3RyaW5ncyBhcmUgYWJsZSB0byBi ZSByZWFkIGFuZCBkZWNvZGVkIApjb3JyZWN0bHkgZnJvbSB0aGUgZGF0YWJhc2UuIChCZXR3ZWVu IHB5dGhvbiBhbmQgLk5FVCkKClRoYW5rIHlvdSBmb3IgeW91ciBoZWxwLCBoYXZpbmcgeW91IGNv bmZpcm0gdGhhdCBjeF9PcmFjbGUgd2FzIGluZGVlZCAKZW5jb2RpbmcgY2hhcmFjdGVycyB3YXMg aW52YWx1YWJsZS4KCkNoZWVycywKR2FycmljawoKT24gOC8yNC8wNSwgTWFyY29zIFPDoW5jaGV6 IFByb3ZlbmNpbyA8bWFyY29zQGJ1cmtlLmF0aC5jeD4gd3JvdGU6Cj4gCj4gSSBhbSBzb3JyeSBp ZiBJIHNheSBvYnZpb3VzIHRoaW5ncywgYnV0IHNvbWV0aW1lcyB0aGV5IGhlbHAKPiAob3RoZXJz PykgOi0pCj4gCj4gWW91ciBzdHJpbmcgaXMgYmVpbmcgZW5jb2RlZCBhcyB1bmljb2RlIGFuZCB0 aGVuIGRlY29kZWQgYXMgaXNvLTg4NTktMQo+IChvciBzb21ldGhpbmcgc2ltaWxhcikuCj4gCj4g QXJlIHlvdSBzdXJlIHlvdSBhcmUgbm90IG1peGluZyB1bmljb2RlIGFuZCBlbmNvZGVkIHN0cmlu Z3MgaW4geW91cgo+IGNvZGU/IFdoZW4geW91IHJlYWNoIHRoaXMgc3RhdGVtZW50Ogo+IAo+ICMg YSBfbXVzdF8gYmUgdW5pY29kZQo+IGEgPSBhLmVuY29kZSgidXRmLTgiKQo+ICMgbm93IGEgaXMg YW4gZW5jb2RlZCBzdHJpbmcKPiAKPiBJIGd1ZXNzIHlvdSBtdXN0IHVzZSBzb21lIGNvbnZlbnRp b24gaW4geW91ciBjb2RlIHRvIHNlcGFyYXRlIGJvdGggdHlwZXMKPiBvcyBzdHJpbmdzLgo+IAo+ IFRyeSB3aGF0IHlvdSByZWFkIGZyb20gdGhlIGRhdGFiYXNlLCB0byBzZWUgaWYgdGhlIHNhbWUg c3RyaW5nIHlvdSByZWFkCj4gd29ya3Mgd2hlbiBmZWQgdG8gdGhlIHByb2NlZHVyZS4KPiAKPiBX ZWxsLCBJIGhvcGUgSSBnYXZlIHlvdSBzb21lIHBvaW50ZXIuCj4gCj4gRWwgbWnDqSwgMjQtMDgt MjAwNSBhIGxhcyAxMDowNyArMTAwMCwgR2FycmljayBXZWxzaCBlc2NyaWJpw7M6Cj4gPiBUaGFu ayB5b3UuCj4gPgo+ID4gSSBhY3R1YWxseSBoYXZlIGJlZW4gZG9pbmcgdGhlIHNhbWUgc29ydCBv ZiBlbmNvZGluZyBhcyB5b3UndmUKPiA+IHNwZWNpZmllZC4KPiA+Cj4gPiBUaGUgTkxTX0NIQVJB Q1RFUlNFVCBvZiB0aGUgZGF0YWJhc2UgaXMgdXRmLTggYW5kIEkndmUgYmVlbiB1dGYtOAo+ID4g ZW5jb2RpbmcgYW55IG9mIG15IHVuaWNvZGUgc3RyaW5ncyBiZWZvcmUgSSBhdHRlbXB0IHRvIGlu c2VydCB0aGVtCj4gPiBpbnRvIHRoZSBkYXRhYmFzZS4gVW5mb3J0dW5hdGVseSB3aGVuIEkgYXR0 ZW1wdCB0byBhY2Nlc3MgdGhlIGluc2VydGVkCj4gPiBpbmZvcm1hdGlvbiBpdCdzIGRvbmUgdmlh IC5ORVQuIFRoZSBjaGFyYWN0ZXJzIGluc2VydGVkIGFyZSBkZWZpbmF0ZWx5Cj4gPiBub3QgdGhv c2UgdGhhdCB3ZXJlIGluc2VydGVkIGFuZCB0aGUgT3JhY2xlIFRhYmxlIEVkaXRvciBkaXNwbGF5 cyB0aGUKPiA+IGNoYXJhY3RlcnMgaWRlbnRpY2FsbHkgdG8gLk5FVC4KPiA+Cj4gPiBDaGVlcnMs Cj4gPiBHYXJyaWNrCj4gPgo+ID4gKE1vcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscykKPiA+IHJ1 c3NpYW4gLS3Rh9GC0L4g0YLQsNC60L7QtSDQvtGB0LXQvdGMLS0gcnVzc2lhbiAoaXMgdGhlIGlu cHV0KQo+ID4gcnVzc2lhbiAtLcOR4oChw5HigJrDkMK+IMOR4oCaw5DCsMOQwrrDkMK+w5DCtSDD kMK+w5HCgcOQwrXDkMK9w5HFki0tIHJ1c3NpYW4gKGlzIHdoYXQgaXMgc3RvcmVkCj4gPiBpbiB0 aGUgZGF0YWJhc2UpCj4gPgo+ID4gQmFzaWNhbGx5IHRoZSB0ZXN0IHRleHQgcnVzc2lhbiAtLdGH 0YLQviDRgtCw0LrQvtC1INC+0YHQtdC90YwtLSBydXNzaWFuIGlzIHN0b3JlZAo+ID4gaW4gYSB1 dGYtOCBlbmNvZGVkIGZpbGUuCj4gPgo+ID4gZiA9IGNvZGVjcy5vcGVuKCdtdWx0aS50eHQnLCdy JywndXRmLTgnKQo+ID4gYSA9IGYucmVhZGxpbmUoKQo+ID4KPiA+IGEgPSBhLmVuY29kZSgidXRm LTgiKQo+ID4KPiA+IFRoaXMgaXMgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIGEgc3RvcmVkIHBy b2NlZHVyZS4uLgo+ID4KPiA+IFRoZSB0ZXh0IGlzIHRoZW4gc2ltcGx5IGluc2VydGVkIGludG8g YSBkYXRhYmFzZSB0YWJsZS4gVGhlIHRleHQKPiA+IGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGhl IGVuZCByZXN1bHQgaXMgZGlmZmVyZW50Lgo+ID4KPiA+Cj4gPiBPbiA4LzIyLzA1LCBNYXJjb3Mg U8OhbmNoZXogUHJvdmVuY2lvIDxtYXJjb3NAYnVya2UuYXRoLmN4PiB3cm90ZToKPiA+IFRoaXMg aXMgYW4gaW5jb21wbGV0ZSBjaHVuayBvZiBvbmUgb2YgbXkgcHJvZ3JhbXM6Cj4gPiBjb2RQeXRo b25PcmFjbGU9ewo+ID4gJ1dFOElTTzg4NTlQMSc6J2lzby04ODU5LTEnLAo+ID4gJ1dFOElTTzg4 NTlQMTUnOidpc28tODg1OS0xNScsCj4gPiAnV0U4TVNXSU4xMjUyJzonY3AxMjUyJywKPiA+IH0K PiA+Cj4gPiBjbGFzcyBMZWN0b3JFc3F1ZW1hKGZpcy5MZWN0b3JFc3F1ZW1hRmlzaWNvICk6Cj4g PiBkZWYgbG9va3VwRGVzYyhzZWxmLHNxbCk6Cj4gPiBpZiBpc2luc3RhbmNlKHNxbCwgdW5pY29k ZSk6Cj4gPiBzcWw9c3FsLmVuY29kZShzZWxmLmNvZGlmaWNhY2lvbikKPiA+IHJldHVybiBmaXMu TGVjdG9yRXNxdWVtYUZpc2ljby5sb29rdXBEZXNjKHNlbGYsc3FsKQo+ID4gZGVmIGxvZ2luKHNl bGYpOgo+ID4gc2VsZi5jb249ZGJhcGkuY29ubmVjdChzZWxmLnVzdWFyaW8sIHNlbGYuY2xhdmUs Cj4gPiBzZWxmLmRzbiwgKQo+ID4gc3FsQ29kT3JhY2xlPScnJ3NlbGVjdCB2YWx1ZQo+ID4gZnJv bSB2JG5sc19wYXJhbWV0ZXJzCj4gPiB3aGVyZSBwYXJhbWV0ZXIgPSAnTkxTX0NIQVJBQ1RFUlNF VCcgJycnCj4gPiBjb2RPcmFjbGU9c2VsZi5sb29rdXAgKHNxbENvZE9yYWNsZSlbMF1bMF0KPiA+ IHNlbGYuY29kaWZpY2FjaW9uPWNvZFB5dGhvbk9yYWNsZVtjb2RPcmFjbGVdCj4gPgo+ID4gSSBk b24ndCBoYXZlIHRoZSB0aW1lIHRvIHByZXBhcmUgYW4gZXhhbXBsZSwgYnV0IHlvdSBjYW4KPiA+ IGV4dHJhY3QgdGhlCj4gPiBpbmZvcm1hdGlvbiwgSSBob3BlLgo+ID4KPiA+ICogVGhlIGZpcnN0 IHRpbWUgeW91IGxvZ2luLCB5b3UgZ2V0IHRoZSBkZWZhdWx0IGRiIGVuY29kaW5nLgo+ID4gKiBU aGVuIHlvdSB0cmFuc2xhdGUgd2hhdCB5b3UgZ2V0IGludG8gUHl0aG9uIChmaWxsIGluIHdoYXQK PiA+IHlvdSBnZXQgaWYKPiA+IGl0IGlzIG5vdCBpbiB0aGUgZGljdCkuCj4gPiAqIFdoZW5ldmVy IHlvdSByZWNlaXZlIGFuIHVuaWNvZGUgc3RyaW5nLCB0cmFuc2xhdGUgaW50byB0aGUKPiA+IG5l ZWRlZAo+ID4gZW5jb2RpbmcgKGJvdGggdGhlIHNxbCBhbmQgdGhlIHBhcmFtZXRlcnMpIGJlZm9y ZSBzZW5kaW5nIGl0Cj4gPiB0byBPcmFjbGUuCj4gPiAqIFdoZW5ldmVyIHlvdSByZWNlaXZlIGEg c3RyaW5nLCBkZWNvZGUgaXQgdXNpbmcgdGhlIHNhbWUKPiA+IGVuY29kaW5nLCB0bwo+ID4gd29y ayBpbnRlcm5hbGx5IGluIFVuaWNvZGUuCj4gPgo+ID4gSSBob3BlIGl0IGhlbHBzLiBUaGlzIHNo b3VsZCBiZSBkb25lIGJ5IHRoZSBjeCBsaWJzLCBJIGd1ZXNzLgo+ID4KPiA+IEVsIGx1biwgMjIt MDgtMjAwNSBhIGxhcyAxMzo0MCArMTAwMCwgR2FycmljayBXZWxzaCBlc2NyaWJpw7M6Cj4gPiA+ IEkgaGF2ZSB0aGUgZm9sbG93aW5nIHByb2JsZW0uIEkgaGF2ZSBhIHV0Zi04IGVuY29kZWQgc3Ry aW5nLAo+ID4gdGhhdCBpcwo+ID4gPiB0byBiZSBpbnNlcnRlZCBpbnRvIGFuIE9yYWNsZSBEQiB1 c2luZyBjeF9PcmFjbGUuCj4gPiA+Cj4gPiA+IE5vdyBjeF9PcmFjbGUgYXBwZWFycyB0byBiZSBj b25maWd1cmVkIHRvIGRvIGEgY2hhcmFjdGVyCj4gPiB0cmFuc2xhdGlvbgo+ID4gPiBvZiBzb21l IGRlc2NyaXB0aW9uIG9uIHRoaXMgc3RyaW5nLiBJcyB0aGVyZSBhbnl3YXkgSSBjb3VsZAo+ID4g aW5zZXJ0IHRoZQo+ID4gPiB1bmljb2RlIGVxdWl2YWxlbnQgc3RyaW5nPyAoaS5lLiB1ZGF0YSA9 IHVuaWNvZGUoZGF0YSwKPiA+ICJ1dGYtOCIpKQo+ID4gPiBpbnN0ZWFkIG9mIGEgcmVndWxhciBj aGFyYWN0ZXIgc3RyaW5nIGludG8gdGhlIGRhdGFiYXNlPyBJZgo+ID4gbm90IGlzCj4gPiA+IHRo ZXJlIGEgd2F5IHRvIGNvbmZpZ3VyZSB0aGUgZW5jb2RpbmcgdHlwZSB0aGF0IGN4X09yYWNsZQo+ ID4gZXhwZWN0cy4uLgo+ID4gPgo+ID4gPiBHYXJyaWNrCj4gPiA+Cj4gPiA+IC0tCj4gPiA+IEdh cnJpY2sgV2Vsc2gKPiA+ID4KPiA+ID4gVGhlIGh1bWFuIHJhY2UgaXMgYSByYWNlIG9mIGNvd2Fy ZHM7IGFuZCBJIGFtIG5vdCBvbmx5Cj4gPiBtYXJjaGluZyBpbgo+ID4gPiB0aGF0Cj4gPiA+IHBy b2Nlc3Npb24gYnV0IGNhcnJ5aW5nIGEgYmFubmVyLgo+ID4gPiAtLSBNYXJrIFR3YWluCj4gPiAt LQo+ID4gTWFyY29zIFPDoW5jaGV6IFByb3ZlbmNpbyA8bWFyY29zQGJ1cmtlLmF0aC5jeD4KPiA+ Cj4gPgo+ID4KPiA+IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KPiA+IFNGLk5ldCBlbWFpbCBpcyBTcG9uc29yZWQgYnkgdGhlIEJldHRlciBT b2Z0d2FyZSBDb25mZXJlbmNlICYKPiA+IEVYUE8KPiA+IFNlcHRlbWJlciAxOS0yMiwgMjAwNSAq IFNhbiBGcmFuY2lzY28sIENBICogRGV2ZWxvcG1lbnQKPiA+IExpZmVjeWNsZSBQcmFjdGljZXMK PiA+IEFnaWxlICYgUGxhbi1Ecml2ZW4gRGV2ZWxvcG1lbnQgKiBNYW5hZ2luZyBQcm9qZWN0cyAm IFRlYW1zICoKPiA+IFRlc3RpbmcgJiBRQQo+ID4gU2VjdXJpdHkgKiBQcm9jZXNzIEltcHJvdmVt ZW50ICYgTWVhc3VyZW1lbnQgKgo+ID4gaHR0cDovL3d3dy5zcWUuY29tL2JzY2U1c2YKPiA+IF9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gPiBjeC1vcmFj bGUtdXNlcnMgbWFpbGluZyBsaXN0Cj4gPiBjeC1vcmFjbGUtdXNlcnNAbGlzdHMuc291cmNlZm9y Z2UubmV0Cj4gPiBodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9j eC1vcmFjbGUtdXNlcnMKPiA+Cj4gPgo+ID4KPiA+IC0tCj4gPiBHYXJyaWNrIFdlbHNoCj4gPgo+ ID4gVGhlIGh1bWFuIHJhY2UgaXMgYSByYWNlIG9mIGNvd2FyZHM7IGFuZCBJIGFtIG5vdCBvbmx5 IG1hcmNoaW5nIGluCj4gPiB0aGF0Cj4gPiBwcm9jZXNzaW9uIGJ1dCBjYXJyeWluZyBhIGJhbm5l ci4KPiA+IC0tIE1hcmsgVHdhaW4KPiAtLQo+IE1hcmNvcyBTw6FuY2hleiBQcm92ZW5jaW8gPG1h cmNvc0BidXJrZS5hdGguY3g+Cj4gCj4gCj4gCj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+IFNGLk5ldCBlbWFpbCBpcyBTcG9uc29yZWQg YnkgdGhlIEJldHRlciBTb2Z0d2FyZSBDb25mZXJlbmNlICYgRVhQTwo+IFNlcHRlbWJlciAxOS0y MiwgMjAwNSAqIFNhbiBGcmFuY2lzY28sIENBICogRGV2ZWxvcG1lbnQgTGlmZWN5Y2xlIAo+IFBy YWN0aWNlcwo+IEFnaWxlICYgUGxhbi1Ecml2ZW4gRGV2ZWxvcG1lbnQgKiBNYW5hZ2luZyBQcm9q ZWN0cyAmIFRlYW1zICogVGVzdGluZyAmIFFBCj4gU2VjdXJpdHkgKiBQcm9jZXNzIEltcHJvdmVt ZW50ICYgTWVhc3VyZW1lbnQgKiBodHRwOi8vd3d3LnNxZS5jb20vYnNjZTVzZgo+IF9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gY3gtb3JhY2xlLXVzZXJz IG1haWxpbmcgbGlzdAo+IGN4LW9yYWNsZS11c2Vyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKPiBo dHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9jeC1vcmFjbGUtdXNl cnMKPiAKCgoKLS0gCkdhcnJpY2sgV2Vsc2gKClRoZSBodW1hbiByYWNlIGlzIGEgcmFjZSBvZiBj b3dhcmRzOyBhbmQgSSBhbSBub3Qgb25seSBtYXJjaGluZyBpbiB0aGF0CnByb2Nlc3Npb24gYnV0 IGNhcnJ5aW5nIGEgYmFubmVyLgotLSBNYXJrIFR3YWluCg== |