// Errichto - med
#include<bits/stdc++.h>
using namespace std;
#define FOR(i,a,n) for(int i = (a); i <= (n); ++i)
#define FORD(i,a,n) for(int i = (a); i >= (n); --i)
#define REP(i,n) FOR(i,0,(n)-1)
#define RI(i,n) FOR(i,1,(n))
#define pb push_back
#define mp make_pair
#define st first
#define nd second
#define mini(a,b) a=min(a,(b))
#define maxi(a,b) a=max(a,(b))
#define sz(w) (int)w.size()
typedef vector<int> vi;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int inf = 1e9 + 5;
const int nax = 305;
// from UW2015's library
namespace MinCost{ // 0 .. n
struct Edge{
int w,c,v,rev;
Edge(int _w, int _c, int _v, int _rev) :
w(_w), c(_c), v(_v), rev(_rev)
{}
};
int odl[nax], pot[nax], pop[nax], pop_kraw[nax];
int q[nax], qbeg, qend;
vector<Edge> v[nax];
bool bylo[nax];
queue<int> kolej;
void init(int n) {
FOR(i,0,n) v[i].clear();
}
void AddEdge(int a, int b, int cap, int cost) {
v[a].pb(Edge(b,cap,cost,int(v[b].size()) + (a == b)));
v[b].pb(Edge(a,0,-cost,int(v[a].size()-1)));
}
pair<int,int> MinCostMaxFlow(int s, int t, int n) {
int flow = 0, cost = 0;
while (true) {
FOR(i,0,n) {
odl[i] = inf;
bylo[i] = false;
}
bylo[s] = true;
odl[s] = 0;
kolej.push(s);
//djikstra, mozna napisac na kolejce
while(!kolej.empty()) {
int x = kolej.front();
kolej.pop();
bylo[x] = false;
int dl = v[x].size();
REP(i,dl) if (v[x][i].c > 0 &&
odl[v[x][i].w] >
odl[x] + pot[x] - pot[v[x][i].w] + v[x][i].v) {
odl[v[x][i].w] =
odl[x] + pot[x] - pot[v[x][i].w] + v[x][i].v;
if (!bylo[v[x][i].w]) {
kolej.push(v[x][i].w);
bylo[v[x][i].w] = true;
}
pop[v[x][i].w] = x; pop_kraw[v[x][i].w] = i;
}
}
if (odl[t] == inf)
break;
int x = t;
int cap = inf;
while (x != s) {
cap = min(cap, v[pop[x]][pop_kraw[x]].c);
x = pop[x];
}
flow += cap;
x = t;
while (x != s) {
cost += v[pop[x]][pop_kraw[x]].v*cap;
v[pop[x]][pop_kraw[x]].c -= cap;
v[x][v[pop[x]][pop_kraw[x]].rev].c += cap;
x = pop[x];
}
}
return mp(flow, cost);
}
};
bool isLucky(int a) { return a==44||a==47||a==74||a==77||a==444||a==447; }
int row4[nax], col4[nax], row7[nax], col7[nax];
int solve11(vector<string> grid) {
int n = sz(grid); assert(n == 11);
// only 4s
bool ok = true;
REP(i, n) if(row7[i] > 1 || col7[i] > 1) ok = false;
if(ok) {
int a = 0;
REP(i, n) a += row7[i];
// printf("only fours = %d\n", a);
return n*n*4+a*3;
}
int alot = 4, mi = 7;
int RES = inf;
REP(_, 2) {
swap(alot, mi);
REP(X, 12) REP(Y, 12) {
REP(xx, 12) REP(yy, 12) if(xx != X && yy != Y) REP(kind, 2) {
// kind == 0 - holes in lines
// kind == 1 - extra cell
bool ok = true;
int cnt7 = 0;
REP(y, n) REP(x, n) {
int good = alot;
if(x == X && y != yy) good = mi;
if(y == Y && x != xx) good = mi;
if(kind) if(x == xx && y == yy) good = mi;
if(grid[y][x] != '.' && grid[y][x] != '0' + good)
ok = false;
if(good == 7) cnt7++;
}
if(ok) mini(RES, cnt7);
}
}
}
ok = true;
REP(i, n) if(row4[i] > 1 || col4[i] > 1) ok = false;
if(ok) {
REP(y, n) if(row4[y] == 0)
REP(x, n) if(col4[x] == 0)
if(grid[y][x] == '.')
MinCost :: AddEdge(x+1, n+y+1, 1, 0);
REP(x, n) MinCost :: AddEdge(0, x+1, 1, 0);
REP(y, n) MinCost :: AddEdge(n+y+1, 2*n+1, 1, 0);
int match = MinCost :: MinCostMaxFlow(0, 2*n+1, 2*n+1).st;
// printf("match = %d\n", match);
REP(i, n) match += row4[i];
mini(RES, n * n - match);
}
if(RES == inf) return -1;
return n*n*4 + RES * 3;
}
class LuckyGrid {
public : int findMinimumSum(vector<string> grid) {
int n = sz(grid);
if(n == 1) {
if(grid[0][0] == '7') return 7;
return 4;
}
int goal = -1;
FOR(x, 0, n) if(isLucky(x * 4 + (n-x) * 7)) {
goal = x;
break;
}
if(goal == -1) return -1;
assert(isLucky((goal+1)*4 + (n-(goal+1))*7));
assert(goal+1 <= n);
// goal or goal+1 or n=11
REP(y, n) REP(x, n) {
if(grid[y][x] == '4') {
row4[y]++;
col4[x]++;
}
else if(grid[y][x] == '7') {
row7[y]++;
col7[x]++;
}
}
if(n == 11) return solve11(grid);
REP(y, n) REP(x, n)
if(grid[y][x] == '.')
MinCost :: AddEdge(x+1, n+y+1, 1, 1);
const int C = 100 * 1000;
int wanted = 0;
REP(x, n) {
if(col4[x] > goal+1) return -1;
if(col4[x] == goal+1) {}
else {
wanted += goal - col4[x];
MinCost :: AddEdge(0, x+1, goal-col4[x], 0);
MinCost :: AddEdge(0, x+1, 1, C);
}
}
REP(y, n) {
if(row4[y] > goal+1) return -1;
if(row4[y] == goal+1) {}
else {
wanted += goal - row4[y];
MinCost :: AddEdge(n+1+y, 2*n+1, goal-row4[y], 0);
MinCost :: AddEdge(n+1+y, 2*n+1, 1, C);
}
}
pair<int,int> flow = MinCost :: MinCostMaxFlow(0, 2*n+1, 2*n+1);
// printf("%d\n", wanted); // 18
// printf("%d %d\n", flow.st, flow.nd); // 25 1400025
if(flow.nd/C + wanted != 2*flow.st) return -1;
int fours = flow.st;
REP(x, n) fours += col4[x];
return fours * 4 + (n * n - fours) * 7;
}
};
int main(int argc, char * argv[]) {
LuckyGrid a;
vector<string> in = {"774777..", "..4.....", "..7774..", "..7..7..", "..7..7..", "..7..74.", "..4..4..", "........"};
vector<string> in11 = {".4......7..", "...........", ".....7.....", "...........", ".7......7..", "...........", ".....4.....", "...........", "........4..", "...........", "..........."};
vector<string> in3 = {"77744477", "44747777", "74747477", "47747477", "........", "........", "........", "........"};
printf("%d\n", a.findMinimumSum(in));
return 0;
}
Ly8gRXJyaWNodG8gLSBtZWQKI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBGT1IoaSxhLG4pIGZvcihpbnQgaSA9IChhKTsgaSA8PSAobik7ICsraSkKI2RlZmluZSBGT1JEKGksYSxuKSBmb3IoaW50IGkgPSAoYSk7IGkgPj0gKG4pOyAtLWkpCiNkZWZpbmUgUkVQKGksbikgRk9SKGksMCwobiktMSkKI2RlZmluZSBSSShpLG4pIEZPUihpLDEsKG4pKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIHN0IGZpcnN0CiNkZWZpbmUgbmQgc2Vjb25kCiNkZWZpbmUgbWluaShhLGIpIGE9bWluKGEsKGIpKQojZGVmaW5lIG1heGkoYSxiKSBhPW1heChhLChiKSkKI2RlZmluZSBzeih3KSAoaW50KXcuc2l6ZSgpCnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp0eXBlZGVmIHBhaXI8aW50LGludD4gcGlpOwpjb25zdCBpbnQgaW5mID0gMWU5ICsgNTsKY29uc3QgaW50IG5heCA9IDMwNTsKCi8vIGZyb20gVVcyMDE1J3MgbGlicmFyeQpuYW1lc3BhY2UgTWluQ29zdHsgLy8gMCAuLiBuCiAgc3RydWN0IEVkZ2V7CiAgICBpbnQgdyxjLHYscmV2OwogICAgRWRnZShpbnQgX3csIGludCBfYywgaW50IF92LCBpbnQgX3JldikgOgogICAgICB3KF93KSwgYyhfYyksIHYoX3YpLCByZXYoX3JldikKICAgIHt9CiAgfTsKICAKICBpbnQgb2RsW25heF0sIHBvdFtuYXhdLCBwb3BbbmF4XSwgcG9wX2tyYXdbbmF4XTsKICBpbnQgcVtuYXhdLCBxYmVnLCBxZW5kOwogIHZlY3RvcjxFZGdlPiB2W25heF07CiAgYm9vbCBieWxvW25heF07CiAgcXVldWU8aW50PiBrb2xlajsKICAKICB2b2lkIGluaXQoaW50IG4pIHsKICAgIEZPUihpLDAsbikgdltpXS5jbGVhcigpOwogIH0KICAKICB2b2lkIEFkZEVkZ2UoaW50IGEsIGludCBiLCBpbnQgY2FwLCBpbnQgY29zdCkgewogICAgdlthXS5wYihFZGdlKGIsY2FwLGNvc3QsaW50KHZbYl0uc2l6ZSgpKSArIChhID09IGIpKSk7CiAgICB2W2JdLnBiKEVkZ2UoYSwwLC1jb3N0LGludCh2W2FdLnNpemUoKS0xKSkpOwogIH0KICAKICBwYWlyPGludCxpbnQ+IE1pbkNvc3RNYXhGbG93KGludCBzLCBpbnQgdCwgaW50IG4pIHsKICAgIGludCBmbG93ID0gMCwgY29zdCA9IDA7CiAgICAKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIEZPUihpLDAsbikgewogICAgICAgIG9kbFtpXSA9IGluZjsKICAgICAgICBieWxvW2ldID0gZmFsc2U7CiAgICAgIH0KICAgICAgYnlsb1tzXSA9IHRydWU7CiAgICAgIG9kbFtzXSA9IDA7CiAgICAgIGtvbGVqLnB1c2gocyk7CiAgICAgIAogICAgICAvL2RqaWtzdHJhLCBtb3puYSBuYXBpc2FjIG5hIGtvbGVqY2UKICAgICAgd2hpbGUoIWtvbGVqLmVtcHR5KCkpIHsKICAgICAgICBpbnQgeCA9IGtvbGVqLmZyb250KCk7CiAgICAgICAga29sZWoucG9wKCk7CiAgICAgICAgYnlsb1t4XSA9IGZhbHNlOwogICAgICAgIGludCBkbCA9IHZbeF0uc2l6ZSgpOwogICAgICAgIFJFUChpLGRsKSBpZiAodlt4XVtpXS5jID4gMCAmJiAKICAgICAgICAgIG9kbFt2W3hdW2ldLnddID4gCiAgICAgICAgICAgIG9kbFt4XSArIHBvdFt4XSAtIHBvdFt2W3hdW2ldLnddICsgdlt4XVtpXS52KSB7CiAgICAgICAgICBvZGxbdlt4XVtpXS53XSA9IAogICAgICAgICAgICBvZGxbeF0gKyBwb3RbeF0gLSBwb3Rbdlt4XVtpXS53XSArIHZbeF1baV0udjsKICAgICAgICAgIGlmICghYnlsb1t2W3hdW2ldLnddKSB7CiAgICAgICAgICAgIGtvbGVqLnB1c2godlt4XVtpXS53KTsKICAgICAgICAgICAgYnlsb1t2W3hdW2ldLnddID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHBvcFt2W3hdW2ldLnddID0geDsgcG9wX2tyYXdbdlt4XVtpXS53XSA9IGk7IAogICAgICAgIH0gCiAgICAgIH0KICAgICAgCiAgICAgIGlmIChvZGxbdF0gPT0gaW5mKQogICAgICAgIGJyZWFrOwogICAgICAKICAgICAgaW50IHggPSB0OwogICAgICBpbnQgY2FwID0gaW5mOwogICAgICB3aGlsZSAoeCAhPSBzKSB7CiAgICAgICAgY2FwID0gbWluKGNhcCwgdltwb3BbeF1dW3BvcF9rcmF3W3hdXS5jKTsKICAgICAgICB4ID0gcG9wW3hdOwogICAgICB9CiAgICAgIAogICAgICBmbG93ICs9IGNhcDsKICAgICAgeCA9IHQ7CiAgICAgIHdoaWxlICh4ICE9IHMpIHsKICAgICAgICBjb3N0ICs9IHZbcG9wW3hdXVtwb3Bfa3Jhd1t4XV0udipjYXA7CiAgICAgICAgdltwb3BbeF1dW3BvcF9rcmF3W3hdXS5jIC09IGNhcDsKICAgICAgICB2W3hdW3ZbcG9wW3hdXVtwb3Bfa3Jhd1t4XV0ucmV2XS5jICs9IGNhcDsKICAgICAgICB4ID0gcG9wW3hdOwogICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiBtcChmbG93LCBjb3N0KTsKICB9Cn07Cgpib29sIGlzTHVja3koaW50IGEpIHsgcmV0dXJuIGE9PTQ0fHxhPT00N3x8YT09NzR8fGE9PTc3fHxhPT00NDR8fGE9PTQ0NzsgfQoKaW50IHJvdzRbbmF4XSwgY29sNFtuYXhdLCByb3c3W25heF0sIGNvbDdbbmF4XTsKCmludCBzb2x2ZTExKHZlY3RvcjxzdHJpbmc+IGdyaWQpIHsKCWludCBuID0gc3ooZ3JpZCk7IGFzc2VydChuID09IDExKTsKCS8vIG9ubHkgNHMKCWJvb2wgb2sgPSB0cnVlOwoJUkVQKGksIG4pIGlmKHJvdzdbaV0gPiAxIHx8IGNvbDdbaV0gPiAxKSBvayA9IGZhbHNlOwoJaWYob2spIHsKCQlpbnQgYSA9IDA7CgkJUkVQKGksIG4pIGEgKz0gcm93N1tpXTsKCQkvLyBwcmludGYoIm9ubHkgZm91cnMgPSAlZFxuIiwgYSk7CgkJcmV0dXJuIG4qbio0K2EqMzsKCX0KCWludCBhbG90ID0gNCwgbWkgPSA3OwoJaW50IFJFUyA9IGluZjsKCVJFUChfLCAyKSB7CgkJc3dhcChhbG90LCBtaSk7CgkJUkVQKFgsIDEyKSBSRVAoWSwgMTIpIHsKCQkJUkVQKHh4LCAxMikgUkVQKHl5LCAxMikgaWYoeHggIT0gWCAmJiB5eSAhPSBZKSBSRVAoa2luZCwgMikgewoJCQkJLy8ga2luZCA9PSAwIC0gaG9sZXMgaW4gbGluZXMKCQkJCS8vIGtpbmQgPT0gMSAtIGV4dHJhIGNlbGwKCQkJCWJvb2wgb2sgPSB0cnVlOwoJCQkJaW50IGNudDcgPSAwOwoJCQkJUkVQKHksIG4pIFJFUCh4LCBuKSB7CgkJCQkJaW50IGdvb2QgPSBhbG90OwoJCQkJCWlmKHggPT0gWCAmJiB5ICE9IHl5KSBnb29kID0gbWk7CgkJCQkJaWYoeSA9PSBZICYmIHggIT0geHgpIGdvb2QgPSBtaTsKCQkJCQlpZihraW5kKSBpZih4ID09IHh4ICYmIHkgPT0geXkpIGdvb2QgPSBtaTsKCQkJCQlpZihncmlkW3ldW3hdICE9ICcuJyAmJiBncmlkW3ldW3hdICE9ICcwJyArIGdvb2QpCgkJCQkJCW9rID0gZmFsc2U7CgkJCQkJaWYoZ29vZCA9PSA3KSBjbnQ3Kys7CgkJCQl9CgkJCQlpZihvaykgbWluaShSRVMsIGNudDcpOwoJCQl9CgkJfQoJfQoJb2sgPSB0cnVlOwoJUkVQKGksIG4pIGlmKHJvdzRbaV0gPiAxIHx8IGNvbDRbaV0gPiAxKSBvayA9IGZhbHNlOwoJaWYob2spIHsKCQlSRVAoeSwgbikgaWYocm93NFt5XSA9PSAwKQoJCQlSRVAoeCwgbikgaWYoY29sNFt4XSA9PSAwKQoJCQkJaWYoZ3JpZFt5XVt4XSA9PSAnLicpCgkJCQkJTWluQ29zdCA6OiBBZGRFZGdlKHgrMSwgbit5KzEsIDEsIDApOwoJCVJFUCh4LCBuKSBNaW5Db3N0IDo6IEFkZEVkZ2UoMCwgeCsxLCAxLCAwKTsKCQlSRVAoeSwgbikgTWluQ29zdCA6OiBBZGRFZGdlKG4reSsxLCAyKm4rMSwgMSwgMCk7CgkJaW50IG1hdGNoID0gTWluQ29zdCA6OiBNaW5Db3N0TWF4RmxvdygwLCAyKm4rMSwgMipuKzEpLnN0OwoJCS8vIHByaW50ZigibWF0Y2ggPSAlZFxuIiwgbWF0Y2gpOwoJCVJFUChpLCBuKSBtYXRjaCArPSByb3c0W2ldOwoJCW1pbmkoUkVTLCBuICogbiAtIG1hdGNoKTsKCX0KCWlmKFJFUyA9PSBpbmYpIHJldHVybiAtMTsKCXJldHVybiBuKm4qNCArIFJFUyAqIDM7Cn0KCmNsYXNzIEx1Y2t5R3JpZCB7CglwdWJsaWMgOiBpbnQgZmluZE1pbmltdW1TdW0odmVjdG9yPHN0cmluZz4gZ3JpZCkgewoJCWludCBuID0gc3ooZ3JpZCk7CgkJaWYobiA9PSAxKSB7CgkJCWlmKGdyaWRbMF1bMF0gPT0gJzcnKSByZXR1cm4gNzsKCQkJcmV0dXJuIDQ7CgkJfQoJCWludCBnb2FsID0gLTE7CgkJRk9SKHgsIDAsIG4pIGlmKGlzTHVja3koeCAqIDQgKyAobi14KSAqIDcpKSB7CgkJCWdvYWwgPSB4OwoJCQlicmVhazsKCQl9CgkJaWYoZ29hbCA9PSAtMSkgcmV0dXJuIC0xOwoJCWFzc2VydChpc0x1Y2t5KChnb2FsKzEpKjQgKyAobi0oZ29hbCsxKSkqNykpOwoJCWFzc2VydChnb2FsKzEgPD0gbik7CgkJLy8gZ29hbCBvciBnb2FsKzEgb3Igbj0xMQoJCVJFUCh5LCBuKSBSRVAoeCwgbikgewoJCQlpZihncmlkW3ldW3hdID09ICc0JykgewoJCQkJcm93NFt5XSsrOwoJCQkJY29sNFt4XSsrOwoJCQl9CgkJCWVsc2UgaWYoZ3JpZFt5XVt4XSA9PSAnNycpIHsKCQkJCXJvdzdbeV0rKzsKCQkJCWNvbDdbeF0rKzsKCQkJfQoJCX0KCQlpZihuID09IDExKSByZXR1cm4gc29sdmUxMShncmlkKTsKCQlSRVAoeSwgbikgUkVQKHgsIG4pCgkJCWlmKGdyaWRbeV1beF0gPT0gJy4nKQoJCQkJTWluQ29zdCA6OiBBZGRFZGdlKHgrMSwgbit5KzEsIDEsIDEpOwoJCWNvbnN0IGludCBDID0gMTAwICogMTAwMDsKCQlpbnQgd2FudGVkID0gMDsKCQlSRVAoeCwgbikgewoJCQlpZihjb2w0W3hdID4gZ29hbCsxKSByZXR1cm4gLTE7CgkJCWlmKGNvbDRbeF0gPT0gZ29hbCsxKSB7fQoJCQllbHNlIHsKCQkJCXdhbnRlZCArPSBnb2FsIC0gY29sNFt4XTsKCQkJCU1pbkNvc3QgOjogQWRkRWRnZSgwLCB4KzEsIGdvYWwtY29sNFt4XSwgMCk7CgkJCQlNaW5Db3N0IDo6IEFkZEVkZ2UoMCwgeCsxLCAxLCBDKTsKCQkJfQoJCQkKCQl9CgkJUkVQKHksIG4pIHsKCQkJaWYocm93NFt5XSA+IGdvYWwrMSkgcmV0dXJuIC0xOwoJCQlpZihyb3c0W3ldID09IGdvYWwrMSkge30KCQkJZWxzZSB7CgkJCQl3YW50ZWQgKz0gZ29hbCAtIHJvdzRbeV07CgkJCQlNaW5Db3N0IDo6IEFkZEVkZ2UobisxK3ksIDIqbisxLCBnb2FsLXJvdzRbeV0sIDApOwoJCQkJTWluQ29zdCA6OiBBZGRFZGdlKG4rMSt5LCAyKm4rMSwgMSwgQyk7CgkJCX0KCQl9CgkJcGFpcjxpbnQsaW50PiBmbG93ID0gTWluQ29zdCA6OiBNaW5Db3N0TWF4RmxvdygwLCAyKm4rMSwgMipuKzEpOwoJCS8vIHByaW50ZigiJWRcbiIsIHdhbnRlZCk7IC8vIDE4CgkJLy8gcHJpbnRmKCIlZCAlZFxuIiwgZmxvdy5zdCwgZmxvdy5uZCk7IC8vIDI1IDE0MDAwMjUKCQlpZihmbG93Lm5kL0MgKyB3YW50ZWQgIT0gMipmbG93LnN0KSByZXR1cm4gLTE7CgkJaW50IGZvdXJzID0gZmxvdy5zdDsKCQlSRVAoeCwgbikgZm91cnMgKz0gY29sNFt4XTsKCQlyZXR1cm4gZm91cnMgKiA0ICsgKG4gKiBuIC0gZm91cnMpICogNzsKCX0KfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKSB7CglMdWNreUdyaWQgYTsKCXZlY3RvcjxzdHJpbmc+IGluID0geyI3NzQ3NzcuLiIsICIuLjQuLi4uLiIsICIuLjc3NzQuLiIsICIuLjcuLjcuLiIsICIuLjcuLjcuLiIsICIuLjcuLjc0LiIsICIuLjQuLjQuLiIsICIuLi4uLi4uLiJ9OwoJdmVjdG9yPHN0cmluZz4gaW4xMSA9IHsiLjQuLi4uLi43Li4iLCAiLi4uLi4uLi4uLi4iLCAiLi4uLi43Li4uLi4iLCAiLi4uLi4uLi4uLi4iLCAiLjcuLi4uLi43Li4iLCAiLi4uLi4uLi4uLi4iLCAiLi4uLi40Li4uLi4iLCAiLi4uLi4uLi4uLi4iLCAiLi4uLi4uLi40Li4iLCAiLi4uLi4uLi4uLi4iLCAiLi4uLi4uLi4uLi4ifTsKCXZlY3RvcjxzdHJpbmc+IGluMyA9IHsiNzc3NDQ0NzciLCAiNDQ3NDc3NzciLCAiNzQ3NDc0NzciLCAiNDc3NDc0NzciLCAiLi4uLi4uLi4iLCAiLi4uLi4uLi4iLCAiLi4uLi4uLi4iLCAiLi4uLi4uLi4ifTsKCXByaW50ZigiJWRcbiIsIGEuZmluZE1pbmltdW1TdW0oaW4pKTsKCXJldHVybiAwOwp9Cg==