import java.lang.*;
import java.math.*;
import java.util.*;
import java.io.*;
public class Main {
ArrayList<Line> v=new ArrayList<>();
int blocksize=500;
int totalblocks;
ConvexHullTrick cht[];
ArrayList<Line> vec[];
ArrayList<Line> tmpvec=new ArrayList<>();
int n,q;
n=ni();
blocksize
=(int)Math.
sqrt(n
)+1;
totalblocks=n/blocksize+1;
if(n%blocksize==0) totalblocks--;
// pw.println(blocksize+" "+totalblocks);
cht=new ConvexHullTrick[totalblocks];
for(int i=0;i<totalblocks;i++){
cht[i]=new ConvexHullTrick(blocksize);
vec[i]=new ArrayList<>();
}
for(int i=0;i<n;i++) {
long a=ni(),b=ni();
if(a
>100000 || b
>100000) throw new Exception("out of bound");
// cht[i/blocksize].add_line(a,b);
vec
[i
/blocksize
].
add(new Line(a,b
)); }
for(int i=0;i<totalblocks;i++){
tmpvec.clear();
for(Line l
: vec
[i
]) tmpvec.
add(new Line(-l.
a,
-l.
b)); for(Line l
: tmpvec
) cht
[i
].
add_line(l.
a,l.
b); }
q=ni();
int cnt=0;
for(int qu=0;qu<q;qu++) {
int type =ni();
if (type == 1) {
int i1 = ni(), i2 = ni();
int st = 0, ed = 0;
while (i1 > vec[st].size()) {
i1 -= vec[st].size();
st++;
}
while (i2 > vec[ed].size()) {
i2 -= vec[ed].size();
ed++;
}
if (st == ed) {
Line l
= vec
[st
].
remove(i1
- 1); vec[st].add(i2 - 1, l);
} else {
Line l
= vec
[st
].
remove(i1
- 1); vec[ed].add(i2, l);
cht[st]=new ConvexHullTrick(vec[st].size());
cht[ed]=new ConvexHullTrick(vec[ed].size());
tmpvec.clear();
for(Line p
: vec
[st
]) tmpvec.
add(new Line(-p.
a,
-p.
b)); for(Line p
: tmpvec
) cht
[st
].
add_line(p.
a,p.
b); tmpvec.clear();
for(Line p
: vec
[ed
]) tmpvec.
add(new Line(-p.
a,
-p.
b)); for(Line p
: tmpvec
) cht
[ed
].
add_line(p.
a,p.
b);
}
// for(Line l : vec[st]) pw.println(l.a+" "+l.b);
cnt++;
if (cnt == blocksize) {
cnt = 0;
rebuild();
}
} else {
int l = ni(), r =ni() ;
int x = ni();
int st = 0, ed = 0;
if(x
>100000) throw new Exception("out of bound");
while (l > vec[st].size()) {
l -= vec[st].size();
st++;
}
while (r > vec[ed].size()) {
r -= vec[ed].size();
ed++;
}
// pw.println(st+" "+ed+" "+l+" "+r);
long ans
= Long.
MIN_VALUE; // pw.println(st+" "+ed);
if(st==ed){
for(int i=l-1;i<r;i++) {
ans
=Math.
max(ans,p.
get(x
)); }
}else {
for (int i
= st
+ 1; i
< ed
; i
++) ans
= Math.
max(ans,
-cht
[i
].
querry(x
)); for (int i = l - 1; i < vec[st].size(); i++) {
ans
= Math.
max(ans, p.
get(x
)); }
for (int i = 0; i < r; i++) {
ans
= Math.
max(ans, p.
get(x
)); }
}
pw.println(ans);
}
}
}
void rebuild(){
v.clear();
for(int i=0;i<totalblocks;i++) cht[i]=new ConvexHullTrick(blocksize);
for(int i=0;i<totalblocks;i++){
v.addAll(vec[i]);
vec[i].clear();
}
for(int i=0;i<v.size();i++){
vec
[i
/blocksize
].
add(new Line(l.
a,l.
b));
}
for(int i=0;i<totalblocks;i++){
tmpvec.clear();
for(Line l
: vec
[i
]) tmpvec.
add(new Line(-l.
a,
-l.
b)); for(Line l
: tmpvec
) cht
[i
].
add_line(l.
a,l.
b); }
}
static class ConvexHullTrick {
int size;
public ConvexHullTrick(int len){
size=0;
// lines=new Line[len];
}
boolean isbad(int prev,int curr,int next){
Line l1
=hull
[prev
],l2
=hull
[curr
],l3
=hull
[next
]; // if((l1.b-l3.b)>Long.MAX_VALUE/(l2.a-l1.a) || (l1.b-l2.b)>Long.MAX_VALUE/(l3.a-l1.a) ){
// return ((l1.b-l3.b)*1.0)/(l3.a-l1.a) <=((l1.b-l2.b)*1.0)/(l2.a-l1.a);
// }
return (double)(l1.b-l3.b)*(l2.a-l1.a)<=(double)(l1.b-l2.b)*(l3.a-l1.a);
}
void add_line(long a,long b){
if(size!=0 && hull[size-1].a==a) return;
hull
[size
++]=new Line(a,b
); while(size>2 && isbad(size-3,size-2,size-1)){
hull[size-2]=hull[size-1];
size--;
}
}
void add_lines(){
Arrays.
sort(lines,
new Comparator
<Line
>() { @Override
int t
=Long.
compare(t2.
a,t1.
a); if(t!=0) return t;
t
=Long.
compare(t1.
b,t2.
b); return t;
}
});
for(Line l
: lines
) add_line
(l.
a,l.
b); }
long querry(long x){
if(size
==0) return Long.
MAX_VALUE; int l=0,r=size-1;
while(l<=r){
int mid=(l+r)/2;
if(mid>0 && x*(hull[mid-1].a-hull[mid].a)<((hull[mid].b-hull[mid-1].b))){
r=mid-1;
}else if(mid+1<size && x*(hull[mid].a-hull[mid+1].a)>((hull[mid+1].b-hull[mid].b))){
l=mid+1;
}else {
ans
=Math.
min(ans,hull
[mid
].
get(x
)); break;
}
}
return ans;
}
}
static class Line implements Comparable
<Line
>{ long a;
long b;
public Line(long a,
long b
){ this.a=a;
this.b=b;
}
long get(long x){
return a*x+b;
}
public int compareTo
(Line c
){ int t
=Long.
compare(c.
a,
this.
a); if(t!=0) return t;
t
=Long.
compare(this.
b,c.
b); return t;
}
}
static class Line2 {
long a;
long b;
int id;
public Line2(int id,long a,long b){
this.a=a;
this.b=b;
this.id=id;
}
long get(long x){
return a*x+b;
}
}
static int randInt(int min,int max){
int randInt=rand.nextInt((max-min)+1)+min;
return randInt;
}
long M= (long)1e9+7;
long s
= System.
currentTimeMillis(); solve();
pw.flush();
if(!INPUT.
isEmpty())tr
(System.
currentTimeMillis()-s
+"ms");
}
public static void main
(String[] args
) throws Exception { new Main
().
run(); }
private byte[] inbuf = new byte[1024];
public int lenbuf = 0, ptrbuf = 0;
private int readByte() {
if(lenbuf == -1)throw new InputMismatchException();
if(ptrbuf >= lenbuf){
ptrbuf = 0;
try { lenbuf
= is.
read(inbuf
); } catch (IOException e
) { throw new InputMismatchException
(); } if(lenbuf <= 0)return -1;
}
return inbuf[ptrbuf++];
}
private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); }
private int skip() { int b; while((b = readByte()) != -1 && isSpaceChar(b)); return b; }
private double nd
() { return Double.
parseDouble(ns
()); } private char nc() { return (char)skip(); }
int b = skip();
StringBuilder sb = new StringBuilder();
while(!(isSpaceChar(b))){ // when nextLine, (isSpaceChar(b) && b != ' ')
sb.appendCodePoint(b);
b = readByte();
}
return sb.toString();
}
private char[] ns(int n) {
char[] buf = new char[n];
int b = skip(), p = 0;
while(p < n && !(isSpaceChar(b))){
buf[p++] = (char)b;
b = readByte();
}
return n
== p
? buf
: Arrays.
copyOf(buf, p
); }
private char[][] nm(int n, int m) {
char[][] map = new char[n][];
for(int i = 0;i < n;i++)map[i] = ns(m);
return map;
}
private int[] na(int n) {
int[] a = new int[n];
for(int i = 0;i < n;i++)a[i] = ni();
return a;
}
private int ni() {
int num = 0, b;
boolean minus = false;
while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
if(b == '-'){
minus = true;
b = readByte();
}
while(true){
if(b >= '0' && b <= '9'){
num = num * 10 + (b - '0');
}else{
return minus ? -num : num;
}
b = readByte();
}
}
private long nl() {
long num = 0;
int b;
boolean minus = false;
while((b = readByte()) != -1 && !((b >= '0' && b <= '9') || b == '-'));
if(b == '-'){
minus = true;
b = readByte();
}
while(true){
if(b >= '0' && b <= '9'){
num = num * 10 + (b - '0');
}else{
return minus ? -num : num;
}
b = readByte();
}
}
private boolean oj
= System.
getProperty("ONLINE_JUDGE") != null; private void tr
(Object...
o) { if(INPUT.
length() > 0)System.
out.
println(Arrays.
deepToString(o
)); }
}
aW1wb3J0IGphdmEubGFuZy4qOwppbXBvcnQgamF2YS5tYXRoLio7CmltcG9ydCBqYXZhLnV0aWwuKjsKaW1wb3J0IGphdmEuaW8uKjsKIApwdWJsaWMgY2xhc3MgTWFpbiB7CiAgICBBcnJheUxpc3Q8TGluZT4gdj1uZXcgQXJyYXlMaXN0PD4oKTsKICAgIGludCBibG9ja3NpemU9NTAwOwogICAgaW50IHRvdGFsYmxvY2tzOwogICAgQ29udmV4SHVsbFRyaWNrIGNodFtdOwogICAgQXJyYXlMaXN0PExpbmU+IHZlY1tdOwogCiAKICAgIEFycmF5TGlzdDxMaW5lPiB0bXB2ZWM9bmV3IEFycmF5TGlzdDw+KCk7CiAgICBpbnQgbixxOwogCiAgICB2b2lkIHNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgbj1uaSgpOwogCiAgICAgICAgYmxvY2tzaXplPShpbnQpTWF0aC5zcXJ0KG4pKzE7CiAKICAgICAgICB0b3RhbGJsb2Nrcz1uL2Jsb2Nrc2l6ZSsxOwogICAgICAgIGlmKG4lYmxvY2tzaXplPT0wKSB0b3RhbGJsb2Nrcy0tOwogICAgICAgIC8vICAgcHcucHJpbnRsbihibG9ja3NpemUrIiAiK3RvdGFsYmxvY2tzKTsKICAgICAgICBjaHQ9bmV3IENvbnZleEh1bGxUcmlja1t0b3RhbGJsb2Nrc107CiAgICAgICAgdmVjPW5ldyBBcnJheUxpc3RbdG90YWxibG9ja3NdOwogICAgICAgIGZvcihpbnQgaT0wO2k8dG90YWxibG9ja3M7aSsrKXsKICAgICAgICAgICAgY2h0W2ldPW5ldyBDb252ZXhIdWxsVHJpY2soYmxvY2tzaXplKTsKICAgICAgICAgICAgdmVjW2ldPW5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgIH0KIAogCiAgICAgICAgZm9yKGludCBpPTA7aTxuO2krKykgewogICAgICAgICAgICBsb25nIGE9bmkoKSxiPW5pKCk7CiAgICAgICAgICAgIGlmKGE+MTAwMDAwIHx8IGI+MTAwMDAwKSB0aHJvdyBuZXcgRXhjZXB0aW9uKCJvdXQgb2YgYm91bmQiKTsKIAogICAgICAgICAgICAvLyAgY2h0W2kvYmxvY2tzaXplXS5hZGRfbGluZShhLGIpOwogICAgICAgICAgICB2ZWNbaS9ibG9ja3NpemVdLmFkZChuZXcgTGluZShhLGIpKTsKICAgICAgICB9CiAgICAgICAgZm9yKGludCBpPTA7aTx0b3RhbGJsb2NrcztpKyspewogICAgICAgICAgICB0bXB2ZWMuY2xlYXIoKTsKICAgICAgICAgICAgZm9yKExpbmUgbCA6IHZlY1tpXSkgdG1wdmVjLmFkZChuZXcgTGluZSgtbC5hLC1sLmIpKTsKICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0bXB2ZWMpOwogICAgICAgICAgICBmb3IoTGluZSBsIDogdG1wdmVjKSBjaHRbaV0uYWRkX2xpbmUobC5hLGwuYik7CiAgICAgICAgfQogICAgICAgIHE9bmkoKTsKIAogICAgICAgIGludCBjbnQ9MDsKICAgICAgICBmb3IoaW50IHF1PTA7cXU8cTtxdSsrKSB7CiAgICAgICAgICAgIGludCB0eXBlID1uaSgpOwogCiAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHsKICAgICAgICAgICAgICAgIGludCBpMSA9IG5pKCksIGkyID0gbmkoKTsKICAgICAgICAgICAgICAgIGludCBzdCA9IDAsIGVkID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlIChpMSA+IHZlY1tzdF0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgaTEgLT0gdmVjW3N0XS5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgc3QrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChpMiA+IHZlY1tlZF0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgaTIgLT0gdmVjW2VkXS5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgZWQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzdCA9PSBlZCkgewogICAgICAgICAgICAgICAgICAgIExpbmUgbCA9IHZlY1tzdF0ucmVtb3ZlKGkxIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgdmVjW3N0XS5hZGQoaTIgLSAxLCBsKTsKIAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBMaW5lIGwgPSB2ZWNbc3RdLnJlbW92ZShpMSAtIDEpOwogICAgICAgICAgICAgICAgICAgIHZlY1tlZF0uYWRkKGkyLCBsKTsKIAogICAgICAgICAgICAgICAgICAgIGNodFtzdF09bmV3IENvbnZleEh1bGxUcmljayh2ZWNbc3RdLnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgY2h0W2VkXT1uZXcgQ29udmV4SHVsbFRyaWNrKHZlY1tlZF0uc2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICB0bXB2ZWMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICBmb3IoTGluZSBwIDogdmVjW3N0XSkgdG1wdmVjLmFkZChuZXcgTGluZSgtcC5hLC1wLmIpKTsKICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRtcHZlYyk7CiAgICAgICAgICAgICAgICAgICAgZm9yKExpbmUgcCA6IHRtcHZlYykgY2h0W3N0XS5hZGRfbGluZShwLmEscC5iKTsKICAgICAgICAgICAgICAgICAgICB0bXB2ZWMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICBmb3IoTGluZSBwIDogdmVjW2VkXSkgdG1wdmVjLmFkZChuZXcgTGluZSgtcC5hLC1wLmIpKTsKICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRtcHZlYyk7CiAgICAgICAgICAgICAgICAgICAgZm9yKExpbmUgcCA6IHRtcHZlYykgY2h0W2VkXS5hZGRfbGluZShwLmEscC5iKTsKIAogCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBmb3IoTGluZSBsIDogdmVjW3N0XSkgcHcucHJpbnRsbihsLmErIiAiK2wuYik7CiAgICAgICAgICAgICAgICBjbnQrKzsKICAgICAgICAgICAgICAgIGlmIChjbnQgPT0gYmxvY2tzaXplKSB7CiAgICAgICAgICAgICAgICAgICAgY250ID0gMDsKICAgICAgICAgICAgICAgICAgICByZWJ1aWxkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpbnQgbCA9IG5pKCksIHIgPW5pKCkgOwogICAgICAgICAgICAgICAgaW50IHggPSBuaSgpOwogICAgICAgICAgICAgICAgaW50IHN0ID0gMCwgZWQgPSAwOwogICAgICAgICAgICAgICAgaWYoeD4xMDAwMDApIHRocm93IG5ldyBFeGNlcHRpb24oIm91dCBvZiBib3VuZCIpOwogCiAgICAgICAgICAgICAgICB3aGlsZSAobCA+IHZlY1tzdF0uc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgbCAtPSB2ZWNbc3RdLnNpemUoKTsKICAgICAgICAgICAgICAgICAgICBzdCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKHIgPiB2ZWNbZWRdLnNpemUoKSkgewogICAgICAgICAgICAgICAgICAgIHIgLT0gdmVjW2VkXS5zaXplKCk7CiAgICAgICAgICAgICAgICAgICAgZWQrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHB3LnByaW50bG4oc3QrIiAiK2VkKyIgIitsKyIgIityKTsKICAgICAgICAgICAgICAgIGxvbmcgYW5zID0gTG9uZy5NSU5fVkFMVUU7CiAgICAgICAgICAgICAgICAvLyAgcHcucHJpbnRsbihzdCsiICIrZWQpOwogICAgICAgICAgICAgICAgaWYoc3Q9PWVkKXsKICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGk9bC0xO2k8cjtpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGluZSBwPXZlY1tzdF0uZ2V0KGkpOwogICAgICAgICAgICAgICAgICAgICAgICBhbnM9TWF0aC5tYXgoYW5zLHAuZ2V0KHgpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0ICsgMTsgaSA8IGVkOyBpKyspIGFucyA9IE1hdGgubWF4KGFucywgLWNodFtpXS5xdWVycnkoeCkpOwogICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsIC0gMTsgaSA8IHZlY1tzdF0uc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGluZSBwID0gdmVjW3N0XS5nZXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFucyA9IE1hdGgubWF4KGFucywgcC5nZXQoeCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHI7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBMaW5lIHAgPSB2ZWNbZWRdLmdldChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYW5zID0gTWF0aC5tYXgoYW5zLCBwLmdldCh4KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICBwdy5wcmludGxuKGFucyk7CiAgICAgICAgICAgIH0KIAogICAgICAgIH0KIAogCiAgICB9CiAgICB2b2lkIHJlYnVpbGQoKXsKICAgICAgICB2LmNsZWFyKCk7CiAgICAgICAgZm9yKGludCBpPTA7aTx0b3RhbGJsb2NrcztpKyspIGNodFtpXT1uZXcgQ29udmV4SHVsbFRyaWNrKGJsb2Nrc2l6ZSk7CiAgICAgICAgZm9yKGludCBpPTA7aTx0b3RhbGJsb2NrcztpKyspewogICAgICAgICAgICB2LmFkZEFsbCh2ZWNbaV0pOwogICAgICAgICAgICB2ZWNbaV0uY2xlYXIoKTsKIAogICAgICAgIH0KICAgICAgICBmb3IoaW50IGk9MDtpPHYuc2l6ZSgpO2krKyl7CiAgICAgICAgICAgIExpbmUgbD12LmdldChpKTsKICAgICAgICAgICAgdmVjW2kvYmxvY2tzaXplXS5hZGQobmV3IExpbmUobC5hLGwuYikpOwogCiAgICAgICAgfQogICAgICAgIGZvcihpbnQgaT0wO2k8dG90YWxibG9ja3M7aSsrKXsKICAgICAgICAgICAgdG1wdmVjLmNsZWFyKCk7CiAgICAgICAgICAgIGZvcihMaW5lIGwgOiB2ZWNbaV0pIHRtcHZlYy5hZGQobmV3IExpbmUoLWwuYSwtbC5iKSk7CiAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQodG1wdmVjKTsKICAgICAgICAgICAgZm9yKExpbmUgbCA6IHRtcHZlYykgY2h0W2ldLmFkZF9saW5lKGwuYSxsLmIpOwogICAgICAgIH0KIAogCiAKICAgIH0KICAgIHN0YXRpYyBjbGFzcyBDb252ZXhIdWxsVHJpY2sgewogICAgICAgIGludCBzaXplOwogICAgICAgIExpbmUgbGluZXNbXTsKICAgICAgICBMaW5lIGh1bGxbXTsKIAogICAgICAgIHB1YmxpYyBDb252ZXhIdWxsVHJpY2soaW50IGxlbil7CiAgICAgICAgICAgIHNpemU9MDsKICAgICAgICAgICAgLy8gbGluZXM9bmV3IExpbmVbbGVuXTsKICAgICAgICAgICAgaHVsbD1uZXcgTGluZVtsZW5dOwogICAgICAgIH0KICAgICAgICBib29sZWFuIGlzYmFkKGludCBwcmV2LGludCBjdXJyLGludCBuZXh0KXsKICAgICAgICAgICAgTGluZSBsMT1odWxsW3ByZXZdLGwyPWh1bGxbY3Vycl0sbDM9aHVsbFtuZXh0XTsKLy8gICAgICAgICAgICBpZigobDEuYi1sMy5iKT5Mb25nLk1BWF9WQUxVRS8obDIuYS1sMS5hKSB8fCAobDEuYi1sMi5iKT5Mb25nLk1BWF9WQUxVRS8obDMuYS1sMS5hKSApewovLyAgICAgICAgICAgICAgICByZXR1cm4gICgobDEuYi1sMy5iKSoxLjApLyhsMy5hLWwxLmEpIDw9KChsMS5iLWwyLmIpKjEuMCkvKGwyLmEtbDEuYSk7Ci8vICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkobDEuYi1sMy5iKSoobDIuYS1sMS5hKTw9KGRvdWJsZSkobDEuYi1sMi5iKSoobDMuYS1sMS5hKTsKICAgICAgICB9CiAKICAgICAgICB2b2lkIGFkZF9saW5lKGxvbmcgYSxsb25nIGIpewogICAgICAgICAgICBpZihzaXplIT0wICYmIGh1bGxbc2l6ZS0xXS5hPT1hKSByZXR1cm47CiAgICAgICAgICAgIGh1bGxbc2l6ZSsrXT1uZXcgTGluZShhLGIpOwogICAgICAgICAgICB3aGlsZShzaXplPjIgJiYgaXNiYWQoc2l6ZS0zLHNpemUtMixzaXplLTEpKXsKICAgICAgICAgICAgICAgIGh1bGxbc2l6ZS0yXT1odWxsW3NpemUtMV07CiAgICAgICAgICAgICAgICBzaXplLS07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdm9pZCBhZGRfbGluZXMoKXsKICAgICAgICAgICAgQXJyYXlzLnNvcnQobGluZXMsIG5ldyBDb21wYXJhdG9yPExpbmU+KCkgewogICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTGluZSB0MSwgTGluZSB0MikgewogICAgICAgICAgICAgICAgICAgIGludCB0PUxvbmcuY29tcGFyZSh0Mi5hLHQxLmEpOwogICAgICAgICAgICAgICAgICAgIGlmKHQhPTApIHJldHVybiB0OwogICAgICAgICAgICAgICAgICAgIHQ9TG9uZy5jb21wYXJlKHQxLmIsdDIuYik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmb3IoTGluZSBsIDogbGluZXMpIGFkZF9saW5lKGwuYSxsLmIpOwogICAgICAgIH0KICAgICAgICBsb25nIHF1ZXJyeShsb25nIHgpewogCiAgICAgICAgICAgIGlmKHNpemU9PTApIHJldHVybiBMb25nLk1BWF9WQUxVRTsKICAgICAgICAgICAgaW50IGw9MCxyPXNpemUtMTsKICAgICAgICAgICAgbG9uZyBhbnM9TG9uZy5NQVhfVkFMVUU7CiAKICAgICAgICAgICAgd2hpbGUobDw9cil7CiAgICAgICAgICAgICAgICBpbnQgbWlkPShsK3IpLzI7CiAgICAgICAgICAgICAgICBpZihtaWQ+MCAmJiB4KihodWxsW21pZC0xXS5hLWh1bGxbbWlkXS5hKTwoKGh1bGxbbWlkXS5iLWh1bGxbbWlkLTFdLmIpKSl7CiAgICAgICAgICAgICAgICAgICAgcj1taWQtMTsKICAgICAgICAgICAgICAgIH1lbHNlIGlmKG1pZCsxPHNpemUgJiYgeCooaHVsbFttaWRdLmEtaHVsbFttaWQrMV0uYSk+KChodWxsW21pZCsxXS5iLWh1bGxbbWlkXS5iKSkpewogICAgICAgICAgICAgICAgICAgIGw9bWlkKzE7CiAgICAgICAgICAgICAgICB9ZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYW5zPU1hdGgubWluKGFucyxodWxsW21pZF0uZ2V0KHgpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogCiAKICAgICAgICAgICAgcmV0dXJuIGFuczsKICAgICAgICB9CiAgICB9CiAKICAgIHN0YXRpYyBjbGFzcyBMaW5lIGltcGxlbWVudHMgQ29tcGFyYWJsZTxMaW5lPnsKICAgICAgICBsb25nIGE7CiAgICAgICAgbG9uZyBiOwogICAgICAgIHB1YmxpYyBMaW5lKGxvbmcgYSxsb25nIGIpewogICAgICAgICAgICB0aGlzLmE9YTsKICAgICAgICAgICAgdGhpcy5iPWI7CiAgICAgICAgfQogICAgICAgIGxvbmcgZ2V0KGxvbmcgeCl7CiAgICAgICAgICAgIHJldHVybiBhKngrYjsKICAgICAgICB9CiAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oTGluZSBjKXsKICAgICAgICAgICAgaW50IHQ9TG9uZy5jb21wYXJlKGMuYSx0aGlzLmEpOwogICAgICAgICAgICBpZih0IT0wKSByZXR1cm4gdDsKICAgICAgICAgICAgdD1Mb25nLmNvbXBhcmUodGhpcy5iLGMuYik7CiAgICAgICAgICAgIHJldHVybiB0OwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBjbGFzcyBMaW5lMiB7CiAgICAgICAgbG9uZyBhOwogICAgICAgIGxvbmcgYjsKICAgICAgICBpbnQgaWQ7CiAgICAgICAgcHVibGljIExpbmUyKGludCBpZCxsb25nIGEsbG9uZyBiKXsKICAgICAgICAgICAgdGhpcy5hPWE7CiAgICAgICAgICAgIHRoaXMuYj1iOwogICAgICAgICAgICB0aGlzLmlkPWlkOwogICAgICAgIH0KICAgICAgICBsb25nIGdldChsb25nIHgpewogICAgICAgICAgICByZXR1cm4gYSp4K2I7CiAgICAgICAgfQogICAgfQogCiAgICBzdGF0aWMgaW50IHJhbmRJbnQoaW50IG1pbixpbnQgbWF4KXsKICAgICAgICBSYW5kb20gcmFuZD1uZXcgUmFuZG9tKCk7CiAgICAgICAgaW50IHJhbmRJbnQ9cmFuZC5uZXh0SW50KChtYXgtbWluKSsxKSttaW47CiAgICAgICAgcmV0dXJuIHJhbmRJbnQ7CiAgICB9CiAKIAogCiAKICAgIGxvbmcgTT0gKGxvbmcpMWU5Kzc7CiAgICBJbnB1dFN0cmVhbSBpczsKICAgIFByaW50V3JpdGVyIHB3OwogICAgU3RyaW5nIElOUFVUID0gIiI7CiAgICB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgIGlzID0gSU5QVVQuaXNFbXB0eSgpID8gU3lzdGVtLmluIDogbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKElOUFVULmdldEJ5dGVzKCkpOwogICAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQpOwogICAgICAgIGxvbmcgcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgIHNvbHZlKCk7CiAgICAgICAgcHcuZmx1c2goKTsKICAgICAgICBpZighSU5QVVQuaXNFbXB0eSgpKXRyKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXMrIm1zIik7CiAKICAgIH0KICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geyBuZXcgTWFpbigpLnJ1bigpOyB9CiAKICAgIHByaXZhdGUgYnl0ZVtdIGluYnVmID0gbmV3IGJ5dGVbMTAyNF07CiAgICBwdWJsaWMgaW50IGxlbmJ1ZiA9IDAsIHB0cmJ1ZiA9IDA7CiAKICAgIHByaXZhdGUgaW50IHJlYWRCeXRlKCkgewogICAgICAgIGlmKGxlbmJ1ZiA9PSAtMSl0aHJvdyBuZXcgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbigpOwogICAgICAgIGlmKHB0cmJ1ZiA+PSBsZW5idWYpewogICAgICAgICAgICBwdHJidWYgPSAwOwogICAgICAgICAgICB0cnkgeyBsZW5idWYgPSBpcy5yZWFkKGluYnVmKTsgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgSW5wdXRNaXNtYXRjaEV4Y2VwdGlvbigpOyB9CiAgICAgICAgICAgIGlmKGxlbmJ1ZiA8PSAwKXJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluYnVmW3B0cmJ1ZisrXTsKICAgIH0KIAogICAgcHJpdmF0ZSBib29sZWFuIGlzU3BhY2VDaGFyKGludCBjKSB7IHJldHVybiAhKGMgPj0gMzMgJiYgYyA8PSAxMjYpOyB9CiAgICBwcml2YXRlIGludCBza2lwKCkgeyBpbnQgYjsgd2hpbGUoKGIgPSByZWFkQnl0ZSgpKSAhPSAtMSAmJiBpc1NwYWNlQ2hhcihiKSk7IHJldHVybiBiOyB9CiAKICAgIHByaXZhdGUgZG91YmxlIG5kKCkgeyByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKG5zKCkpOyB9CiAgICBwcml2YXRlIGNoYXIgbmMoKSB7IHJldHVybiAoY2hhcilza2lwKCk7IH0KIAogICAgcHJpdmF0ZSBTdHJpbmcgbnMoKSB7CiAgICAgICAgaW50IGIgPSBza2lwKCk7CiAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgd2hpbGUoIShpc1NwYWNlQ2hhcihiKSkpeyAvLyB3aGVuIG5leHRMaW5lLCAoaXNTcGFjZUNoYXIoYikgJiYgYiAhPSAnICcpCiAgICAgICAgICAgIHNiLmFwcGVuZENvZGVQb2ludChiKTsKICAgICAgICAgICAgYiA9IHJlYWRCeXRlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgfQogCiAgICBwcml2YXRlIGNoYXJbXSBucyhpbnQgbikgewogICAgICAgIGNoYXJbXSBidWYgPSBuZXcgY2hhcltuXTsKICAgICAgICBpbnQgYiA9IHNraXAoKSwgcCA9IDA7CiAgICAgICAgd2hpbGUocCA8IG4gJiYgIShpc1NwYWNlQ2hhcihiKSkpewogICAgICAgICAgICBidWZbcCsrXSA9IChjaGFyKWI7CiAgICAgICAgICAgIGIgPSByZWFkQnl0ZSgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbiA9PSBwID8gYnVmIDogQXJyYXlzLmNvcHlPZihidWYsIHApOwogICAgfQogCiAgICBwcml2YXRlIGNoYXJbXVtdIG5tKGludCBuLCBpbnQgbSkgewogICAgICAgIGNoYXJbXVtdIG1hcCA9IG5ldyBjaGFyW25dW107CiAgICAgICAgZm9yKGludCBpID0gMDtpIDwgbjtpKyspbWFwW2ldID0gbnMobSk7CiAgICAgICAgcmV0dXJuIG1hcDsKICAgIH0KIAogICAgcHJpdmF0ZSBpbnRbXSBuYShpbnQgbikgewogICAgICAgIGludFtdIGEgPSBuZXcgaW50W25dOwogICAgICAgIGZvcihpbnQgaSA9IDA7aSA8IG47aSsrKWFbaV0gPSBuaSgpOwogICAgICAgIHJldHVybiBhOwogICAgfQogCiAgICBwcml2YXRlIGludCBuaSgpIHsKICAgICAgICBpbnQgbnVtID0gMCwgYjsKICAgICAgICBib29sZWFuIG1pbnVzID0gZmFsc2U7CiAgICAgICAgd2hpbGUoKGIgPSByZWFkQnl0ZSgpKSAhPSAtMSAmJiAhKChiID49ICcwJyAmJiBiIDw9ICc5JykgfHwgYiA9PSAnLScpKTsKICAgICAgICBpZihiID09ICctJyl7CiAgICAgICAgICAgIG1pbnVzID0gdHJ1ZTsKICAgICAgICAgICAgYiA9IHJlYWRCeXRlKCk7CiAgICAgICAgfQogCiAgICAgICAgd2hpbGUodHJ1ZSl7CiAgICAgICAgICAgIGlmKGIgPj0gJzAnICYmIGIgPD0gJzknKXsKICAgICAgICAgICAgICAgIG51bSA9IG51bSAqIDEwICsgKGIgLSAnMCcpOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIHJldHVybiBtaW51cyA/IC1udW0gOiBudW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYiA9IHJlYWRCeXRlKCk7CiAgICAgICAgfQogICAgfQogCiAgICBwcml2YXRlIGxvbmcgbmwoKSB7CiAgICAgICAgbG9uZyBudW0gPSAwOwogICAgICAgIGludCBiOwogICAgICAgIGJvb2xlYW4gbWludXMgPSBmYWxzZTsKICAgICAgICB3aGlsZSgoYiA9IHJlYWRCeXRlKCkpICE9IC0xICYmICEoKGIgPj0gJzAnICYmIGIgPD0gJzknKSB8fCBiID09ICctJykpOwogICAgICAgIGlmKGIgPT0gJy0nKXsKICAgICAgICAgICAgbWludXMgPSB0cnVlOwogICAgICAgICAgICBiID0gcmVhZEJ5dGUoKTsKICAgICAgICB9CiAKICAgICAgICB3aGlsZSh0cnVlKXsKICAgICAgICAgICAgaWYoYiA+PSAnMCcgJiYgYiA8PSAnOScpewogICAgICAgICAgICAgICAgbnVtID0gbnVtICogMTAgKyAoYiAtICcwJyk7CiAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgcmV0dXJuIG1pbnVzID8gLW51bSA6IG51bTsKICAgICAgICAgICAgfQogICAgICAgICAgICBiID0gcmVhZEJ5dGUoKTsKICAgICAgICB9CiAgICB9CiAgICBwcml2YXRlIGJvb2xlYW4gb2ogPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIk9OTElORV9KVURHRSIpICE9IG51bGw7CiAgICBwcml2YXRlIHZvaWQgdHIoT2JqZWN0Li4uIG8pIHsgaWYoSU5QVVQubGVuZ3RoKCkgPiAwKVN5c3RlbS5vdXQucHJpbnRsbihBcnJheXMuZGVlcFRvU3RyaW5nKG8pKTsgfQogCn0g