#include <string>
#include <vector>
#include <algorithm>
#include <numeric>
#include <set>
#include <map>
#include <queue>
#include<stack>
#include<bitset>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <cctype>
#include <cassert>
#include <limits>
#include <functional>
#include<unordered_map>
#define rep(i,n) for(int (i)=0;(i)<(int)(n);++(i))
#define reu(i,l,u) for(int (i)=(int)(l);(i)<(int)(u);++(i))
#define aut(r,v) for(auto r:v)
#define each(it,o) for(aut(it, (o).begin()); it != (o).end(); ++ it)
#define all(o) (o).begin(), (o).end()
#define pb(x) push_back(x)
#define pc() pop_back()
#define ull unsigned long long
#define mp(x,y) make_pair((x),(y))
#define mset(m,v) memset(m,v,sizeof(m))
#define INF 0x3f3f3f3f
#define INFL 0x3f3f3f3f3f3f3f3fLL
using namespace std;
#define endl '\n'
#define st stack<int>
#define vl vector<long long>
#define vi vector<int>
#define vb vector<bool>
#define vc vector<char>
#define pii pair<int,int>
#define vpii vector<pii>
#define vvi vector<vi>
#define vs vector<string>
#define mod 1000000007
#define un unordered_map<int,int>
#define mii map<int,int>
#define Sort(a) sort(all(a))
#define ED(a) Sort(a), a.erase(unique(all(a)), a.end())//removing all duplicates
#define max3(a, b, c) max(a, max(b, c))
#define min3(a, b, c) min(a, min(b, c))
#define Max(a) *max_element(all(a))
#define Min(a) *min_element(all(a))
#define MaxP(a) max_element(all(a)) - a.begin()
#define MinP(a) min_element(all(a)) - a.begin()
#define allUpper(a) transform(all(a), a.begin(), :: toupper)
#define allLower(a) transform(all(a), a.begin(), :: tolower)
#define rev(a) reverse(all(a))
#define ub(v,k) upper_bound(all(v), k) - v.begin()
#define lb(v,k) lower_bound(all(v), k) - v.begin()
#define adv(a,n) advance(auto it:a,n)
#define RSort(a) sort(a.rbegin(),a.rend()) //decending order
#define cnt(v,a) count(all(v),a)
#define bs(v,a) binary_search(all(v),a)
#define mmax(v) *max_element(all(v))
#define mmin(v) *min_element(all(v))
#define popcount(mask) __builtin_popcount(mask) // count set bit
#define popcountLL(mask) __builtin_popcountll(mask) // for long long
#define X real() // useful for working with #include <complex> for computational geometry
#define Y imag()
#define ll long long
#define ss second
#define ff first
#define trace1(x) cerr << #x << ": " << x << endl;
#define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl;
#define trace3(x, y, z) cerr << #x << ": " << x << " | " << #y << ": " << y << " | " << #z << ": " << z << endl;
#define trace4(a, b, c, d) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << endl;
#define trace5(a, b, c, d, e) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << endl;
#define trace6(a, b, c, d, e, f) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << " | " << #f << ": " << f << endl;
template <typename T> T gcd(T a, T b) { while (b) b ^= a ^= b ^= a %= b; return a; }
template <typename T> T setbit(T mask, T pos) { return mask |= (1 << pos); }
template <typename T> T resetbit(T mask, T pos) { return mask &= ~(1 << pos); }
template <typename T> T togglebit(T mask, T pos) { return mask ^= (1 << pos); }
template <typename T> T checkbit(T mask, T pos) { return (bool)(mask & (1 << pos)); }
template <typename T> T lcm(T a, T b) { return (a / gcd(a, b)) * b; }
template <typename T> T modu(T a, T b) { return (a < b ? a : a % b); }
template<typename T> T mod_neg(T a, T b) { a = mod(a, b); if (a < 0) { a += b; } return a; }
template <typename T>T expo(T e, T n) { T x = 1, p = e; while (n) { if (n & 1)x = x * p; p = p * p; n >>= 1; } return x; }
template<typename T> T mod_inverse(T a, T n) { T x, y; T d = extended_euclid(a, n, x, y); return (d > 1 ? -1 : mod_neg(x, n)); }
template <typename T>T power(T e, T n, T m) { T x = 1, p = e; while (n) { if (n & 1)x = mod(x * p, m); p = mod(p * p, m); n >>= 1; } return x; }
template <typename T>T powerL(T e, T n, T m) { T x = 1, p = e; while (n) { if (n & 1)x = mulmod(x, p, m); p = mulmod(p, p, m); n >>= 1; } return x; }
bool Pow2(int n) {
return n && (!(n & (n - 1)));
}
void printc(vc& result) {
aut(r, result) cout << r << " ";
cout << endl;
}
void printl(vl& result) {
aut(r, result) cout << r << " ";
cout << endl;
}
void print(vi& result) {
aut(r, result) cout << r << " ";
cout << endl;
}
// Recursively computes the power
int binpow(int a, int b)
{
if (b == 0)
return a;
int res = binpow(a, b / 2);
if (b % 2)
return res * res * a;
else
return res * res;
}
// iteratively computes the power
ll pow(ll a, ll b)
{
ll res = 1;
while (b)
{
if (b & 1)
res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
int modpow(int a, int b, int m)
{
int ans = 1;
while (b)
{
if (b & 1)
ans = (ans * a) % m;
b /= 2;
a = (a * a) % m;
}
return ans;
}
ll ncr(ll n, ll k)
{
ll res = 1;
// Since C(n, k) = C(n, n-k)
if (k > n - k)
k = n - k;
// Calculate value of
// [n * (n-1) *---* (n-k+1)] / [k * (k-1) *----* 1]
for (ll i = 0; i < k; ++i) {
res *= (n - i);
res /= (i + 1);
}
return res;
}
//ifstream cin("b_read_on.txt"); ofstream cout("output3.txt");
//Use (<<) for multiplication
//Use (>>) for division
//ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);cout<<fixed;cerr.tie(NULL);
// find_by_order -> value at index
// order_of_key -> index of value
// while using (1<<i) use ((ll)1<<(ll)i)
// in Floyd-Warshall Algo, k is outer loop
// If an element was not initially in map and if asked mp[a],the element gets inserted
// a%=mod take a lot of time... try to use it minimum and use memset as it reduces a lot of time usage...use if(a>=mod) a%=mod
//cout<<(double) can be harmful , always use printf(%.9llf)...take scanf("%lf",&p[i][j]) as input , not llf;
//use s.erase(it++) for erasing iterator and then moving to the next one
//never use adj.resize(n) as value is persistent, always erase
//use __builtin_popcountll() for ll
// no of prime numbers in range : (70,19) , (1000,168) , (100000,1229) , (sqrt(10^9),3409) ;
//always check the use of segment tree using bottom-up dp
int dx[] = { 0, 0, 1, -1 };
int dy[] = { 1, -1, 0, 0 }; // 4 Direction
/* int dx[] = {1,-1,0,0,1,1,-1,-1} , dy[] = {0,0,1,-1,1,-1,1,-1}; */ // 8 Direction
/* int dx[] = {1,-1,1,-1,2,2,-2,-2} , dy[] = {2,2,-2,-2,1,-1,1,-1}; */ // Knight Direction
/* int dx[] = {2,-2,1,1,-1,-1} , dy[] = {0,0,1,-1,1,-1}; */ // Hexagonal Direction
vb vis(1001);
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int test;
test = 1;
// cin >> test;
while (test--) {
int n;
cin >> n;
vi v(n);
rep(i, n) cin >> v[i];
RSort(v);
vpii vp;
rep(i, n - 1) {
vp.push_back({ v[i] - v[i + 1] - 2 ,v[i] - v[i + 1] + 2 });
}
int maxi = max(vp[0].ff, vp[0].ss);
int mini = min(vp[0].ss, vp[0].ff);
int flag = 0;
for (int i = 0; i < vp.size(); i++) {
int m = max(vp[i].ff, vp[i].ss);
int l = min(vp[i].ff, vp[i].ss);
if (l > maxi || m < mini) {
flag = 1;
break;
}
else maxi = min(maxi, m);
mini = max(mini, l);
}
trace2(maxi, mini);
if (flag == 1) cout << -1 << endl;
else {
int count = 0;
unordered_map<int, int> mp;
for (int i = 0; i < n - 1; i++) {
if (v[i] - v[i + 1] <= maxi && v[i] - v[i + 1] >= mini) mp[v[i] - v[i + 1]]++;
else count++;
}
if (mp.size() >= 2) count += mp.size() - 1;
cout << count << endl;
}
}
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPG51bWVyaWM+CiNpbmNsdWRlIDxzZXQ+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxxdWV1ZT4KCiNpbmNsdWRlPHN0YWNrPgojaW5jbHVkZTxiaXRzZXQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxjc3RkaW8+CiNpbmNsdWRlIDxjbWF0aD4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPGNjdHlwZT4KI2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxsaW1pdHM+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgojaW5jbHVkZTx1bm9yZGVyZWRfbWFwPgoKI2RlZmluZSByZXAoaSxuKSBmb3IoaW50IChpKT0wOyhpKTwoaW50KShuKTsrKyhpKSkKCiNkZWZpbmUgcmV1KGksbCx1KSBmb3IoaW50IChpKT0oaW50KShsKTsoaSk8KGludCkodSk7KysoaSkpCiNkZWZpbmUgYXV0KHIsdikgZm9yKGF1dG8gcjp2KQoKI2RlZmluZSBlYWNoKGl0LG8pIGZvcihhdXQoaXQsIChvKS5iZWdpbigpKTsgaXQgIT0gKG8pLmVuZCgpOyArKyBpdCkKI2RlZmluZSBhbGwobykgKG8pLmJlZ2luKCksIChvKS5lbmQoKQojZGVmaW5lIHBiKHgpIHB1c2hfYmFjayh4KQojZGVmaW5lIHBjKCkgIHBvcF9iYWNrKCkKCiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZwojZGVmaW5lIG1wKHgseSkgbWFrZV9wYWlyKCh4KSwoeSkpCiNkZWZpbmUgbXNldChtLHYpIG1lbXNldChtLHYsc2l6ZW9mKG0pKQoKI2RlZmluZSBJTkYgMHgzZjNmM2YzZgojZGVmaW5lIElORkwgMHgzZjNmM2YzZjNmM2YzZjNmTEwKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBlbmRsICdcbicKCiNkZWZpbmUgc3Qgc3RhY2s8aW50PgoKCgojZGVmaW5lIHZsIHZlY3Rvcjxsb25nIGxvbmc+CiNkZWZpbmUgdmkgdmVjdG9yPGludD4KI2RlZmluZSB2YiB2ZWN0b3I8Ym9vbD4KI2RlZmluZSB2YyB2ZWN0b3I8Y2hhcj4KI2RlZmluZSBwaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHZwaWkgdmVjdG9yPHBpaT4KI2RlZmluZSB2dmkgdmVjdG9yPHZpPgojZGVmaW5lIHZzIHZlY3RvcjxzdHJpbmc+CgojZGVmaW5lIG1vZCAxMDAwMDAwMDA3CgojZGVmaW5lIHVuICB1bm9yZGVyZWRfbWFwPGludCxpbnQ+CiNkZWZpbmUgbWlpIG1hcDxpbnQsaW50PgoKI2RlZmluZSBTb3J0KGEpIHNvcnQoYWxsKGEpKQojZGVmaW5lIEVEKGEpIFNvcnQoYSksIGEuZXJhc2UodW5pcXVlKGFsbChhKSksIGEuZW5kKCkpLy9yZW1vdmluZyBhbGwgZHVwbGljYXRlcwoKI2RlZmluZSBtYXgzKGEsIGIsIGMpICAgbWF4KGEsIG1heChiLCBjKSkKI2RlZmluZSBtaW4zKGEsIGIsIGMpICAgbWluKGEsIG1pbihiLCBjKSkKI2RlZmluZSBNYXgoYSkgICAgICAgKm1heF9lbGVtZW50KGFsbChhKSkKI2RlZmluZSBNaW4oYSkgICAgICAgKm1pbl9lbGVtZW50KGFsbChhKSkKI2RlZmluZSBNYXhQKGEpICAgICAgIG1heF9lbGVtZW50KGFsbChhKSkgLSBhLmJlZ2luKCkKI2RlZmluZSBNaW5QKGEpICAgICAgICBtaW5fZWxlbWVudChhbGwoYSkpIC0gYS5iZWdpbigpCgojZGVmaW5lIGFsbFVwcGVyKGEpICAgICB0cmFuc2Zvcm0oYWxsKGEpLCBhLmJlZ2luKCksIDo6IHRvdXBwZXIpCiNkZWZpbmUgYWxsTG93ZXIoYSkgICAgIHRyYW5zZm9ybShhbGwoYSksIGEuYmVnaW4oKSwgOjogdG9sb3dlcikKCiNkZWZpbmUgcmV2KGEpICAgICAgICAgIHJldmVyc2UoYWxsKGEpKQojZGVmaW5lIHViKHYsaykgICAgICAgICAgdXBwZXJfYm91bmQoYWxsKHYpLCBrKSAtIHYuYmVnaW4oKQojZGVmaW5lIGxiKHYsaykgICAgICAgICAgbG93ZXJfYm91bmQoYWxsKHYpLCBrKSAtIHYuYmVnaW4oKQojZGVmaW5lIGFkdihhLG4pICAgICAgICBhZHZhbmNlKGF1dG8gaXQ6YSxuKQojZGVmaW5lIFJTb3J0KGEpICAgICAgICAgc29ydChhLnJiZWdpbigpLGEucmVuZCgpKSAvL2RlY2VuZGluZyBvcmRlcgojZGVmaW5lIGNudCh2LGEpICAgICAgICAgICAgIGNvdW50KGFsbCh2KSxhKQojZGVmaW5lIGJzKHYsYSkgICAgICAgICAgIGJpbmFyeV9zZWFyY2goYWxsKHYpLGEpCiNkZWZpbmUgbW1heCh2KSAgICAgICAgICAgKm1heF9lbGVtZW50KGFsbCh2KSkKI2RlZmluZSBtbWluKHYpICAgICAgICAgICAqbWluX2VsZW1lbnQoYWxsKHYpKQojZGVmaW5lIHBvcGNvdW50KG1hc2spICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnQobWFzaykgLy8gY291bnQgc2V0IGJpdAojZGVmaW5lIHBvcGNvdW50TEwobWFzaykgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fcG9wY291bnRsbChtYXNrKSAvLyBmb3IgbG9uZyBsb25nCiNkZWZpbmUgWCByZWFsKCkgLy8gdXNlZnVsIGZvciB3b3JraW5nIHdpdGggI2luY2x1ZGUgPGNvbXBsZXg+IGZvciBjb21wdXRhdGlvbmFsIGdlb21ldHJ5CiNkZWZpbmUgWSBpbWFnKCkKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBzcyBzZWNvbmQKI2RlZmluZSBmZiBmaXJzdAoKI2RlZmluZSB0cmFjZTEoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJyIDw8ICN4IDw8ICI6ICIgPDwgeCA8PCBlbmRsOwojZGVmaW5lIHRyYWNlMih4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgI3ggPDwgIjogIiA8PCB4IDw8ICIgfCAiIDw8ICN5IDw8ICI6ICIgPDwgeSA8PCBlbmRsOwojZGVmaW5lIHRyYWNlMyh4LCB5LCB6KSAgICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgI3ggPDwgIjogIiA8PCB4IDw8ICIgfCAiIDw8ICN5IDw8ICI6ICIgPDwgeSA8PCAiIHwgIiA8PCAjeiA8PCAiOiAiIDw8IHogPDwgZW5kbDsKI2RlZmluZSB0cmFjZTQoYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICBjZXJyIDw8ICNhIDw8ICI6ICIgPDwgYSA8PCAiIHwgIiA8PCAjYiA8PCAiOiAiIDw8IGIgPDwgIiB8ICIgPDwgI2MgPDwgIjogIiA8PCBjIDw8ICIgfCAiIDw8ICNkIDw8ICI6ICIgPDwgZCA8PCBlbmRsOwojZGVmaW5lIHRyYWNlNShhLCBiLCBjLCBkLCBlKSAgICAgICAgICAgICAgIGNlcnIgPDwgI2EgPDwgIjogIiA8PCBhIDw8ICIgfCAiIDw8ICNiIDw8ICI6ICIgPDwgYiA8PCAiIHwgIiA8PCAjYyA8PCAiOiAiIDw8IGMgPDwgIiB8ICIgPDwgI2QgPDwgIjogIiA8PCBkIDw8ICIgfCAiIDw8ICNlIDw8ICI6ICIgPDwgZSA8PCBlbmRsOwojZGVmaW5lIHRyYWNlNihhLCBiLCBjLCBkLCBlLCBmKSAgICAgICAgICAgIGNlcnIgPDwgI2EgPDwgIjogIiA8PCBhIDw8ICIgfCAiIDw8ICNiIDw8ICI6ICIgPDwgYiA8PCAiIHwgIiA8PCAjYyA8PCAiOiAiIDw8IGMgPDwgIiB8ICIgPDwgI2QgPDwgIjogIiA8PCBkIDw8ICIgfCAiIDw8ICNlIDw8ICI6ICIgPDwgZSA8PCAiIHwgIiA8PCAjZiA8PCAiOiAiIDw8IGYgPDwgZW5kbDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGdjZChUIGEsIFQgYikgeyB3aGlsZSAoYikgYiBePSBhIF49IGIgXj0gYSAlPSBiOyByZXR1cm4gYTsgfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBzZXRiaXQoVCBtYXNrLCBUIHBvcykgeyByZXR1cm4gbWFzayB8PSAoMSA8PCBwb3MpOyB9CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIHJlc2V0Yml0KFQgbWFzaywgVCBwb3MpIHsgcmV0dXJuIG1hc2sgJj0gfigxIDw8IHBvcyk7IH0KdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgdG9nZ2xlYml0KFQgbWFzaywgVCBwb3MpIHsgcmV0dXJuIG1hc2sgXj0gKDEgPDwgcG9zKTsgfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBjaGVja2JpdChUIG1hc2ssIFQgcG9zKSB7IHJldHVybiAoYm9vbCkobWFzayAmICgxIDw8IHBvcykpOyB9CnRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGxjbShUIGEsIFQgYikgeyByZXR1cm4gKGEgLyBnY2QoYSwgYikpICogYjsgfQoKCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBtb2R1KFQgYSwgVCBiKSB7IHJldHVybiAoYSA8IGIgPyBhIDogYSAlIGIpOyB9CnRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgbW9kX25lZyhUIGEsIFQgYikgeyBhID0gbW9kKGEsIGIpOyBpZiAoYSA8IDApIHsgYSArPSBiOyB9IHJldHVybiBhOyB9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD5UIGV4cG8oVCBlLCBUIG4pIHsgVCB4ID0gMSwgcCA9IGU7IHdoaWxlIChuKSB7IGlmIChuICYgMSl4ID0geCAqIHA7IHAgPSBwICogcDsgbiA+Pj0gMTsgfSByZXR1cm4geDsgfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIG1vZF9pbnZlcnNlKFQgYSwgVCBuKSB7IFQgeCwgeTsgVCBkID0gZXh0ZW5kZWRfZXVjbGlkKGEsIG4sIHgsIHkpOyByZXR1cm4gKGQgPiAxID8gLTEgOiBtb2RfbmVnKHgsIG4pKTsgfQoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+VCBwb3dlcihUIGUsIFQgbiwgVCBtKSB7IFQgeCA9IDEsIHAgPSBlOyB3aGlsZSAobikgeyBpZiAobiAmIDEpeCA9IG1vZCh4ICogcCwgbSk7IHAgPSBtb2QocCAqIHAsIG0pOyBuID4+PSAxOyB9IHJldHVybiB4OyB9CnRlbXBsYXRlIDx0eXBlbmFtZSBUPlQgcG93ZXJMKFQgZSwgVCBuLCBUIG0pIHsgVCB4ID0gMSwgcCA9IGU7IHdoaWxlIChuKSB7IGlmIChuICYgMSl4ID0gbXVsbW9kKHgsIHAsIG0pOyBwID0gbXVsbW9kKHAsIHAsIG0pOyBuID4+PSAxOyB9IHJldHVybiB4OyB9Cgpib29sIFBvdzIoaW50IG4pIHsKICAgIHJldHVybiBuICYmICghKG4gJiAobiAtIDEpKSk7Cn0Kdm9pZCBwcmludGModmMmIHJlc3VsdCkgewogICAgYXV0KHIsIHJlc3VsdCkgY291dCA8PCByIDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKfQp2b2lkIHByaW50bCh2bCYgcmVzdWx0KSB7CiAgICBhdXQociwgcmVzdWx0KSBjb3V0IDw8IHIgPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwp9CnZvaWQgcHJpbnQodmkmIHJlc3VsdCkgewogICAgYXV0KHIsIHJlc3VsdCkgY291dCA8PCByIDw8ICIgIjsKICAgIGNvdXQgPDwgZW5kbDsKfQovLyBSZWN1cnNpdmVseSBjb21wdXRlcyB0aGUgcG93ZXIKaW50IGJpbnBvdyhpbnQgYSwgaW50IGIpCnsKICAgIGlmIChiID09IDApCiAgICAgICAgcmV0dXJuIGE7CiAgICBpbnQgcmVzID0gYmlucG93KGEsIGIgLyAyKTsKICAgIGlmIChiICUgMikKICAgICAgICByZXR1cm4gcmVzICogcmVzICogYTsKICAgIGVsc2UKICAgICAgICByZXR1cm4gcmVzICogcmVzOwp9Ci8vIGl0ZXJhdGl2ZWx5IGNvbXB1dGVzIHRoZSBwb3dlcgpsbCBwb3cobGwgYSwgbGwgYikKewogICAgbGwgcmVzID0gMTsKICAgIHdoaWxlIChiKQogICAgewogICAgICAgIGlmIChiICYgMSkKICAgICAgICAgICAgcmVzID0gcmVzICogYTsKICAgICAgICBhID0gYSAqIGE7CiAgICAgICAgYiA+Pj0gMTsKICAgIH0KICAgIHJldHVybiByZXM7Cn0KaW50IG1vZHBvdyhpbnQgYSwgaW50IGIsIGludCBtKQp7CiAgICBpbnQgYW5zID0gMTsKICAgIHdoaWxlIChiKQogICAgewogICAgICAgIGlmIChiICYgMSkKICAgICAgICAgICAgYW5zID0gKGFucyAqIGEpICUgbTsKICAgICAgICBiIC89IDI7CiAgICAgICAgYSA9IChhICogYSkgJSBtOwogICAgfQogICAgcmV0dXJuIGFuczsKfQoKbGwgbmNyKGxsIG4sIGxsIGspCnsKICAgIGxsIHJlcyA9IDE7CgogICAgLy8gU2luY2UgQyhuLCBrKSA9IEMobiwgbi1rKSAKICAgIGlmIChrID4gbiAtIGspCiAgICAgICAgayA9IG4gLSBrOwoKICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBvZiAKICAgIC8vIFtuICogKG4tMSkgKi0tLSogKG4taysxKV0gLyBbayAqIChrLTEpICotLS0tKiAxXSAKICAgIGZvciAobGwgaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgICAgICByZXMgKj0gKG4gLSBpKTsKICAgICAgICByZXMgLz0gKGkgKyAxKTsKICAgIH0KCiAgICByZXR1cm4gcmVzOwp9Ci8vaWZzdHJlYW0gY2luKCJiX3JlYWRfb24udHh0Iik7IG9mc3RyZWFtIGNvdXQoIm91dHB1dDMudHh0Iik7Ci8vVXNlICg8PCkgZm9yIG11bHRpcGxpY2F0aW9uCi8vVXNlICg+PikgZm9yIGRpdmlzaW9uCi8vaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7Y2luLnRpZShOVUxMKTtjb3V0LnRpZShOVUxMKTtjb3V0PDxmaXhlZDtjZXJyLnRpZShOVUxMKTsKLy8gZmluZF9ieV9vcmRlciAtPiB2YWx1ZSBhdCBpbmRleAovLyBvcmRlcl9vZl9rZXkgLT4gaW5kZXggb2YgdmFsdWUKLy8gd2hpbGUgdXNpbmcgKDE8PGkpIHVzZSAoKGxsKTE8PChsbClpKSAKLy8gaW4gRmxveWQtV2Fyc2hhbGwgQWxnbywgayBpcyBvdXRlciBsb29wIAovLyBJZiBhbiBlbGVtZW50IHdhcyBub3QgaW5pdGlhbGx5IGluIG1hcCBhbmQgaWYgYXNrZWQgbXBbYV0sdGhlIGVsZW1lbnQgZ2V0cyBpbnNlcnRlZCAKLy8gYSU9bW9kIHRha2UgYSBsb3Qgb2YgdGltZS4uLiB0cnkgdG8gdXNlIGl0IG1pbmltdW0gYW5kIHVzZSBtZW1zZXQgYXMgaXQgcmVkdWNlcyBhIGxvdCBvZiB0aW1lIHVzYWdlLi4udXNlIGlmKGE+PW1vZCkgYSU9bW9kCi8vY291dDw8KGRvdWJsZSkgY2FuIGJlIGhhcm1mdWwgLCBhbHdheXMgdXNlIHByaW50ZiglLjlsbGYpLi4udGFrZSBzY2FuZigiJWxmIiwmcFtpXVtqXSkgYXMgaW5wdXQgLCBub3QgbGxmOwovL3VzZSBzLmVyYXNlKGl0KyspIGZvciBlcmFzaW5nIGl0ZXJhdG9yIGFuZCB0aGVuIG1vdmluZyB0byB0aGUgbmV4dCBvbmUKLy9uZXZlciB1c2UgYWRqLnJlc2l6ZShuKSBhcyB2YWx1ZSBpcyBwZXJzaXN0ZW50LCBhbHdheXMgZXJhc2UKLy91c2UgX19idWlsdGluX3BvcGNvdW50bGwoKSBmb3IgbGwKLy8gbm8gb2YgcHJpbWUgbnVtYmVycyBpbiByYW5nZSA6ICg3MCwxOSkgLCAoMTAwMCwxNjgpICwgKDEwMDAwMCwxMjI5KSAsIChzcXJ0KDEwXjkpLDM0MDkpIDsKLy9hbHdheXMgY2hlY2sgdGhlIHVzZSBvZiBzZWdtZW50IHRyZWUgdXNpbmcgYm90dG9tLXVwIGRwCmludCBkeFtdID0geyAwLCAwLCAxLCAtMSB9OwppbnQgZHlbXSA9IHsgMSwgLTEsIDAsIDAgfTsgLy8gNCBEaXJlY3Rpb24KLyogaW50IGR4W10gPSB7MSwtMSwwLDAsMSwxLC0xLC0xfSAsIGR5W10gPSB7MCwwLDEsLTEsMSwtMSwxLC0xfTsgKi8gLy8gOCBEaXJlY3Rpb24KLyogaW50IGR4W10gPSB7MSwtMSwxLC0xLDIsMiwtMiwtMn0gLCBkeVtdID0gezIsMiwtMiwtMiwxLC0xLDEsLTF9OyAqLyAvLyBLbmlnaHQgRGlyZWN0aW9uCi8qIGludCBkeFtdID0gezIsLTIsMSwxLC0xLC0xfSAsIGR5W10gPSB7MCwwLDEsLTEsMSwtMX07ICovIC8vIEhleGFnb25hbCBEaXJlY3Rpb24KCgoKCnZiIHZpcygxMDAxKTsKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBjb3V0LnRpZShOVUxMKTsKICAgIGludCB0ZXN0OwogICAgdGVzdCA9IDE7CiAgICAvLyBjaW4gPj4gdGVzdDsKCiAgICB3aGlsZSAodGVzdC0tKSB7CiAgICAgICAgaW50IG47CiAgICAgICAgY2luID4+IG47CiAgICAgICAgdmkgdihuKTsKICAgICAgICByZXAoaSwgbikgY2luID4+IHZbaV07CiAgICAgICAgUlNvcnQodik7CiAgICAgICAgdnBpaSB2cDsKICAgICAgICByZXAoaSwgbiAtIDEpIHsKICAgICAgICAgICAgdnAucHVzaF9iYWNrKHsgdltpXSAtIHZbaSArIDFdIC0gMiAsdltpXSAtIHZbaSArIDFdICsgMiB9KTsKICAgICAgICB9CiAgICAgICAgaW50IG1heGkgPSBtYXgodnBbMF0uZmYsIHZwWzBdLnNzKTsKICAgICAgICBpbnQgbWluaSA9IG1pbih2cFswXS5zcywgdnBbMF0uZmYpOwogICAgICAgIGludCBmbGFnID0gMDsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2cC5zaXplKCk7IGkrKykgewogICAgICAgICAgICBpbnQgbSA9IG1heCh2cFtpXS5mZiwgdnBbaV0uc3MpOwogICAgICAgICAgICBpbnQgbCA9IG1pbih2cFtpXS5mZiwgdnBbaV0uc3MpOwogICAgICAgICAgICBpZiAobCA+IG1heGkgfHwgbSA8IG1pbmkpIHsKICAgICAgICAgICAgICAgIGZsYWcgPSAxOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBtYXhpID0gbWluKG1heGksIG0pOwogICAgICAgICAgICBtaW5pID0gbWF4KG1pbmksIGwpOwogICAgICAgIH0KICAgICAgICB0cmFjZTIobWF4aSwgbWluaSk7CiAgICAgICAgaWYgKGZsYWcgPT0gMSkgY291dCA8PCAtMSA8PCBlbmRsOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICAgICB1bm9yZGVyZWRfbWFwPGludCwgaW50PiBtcDsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAodltpXSAtIHZbaSArIDFdIDw9IG1heGkgJiYgdltpXSAtIHZbaSArIDFdID49IG1pbmkpIG1wW3ZbaV0gLSB2W2kgKyAxXV0rKzsKICAgICAgICAgICAgICAgIGVsc2UgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobXAuc2l6ZSgpID49IDIpIGNvdW50ICs9IG1wLnNpemUoKSAtIDE7CiAgICAgICAgICAgIGNvdXQgPDwgY291bnQgPDwgZW5kbDsKCiAgICAgICAgfQoKICAgIH0KCn0KCg==