From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/11155 Path: news.gmane.org!.POSTED!not-for-mail From: He X Newsgroups: gmane.linux.lib.musl.general Subject: Re: [setlocale]: return only one copy if all six parts of locale are same Date: Sat, 18 Mar 2017 21:36:56 +0800 Message-ID: References: <20170318123335.GO1693@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=001a114388b08961d0054b016414 X-Trace: blaine.gmane.org 1489844260 26078 195.159.176.226 (18 Mar 2017 13:37:40 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sat, 18 Mar 2017 13:37:40 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-11170-gllmg-musl=m.gmane.org@lists.openwall.com Sat Mar 18 14:37:35 2017 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.84_2) (envelope-from ) id 1cpEXt-00057y-I4 for gllmg-musl@m.gmane.org; Sat, 18 Mar 2017 14:37:25 +0100 Original-Received: (qmail 12256 invoked by uid 550); 18 Mar 2017 13:37:30 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 12232 invoked from network); 18 Mar 2017 13:37:29 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to; bh=4gBSsIpyZF/mmHRo4gKI+JVdJlB+V0MdqUQqC3nJyII=; b=VIJ7exQu5mM2TSzUYrUunXnwBps276U3dq2bvtsPiCN83SprhEOjabIqy+ayZJF//x hunR9BRlBI6GEXd0W+fLMIwMiFznDZzW4fcczSBkVHSYqilPK1oTpcxvx4fr8o46mf6M LXNgWaEQuPh4FI7m7lNHmWwflj3NDP9KgSbHMcRPKq47MRkDY8l1WbPokzyoBhbTPgiY yS0hPbz59r3mzrYytLUnEj20yFesEfCXBEAnOh9CyEmwk1H2Wdqvm4yJ3pmql24iH3s5 fNjNJnkw5M8bYEwfnwXLy3GSijlpdxLVrVbDEhHreS5DoV5kJ8XFzWNibY0wEz5nuuNs PAOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to; bh=4gBSsIpyZF/mmHRo4gKI+JVdJlB+V0MdqUQqC3nJyII=; b=h8DL8eP1OQCAGEnylKTeBElku5+3TH3SsEHJLgQMIpCxNfVMN9RNTBdnyav86AgG/h CYpTsVjQBm44O4ShBUpDppGp1XOjCrG2b8jhFJEvHjvscXrFTtUWeO8Jn/Ae4I2CXCFf mSBVue3oeFtehmstZKNxMg+8otO6KxnvX39jkyOAceUfCzPD+Doc69owjGW23gsITgIj cdC+cAhQWIkD92azN1bq/64K+dF0YkrOQKI94DciPCMc/tatI25sTHXJtrivn4pvHNhC ObslrMq6vERKxw58M0wrlItF20BP8PVRKUrslWbWX6Q/h5fLwtUYlqas1u4SLQkfoDyR rlIA== X-Gm-Message-State: AFeK/H1wmBTL1y9zdkdlGfKyN4oHwwRiW59fEAaQXgOl7/Mjmwnj7aL2dhxKCAUUMpP9v7D3SFW6WxzAMr3O4A== X-Received: by 10.31.49.81 with SMTP id x78mr8232482vkx.82.1489844237294; Sat, 18 Mar 2017 06:37:17 -0700 (PDT) In-Reply-To: <20170318123335.GO1693@brightrain.aerifal.cx> Xref: news.gmane.org gmane.linux.lib.musl.general:11155 Archived-At: --001a114388b08961d0054b016414 Content-Type: multipart/alternative; boundary=001a114388b08961cb054b016412 --001a114388b08961cb054b016412 Content-Type: text/plain; charset=UTF-8 tested: [xhe@xhe-PC locale]$ ./a.out C zh_CN.UTF-8 zh_CN.UTF-8 [xhe@xhe-PC locale]$ cat test.c #include int main() { printf("%s\n", setlocale(LC_ALL, NULL)); printf("%s\n", setlocale(LC_ALL, "")); printf("%s\n", setlocale(LC_ALL, NULL)); } 2017-03-18 20:33 GMT+08:00 Rich Felker : > On Sat, Mar 18, 2017 at 07:37:57AM +0000, He X wrote: > > As i suggest on IRC, here's the patch. > > > --- musl-1.1.16/src/locale/setlocale.c 2017-03-17 > 17:49:15.767952411 +0000 > > +++ musl-1.1.16/src/locale/setlocale.c 2017-03-17 > 17:49:15.767952411 +0000 > > @@ -48,16 +48,33 @@ > > } > > } > > char *s = buf; > > - for (i=0; i > + const struct __locale_map *flm = > > + libc.global_locale.cat[0]; > > + const char *fpart = flm ? flm->name : "C"; > > + size_t l = strlen(fpart); > > + memcpy(s, fpart, l); > > + s[l] = 0; > > + i=1; > > + do { > > const struct __locale_map *lm = > > libc.global_locale.cat[i]; > > const char *part = lm ? lm->name : "C"; > > - size_t l = strlen(part); > > - memcpy(s, part, l); > > - s[l] = ';'; > > - s += l+1; > > + if (strcmp(s, part)) break; > > + i++; > > + } while (i > + > > + if (i != LC_ALL) { > > + for (i=0; i > + const struct __locale_map *lm = > > + libc.global_locale.cat[i]; > > + const char *part = lm ? lm->name : "C"; > > + size_t l = strlen(part); > > + memcpy(s, part, l); > > + s[l] = ';'; > > + s += l+1; > > + } > > + *--s = 0; > > } > > - *--s = 0; > > UNLOCK(lock); > > return buf; > > } > > I think the results of this patch can be achieved much more simply. > Just compare lm pointers (rather than string contents) for equality at > each iteration in the current loop, counting how many were equal to > libc.global_locale.cat[0]. If that number equals LC_ALL, return > libc.global_locale.cat[0]->name (or "C" if the lm is null) rather than > buf. > > Rich > --001a114388b08961cb054b016412 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+dGVzdGVkOjxkaXY+PGRpdj5beGhlQHhoZS1QQyBsb2NhbGVdJCAuL2Eu b3V0wqA8L2Rpdj48ZGl2PkM8L2Rpdj48ZGl2PnpoX0NOLlVURi04PC9kaXY+PGRpdj56aF9DTi5V VEYtODwvZGl2PjxkaXY+W3hoZUB4aGUtUEMgbG9jYWxlXSQgY2F0IHRlc3QuY8KgPC9kaXY+PGRp dj4jaW5jbHVkZSAmbHQ7bG9jYWxlLmgmZ3Q7PC9kaXY+PGRpdj5pbnQgbWFpbigpIHs8L2Rpdj48 ZGl2PjxzcGFuIGNsYXNzPSJnbWFpbC1BcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNl OnByZSI+CTwvc3Bhbj5wcmludGYoJnF1b3Q7JXNcbiZxdW90Oywgc2V0bG9jYWxlKExDX0FMTCwg TlVMTCkpOzwvZGl2PjxkaXY+PHNwYW4gY2xhc3M9ImdtYWlsLUFwcGxlLXRhYi1zcGFuIiBzdHls ZT0id2hpdGUtc3BhY2U6cHJlIj4JPC9zcGFuPnByaW50ZigmcXVvdDslc1xuJnF1b3Q7LCBzZXRs b2NhbGUoTENfQUxMLCAmcXVvdDsmcXVvdDspKTs8L2Rpdj48ZGl2PjxzcGFuIGNsYXNzPSJnbWFp bC1BcHBsZS10YWItc3BhbiIgc3R5bGU9IndoaXRlLXNwYWNlOnByZSI+CTwvc3Bhbj5wcmludGYo JnF1b3Q7JXNcbiZxdW90Oywgc2V0bG9jYWxlKExDX0FMTCwgTlVMTCkpOzwvZGl2PjxkaXY+fTwv ZGl2PjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PGRpdiBjbGFzcz0i Z21haWxfcXVvdGUiPjIwMTctMDMtMTggMjA6MzMgR01UKzA4OjAwIFJpY2ggRmVsa2VyIDxzcGFu IGRpcj0ibHRyIj4mbHQ7PGEgaHJlZj0ibWFpbHRvOmRhbGlhc0BsaWJjLm9yZyIgdGFyZ2V0PSJf YmxhbmsiPmRhbGlhc0BsaWJjLm9yZzwvYT4mZ3Q7PC9zcGFuPjo8YnI+PGJsb2NrcXVvdGUgY2xh c3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4 ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleCI+PHNwYW4gY2xhc3M9IiI+T24gU2F0LCBNYXIg MTgsIDIwMTcgYXQgMDc6Mzc6NTdBTSArMDAwMCwgSGUgWCB3cm90ZTo8YnI+DQomZ3Q7IEFzIGkg c3VnZ2VzdCBvbiBJUkMsIGhlcmUmIzM5O3MgdGhlIHBhdGNoLjxicj4NCjxicj4NCjwvc3Bhbj4m Z3Q7IC0tLSBtdXNsLTEuMS4xNi9zcmMvbG9jYWxlLzx3YnI+c2V0bG9jYWxlLmPCoCDCoCDCoCDC oCAyMDE3LTAzLTE3IDE3OjQ5OjE1Ljc2Nzk1MjQxMSArMDAwMDxicj4NCiZndDsgKysrIG11c2wt MS4xLjE2L3NyYy9sb2NhbGUvPHdicj5zZXRsb2NhbGUuY8KgIMKgIMKgIMKgIDIwMTctMDMtMTcg MTc6NDk6MTUuNzY3OTUyNDExICswMDAwPGJyPg0KJmd0OyBAQCAtNDgsMTYgKzQ4LDMzIEBAPGJy Pg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCiZndDvCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjaGFy ICpzID0gYnVmOzxicj4NCiZndDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgZm9yIChpPTA7IGkmbHQ7 TENfQUxMOyBpKyspIHs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoGNvbnN0IHN0cnVj dCBfX2xvY2FsZV9tYXAgKmZsbSA9PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqA8YSBocmVmPSJodHRwOi8vbGliYy5nbG9iYWxfbG9jYWxlLmNhdCIgcmVsPSJub3Jl ZmVycmVyIiB0YXJnZXQ9Il9ibGFuayI+bGliYy5nbG9iYWxfbG9jYWxlLmNhdDwvYT5bMF07PGJy Pg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqBjb25zdCBjaGFyICpmcGFydCA9IGZsbSA/IGZs bS0mZ3Q7bmFtZSA6ICZxdW90O0MmcXVvdDs7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAg wqBzaXplX3QgbCA9IHN0cmxlbihmcGFydCk7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAg wqBtZW1jcHkocywgZnBhcnQsIGwpOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgc1ts XSA9IDA7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqBpPTE7PGJyPg0KJmd0OyArwqAg wqAgwqAgwqAgwqAgwqAgwqBkbyB7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgY29uc3Qgc3RydWN0IF9fbG9jYWxlX21hcCAqbG0gPTxicj4NCiZndDvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoDxhIGhyZWY9Imh0dHA6Ly9s aWJjLmdsb2JhbF9sb2NhbGUuY2F0IiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5s aWJjLmdsb2JhbF9sb2NhbGUuY2F0PC9hPltpXTs8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqBjb25zdCBjaGFyICpwYXJ0ID0gbG0gPyBsbS0mZ3Q7bmFtZSA6ICZx dW90O0MmcXVvdDs7PGJyPg0KJmd0OyAtwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBz aXplX3QgbCA9IHN0cmxlbihwYXJ0KTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoG1lbWNweShzLCBwYXJ0LCBsKTs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHNbbF0gPSAmIzM5OzsmIzM5Ozs8YnI+DQomZ3Q7IC3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHMgKz0gbCsxOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgaWYgKHN0cmNtcChzLCBwYXJ0KSkgYnJlYWs7PGJyPg0KJmd0OyAr wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBpKys7PGJyPg0KJmd0OyArwqAgwqAgwqAg wqAgwqAgwqAgwqB9IHdoaWxlIChpJmx0O0xDX0FMTCk7PGJyPg0KJmd0OyArPGJyPg0KJmd0OyAr wqAgwqAgwqAgwqAgwqAgwqAgwqBpZiAoaSAhPSBMQ19BTEwpIHs8YnI+DQomZ3Q7ICvCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGZvciAoaT0wOyBpJmx0O0xDX0FMTDsgaSsrKSB7PGJy Pg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjb25z dCBzdHJ1Y3QgX19sb2NhbGVfbWFwICpsbSA9PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqA8YSBocmVmPSJodHRwOi8vbGli Yy5nbG9iYWxfbG9jYWxlLmNhdCIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFuayI+bGli Yy5nbG9iYWxfbG9jYWxlLmNhdDwvYT5baV07PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBjb25zdCBjaGFyICpwYXJ0ID0gbG0gPyBsbS0mZ3Q7 bmFtZSA6ICZxdW90O0MmcXVvdDs7PGJyPg0KJmd0OyArwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBzaXplX3QgbCA9IHN0cmxlbihwYXJ0KTs8YnI+DQomZ3Q7ICvC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoG1lbWNweShzLCBwYXJ0 LCBsKTs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoHNbbF0gPSAmIzM5OzsmIzM5Ozs8YnI+DQomZ3Q7ICvCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoHMgKz0gbCsxOzxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCiZndDsgK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgKi0tcyA9IDA7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfTxicj4NCiZn dDsgLcKgIMKgIMKgIMKgIMKgIMKgIMKgKi0tcyA9IDA7PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKg IMKgIMKgIMKgVU5MT0NLKGxvY2spOzxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHJl dHVybiBidWY7PGJyPg0KJmd0O8KgIMKgIMKgIMKgfTxicj4NCjxicj4NCkkgdGhpbmsgdGhlIHJl c3VsdHMgb2YgdGhpcyBwYXRjaCBjYW4gYmUgYWNoaWV2ZWQgbXVjaCBtb3JlIHNpbXBseS48YnI+ DQpKdXN0IGNvbXBhcmUgbG0gcG9pbnRlcnMgKHJhdGhlciB0aGFuIHN0cmluZyBjb250ZW50cykg Zm9yIGVxdWFsaXR5IGF0PGJyPg0KZWFjaCBpdGVyYXRpb24gaW4gdGhlIGN1cnJlbnQgbG9vcCwg Y291bnRpbmcgaG93IG1hbnkgd2VyZSBlcXVhbCB0bzxicj4NCjxhIGhyZWY9Imh0dHA6Ly9saWJj Lmdsb2JhbF9sb2NhbGUuY2F0IiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5saWJj Lmdsb2JhbF9sb2NhbGUuY2F0PC9hPlswXS4gSWYgdGhhdCBudW1iZXIgZXF1YWxzIExDX0FMTCwg cmV0dXJuPGJyPg0KPGEgaHJlZj0iaHR0cDovL2xpYmMuZ2xvYmFsX2xvY2FsZS5jYXQiIHJlbD0i bm9yZWZlcnJlciIgdGFyZ2V0PSJfYmxhbmsiPmxpYmMuZ2xvYmFsX2xvY2FsZS5jYXQ8L2E+WzBd LSZndDs8d2JyPm5hbWUgKG9yICZxdW90O0MmcXVvdDsgaWYgdGhlIGxtIGlzIG51bGwpIHJhdGhl ciB0aGFuPGJyPg0KYnVmLjxicj4NCjxzcGFuIGNsYXNzPSJIT0VuWmIiPjxmb250IGNvbG9yPSIj ODg4ODg4Ij48YnI+DQpSaWNoPGJyPg0KPC9mb250Pjwvc3Bhbj48L2Jsb2NrcXVvdGU+PC9kaXY+ PGJyPjwvZGl2Pg0K --001a114388b08961cb054b016412-- --001a114388b08961d0054b016414 Content-Type: text/x-patch; charset=US-ASCII; name="setlocale.patch" Content-Disposition: attachment; filename="setlocale.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j0faro1v0 LS0tIG11c2wtMS4xLjE2L3NyYy9sb2NhbGUvc2V0bG9jYWxlLmMJMjAxNy0wMy0xNyAxNzo0OTox NS43Njc5NTI0MTEgKzAwMDAKKysrIG11c2wtMS4xLjE2L3NyYy9sb2NhbGUvc2V0bG9jYWxlLmMJ MjAxNy0wMy0xNyAxNzo0OToxNS43Njc5NTI0MTEgKzAwMDAKQEAgLTQ4LDE2ICs0OCwzMCBAQAog CQkJfQogCQl9CiAJCWNoYXIgKnMgPSBidWY7Ci0JCWZvciAoaT0wOyBpPExDX0FMTDsgaSsrKSB7 CisgCQljb25zdCBzdHJ1Y3QgX19sb2NhbGVfbWFwICpmbG0gPQorIAkJCWxpYmMuZ2xvYmFsX2xv Y2FsZS5jYXRbMF07CisgCQlpPTE7CisgCQlkbyB7CiAJCQljb25zdCBzdHJ1Y3QgX19sb2NhbGVf bWFwICpsbSA9CiAJCQkJbGliYy5nbG9iYWxfbG9jYWxlLmNhdFtpXTsKLQkJCWNvbnN0IGNoYXIg KnBhcnQgPSBsbSA/IGxtLT5uYW1lIDogIkMiOwotCQkJc2l6ZV90IGwgPSBzdHJsZW4ocGFydCk7 Ci0JCQltZW1jcHkocywgcGFydCwgbCk7Ci0JCQlzW2xdID0gJzsnOwotCQkJcyArPSBsKzE7Cisg CQkJaWYgKGxtICE9IGZsbSkgYnJlYWs7CisgCQkJaSsrOworIAkJfSB3aGlsZSAoaTxMQ19BTEwp OworIAorIAkJaWYgKGkgPT0gTENfQUxMKSB7CisJCQlyZXR1cm4gZmxtID8gZmxtLT5uYW1lIDog IkMiOworCQl9IGVsc2UgeworIAkJCWZvciAoaT0wOyBpPExDX0FMTDsgaSsrKSB7CisgCQkJCWNv bnN0IHN0cnVjdCBfX2xvY2FsZV9tYXAgKmxtID0KKyAJCQkJCWxpYmMuZ2xvYmFsX2xvY2FsZS5j YXRbaV07CisgCQkJCWNvbnN0IGNoYXIgKnBhcnQgPSBsbSA/IGxtLT5uYW1lIDogIkMiOworIAkJ CQlzaXplX3QgbCA9IHN0cmxlbihwYXJ0KTsKKyAJCQkJbWVtY3B5KHMsIHBhcnQsIGwpOworIAkJ CQlzW2xdID0gJzsnOworIAkJCQlzICs9IGwrMTsKKyAJCQl9CisgCQkJKi0tcyA9IDA7CiAJCX0K LQkJKi0tcyA9IDA7CiAJCVVOTE9DSyhsb2NrKTsKIAkJcmV0dXJuIGJ1ZjsKIAl9Cg== --001a114388b08961d0054b016414--