/* Creation Date - 30-01-2023 */
/* Creation Time - 22:11:00.00 */
#define ill
/*
Written By : mafailure
In the name of God
O Allah, May you grant peace and honor on Muhammad and his family.
Allahumm-a-Sall-iAla Muhammad-in Wa Al-i Muhammad
*/
#ifdef LOCAL
#define AATIF_DEBUG
#endif
/*Add -DLOCAL in
compiler command
to trigger it*/
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp>
#include <functional> // for less
using namespace std;
using namespace __gnu_pbds;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl "\n"
/*------------------------int to long long -----------------*/
#ifdef ill
#define int long long
#endif
/*---------------------------DEBUG HELPER--------------------------------------*/
template<typename T> ostream& operator<<(ostream &os, const vector<T> &v) { os << '{'; string sep; for (const auto &x : v) os << sep << x, sep = ", "; return os << '}'; }
template<typename T, size_t size> ostream& operator<<(ostream &os, const array<T, size> &arr) { os << '{'; string sep; for (const auto &x : arr) os << sep << x, sep = ", "; return os << '}'; }
template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; }
template<typename T,typename K> ostream& operator<<(ostream & os,const map<T,K> & mapp){ os<<"{"; string sep=""; for(const auto& x:mapp)os<<sep<<x,sep=", "; return os<<'}'; }
template <typename T> ostream & operator<<(ostream & os,const set<T> & sett){os<<'{'; string sep=""; for(const auto & x:sett)os<<sep<<x,sep=", "; return os<<'}';}
void dbg_out() { cerr << endl; }
template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cerr << ' ' << H; dbg_out(T...); }
#ifdef AATIF_DEBUG
#define dbg(...) cerr << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
#define dbg(...)
#endif
//#define int long long
// int dx[]={-1,1,0,0}; int dy[]={0,0,1,-1};
// int dx[]={2,2,-2,-2,1,1,-1,-1}; int dy[]={1,-1,1,-1,2,-2,2,-2};
#ifndef mod_2
long long mod = 1e9 + 7;
#else
long long mod =998244353;
#endif
const double eps=1e-9;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef pair<int, int> ii;
typedef vector< pair< int, int > > vii;
typedef map<int, int> mii;
typedef pair<int, ii> pip;
typedef pair<ii, int> ppi;
#define arrinp(arr,init,final,size,type) type* arr=new type[size];for(int i=init;i<final;i++)cin>>arr[i];
#define cr2d(arr,n,m,t) t**arr=new t*[n];for(int i=0;i<n;i++)arr[i]=new t[m];
#define w(t) int t;cin>>t; while(t--)
#define takeInp(n) int n;cin>>n;
#define fr(i,init,final) for(int i=init;i<final;i++)
#define frr(i,init,final) for(int i=init;i>=final;i--)
#define Fr(i,final) for(int i=0;i<final;i++)
#define Frr(i,first) for(int i=first;i>=0;i--)
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define rall(c) (c).rbegin(),(c).rend()
#define debug(x) cerr<<">value ("<<#x<<") : "<<x<<endl;
#define setb __builtin_popcount
#define lsone(n) (n&(-n))
#define rlsone(n) (n&(n-1))
#define clr(a,b) memset(a,b,sizeof(a))
#ifdef ill
const int inf =1e18;
#else
const int inf=1e9;
#endif
/*-----------------------------RANDOM NUMBER GENERATOR ---------------------*/
#ifdef RNG
unsigned seed=chrono::high_resolution_clock::now().time_since_epoch().count();
mt19937 rng(seed);
#endif
/*------------------------------UNORDERED MAP HASH --------------------------------------------*/
//To make unordered_map unhackable
// use it as unordered_map<int,int,custom_hash> mapp;
struct custom_hash {
static uint64_t splitmix64(uint64_t x) {
/* http://x...content-available-to-author-only...i.it/splitmix64.c */
x += 0x9e3779b97f4a7c15;
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
return x ^ (x >> 31);
}
size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM);
}
};
/*---------------------------ORDERED SET--------------------------------------*/
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
/*----------------------------------------------------------------------------*/
vi init(string s)
{
istringstream sin(s);
int n;
vi arr;
while(sin>>n)arr.push_back(n);
return arr;
}
int power(int x, int y,int mod)
{
if(y==0)return 1;
int u=power(x,y/2,mod);
u=(u*u)%mod;
if(y%2)u=(x*u)%mod;
return u;
}
int gcd(int a,int b)
{
if(a<b)return gcd(b,a);
return (b==0?a:(a%b?gcd(b,a%b):b));
}
int gcd_e(int a,int b,int &x,int &y)
{
if(b==0){x=1; y=0; return a;}
int x1,y1;
int p=gcd_e(b,a%b,x1,y1);
x=y1;
y=x1-(a/b)*y1;
return p;
}
/*-----------------to solve int to long long problem-----------------*/
int Min (int a,int b){return min(a,b);}
int Max(int a,int b){ return max(a,b);}
inline int add(int a,int b,int mod=mod){return (a+b)%mod;}
inline int sub(int a,int b,int mod=mod){return (a-b+mod)%mod;}
inline int mul(int a,int b,int mod=mod){return (a*b%mod);}
//inline int divide(int a,int b,int mod=mod){return a*power(b,mod-2)%mod;}
inline int high(int a,int b){return (a>>b)&1;}
//786 121 786 121 786 121 786 121 786 121 786 121 786 121 786 121 786 121
/*========================CODE*****CODE****CODE======================*/
template<const int X=2>
class StringHashing
{
using T=array<int,X> ;
public:
function<T(int,int)> get_sub;
function<bool(int,int,int,int)> match_two_sub;
vector<T> hash,pp,ipp;
T p,ip,mod;
StringHashing(int N)
{
/*TODO Base values of mod, p, ip needs to be updated if you are using different X*/
mod={(int)1e9+7,(int)1e8+7};
p={37,43};
ip={power(p[0],mod[0]-2,mod[0]),power(p[1],mod[1]-2,mod[1])};
T base_val;
base_val.fill(1);
pp=vector<T>(N,base_val);
ipp=vector<T>(N,base_val);
for(int i=1;i<N;i++)
{
for(int j=0;j<X;j++)
{
pp[i][j]=mul(pp[i-1][j],p[j],mod[j]);
ipp[i][j]=mul(ipp[i-1][j],ip[j],mod[j]);
}
}
}
};
#include<bits/stdc++.h>
using namespace std;
template<class T=int>
struct FenwickTree:vector<T>
{
public:
//inline int lsone(int i){return (i&(-i));}
template<typename... Args>
FenwickTree(Args... args):vector<T>(args...){;}
void update(int ind,T val,function<T(const T, const T)> f)
{
vector<T> & ft= *this;
for(int i=ind;i<ft.size();i+=lsone(i))ft[i]=f(ft[i],val);
}
T query(int ind, T ans, function<T(const T,const T)> f)
{
vector<T> & ft = *this;
for(int i=ind;i;i-=lsone(i))ans=f(ft[i],ans);
return ans;
}
T query_max(int ind ,int ans)
{
return query(ind,ans,[](T a,T b)->T{return a>b?a:b;});
}
T query_min(int ind,int ans)
{
return query(ind, ans,[](T a,T b)->T{return a<b?a:b;});
}
T query_cnt(int ind,int ans,int mod)
{
return query(ind, ans, [&](T a, T b)->T{return add(a,b,mod);});
}
void update_max(int ind,int val)
{
update(ind,val,[](T a,T b){return a>b?a:b;});
}
void update_min(int ind,int val)
{
update(ind,val,[](T a,T b){return a<b?a:b;});
}
void update_cnt(int ind,int val,int mod)
{
update(ind,val,[&](T a,T b){return add(a,b,mod);});
}
};
signed main()
{
IOS
using T=array<int,2>;
int n,m;
cin>>n>>m;
int swapped=0;
if(n>m)swapped=1,swap(n,m);
vector<vector<FenwickTree<int>>> ft(n,vector<FenwickTree<int>>(2,FenwickTree<int>(m+1)));
int q;
cin>>q;
vector<array<int,6>> store(q);
map<int,int> mapp;
for(int i=0;i<q;i++)
{
cin>>store[i][0];
if(store[i][0]==1)fr(j,1,6)cin>>store[i][j];
else fr(j,1,5)cin>>store[i][j];
if(store[i][0]==1)mapp[store[i][5]]++;
}
int id=1;
for(auto & it:mapp)it.se=id++;
StringHashing<2> helper(id+5);
vector<T> hash(id+5);
fr(i,0,id+5)hash[i]=helper.pp[i];
for(int i=0;i<q;i++)
{
if(store[i][0]==1)
{
int xa,ya,xb,yb;
xa=store[i][1],ya=store[i][2];
xb=store[i][3],yb=store[i][4];
if(swapped)swap(xa,ya),swap(xb,yb);
int c=mapp[store[i][5]];
fr(x,xa-1,xb)
{
fr(j,0,2)
ft[x][j].update_cnt(ya,hash[c][j],helper.mod[j]),
ft[x][j].update_cnt(yb+1,sub(0,hash[c][j],helper.mod[j]),helper.mod[j]);
}
}
else
{
int xa,ya,xb,yb;
xa=store[i][1],ya=store[i][2];
xb=store[i][3],yb=store[i][4];
if(swapped)swap(xa,ya),swap(xb,yb);
bool ok=1;
fr(j,0,2)
{
if(ft[xa-1][j].query_cnt(ya,0,helper.mod[j])!=ft[xb-1][j].query_cnt(yb,0,helper.mod[j]))ok=0;
}
cout<<(ok?"YES":"NO")<<endl;
}
}
}
LyogQ3JlYXRpb24gRGF0ZSAtIDMwLTAxLTIwMjMgKi8gIAovKiBDcmVhdGlvbiBUaW1lIC0gMjI6MTE6MDAuMDAgKi8gIAojZGVmaW5lIGlsbCAKLyoKV3JpdHRlbiBCeSA6IG1hZmFpbHVyZQpJbiB0aGUgbmFtZSBvZiBHb2QgCk8gQWxsYWgsIE1heSB5b3UgZ3JhbnQgcGVhY2UgYW5kIGhvbm9yIG9uIE11aGFtbWFkIGFuZCBoaXMgZmFtaWx5LgpBbGxhaHVtbS1hLVNhbGwtaUFsYSBNdWhhbW1hZC1pbiBXYSBBbC1pIE11aGFtbWFkCiovCgojaWZkZWYgTE9DQUwgCiNkZWZpbmUgQUFUSUZfREVCVUcKI2VuZGlmIAovKkFkZCAtRExPQ0FMIGluIApjb21waWxlciBjb21tYW5kIAp0byB0cmlnZ2VyIGl0Ki8KICAKI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPGV4dC9wYl9kcy9hc3NvY19jb250YWluZXIuaHBwPiAvLyBDb21tb24gZmlsZSAKI2luY2x1ZGUgPGV4dC9wYl9kcy90cmVlX3BvbGljeS5ocHA+IAojaW5jbHVkZSA8ZnVuY3Rpb25hbD4gLy8gZm9yIGxlc3MKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiNkZWZpbmUgSU9TIGlvczo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCk7CiAKI2RlZmluZSBlbmRsICJcbiIKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1pbnQgdG8gbG9uZyBsb25nIC0tLS0tLS0tLS0tLS0tLS0tKi8KI2lmZGVmIGlsbAojZGVmaW5lIGludCBsb25nIGxvbmcgCiNlbmRpZgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURFQlVHIEhFTFBFUi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KdGVtcGxhdGU8dHlwZW5hbWUgVD4gb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtICZvcywgY29uc3QgdmVjdG9yPFQ+ICZ2KSB7IG9zIDw8ICd7Jzsgc3RyaW5nIHNlcDsgZm9yIChjb25zdCBhdXRvICZ4IDogdikgb3MgPDwgc2VwIDw8IHgsIHNlcCA9ICIsICI7IHJldHVybiBvcyA8PCAnfSc7IH0KdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IHNpemU+IG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSAmb3MsIGNvbnN0IGFycmF5PFQsIHNpemU+ICZhcnIpIHsgb3MgPDwgJ3snOyBzdHJpbmcgc2VwOyBmb3IgKGNvbnN0IGF1dG8gJnggOiBhcnIpIG9zIDw8IHNlcCA8PCB4LCBzZXAgPSAiLCAiOyByZXR1cm4gb3MgPDwgJ30nOyB9CnRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSAmb3MsIGNvbnN0IHBhaXI8QSwgQj4gJnApIHsgcmV0dXJuIG9zIDw8ICcoJyA8PCBwLmZpcnN0IDw8ICIsICIgPDwgcC5zZWNvbmQgPDwgJyknOyB9CnRlbXBsYXRlPHR5cGVuYW1lIFQsdHlwZW5hbWUgSz4gb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtICYgb3MsY29uc3QgbWFwPFQsSz4gJiBtYXBwKXsgb3M8PCJ7Ijsgc3RyaW5nIHNlcD0iIjsgZm9yKGNvbnN0IGF1dG8mIHg6bWFwcClvczw8c2VwPDx4LHNlcD0iLCAiOyByZXR1cm4gb3M8PCd9JzsgfQp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gb3N0cmVhbSAmIG9wZXJhdG9yPDwob3N0cmVhbSAmIG9zLGNvbnN0IHNldDxUPiAmIHNldHQpe29zPDwneyc7IHN0cmluZyBzZXA9IiI7IGZvcihjb25zdCBhdXRvICYgeDpzZXR0KW9zPDxzZXA8PHgsc2VwPSIsICI7IHJldHVybiBvczw8J30nO30KIAp2b2lkIGRiZ19vdXQoKSB7IGNlcnIgPDwgZW5kbDsgfQp0ZW1wbGF0ZTx0eXBlbmFtZSBIZWFkLCB0eXBlbmFtZS4uLiBUYWlsPiB2b2lkIGRiZ19vdXQoSGVhZCBILCBUYWlsLi4uIFQpIHsgY2VyciA8PCAnICcgPDwgSDsgZGJnX291dChULi4uKTsgfQogCiNpZmRlZiBBQVRJRl9ERUJVRwojZGVmaW5lIGRiZyguLi4pIGNlcnIgPDwgIigiIDw8ICNfX1ZBX0FSR1NfXyA8PCAiKToiLCBkYmdfb3V0KF9fVkFfQVJHU19fKQojZWxzZQojZGVmaW5lIGRiZyguLi4pCiNlbmRpZgogCi8vI2RlZmluZSBpbnQgbG9uZyBsb25nIAovLyBpbnQgZHhbXT17LTEsMSwwLDB9OyBpbnQgZHlbXT17MCwwLDEsLTF9OwovLyBpbnQgZHhbXT17MiwyLC0yLC0yLDEsMSwtMSwtMX07IGludCBkeVtdPXsxLC0xLDEsLTEsMiwtMiwyLC0yfTsKI2lmbmRlZiBtb2RfMiAKbG9uZyBsb25nIG1vZCA9IDFlOSArIDc7CiNlbHNlIApsb25nIGxvbmcgbW9kID05OTgyNDQzNTM7IAojZW5kaWYgCmNvbnN0IGRvdWJsZSBlcHM9MWUtOTsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiB2ZWN0b3I8dmk+IHZ2aTsKdHlwZWRlZiB2ZWN0b3I8c3RyaW5nPiB2czsKdHlwZWRlZiB2ZWN0b3I8Ym9vbD4gdmI7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gaWk7CnR5cGVkZWYgdmVjdG9yPCBwYWlyPCBpbnQsIGludCA+ID4gdmlpOwp0eXBlZGVmIG1hcDxpbnQsIGludD4gbWlpOwp0eXBlZGVmIHBhaXI8aW50LCBpaT4gcGlwOwp0eXBlZGVmIHBhaXI8aWksIGludD4gcHBpOwojZGVmaW5lIGFycmlucChhcnIsaW5pdCxmaW5hbCxzaXplLHR5cGUpIHR5cGUqIGFycj1uZXcgdHlwZVtzaXplXTtmb3IoaW50IGk9aW5pdDtpPGZpbmFsO2krKyljaW4+PmFycltpXTsKI2RlZmluZSBjcjJkKGFycixuLG0sdCkgdCoqYXJyPW5ldyB0KltuXTtmb3IoaW50IGk9MDtpPG47aSsrKWFycltpXT1uZXcgdFttXTsKI2RlZmluZSB3KHQpIGludCB0O2Npbj4+dDsgd2hpbGUodC0tKQojZGVmaW5lIHRha2VJbnAobikgaW50IG47Y2luPj5uOwojZGVmaW5lIGZyKGksaW5pdCxmaW5hbCkgZm9yKGludCBpPWluaXQ7aTxmaW5hbDtpKyspCiNkZWZpbmUgZnJyKGksaW5pdCxmaW5hbCkgZm9yKGludCBpPWluaXQ7aT49ZmluYWw7aS0tKQojZGVmaW5lIEZyKGksZmluYWwpIGZvcihpbnQgaT0wO2k8ZmluYWw7aSsrKQojZGVmaW5lIEZycihpLGZpcnN0KSBmb3IoaW50IGk9Zmlyc3Q7aT49MDtpLS0pCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBhbGwoYykgKGMpLmJlZ2luKCksKGMpLmVuZCgpCiNkZWZpbmUgcmFsbChjKSAoYykucmJlZ2luKCksKGMpLnJlbmQoKQojZGVmaW5lIGRlYnVnKHgpIGNlcnI8PCI+dmFsdWUgKCI8PCN4PDwiKSA6ICI8PHg8PGVuZGw7CiNkZWZpbmUgc2V0YiBfX2J1aWx0aW5fcG9wY291bnQKI2RlZmluZSBsc29uZShuKSAobiYoLW4pKQojZGVmaW5lIHJsc29uZShuKSAobiYobi0xKSkKI2RlZmluZSBjbHIoYSxiKSBtZW1zZXQoYSxiLHNpemVvZihhKSkKI2lmZGVmIGlsbCAKY29uc3QgaW50IGluZiA9MWUxODsgCiNlbHNlIApjb25zdCBpbnQgaW5mPTFlOTsKI2VuZGlmCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1SQU5ET00gTlVNQkVSIEdFTkVSQVRPUiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaWZkZWYgUk5HIAp1bnNpZ25lZCBzZWVkPWNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKTsKbXQxOTkzNyBybmcoc2VlZCk7CiNlbmRpZiAKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1VTk9SREVSRUQgTUFQIEhBU0ggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovL1RvIG1ha2UgdW5vcmRlcmVkX21hcCB1bmhhY2thYmxlIAovLyB1c2UgaXQgYXMgdW5vcmRlcmVkX21hcDxpbnQsaW50LGN1c3RvbV9oYXNoPiBtYXBwOwpzdHJ1Y3QgY3VzdG9tX2hhc2ggewogICAgc3RhdGljIHVpbnQ2NF90IHNwbGl0bWl4NjQodWludDY0X3QgeCkgewogICAgICAgIC8qIGh0dHA6Ly94Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5pLml0L3NwbGl0bWl4NjQuYyAqLwogICAgICAgIHggKz0gMHg5ZTM3NzliOTdmNGE3YzE1OwogICAgICAgIHggPSAoeCBeICh4ID4+IDMwKSkgKiAweGJmNTg0NzZkMWNlNGU1Yjk7CiAgICAgICAgeCA9ICh4IF4gKHggPj4gMjcpKSAqIDB4OTRkMDQ5YmIxMzMxMTFlYjsKICAgICAgICByZXR1cm4geCBeICh4ID4+IDMxKTsKICAgIH0KIAogICAgc2l6ZV90IG9wZXJhdG9yKCkodWludDY0X3QgeCkgY29uc3QgewogICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBGSVhFRF9SQU5ET00gPSBjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCk7CiAgICAgICAgcmV0dXJuIHNwbGl0bWl4NjQoeCArIEZJWEVEX1JBTkRPTSk7CiAgICB9Cn07Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tT1JERVJFRCBTRVQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnR5cGVkZWYgdHJlZTxpbnQsIG51bGxfdHlwZSwgbGVzczxpbnQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPiAgb3JkZXJlZF9zZXQ7IAovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp2aSBpbml0KHN0cmluZyBzKQp7Cglpc3RyaW5nc3RyZWFtIHNpbihzKTsKCWludCBuOwoJdmkgYXJyOwoJd2hpbGUoc2luPj5uKWFyci5wdXNoX2JhY2sobik7CglyZXR1cm4gYXJyOwp9CmludCBwb3dlcihpbnQgeCwgaW50IHksaW50IG1vZCkKeyAKCWlmKHk9PTApcmV0dXJuIDE7CglpbnQgdT1wb3dlcih4LHkvMixtb2QpOwoJdT0odSp1KSVtb2Q7CglpZih5JTIpdT0oeCp1KSVtb2Q7CglyZXR1cm4gdTsKICAgIAp9CmludCBnY2QoaW50IGEsaW50IGIpCnsKCWlmKGE8YilyZXR1cm4gZ2NkKGIsYSk7CglyZXR1cm4gKGI9PTA/YTooYSViP2djZChiLGElYik6YikpOwp9CmludCBnY2RfZShpbnQgYSxpbnQgYixpbnQgJngsaW50ICZ5KQp7CgkKCWlmKGI9PTApe3g9MTsgeT0wOyByZXR1cm4gYTt9CglpbnQgeDEseTE7CglpbnQgcD1nY2RfZShiLGElYix4MSx5MSk7Cgl4PXkxOwoJeT14MS0oYS9iKSp5MTsKCXJldHVybiBwOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS10byBzb2x2ZSBpbnQgdG8gbG9uZyBsb25nIHByb2JsZW0tLS0tLS0tLS0tLS0tLS0tLSovCmludCBNaW4gKGludCBhLGludCBiKXtyZXR1cm4gbWluKGEsYik7fQppbnQgTWF4KGludCBhLGludCBiKXsgcmV0dXJuIG1heChhLGIpO30KaW5saW5lIGludCBhZGQoaW50IGEsaW50IGIsaW50IG1vZD1tb2Qpe3JldHVybiAoYStiKSVtb2Q7fSAKaW5saW5lIGludCBzdWIoaW50IGEsaW50IGIsaW50IG1vZD1tb2Qpe3JldHVybiAoYS1iK21vZCklbW9kO30KaW5saW5lIGludCBtdWwoaW50IGEsaW50IGIsaW50IG1vZD1tb2Qpe3JldHVybiAoYSpiJW1vZCk7fQovL2lubGluZSBpbnQgZGl2aWRlKGludCBhLGludCBiLGludCBtb2Q9bW9kKXtyZXR1cm4gYSpwb3dlcihiLG1vZC0yKSVtb2Q7fQppbmxpbmUgaW50IGhpZ2goaW50IGEsaW50IGIpe3JldHVybiAoYT4+YikmMTt9Ci8vNzg2IDEyMSA3ODYgMTIxIDc4NiAxMjEgNzg2IDEyMSA3ODYgMTIxIDc4NiAxMjEgNzg2IDEyMSA3ODYgMTIxIDc4NiAxMjEKLyo9PT09PT09PT09PT09PT09PT09PT09PT1DT0RFKioqKipDT0RFKioqKkNPREU9PT09PT09PT09PT09PT09PT09PT09Ki8KCnRlbXBsYXRlPGNvbnN0IGludCBYPTI+IApjbGFzcyBTdHJpbmdIYXNoaW5nCnsKCXVzaW5nIFQ9YXJyYXk8aW50LFg+IDsgCglwdWJsaWM6IAoJZnVuY3Rpb248VChpbnQsaW50KT4gZ2V0X3N1YjsgCglmdW5jdGlvbjxib29sKGludCxpbnQsaW50LGludCk+IG1hdGNoX3R3b19zdWI7IAoJdmVjdG9yPFQ+IGhhc2gscHAsaXBwOyAKCVQgcCxpcCxtb2Q7IAoJU3RyaW5nSGFzaGluZyhpbnQgTikKCXsKCQkvKlRPRE8gQmFzZSB2YWx1ZXMgb2YgbW9kLCBwLCBpcCBuZWVkcyB0byBiZSB1cGRhdGVkIGlmIHlvdSBhcmUgdXNpbmcgZGlmZmVyZW50IFgqLwoJCW1vZD17KGludCkxZTkrNywoaW50KTFlOCs3fTsgCgkJcD17MzcsNDN9OyAKCQlpcD17cG93ZXIocFswXSxtb2RbMF0tMixtb2RbMF0pLHBvd2VyKHBbMV0sbW9kWzFdLTIsbW9kWzFdKX07IAoJCVQgYmFzZV92YWw7IAoJCWJhc2VfdmFsLmZpbGwoMSk7IAoJICAgIHBwPXZlY3RvcjxUPihOLGJhc2VfdmFsKTsgCgkgICAgaXBwPXZlY3RvcjxUPihOLGJhc2VfdmFsKTsgCgkJZm9yKGludCBpPTE7aTxOO2krKykKCQl7CgkJCWZvcihpbnQgaj0wO2o8WDtqKyspCgkJCXsKCQkJCXBwW2ldW2pdPW11bChwcFtpLTFdW2pdLHBbal0sbW9kW2pdKTsgCgkJCQlpcHBbaV1bal09bXVsKGlwcFtpLTFdW2pdLGlwW2pdLG1vZFtqXSk7IAoJCQl9CgkJfQoJfQoJCgkKfTsKI2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsgCnRlbXBsYXRlPGNsYXNzIFQ9aW50PiAKc3RydWN0IEZlbndpY2tUcmVlOnZlY3RvcjxUPgp7CglwdWJsaWM6IAoJLy9pbmxpbmUgaW50IGxzb25lKGludCBpKXtyZXR1cm4gKGkmKC1pKSk7fQoJdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJncz4gCglGZW53aWNrVHJlZShBcmdzLi4uIGFyZ3MpOnZlY3RvcjxUPihhcmdzLi4uKXs7fQoJdm9pZCB1cGRhdGUoaW50IGluZCxUIHZhbCxmdW5jdGlvbjxUKGNvbnN0IFQsIGNvbnN0IFQpPiBmKQoJewoJCXZlY3RvcjxUPiAmIGZ0PSAqdGhpczsgCgkJZm9yKGludCBpPWluZDtpPGZ0LnNpemUoKTtpKz1sc29uZShpKSlmdFtpXT1mKGZ0W2ldLHZhbCk7IAoJfQoJVCBxdWVyeShpbnQgaW5kLCBUIGFucywgZnVuY3Rpb248VChjb25zdCBULGNvbnN0IFQpPiBmKQoJewoJCXZlY3RvcjxUPiAmIGZ0ID0gKnRoaXM7IAoJCWZvcihpbnQgaT1pbmQ7aTtpLT1sc29uZShpKSlhbnM9ZihmdFtpXSxhbnMpOyAKCQlyZXR1cm4gYW5zOyAKCX0KCVQgcXVlcnlfbWF4KGludCBpbmQgLGludCBhbnMpCgl7CgkgCXJldHVybiBxdWVyeShpbmQsYW5zLFtdKFQgYSxUIGIpLT5Ue3JldHVybiBhPmI/YTpiO30pOyAKCX0KCVQgcXVlcnlfbWluKGludCBpbmQsaW50IGFucykKCXsKCQlyZXR1cm4gcXVlcnkoaW5kLCBhbnMsW10oVCBhLFQgYiktPlR7cmV0dXJuIGE8Yj9hOmI7fSk7IAoJfQoJVCBxdWVyeV9jbnQoaW50IGluZCxpbnQgYW5zLGludCBtb2QpCgl7CgkJcmV0dXJuIHF1ZXJ5KGluZCwgYW5zLCBbJl0oVCBhLCBUIGIpLT5Ue3JldHVybiBhZGQoYSxiLG1vZCk7fSk7IAoJfQoJdm9pZCB1cGRhdGVfbWF4KGludCBpbmQsaW50IHZhbCkKCXsKCQl1cGRhdGUoaW5kLHZhbCxbXShUIGEsVCBiKXtyZXR1cm4gYT5iP2E6Yjt9KTsgCgl9Cgl2b2lkIHVwZGF0ZV9taW4oaW50IGluZCxpbnQgdmFsKQoJewoJCXVwZGF0ZShpbmQsdmFsLFtdKFQgYSxUIGIpe3JldHVybiBhPGI/YTpiO30pOyAKCX0KCXZvaWQgdXBkYXRlX2NudChpbnQgaW5kLGludCB2YWwsaW50IG1vZCkKCXsKCQl1cGRhdGUoaW5kLHZhbCxbJl0oVCBhLFQgYil7cmV0dXJuIGFkZChhLGIsbW9kKTt9KTsgCgl9CgkKCQoJCn07CgpzaWduZWQgbWFpbigpCnsKCUlPUwoJdXNpbmcgVD1hcnJheTxpbnQsMj47IAoJaW50IG4sbTsgCgljaW4+Pm4+Pm07IAoJaW50IHN3YXBwZWQ9MDsKCWlmKG4+bSlzd2FwcGVkPTEsc3dhcChuLG0pOwoJdmVjdG9yPHZlY3RvcjxGZW53aWNrVHJlZTxpbnQ+Pj4gZnQobix2ZWN0b3I8RmVud2lja1RyZWU8aW50Pj4oMixGZW53aWNrVHJlZTxpbnQ+KG0rMSkpKTsKCWludCBxOyAKCWNpbj4+cTsgCgl2ZWN0b3I8YXJyYXk8aW50LDY+PiBzdG9yZShxKTsgCgltYXA8aW50LGludD4gbWFwcDsgIAoJZm9yKGludCBpPTA7aTxxO2krKykKCXsKCQljaW4+PnN0b3JlW2ldWzBdOyAKCQlpZihzdG9yZVtpXVswXT09MSlmcihqLDEsNiljaW4+PnN0b3JlW2ldW2pdOyAKCQllbHNlIGZyKGosMSw1KWNpbj4+c3RvcmVbaV1bal07CgkJaWYoc3RvcmVbaV1bMF09PTEpbWFwcFtzdG9yZVtpXVs1XV0rKzsgCgkJIAoJfQoJaW50IGlkPTE7IAoJZm9yKGF1dG8gJiBpdDptYXBwKWl0LnNlPWlkKys7CglTdHJpbmdIYXNoaW5nPDI+IGhlbHBlcihpZCs1KTsKCXZlY3RvcjxUPiBoYXNoKGlkKzUpOyAKCWZyKGksMCxpZCs1KWhhc2hbaV09aGVscGVyLnBwW2ldOyAKCWZvcihpbnQgaT0wO2k8cTtpKyspCgl7CgkJaWYoc3RvcmVbaV1bMF09PTEpCgkJewoJCQlpbnQgeGEseWEseGIseWI7IAoJCQl4YT1zdG9yZVtpXVsxXSx5YT1zdG9yZVtpXVsyXTsKCQkJeGI9c3RvcmVbaV1bM10seWI9c3RvcmVbaV1bNF07IAoJCQlpZihzd2FwcGVkKXN3YXAoeGEseWEpLHN3YXAoeGIseWIpOyAKCQkJaW50IGM9bWFwcFtzdG9yZVtpXVs1XV07IAoJCQlmcih4LHhhLTEseGIpCgkJCXsKCQkJCWZyKGosMCwyKQoJCQkJZnRbeF1bal0udXBkYXRlX2NudCh5YSxoYXNoW2NdW2pdLGhlbHBlci5tb2Rbal0pLAoJCQkJZnRbeF1bal0udXBkYXRlX2NudCh5YisxLHN1YigwLGhhc2hbY11bal0saGVscGVyLm1vZFtqXSksaGVscGVyLm1vZFtqXSk7IAoJCQl9CgkJfQoJCWVsc2UgCgkJewoJCQlpbnQgeGEseWEseGIseWI7IAoJCQl4YT1zdG9yZVtpXVsxXSx5YT1zdG9yZVtpXVsyXTsKCQkJeGI9c3RvcmVbaV1bM10seWI9c3RvcmVbaV1bNF07CgkJCWlmKHN3YXBwZWQpc3dhcCh4YSx5YSksc3dhcCh4Yix5Yik7IAoJCQlib29sIG9rPTE7CgkJCWZyKGosMCwyKQoJCQl7CgkJCQlpZihmdFt4YS0xXVtqXS5xdWVyeV9jbnQoeWEsMCxoZWxwZXIubW9kW2pdKSE9ZnRbeGItMV1bal0ucXVlcnlfY250KHliLDAsaGVscGVyLm1vZFtqXSkpb2s9MDsJCgkJCX0KCQkJY291dDw8KG9rPyJZRVMiOiJOTyIpPDxlbmRsOyAKCQl9Cgl9CgkKCQkKCQoJIAoJCgkgCgkKCQkgCn0KCgoK