getprop("ro.product.device") == "dipper" || abort("E3004: This package is for \"dipper\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/dipper/dipper:10/QKQ1.190828.002/V12.0.2.0.QEACNXM:user/release-keys");
ui_print("Target: Xiaomi/dipper/dipper:10/QKQ1.190828.002/V12.0.3.0.QEACNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/dipper/dipper:10/QKQ1.190828.002/V12.0.2.0.QEACNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/dipper/dipper:10/QKQ1.190828.002/V12.0.3.0.QEACNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/dipper/dipper:10/QKQ1.190828.002/V12.0.2.0.QEACNXM:user/release-keys or Xiaomi/dipper/dipper:10/QKQ1.190828.002/V12.0.3.0.QEACNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:45524298:e686d7882c423bc224bdd7bd376be850fde0ba3b",
                      "EMMC:/dev/block/bootdevice/by-name/boot:45524298:78341c06b06223cdfdc2c35c3b7859ceef2a69d2") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:45524298:e686d7882c423bc224bdd7bd376be850fde0ba3b\" or \"EMMC:/dev/block/bootdevice/by-name/boot:45524298:78341c06b06223cdfdc2c35c3b7859ceef2a69d2\" has unexpected contents.");
apply_patch_space(45524298) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "516,1,582,698,712,744,751,753,754,1000,1005,1007,1008,1114,1115,1599,1600,2288,2289,2291,2293,2294,2295,2310,2311,2492,2493,3664,3665,3667,3668,3672,3673,3681,3682,3683,3684,9041,9042,9044,9045,9449,9450,9452,9453,10449,10451,16390,16391,16524,16525,19294,19296,25543,25545,32768,32770,32959,32960,34681,34682,34684,34686,34745,34746,34879,34881,35111,35112,35180,35181,35195,35196,35266,35267,35276,35277,35725,35728,35734,35735,35740,35741,35785,35788,35799,35800,35925,35926,35929,35930,35947,37249,38089,38090,38098,38099,38104,38105,38107,38108,40581,40582,40584,40585,40671,40672,40863,40864,42621,42622,42627,42628,42910,42911,43159,43160,44168,44169,44530,44531,44567,44568,50187,50189,55559,55560,55698,55699,55705,55706,55719,55720,56342,56343,57233,57234,57496,57497,57673,57674,59921,59922,60407,60408,62954,62955,65536,65537,68946,68947,70713,70714,70786,70787,75451,75454,77629,77630,80253,80254,80394,80395,80542,80543,82681,82682,82694,82695,83323,83324,98304,98306,98495,98496,100119,100120,100296,100299,101311,101314,102962,102963,103012,103013,103016,103019,105066,105067,105125,105126,105147,105148,105871,105874,105891,105892,106140,106143,106309,106310,106351,106352,107651,107652,107722,107723,107743,107744,107790,107791,108117,108118,108272,108273,116441,116442,116481,116482,116505,116506,119120,119123,122796,122797,122802,122803,123199,123200,123900,123901,123907,123908,126833,126834,128378,128379,131072,131073,141509,141511,146687,146688,147072,147074,147599,147600,148047,148048,148052,148053,148065,148066,148070,148071,148082,148083,148458,148459,148482,148483,149767,149768,149906,149907,149988,149991,150004,150007,150010,150011,150907,150910,154819,154820,155086,155089,157050,157051,157272,157273,160660,160661,160673,160674,161010,161011,162754,162755,163189,163190,163840,163842,164031,164032,165635,165636,168376,168381,172823,172824,180345,180346,185567,185568,185887,185888,189906,189907,191339,191340,196608,196609,197214,197215,199183,199184,199979,199980,204617,204618,207995,207996,214557,214558,215350,215351,220445,220446,227655,227656,227961,227962,227974,227975,227985,227988,227989,227990,227991,227992,227994,227995,227996,227997,228049,228050,228135,228138,228141,228142,228148,228149,228172,228173,228234,228235,228238,228243,228244,228245,228246,228247,228248,228249,229043,229044,229050,229051,229376,229378,229567,229568,230302,230304,230857,230859,230860,230861,230862,230863,230864,230865,230866,230867,230868,230869,230870,230871,230872,230873,230874,230877,232337,232339,232420,232421,232423,234343,234346,234348,234606,234607,234614,234616,235104,235106,235214,235215,235245,235246,235257,235258,235524,235525,235638,235639,235655,235657,236973,236974,250667,250668,258538,258539,260603,260604,260881,260882,262144,262145,264739,274857,280179,280695,283291,283292,283455,283456,287269,294914,295103,295104,295610,298586,306488,307174,310202,310212,311245,311246,314230,321779,322084,322585,322620,322902,322916,322920,322929,322932,322942,322944,322965,323328,327680,327681,331252,331254,338892,338893,343295,343296,343644,343645,343960,343961,343976,343977,344004,344005,344048,344049,344725,344737,346428,360449,360955,393217,393723,425985,426491,458753,459259,491521,492027,524289,524795,557057,557563,589825,590331,622593,623099,655361,655867,688129,688635,720897,721403,748925,753664,753665,774155,780254,780261,780379") == "bd19a81b73356d70a23f214b8978a2f84aaf9540" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "516,1,582,698,712,744,751,753,754,1000,1005,1007,1008,1114,1115,1599,1600,2288,2289,2291,2293,2294,2295,2310,2311,2492,2493,3664,3665,3667,3668,3672,3673,3681,3682,3683,3684,9041,9042,9044,9045,9449,9450,9452,9453,10449,10451,16390,16391,16524,16525,19294,19296,25543,25545,32768,32770,32959,32960,34681,34682,34684,34686,34745,34746,34879,34881,35111,35112,35180,35181,35195,35196,35266,35267,35276,35277,35725,35728,35734,35735,35740,35741,35785,35788,35799,35800,35925,35926,35929,35930,35947,37249,38089,38090,38098,38099,38104,38105,38107,38108,40581,40582,40584,40585,40671,40672,40863,40864,42621,42622,42627,42628,42910,42911,43159,43160,44168,44169,44530,44531,44567,44568,50187,50189,55559,55560,55698,55699,55705,55706,55719,55720,56342,56343,57233,57234,57496,57497,57673,57674,59921,59922,60407,60408,62954,62955,65536,65537,68946,68947,70713,70714,70786,70787,75451,75454,77629,77630,80253,80254,80394,80395,80542,80543,82681,82682,82694,82695,83323,83324,98304,98306,98495,98496,100119,100120,100296,100299,101311,101314,102962,102963,103012,103013,103016,103019,105066,105067,105125,105126,105147,105148,105871,105874,105891,105892,106140,106143,106309,106310,106351,106352,107651,107652,107722,107723,107743,107744,107790,107791,108117,108118,108272,108273,116441,116442,116481,116482,116505,116506,119120,119123,122796,122797,122802,122803,123199,123200,123900,123901,123907,123908,126833,126834,128378,128379,131072,131073,141509,141511,146687,146688,147072,147074,147599,147600,148047,148048,148052,148053,148065,148066,148070,148071,148082,148083,148458,148459,148482,148483,149767,149768,149906,149907,149988,149991,150004,150007,150010,150011,150907,150910,154819,154820,155086,155089,157050,157051,157272,157273,160660,160661,160673,160674,161010,161011,162754,162755,163189,163190,163840,163842,164031,164032,165635,165636,168376,168381,172823,172824,180345,180346,185567,185568,185887,185888,189906,189907,191339,191340,196608,196609,197214,197215,199183,199184,199979,199980,204617,204618,207995,207996,214557,214558,215350,215351,220445,220446,227655,227656,227961,227962,227974,227975,227985,227988,227989,227990,227991,227992,227994,227995,227996,227997,228049,228050,228135,228138,228141,228142,228148,228149,228172,228173,228234,228235,228238,228243,228244,228245,228246,228247,228248,228249,229043,229044,229050,229051,229376,229378,229567,229568,230302,230304,230857,230859,230860,230861,230862,230863,230864,230865,230866,230867,230868,230869,230870,230871,230872,230873,230874,230877,232337,232339,232420,232421,232423,234343,234346,234348,234606,234607,234614,234616,235104,235106,235214,235215,235245,235246,235257,235258,235524,235525,235638,235639,235655,235657,236973,236974,250667,250668,258538,258539,260603,260604,260881,260882,262144,262145,264739,274857,280179,280695,283291,283292,283455,283456,287269,294914,295103,295104,295610,298586,306488,307174,310202,310212,311245,311246,314230,321779,322084,322585,322620,322902,322916,322920,322929,322932,322942,322944,322965,323328,327680,327681,331252,331254,338892,338893,343295,343296,343644,343645,343960,343961,343976,343977,344004,344005,344048,344049,344725,344737,346428,360449,360955,393217,393723,425985,426491,458753,459259,491521,492027,524289,524795,557057,557563,589825,590331,622593,623099,655361,655867,688129,688635,720897,721403,748925,753664,753665,774155,780254,780261,780379") && block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1("/dev/block/bootdevice/by-name/vendor", "156,1,220,570,578,588,589,670,671,693,694,798,799,863,864,866,867,869,880,885,886,888,889,897,898,3050,3051,3174,3479,3546,3547,6640,6641,6759,6760,6881,6933,7644,7645,8328,8329,8938,8944,11197,11199,32603,32604,32768,32770,32832,32833,34363,34364,41305,41307,41450,41451,41813,41815,42224,42225,42277,42278,44212,44215,44233,44234,44279,44280,44298,44299,44301,44302,44350,44351,44378,44379,44975,44976,45001,45002,45036,45037,45372,45373,45390,45391,58477,58479,64615,64616,64618,64619,65194,65196,65536,65537,72009,72010,72019,72020,72058,72059,72060,72061,72081,72082,72507,72508,72561,72562,72903,72905,72906,72912,72920,72922,72928,72939,72989,72990,72992,72996,73134,73157,80742,80743,80851,80868,80893,80905,80973,80984,80992,81008,81016,98306,98368,98369,98874,131073,131578,163842,163904,163905,164410,196609,197114,222727,229376,229378,229440,229441,258044,260078,260085,260213") == "24a7883f9b679c396a5e1b9bde0e084accc2cb01" || block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "156,1,220,570,578,588,589,670,671,693,694,798,799,863,864,866,867,869,880,885,886,888,889,897,898,3050,3051,3174,3479,3546,3547,6640,6641,6759,6760,6881,6933,7644,7645,8328,8329,8938,8944,11197,11199,32603,32604,32768,32770,32832,32833,34363,34364,41305,41307,41450,41451,41813,41815,42224,42225,42277,42278,44212,44215,44233,44234,44279,44280,44298,44299,44301,44302,44350,44351,44378,44379,44975,44976,45001,45002,45036,45037,45372,45373,45390,45391,58477,58479,64615,64616,64618,64619,65194,65196,65536,65537,72009,72010,72019,72020,72058,72059,72060,72061,72081,72082,72507,72508,72561,72562,72903,72905,72906,72912,72920,72922,72928,72939,72989,72990,72992,72996,73134,73157,80742,80743,80851,80868,80893,80905,80973,80984,80992,81008,81016,98306,98368,98369,98874,131073,131578,163842,163904,163905,164410,196609,197114,222727,229376,229378,229440,229441,258044,260078,260085,260213") && block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;

# ---- start making changes here ----

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:45524298:e686d7882c423bc224bdd7bd376be850fde0ba3b",
                "EMMC:/dev/block/bootdevice/by-name/boot:45524298:78341c06b06223cdfdc2c35c3b7859ceef2a69d2",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:45524298:78341c06b06223cdfdc2c35c3b7859ceef2a69d2");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_a");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_b");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_progress(0.100000, 2);

# ---- radio update tasks 2 ----

ui_print("Patching vbmeta dtbo logo binimages...");
