Contract
| Address | EQCSgpWGX7SVc0GpmrCP4uQd685MHmPMnDn_HiaH7xCi90FI |
| Chain | Basic Workchain |
| Contract Type | 👍 Verfied source |
| Contract Code Hash | St9IE1y1da267Udnmch/8pBCabH5Sa2k0EeekQS28hc= |
verifier.ton.org verification
View codeSource Code
int op::transfer() asm "0xf8a7ea5 PUSHINT";
int op::transfer_notification() asm "0x7362d09c PUSHINT";
int op::internal_transfer() asm "0x178d4519 PUSHINT";
int op::excesses() asm "0xd53276db PUSHINT";
int op::burn() asm "0x595f07bc PUSHINT";
int op::burn_notification() asm "0x7bdd97de PUSHINT";
(int) equal_slices(slice s1, slice s2) asm "SDEQ";
builder store_coins(builder b, int x) asm "STGRAMS";
(slice, int) load_coins(slice s) asm( -> 1 0) "LDGRAMS";
int workchain() asm "0 PUSHINT";
() force_chain(slice addr) impure {
(int wc, _) = parse_std_addr(addr);
throw_unless(333, wc == workchain());
}
;; Minter
int op::mint() asm "21 PUSHINT";
cell pack_jetton_wallet_data(int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
return begin_cell()
.store_coins(balance)
.store_slice(owner_address)
.store_slice(jetton_master_address)
.store_ref(jetton_wallet_code)
.end_cell();
}
cell calculate_jetton_wallet_state_init(slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
return begin_cell()
.store_uint(0, 2)
.store_dict(jetton_wallet_code)
.store_dict(pack_jetton_wallet_data(0, owner_address, jetton_master_address, jetton_wallet_code))
.store_uint(0, 1)
.end_cell();
}
slice calculate_jetton_wallet_address(cell state_init) inline {
return begin_cell().store_uint(4, 3)
.store_int(workchain(), 8)
.store_uint(cell_hash(state_init), 256)
.end_cell()
.begin_parse();
}
slice calculate_user_jetton_wallet_address(slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
return calculate_jetton_wallet_address(calculate_jetton_wallet_state_init(owner_address, jetton_master_address, jetton_wallet_code));
}
;; Jetton Wallet Smart Contract
{-
NOTE that this tokens can be transferred within the same workchain.
This is suitable for most tokens, if you need tokens transferable between workchains there are two solutions:
1) use more expensive but universal function to calculate message forward fee for arbitrary destination (see `misc/forward-fee-calc.cs`)
2) use token holder proxies in target workchain (that way even 'non-universal' token can be used from any workchain)
-}
int min_tons_for_storage() asm "10000000 PUSHINT"; ;; 0.01 TON
int gas_consumption() asm "10000000 PUSHINT"; ;; 0.01 TON
{-
Storage
storage#_ balance:Coins owner_address:MsgAddressInt jetton_master_address:MsgAddressInt jetton_wallet_code:^Cell = Storage;
-}
(int, slice, slice, cell) load_data() inline {
slice ds = get_data().begin_parse();
return (ds~load_coins(), ds~load_msg_addr(), ds~load_msg_addr(), ds~load_ref());
}
() save_data (int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) impure inline {
set_data(pack_jetton_wallet_data(balance, owner_address, jetton_master_address, jetton_wallet_code));
}
{-
transfer query_id:uint64 amount:(VarUInteger 16) destination:MsgAddress
response_destination:MsgAddress custom_payload:(Maybe ^Cell)
forward_ton_amount:(VarUInteger 16) forward_payload:(Either Cell ^Cell)
= InternalMsgBody;
internal_transfer query_id:uint64 amount:(VarUInteger 16) from:MsgAddress
response_address:MsgAddress
forward_ton_amount:(VarUInteger 16)
forward_payload:(Either Cell ^Cell)
= InternalMsgBody;
-}
() send_tokens (slice in_msg_body, slice sender_address, int msg_value, int fwd_fee) impure {
int query_id = in_msg_body~load_uint(64);
int jetton_amount = in_msg_body~load_coins();
slice to_owner_address = in_msg_body~load_msg_addr();
force_chain(to_owner_address);
(int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) = load_data();
balance -= jetton_amount;
throw_unless(705, equal_slices(owner_address, sender_address));
throw_unless(706, balance >= 0);
cell state_init = calculate_jetton_wallet_state_init(to_owner_address, jetton_master_address, jetton_wallet_code);
slice to_wallet_address = calculate_jetton_wallet_address(state_init);
slice response_address = in_msg_body~load_msg_addr();
cell custom_payload = in_msg_body~load_dict();
int forward_ton_amount = in_msg_body~load_coins();
slice either_forward_payload = in_msg_body;
var msg = begin_cell()
.store_uint(0x18, 6)
.store_slice(to_wallet_address)
.store_coins(0)
.store_uint(4 + 2 + 1, 1 + 4 + 4 + 64 + 32 + 1 + 1 + 1)
.store_ref(state_init);
var msg_body = begin_cell()
.store_uint(op::internal_transfer(), 32)
.store_uint(query_id, 64)
.store_coins(jetton_amount)
.store_slice(owner_address)
.store_slice(response_address)
.store_coins(forward_ton_amount)
.store_slice(either_forward_payload)
.end_cell();
msg = msg.store_ref(msg_body);
int fwd_count = forward_ton_amount ? 2 : 1;
throw_unless(709, msg_value >
forward_ton_amount +
;; 3 messages: wal1->wal2, wal2->owner, wal2->response
;; but last one is optional (it is ok if it fails)
fwd_count * fwd_fee +
(2 * gas_consumption() + min_tons_for_storage()));
;; universal message send fee calculation may be activated here
;; by using this instead of fwd_fee
;; msg_fwd_fee(to_wallet, msg_body, state_init, 15)
send_raw_message(msg.end_cell(), 64); ;; revert on errors
save_data(balance, owner_address, jetton_master_address, jetton_wallet_code);
}
{-
internal_transfer query_id:uint64 amount:(VarUInteger 16) from:MsgAddress
response_address:MsgAddress
forward_ton_amount:(VarUInteger 16)
forward_payload:(Either Cell ^Cell)
= InternalMsgBody;
-}
() receive_tokens (slice in_msg_body, slice sender_address, int my_ton_balance, int fwd_fee, int msg_value) impure {
;; NOTE we can not allow fails in action phase since in that case there will be
;; no bounce. Thus check and throw in computation phase.
(int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) = load_data();
int query_id = in_msg_body~load_uint(64);
int jetton_amount = in_msg_body~load_coins();
balance += jetton_amount;
slice from_address = in_msg_body~load_msg_addr();
slice response_address = in_msg_body~load_msg_addr();
throw_unless(707,
equal_slices(jetton_master_address, sender_address)
|
equal_slices(calculate_user_jetton_wallet_address(from_address, jetton_master_address, jetton_wallet_code), sender_address)
);
int forward_ton_amount = in_msg_body~load_coins();
int ton_balance_before_msg = my_ton_balance - msg_value;
int storage_fee = min_tons_for_storage() - min(ton_balance_before_msg, min_tons_for_storage());
msg_value -= (storage_fee + gas_consumption());
if(forward_ton_amount) {
msg_value -= (forward_ton_amount + fwd_fee);
slice either_forward_payload = in_msg_body;
var msg_body = begin_cell()
.store_uint(op::transfer_notification(), 32)
.store_uint(query_id, 64)
.store_coins(jetton_amount)
.store_slice(from_address)
.store_slice(either_forward_payload)
.end_cell();
var msg = begin_cell()
.store_uint(0x18, 6)
.store_slice(owner_address)
.store_coins(forward_ton_amount)
.store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_ref(msg_body);
send_raw_message(msg.end_cell(), 1);
}
if ((response_address.preload_uint(2) != 0) & (msg_value > 0)) {
var msg = begin_cell()
.store_uint(0x10, 6) ;; nobounce - int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000
.store_slice(response_address)
.store_coins(msg_value)
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_uint(op::excesses(), 32)
.store_uint(query_id, 64);
send_raw_message(msg.end_cell(), 2);
}
save_data(balance, owner_address, jetton_master_address, jetton_wallet_code);
}
() burn_tokens (slice in_msg_body, slice sender_address, int msg_value, int fwd_fee) impure {
;; NOTE we can not allow fails in action phase since in that case there will be
;; no bounce. Thus check and throw in computation phase.
(int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) = load_data();
int query_id = in_msg_body~load_uint(64);
int jetton_amount = in_msg_body~load_coins();
slice response_address = in_msg_body~load_msg_addr();
;; ignore custom payload
;; slice custom_payload = in_msg_body~load_dict();
balance -= jetton_amount;
throw_unless(705, equal_slices(owner_address, sender_address));
throw_unless(706, balance >= 0);
throw_unless(707, msg_value > fwd_fee + 2 * gas_consumption());
var msg_body = begin_cell()
.store_uint(op::burn_notification(), 32)
.store_uint(query_id, 64)
.store_coins(jetton_amount)
.store_slice(owner_address)
.store_slice(response_address)
.end_cell();
var msg = begin_cell()
.store_uint(0x18, 6)
.store_slice(jetton_master_address)
.store_coins(0)
.store_uint(1, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_ref(msg_body);
send_raw_message(msg.end_cell(), 64);
save_data(balance, owner_address, jetton_master_address, jetton_wallet_code);
}
() on_bounce (slice in_msg_body) impure {
in_msg_body~skip_bits(32); ;; 0xFFFFFFFF
(int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) = load_data();
int op = in_msg_body~load_uint(32);
throw_unless(709, (op == op::internal_transfer()) | (op == op::burn_notification()));
int query_id = in_msg_body~load_uint(64);
int jetton_amount = in_msg_body~load_coins();
balance += jetton_amount;
save_data(balance, owner_address, jetton_master_address, jetton_wallet_code);
}
() recv_internal(int my_balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
if (in_msg_body.slice_empty?()) { ;; ignore empty messages
return ();
}
slice cs = in_msg_full.begin_parse();
int flags = cs~load_uint(4);
if (flags & 1) {
on_bounce(in_msg_body);
return ();
}
slice sender_address = cs~load_msg_addr();
cs~load_msg_addr(); ;; skip dst
cs~load_coins(); ;; skip value
cs~skip_bits(1); ;; skip extracurrency collection
cs~load_coins(); ;; skip ihr_fee
int fwd_fee = cs~load_coins(); ;; we use message fwd_fee for estimation of forward_payload costs
int op = in_msg_body~load_uint(32);
if (op == op::transfer()) { ;; outgoing transfer
send_tokens(in_msg_body, sender_address, msg_value, fwd_fee);
return ();
}
if (op == op::internal_transfer()) { ;; incoming transfer
receive_tokens(in_msg_body, sender_address, my_balance, fwd_fee, msg_value);
return ();
}
if (op == op::burn()) { ;; burn
burn_tokens(in_msg_body, sender_address, msg_value, fwd_fee);
return ();
}
throw(0xffff);
}
(int, slice, slice, cell) get_wallet_data() method_id {
return load_data();
}Disassembled Code
SETCP0
(:methods
recv_internal:
s0 PUSH
SEMPTY
<{
4 BLKDROP
}> PUSHCONT
IFJMP
s0 s1 XCHG
CTOS
4 LDU
s0 s1 XCHG
1 PUSHINT
AND
<{
s1 s3 XCHG
3 BLKDROP
11 CALLDICT
}> PUSHCONT
IFJMP
LDMSGADDR
LDMSGADDR
s1 POP
LDGRAMS
s1 POP
1 PUSHINT
SDSKIPFIRST
LDGRAMS
s1 POP
LDGRAMS
s0 POP
s0 s2 XCHG
32 LDU
260734629 PUSHINT
s2 s-1 PUXC
EQUAL
<{
s1 POP
s4 POP
ROTREV
8 CALLDICT
}> PUSHCONT
IFJMP
395134233 PUSHINT
s2 s-1 PUXC
EQUAL
<{
s1 POP
s4 s4 s4 XCHG3
s0 s3 XCHG
9 CALLDICT
}> PUSHCONT
IFJMP
s5 POP
1499400124 PUSHINT
EQUAL
<{
ROTREV
10 CALLDICT
}> PUSHCONT
IFJMP
4 BLKDROP
16 PUSHPOW2DEC
THROWANY
1:
REWRITESTDADDR
s0 POP
0 PUSHINT
EQUAL
333 THROWIFNOT
8:
s0 s3 XCHG
64 LDU
LDGRAMS
LDMSGADDR
s1 PUSH
1 CALLDICT
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDMSGADDR
LDREF
s0 POP
s3 s6 XCPU
SUB
s2 s9 PUXC
SDEQ
705 THROWIFNOT
s8 PUSH
-1 GTINT
706 THROWIFNOT
4 4 2 XCPU2
0 PUSHINT
0 1 2 XCPUXC
4 0 3 XC2PU
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
s0 s1 XCHG
STSLICER
STREF
ENDC
s2 PUSH
NEWC
2 STU
s1 s2 XCHG
STDICT
STDICT
1 STU
ENDC
s0 PUSH
HASHCU
0 PUSHINT
4 PUSHINT
NEWC
3 STU
8 STI
256 STU
ENDC
CTOS
s0 s4 XCHG
LDMSGADDR
LDDICT
s1 POP
LDGRAMS
7 PUSHINT
24 PUSHINT
NEWC
6 STU
s0 s8 XCHG2
STSLICER
0 PUSHINT
STGRAMS
s1 s7 XCHG
108 STU
s1 s3 XCHG
STREF
395134233 PUSHINT
NEWC
32 STU
s1 s9 XCHG
64 STU
s0 s7 XCHG2
STGRAMS
s2 PUSH
STSLICER
s0 s6 XCHG2
STSLICER
s5 PUSH
STGRAMS
s0 s3 XCHG2
STSLICER
ENDC
s0 s5 XCHG2
STREF
s3 PUSH
<{
2 PUSHINT
}> PUSHCONT
<{
1 PUSHINT
}> PUSHCONT
IFELSE
s0 s8 XCHG2
MUL
s1 s3 XCHG
ADD
10000000 PUSHINT
1 LSHIFT
10000000 PUSHINT
ADD
ADD
s1 s4 XCHG
GREATER
709 THROWIFNOT
s0 s4 XCHG
ENDC
64 PUSHINT
SENDRAWMSG
s2 s3 XCHG
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
s0 s1 XCHG
STSLICER
STREF
ENDC
c4 POP
9:
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDMSGADDR
LDREF
s0 POP
s0 s8 XCHG
64 LDU
LDGRAMS
s5 s1 XCPU
ADD
s0 s5 XCHG
LDMSGADDR
LDMSGADDR
s5 s11 PUSH2
SDEQ
3 6 13 PUSH3
0 PUSHINT
0 1 2 XCPUXC
4 0 3 XC2PU
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
s0 s1 XCHG
STSLICER
STREF
ENDC
s2 PUSH
NEWC
2 STU
s1 s2 XCHG
STDICT
STDICT
1 STU
ENDC
HASHCU
0 PUSHINT
4 PUSHINT
NEWC
3 STU
8 STI
256 STU
ENDC
CTOS
s0 s13 XCHG2
SDEQ
s1 s12 XCHG
OR
707 THROWIFNOT
s0 s10 XCHG
LDGRAMS
s10 s8 XCPU
SUB
10000000 PUSHINT
10000000 PUSHINT
s1 s2 XCHG
MIN
SUB
10000000 PUSHINT
ADD
s1 s8 XCHG
SUB
s7 PUSH
<{
s7 s8 PUXC
ADD
s1 s8 XCHG
SUB
1935855772 PUSHINT
NEWC
32 STU
s3 s-1 PUXC
64 STU
ROT
STGRAMS
s0 s7 XCHG2
STSLICER
s0 s7 XCHG2
STSLICER
ENDC
1 PUSHINT
24 PUSHINT
NEWC
6 STU
s4 PUSH
STSLICER
s0 s6 XCHG2
STGRAMS
s1 s5 XCHG
107 STU
s1 s4 XCHG
STREF
ENDC
1 PUSHINT
SENDRAWMSG
s2 s4 XCHG
s2 s3 XCHG
}> IFREFELSEREF
s5 PUSH
2 PLDU
0 NEQINT
s3 PUSH
s4 s9 XCHG
s3 s8 XCHG
s7 POP
4 BLKDROP
10:
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDMSGADDR
LDREF
s0 POP
s0 s7 XCHG
64 LDU
LDGRAMS
LDMSGADDR
s0 POP
s5 s1 XCPU
SUB
s4 s8 PUXC
SDEQ
705 THROWIFNOT
s7 PUSH
-1 GTINT
706 THROWIFNOT
10000000 PUSHINT
1 LSHIFT
s1 s6 XCHG
ADD
s1 s6 XCHG
GREATER
707 THROWIFNOT
2078119902 PUSHINT
NEWC
32 STU
s1 s5 XCHG
64 STU
s0 s3 XCHG2
STGRAMS
s2 PUSH
STSLICER
s0 s1 XCHG
STSLICER
ENDC
1 PUSHINT
24 PUSHINT
NEWC
6 STU
s4 PUSH
STSLICER
0 PUSHINT
STGRAMS
107 STU
STREF
ENDC
64 PUSHINT
SENDRAWMSG
s0 s1 s3 XCHG3
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
s0 s1 XCHG
STSLICER
STREF
ENDC
c4 POP
11:
32 PUSHINT
SDSKIPFIRST
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDMSGADDR
LDREF
s0 POP
s0 s4 XCHG
32 LDU
395134233 PUSHINT
s2 s-1 PUXC
EQUAL
2078119902 PUSHINT
s1 s3 XCHG
EQUAL
s1 s2 XCHG
OR
709 THROWIFNOT
64 LDU
s1 POP
LDGRAMS
s0 POP
s1 s3 XCHG
ADD
s2 s3 XCHG2
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
s0 s1 XCHG
STSLICER
STREF
ENDC
c4 POP
get_wallet_data:
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDMSGADDR
LDREF
s0 POP
) 19 DICTPUSHCONST
DICTIGETJMPZ
11 THROWARG
Serialized Code
te6cckECEgEAAygAART/APSkE/S88sgLAQIBYgIDAgLMBAUAG6D2BdqJofQB9IH0gahhAgHUBgcCAUgICQC7CDHAJJfBOAB0NMDAXGwlRNfA/AL4PpA+kAx+gAxcdch+gAx+gAwAtMfghAPin6lUiC6lTE0WfAI4IIQF41FGVIgupYxREQD8AngNYIQWV8HvLqTWfAK4F8EhA/y8IAARPpEMHC68uFNgAgEgCgsCASAMDQH1APTP/oA+kAh8AHtRND6APpA+kDUMFE2oVIqxwXy4sEowv/y4sJUNEJwVCATVBQDyFAE+gJYzxYBzxbMySLIywES9AD0AMsAySD5AHB0yMsCygfL/8nQBPpA9AQx+gB3gBjIywVQCM8WcPoCF8trE8yCEBeNRRnIyx8ZgDgP3O1E0PoA+kD6QNQwCNM/+gBRUaAF+kD6QFNbxwVUc21wVCATVBQDyFAE+gJYzxYBzxbMySLIywES9AD0AMsAyfkAcHTIywLKB8v/ydBQDccFHLHy4sMK+gBRqKGCCJiWgIIImJaAErYIoYIImJaAoBihJ+MPJdcLAcMAI4A8QEQDbO1E0PoA+kD6QNQwB9M/+gD6QDBRUaFSSccF8uLBJ8L/8uLCggiYloCqABagFrzy4sOCEHvdl97Iyx8Vyz9QA/oCIs8WAc8WyXGAGMjLBSTPFnD6AstqzMmAQPsAQBPIUAT6AljPFgHPFszJ7VSAAgyAINch7UTQ+gD6QPpA1DAE0x+CEBeNRRlSILqCEHvdl94TuhKx8uLF0z8x+gAwE6BQI8hQBPoCWM8WAc8WzMntVIACayz9QB/oCIs8WUAbPFiX6AlADzxbJUAXMI5FykXHiUAioE6CCCJiWgKoAggiYloCgoBS88uLFBMmAQPsAECPIUAT6AljPFgHPFszJ7VQAcFJ5oBihghBzYtCcyMsfUjDLP1j6AlAHzxZQB88WyXGAGMjLBSTPFlAG+gIVy2oUzMlx+wAQJBAjAA4QSRA4N18EAHbCALCOIYIQ1TJ223CAEMjLBVAIzxZQBPoCFstqEssfEss/yXL7AJM1bCHiA8hQBPoCWM8WAc8WzMntVMUhatY=Serialized Data
te6cckECEwEAA28AAYcIAPBFtm9EjpU4YjgoOZ72Fyr+DuxI31mDDl1naDvDgVaPACAj5oiRRrXokYsg/B+e0KG9xMwh5upr5I8HQzErm0/BIAEBFP8A9KQT9LzyyAsCAgFiAwQCAswFBgAboPYF2omh9AH0gfSBqGECAdQHCAIBSAkKALsIMcAkl8E4AHQ0wMBcbCVE18D8Avg+kD6QDH6ADFx1yH6ADH6ADAC0x+CEA+KfqVSILqVMTRZ8AjgghAXjUUZUiC6ljFERAPwCeA1ghBZXwe8upNZ8ArgXwSED/LwgABE+kQwcLry4U2ACASALDAIBIA0OAfUA9M/+gD6QCHwAe1E0PoA+kD6QNQwUTahUirHBfLiwSjC//LiwlQ0QnBUIBNUFAPIUAT6AljPFgHPFszJIsjLARL0APQAywDJIPkAcHTIywLKB8v/ydAE+kD0BDH6AHeAGMjLBVAIzxZw+gIXy2sTzIIQF41FGcjLHxmAPA/c7UTQ+gD6QPpA1DAI0z/6AFFRoAX6QPpAU1vHBVRzbXBUIBNUFAPIUAT6AljPFgHPFszJIsjLARL0APQAywDJ+QBwdMjLAsoHy//J0FANxwUcsfLiwwr6AFGooYIImJaAggiYloAStgihggiYloCgGKEn4w8l1wsBwwAjgEBESANs7UTQ+gD6QPpA1DAH0z/6APpAMFFRoVJJxwXy4sEnwv/y4sKCCJiWgKoAFqAWvPLiw4IQe92X3sjLHxXLP1AD+gIizxYBzxbJcYAYyMsFJM8WcPoCy2rMyYBA+wBAE8hQBPoCWM8WAc8WzMntVIACDIAg1yHtRND6APpA+kDUMATTH4IQF41FGVIguoIQe92X3hO6ErHy4sXTPzH6ADAToFAjyFAE+gJYzxYBzxbMye1UgAJrLP1AH+gIizxZQBs8WJfoCUAPPFslQBcwjkXKRceJQCKgToIIImJaAqgCCCJiWgKCgFLzy4sUEyYBA+wAQI8hQBPoCWM8WAc8WzMntVABwUnmgGKGCEHNi0JzIyx9SMMs/WPoCUAfPFlAHzxbJcYAYyMsFJM8WUAb6AhXLahTMyXH7ABAkECMADhBJEDg3XwQAdsIAsI4hghDVMnbbcIAQyMsFUAjPFlAE+gIWy2oSyx8Syz/JcvsAkzVsIeIDyFAE+gJYzxYBzxbMye1UjhgHog==Code Cells
x{FF00F4A413F4BCF2C80B}
x{62_}
x{CC}
x{D4_}
x{0831C02497C138007434C0C05C6C2544D7C0FC02F83E903E900C7E800C5C75C87E800C7E800C00B4C7E08403E29FA954882EA54C4D167C0238208405E3514654882EA58C511100FC02780D60841657C1EF2EA4D67C02B817C12103FCBC2_}
x{3E910C1C2EBCB8536_}
x{4}
x{2_}
x{00F4CFFE803E90087C007B51343E803E903E90350C144DA8548AB1C17CB8B04A30BFFCB8B0950D109C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C032483E401C1D3232C0B281F2FFF274013E903D010C7E801DE0063232C1540233C59C3E8085F2DAC4F3208405E351467232C7C66_}
x{CB3F5007FA0222CF165006CF1625FA025003CF16C95005CC2391729171E25008A813A08208989680AA008208989680A0A014BCF2E2C504C98040FB001023C85004FA0258CF1601CF16CCC9ED54}
x{3B51343E803E903E90350C0234CFFE80145468017E903E9014D6F1C1551CDB5C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C0327E401C1D3232C0B281F2FFF274140371C1472C7CB8B0C2BE80146A2860822625A020822625A004AD822860822625A028062849F8C3C975C2C070C008E_}
x{5279A018A182107362D09CC8CB1F5230CB3F58FA025007CF165007CF16C9718018C8CB0524CF165006FA0215CB6A14CCC971FB0010241023}
x{10491038375F04}
x{C200B08E218210D53276DB708010C8CB055008CF165004FA0216CB6A12CB1F12CB3FC972FB0093356C21E203C85004FA0258CF1601CF16CCC9ED54}
x{2_}
x{3B51343E803E903E90350C01F4CFFE803E900C145468549271C17CB8B049F0BFFCB8B0A0822625A02A8005A805AF3CB8B0E0841EF765F7B232C7C572CFD400FE8088B3C58073C5B25C60063232C14933C59C3E80B2DAB33260103EC01004F214013E809633C58073C5B3327B552_}
x{200835C87B51343E803E903E90350C0134C7E08405E3514654882EA0841EF765F784EE84AC7CB8B174CFCC7E800C04E81408F214013E809633C58073C5B3327B552_}
x{A0F605DA89A1F401F481F481A861_}Data Cells
x{0800F045B66F448E9538623828399EF6172AFE0EEC48DF59830E5D67683BC381568F002023E6889146B5E8918B20FC1F9ED0A1BDC4CC21E6EA6BE48F0743312B9B4FC12_}
x{FF00F4A413F4BCF2C80B}
x{62_}
x{CC}
x{D4_}
x{0831C02497C138007434C0C05C6C2544D7C0FC02F83E903E900C7E800C5C75C87E800C7E800C00B4C7E08403E29FA954882EA54C4D167C0238208405E3514654882EA58C511100FC02780D60841657C1EF2EA4D67C02B817C12103FCBC2_}
x{3E910C1C2EBCB8536_}
x{4}
x{2_}
x{00F4CFFE803E90087C007B51343E803E903E90350C144DA8548AB1C17CB8B04A30BFFCB8B0950D109C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C032483E401C1D3232C0B281F2FFF274013E903D010C7E801DE0063232C1540233C59C3E8085F2DAC4F3208405E351467232C7C66_}
x{CB3F5007FA0222CF165006CF1625FA025003CF16C95005CC2391729171E25008A813A08208989680AA008208989680A0A014BCF2E2C504C98040FB001023C85004FA0258CF1601CF16CCC9ED54}
x{3B51343E803E903E90350C0234CFFE80145468017E903E9014D6F1C1551CDB5C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C0327E401C1D3232C0B281F2FFF274140371C1472C7CB8B0C2BE80146A2860822625A020822625A004AD822860822625A028062849F8C3C975C2C070C008E_}
x{5279A018A182107362D09CC8CB1F5230CB3F58FA025007CF165007CF16C9718018C8CB0524CF165006FA0215CB6A14CCC971FB0010241023}
x{10491038375F04}
x{C200B08E218210D53276DB708010C8CB055008CF165004FA0216CB6A12CB1F12CB3FC972FB0093356C21E203C85004FA0258CF1601CF16CCC9ED54}
x{2_}
x{3B51343E803E903E90350C01F4CFFE803E900C145468549271C17CB8B049F0BFFCB8B0A0822625A02A8005A805AF3CB8B0E0841EF765F7B232C7C572CFD400FE8088B3C58073C5B25C60063232C14933C59C3E80B2DAB33260103EC01004F214013E809633C58073C5B3327B552_}
x{200835C87B51343E803E903E90350C0134C7E08405E3514654882EA0841EF765F784EE84AC7CB8B174CFCC7E800C04E81408F214013E809633C58073C5B3327B552_}
x{A0F605DA89A1F401F481F481A861_}