getprop("ro.product.device") == "toco" || abort("E3004: This package is for \"toco\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/toco_global/toco:11/RKQ1.200826.002/V12.5.4.0.RFNMIXM:user/release-keys");
ui_print("Target: Xiaomi/toco_global/toco:11/RKQ1.200826.002/V12.5.7.0.RFNMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/toco_global/toco:11/RKQ1.200826.002/V12.5.4.0.RFNMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/toco_global/toco:11/RKQ1.200826.002/V12.5.7.0.RFNMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/toco_global/toco:11/RKQ1.200826.002/V12.5.4.0.RFNMIXM:user/release-keys or Xiaomi/toco_global/toco:11/RKQ1.200826.002/V12.5.7.0.RFNMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:74910ae10c9044bceeeb0422b2befe4aa5f85415"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:aeaaf226a86c2a0c2b9f7d4bbfadcace4d27c431")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:74910ae10c9044bceeeb0422b2befe4aa5f85415"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:aeaaf226a86c2a0c2b9f7d4bbfadcace4d27c431"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "192,1,34,45,55,57,61,89,90,21343,21344,21374,21375,27539,27540,28954,56668,56675,56676,57978,57979,59100,59101,60831,60832,61667,61668,62875,62876,63027,63028,63952,63953,65536,65554,68335,68336,69321,69322,70687,70688,71137,71138,73307,73308,73569,73570,73662,73663,73913,73914,74130,74132,74270,74274,74282,74283,74295,74299,74303,74304,75741,75747,75781,75782,75788,75794,75795,75796,75801,75807,75808,75809,79305,79309,79349,79350,80315,80316,80966,80967,82898,82901,82909,82910,82932,82933,82937,82938,83371,83372,83496,83497,83528,83534,83535,83536,83847,83851,83859,83860,83980,83986,83987,85354,86580,86718,86740,86741,90535,90539,90577,90578,90592,90598,90599,90600,90606,90612,90613,90614,94238,94239,96269,96273,96305,96306,96337,96338,97426,97430,97451,97452,97581,97585,97591,97592,97725,97729,97736,97737,98304,98324,103611,103615,103707,103708,103735,103736,104493,104497,104512,104513,105065,105071,105072,105073,106826,106830,106873,106874,106878,106884,106885,106886,106917,106923,106924,106925,108615,108619,108643,108644,108668,108669,108671,108672,108673,108674,108675,108676,108706,108707,112589,112593,112629,622596,622610,644379,646331,656573,656713,656714") == "c4eec6ec4dd9357b5af8eddedde3fc6e6d2a9ad5" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "192,1,34,45,55,57,61,89,90,21343,21344,21374,21375,27539,27540,28954,56668,56675,56676,57978,57979,59100,59101,60831,60832,61667,61668,62875,62876,63027,63028,63952,63953,65536,65554,68335,68336,69321,69322,70687,70688,71137,71138,73307,73308,73569,73570,73662,73663,73913,73914,74130,74132,74270,74274,74282,74283,74295,74299,74303,74304,75741,75747,75781,75782,75788,75794,75795,75796,75801,75807,75808,75809,79305,79309,79349,79350,80315,80316,80966,80967,82898,82901,82909,82910,82932,82933,82937,82938,83371,83372,83496,83497,83528,83534,83535,83536,83847,83851,83859,83860,83980,83986,83987,85354,86580,86718,86740,86741,90535,90539,90577,90578,90592,90598,90599,90600,90606,90612,90613,90614,94238,94239,96269,96273,96305,96306,96337,96338,97426,97430,97451,97452,97581,97585,97591,97592,97725,97729,97736,97737,98304,98324,103611,103615,103707,103708,103735,103736,104493,104497,104512,104513,105065,105071,105072,105073,106826,106830,106873,106874,106878,106884,106885,106886,106917,106923,106924,106925,108615,108619,108643,108644,108668,108669,108671,108672,108673,108674,108675,108676,108706,108707,112589,112593,112629,622596,622610,644379,646331,656573,656713,656714") && block_image_verify(map_partition("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(map_partition("vendor"), "460,1,32,42,46,51,52,130,138,144,145,1819,1823,1836,2301,2545,2549,2554,2555,2557,2561,2563,2564,2587,2588,2624,2628,2678,2679,2682,2686,2690,2691,2694,2695,2704,2708,2712,2713,3379,3430,3532,3533,3705,3711,5941,5942,14538,14539,15462,15464,15465,15466,15468,15471,15472,15473,15475,15477,15478,15479,15481,15483,15484,15485,15487,15489,15490,15491,15493,15495,15496,15497,15499,15501,15506,15508,15511,15513,15516,15518,15526,15528,15531,15533,15534,15535,15537,15539,15540,15541,15544,15546,15547,15548,15550,15552,15553,15554,15556,15558,15559,15560,15562,15564,15565,15566,15568,15570,15571,15572,15581,15582,15601,15602,15603,15604,15608,15609,15610,15611,15614,15615,15616,15617,15620,15621,15622,15623,15626,15627,15628,15629,15633,15634,15635,15636,15639,15640,15641,15642,15646,15647,15651,15652,15656,15657,15661,15662,15666,15667,15668,15669,15678,15679,15680,15681,15684,15685,15686,15687,15690,15691,15692,15693,15696,15697,15698,15699,15701,15703,15995,15996,16111,16112,17008,17013,32509,32510,32609,32611,32768,32800,33443,33444,34674,34676,34715,34717,35166,35167,35249,35250,41119,41120,41124,41126,41143,41144,41179,41180,41189,41190,41192,41193,41243,41244,41247,41248,41310,41311,41317,41318,41343,41344,41483,41484,42307,42308,42467,42468,42470,42472,42536,42537,42607,42608,42675,42676,42678,42679,42681,42691,42750,42751,42753,42755,42815,42816,42818,42819,42883,42884,42952,42953,42955,42956,43019,43020,43089,43090,43092,43093,43156,43157,43226,43227,43293,43294,43296,43297,43358,43359,43361,43362,43422,43423,43425,43426,43487,43488,43490,43491,43551,43552,43554,43555,43616,43617,43619,43620,43680,43681,43683,43684,43748,43749,43751,43752,43816,43817,43819,43820,43884,43885,43887,43888,43954,43956,43957,43958,44024,44025,44026,44027,44034,44036,44040,44041,44113,44114,44116,44117,44180,44181,44183,44184,44248,44249,44251,44252,44315,44316,44385,44386,44452,44453,44455,44456,44517,44518,44520,44521,44581,44582,44584,44585,44646,44647,44649,44650,44710,44711,44713,44714,44775,44776,44778,44779,44839,44840,44842,44843,44907,44908,44910,44911,44975,44976,44978,44979,45043,45044,45046,45047,45112,45113,45114,45115,45116,45117,45183,45184,45185,45186,45192,45193,45256,45257,45325,45326,45328,45329,45392,45393,45395,45396,45460,45461,45463,45464,45530,45531,45597,45598,45600,45601,45662,45663,45665,45666,45726,45727,45729,45730,45791,45792,45794,45795,45855,45856,45858,45859,45920,45921,45923,45924,45984,45985,45987,45988,46052,46053,46055,46056,46120,46121,46123,46124,46188,46189,46191,46192,46257,46258,46259,46260,46261,46262,46328,46329,46330,46331,56957,56958,57256,57257,57258,57259,57305,57307,57312,57314,57452,57462,57822,270871,271699,276007,276075,276076") == "2ea3d82ae85563836cc22c059893ed62dc0e21fc" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "460,1,32,42,46,51,52,130,138,144,145,1819,1823,1836,2301,2545,2549,2554,2555,2557,2561,2563,2564,2587,2588,2624,2628,2678,2679,2682,2686,2690,2691,2694,2695,2704,2708,2712,2713,3379,3430,3532,3533,3705,3711,5941,5942,14538,14539,15462,15464,15465,15466,15468,15471,15472,15473,15475,15477,15478,15479,15481,15483,15484,15485,15487,15489,15490,15491,15493,15495,15496,15497,15499,15501,15506,15508,15511,15513,15516,15518,15526,15528,15531,15533,15534,15535,15537,15539,15540,15541,15544,15546,15547,15548,15550,15552,15553,15554,15556,15558,15559,15560,15562,15564,15565,15566,15568,15570,15571,15572,15581,15582,15601,15602,15603,15604,15608,15609,15610,15611,15614,15615,15616,15617,15620,15621,15622,15623,15626,15627,15628,15629,15633,15634,15635,15636,15639,15640,15641,15642,15646,15647,15651,15652,15656,15657,15661,15662,15666,15667,15668,15669,15678,15679,15680,15681,15684,15685,15686,15687,15690,15691,15692,15693,15696,15697,15698,15699,15701,15703,15995,15996,16111,16112,17008,17013,32509,32510,32609,32611,32768,32800,33443,33444,34674,34676,34715,34717,35166,35167,35249,35250,41119,41120,41124,41126,41143,41144,41179,41180,41189,41190,41192,41193,41243,41244,41247,41248,41310,41311,41317,41318,41343,41344,41483,41484,42307,42308,42467,42468,42470,42472,42536,42537,42607,42608,42675,42676,42678,42679,42681,42691,42750,42751,42753,42755,42815,42816,42818,42819,42883,42884,42952,42953,42955,42956,43019,43020,43089,43090,43092,43093,43156,43157,43226,43227,43293,43294,43296,43297,43358,43359,43361,43362,43422,43423,43425,43426,43487,43488,43490,43491,43551,43552,43554,43555,43616,43617,43619,43620,43680,43681,43683,43684,43748,43749,43751,43752,43816,43817,43819,43820,43884,43885,43887,43888,43954,43956,43957,43958,44024,44025,44026,44027,44034,44036,44040,44041,44113,44114,44116,44117,44180,44181,44183,44184,44248,44249,44251,44252,44315,44316,44385,44386,44452,44453,44455,44456,44517,44518,44520,44521,44581,44582,44584,44585,44646,44647,44649,44650,44710,44711,44713,44714,44775,44776,44778,44779,44839,44840,44842,44843,44907,44908,44910,44911,44975,44976,44978,44979,45043,45044,45046,45047,45112,45113,45114,45115,45116,45117,45183,45184,45185,45186,45192,45193,45256,45257,45325,45326,45328,45329,45392,45393,45395,45396,45460,45461,45463,45464,45530,45531,45597,45598,45600,45601,45662,45663,45665,45666,45726,45727,45729,45730,45791,45792,45794,45795,45855,45856,45858,45859,45920,45921,45923,45924,45984,45985,45987,45988,46052,46053,46055,46056,46120,46121,46123,46124,46188,46189,46191,46192,46257,46258,46259,46260,46261,46262,46328,46329,46330,46331,56957,56958,57256,57257,57258,57259,57305,57307,57312,57314,57452,57462,57822,270871,271699,276007,276075,276076") && block_image_verify(map_partition("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;
if (range_sha1(map_partition("product"), "146,1,15,3109,3110,3416,3417,3443,3444,6154,6155,9999,10000,10580,10581,12352,12356,12444,12445,12452,12453,12481,15091,15099,15100,15139,15140,23322,23323,31310,31312,31442,31447,32725,32726,32768,32776,34028,34029,34472,34473,35772,35773,36135,36139,36658,36659,36671,36675,36679,36680,38520,38524,38566,38567,38575,39958,41643,41644,41651,41652,41697,41698,41988,41989,41995,41996,42082,42083,42084,42085,44017,44021,44092,44093,44103,48213,57383,57384,61299,61303,61334,61336,61629,61632,65432,65433,65536,65542,75280,75281,84825,84832,86308,86309,91698,91699,98304,98312,103203,103204,103429,103430,103828,103829,104330,104331,104336,104337,104465,104471,104472,104473,104485,104491,104492,104493,112299,112300,113521,113525,114532,114533,115323,115324,117690,117691,130976,130977,131053,131054,131072,131078,133238,133239,149589,149590,149849,149850,150046,150047,151958,300999,301902,306688,306762,306763") == "7cf73e7e17f9aed5ac54c6316dd326108425d43a" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
ifelse (block_image_recover(map_partition("product"), "146,1,15,3109,3110,3416,3417,3443,3444,6154,6155,9999,10000,10580,10581,12352,12356,12444,12445,12452,12453,12481,15091,15099,15100,15139,15140,23322,23323,31310,31312,31442,31447,32725,32726,32768,32776,34028,34029,34472,34473,35772,35773,36135,36139,36658,36659,36671,36675,36679,36680,38520,38524,38566,38567,38575,39958,41643,41644,41651,41652,41697,41698,41988,41989,41995,41996,42082,42083,42084,42085,44017,44021,44092,44093,44103,48213,57383,57384,61299,61303,61334,61336,61629,61632,65432,65433,65536,65542,75280,75281,84825,84832,86308,86309,91698,91699,98304,98312,103203,103204,103429,103430,103828,103829,104330,104331,104336,104337,104465,104471,104472,104473,104485,104491,104492,104493,112299,112300,113521,113525,114532,114533,115323,115324,117690,117691,130976,130977,131053,131054,131072,131078,133238,133239,149589,149590,149849,149850,150046,150047,151958,300999,301902,306688,306762,306763") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;
if (range_sha1(map_partition("odm"), "12,1,12,13,14,22,23,242,243,245,251,270,271") == "5cee935567b5f15eca6e0e03ca3cb3ff740c9cae" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "12,1,12,13,14,22,23,242,243,245,251,270,271") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "24,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,98324,98327,120695,121058,122980,123020,123021") == "5d4ccb6ebf76175561dc4eafbd9b2d58b23d6382" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "24,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,98324,98327,120695,121058,122980,123020,123021") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

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


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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");

# --- Start patching dynamic partitions ---


# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.500000, 0);
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Patch partition product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:74910ae10c9044bceeeb0422b2befe4aa5f85415"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:aeaaf226a86c2a0c2b9f7d4bbfadcace4d27c431"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:aeaaf226a86c2a0c2b9f7d4bbfadcace4d27c431")));

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
set_progress(1.000000);
