//parallel resistor calculator : input is target value (float)
//this calculator can search a 100 combination up to 10 of linked-resistors.
//output is combination (int array)
//variation of PRECISION can make a combinations more wide.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PRECISION 0.5
#define DECIMAL_PLACE 2 //round decimal place
#define RLIST 6
int* assignRarr(int* Rlist, int numofRlist, int const* Rarr){
for(int i=0; i<numofRlist; i++)
Rlist[i]=Rarr[i];
return Rlist;
}
double isEqual(int* Rarr, int numR, double target){
double result=0;
double inverseSum=0;
for(int i=0; i<numR; i++){
inverseSum+=1/(double)Rarr[i];
}
result=1/inverseSum;
int compvalue
=fabs(result
-target
)<=PRECISION
; //this is a default option, epslion comparison
if (compvalue){
return result;
}
else {
return 0; //if 0->result, you can search a all combination.
}
}
int biSearchR(int combination[][10], int const* Rlist, int* selectedRarr, double* valuelist, int iter,
double target, int option, int numofRlist){
option = option > 0 ? 0 : target; //range mode
for(int p = option; p < target + 1; p++) { //if p==target, not search a range.
for (int i = 0; i < numofRlist - 1; i++) {
selectedRarr[0] = Rlist[i];
for (int j = i + 1; j < numofRlist; j++) {
selectedRarr[1] = Rlist[j];
double value = isEqual(selectedRarr, 2, p);
if (value) {
for (int q = 0; q < 2; q++)
combination[iter][q] = selectedRarr[q];
valuelist[iter] = value;
iter++;
}
}
}
}
return iter;
}
int triSearchR(int combination[][10], int const* Rlist, int* selectedRarr, double* valuelist, int
iter, double target, int option, int numofRlist){
option = option > 0 ? 0 : target; //range mode
for(int p = option; p < target + 1; p++){
for(int i=0; i<numofRlist-2; i++){
selectedRarr[0]=Rlist[i];
for(int j=i+1; j<numofRlist-1; j++){
selectedRarr[1]=Rlist[j];
for(int k=j+1; k<numofRlist; k++){
selectedRarr[2]=Rlist[k];
double value = isEqual(selectedRarr, 3, p); //p <--> target
if(value){
for(int q=0; q<3; q++)
combination[iter][q]=selectedRarr[q];
valuelist[iter]=value;
iter++;
}
}
}
}
}
return iter;
}
int quadSearchR(int combination[][10], int const* Rlist, int* selectedRarr, double* valuelist, int
iter, double target, int option, int numofRlist){
option = option > 0 ? 0 : target; //range mode
for(int p = option; p < target + 1; p++) { //if p==target, not search a range.
for (int i = 0; i < numofRlist - 3; i++) {
selectedRarr[0] = Rlist[i];
for (int j = i + 1; j < numofRlist - 2; j++) {
selectedRarr[1] = Rlist[j];
for (int k = j + 1; k < numofRlist - 1; k++) {
selectedRarr[2] = Rlist[k];
for (int l = k + 1; l < numofRlist; l++) {
selectedRarr[3] = Rlist[l];
double value= isEqual(selectedRarr, 4, p);
if (value) {
for(int q=0; q<4; q++)
combination[iter][q]=selectedRarr[q];
valuelist[iter]=value;
iter++;
}
}
}
}
}
}
return iter;
}
void printListedR(int* Rarr, int numofRlist){
if (numofRlist<10){
for(int i=0; i<numofRlist-1; i++)
} else {
for(int i=0; i<5; i++)
}
printf("%d Ω ).\n\n", Rarr
[numofRlist
-1]); }
int printCombination(int (*combination)[10], int numofcombination, double* result){
if(!numofcombination){
return 0;
}
for(int i=0; i<numofcombination; i++){
int j=0;
printf("Resistors Combination %d : ", i
+1); while (combination[i][j]){
printf("%d Ω", combination
[i
][j
]); j++;
if(!combination[i][j])
break;
}
printf(" = %.3f Ω", result
[i
]); }
return 1;
}
int printRatioCombination(int (*combination)[10], int numofcombination){
if(!numofcombination){
return 0;
}
double newRlist[100][10]={0};
int roundvalue
= pow(10, DECIMAL_PLACE
);
for(int i=0; i<numofcombination; i++){
int j=0;
while (combination[i][j]){
newRlist[i][j]=(double)combination[i][j]/combination[i][0];
j++;
}
}
for(int i=0; i<numofcombination; i++){
int j=0;
printf("Resistors' ratio %d : ", i
+1); while (newRlist[i][j]){
printf("%.2f", round
(roundvalue
*newRlist
[i
][j
])/roundvalue
); j++;
if(!newRlist[i][j])
break;
}
}
return 1;
}
int main(void) {
int numofRlist=RLIST;
int* Rlist
=(int*) malloc(sizeof(int)*numofRlist
); int selectedRarr[10]={0};
int combination[100][10]={0};
double valuelist[100]={0};
int iter=0;
double target;
int Rarr[RLIST]={820, 1000, 2200, 3300, 4700, 5600}; //resistors list, you can modify it.
assignRarr(Rlist, numofRlist, Rarr);
puts("Welcome to parallel resistor combination calculator.\n"); puts("This calculator can search combinations of resistors from : "); printListedR(Rlist, numofRlist);
puts("target value? (without unit)"); printf("\ntarget value : %.3f Ω\n", target
);
iter = biSearchR(combination, Rlist, selectedRarr, valuelist, iter, target, 0, numofRlist);
iter = triSearchR(combination, Rlist, selectedRarr, valuelist, iter, target, 0, numofRlist);
//iter = quadSearchR(combination, Rlist, selectedRarr, valuelist, iter, target, 0, numofRlist);
printCombination(combination, iter, valuelist);
//printRatioCombination(combination, iter);
return 0;
}
Ly9wYXJhbGxlbCByZXNpc3RvciBjYWxjdWxhdG9yIDogaW5wdXQgaXMgdGFyZ2V0IHZhbHVlIChmbG9hdCkKLy90aGlzIGNhbGN1bGF0b3IgY2FuIHNlYXJjaCBhIDEwMCBjb21iaW5hdGlvbiB1cCB0byAxMCBvZiBsaW5rZWQtcmVzaXN0b3JzLgovL291dHB1dCBpcyBjb21iaW5hdGlvbiAoaW50IGFycmF5KQovL3ZhcmlhdGlvbiBvZiBQUkVDSVNJT04gY2FuIG1ha2UgYSBjb21iaW5hdGlvbnMgbW9yZSB3aWRlLgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2RlZmluZSBQUkVDSVNJT04gMC41CiNkZWZpbmUgREVDSU1BTF9QTEFDRSAyIC8vcm91bmQgZGVjaW1hbCBwbGFjZQojZGVmaW5lIFJMSVNUIDYKCmludCogYXNzaWduUmFycihpbnQqIFJsaXN0LCBpbnQgbnVtb2ZSbGlzdCwgaW50IGNvbnN0KiBSYXJyKXsKICAgIGZvcihpbnQgaT0wOyBpPG51bW9mUmxpc3Q7IGkrKykKICAgICAgICBSbGlzdFtpXT1SYXJyW2ldOwoKICAgIHJldHVybiBSbGlzdDsKfQoKZG91YmxlIGlzRXF1YWwoaW50KiBSYXJyLCBpbnQgbnVtUiwgZG91YmxlIHRhcmdldCl7CgogICAgZG91YmxlIHJlc3VsdD0wOwogICAgZG91YmxlIGludmVyc2VTdW09MDsKCiAgICBmb3IoaW50IGk9MDsgaTxudW1SOyBpKyspewogICAgICAgIGludmVyc2VTdW0rPTEvKGRvdWJsZSlSYXJyW2ldOwoKICAgIH0KCiAgICByZXN1bHQ9MS9pbnZlcnNlU3VtOwogICAgaW50IGNvbXB2YWx1ZT1mYWJzKHJlc3VsdC10YXJnZXQpPD1QUkVDSVNJT047IC8vdGhpcyBpcyBhIGRlZmF1bHQgb3B0aW9uLCBlcHNsaW9uIGNvbXBhcmlzb24KCiAgICBpZiAoY29tcHZhbHVlKXsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIDA7IC8vaWYgMC0+cmVzdWx0LCB5b3UgY2FuIHNlYXJjaCBhIGFsbCBjb21iaW5hdGlvbi4KICAgIH0KfQoKaW50IGJpU2VhcmNoUihpbnQgY29tYmluYXRpb25bXVsxMF0sIGludCBjb25zdCogUmxpc3QsIGludCogc2VsZWN0ZWRSYXJyLCBkb3VibGUqIHZhbHVlbGlzdCwgaW50IGl0ZXIsCiAgICAgICAgICAgICAgZG91YmxlIHRhcmdldCwgaW50IG9wdGlvbiwgaW50IG51bW9mUmxpc3QpewogICAgb3B0aW9uID0gb3B0aW9uID4gMCA/IDAgOiB0YXJnZXQ7IC8vcmFuZ2UgbW9kZQogICAgZm9yKGludCBwID0gb3B0aW9uOyBwIDwgdGFyZ2V0ICsgMTsgcCsrKSB7IC8vaWYgcD09dGFyZ2V0LCBub3Qgc2VhcmNoIGEgcmFuZ2UuCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1vZlJsaXN0IC0gMTsgaSsrKSB7CiAgICAgICAgICAgIHNlbGVjdGVkUmFyclswXSA9IFJsaXN0W2ldOwogICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBudW1vZlJsaXN0OyBqKyspIHsKICAgICAgICAgICAgICAgIHNlbGVjdGVkUmFyclsxXSA9IFJsaXN0W2pdOwogICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlID0gaXNFcXVhbChzZWxlY3RlZFJhcnIsIDIsIHApOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcSA9IDA7IHEgPCAyOyBxKyspCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uW2l0ZXJdW3FdID0gc2VsZWN0ZWRSYXJyW3FdOwogICAgICAgICAgICAgICAgICAgIHZhbHVlbGlzdFtpdGVyXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBpdGVyOwp9CgppbnQgdHJpU2VhcmNoUihpbnQgY29tYmluYXRpb25bXVsxMF0sIGludCBjb25zdCogUmxpc3QsIGludCogc2VsZWN0ZWRSYXJyLCBkb3VibGUqIHZhbHVlbGlzdCwgaW50Cml0ZXIsIGRvdWJsZSB0YXJnZXQsIGludCBvcHRpb24sIGludCBudW1vZlJsaXN0KXsKICAgIG9wdGlvbiA9IG9wdGlvbiA+IDAgPyAwIDogdGFyZ2V0OyAvL3JhbmdlIG1vZGUKICAgIGZvcihpbnQgcCA9IG9wdGlvbjsgcCA8IHRhcmdldCArIDE7IHArKyl7CiAgICAgICAgZm9yKGludCBpPTA7IGk8bnVtb2ZSbGlzdC0yOyBpKyspewogICAgICAgICAgICBzZWxlY3RlZFJhcnJbMF09Umxpc3RbaV07CiAgICAgICAgICAgIGZvcihpbnQgaj1pKzE7IGo8bnVtb2ZSbGlzdC0xOyBqKyspewogICAgICAgICAgICAgICAgc2VsZWN0ZWRSYXJyWzFdPVJsaXN0W2pdOwogICAgICAgICAgICAgICAgZm9yKGludCBrPWorMTsgazxudW1vZlJsaXN0OyBrKyspewogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUmFyclsyXT1SbGlzdFtrXTsKICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUgPSBpc0VxdWFsKHNlbGVjdGVkUmFyciwgMywgcCk7IC8vcCA8LS0+IHRhcmdldAogICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlKXsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBxPTA7IHE8MzsgcSsrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluYXRpb25baXRlcl1bcV09c2VsZWN0ZWRSYXJyW3FdOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZWxpc3RbaXRlcl09dmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaXRlcjsKfQoKaW50IHF1YWRTZWFyY2hSKGludCBjb21iaW5hdGlvbltdWzEwXSwgaW50IGNvbnN0KiBSbGlzdCwgaW50KiBzZWxlY3RlZFJhcnIsIGRvdWJsZSogdmFsdWVsaXN0LCBpbnQKaXRlciwgZG91YmxlIHRhcmdldCwgaW50IG9wdGlvbiwgaW50IG51bW9mUmxpc3QpewogICAgb3B0aW9uID0gb3B0aW9uID4gMCA/IDAgOiB0YXJnZXQ7IC8vcmFuZ2UgbW9kZQogICAgZm9yKGludCBwID0gb3B0aW9uOyBwIDwgdGFyZ2V0ICsgMTsgcCsrKSB7IC8vaWYgcD09dGFyZ2V0LCBub3Qgc2VhcmNoIGEgcmFuZ2UuCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1vZlJsaXN0IC0gMzsgaSsrKSB7CiAgICAgICAgICAgIHNlbGVjdGVkUmFyclswXSA9IFJsaXN0W2ldOwogICAgICAgICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCBudW1vZlJsaXN0IC0gMjsgaisrKSB7CiAgICAgICAgICAgICAgICBzZWxlY3RlZFJhcnJbMV0gPSBSbGlzdFtqXTsKICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSBqICsgMTsgayA8IG51bW9mUmxpc3QgLSAxOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJhcnJbMl0gPSBSbGlzdFtrXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBsID0gayArIDE7IGwgPCBudW1vZlJsaXN0OyBsKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSYXJyWzNdID0gUmxpc3RbbF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZT0gaXNFcXVhbChzZWxlY3RlZFJhcnIsIDQsIHApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgcT0wOyBxPDQ7IHErKykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbltpdGVyXVtxXT1zZWxlY3RlZFJhcnJbcV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZWxpc3RbaXRlcl09dmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyKys7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaXRlcjsKfQoKdm9pZCBwcmludExpc3RlZFIoaW50KiBSYXJyLCBpbnQgbnVtb2ZSbGlzdCl7CiAgICBwcmludGYoIiggIik7CiAgICBpZiAobnVtb2ZSbGlzdDwxMCl7CiAgICAgICAgZm9yKGludCBpPTA7IGk8bnVtb2ZSbGlzdC0xOyBpKyspCiAgICAgICAgICAgIHByaW50ZigiJWQgzqksICIsIFJhcnJbaV0pOwogICAgfSBlbHNlIHsKICAgICAgICBmb3IoaW50IGk9MDsgaTw1OyBpKyspCiAgICAgICAgICAgIHByaW50ZigiJWQgzqksICIsIFJhcnJbaV0pOwogICAgICAgIHByaW50ZigiLi4uLCAiKTsKICAgIH0KICAgIHByaW50ZigiJWQgzqkgKS5cblxuIiwgUmFycltudW1vZlJsaXN0LTFdKTsKfQoKaW50IHByaW50Q29tYmluYXRpb24oaW50ICgqY29tYmluYXRpb24pWzEwXSwgaW50IG51bW9mY29tYmluYXRpb24sIGRvdWJsZSogcmVzdWx0KXsKICAgIGlmKCFudW1vZmNvbWJpbmF0aW9uKXsKICAgICAgICBwcmludGYoIk5vbmUiKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmb3IoaW50IGk9MDsgaTxudW1vZmNvbWJpbmF0aW9uOyBpKyspewogICAgICAgIGludCBqPTA7CgogICAgICAgIHByaW50ZigiUmVzaXN0b3JzIENvbWJpbmF0aW9uICVkIDogIiwgaSsxKTsKICAgICAgICB3aGlsZSAoY29tYmluYXRpb25baV1bal0pewogICAgICAgICAgICBwcmludGYoIiVkIM6pIiwgY29tYmluYXRpb25baV1bal0pOwogICAgICAgICAgICBqKys7CgogICAgICAgICAgICBpZighY29tYmluYXRpb25baV1bal0pCiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIHByaW50ZigiIHx8ICIpOwogICAgICAgIH0KICAgICAgICBwcmludGYoIiA9ICUuM2YgzqkiLCByZXN1bHRbaV0pOwogICAgICAgIHB1dHMoIiIpOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCmludCBwcmludFJhdGlvQ29tYmluYXRpb24oaW50ICgqY29tYmluYXRpb24pWzEwXSwgaW50IG51bW9mY29tYmluYXRpb24pewogICAgaWYoIW51bW9mY29tYmluYXRpb24pewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGRvdWJsZSBuZXdSbGlzdFsxMDBdWzEwXT17MH07CiAgICBpbnQgcm91bmR2YWx1ZT0gcG93KDEwLCBERUNJTUFMX1BMQUNFKTsKCiAgICBmb3IoaW50IGk9MDsgaTxudW1vZmNvbWJpbmF0aW9uOyBpKyspewogICAgICAgIGludCBqPTA7CiAgICAgICAgd2hpbGUgKGNvbWJpbmF0aW9uW2ldW2pdKXsKICAgICAgICAgICAgbmV3Umxpc3RbaV1bal09KGRvdWJsZSljb21iaW5hdGlvbltpXVtqXS9jb21iaW5hdGlvbltpXVswXTsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoaW50IGk9MDsgaTxudW1vZmNvbWJpbmF0aW9uOyBpKyspewogICAgICAgIGludCBqPTA7CgogICAgICAgIHByaW50ZigiUmVzaXN0b3JzJyByYXRpbyAlZCA6ICIsIGkrMSk7CiAgICAgICAgd2hpbGUgKG5ld1JsaXN0W2ldW2pdKXsKICAgICAgICAgICAgcHJpbnRmKCIlLjJmIiwgcm91bmQocm91bmR2YWx1ZSpuZXdSbGlzdFtpXVtqXSkvcm91bmR2YWx1ZSk7CiAgICAgICAgICAgIGorKzsKCiAgICAgICAgICAgIGlmKCFuZXdSbGlzdFtpXVtqXSkKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgcHJpbnRmKCIgfHwgIik7CiAgICAgICAgfQogICAgICAgIHB1dHMoIiIpOwogICAgfQoKICAgIHJldHVybiAxOwp9CgppbnQgbWFpbih2b2lkKSB7CiAgICBpbnQgbnVtb2ZSbGlzdD1STElTVDsKICAgIGludCogUmxpc3Q9KGludCopIG1hbGxvYyhzaXplb2YoaW50KSpudW1vZlJsaXN0KTsKICAgIGludCBzZWxlY3RlZFJhcnJbMTBdPXswfTsKICAgIGludCBjb21iaW5hdGlvblsxMDBdWzEwXT17MH07CiAgICBkb3VibGUgdmFsdWVsaXN0WzEwMF09ezB9OwogICAgaW50IGl0ZXI9MDsKICAgIGRvdWJsZSB0YXJnZXQ7CgogICAgaW50IFJhcnJbUkxJU1RdPXs4MjAsIDEwMDAsIDIyMDAsIDMzMDAsIDQ3MDAsIDU2MDB9OyAvL3Jlc2lzdG9ycyBsaXN0LCB5b3UgY2FuIG1vZGlmeSBpdC4KICAgIGFzc2lnblJhcnIoUmxpc3QsIG51bW9mUmxpc3QsIFJhcnIpOwoKICAgIHB1dHMoIldlbGNvbWUgdG8gcGFyYWxsZWwgcmVzaXN0b3IgY29tYmluYXRpb24gY2FsY3VsYXRvci5cbiIpOwogICAgcHV0cygiVGhpcyBjYWxjdWxhdG9yIGNhbiBzZWFyY2ggY29tYmluYXRpb25zIG9mIHJlc2lzdG9ycyBmcm9tIDogIik7CiAgICBwcmludExpc3RlZFIoUmxpc3QsIG51bW9mUmxpc3QpOwogICAgcHV0cygidGFyZ2V0IHZhbHVlPyAod2l0aG91dCB1bml0KSIpOwogICAgc2NhbmYoIiVsZiIsICZ0YXJnZXQpOwogICAgcHJpbnRmKCJcbnRhcmdldCB2YWx1ZSA6ICUuM2YgzqlcbiIsIHRhcmdldCk7CgoKICAgIGl0ZXIgPSBiaVNlYXJjaFIoY29tYmluYXRpb24sIFJsaXN0LCBzZWxlY3RlZFJhcnIsIHZhbHVlbGlzdCwgaXRlciwgdGFyZ2V0LCAwLCBudW1vZlJsaXN0KTsKICAgIGl0ZXIgPSB0cmlTZWFyY2hSKGNvbWJpbmF0aW9uLCBSbGlzdCwgc2VsZWN0ZWRSYXJyLCB2YWx1ZWxpc3QsIGl0ZXIsIHRhcmdldCwgMCwgbnVtb2ZSbGlzdCk7CiAgICAvL2l0ZXIgPSBxdWFkU2VhcmNoUihjb21iaW5hdGlvbiwgUmxpc3QsIHNlbGVjdGVkUmFyciwgdmFsdWVsaXN0LCBpdGVyLCB0YXJnZXQsIDAsIG51bW9mUmxpc3QpOwoKICAgIHByaW50Q29tYmluYXRpb24oY29tYmluYXRpb24sIGl0ZXIsIHZhbHVlbGlzdCk7CiAgICAvL3ByaW50UmF0aW9Db21iaW5hdGlvbihjb21iaW5hdGlvbiwgaXRlcik7CgogICAgZnJlZShSbGlzdCk7CiAgICByZXR1cm4gMDsKfQo=